From c119ad3ef28c697524c54457ac0b32db07761435 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 29 May 2024 20:29:54 -0400 Subject: [PATCH 01/79] First patch lets go --- .../Loadouts/Systems/LoadoutRequirements.cs | 9 +- .../Locale/en-US/loadouts/categories.ftl | 1 + .../en-US/loadouts/loadout-requirements.ftl | 2 +- .../Prototypes/Loadouts/Jobs/medical.yml | 275 +++++++++++++++ .../Prototypes/Loadouts/Jobs/science.yml | 28 ++ .../Prototypes/Loadouts/Jobs/security.yml | 181 ++++++++++ .../Prototypes/Loadouts/Jobs/service.yml | 11 + Resources/Prototypes/Loadouts/categories.yml | 3 + Resources/Prototypes/Loadouts/items.yml | 313 +++++++++++++++++- .../Prototypes/Loadouts/outerClothing.yml | 94 ++++++ Resources/Prototypes/Loadouts/shoes.yml | 56 ++++ Resources/Prototypes/Loadouts/species.yml | 38 +++ Resources/Prototypes/Loadouts/uniform.yml | 141 ++++++++ 13 files changed, 1144 insertions(+), 8 deletions(-) create mode 100644 Resources/Prototypes/Loadouts/species.yml diff --git a/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs b/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs index b76a31e422b..422a5b15a46 100644 --- a/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs +++ b/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs @@ -113,15 +113,16 @@ public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, public sealed partial class LoadoutSpeciesRequirement : LoadoutRequirement { [DataField(required: true)] - public ProtoId Species; + public List> Species; public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, out FormattedMessage? reason) { - reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-species-requirement", - ("species", Loc.GetString($"species-name-{Species.ToString().ToLower()}")))); - return profile.Species == Species; + var speciesString = string.Join(", ", Species.Select(j => Loc.GetString(prototypeManager.Index(j).Name))); + speciesString = Loc.GetString("loadout-species-requirement", ("species", speciesString)); + reason = FormattedMessage.FromMarkup(speciesString); + return Species.Contains(profile.Species); } } diff --git a/Resources/Locale/en-US/loadouts/categories.ftl b/Resources/Locale/en-US/loadouts/categories.ftl index bdfa215e6a8..3723de28847 100644 --- a/Resources/Locale/en-US/loadouts/categories.ftl +++ b/Resources/Locale/en-US/loadouts/categories.ftl @@ -3,5 +3,6 @@ loadout-category-Accessories = Accessories loadout-category-Items = Items loadout-category-Jobs = Jobs loadout-category-Outer = Outer +loadout-category-Species = Species loadout-category-Uncategorized = Uncategorized loadout-category-Uniform = Uniform diff --git a/Resources/Locale/en-US/loadouts/loadout-requirements.ftl b/Resources/Locale/en-US/loadouts/loadout-requirements.ftl index 5a453ed5cbf..d72557f1e8d 100644 --- a/Resources/Locale/en-US/loadouts/loadout-requirements.ftl +++ b/Resources/Locale/en-US/loadouts/loadout-requirements.ftl @@ -1,5 +1,5 @@ loadout-age-requirement = You must be within {$min} and {$max} years old -loadout-species-requirement = You must be a {$species} +loadout-species-requirement = You must be one of these species: {$species} loadout-trait-requirement = You must have the trait {$trait} loadout-backpack-type-requirement = You must use a {$type} as your bag loadout-clothing-preference-requirement = You must wear a {$type} diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index 37af839f3cc..9d4ce267625 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -9,6 +9,8 @@ - MedicalDoctor - Paramedic - ChiefMedicalOfficer + - MedicalIntern + - Chemist items: - ClothingHandsGlovesNitrile @@ -35,6 +37,7 @@ jobs: - MedicalDoctor - ChiefMedicalOfficer + - MedicalIntern items: - ClothingNeckStethoscope @@ -47,6 +50,9 @@ - !type:LoadoutJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorBlue @@ -59,6 +65,9 @@ - !type:LoadoutJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorGreen @@ -71,9 +80,100 @@ - !type:LoadoutJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern items: - UniformScrubsColorPurple +- type: loadout + id: LoadoutMedicalUniformScrubsCyan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorCyan + +- type: loadout + id: LoadoutMedicalUniformScrubsBlack + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorBlack + +- type: loadout + id: LoadoutMedicalUniformScrubsPink + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorPink + +- type: loadout + id: LoadoutMedicalUniformScrubsRainbow + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - UniformScrubsColorRainbow + +- type: loadout + id: LoadoutMedicalUniformScrubsCybersun + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - UniformScrubsColorCybersun + +- type: loadout + id: LoadoutMedicalOuterCybersunWindbreaker + category: Jobs + cost: 5 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - ClothingOuterCoatCybersunWindbreaker + - type: loadout id: LoadoutMedicalOuterLabcoatChem category: Jobs @@ -130,6 +230,9 @@ - !type:LoadoutJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - ChiefMedicalOfficer - !type:LoadoutPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours @@ -151,6 +254,9 @@ - !type:LoadoutJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - ChiefMedicalOfficer - !type:LoadoutPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours @@ -184,6 +290,9 @@ - !type:LoadoutJobRequirement jobs: - MedicalDoctor + - Chemist + - Paramedic + - ChiefMedicalOfficer - !type:LoadoutPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours @@ -195,3 +304,169 @@ min: 216000 # 60 hours items: - ClothingHeadHatBeretSeniorPhysician + +- type: loadout + id: LoadoutMedicalHeadSurgcapBlue + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapBlue + +- type: loadout + id: LoadoutMedicalHeadSurgcapPurple + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapPurple + +- type: loadout + id: LoadoutMedicalHeadSurgcapGreen + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapGreen + +- type: loadout + id: LoadoutMedicalHeadSurgcapCyan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapCyan + +- type: loadout + id: LoadoutMedicalHeadSurgcapBlack + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapBlack + +- type: loadout + id: LoadoutMedicalHeadSurgcapPink + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapPink + +- type: loadout + id: LoadoutMedicalHeadSurgcapRainbow + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapRainbow + +- type: loadout + id: LoadoutMedicalHeadSurgcapWhite + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + - MedicalIntern + items: + - ClothingHeadHatSurgcapWhite + +- type: loadout + id: LoadoutMedicalHeadSurgcapCybersun + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Chemist + - Paramedic + items: + - ClothingHeadHatSurgcapCybersun + +- type: loadout + id: LoadoutMedicalEyesHudMedical + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + items: + - ClothingEyesHudMedical + +- type: loadout + id: LoadoutMedicalEyesEyepatchHudMedical + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + items: + - ClothingEyesEyepatchHudMedical diff --git a/Resources/Prototypes/Loadouts/Jobs/science.yml b/Resources/Prototypes/Loadouts/Jobs/science.yml index f65b69c46a0..c4e1755f8b8 100644 --- a/Resources/Prototypes/Loadouts/Jobs/science.yml +++ b/Resources/Prototypes/Loadouts/Jobs/science.yml @@ -84,3 +84,31 @@ - ResearchDirector items: - ClothingHeadHatBeretRND + +- type: loadout + id: LoadoutScienceEyesHudDiagnostic + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + items: + - ClothingEyesHudDiagnostic + +- type: loadout + id: LoadoutScienceEyesEyepatchHudDiag + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - Scientist + - ResearchAssistant + - ResearchDirector + items: + - ClothingEyesEyepatchHudDiag diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index 47c4b040d3d..2cc7937d22f 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -87,3 +87,184 @@ - HeadOfSecurity items: - ClothingShoesBootsJack + +## Alt Jumpsuits +- type: loadout + id: LoadoutUniformJumpsuitSecFormal + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - Detective + - SecurityOfficer + - Warden + - HeadOfSecurity + items: + - ClothingUniformJumpsuitSecFormal + +- type: loadout + id: LoadoutUniformJumpsuitWardenBlue + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpsuitWardenBlue + +- type: loadout + id: LoadoutUniformJumpsuitWardenGrey + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpsuitWardenGrey + +## Alt Jumpskirts +- type: loadout + id: LoadoutUniformJumpskirtWardenBlue + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpskirtWardenBlue + +- type: loadout + id: LoadoutUniformJumpskirtWardenGrey + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - Warden + items: + - ClothingUniformJumpskirtWardenGrey + +- type: loadout + id: LoadoutUniformJumpskirtHoSBlue + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - HeadOfSecurity + items: + - ClothingUniformJumpskirtHoSBlue + +- type: loadout + id: LoadoutUniformJumpskirtHoSGrey + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - HeadOfSecurity + items: + - ClothingUniformJumpskirtHoSGrey + +- type: loadout + id: LoadoutItemsSpareHandgunMagazine + category: Jobs + cost: 7 + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + - !type:LoadoutPlaytimeRequirement + tracker: JobSecurityOfficer + min: 21600 # 6 hours + items: + - MagazinePistol + +- type: loadout + id: LoadoutItemsSpareHandgunMagazineRubber + category: Jobs + cost: 6 + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + - !type:LoadoutPlaytimeRequirement + tracker: JobSecurityOfficer + min: 7200 # 2 hours + items: + - MagazinePistolRubber + +- type: loadout + id: LoadoutSecurityEyesHudSecurity + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingEyesHudSecurity + +- type: loadout + id: LoadoutSecurityEyesEyepatchHudSecurity + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingEyesEyepatchHudSecurity + +- type: loadout + id: LoadoutSecurityHeadHatBeret + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingHeadHatBeretSecurity + +- type: loadout + id: LoadoutSecurityEquipmentTruncheon + category: Jobs + cost: 8 + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + - !type:LoadoutPlaytimeRequirement + tracker: JobSecurityOfficer + min: 36000 # 10 hours + - !type:LoadoutSpeciesRequirement + species: + - Oni + items: + - Truncheon diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 4372f891ad7..cab3ed377bd 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -181,3 +181,14 @@ - Reporter items: - ClothingUniformJumpskirtDetective + +- type: loadout + id: LoadoutItemSynthesizerInstrument + category: Jobs + cost: 8 + requirements: + - !type:LoadoutJobRequirement + jobs: + - Musician + items: + - SynthesizerInstrument diff --git a/Resources/Prototypes/Loadouts/categories.yml b/Resources/Prototypes/Loadouts/categories.yml index b231b397f71..b947a35355a 100644 --- a/Resources/Prototypes/Loadouts/categories.yml +++ b/Resources/Prototypes/Loadouts/categories.yml @@ -11,6 +11,9 @@ - type: loadoutCategory id: Outer +- type: loadoutCategory + id: Species + - type: loadoutCategory id: Uncategorized diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 6ce8d260613..84892f171a1 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -1,3 +1,4 @@ +#Smokes - type: loadout id: LoadoutItemCig category: Items @@ -34,11 +35,18 @@ - CigPackBlack - type: loadout - id: LoadoutItemPAI + id: LoadoutItemCigsMixed category: Items - cost: 3 + cost: 2 items: - - PersonalAI + - CigPackMixed + +- type: loadout + id: LoadoutItemCigsSyndicate + category: Items + cost: 4 + items: + - CigPackSyndicate - type: loadout id: LoadoutItemLighter @@ -61,6 +69,7 @@ items: - Matchbox +## Plushies - type: loadout id: LoadoutItemPlushieSharkBlue category: Items @@ -88,3 +97,301 @@ cost: 2 items: - PlushieCarp + +- type: loadout + id: LoadoutItemPlushieLizard + category: Items + cost: 2 + items: + - PlushieLizard + +- type: loadout + id: LoadoutItemPlushieMoth + category: Items + cost: 2 + items: + - PlushieMoth + +## Instruments +- type: loadout + id: LoadoutItemMicrophoneInstrument + category: Items + cost: 4 + items: + - MicrophoneInstrument + +- type: loadout + id: LoadoutItemKalimbaInstrument + category: Items + cost: 4 + items: + - KalimbaInstrument + +- type: loadout + id: LoadoutItemTrumpetInstrument + category: Items + cost: 6 + items: + - TrumpetInstrument + +- type: loadout + id: LoadoutItemElectricGuitar + category: Items + cost: 7 + items: + - ElectricGuitarInstrument + +- type: loadout + id: LoadoutItemBassGuitar + category: Items + cost: 7 + items: + - BassGuitarInstrument + +- type: loadout + id: LoadoutItemRockGuitar + category: Items + cost: 7 + items: + - RockGuitarInstrument + +- type: loadout + id: LoadoutItemAcousticGuitar + category: Items + cost: 7 + items: + - AcousticGuitarInstrument + +- type: loadout + id: LoadoutItemViolin + category: Items + cost: 6 + items: + - ViolinInstrument + +- type: loadout + id: LoadoutItemHarmonica + category: Items + cost: 3 + items: + - HarmonicaInstrument + +- type: loadout + id: LoadoutItemAccordion + category: Items + cost: 6 + items: + - AccordionInstrument + +- type: loadout + id: LoadoutItemFlute + category: Items + cost: 4 + items: + - FluteInstrument + +- type: loadout + id: LoadoutItemOcarina + category: Items + cost: 3 + items: + - OcarinaInstrument + +# Survival Kit +- type: loadout + id: LoadoutItemsEmergencyOxygenTank + category: Items + cost: 1 + exclusive: true + items: + - EmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsExtendedEmergencyOxygenTank + category: Items + cost: 2 + exclusive: true + items: + - ExtendedEmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsDoubleEmergencyOxygenTank + category: Items + cost: 4 + exclusive: true + items: + - DoubleEmergencyOxygenTankFilled + +- type: loadout + id: LoadoutItemsEmergencyCrowbar + category: Items + cost: 1 + items: + - CrowbarRed + +#Misc Items +- type: loadout + id: LoadoutItemPAI + category: Items + cost: 3 + items: + - PersonalAI + +- type: loadout + id: LoadoutItemWaistbag + category: Items + cost: 2 + items: + - ClothingBeltStorageWaistbag + +- type: loadout + id: LoadoutItemSunglasses + category: Items + cost: 5 + items: + - ClothingEyesGlassesSunglasses + +#Pride Accessories +- type: loadout + id: LoadoutItemsPrideLGBTPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckLGBTPin + +- type: loadout + id: LoadoutItemsPrideAromanticPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckAromanticPin + +- type: loadout + id: LoadoutItemsPrideAsexualPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckAsexualPin + +- type: loadout + id: LoadoutItemsPrideBisexualPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckBisexualPin + +- type: loadout + id: LoadoutItemsPrideIntersexPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckIntersexPin + +- type: loadout + id: LoadoutItemsPrideLesbianPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckLesbianPin + +- type: loadout + id: LoadoutItemsPrideNonBinaryPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckNonBinaryPin + +- type: loadout + id: LoadoutItemsPridePansexualPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckPansexualPin + +- type: loadout + id: LoadoutItemsPrideTransPin + category: Items + cost: 1 + exclusive: true + items: + - ClothingNeckTransPin + +- type: loadout + id: LoadoutItemsPrideCloakTrans + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakTrans + +- type: loadout + id: LoadoutItemsPrideCloakAro + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakAro + +- type: loadout + id: LoadoutItemsPrideCloakAce + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakAce + +- type: loadout + id: LoadoutItemsPrideCloakBi + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakBi + +- type: loadout + id: LoadoutItemsPrideCloakIntersex + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakIntersex + +- type: loadout + id: LoadoutItemsPrideCloakEnby + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakEnby + +- type: loadout + id: LoadoutItemsPrideCloakPan + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakPan + +- type: loadout + id: LoadoutItemsPrideCloakGay + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakGay + +- type: loadout + id: LoadoutItemsPrideCloakLesbian + category: Items + cost: 2 + exclusive: true + items: + - ClothingNeckCloakLesbian diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index 7923d9e66f0..7632c240df8 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -32,3 +32,97 @@ cost: 3 items: - ClothingOuterWinterCoat + +- type: loadout + id: LoadoutOuterCoatHyenhSweater + category: Outer + cost: 3 + items: + - ClothingOuterCoatHyenhSweater + +- type: loadout + id: LoadoutOuterWinterCoatLong + category: Outer + cost: 3 + items: + - ClothingOuterWinterCoatLong + +- type: loadout + id: LoadoutOuterWinterCoatPlaid + category: Outer + cost: 3 + items: + - ClothingOuterWinterCoatPlaid + +## Letterman Jackets +- type: loadout + id: LoadoutOuterCoatLettermanBlue + category: Outer + cost: 3 + items: + - ClothingOuterCoatLettermanBlue + +- type: loadout + id: LoadoutOuterCoatLettermanRed + category: Outer + cost: 3 + items: + - ClothingOuterCoatLettermanRed + +## MNK +- type: loadout + id: LoadoutOuterCoatMNKWhiteHoodie + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKWhiteHoodie + +- type: loadout + id: LoadoutOuterCoatMNKBlackTopCoat + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKBlackTopCoat + +- type: loadout + id: LoadoutOuterCoatMNKBlackJacket + category: Outer + cost: 3 + items: + - ClothingOuterCoatMNKBlackJacket + +## Contractor Jackets +- type: loadout + id: LoadoutOuterCsCorporateJacket + category: Outer + cost: 3 + items: + - ClothingOuterCsCorporateJacket + +- type: loadout + id: LoadoutOuterCoatEECorporateJacket + category: Outer + cost: 3 + items: + - ClothingOuterEECorporateJacket + +- type: loadout + id: LoadoutOuterHICorporateJacket + category: Outer + cost: 3 + items: + - ClothingOuterHICorporateJacket + +- type: loadout + id: LoadoutOuterHMCorporateJacket + category: Outer + cost: 3 + items: + - ClothingOuterHMCorporateJacket + +- type: loadout + id: LoadoutOuterIdCorporateJacket + category: Outer + cost: 3 + items: + - ClothingOuterIdCorporateJacket diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index 4a1880b5e21..cc5f003b812 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -71,6 +71,62 @@ items: - ClothingShoesColorYellow +## Boots +- type: loadout + id: LoadoutShoesBootsWork + category: Accessories + cost: 1 + exclusive: true + items: + - ClothingShoesBootsWork + +- type: loadout + id: LoadoutShoesBootsLaceup + category: Accessories + cost: 2 + exclusive: true + items: + - ClothingShoesBootsLaceup + +- type: loadout + id: LoadoutShoesBootsWinter + category: Accessories + cost: 1 + exclusive: true + items: + - ClothingShoesBootsWinter + +- type: loadout + id: LoadoutShoesBootsCowboyBrown + category: Accessories + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyBrown + +- type: loadout + id: LoadoutShoesBootsCowboyBlack + category: Accessories + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyBlack + +- type: loadout + id: LoadoutShoesBootsCowboyWhite + category: Accessories + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyWhite + +- type: loadout + id: LoadoutShoesBootsCowboyFancy + category: Accessories + cost: 2 + exclusive: true + items: + - ClothingShoesBootsCowboyFancy # Miscellaneous - type: loadout diff --git a/Resources/Prototypes/Loadouts/species.yml b/Resources/Prototypes/Loadouts/species.yml new file mode 100644 index 00000000000..f8028ddb4a3 --- /dev/null +++ b/Resources/Prototypes/Loadouts/species.yml @@ -0,0 +1,38 @@ +- type: loadout + id: LoadoutSpeciesEmergencyNitrogenTank + category: Species + cost: 0 + exclusive: true + requirements: + - !type:LoadoutSpeciesRequirement + species: + - SlimePerson + - Vox + items: + - EmergencyNitrogenTankFilled + +- type: loadout + id: LoadoutSpeciesExtendedEmergencyNitrogenTank + category: Species + cost: 1 + exclusive: true + requirements: + - !type:LoadoutSpeciesRequirement + species: + - SlimePerson + - Vox + items: + - ExtendedEmergencyNitrogenTankFilled + +- type: loadout + id: LoadoutSpeciesDoubleEmergencyNitrogenTank + category: Species + cost: 3 + exclusive: true + requirements: + - !type:LoadoutSpeciesRequirement + species: + - SlimePerson + - Vox + items: + - DoubleEmergencyNitrogenTankFilled diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index 097577febab..349542b0bb5 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -259,3 +259,144 @@ exclusive: true items: - ClothingUniformColorRainbow + +## Kendo +- type: loadout + id: LoadoutUniformKendoHakama + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformKendoHakama + +- type: loadout + id: LoadoutUniformMartialGi + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformMartialGi + +## Kimono +- type: loadout + id: LoadoutClothingKimonoBlue + category: Uniform + cost: 3 + exclsuive: true + items: + - ClothingKimonoBlue + +- type: loadout + id: LoadoutClothingKimonoPink + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPink + +- type: loadout + id: LoadoutClothingKimonoPurple + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPurple + +- type: loadout + id: LoadoutClothingKimonoSky + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoSky + +- type: loadout + id: LoadoutClothingKimonoGreen + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoGreen + +## School Uniforms +- type: loadout + id: LoadoutUniformSchoolgirlDusk + category: Uniform + cost: 2 + exclusive: true + items: + - UniformSchoolgirlDusk + +- type: loadout + id: LoadoutUniformSchoolgirlBlazerTan + category: Uniform + cost: 2 + exclusive: true + items: + - UniformSchoolgirlBlazerTan + +## Gakuran +- type: loadout + id: LoadoutUniformSchoolGakuranBlack + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformSchoolGakuranBlack + +## MNK Uniforms +- type: loadout + id: LoadoutClothingMNKOfficeSkirt + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKOfficeSkirt + +- type: loadout + id: LoadoutClothingMNKUnderGarment + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKUnderGarment + +- type: loadout + id: LoadoutClothingMNKGymBra + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKGymBra + +- type: loadout + id: LoadoutClothingMNKDressBlack + category: Uniform + cost: 4 #The legendary black dress + exclusive: true + items: + - ClothingUniformMNKDressBlack + +- type: loadout + id: LoadoutClothingMNKBlackOveralls + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackOveralls + +- type: loadout + id: LoadoutClothingMNKBlackShoulder + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackShoulder + +- type: loadout + id: LoadoutClothingMNKTracksuitBlack + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKTracksuitBlack From 9a708eddc29b4e565e12f25a95c401dfa8798244 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 29 May 2024 20:54:21 -0400 Subject: [PATCH 02/79] Update uniform.yml --- Resources/Prototypes/Loadouts/uniform.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index 349542b0bb5..26e50802fe7 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -282,7 +282,7 @@ id: LoadoutClothingKimonoBlue category: Uniform cost: 3 - exclsuive: true + exclusive: true items: - ClothingKimonoBlue From 8375afcaa63755ab421c2c8b4055c01caef3f641 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 3 Jun 2024 16:20:46 -0400 Subject: [PATCH 03/79] Update ciggy discreption --- .../Objects/Consumable/Smokeables/Cigarettes/cigarette.yml | 2 +- .../Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml index 659cbaa28a2..18ea198697e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/cigarette.yml @@ -80,7 +80,7 @@ - ReagentId: Nicotine Quantity: 10 - ReagentId: Omnizine - Quantity: 30 + Quantity: 5 - type: entity id: CigaretteOmnizine diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml index bc9079fb2db..495880c8fb4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml @@ -182,7 +182,7 @@ id: CigPackSyndicate parent: CigPackBase name: Interdyne herbals packet - description: Elite cigarettes for elite syndicate agents. Infused with medicine for when you need to do more than calm your nerves. + description: Premium medicinal cigarettes from the Interdyne Corporation. Not endorced by the Terra-Gov Surgeon General. components: - type: Sprite sprite: Objects/Consumable/Smokeables/Cigarettes/Packs/syndicate.rsi From 6ca58bf57ed467ce46b81b6729203d5a33788108 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 3 Jun 2024 16:22:25 -0400 Subject: [PATCH 04/79] Update packs.yml --- .../Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml index 495880c8fb4..eb8e0a1ffe6 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/packs.yml @@ -182,7 +182,7 @@ id: CigPackSyndicate parent: CigPackBase name: Interdyne herbals packet - description: Premium medicinal cigarettes from the Interdyne Corporation. Not endorced by the Terra-Gov Surgeon General. + description: Premium medicinal cigarettes from the Interdyne Corporation. Not endorsed by the Terra-Gov Surgeon General. components: - type: Sprite sprite: Objects/Consumable/Smokeables/Cigarettes/Packs/syndicate.rsi From f24dcfebf1fd15a89c09d31fe2161a70ab754867 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 3 Jun 2024 16:34:18 -0400 Subject: [PATCH 05/79] Update outerClothing.yml --- Resources/Prototypes/Loadouts/outerClothing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index ae90b92be40..b84d329dde5 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -92,6 +92,7 @@ - ClothingOuterCoatMNKBlackJacket ## Contractor Jackets +- type: loadout id: LoadoutOuterCorporateJacket category: Outer cost: 2 From c588ac56b39969060c3f0679dca936fc93dc25d3 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 3 Jun 2024 18:53:26 -0400 Subject: [PATCH 06/79] update categories --- .../Locale/en-US/loadouts/categories.ftl | 6 + .../Entities/Clothing/Belt/belts.yml | 14 ++ .../Prototypes/Loadouts/Jobs/security.yml | 57 ++++- .../Prototypes/Loadouts/Jobs/service.yml | 6 + Resources/Prototypes/Loadouts/categories.yml | 18 ++ Resources/Prototypes/Loadouts/eyes.yml | 12 +- Resources/Prototypes/Loadouts/hands.yml | 115 ++++++++++ Resources/Prototypes/Loadouts/head.yml | 201 ++++++++++++++++-- Resources/Prototypes/Loadouts/items.yml | 154 +------------- Resources/Prototypes/Loadouts/neck.yml | 157 +++++++++++++- .../Prototypes/Loadouts/outerClothing.yml | 22 ++ Resources/Prototypes/Loadouts/shoes.yml | 46 ++-- 12 files changed, 602 insertions(+), 206 deletions(-) create mode 100644 Resources/Prototypes/Loadouts/hands.yml diff --git a/Resources/Locale/en-US/loadouts/categories.ftl b/Resources/Locale/en-US/loadouts/categories.ftl index 3723de28847..207b72d3add 100644 --- a/Resources/Locale/en-US/loadouts/categories.ftl +++ b/Resources/Locale/en-US/loadouts/categories.ftl @@ -1,8 +1,14 @@ # Alphabetically ordered loadout-category-Accessories = Accessories +loadout-category-Eyes = Eyes +loadout-category-Hands = Hands +loadout-category-Head = Head loadout-category-Items = Items loadout-category-Jobs = Jobs +loadout-category-Mask = Mask +loadout-category-Neck = Neck loadout-category-Outer = Outer +loadout-category-Shoes = Shoes loadout-category-Species = Species loadout-category-Uncategorized = Uncategorized loadout-category-Uniform = Uniform diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 1f90b421526..e6c08bf90b9 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -607,6 +607,20 @@ - type: Clothing sprite: Clothing/Belt/securitywebbing.rsi +- type: entity + parent: ClothingBeltSecurityWebbing + id: ClothingBeltSecurityWebbingFilled + name: security webbing + description: Unique and versatile chest rig, can hold security gear. + components: + - type: StorageFill + contents: + - id: GrenadeFlashBang + - id: TearGasGrenade + - id: Stunbaton + - id: Handcuffs + - id: Handcuffs + - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMercWebbing diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index 2cc7937d22f..ca69af83d3c 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -92,7 +92,8 @@ - type: loadout id: LoadoutUniformJumpsuitSecFormal category: Jobs - cost: 3 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: @@ -106,7 +107,8 @@ - type: loadout id: LoadoutUniformJumpsuitWardenBlue category: Jobs - cost: 3 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: @@ -117,7 +119,8 @@ - type: loadout id: LoadoutUniformJumpsuitWardenGrey category: Jobs - cost: 3 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: @@ -129,7 +132,8 @@ - type: loadout id: LoadoutUniformJumpskirtWardenBlue category: Jobs - cost: 3 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: @@ -140,7 +144,8 @@ - type: loadout id: LoadoutUniformJumpskirtWardenGrey category: Jobs - cost: 3 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: @@ -151,7 +156,8 @@ - type: loadout id: LoadoutUniformJumpskirtHoSBlue category: Jobs - cost: 3 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: @@ -162,7 +168,8 @@ - type: loadout id: LoadoutUniformJumpskirtHoSGrey category: Jobs - cost: 3 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: @@ -207,7 +214,7 @@ - type: loadout id: LoadoutSecurityEyesHudSecurity category: Jobs - cost: 3 + cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement @@ -222,7 +229,7 @@ - type: loadout id: LoadoutSecurityEyesEyepatchHudSecurity category: Jobs - cost: 3 + cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement @@ -237,7 +244,7 @@ - type: loadout id: LoadoutSecurityHeadHatBeret category: Jobs - cost: 3 + cost: 1 exclusive: true requirements: - !type:LoadoutJobRequirement @@ -268,3 +275,33 @@ - Oni items: - Truncheon + +- type: loadout + id: LoadoutSecurityHeadHelmetInsulated + category: Jobs + cost: 3 + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + items: + - ClothingHeadHelmetInsulated + +- type: loadout + id: LoadoutSecurityBeltWebbing + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - Detective + - SecurityOfficer + - SecurityCadet + - Warden + - HeadOfSecurity + items: + - ClothingBeltSecurityWebbingFilled diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index cab3ed377bd..1eecebec534 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -1,3 +1,4 @@ +## Clown - type: loadout id: LoadoutServiceClownOutfitJester category: Jobs @@ -26,6 +27,7 @@ - ClothingHeadHatJesterAlt - ClothingShoesJester +## Bartender - type: loadout id: LoadoutServiceBartenderUniformPurple category: Jobs @@ -38,6 +40,7 @@ items: - ClothingUniformJumpsuitBartenderPurple +## Botanist - type: loadout id: LoadoutServiceBotanistUniformOveralls category: Jobs @@ -50,6 +53,7 @@ items: - ClothingUniformOveralls +## Lawyer - type: loadout id: LoadoutServiceLawyerUniformBlueSuit category: Jobs @@ -158,6 +162,7 @@ items: - ClothingUniformJumpsuitJournalist +## Reporter - type: loadout id: LoadoutServiceReporterUniformDetectivesuit category: Jobs @@ -182,6 +187,7 @@ items: - ClothingUniformJumpskirtDetective +## Musician - type: loadout id: LoadoutItemSynthesizerInstrument category: Jobs diff --git a/Resources/Prototypes/Loadouts/categories.yml b/Resources/Prototypes/Loadouts/categories.yml index b947a35355a..f1e8c342948 100644 --- a/Resources/Prototypes/Loadouts/categories.yml +++ b/Resources/Prototypes/Loadouts/categories.yml @@ -2,15 +2,33 @@ - type: loadoutCategory id: Accessories +- type: loadoutCategory + id: Eyes + +- type: loadoutCategory + id: Hands + +- type: loadoutCategory + id: Head + - type: loadoutCategory id: Items - type: loadoutCategory id: Jobs +- type: loadoutCategory + id: Mask + +- type: loadoutCategory + id: Neck + - type: loadoutCategory id: Outer +- type: loadoutCategory + id: Shoes + - type: loadoutCategory id: Species diff --git a/Resources/Prototypes/Loadouts/eyes.yml b/Resources/Prototypes/Loadouts/eyes.yml index a7a8cbd7736..74226604e92 100644 --- a/Resources/Prototypes/Loadouts/eyes.yml +++ b/Resources/Prototypes/Loadouts/eyes.yml @@ -1,13 +1,21 @@ - type: loadout id: LoadoutEyesEyepatch - category: Accessories + category: Eyes cost: 1 items: - ClothingEyesEyepatch - type: loadout id: LoadoutEyesBlindfold - category: Accessories + category: Eyes cost: 2 items: - ClothingEyesBlindfold + +- type: loadout + id: LoadoutItemSunglasses + category: Eyes + cost: 5 + exclusive: true + items: + - ClothingEyesGlassesSunglasses diff --git a/Resources/Prototypes/Loadouts/hands.yml b/Resources/Prototypes/Loadouts/hands.yml new file mode 100644 index 00000000000..782810f47eb --- /dev/null +++ b/Resources/Prototypes/Loadouts/hands.yml @@ -0,0 +1,115 @@ +- type: loadout + id: LoadoutHandsColorPurple + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorPurple + +- type: loadout + id: LoadoutHandsColorRed + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorRed + +- type: loadout + id: LoadoutHandsColorBlack + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBlack + +- type: loadout + id: LoadoutHandsColorBlue + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBlue + +- type: loadout + id: LoadoutHandsColorBrown + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorBrown + +- type: loadout + id: LoadoutHandsColorGray + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorGray + +- type: loadout + id: LoadoutHandsColorGreen + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorGreen + +- type: loadout + id: LoadoutHandsColorLightBrown + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorLightBrown + +- type: loadout + id: LoadoutHandsColorOrange + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorOrange + +- type: loadout + id: LoadoutHandsColorWhite + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesColorWhite + +- type: loadout + id: LoadoutHandsColorYellowBudget + category: Hands + cost: 4 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - Passenger + items: + - ClothingHandsGlovesColorYellow + +- type: loadout + id: LoadoutHandsGlovesLeather + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesLeather + +- type: loadout + id: LoadoutHandsGlovesPowerglove + category: Hands + cost: 2 + exclusive: true + items: + - ClothingHandsGlovesPowerglove + +- type: loadout + id: LoadoutHandsGlovesRobohands + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesRobohands diff --git a/Resources/Prototypes/Loadouts/head.yml b/Resources/Prototypes/Loadouts/head.yml index 33a2f0b19bc..7f63ccccf09 100644 --- a/Resources/Prototypes/Loadouts/head.yml +++ b/Resources/Prototypes/Loadouts/head.yml @@ -1,125 +1,290 @@ +## Hats - type: loadout id: LoadoutHeadBeaverHat - category: Accessories + category: Head cost: 2 + exclusive: true items: - ClothingHeadHatBeaverHat - type: loadout id: LoadoutHeadTophat - category: Accessories + category: Head cost: 2 + exclusive: true items: - ClothingHeadHatTophat +- type: loadout + id: LoadoutHeadFedoraBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraBlack + +- type: loadout + id: LoadoutHeadFedoraChoc + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraChoc + +- type: loadout + id: LoadoutHeadFedoraWhite + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraWhite + +- type: loadout + id: LoadoutHeadFlatBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFlatBlack + +- type: loadout + id: LoadoutHeadFlatBrown + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFlatBrown + +- type: loadout + id: LoadoutHeadTinfoil + category: Head + cost: 3 + exclusive: true + items: + - ClothingHeadTinfoil + +- type: loadout + id: LoadoutHeadBellhop + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBellhop +## Color Hats - type: loadout id: LoadoutHeadHatBluesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatBluesoft - type: loadout id: LoadoutHeadHatBluesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatBluesoftFlipped - type: loadout id: LoadoutHeadHatCorpsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatCorpsoft - type: loadout id: LoadoutHeadHatCorpsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatCorpsoftFlipped - type: loadout id: LoadoutHeadHatGreensoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreensoft - type: loadout id: LoadoutHeadHatGreensoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreensoftFlipped - type: loadout id: LoadoutHeadHatGreysoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreysoft - type: loadout id: LoadoutHeadHatGreysoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatGreysoftFlipped - type: loadout id: LoadoutHeadHatOrangesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatOrangesoft - type: loadout id: LoadoutHeadHatOrangesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatOrangesoftFlipped - type: loadout id: LoadoutHeadHatPurplesoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatPurplesoft - type: loadout id: LoadoutHeadHatPurplesoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatPurplesoftFlipped - type: loadout id: LoadoutHeadHatRedsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatRedsoft - type: loadout id: LoadoutHeadHatRedsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatRedsoftFlipped - type: loadout id: LoadoutHeadHatYellowsoft - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatYellowsoft - type: loadout id: LoadoutHeadHatYellowsoftFlipped - category: Accessories + category: Head cost: 1 + exclusive: true items: - ClothingHeadHatYellowsoftFlipped + +## Headbands +- type: loadout + id: LoadoutHeadBandBlack + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBlack + +- type: loadout + id: LoadoutHeadBandBlue + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBlue + +- type: loadout + id: LoadoutHeadBandGold + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGold + +- type: loadout + id: LoadoutHeadBandGreen + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGreen + +- type: loadout + id: LoadoutHeadBandGrey + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandGrey + +- type: loadout + id: LoadoutHeadBandRed + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandRed + +- type: loadout + id: LoadoutHeadBandSkull + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandSkull + +- type: loadout + id: LoadoutHeadBandMerc + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadBandMerc + +- type: loadout + id: LoadoutHeadBandBrown + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadBandBrown + +## Hoods +- type: loadout + id: LoadoutHeadHoodBrown + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadHoodBrown + +- type: loadout + id: LoadoutHeadHoodTechPriest + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadTechPriest diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 84892f171a1..a05f8d0a03b 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -37,7 +37,7 @@ - type: loadout id: LoadoutItemCigsMixed category: Items - cost: 2 + cost: 3 items: - CigPackMixed @@ -243,155 +243,3 @@ cost: 2 items: - ClothingBeltStorageWaistbag - -- type: loadout - id: LoadoutItemSunglasses - category: Items - cost: 5 - items: - - ClothingEyesGlassesSunglasses - -#Pride Accessories -- type: loadout - id: LoadoutItemsPrideLGBTPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckLGBTPin - -- type: loadout - id: LoadoutItemsPrideAromanticPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckAromanticPin - -- type: loadout - id: LoadoutItemsPrideAsexualPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckAsexualPin - -- type: loadout - id: LoadoutItemsPrideBisexualPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckBisexualPin - -- type: loadout - id: LoadoutItemsPrideIntersexPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckIntersexPin - -- type: loadout - id: LoadoutItemsPrideLesbianPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckLesbianPin - -- type: loadout - id: LoadoutItemsPrideNonBinaryPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckNonBinaryPin - -- type: loadout - id: LoadoutItemsPridePansexualPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckPansexualPin - -- type: loadout - id: LoadoutItemsPrideTransPin - category: Items - cost: 1 - exclusive: true - items: - - ClothingNeckTransPin - -- type: loadout - id: LoadoutItemsPrideCloakTrans - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakTrans - -- type: loadout - id: LoadoutItemsPrideCloakAro - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakAro - -- type: loadout - id: LoadoutItemsPrideCloakAce - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakAce - -- type: loadout - id: LoadoutItemsPrideCloakBi - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakBi - -- type: loadout - id: LoadoutItemsPrideCloakIntersex - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakIntersex - -- type: loadout - id: LoadoutItemsPrideCloakEnby - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakEnby - -- type: loadout - id: LoadoutItemsPrideCloakPan - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakPan - -- type: loadout - id: LoadoutItemsPrideCloakGay - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakGay - -- type: loadout - id: LoadoutItemsPrideCloakLesbian - category: Items - cost: 2 - exclusive: true - items: - - ClothingNeckCloakLesbian diff --git a/Resources/Prototypes/Loadouts/neck.yml b/Resources/Prototypes/Loadouts/neck.yml index 7e5526f966a..c6207dfdde5 100644 --- a/Resources/Prototypes/Loadouts/neck.yml +++ b/Resources/Prototypes/Loadouts/neck.yml @@ -1,27 +1,176 @@ - type: loadout id: LoadoutNeckScarfStripedRed - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedRed - type: loadout id: LoadoutNeckScarfStripedBlue - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedBlue - type: loadout id: LoadoutNeckScarfStripedGreen - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedGreen - type: loadout id: LoadoutNeckScarfStripedZebra - category: Accessories + category: Neck cost: 1 + exclusive: true items: - ClothingNeckScarfStripedZebra + +#Pride Accessories +- type: loadout + id: LoadoutItemsPrideLGBTPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckLGBTPin + +- type: loadout + id: LoadoutItemsPrideAromanticPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckAromanticPin + +- type: loadout + id: LoadoutItemsPrideAsexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckAsexualPin + +- type: loadout + id: LoadoutItemsPrideBisexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckBisexualPin + +- type: loadout + id: LoadoutItemsPrideIntersexPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckIntersexPin + +- type: loadout + id: LoadoutItemsPrideLesbianPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckLesbianPin + +- type: loadout + id: LoadoutItemsPrideNonBinaryPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckNonBinaryPin + +- type: loadout + id: LoadoutItemsPridePansexualPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckPansexualPin + +- type: loadout + id: LoadoutItemsPrideTransPin + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTransPin + +- type: loadout + id: LoadoutItemsPrideCloakTrans + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakTrans + +- type: loadout + id: LoadoutItemsPrideCloakAro + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakAro + +- type: loadout + id: LoadoutItemsPrideCloakAce + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakAce + +- type: loadout + id: LoadoutItemsPrideCloakBi + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakBi + +- type: loadout + id: LoadoutItemsPrideCloakIntersex + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakIntersex + +- type: loadout + id: LoadoutItemsPrideCloakEnby + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakEnby + +- type: loadout + id: LoadoutItemsPrideCloakPan + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakPan + +- type: loadout + id: LoadoutItemsPrideCloakGay + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakGay + +- type: loadout + id: LoadoutItemsPrideCloakLesbian + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckCloakLesbian diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index b84d329dde5..83d1fb30d4a 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -54,6 +54,28 @@ items: - ClothingOuterWinterCoatPlaid +- type: loadout + id: LoadoutOuterVestValet + category: Outer + cost: 1 + items: + - ClothingOuterVestValet + +## Robes +- type: loadout + id: LoadoutOuterRobeBrown + category: Outer + cost: 2 + items: + - ClothingOuterRobeBrown + +- type: loadout + id: LoadoutOuterRobeTechPriest + category: Outer + cost: 2 + items: + - ClothingOuterRobeTechPriest + ## Letterman Jackets - type: loadout id: LoadoutOuterCoatLettermanBlue diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index cc5f003b812..240568eff33 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -1,7 +1,7 @@ # Colored - type: loadout id: LoadoutShoesBlack - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -9,7 +9,7 @@ - type: loadout id: LoadoutShoesBlue - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -17,7 +17,7 @@ - type: loadout id: LoadoutShoesBrown - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -25,7 +25,7 @@ - type: loadout id: LoadoutShoesGreen - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -33,7 +33,7 @@ - type: loadout id: LoadoutShoesOrange - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -41,7 +41,7 @@ - type: loadout id: LoadoutShoesPurple - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -49,7 +49,7 @@ - type: loadout id: LoadoutShoesRed - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -57,7 +57,7 @@ - type: loadout id: LoadoutShoesWhite - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -65,16 +65,24 @@ - type: loadout id: LoadoutShoesYellow - category: Accessories + category: Shoes cost: 1 exclusive: true items: - ClothingShoesColorYellow +- type: loadout + id: LoadoutShoesGeta + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingShoesGeta + ## Boots - type: loadout id: LoadoutShoesBootsWork - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -82,7 +90,7 @@ - type: loadout id: LoadoutShoesBootsLaceup - category: Accessories + category: Shoes cost: 2 exclusive: true items: @@ -90,7 +98,7 @@ - type: loadout id: LoadoutShoesBootsWinter - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -98,7 +106,7 @@ - type: loadout id: LoadoutShoesBootsCowboyBrown - category: Accessories + category: Shoes cost: 2 exclusive: true items: @@ -106,7 +114,7 @@ - type: loadout id: LoadoutShoesBootsCowboyBlack - category: Accessories + category: Shoes cost: 2 exclusive: true items: @@ -114,7 +122,7 @@ - type: loadout id: LoadoutShoesBootsCowboyWhite - category: Accessories + category: Shoes cost: 2 exclusive: true items: @@ -122,7 +130,7 @@ - type: loadout id: LoadoutShoesBootsCowboyFancy - category: Accessories + category: Shoes cost: 2 exclusive: true items: @@ -131,7 +139,7 @@ # Miscellaneous - type: loadout id: LoadoutShoesSlippersDuck - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -139,7 +147,7 @@ - type: loadout id: LoadoutShoesLeather - category: Accessories + category: Shoes cost: 1 exclusive: true items: @@ -147,7 +155,7 @@ - type: loadout id: LoadoutShoesMiscWhite - category: Accessories + category: Shoes cost: 1 exclusive: true items: From c68218baf41cb4229b45c2afd8e6bbdca567f27b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 3 Jun 2024 19:06:28 -0400 Subject: [PATCH 07/79] Add bluesec and reorganize security --- .../Prototypes/Loadouts/Jobs/security.yml | 170 ++++++++++++------ 1 file changed, 116 insertions(+), 54 deletions(-) diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index ca69af83d3c..3f1ac925659 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -1,7 +1,22 @@ +## Uniforms - type: loadout - id: LoadoutSecurityUniformGrey + id: LoadoutSecurityUniformJumpsuitBlue category: Jobs - cost: 2 + cost: 1 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpsuitSecBlue + +- type: loadout + id: LoadoutSecurityUniformJumpsuitGrey + category: Jobs + cost: 1 exclusive: true requirements: - !type:LoadoutJobRequirement @@ -12,6 +27,34 @@ items: - ClothingUniformJumpsuitSecGrey +- type: loadout + id: LoadoutSecurityUniformJumpskirtGrey + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpskirtSecGrey + +- type: loadout + id: LoadoutSecurityUniformJumpskirtBlue + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - SecurityCadet + - Warden + items: + - ClothingUniformJumpskirtSecBlue + - type: loadout id: LoadoutSecurityUniformJumpskirtSenior category: Jobs @@ -61,7 +104,7 @@ - ClothingUniformJumpsuitSeniorOfficer - type: loadout - id: LoadoutSecurityMaskGasSwat + id: LoadoutUniformJumpsuitWardenBlue category: Jobs cost: 2 exclusive: true @@ -69,43 +112,35 @@ - !type:LoadoutJobRequirement jobs: - Warden - - HeadOfSecurity items: - - ClothingMaskGasSwat + - ClothingUniformJumpsuitWardenBlue - type: loadout - id: LoadoutSecurityShoesJackboots + id: LoadoutUniformJumpsuitWardenGrey category: Jobs - cost: 1 + cost: 2 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: - - Detective - - SecurityOfficer - - SecurityCadet - Warden - - HeadOfSecurity items: - - ClothingShoesBootsJack + - ClothingUniformJumpsuitWardenGrey -## Alt Jumpsuits - type: loadout - id: LoadoutUniformJumpsuitSecFormal + id: LoadoutUniformJumpskirtWardenBlue category: Jobs cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement jobs: - - Detective - - SecurityOfficer - Warden - - HeadOfSecurity items: - - ClothingUniformJumpsuitSecFormal + - ClothingUniformJumpskirtWardenBlue - type: loadout - id: LoadoutUniformJumpsuitWardenBlue + id: LoadoutUniformJumpskirtWardenGrey category: Jobs cost: 2 exclusive: true @@ -114,69 +149,92 @@ jobs: - Warden items: - - ClothingUniformJumpsuitWardenBlue + - ClothingUniformJumpskirtWardenGrey - type: loadout - id: LoadoutUniformJumpsuitWardenGrey + id: LoadoutUniformJumpskirtHoSBlue category: Jobs cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement jobs: - - Warden + - HeadOfSecurity items: - - ClothingUniformJumpsuitWardenGrey + - ClothingUniformJumpskirtHoSBlue -## Alt Jumpskirts - type: loadout - id: LoadoutUniformJumpskirtWardenBlue + id: LoadoutUniformJumpskirtHoSGrey category: Jobs cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement jobs: - - Warden + - HeadOfSecurity items: - - ClothingUniformJumpskirtWardenBlue + - ClothingUniformJumpskirtHoSGrey - type: loadout - id: LoadoutUniformJumpskirtWardenGrey + id: LoadoutUniformJumpsuitSecFormal category: Jobs cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement jobs: + - Detective + - SecurityOfficer - Warden + - HeadOfSecurity items: - - ClothingUniformJumpskirtWardenGrey + - ClothingUniformJumpsuitSecFormal - type: loadout - id: LoadoutUniformJumpskirtHoSBlue + id: LoadoutUniformJumpsuitSecSummer category: Jobs - cost: 2 + cost: 1 exclusive: true requirements: - !type:LoadoutJobRequirement jobs: + - Detective + - SecurityOfficer + - Warden - HeadOfSecurity items: - - ClothingUniformJumpskirtHoSBlue - + - ClothingUniformJumpsuitSecSummer +## Mask - type: loadout - id: LoadoutUniformJumpskirtHoSGrey + id: LoadoutSecurityMaskGasSwat category: Jobs cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement jobs: + - Warden - HeadOfSecurity items: - - ClothingUniformJumpskirtHoSGrey + - ClothingMaskGasSwat + +## Shoes +- type: loadout + id: LoadoutSecurityShoesJackboots + category: Jobs + cost: 1 + requirements: + - !type:LoadoutJobRequirement + jobs: + - Detective + - SecurityOfficer + - SecurityCadet + - Warden + - HeadOfSecurity + items: + - ClothingShoesBootsJack +## Items - type: loadout id: LoadoutItemsSpareHandgunMagazine category: Jobs @@ -211,6 +269,7 @@ items: - MagazinePistolRubber +## Eyes - type: loadout id: LoadoutSecurityEyesHudSecurity category: Jobs @@ -241,6 +300,7 @@ items: - ClothingEyesEyepatchHudSecurity +## Head - type: loadout id: LoadoutSecurityHeadHatBeret category: Jobs @@ -257,9 +317,9 @@ - ClothingHeadHatBeretSecurity - type: loadout - id: LoadoutSecurityEquipmentTruncheon + id: LoadoutSecurityHeadHelmetInsulated category: Jobs - cost: 8 + cost: 3 requirements: - !type:LoadoutJobRequirement jobs: @@ -267,41 +327,43 @@ - Warden - HeadOfSecurity - Brigmedic - - !type:LoadoutPlaytimeRequirement - tracker: JobSecurityOfficer - min: 36000 # 10 hours - - !type:LoadoutSpeciesRequirement - species: - - Oni items: - - Truncheon + - ClothingHeadHelmetInsulated +## Belt - type: loadout - id: LoadoutSecurityHeadHelmetInsulated + id: LoadoutSecurityBeltWebbing category: Jobs - cost: 3 + cost: 1 + exclusive: true requirements: - !type:LoadoutJobRequirement jobs: + - Detective - SecurityOfficer + - SecurityCadet - Warden - HeadOfSecurity - - Brigmedic items: - - ClothingHeadHelmetInsulated + - ClothingBeltSecurityWebbingFilled +## Species - type: loadout - id: LoadoutSecurityBeltWebbing + id: LoadoutSecurityEquipmentTruncheon category: Jobs - cost: 1 - exclusive: true + cost: 8 ## TODO: Make this replace the secoff handgun, and thus also make it cheaper requirements: - !type:LoadoutJobRequirement jobs: - - Detective - SecurityOfficer - - SecurityCadet - Warden - HeadOfSecurity + - Brigmedic + - !type:LoadoutPlaytimeRequirement + tracker: JobSecurityOfficer + min: 36000 # 10 hours + - !type:LoadoutSpeciesRequirement + species: + - Oni items: - - ClothingBeltSecurityWebbingFilled + - Truncheon From 11c49a0a11c49bed7b0464750ab847d3f33a098f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 3 Jun 2024 19:28:02 -0400 Subject: [PATCH 08/79] Adding prescription glasses --- Resources/Prototypes/Loadouts/Jobs/medical.yml | 18 ++++++++++++++++++ .../Prototypes/Loadouts/Jobs/security.yml | 17 +++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index 9d4ce267625..adf1fb0aa14 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -470,3 +470,21 @@ - Brigmedic items: - ClothingEyesEyepatchHudMedical + +- type: loadout + id: LoadoutMedicalEyesEyepatchHudMedical + category: Jobs + cost: 3 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + - !type:LoadoutTraitRequirement + trait: Nearsighted + items: + - ClothingEyesEyepatchHudMedical diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index 3f1ac925659..67c75d1f74e 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -300,6 +300,23 @@ items: - ClothingEyesEyepatchHudSecurity +- type: loadout + id: LoadoutSecurityEyesHudSecurityPrescription + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:LoadoutJobRequirement + jobs: + - SecurityOfficer + - Warden + - HeadOfSecurity + - Brigmedic + - !type:LoadoutTraitRequirement + trait: Nearsighted + items: + - ClothingEyesPrescriptionHudSecurity + ## Head - type: loadout id: LoadoutSecurityHeadHatBeret From 0c0cc2463f2028905fac72af001640f65cb6897b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 3 Jun 2024 19:32:39 -0400 Subject: [PATCH 09/79] Update medical.yml --- Resources/Prototypes/Loadouts/Jobs/medical.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index adf1fb0aa14..429732cf1e4 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -442,7 +442,7 @@ - type: loadout id: LoadoutMedicalEyesHudMedical category: Jobs - cost: 3 + cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement @@ -458,7 +458,7 @@ - type: loadout id: LoadoutMedicalEyesEyepatchHudMedical category: Jobs - cost: 3 + cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement @@ -472,9 +472,9 @@ - ClothingEyesEyepatchHudMedical - type: loadout - id: LoadoutMedicalEyesEyepatchHudMedical + id: LoadoutMedicalEyesHudMedicalPrescription category: Jobs - cost: 3 + cost: 2 exclusive: true requirements: - !type:LoadoutJobRequirement @@ -487,4 +487,4 @@ - !type:LoadoutTraitRequirement trait: Nearsighted items: - - ClothingEyesEyepatchHudMedical + - ClothingEyesPrescriptionMedHud From ab9000e059d55253d63a51050df591a165349e5f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 16 Jun 2024 11:28:14 -0400 Subject: [PATCH 10/79] Update items.yml --- Resources/Prototypes/Loadouts/items.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index a05f8d0a03b..2fd5b6b1147 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -243,3 +243,10 @@ cost: 2 items: - ClothingBeltStorageWaistbag + +- type: loadout + id: LoadoutSolCommonTranslator + category: Items + cost: 3 + items: + - SolCommonTranslator From 572e244d5ed6ef7b8d0410fb1af91ae369085bde Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 16 Jun 2024 11:31:16 -0400 Subject: [PATCH 11/79] Loadout description for translator --- Resources/Locale/en-US/loadouts/items.ftl | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Locale/en-US/loadouts/items.ftl b/Resources/Locale/en-US/loadouts/items.ftl index a4819011262..80105041a59 100644 --- a/Resources/Locale/en-US/loadouts/items.ftl +++ b/Resources/Locale/en-US/loadouts/items.ftl @@ -11,3 +11,4 @@ loadout-description-LoadoutItemPlushieSharkBlue = Dive into battle with your ver loadout-description-LoadoutItemPlushieSharkPink = Unleash the power of pink with the Pink Shark Plushie! This rosy-hued predator might not have real teeth, but its sheer adorableness is enough to take a bite out of anyone's resolve. Watch as foes melt away in the face of its cottony charm. loadout-description-LoadoutItemPlushieSharkGrey = Introducing the Grey Shark Plushie, the apex predator of snuggles! With its sleek and understated design, this plushie strikes the perfect balance between cuddle companion and imaginary ocean guardian. Beware; opponents may be mesmerized by its dorsal fin's hypnotic sway! loadout-description-LoadoutItemPlushieCarp = Brace for extraterrestrial antics with the Purple Space Carp Plushie! A fishy invader from the cosmic deep, this plushie brings a splash of humor to zero-gravity escapades. From hostile waters to interstellar giggles, it's a cuddly contradiction that's out of this world +loadout-description-LoadoutSolCommonTranslator = The most common of all translators, such that it can be purchased in any civilized station. This device translates Sol Common speech into Galactic Common. From 188f9f99f1fba5a665861335dc1bd03bf394c113 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 16 Jun 2024 11:33:38 -0400 Subject: [PATCH 12/79] multiline ftl looks nicer --- Resources/Locale/en-US/loadouts/items.ftl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/loadouts/items.ftl b/Resources/Locale/en-US/loadouts/items.ftl index 80105041a59..b92f56bc7cb 100644 --- a/Resources/Locale/en-US/loadouts/items.ftl +++ b/Resources/Locale/en-US/loadouts/items.ftl @@ -11,4 +11,5 @@ loadout-description-LoadoutItemPlushieSharkBlue = Dive into battle with your ver loadout-description-LoadoutItemPlushieSharkPink = Unleash the power of pink with the Pink Shark Plushie! This rosy-hued predator might not have real teeth, but its sheer adorableness is enough to take a bite out of anyone's resolve. Watch as foes melt away in the face of its cottony charm. loadout-description-LoadoutItemPlushieSharkGrey = Introducing the Grey Shark Plushie, the apex predator of snuggles! With its sleek and understated design, this plushie strikes the perfect balance between cuddle companion and imaginary ocean guardian. Beware; opponents may be mesmerized by its dorsal fin's hypnotic sway! loadout-description-LoadoutItemPlushieCarp = Brace for extraterrestrial antics with the Purple Space Carp Plushie! A fishy invader from the cosmic deep, this plushie brings a splash of humor to zero-gravity escapades. From hostile waters to interstellar giggles, it's a cuddly contradiction that's out of this world -loadout-description-LoadoutSolCommonTranslator = The most common of all translators, such that it can be purchased in any civilized station. This device translates Sol Common speech into Galactic Common. +loadout-description-LoadoutSolCommonTranslator = The most common of all translators, such that it can be purchased in any civilized station. + This device translates Sol Common speech into Galactic Common. From ce097f56d46e0d36934addc76d6b86d8b4b3a13a Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 16 Jun 2024 12:26:04 -0400 Subject: [PATCH 13/79] apparently exclusive means they replace peoples belts, which is unintended --- Resources/Prototypes/Loadouts/items.yml | 3 --- Resources/Prototypes/Loadouts/species.yml | 3 --- 2 files changed, 6 deletions(-) diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 2fd5b6b1147..752f9adf3f1 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -202,7 +202,6 @@ id: LoadoutItemsEmergencyOxygenTank category: Items cost: 1 - exclusive: true items: - EmergencyOxygenTankFilled @@ -210,7 +209,6 @@ id: LoadoutItemsExtendedEmergencyOxygenTank category: Items cost: 2 - exclusive: true items: - ExtendedEmergencyOxygenTankFilled @@ -218,7 +216,6 @@ id: LoadoutItemsDoubleEmergencyOxygenTank category: Items cost: 4 - exclusive: true items: - DoubleEmergencyOxygenTankFilled diff --git a/Resources/Prototypes/Loadouts/species.yml b/Resources/Prototypes/Loadouts/species.yml index f8028ddb4a3..e31daca1943 100644 --- a/Resources/Prototypes/Loadouts/species.yml +++ b/Resources/Prototypes/Loadouts/species.yml @@ -2,7 +2,6 @@ id: LoadoutSpeciesEmergencyNitrogenTank category: Species cost: 0 - exclusive: true requirements: - !type:LoadoutSpeciesRequirement species: @@ -15,7 +14,6 @@ id: LoadoutSpeciesExtendedEmergencyNitrogenTank category: Species cost: 1 - exclusive: true requirements: - !type:LoadoutSpeciesRequirement species: @@ -28,7 +26,6 @@ id: LoadoutSpeciesDoubleEmergencyNitrogenTank category: Species cost: 3 - exclusive: true requirements: - !type:LoadoutSpeciesRequirement species: From c3b54db10f6ee914e3d2ee48af6f8d8e3e0bae1b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 3 May 2024 13:16:25 -0400 Subject: [PATCH 14/79] guh --- .../Abilities/Dispel/DispelPowerComponent.cs | 5 ++- .../MassSleep/MassSleepPowerComponent.cs | 3 ++ .../Metapsionics/MetapsionicPowerComponent.cs | 30 ++++++++++++---- .../MindSwap/MindSwapPowerComponent.cs | 3 ++ .../NoosphericZapPowerComponent.cs | 3 ++ .../PsionicInvisibilityPowerComponent.cs | 6 ++++ .../PsionicRegenerationPowerComponent.cs | 6 ++++ .../Pyrokinesis/PyrokinesisPowerComponent.cs | 3 ++ .../Telegnosis/TelegnosisPowerComponent.cs | 5 ++- .../Abilities/Psionics/PsionicComponent.cs | 12 +++++-- .../Events/MetapsionicPowerActionEvent.cs | 3 +- Content.Shared/Nyanotrasen/Psionics/Events.cs | 36 +++++++++++++++++++ 12 files changed, 104 insertions(+), 11 deletions(-) diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs index cd887866364..837bdd96a87 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs @@ -9,12 +9,15 @@ public sealed partial class DispelPowerComponent : Component { [DataField("range")] public float Range = 10f; - + [DataField("dispelActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] public string? DispelActionId = "ActionDispel"; [DataField("dispelActionEntity")] public EntityUid? DispelActionEntity; + + [DataField("dispelFeedback")] + public string DispelFeedback = "dispel-feedback"; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs index 7d611c63dac..c092cacd8b8 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs @@ -14,5 +14,8 @@ public sealed partial class MassSleepPowerComponent : Component [DataField("massSleepActionEntity")] public EntityUid? MassSleepActionEntity; + + [DataField("massSleepFeedback")] + public string MassSleepFeedback = "mass-sleep-feedback"; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs index c9d0130221a..0e12d05dead 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs @@ -1,4 +1,6 @@ using Content.Shared.Actions; +using Content.Shared.DoAfter; +using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -7,15 +9,31 @@ namespace Content.Shared.Abilities.Psionics [RegisterComponent] public sealed partial class MetapsionicPowerComponent : Component { + [DataField("doAfter")] + public DoAfterId? DoAfter; + + [DataField("useDelay")] + public float UseDelay = 8f; + [DataField("soundUse")] + + public SoundSpecifier SoundUse = new SoundPathSpecifier("/Audio/Nyanotrasen/heartbeat_fast.ogg"); + [DataField("range")] public float Range = 5f; - public InstantActionComponent? MetapsionicPowerAction = null; - [DataField("metapsionicActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? MetapsionicActionId = "ActionMetapsionic"; + [DataField("actionWideMetapsionic", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ActionWideMetapsionic = "ActionWideMetapsionic"; + + [DataField("actionWideMetapsionicEntity")] + public EntityUid? ActionWideMetapsionicEntity; + + [DataField("actionFocusedMetapsionic", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ActionFocusedMetapsionic = "ActionFocusedMetapsionic"; + + [DataField("actionFocusedMetapsionicEntity")] + public EntityUid? ActionFocusedMetapsionicEntity; - [DataField("metapsionicActionEntity")] - public EntityUid? MetapsionicActionEntity; + [DataField("metapsionicFeedback")] + public string MetapsionicFeedback = "metapsionic-feedback"; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs index 6a3fc811c89..e617c48cf2d 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs @@ -12,5 +12,8 @@ public sealed partial class MindSwapPowerComponent : Component [DataField("mindSwapActionEntity")] public EntityUid? MindSwapActionEntity; + + [DataField("mindSwapFeedback")] + public string MindSwapFeedback = "mind-swap-feedback"; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs index 0e91894b1dc..24c144079e4 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs @@ -13,5 +13,8 @@ public sealed partial class NoosphericZapPowerComponent : Component [DataField("noosphericZapActionEntity")] public EntityUid? NoosphericZapActionEntity; + + [DataField("noosphericZapFeedback")] + public string NoosphericZapFeedback = "noospheric-zap-feedback"; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs index 3e198aa9303..3b29a1e4367 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs @@ -12,5 +12,11 @@ public sealed partial class PsionicInvisibilityPowerComponent : Component [DataField("psionicInvisibilityActionEntity")] public EntityUid? PsionicInvisibilityActionEntity; + + [DataField("InvisibilityFeedback")] + public string InvisibilityFeedback = "invisibility-feedback"; + + [DataField("UseTimer")] + public float UseTimer = 30f; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs index 4a62e84d191..2f86615b836 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs @@ -26,6 +26,12 @@ public sealed partial class PsionicRegenerationPowerComponent : Component [DataField("psionicRegenerationActionEntity")] public EntityUid? PsionicRegenerationActionEntity; + + [DataField("regenerationFeedback")] + public string RegenerationFeedback = "regeneration-feedback"; + + [DataField("selfRevive")] + public bool SelfRevive { get; set; } = false; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs index 28425afdb4c..d2af000e269 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs @@ -14,5 +14,8 @@ public sealed partial class PyrokinesisPowerComponent : Component [DataField("pyrokinesisActionEntity")] public EntityUid? PyrokinesisActionEntity; + + [DataField("pyrokinesisFeedback")] + public string PyrokinesisFeedback = "pyrokinesis-feedback"; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs index 51958822a41..cd298c3ec0f 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs @@ -19,5 +19,8 @@ public sealed partial class TelegnosisPowerComponent : Component [DataField("telegnosisActionEntity")] public EntityUid? TelegnosisActionEntity; + + [DataField("telegnosisFeedback")] + public string TelegnosisFeedback = "telegnosis-feedback"; } -} \ No newline at end of file +} diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs index 9091e03cfc3..7c7befa33c3 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions; using Robust.Shared.GameStates; namespace Content.Shared.Abilities.Psionics @@ -15,6 +14,15 @@ public sealed partial class PsionicComponent : Component public bool Removable = true; [DataField("activePowers")] - public HashSet ActivePowers = new(); + public List ActivePowers = new(); + + [DataField("psychicFeedback")] + public List PsychicFeedback= new(); + + [DataField("amplification")] + public float Amplification = 1f; + + [DataField("dampening")] + public float Dampening = 1f; } } diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs index b28801efe74..b7c3c8ad2d6 100644 --- a/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs +++ b/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs @@ -1,2 +1,3 @@ namespace Content.Shared.Actions.Events; -public sealed partial class MetapsionicPowerActionEvent : InstantActionEvent {} +public sealed partial class WideMetapsionicPowerActionEvent : InstantActionEvent { } +public sealed partial class FocusedMetapsionicPowerActionEvent : EntityTargetActionEvent { } diff --git a/Content.Shared/Nyanotrasen/Psionics/Events.cs b/Content.Shared/Nyanotrasen/Psionics/Events.cs index cf9a50c6e18..45a00b5f048 100644 --- a/Content.Shared/Nyanotrasen/Psionics/Events.cs +++ b/Content.Shared/Nyanotrasen/Psionics/Events.cs @@ -21,6 +21,42 @@ public PsionicRegenerationDoAfterEvent(TimeSpan startedAt) public override DoAfterEvent Clone() => this; } + [Serializable, NetSerializable] + public sealed partial class PsionicInvisibilityTimerEvent : DoAfterEvent + { + [DataField("startedAt", required: true)] + public TimeSpan StartedAt; + + private PsionicInvisibilityTimerEvent() + { + } + + public PsionicInvisibilityTimerEvent(TimeSpan startedAt) + { + StartedAt = startedAt; + } + + public override DoAfterEvent Clone() => this; + } + + [Serializable, NetSerializable] + public sealed partial class FocusedMetapsionicDoAfterEvent : DoAfterEvent + { + [DataField("startedAt", required: true)] + public TimeSpan StartedAt; + + private FocusedMetapsionicDoAfterEvent() + { + } + + public FocusedMetapsionicDoAfterEvent(TimeSpan startedAt) + { + StartedAt = startedAt; + } + + public override DoAfterEvent Clone() => this; + } + [Serializable, NetSerializable] public sealed partial class GlimmerWispDrainDoAfterEvent : SimpleDoAfterEvent { From 839eac1fb6f2f6f0955e434c2b9c17ccd62d0c99 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 3 May 2024 13:59:49 -0400 Subject: [PATCH 15/79] Psionic Refactor pt 1 --- .../Psionics/Abilities/DispelPowerSystem.cs | 41 ++++---- .../Abilities/MetapsionicPowerSystem.cs | 33 +++---- .../Psionics/Abilities/MindSwapPowerSystem.cs | 93 +++++++++---------- .../Abilities/MindSwappedComponent.cs | 11 +-- .../Abilities/NoosphericZapPowerSystem.cs | 30 +++--- .../PsionicInvisibilityPowerSystem.cs | 56 ++++++----- .../PsionicRegenerationPowerSystem.cs | 37 +++----- .../Abilities/PyrokinesisPowerSystem.cs | 33 ++++--- .../Abilities/TelegnosisPowerSystem.cs | 32 +++---- .../Psionics/PsionicAbilitiesSystem.cs | 18 +--- .../Invisibility/PsionicInvisibilitySystem.cs | 20 ++-- .../Nyanotrasen/Psionics/PsionicsSystem.cs | 8 +- .../Prototypes/Nyanotrasen/Actions/types.yml | 22 ++++- 13 files changed, 195 insertions(+), 239 deletions(-) diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs index d338a5a5bcb..f7d88f4cb83 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.StatusEffect; using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; @@ -10,9 +11,6 @@ using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Timing; -using Content.Shared.Mind; -using Content.Shared.Actions.Events; -using Robust.Shared.Audio.Systems; namespace Content.Server.Abilities.Psionics { @@ -28,7 +26,6 @@ public sealed class DispelPowerSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; public override void Initialize() @@ -48,25 +45,22 @@ public override void Initialize() private void OnInit(EntityUid uid, DispelPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.DispelActionEntity, component.DispelActionId ); - _actions.TryGetActionData( component.DispelActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.DispelActionEntity); + if (!_prototypeManager.TryIndex("Dispel", out var action)) + return; + + component.DispelPowerAction = new EntityTargetAction(action); + if (action.UseDelay != null) + component.DispelPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) action.UseDelay); + _actions.AddAction(uid, component.DispelPowerAction, null); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.DispelActionEntity; - psionic.ActivePowers.Add(component); - } + psionic.PsionicAbility = component.DispelPowerAction; } private void OnShutdown(EntityUid uid, DispelPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.DispelActionEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("Dispel", out var action)) + _actions.RemoveAction(uid, new EntityTargetAction(action), null); } private void OnPowerUsed(DispelPowerActionEvent args) @@ -89,7 +83,7 @@ private void OnDispelled(EntityUid uid, DispellableComponent component, Dispelle QueueDel(uid); Spawn("Ash", Transform(uid).Coordinates); _popupSystem.PopupCoordinates(Loc.GetString("psionic-burns-up", ("item", uid)), Transform(uid).Coordinates, Filter.Pvs(uid), true, Shared.Popups.PopupType.MediumCaution); - _audioSystem.PlayEntity("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); + _audioSystem.Play("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); args.Handled = true; } @@ -106,7 +100,7 @@ private void OnDmgDispelled(EntityUid uid, DamageOnDispelComponent component, Di private void OnGuardianDispelled(EntityUid uid, GuardianComponent guardian, DispelledEvent args) { if (TryComp(guardian.Host, out var host)) - _guardianSystem.ToggleGuardian(guardian.Host.Value, host); + _guardianSystem.ToggleGuardian(guardian.Host, host); DealDispelDamage(uid); args.Handled = true; @@ -133,7 +127,7 @@ public void DealDispelDamage(EntityUid uid, DamageSpecifier? damage = null) return; _popupSystem.PopupCoordinates(Loc.GetString("psionic-burn-resist", ("item", uid)), Transform(uid).Coordinates, Filter.Pvs(uid), true, Shared.Popups.PopupType.SmallCaution); - _audioSystem.PlayEntity("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); + _audioSystem.Play("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); if (damage == null) { @@ -143,7 +137,8 @@ public void DealDispelDamage(EntityUid uid, DamageSpecifier? damage = null) _damageableSystem.TryChangeDamage(uid, damage, true, true); } } - public sealed class DispelledEvent : HandledEntityEventArgs {} -} + public sealed class DispelPowerActionEvent : EntityTargetActionEvent {} + public sealed class DispelledEvent : HandledEntityEventArgs {} +} diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs index b775117b716..ee3c9a58d9c 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -1,11 +1,11 @@ using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.Abilities.Psionics; using Content.Shared.StatusEffect; using Content.Shared.Popups; using Robust.Shared.Prototypes; +using Robust.Shared.Player; using Robust.Shared.Timing; -using Content.Shared.Mind; -using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { @@ -18,7 +18,6 @@ public sealed class MetapsionicPowerSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popups = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; public override void Initialize() @@ -31,26 +30,22 @@ public override void Initialize() private void OnInit(EntityUid uid, MetapsionicPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.MetapsionicActionEntity, component.MetapsionicActionId ); - _actions.TryGetActionData( component.MetapsionicActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.MetapsionicActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.MetapsionicActionEntity; - psionic.ActivePowers.Add(component); - } + if (!_prototypeManager.TryIndex("MetapsionicPulse", out var metapsionicPulse)) + return; + component.MetapsionicPowerAction = new InstantAction(metapsionicPulse); + if (metapsionicPulse.UseDelay != null) + component.MetapsionicPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) metapsionicPulse.UseDelay); + _actions.AddAction(uid, component.MetapsionicPowerAction, null); + + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + psionic.PsionicAbility = component.MetapsionicPowerAction; } private void OnShutdown(EntityUid uid, MetapsionicPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.MetapsionicActionEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("MetapsionicPulse", out var metapsionicPulse)) + _actions.RemoveAction(uid, new InstantAction(metapsionicPulse), null); } private void OnPowerUsed(EntityUid uid, MetapsionicPowerComponent component, MetapsionicPowerActionEvent args) @@ -71,4 +66,6 @@ private void OnPowerUsed(EntityUid uid, MetapsionicPowerComponent component, Met args.Handled = true; } } + + public sealed class MetapsionicPowerActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index b23224cab48..5c83de2b526 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.Abilities.Psionics; using Content.Shared.Speech; using Content.Shared.Stealth.Components; @@ -6,14 +7,13 @@ using Content.Shared.Mobs; using Content.Shared.Damage; using Content.Server.Mind; +using Content.Server.Mind.Components; using Content.Shared.Mobs.Systems; using Content.Server.Popups; using Content.Server.Psionics; using Content.Server.GameTicking; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using Content.Shared.Mind; -using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { @@ -26,7 +26,6 @@ public sealed class MindSwapPowerSystem : EntitySystem [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; - [Dependency] private readonly MetaDataSystem _metaDataSystem = default!; public override void Initialize() { @@ -44,24 +43,22 @@ public override void Initialize() private void OnInit(EntityUid uid, MindSwapPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.MindSwapActionEntity, component.MindSwapActionId ); - _actions.TryGetActionData( component.MindSwapActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.MindSwapActionEntity); + if (!_prototypeManager.TryIndex("MindSwap", out var mindSwap)) + return; + + component.MindSwapPowerAction = new EntityTargetAction(mindSwap); + if (mindSwap.UseDelay != null) + component.MindSwapPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) mindSwap.UseDelay); + _actions.AddAction(uid, component.MindSwapPowerAction, null); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.MindSwapActionEntity; - psionic.ActivePowers.Add(component); - } + psionic.PsionicAbility = component.MindSwapPowerAction; } private void OnShutdown(EntityUid uid, MindSwapPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.MindSwapActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("MindSwap", out var action)) + _actions.RemoveAction(uid, new EntityTargetAction(action), null); } private void OnPowerUsed(MindSwapPowerActionEvent args) @@ -137,9 +134,8 @@ private void OnGhostAttempt(GhostAttemptHandleEvent args) if (!HasComp(args.Mind.CurrentEntity)) return; - //No idea where the viaCommand went. It's on the internal OnGhostAttempt, but not this layer. Maybe unnecessary. - /*if (!args.viaCommand) - return;*/ + if (!args.ViaCommand) + return; args.Result = false; args.Handled = true; @@ -147,12 +143,12 @@ private void OnGhostAttempt(GhostAttemptHandleEvent args) private void OnSwapInit(EntityUid uid, MindSwappedComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.MindSwapReturnActionEntity, component.MindSwapReturnActionId ); - _actions.TryGetActionData( component.MindSwapReturnActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.MindSwapReturnActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.MindSwapReturnActionEntity; + if (_prototypeManager.TryIndex("MindSwapReturn", out var mindSwap)) + { + var action = new InstantAction(mindSwap); + action.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + TimeSpan.FromSeconds(15)); + _actions.AddAction(uid, action, null); + } } public void Swap(EntityUid performer, EntityUid target, bool end = false) @@ -161,35 +157,30 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) return; // Get the minds first. On transfer, they'll be gone. - MindComponent? performerMind = null; - MindComponent? targetMind = null; + Mind.Mind? performerMind = null; + Mind.Mind? targetMind = null; // This is here to prevent missing MindContainerComponent Resolve errors. - if(!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)){ - performerMind = null; - }; - - if(!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)){ - targetMind = null; - }; - //This is a terrible way to 'unattach' minds. I wanted to use UnVisit but in TransferTo's code they say - //To unnatch the minds, do it like this. - //Have to unnattach the minds before we reattach them via transfer. Still feels weird, but seems to work well. - _mindSystem.TransferTo(performerMindId, null); - _mindSystem.TransferTo(targetMindId, null); + if (TryComp(performer, out var performerMindContainer)) + performerMind = _mindSystem.GetMind(performer, performerMindContainer); + + if (TryComp(target, out var targetMindContainer)) + targetMind = _mindSystem.GetMind(target, targetMindContainer); + // Do the transfer. if (performerMind != null) - _mindSystem.TransferTo(performerMindId, target, ghostCheckOverride: true, false, performerMind); + _mindSystem.TransferTo(performerMind, target, ghostCheckOverride: true); if (targetMind != null) - _mindSystem.TransferTo(targetMindId, performer, ghostCheckOverride: true, false, targetMind); + _mindSystem.TransferTo(targetMind, performer, ghostCheckOverride: true); if (end) { - var performerMindPowerComp = EntityManager.GetComponent(performer); - var targetMindPowerComp = EntityManager.GetComponent(target); - _actions.RemoveAction(performer, performerMindPowerComp.MindSwapReturnActionEntity); - _actions.RemoveAction(target, targetMindPowerComp.MindSwapReturnActionEntity); + if (_prototypeManager.TryIndex("MindSwapReturn", out var mindSwap)) + { + _actions.RemoveAction(performer, new InstantAction(mindSwap), null); + _actions.RemoveAction(target, new InstantAction(mindSwap), null); + } RemComp(performer); RemComp(target); @@ -205,10 +196,11 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) public void GetTrapped(EntityUid uid) { + if (!_prototypeManager.TryIndex("MindSwapReturn", out var action)) + return; _popupSystem.PopupEntity(Loc.GetString("mindswap-trapped"), uid, uid, Shared.Popups.PopupType.LargeCaution); - var perfComp = EnsureComp(uid); - _actions.RemoveAction(uid, perfComp.MindSwapReturnActionEntity, null); + _actions.RemoveAction(uid, action); if (HasComp(uid)) { @@ -216,9 +208,12 @@ public void GetTrapped(EntityUid uid) RemComp(uid); EnsureComp(uid); EnsureComp(uid); - _metaDataSystem.SetEntityName(uid, Loc.GetString("telegnostic-trapped-entity-name")); - _metaDataSystem.SetEntityDescription(uid, Loc.GetString("telegnostic-trapped-entity-desc")); + MetaData(uid).EntityName = Loc.GetString("telegnostic-trapped-entity-name"); + MetaData(uid).EntityDescription = Loc.GetString("telegnostic-trapped-entity-desc"); } } } + + public sealed class MindSwapPowerActionEvent : EntityTargetActionEvent {} + public sealed class MindSwapPowerReturnActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs index 72cd6a66ef9..84d2909c1f2 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs @@ -1,18 +1,9 @@ -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - namespace Content.Server.Abilities.Psionics { [RegisterComponent] - public sealed partial class MindSwappedComponent : Component + public sealed class MindSwappedComponent : Component { [ViewVariables] public EntityUid OriginalEntity = default!; - [DataField("mindSwapReturnActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? MindSwapReturnActionId = "ActionMindSwapReturn"; - - [DataField("mindSwapReturnActionEntity")] - public EntityUid? MindSwapReturnActionEntity; } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index 0fd261ef12f..c844030f1e1 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.Abilities.Psionics; using Content.Server.Psionics; using Content.Shared.StatusEffect; @@ -6,8 +7,6 @@ using Content.Server.Beam; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using Content.Server.Mind; -using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { @@ -20,7 +19,6 @@ public sealed class NoosphericZapPowerSystem : EntitySystem [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly BeamSystem _beam = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() @@ -33,24 +31,22 @@ public override void Initialize() private void OnInit(EntityUid uid, NoosphericZapPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.NoosphericZapActionEntity, component.NoosphericZapActionId ); - _actions.TryGetActionData( component.NoosphericZapActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.NoosphericZapActionEntity); + if (!_prototypeManager.TryIndex("NoosphericZap", out var noosphericZap)) + return; + + component.NoosphericZapPowerAction = new EntityTargetAction(noosphericZap); + if (noosphericZap.UseDelay != null) + component.NoosphericZapPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) noosphericZap.UseDelay); + _actions.AddAction(uid, component.NoosphericZapPowerAction, null); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.NoosphericZapActionEntity; - psionic.ActivePowers.Add(component); - } + psionic.PsionicAbility = component.NoosphericZapPowerAction; } private void OnShutdown(EntityUid uid, NoosphericZapPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.NoosphericZapActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("NoosphericZap", out var noosphericZap)) + _actions.RemoveAction(uid, new EntityTargetAction(noosphericZap), null); } private void OnPowerUsed(NoosphericZapPowerActionEvent args) @@ -70,4 +66,6 @@ private void OnPowerUsed(NoosphericZapPowerActionEvent args) args.Handled = true; } } + + public sealed class NoosphericZapPowerActionEvent : EntityTargetActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index 5ca1dc7a6dc..3bbaf9d8136 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.CombatMode.Pacification; using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; @@ -10,9 +11,6 @@ using Robust.Shared.Player; using Robust.Shared.Audio; using Robust.Shared.Timing; -using Content.Server.Mind; -using Content.Shared.Actions.Events; -using Robust.Shared.Audio.Systems; namespace Content.Server.Abilities.Psionics { @@ -24,8 +22,6 @@ public sealed class PsionicInvisibilityPowerSystem : EntitySystem [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly SharedStealthSystem _stealth = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; public override void Initialize() { @@ -33,7 +29,7 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); - SubscribeLocalEvent(OnPowerOff); + SubscribeLocalEvent(OnPowerOff); SubscribeLocalEvent(OnStart); SubscribeLocalEvent(OnEnd); SubscribeLocalEvent(OnDamageChanged); @@ -41,24 +37,22 @@ public override void Initialize() private void OnInit(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.PsionicInvisibilityActionEntity, component.PsionicInvisibilityActionId ); - _actions.TryGetActionData( component.PsionicInvisibilityActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PsionicInvisibilityActionEntity); + if (!_prototypeManager.TryIndex("PsionicInvisibility", out var invis)) + return; + + component.PsionicInvisibilityPowerAction = new InstantAction(invis); + if (invis.UseDelay != null) + component.PsionicInvisibilityPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) invis.UseDelay); + _actions.AddAction(uid, component.PsionicInvisibilityPowerAction, null); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.PsionicInvisibilityActionEntity; - psionic.ActivePowers.Add(component); - } + psionic.PsionicAbility = component.PsionicInvisibilityPowerAction; } private void OnShutdown(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.PsionicInvisibilityActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("PsionicInvisibility", out var invis)) + _actions.RemoveAction(uid, new InstantAction(invis), null); } private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityPowerActionEvent args) @@ -67,17 +61,15 @@ private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent compon return; ToggleInvisibility(args.Performer); - var action = Spawn(PsionicInvisibilityUsedComponent.PsionicInvisibilityUsedActionPrototype); - _actions.AddAction(uid, action, action); - _actions.TryGetActionData( action, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(action); + + if (_prototypeManager.TryIndex("PsionicInvisibilityOff", out var invis)) + _actions.AddAction(args.Performer, new InstantAction(invis), null); _psionics.LogPowerUsed(uid, "psionic invisibility"); args.Handled = true; } - private void OnPowerOff(RemovePsionicInvisibilityOffPowerActionEvent args) + private void OnPowerOff(PsionicInvisibilityPowerOffActionEvent args) { if (!HasComp(args.Performer)) return; @@ -92,7 +84,7 @@ private void OnStart(EntityUid uid, PsionicInvisibilityUsedComponent component, EnsureComp(uid); var stealth = EnsureComp(uid); _stealth.SetVisibility(uid, 0.66f, stealth); - _audio.PlayPvs("/Audio/Effects/toss.ogg", uid); + SoundSystem.Play("/Audio/Effects/toss.ogg", Filter.Pvs(uid), uid); } @@ -104,12 +96,13 @@ private void OnEnd(EntityUid uid, PsionicInvisibilityUsedComponent component, Co RemComp(uid); RemComp(uid); RemComp(uid); - _audio.PlayPvs("/Audio/Effects/toss.ogg", uid); - //Pretty sure this DOESN'T work as intended. - _actions.RemoveAction(uid, component.PsionicInvisibilityUsedActionEntity); + SoundSystem.Play("/Audio/Effects/toss.ogg", Filter.Pvs(uid), uid); + + if (_prototypeManager.TryIndex("PsionicInvisibilityOff", out var invis)) + _actions.RemoveAction(uid, new InstantAction(invis), null); _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(8), false); - DirtyEntity(uid); + Dirty(uid); } private void OnDamageChanged(EntityUid uid, PsionicInvisibilityUsedComponent component, DamageChangedEvent args) @@ -131,4 +124,7 @@ public void ToggleInvisibility(EntityUid uid) } } } + + public sealed class PsionicInvisibilityPowerActionEvent : InstantActionEvent {} + public sealed class PsionicInvisibilityPowerOffActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index 097a0cb750b..f40465643da 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -4,10 +4,10 @@ using Robust.Shared.Prototypes; using Content.Server.Body.Components; using Content.Server.Body.Systems; -using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Chemistry.EntitySystems; using Content.Server.DoAfter; using Content.Shared.Abilities.Psionics; +using Content.Shared.Actions.ActionTypes; using Content.Shared.Actions; using Content.Shared.Chemistry.Components; using Content.Shared.DoAfter; @@ -18,10 +18,6 @@ using Content.Shared.Examine; using static Content.Shared.Examine.ExamineSystemShared; using Robust.Shared.Timing; -using Content.Server.Mind; -using Content.Shared.Actions.Events; -using Content.Shared.Chemistry.EntitySystems; -using Robust.Server.Audio; namespace Content.Server.Abilities.Psionics { @@ -37,8 +33,6 @@ public sealed class PsionicRegenerationPowerSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() @@ -54,21 +48,22 @@ public override void Initialize() private void OnInit(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.PsionicRegenerationActionEntity, component.PsionicRegenerationActionId ); - _actions.TryGetActionData( component.PsionicRegenerationActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PsionicRegenerationActionEntity); + if (!_prototypeManager.TryIndex("PsionicRegeneration", out var metapsionic)) + return; + + component.PsionicRegenerationPowerAction = new InstantAction(metapsionic); + if (metapsionic.UseDelay != null) + component.PsionicRegenerationPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) metapsionic.UseDelay); + _actions.AddAction(uid, component.PsionicRegenerationPowerAction, null); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.PsionicRegenerationActionEntity; - psionic.ActivePowers.Add(component); - } + psionic.PsionicAbility = component.PsionicRegenerationPowerAction; } private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationPowerActionEvent args) { var ev = new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime); - var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseDelay, ev, uid); + var doAfterArgs = new DoAfterArgs(uid, component.UseDelay, ev, uid); _doAfterSystem.TryStartDoAfter(doAfterArgs, out var doAfterId); @@ -88,12 +83,8 @@ private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent compon private void OnShutdown(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.PsionicRegenerationActionEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("PsionicRegeneration", out var metapsionic)) + _actions.RemoveAction(uid, new InstantAction(metapsionic), null); } private void OnDispelled(EntityUid uid, PsionicRegenerationPowerComponent component, DispelledEvent args) @@ -125,5 +116,7 @@ private void OnDoAfter(EntityUid uid, PsionicRegenerationPowerComponent componen _bloodstreamSystem.TryAddToChemicals(uid, solution, stream); } } + + public sealed class PsionicRegenerationPowerActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs index 407b72c6b58..d86c3a346f0 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -1,12 +1,12 @@ using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.Abilities.Psionics; using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Popups; using Robust.Shared.Prototypes; +using Robust.Shared.Player; using Robust.Shared.Timing; -using Content.Server.Mind; -using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { @@ -18,7 +18,6 @@ public sealed class PyrokinesisPowerSystem : EntitySystem [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { @@ -30,24 +29,22 @@ public override void Initialize() private void OnInit(EntityUid uid, PyrokinesisPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.PyrokinesisActionEntity, component.PyrokinesisActionId ); - _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PyrokinesisActionEntity); + if (!_prototypeManager.TryIndex("Pyrokinesis", out var pyrokinesis)) + return; + + component.PyrokinesisPowerAction = new EntityTargetAction(pyrokinesis); + if (pyrokinesis.UseDelay != null) + component.PyrokinesisPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) pyrokinesis.UseDelay); + _actions.AddAction(uid, component.PyrokinesisPowerAction, null); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.PyrokinesisActionEntity; - psionic.ActivePowers.Add(component); - } + psionic.PsionicAbility = component.PyrokinesisPowerAction; } private void OnShutdown(EntityUid uid, PyrokinesisPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.PyrokinesisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("Pyrokinesis", out var pyrokinesis)) + _actions.RemoveAction(uid, new EntityTargetAction(pyrokinesis), null); } private void OnPowerUsed(PyrokinesisPowerActionEvent args) @@ -56,11 +53,13 @@ private void OnPowerUsed(PyrokinesisPowerActionEvent args) return; flammableComponent.FireStacks += 5; - _flammableSystem.Ignite(args.Target, args.Target); + _flammableSystem.Ignite(args.Target, flammableComponent); _popupSystem.PopupEntity(Loc.GetString("pyrokinesis-power-used", ("target", args.Target)), args.Target, Shared.Popups.PopupType.LargeCaution); _psionics.LogPowerUsed(args.Performer, "pyrokinesis"); args.Handled = true; } } + + public sealed class PyrokinesisPowerActionEvent : EntityTargetActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs index f7ae04b61ea..0d6adb7f9a9 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -1,11 +1,10 @@ using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.StatusEffect; using Content.Shared.Abilities.Psionics; -using Content.Shared.Mind.Components; +using Content.Server.Mind.Components; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using Content.Server.Mind; -using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { @@ -17,7 +16,6 @@ public sealed class TelegnosisPowerSystem : EntitySystem [Dependency] private readonly MindSwapPowerSystem _mindSwap = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { @@ -30,24 +28,22 @@ public override void Initialize() private void OnInit(EntityUid uid, TelegnosisPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.TelegnosisActionEntity, component.TelegnosisActionId ); - _actions.TryGetActionData( component.TelegnosisActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.TelegnosisActionEntity); + if (!_prototypeManager.TryIndex("Telegnosis", out var telegnosis)) + return; + + component.TelegnosisPowerAction = new InstantAction(telegnosis); + if (telegnosis.UseDelay != null) + component.TelegnosisPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) telegnosis.UseDelay); + _actions.AddAction(uid, component.TelegnosisPowerAction, null); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - { - psionic.PsionicAbility = component.TelegnosisActionEntity; - psionic.ActivePowers.Add(component); - } + psionic.PsionicAbility = component.TelegnosisPowerAction; } private void OnShutdown(EntityUid uid, TelegnosisPowerComponent component, ComponentShutdown args) { - _actions.RemoveAction(uid, component.TelegnosisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - } + if (_prototypeManager.TryIndex("Telegnosis", out var metapsionic)) + _actions.RemoveAction(uid, new InstantAction(metapsionic), null); } private void OnPowerUsed(EntityUid uid, TelegnosisPowerComponent component, TelegnosisPowerActionEvent args) @@ -64,4 +60,6 @@ private void OnMindRemoved(EntityUid uid, TelegnosticProjectionComponent compone QueueDel(uid); } } + + public sealed class TelegnosisPowerActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs index ee16aaccfb6..326be3e0583 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -6,14 +6,12 @@ using Content.Server.EUI; using Content.Server.Psionics; using Content.Server.Mind; -using Content.Shared.Mind; -using Content.Shared.Mind.Components; +using Content.Server.Mind.Components; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; using Robust.Server.GameObjects; using Robust.Server.Player; -using Robust.Shared.Player; namespace Content.Server.Abilities.Psionics { @@ -52,11 +50,8 @@ public void AddPsionics(EntityUid uid, bool warn = true) if (HasComp(uid)) return; - //Don't know if this will work. New mind state vs old. if (!TryComp(uid, out var mindContainer) || - !_mindSystem.TryGetMind(uid, out _, out var mind )) - //|| - //!_mindSystem.TryGetMind(uid, out var mind, mindContainer)) + !_mindSystem.TryGetMind(uid, out var mind, mindContainer)) { EnsureComp(uid); return; @@ -127,13 +122,8 @@ public void RemovePsionics(EntityUid uid) if (EntityManager.TryGetComponent(uid, comp.GetType(), out var psionicPower)) RemComp(uid, psionicPower); } - if (psionic.PsionicAbility != null){ - _actionsSystem.TryGetActionData( psionic.PsionicAbility, out var psiAbility ); - if (psiAbility != null){ - var owner = psiAbility.Owner; - _actionsSystem.RemoveAction(uid, psiAbility.Owner); - } - } + if (psionic.PsionicAbility != null) + _actionsSystem.RemoveAction(uid, psionic.PsionicAbility); _statusEffectsSystem.TryAddStatusEffect(uid, "Stutter", TimeSpan.FromMinutes(5), false, "StutteringAccent"); diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs index 31e6b89f13d..1c9cb55f2dd 100644 --- a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs @@ -20,7 +20,6 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnInsulInit); SubscribeLocalEvent(OnInsulShutdown); - SubscribeLocalEvent(OnEyeInit); /// Layer SubscribeLocalEvent(OnInvisInit); @@ -36,11 +35,15 @@ private void OnInit(EntityUid uid, PotentialPsionicComponent component, Componen SetCanSeePsionicInvisiblity(uid, false); } + /// + /// Being able to see invisible by default is no longer tracked by "Not having Potential Psionic". + /// Anything intended to be immune to invisibility(and mind magic in general) should instead have PsionicInsulation as a built-in component + /// + /// + /// + /// private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, ComponentInit args) { - if (!HasComp(uid)) - return; - if (HasComp(uid)) _invisSystem.ToggleInvisibility(uid); @@ -61,9 +64,6 @@ private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, Co private void OnInsulShutdown(EntityUid uid, PsionicInsulationComponent component, ComponentShutdown args) { - if (!HasComp(uid)) - return; - SetCanSeePsionicInvisiblity(uid, false); if (!HasComp(uid)) @@ -99,10 +99,6 @@ private void OnInvisShutdown(EntityUid uid, PsionicallyInvisibleComponent compon } } - private void OnEyeInit(EntityUid uid, EyeComponent component, ComponentInit args) - { - //SetCanSeePsionicInvisiblity(uid, true); //JJ Comment - Not allowed to modifies .yml on spawn any longer. See UninitializedSaveTest. - } private void OnEntInserted(EntityUid uid, PsionicallyInvisibleComponent component, EntInsertedIntoContainerMessage args) { DirtyEntity(args.Entity); @@ -125,7 +121,7 @@ public void SetCanSeePsionicInvisiblity(EntityUid uid, bool set) { if (EntityManager.TryGetComponent(uid, out EyeComponent? eye)) { - _eye.SetVisibilityMask(uid, eye.VisibilityMask & ~ (int) VisibilityFlags.PsionicInvisibility, eye); + _eye.SetVisibilityMask(uid, eye.VisibilityMask & ~(int) VisibilityFlags.PsionicInvisibility, eye); } } } diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs index 5a96af2e96b..9da293df0b5 100644 --- a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs @@ -1,19 +1,14 @@ using Content.Shared.Abilities.Psionics; using Content.Shared.StatusEffect; -using Content.Shared.Mobs; using Content.Shared.Psionics.Glimmer; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Damage.Events; -using Content.Shared.IdentityManagement; using Content.Shared.CCVar; using Content.Server.Abilities.Psionics; -using Content.Server.Chat.Systems; using Content.Server.Electrocution; using Content.Server.NPC.Components; using Content.Server.NPC.Systems; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; using Robust.Shared.Configuration; using Robust.Shared.Random; @@ -27,7 +22,6 @@ public sealed class PsionicsSystem : EntitySystem [Dependency] private readonly ElectrocutionSystem _electrocutionSystem = default!; [Dependency] private readonly MindSwapPowerSystem _mindSwapPowerSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly NpcFactionSystem _npcFactonSystem = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; @@ -151,7 +145,7 @@ public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, boo chance = Math.Clamp(chance, 0, 1); if (_random.Prob(chance)) - _psionicAbilitiesSystem.AddPsionics(uid, warn); + _psionicAbilitiesSystem.AddPsionics(uid); } public void RerollPsionics(EntityUid uid, PotentialPsionicComponent? psionic = null, float bonusMuliplier = 1f) diff --git a/Resources/Prototypes/Nyanotrasen/Actions/types.yml b/Resources/Prototypes/Nyanotrasen/Actions/types.yml index e6e4bdc5a75..376d92e3efb 100644 --- a/Resources/Prototypes/Nyanotrasen/Actions/types.yml +++ b/Resources/Prototypes/Nyanotrasen/Actions/types.yml @@ -103,15 +103,29 @@ event: !type:PyrokinesisPowerActionEvent - type: entity - id: ActionMetapsionic - name: action-name-metapsionic - description: action-description-metapsionic + id: ActionWideMetapsionic + name: action-name-widemetapsionic + description: action-description-widemetapsionic noSpawn: true components: - type: InstantAction icon: Nyanotrasen/Interface/VerbIcons/metapsionic.png useDelay: 45 - event: !type:MetapsionicPowerActionEvent + event: !type:WideMetapsionicPowerActionEvent + +- type: entity + id: ActionFocusedMetapsionic + name: action-name-focusedmetapsionic + description: action-description-focusedmetapsionic + noSpawn: true + components: + - type: EntityTargetAction + icon: Nyanotrasen/Interface/VerbIcons/metapsionic.png + useDelay: 45 + range: 3 + checkCanAccess: false + itemIconStyle: BigAction + event: !type:FocusedMetapsionicPowerActionEvent - type: entity id: ActionPsionicRegeneration From ac830043bf6a53eaefd2079bcf048d3f5cff6704 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 3 May 2024 14:08:58 -0400 Subject: [PATCH 16/79] Last bit --- .../Nyanotrasen/Chat/NyanoChatSystem.cs | 5 ++- .../BecomePsionicConditionComponent.cs | 11 ------ .../Systems/BecomePsionicConditionSystem.cs | 32 ------------------ .../Audio/Nyanotrasen/heartbeat_fast.ogg | Bin 0 -> 39983 bytes .../nyanotrasen/psionics/psychic-feedback.ftl | 6 ++++ .../DeltaV/Entities/Mobs/Player/harpy.yml | 1 - .../DeltaV/Entities/Mobs/Player/vulpkanin.yml | 1 - .../Entities/Mobs/Player/arachnid.yml | 1 - .../Prototypes/Entities/Mobs/Player/diona.yml | 1 - .../Prototypes/Entities/Mobs/Player/dwarf.yml | 2 -- .../Prototypes/Entities/Mobs/Player/human.yml | 2 -- .../Prototypes/Entities/Mobs/Player/moth.yml | 2 -- .../Entities/Mobs/Player/reptilian.yml | 2 -- .../Prototypes/Entities/Mobs/Player/slime.yml | 2 -- .../Nyanotrasen/Entities/Mobs/Player/Oni.yml | 1 - .../Entities/Mobs/Player/felinid.yml | 2 -- .../Nyanotrasen/Objectives/traitor.yml | 23 ------------- .../Nyanotrasen/Traits/psionics.yml | 6 ++++ .../Prototypes/Objectives/objectiveGroups.yml | 1 - 19 files changed, 16 insertions(+), 85 deletions(-) delete mode 100644 Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs delete mode 100644 Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs create mode 100644 Resources/Audio/Nyanotrasen/heartbeat_fast.ogg create mode 100644 Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl create mode 100644 Resources/Prototypes/Nyanotrasen/Traits/psionics.yml diff --git a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs b/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs index 58ed1782741..e0fb18fcae4 100644 --- a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs +++ b/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs @@ -2,6 +2,7 @@ using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; +using Content.Server.Psionics; using Content.Shared.Abilities.Psionics; using Content.Shared.Bed.Sleep; using Content.Shared.Chat; @@ -47,7 +48,9 @@ private IEnumerable GetAdminClients() private List GetDreamers(IEnumerable removeList) { var filtered = Filter.Empty() - .AddWhereAttachedEntity(entity => HasComp(entity) || HasComp(entity) && !HasComp(entity) && !HasComp(entity)) + .AddWhereAttachedEntity(entity => HasComp(entity) + || HasComp(entity) && !HasComp(entity) && !HasComp(entity) + || HasComp(entity) && !HasComp(entity) && !HasComp(entity)) .Recipients .Select(p => p.ConnectedClient); diff --git a/Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs b/Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs deleted file mode 100644 index 3b677bab2d4..00000000000 --- a/Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Content.Server.Objectives.Systems; - -namespace Content.Server.Objectives.Components; - -/// -/// Requires that the player dies to be complete. -/// -[RegisterComponent, Access(typeof(BecomePsionicConditionSystem))] -public sealed partial class BecomePsionicConditionComponent : Component -{ -} \ No newline at end of file diff --git a/Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs b/Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs deleted file mode 100644 index d090c320a41..00000000000 --- a/Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Content.Shared.Abilities.Psionics; -using Content.Server.Objectives.Components; -using Content.Shared.Mind; -using Content.Shared.Objectives.Components; - -namespace Content.Server.Objectives.Systems -{ - public sealed class BecomePsionicConditionSystem : EntitySystem - { - private EntityQuery _metaQuery; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnGetProgress); - } - - private void OnGetProgress(EntityUid uid, BecomePsionicConditionComponent comp, ref ObjectiveGetProgressEvent args) - { - args.Progress = GetProgress(args.Mind); - } - - private float GetProgress(MindComponent mind) - { - var entMan = IoCManager.Resolve(); - if (HasComp(mind.CurrentEntity)) - return 1; - return 0; - } - } -} diff --git a/Resources/Audio/Nyanotrasen/heartbeat_fast.ogg b/Resources/Audio/Nyanotrasen/heartbeat_fast.ogg new file mode 100644 index 0000000000000000000000000000000000000000..85a034d9bd0017dafea7df4128235c815babac0c GIT binary patch literal 39983 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 literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl new file mode 100644 index 00000000000..5e6626eb9ca --- /dev/null +++ b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl @@ -0,0 +1,6 @@ +dispel-feedback = {CAPITALIZE($entity)} projects an aura of normality +no-powers = {CAPITALIZE($entity)} will never awaken from the dream in this life +psychic-potential = {CAPITALIZE($entity)} has a slim chance of awakening from the dream +focused-metapsionic-pulse-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly, like a heat haze crawling across the endless desert +psionic-regeneration-self-revive = As {CAPITALIZE($entity)} falls to the floor greviously wounded, + they begin visibly regenerating! diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml index 1f4eb696c65..e2541def035 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml @@ -26,4 +26,3 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml index 06abe8c45fa..ea2357a5c06 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml @@ -24,7 +24,6 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic - type: Respirator damage: types: diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml index 5ebd43ddf48..d9dea3c18d9 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml @@ -11,4 +11,3 @@ damageRecovery: types: Asphyxiation: -0.5 - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. diff --git a/Resources/Prototypes/Entities/Mobs/Player/diona.yml b/Resources/Prototypes/Entities/Mobs/Player/diona.yml index 28687c68bfc..dfd5e9a1be7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/diona.yml @@ -11,7 +11,6 @@ damageRecovery: types: Asphyxiation: -1.0 - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. # Reformed Diona - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml index fb84ad3650f..d1de65df012 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml @@ -3,5 +3,3 @@ name: Urist McHands The Dwarf parent: BaseMobDwarf id: MobDwarf - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/human.yml b/Resources/Prototypes/Entities/Mobs/Player/human.yml index 6197c82c021..9a7c2ee65ec 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/human.yml @@ -3,8 +3,6 @@ name: Urist McHands parent: BaseMobHuman id: MobHuman - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. #Syndie - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Player/moth.yml b/Resources/Prototypes/Entities/Mobs/Player/moth.yml index ffdb36d86bd..72feba958ab 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/moth.yml @@ -3,5 +3,3 @@ name: Urist McFluff parent: BaseMobMoth id: MobMoth - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml index 71d74222979..b9f265e0bcf 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml @@ -3,7 +3,5 @@ name: Urisst' Mzhand parent: BaseMobReptilian id: MobReptilian - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. #Weh diff --git a/Resources/Prototypes/Entities/Mobs/Player/slime.yml b/Resources/Prototypes/Entities/Mobs/Player/slime.yml index 79669a8fe2a..4e5974b3084 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/slime.yml @@ -2,5 +2,3 @@ save: false parent: BaseMobSlimePerson id: MobSlimePerson - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml index 562b9c564ec..1166d8a29f5 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml @@ -32,4 +32,3 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml index db7936cc5b4..94ac8403adc 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml @@ -49,5 +49,3 @@ - type: NpcFactionMember factions: - NanoTrasen - - type: PotentialPsionic - diff --git a/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml b/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml index 53910a54a92..e6e497003d5 100644 --- a/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml +++ b/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml @@ -9,29 +9,6 @@ stealGroup: AntiPsychicKnife owner: job-name-mantis -- type: entity - id: BecomePsionicObjective - parent: BaseTraitorObjective - name: Become psionic - description: We need you to acquire psionics and keep them until your mission is complete. - noSpawn: true - components: - - type: NotJobsRequirement - jobs: - - Mime - - ForensicMantis - - type: Objective - difficulty: 2.5 - #unique: false - icon: - sprite: Nyanotrasen/Icons/psi.rsi - state: psi - - type: ObjectiveBlacklistRequirement - blacklist: - components: - - BecomeGolemCondition - - type: BecomePsionicCondition - #- type: entity # id: BecomeGolemObjective # parent: BaseTraitorObjective diff --git a/Resources/Prototypes/Nyanotrasen/Traits/psionics.yml b/Resources/Prototypes/Nyanotrasen/Traits/psionics.yml new file mode 100644 index 00000000000..5fef3427703 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Traits/psionics.yml @@ -0,0 +1,6 @@ +- type: trait + id: LatentPsychic + name: Latent Psychic + description: trait-latent-psychic-desc + components: + - type: PotentialPsionic diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index fba2c4cc172..d711e9a1b13 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -39,7 +39,6 @@ EscapeShuttleObjective: 1 # DieObjective: 0.05 # DeltaV - Disable the lrp objective aka murderbone justification #HijackShuttleObjective: 0.02 - BecomePsionicObjective: 1 # Nyanotrasen - Become Psionic objective, see Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml #BecomeGolemObjective: 0.5 # Nyanotrasen - Become a golem objective, see Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml - type: weightedRandom From 4ad73d4c690ca18178e2a54ca099395be9854c58 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 3 May 2024 17:57:09 -0400 Subject: [PATCH 17/79] I accidentally sent the DeltaV legacy version of these --- .../Psionics/Abilities/DispelPowerSystem.cs | 54 ++++--- .../Abilities/MetapsionicPowerSystem.cs | 144 +++++++++++++++--- .../Psionics/Abilities/MindSwapPowerSystem.cs | 117 ++++++++------ .../Abilities/MindSwappedComponent.cs | 14 +- .../Abilities/NoosphericZapPowerSystem.cs | 34 ++--- .../PsionicInvisibilityPowerSystem.cs | 102 ++++++++----- .../PsionicRegenerationPowerSystem.cs | 106 +++++++++---- .../Abilities/PyrokinesisPowerSystem.cs | 35 +++-- .../Abilities/TelegnosisPowerSystem.cs | 34 +++-- .../Psionics/PsionicAbilitiesSystem.cs | 83 ++++------ 10 files changed, 468 insertions(+), 255 deletions(-) diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs index f7d88f4cb83..8cde75f461d 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs @@ -1,5 +1,4 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.StatusEffect; using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; @@ -7,16 +6,15 @@ using Content.Server.Guardian; using Content.Server.Bible.Components; using Content.Server.Popups; -using Robust.Shared.Prototypes; using Robust.Shared.Player; using Robust.Shared.Random; -using Robust.Shared.Timing; +using Content.Shared.Actions.Events; +using Robust.Shared.Audio.Systems; namespace Content.Server.Abilities.Psionics { public sealed class DispelPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; @@ -25,7 +23,6 @@ public sealed class DispelPowerSystem : EntitySystem [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; public override void Initialize() @@ -45,28 +42,38 @@ public override void Initialize() private void OnInit(EntityUid uid, DispelPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("Dispel", out var action)) - return; - - component.DispelPowerAction = new EntityTargetAction(action); - if (action.UseDelay != null) - component.DispelPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) action.UseDelay); - _actions.AddAction(uid, component.DispelPowerAction, null); - - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.DispelPowerAction; + _actions.AddAction(uid, ref component.DispelActionEntity, component.DispelActionId ); + _actions.TryGetActionData( component.DispelActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.DispelActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.DispelFeedback); + //It's fully intended that Dispel doesn't increase Amplification, and instead heavily spikes Dampening + //Antimage archetype. + psionic.Dampening += 1f; + } } private void OnShutdown(EntityUid uid, DispelPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("Dispel", out var action)) - _actions.RemoveAction(uid, new EntityTargetAction(action), null); + _actions.RemoveAction(uid, component.DispelActionEntity); + + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.DispelFeedback); + psionic.Dampening -= 1f; + } } private void OnPowerUsed(DispelPowerActionEvent args) { if (HasComp(args.Target)) return; + if (!TryComp(args.Performer, out var psionic) || !HasComp(args.Target)) + return; var ev = new DispelledEvent(); RaiseLocalEvent(args.Target, ev, false); @@ -74,7 +81,7 @@ private void OnPowerUsed(DispelPowerActionEvent args) if (ev.Handled) { args.Handled = true; - _psionics.LogPowerUsed(args.Performer, "dispel"); + _psionics.LogPowerUsed(args.Performer, "dispel", (int) MathF.Round(psionic.Dampening * -2), (int) MathF.Round(psionic.Dampening * -4)); } } @@ -83,14 +90,14 @@ private void OnDispelled(EntityUid uid, DispellableComponent component, Dispelle QueueDel(uid); Spawn("Ash", Transform(uid).Coordinates); _popupSystem.PopupCoordinates(Loc.GetString("psionic-burns-up", ("item", uid)), Transform(uid).Coordinates, Filter.Pvs(uid), true, Shared.Popups.PopupType.MediumCaution); - _audioSystem.Play("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); + _audioSystem.PlayEntity("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); args.Handled = true; } private void OnDmgDispelled(EntityUid uid, DamageOnDispelComponent component, DispelledEvent args) { var damage = component.Damage; - var modifier = (1 + component.Variance) - (_random.NextFloat(0, component.Variance * 2)); + var modifier = 1 + component.Variance - _random.NextFloat(0, component.Variance * 2); damage *= modifier; DealDispelDamage(uid, damage); @@ -100,7 +107,7 @@ private void OnDmgDispelled(EntityUid uid, DamageOnDispelComponent component, Di private void OnGuardianDispelled(EntityUid uid, GuardianComponent guardian, DispelledEvent args) { if (TryComp(guardian.Host, out var host)) - _guardianSystem.ToggleGuardian(guardian.Host, host); + _guardianSystem.ToggleGuardian(guardian.Host.Value, host); DealDispelDamage(uid); args.Handled = true; @@ -127,7 +134,7 @@ public void DealDispelDamage(EntityUid uid, DamageSpecifier? damage = null) return; _popupSystem.PopupCoordinates(Loc.GetString("psionic-burn-resist", ("item", uid)), Transform(uid).Coordinates, Filter.Pvs(uid), true, Shared.Popups.PopupType.SmallCaution); - _audioSystem.Play("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); + _audioSystem.PlayEntity("/Audio/Effects/lightburn.ogg", Filter.Pvs(uid), uid, true); if (damage == null) { @@ -137,8 +144,5 @@ public void DealDispelDamage(EntityUid uid, DamageSpecifier? damage = null) _damageableSystem.TryChangeDamage(uid, damage, true, true); } } - - public sealed class DispelPowerActionEvent : EntityTargetActionEvent {} - public sealed class DispelledEvent : HandledEntityEventArgs {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs index ee3c9a58d9c..44953767f19 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -1,23 +1,29 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; +using Content.Shared.Actions.Events; using Content.Shared.Abilities.Psionics; -using Content.Shared.StatusEffect; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using static Content.Shared.Examine.ExamineSystemShared; using Content.Shared.Popups; -using Robust.Shared.Prototypes; -using Robust.Shared.Player; +using Robust.Server.Audio; +using Robust.Shared.Audio; using Robust.Shared.Timing; +using Robust.Shared.Player; +using Content.Server.DoAfter; +using Content.Shared.Psionics.Events; +using Content.Server.Psionics; namespace Content.Server.Abilities.Psionics { public sealed class MetapsionicPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPopupSystem _popups = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly AudioSystem _audioSystem = default!; public override void Initialize() @@ -25,31 +31,60 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnPowerUsed); + SubscribeLocalEvent(OnWidePowerUsed); + SubscribeLocalEvent(OnFocusedPowerUsed); + SubscribeLocalEvent(OnDoAfter); } private void OnInit(EntityUid uid, MetapsionicPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("MetapsionicPulse", out var metapsionicPulse)) + if (!TryComp(uid, out ActionsComponent? comp)) return; + _actions.AddAction(uid, ref component.ActionWideMetapsionicEntity, component.ActionWideMetapsionic, component: comp); + _actions.AddAction(uid, ref component.ActionFocusedMetapsionicEntity, component.ActionFocusedMetapsionic, component: comp); + _actions.TryGetActionData(component.ActionWideMetapsionicEntity, out var actionData); + if (actionData is { UseDelay: not null }) + { + _actions.StartUseDelay(component.ActionWideMetapsionicEntity); + _actions.StartUseDelay(component.ActionFocusedMetapsionicEntity); + } + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.MetapsionicFeedback); + psionic.Amplification += 0.1f; + psionic.Dampening += 0.5f; + } - component.MetapsionicPowerAction = new InstantAction(metapsionicPulse); - if (metapsionicPulse.UseDelay != null) - component.MetapsionicPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) metapsionicPulse.UseDelay); - _actions.AddAction(uid, component.MetapsionicPowerAction, null); + } - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.MetapsionicPowerAction; + private void UpdateActions(EntityUid uid, MetapsionicPowerComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + _actions.StartUseDelay(component.ActionWideMetapsionicEntity); + _actions.StartUseDelay(component.ActionFocusedMetapsionicEntity); } private void OnShutdown(EntityUid uid, MetapsionicPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("MetapsionicPulse", out var metapsionicPulse)) - _actions.RemoveAction(uid, new InstantAction(metapsionicPulse), null); + _actions.RemoveAction(uid, component.ActionWideMetapsionicEntity); + _actions.RemoveAction(uid, component.ActionFocusedMetapsionicEntity); + + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.MetapsionicFeedback); + psionic.Amplification -= 0.1f; + psionic.Dampening -= 0.5f; + } } - private void OnPowerUsed(EntityUid uid, MetapsionicPowerComponent component, MetapsionicPowerActionEvent args) + private void OnWidePowerUsed(EntityUid uid, MetapsionicPowerComponent component, WideMetapsionicPowerActionEvent args) { + if (!TryComp(uid, out var psionic)) + return; + foreach (var entity in _lookup.GetEntitiesInRange(uid, component.Range)) { if (HasComp(entity) && entity != uid && !HasComp(entity) && @@ -61,11 +96,80 @@ private void OnPowerUsed(EntityUid uid, MetapsionicPowerComponent component, Met } } _popups.PopupEntity(Loc.GetString("metapsionic-pulse-failure"), uid, uid, PopupType.Large); - _psionics.LogPowerUsed(uid, "metapsionic pulse", 2, 4); + _psionics.LogPowerUsed(uid, "metapsionic pulse", (int) MathF.Round(psionic.Amplification / psionic.Dampening * 2), (int) MathF.Round(psionic.Amplification / psionic.Dampening * 4)); + UpdateActions(uid, component); + args.Handled = true; + } + + private void OnFocusedPowerUsed(FocusedMetapsionicPowerActionEvent args) + { + if (!TryComp(args.Performer, out var psionic)) + return; + + if (HasComp(args.Target)) + return; + + if (!TryComp(args.Performer, out var component)) + return; + + var ev = new FocusedMetapsionicDoAfterEvent(_gameTiming.CurTime); + + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, component.UseDelay, ev, args.Performer, args.Target, args.Performer) + { + BlockDuplicate = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + BreakOnDamage = true, + }, out var doAfterId); + component.DoAfter = doAfterId; + + _popups.PopupEntity(Loc.GetString("focused-metapsionic-pulse-begin", ("entity", args.Performer)), + args.Performer, + // TODO: Use LoS-based Filter when one is available. + Filter.Pvs(args.Performer).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(args.Performer, entity, ExamineRange, null)), + true, + PopupType.Medium); + + _audioSystem.PlayPvs(component.SoundUse, component.Owner, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); + _psionics.LogPowerUsed(args.Performer, "focused metapsionic pulse", (int) MathF.Round(psionic.Amplification / psionic.Dampening * 3), (int) MathF.Round(psionic.Amplification / psionic.Dampening * 6)); args.Handled = true; + + UpdateActions(args.Performer, component); } - } - public sealed class MetapsionicPowerActionEvent : InstantActionEvent {} + private void OnDoAfter(EntityUid uid, MetapsionicPowerComponent component, FocusedMetapsionicDoAfterEvent args) + { + if (!TryComp(args.Target, out var psychic)) + return; + + component.DoAfter = null; + + if (args.Target == null) return; + + if (args.Target == uid) + { + _popups.PopupEntity(Loc.GetString("metapulse-self", ("entity", args.Target)), uid, uid, PopupType.LargeCaution); + return; + } + + if (!HasComp(args.Target)) + { + _popups.PopupEntity(Loc.GetString("no-powers", ("entity", args.Target)), uid, uid, PopupType.LargeCaution); + return; + } + + if (HasComp(args.Target) & !HasComp(args.Target)) + { + _popups.PopupEntity(Loc.GetString("psychic-potential", ("entity", args.Target)), uid, uid, PopupType.LargeCaution); + return; + } + + foreach (var psychicFeedback in psychic.PsychicFeedback) + { + _popups.PopupEntity(Loc.GetString(psychicFeedback, ("entity", args.Target)), uid, uid, PopupType.LargeCaution); + } + + } + } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index 5c83de2b526..04b90fe4d44 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -1,5 +1,4 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Abilities.Psionics; using Content.Shared.Speech; using Content.Shared.Stealth.Components; @@ -7,25 +6,25 @@ using Content.Shared.Mobs; using Content.Shared.Damage; using Content.Server.Mind; -using Content.Server.Mind.Components; using Content.Shared.Mobs.Systems; using Content.Server.Popups; using Content.Server.Psionics; using Content.Server.GameTicking; using Robust.Shared.Prototypes; using Robust.Shared.Timing; +using Content.Shared.Mind; +using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { public sealed class MindSwapPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly MetaDataSystem _metaDataSystem = default!; public override void Initialize() { @@ -39,39 +38,50 @@ public override void Initialize() SubscribeLocalEvent(OnGhostAttempt); // SubscribeLocalEvent(OnSwapInit); + SubscribeLocalEvent(OnSwapShutdown); } private void OnInit(EntityUid uid, MindSwapPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("MindSwap", out var mindSwap)) - return; - - component.MindSwapPowerAction = new EntityTargetAction(mindSwap); - if (mindSwap.UseDelay != null) - component.MindSwapPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) mindSwap.UseDelay); - _actions.AddAction(uid, component.MindSwapPowerAction, null); - - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.MindSwapPowerAction; + _actions.AddAction(uid, ref component.MindSwapActionEntity, component.MindSwapActionId); + _actions.TryGetActionData( component.MindSwapActionEntity, out var actionData); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.MindSwapActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.PsionicAbility = component.MindSwapActionEntity; + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.MindSwapFeedback); + psionic.Amplification += 1f; + } } private void OnShutdown(EntityUid uid, MindSwapPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("MindSwap", out var action)) - _actions.RemoveAction(uid, new EntityTargetAction(action), null); + _actions.RemoveAction(uid, component.MindSwapActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.MindSwapFeedback); + psionic.Amplification -= 1f; + } } private void OnPowerUsed(MindSwapPowerActionEvent args) { + if (!(TryComp(args.Target, out var damageable) && damageable.DamageContainerID == "Biological")) return; if (HasComp(args.Target)) return; + if (!TryComp(args.Performer, out var psionic)) + return; + Swap(args.Performer, args.Target); - _psionics.LogPowerUsed(args.Performer, "mind swap"); + _psionics.LogPowerUsed(args.Performer, "mind swap", (int) MathF.Round(psionic.Amplification / psionic.Dampening * 8), (int) MathF.Round(psionic.Amplification / psionic.Dampening * 12)); args.Handled = true; } @@ -134,8 +144,9 @@ private void OnGhostAttempt(GhostAttemptHandleEvent args) if (!HasComp(args.Mind.CurrentEntity)) return; - if (!args.ViaCommand) - return; + //No idea where the viaCommand went. It's on the internal OnGhostAttempt, but not this layer. Maybe unnecessary. + /*if (!args.viaCommand) + return;*/ args.Result = false; args.Handled = true; @@ -143,11 +154,24 @@ private void OnGhostAttempt(GhostAttemptHandleEvent args) private void OnSwapInit(EntityUid uid, MindSwappedComponent component, ComponentInit args) { - if (_prototypeManager.TryIndex("MindSwapReturn", out var mindSwap)) + _actions.AddAction(uid, ref component.MindSwapReturnActionEntity, component.MindSwapReturnActionId ); + _actions.TryGetActionData( component.MindSwapReturnActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.MindSwapReturnActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.MindSwappedFeedback); + } + } + + private void OnSwapShutdown(EntityUid uid, MindSwappedComponent component, ComponentShutdown args) + { + _actions.RemoveAction(uid, component.MindSwapReturnActionEntity); + if (TryComp(uid, out var psionic)) { - var action = new InstantAction(mindSwap); - action.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + TimeSpan.FromSeconds(15)); - _actions.AddAction(uid, action, null); + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.MindSwappedFeedback); } } @@ -157,30 +181,35 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) return; // Get the minds first. On transfer, they'll be gone. - Mind.Mind? performerMind = null; - Mind.Mind? targetMind = null; + MindComponent? performerMind = null; + MindComponent? targetMind = null; // This is here to prevent missing MindContainerComponent Resolve errors. - if (TryComp(performer, out var performerMindContainer)) - performerMind = _mindSystem.GetMind(performer, performerMindContainer); - - if (TryComp(target, out var targetMindContainer)) - targetMind = _mindSystem.GetMind(target, targetMindContainer); - + if(!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)){ + performerMind = null; + }; + + if(!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)){ + targetMind = null; + }; + //This is a terrible way to 'unattach' minds. I wanted to use UnVisit but in TransferTo's code they say + //To unnatch the minds, do it like this. + //Have to unnattach the minds before we reattach them via transfer. Still feels weird, but seems to work well. + _mindSystem.TransferTo(performerMindId, null); + _mindSystem.TransferTo(targetMindId, null); // Do the transfer. if (performerMind != null) - _mindSystem.TransferTo(performerMind, target, ghostCheckOverride: true); + _mindSystem.TransferTo(performerMindId, target, ghostCheckOverride: true, false, performerMind); if (targetMind != null) - _mindSystem.TransferTo(targetMind, performer, ghostCheckOverride: true); + _mindSystem.TransferTo(targetMindId, performer, ghostCheckOverride: true, false, targetMind); if (end) { - if (_prototypeManager.TryIndex("MindSwapReturn", out var mindSwap)) - { - _actions.RemoveAction(performer, new InstantAction(mindSwap), null); - _actions.RemoveAction(target, new InstantAction(mindSwap), null); - } + var performerMindPowerComp = EntityManager.GetComponent(performer); + var targetMindPowerComp = EntityManager.GetComponent(target); + _actions.RemoveAction(performer, performerMindPowerComp.MindSwapReturnActionEntity); + _actions.RemoveAction(target, targetMindPowerComp.MindSwapReturnActionEntity); RemComp(performer); RemComp(target); @@ -196,11 +225,10 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) public void GetTrapped(EntityUid uid) { - if (!_prototypeManager.TryIndex("MindSwapReturn", out var action)) - return; _popupSystem.PopupEntity(Loc.GetString("mindswap-trapped"), uid, uid, Shared.Popups.PopupType.LargeCaution); - _actions.RemoveAction(uid, action); + var perfComp = EnsureComp(uid); + _actions.RemoveAction(uid, perfComp.MindSwapReturnActionEntity, null); if (HasComp(uid)) { @@ -208,12 +236,9 @@ public void GetTrapped(EntityUid uid) RemComp(uid); EnsureComp(uid); EnsureComp(uid); - MetaData(uid).EntityName = Loc.GetString("telegnostic-trapped-entity-name"); - MetaData(uid).EntityDescription = Loc.GetString("telegnostic-trapped-entity-desc"); + _metaDataSystem.SetEntityName(uid, Loc.GetString("telegnostic-trapped-entity-name")); + _metaDataSystem.SetEntityDescription(uid, Loc.GetString("telegnostic-trapped-entity-desc")); } } } - - public sealed class MindSwapPowerActionEvent : EntityTargetActionEvent {} - public sealed class MindSwapPowerReturnActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs index 84d2909c1f2..92fc94773db 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs @@ -1,9 +1,21 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + namespace Content.Server.Abilities.Psionics { [RegisterComponent] - public sealed class MindSwappedComponent : Component + public sealed partial class MindSwappedComponent : Component { [ViewVariables] public EntityUid OriginalEntity = default!; + [DataField("mindSwapReturnActionId", + customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? MindSwapReturnActionId = "ActionMindSwapReturn"; + + [DataField("mindSwapReturnActionEntity")] + public EntityUid? MindSwapReturnActionEntity; + + [DataField("mindSwappedFeedback")] + public string MindSwappedFeedback = "mindswapped-feedback"; } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index c844030f1e1..61917df3c7a 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -1,23 +1,19 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Abilities.Psionics; using Content.Server.Psionics; using Content.Shared.StatusEffect; using Content.Server.Stunnable; using Content.Server.Beam; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; +using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { public sealed class NoosphericZapPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly StunSystem _stunSystem = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly BeamSystem _beam = default!; @@ -31,22 +27,26 @@ public override void Initialize() private void OnInit(EntityUid uid, NoosphericZapPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("NoosphericZap", out var noosphericZap)) - return; - - component.NoosphericZapPowerAction = new EntityTargetAction(noosphericZap); - if (noosphericZap.UseDelay != null) - component.NoosphericZapPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) noosphericZap.UseDelay); - _actions.AddAction(uid, component.NoosphericZapPowerAction, null); - + _actions.AddAction(uid, ref component.NoosphericZapActionEntity, component.NoosphericZapActionId ); + _actions.TryGetActionData( component.NoosphericZapActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.NoosphericZapActionEntity); if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.NoosphericZapPowerAction; + { + psionic.PsionicAbility = component.NoosphericZapActionEntity; + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.NoosphericZapFeedback); + } } private void OnShutdown(EntityUid uid, NoosphericZapPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("NoosphericZap", out var noosphericZap)) - _actions.RemoveAction(uid, new EntityTargetAction(noosphericZap), null); + _actions.RemoveAction(uid, component.NoosphericZapActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.NoosphericZapFeedback); + } } private void OnPowerUsed(NoosphericZapPowerActionEvent args) @@ -66,6 +66,4 @@ private void OnPowerUsed(NoosphericZapPowerActionEvent args) args.Handled = true; } } - - public sealed class NoosphericZapPowerActionEvent : EntityTargetActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index 3bbaf9d8136..cf3da800ed7 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -1,27 +1,31 @@ +using Content.Server.DoAfter; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; -using Content.Shared.CombatMode.Pacification; using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; +using Content.Shared.DoAfter; using Content.Shared.Stunnable; using Content.Shared.Stealth; using Content.Shared.Stealth.Components; using Content.Server.Psionics; -using Robust.Shared.Prototypes; -using Robust.Shared.Player; -using Robust.Shared.Audio; +using Content.Shared.Psionics.Events; +using Content.Shared.Actions.Events; +using Robust.Shared.Audio.Systems; +using Content.Shared.Interaction.Events; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Throwing; using Robust.Shared.Timing; namespace Content.Server.Abilities.Psionics { public sealed class PsionicInvisibilityPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly SharedStealthSystem _stealth = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; public override void Initialize() { @@ -29,47 +33,61 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); - SubscribeLocalEvent(OnPowerOff); + SubscribeLocalEvent(OnPowerOff); SubscribeLocalEvent(OnStart); SubscribeLocalEvent(OnEnd); SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnAttackAttempt); + SubscribeLocalEvent(OnShootAttempt); + SubscribeLocalEvent(OnThrowAttempt); } private void OnInit(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("PsionicInvisibility", out var invis)) - return; - - component.PsionicInvisibilityPowerAction = new InstantAction(invis); - if (invis.UseDelay != null) - component.PsionicInvisibilityPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) invis.UseDelay); - _actions.AddAction(uid, component.PsionicInvisibilityPowerAction, null); - - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.PsionicInvisibilityPowerAction; + _actions.AddAction(uid, ref component.PsionicInvisibilityActionEntity, component.PsionicInvisibilityActionId); + _actions.TryGetActionData( component.PsionicInvisibilityActionEntity, out var actionData); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.PsionicInvisibilityActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.PsionicAbility = component.PsionicInvisibilityActionEntity; + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.InvisibilityFeedback); + psionic.Amplification += 0.5f; + } } private void OnShutdown(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("PsionicInvisibility", out var invis)) - _actions.RemoveAction(uid, new InstantAction(invis), null); + RemComp(uid); + RemComp(uid); + _actions.RemoveAction(uid, component.PsionicInvisibilityActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.InvisibilityFeedback); + psionic.Amplification -= 0.5f; + } } private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityPowerActionEvent args) { - if (HasComp(uid)) - return; + var ev = new PsionicInvisibilityTimerEvent(_gameTiming.CurTime); + var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseTimer, ev, uid) { Hidden = true }; + _doAfterSystem.TryStartDoAfter(doAfterArgs); ToggleInvisibility(args.Performer); - - if (_prototypeManager.TryIndex("PsionicInvisibilityOff", out var invis)) - _actions.AddAction(args.Performer, new InstantAction(invis), null); + var action = Spawn(PsionicInvisibilityUsedComponent.PsionicInvisibilityUsedActionPrototype); + _actions.AddAction(uid, action, action); + _actions.TryGetActionData( action, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(action); _psionics.LogPowerUsed(uid, "psionic invisibility"); args.Handled = true; } - private void OnPowerOff(PsionicInvisibilityPowerOffActionEvent args) + private void OnPowerOff(RemovePsionicInvisibilityOffPowerActionEvent args) { if (!HasComp(args.Performer)) return; @@ -81,10 +99,9 @@ private void OnPowerOff(PsionicInvisibilityPowerOffActionEvent args) private void OnStart(EntityUid uid, PsionicInvisibilityUsedComponent component, ComponentInit args) { EnsureComp(uid); - EnsureComp(uid); var stealth = EnsureComp(uid); _stealth.SetVisibility(uid, 0.66f, stealth); - SoundSystem.Play("/Audio/Effects/toss.ogg", Filter.Pvs(uid), uid); + _audio.PlayPvs("/Audio/Effects/toss.ogg", uid); } @@ -94,25 +111,34 @@ private void OnEnd(EntityUid uid, PsionicInvisibilityUsedComponent component, Co return; RemComp(uid); - RemComp(uid); RemComp(uid); - SoundSystem.Play("/Audio/Effects/toss.ogg", Filter.Pvs(uid), uid); + _audio.PlayPvs("/Audio/Effects/toss.ogg", uid); + _actions.RemoveAction(uid, component.PsionicInvisibilityUsedActionEntity); + DirtyEntity(uid); + } - if (_prototypeManager.TryIndex("PsionicInvisibilityOff", out var invis)) - _actions.RemoveAction(uid, new InstantAction(invis), null); + private void OnAttackAttempt(EntityUid uid, PsionicInvisibilityUsedComponent component, AttackAttemptEvent args) + { + RemComp(uid); + } - _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(8), false); - Dirty(uid); + private void OnShootAttempt(EntityUid uid, PsionicInvisibilityUsedComponent component, ShotAttemptedEvent args) + { + RemComp(uid); } + private void OnThrowAttempt(EntityUid uid, PsionicInvisibilityUsedComponent component, ThrowAttemptEvent args) + { + RemComp(uid); + } private void OnDamageChanged(EntityUid uid, PsionicInvisibilityUsedComponent component, DamageChangedEvent args) { if (!args.DamageIncreased) return; ToggleInvisibility(uid); + _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(4), false); } - public void ToggleInvisibility(EntityUid uid) { if (!HasComp(uid)) @@ -123,8 +149,10 @@ public void ToggleInvisibility(EntityUid uid) RemComp(uid); } } - } - public sealed class PsionicInvisibilityPowerActionEvent : InstantActionEvent {} - public sealed class PsionicInvisibilityPowerOffActionEvent : InstantActionEvent {} + public void OnDoAfter(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityTimerEvent args) + { + RemComp(uid); + } + } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index f40465643da..707e8d61298 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -1,39 +1,34 @@ using Robust.Shared.Audio; -using Robust.Server.GameObjects; using Robust.Shared.Player; -using Robust.Shared.Prototypes; using Content.Server.Body.Components; using Content.Server.Body.Systems; -using Content.Server.Chemistry.EntitySystems; using Content.Server.DoAfter; using Content.Shared.Abilities.Psionics; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Actions; using Content.Shared.Chemistry.Components; using Content.Shared.DoAfter; using Content.Shared.FixedPoint; +using Content.Shared.Mobs; using Content.Shared.Popups; using Content.Shared.Psionics.Events; -using Content.Shared.Tag; using Content.Shared.Examine; using static Content.Shared.Examine.ExamineSystemShared; using Robust.Shared.Timing; +using Content.Shared.Actions.Events; +using Robust.Server.Audio; namespace Content.Server.Abilities.Psionics { public sealed class PsionicRegenerationPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; [Dependency] private readonly AudioSystem _audioSystem = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - + [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { @@ -41,29 +36,34 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); - + SubscribeLocalEvent(OnMobStateChangedEvent); SubscribeLocalEvent(OnDispelled); SubscribeLocalEvent(OnDoAfter); } private void OnInit(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("PsionicRegeneration", out var metapsionic)) - return; - - component.PsionicRegenerationPowerAction = new InstantAction(metapsionic); - if (metapsionic.UseDelay != null) - component.PsionicRegenerationPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) metapsionic.UseDelay); - _actions.AddAction(uid, component.PsionicRegenerationPowerAction, null); - - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.PsionicRegenerationPowerAction; + _actions.AddAction(uid, ref component.PsionicRegenerationActionEntity, component.PsionicRegenerationActionId ); + _actions.TryGetActionData( component.PsionicRegenerationActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.PsionicRegenerationActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.RegenerationFeedback); + } } private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationPowerActionEvent args) { var ev = new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime); - var doAfterArgs = new DoAfterArgs(uid, component.UseDelay, ev, uid); + var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseDelay, ev, uid); + + //Prevent the power from ignoring its own cooldown + _actions.TryGetActionData(component.PsionicRegenerationActionEntity, out var actionData); + var curTime = _gameTiming.CurTime; + if (actionData != null && actionData.Cooldown.HasValue && actionData.Cooldown.Value.End > curTime) + return; _doAfterSystem.TryStartDoAfter(doAfterArgs, out var doAfterId); @@ -76,15 +76,63 @@ private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent compon true, PopupType.Medium); - _audioSystem.PlayPvs(component.SoundUse, component.Owner, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); + _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); _psionics.LogPowerUsed(uid, "psionic regeneration"); args.Handled = true; } + /// + /// Regenerators automatically activate upon crit, provided the power was off cooldown at that exact point in time. + /// Self-rescusitation is also far more costly, and extremely obvious + /// + /// + /// + /// + private void OnMobStateChangedEvent(EntityUid uid, PsionicRegenerationPowerComponent component, MobStateChangedEvent args) + { + if (HasComp(uid)) + return; + + if (args.NewMobState is MobState.Critical) + { + _actions.TryGetActionData(component.PsionicRegenerationActionEntity, out var actionData); + var curTime = _gameTiming.CurTime; + if (actionData != null && actionData.Cooldown.HasValue && actionData.Cooldown.Value.End > curTime) + return; + + if (actionData is { UseDelay: not null }) + { + component.SelfRevive = true; + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.UseDelay, new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime), uid, args.Target, uid) + { + BreakOnUserMove = false, + BreakOnTargetMove = false, + BreakOnWeightlessMove = false, + BreakOnDamage = false, + RequireCanInteract = false, + }); + _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-self-revive", ("entity", uid)), + uid, + // TODO: Use LoS-based Filter when one is available. + Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !_examine.InRangeUnOccluded(uid, entity, ExamineRange, null)), + true, + PopupType.MediumCaution); + _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); + _psionics.LogPowerUsed(uid, "psionic regeneration", 20, 40); + _actions.StartUseDelay(component.PsionicRegenerationActionEntity); + } + } + } + private void OnShutdown(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("PsionicRegeneration", out var metapsionic)) - _actions.RemoveAction(uid, new InstantAction(metapsionic), null); + _actions.RemoveAction(uid, component.PsionicRegenerationActionEntity); + + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.RegenerationFeedback); + } } private void OnDispelled(EntityUid uid, PsionicRegenerationPowerComponent component, DispelledEvent args) @@ -114,9 +162,13 @@ private void OnDoAfter(EntityUid uid, PsionicRegenerationPowerComponent componen var solution = new Solution(); solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(component.EssenceAmount * percentageComplete)); _bloodstreamSystem.TryAddToChemicals(uid, solution, stream); + if (component.SelfRevive == true) + { + var critSolution = new Solution(); + critSolution.AddReagent("Epinephrine", 10); + _bloodstreamSystem.TryAddToChemicals(uid, critSolution, stream); + component.SelfRevive = false; + } } } - - public sealed class PsionicRegenerationPowerActionEvent : InstantActionEvent {} } - diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs index d86c3a346f0..28b4d1b597b 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -1,12 +1,12 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Abilities.Psionics; using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Popups; using Robust.Shared.Prototypes; -using Robust.Shared.Player; using Robust.Shared.Timing; +using Content.Server.Mind; +using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { @@ -18,6 +18,7 @@ public sealed class PyrokinesisPowerSystem : EntitySystem [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { @@ -29,22 +30,26 @@ public override void Initialize() private void OnInit(EntityUid uid, PyrokinesisPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("Pyrokinesis", out var pyrokinesis)) - return; - - component.PyrokinesisPowerAction = new EntityTargetAction(pyrokinesis); - if (pyrokinesis.UseDelay != null) - component.PyrokinesisPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) pyrokinesis.UseDelay); - _actions.AddAction(uid, component.PyrokinesisPowerAction, null); - + _actions.AddAction(uid, ref component.PyrokinesisActionEntity, component.PyrokinesisActionId ); + _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.PyrokinesisActionEntity); if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.PyrokinesisPowerAction; + { + psionic.PsionicAbility = component.PyrokinesisActionEntity; + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.PyrokinesisFeedback); + } } private void OnShutdown(EntityUid uid, PyrokinesisPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("Pyrokinesis", out var pyrokinesis)) - _actions.RemoveAction(uid, new EntityTargetAction(pyrokinesis), null); + _actions.RemoveAction(uid, component.PyrokinesisActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.PyrokinesisFeedback); + } } private void OnPowerUsed(PyrokinesisPowerActionEvent args) @@ -53,13 +58,11 @@ private void OnPowerUsed(PyrokinesisPowerActionEvent args) return; flammableComponent.FireStacks += 5; - _flammableSystem.Ignite(args.Target, flammableComponent); + _flammableSystem.Ignite(args.Target, args.Target); _popupSystem.PopupEntity(Loc.GetString("pyrokinesis-power-used", ("target", args.Target)), args.Target, Shared.Popups.PopupType.LargeCaution); _psionics.LogPowerUsed(args.Performer, "pyrokinesis"); args.Handled = true; } } - - public sealed class PyrokinesisPowerActionEvent : EntityTargetActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs index 0d6adb7f9a9..1000ff453f5 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -1,10 +1,11 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.StatusEffect; using Content.Shared.Abilities.Psionics; -using Content.Server.Mind.Components; +using Content.Shared.Mind.Components; using Robust.Shared.Prototypes; using Robust.Shared.Timing; +using Content.Server.Mind; +using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { @@ -16,6 +17,7 @@ public sealed class TelegnosisPowerSystem : EntitySystem [Dependency] private readonly MindSwapPowerSystem _mindSwap = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { @@ -28,22 +30,26 @@ public override void Initialize() private void OnInit(EntityUid uid, TelegnosisPowerComponent component, ComponentInit args) { - if (!_prototypeManager.TryIndex("Telegnosis", out var telegnosis)) - return; - - component.TelegnosisPowerAction = new InstantAction(telegnosis); - if (telegnosis.UseDelay != null) - component.TelegnosisPowerAction.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + (TimeSpan) telegnosis.UseDelay); - _actions.AddAction(uid, component.TelegnosisPowerAction, null); - + _actions.AddAction(uid, ref component.TelegnosisActionEntity, component.TelegnosisActionId ); + _actions.TryGetActionData( component.TelegnosisActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.TelegnosisActionEntity); if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.TelegnosisPowerAction; + { + psionic.PsionicAbility = component.TelegnosisActionEntity; + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.TelegnosisFeedback); + } } private void OnShutdown(EntityUid uid, TelegnosisPowerComponent component, ComponentShutdown args) { - if (_prototypeManager.TryIndex("Telegnosis", out var metapsionic)) - _actions.RemoveAction(uid, new InstantAction(metapsionic), null); + _actions.RemoveAction(uid, component.TelegnosisActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.TelegnosisFeedback); + } } private void OnPowerUsed(EntityUid uid, TelegnosisPowerComponent component, TelegnosisPowerActionEvent args) @@ -60,6 +66,4 @@ private void OnMindRemoved(EntityUid uid, TelegnosticProjectionComponent compone QueueDel(uid); } } - - public sealed class TelegnosisPowerActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs index 326be3e0583..860b7baab21 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -6,12 +6,15 @@ using Content.Server.EUI; using Content.Server.Psionics; using Content.Server.Mind; -using Content.Server.Mind.Components; +using Content.Shared.Mind.Components; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; -using Robust.Server.GameObjects; -using Robust.Server.Player; +using Robust.Shared.Player; +using Content.Shared.Examine; +using Content.Shared.Popups; +using Content.Shared.Examine; +using static Content.Shared.Examine.ExamineSystemShared; namespace Content.Server.Abilities.Psionics { @@ -20,29 +23,26 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly EuiManager _euiManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly SharedPopupSystem _popups = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPlayerAttached); } - private void OnPlayerAttached(EntityUid uid, PsionicAwaitingPlayerComponent component, PlayerAttachedEvent args) - { - if (TryComp(uid, out var bonus) && bonus.Warn == true) - _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), args.Player); - else - AddRandomPsionicPower(uid); - RemCompDeferred(uid); - } - - public void AddPsionics(EntityUid uid, bool warn = true) + /// + /// Adds a psychic power once a character rolls one. This used to be a system you have to select for. However the opt-in is no longer the text window, but is now done at character creation. + /// This is going to get removed when I reach Part 3 of my reworks, when I touch upon the GlimmerSystem itself and overhaul how players get powers. + /// + /// + /// + /// + public void AddPsionics(EntityUid uid) { if (Deleted(uid)) return; @@ -50,41 +50,11 @@ public void AddPsionics(EntityUid uid, bool warn = true) if (HasComp(uid)) return; - if (!TryComp(uid, out var mindContainer) || - !_mindSystem.TryGetMind(uid, out var mind, mindContainer)) - { - EnsureComp(uid); - return; - } - - if (!_mindSystem.TryGetSession(mind, out var client)) - return; - - if (warn && TryComp(uid, out var actor)) - _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), client); - else - AddRandomPsionicPower(uid); + AddRandomPsionicPower(uid); } - - public void AddPsionics(EntityUid uid, string powerComp) - { - if (Deleted(uid)) - return; - - if (HasComp(uid)) - return; - - AddComp(uid); - - var newComponent = (Component) _componentFactory.GetComponent(powerComp); - newComponent.Owner = uid; - - EntityManager.AddComponent(uid, newComponent); - } - public void AddRandomPsionicPower(EntityUid uid) { - AddComp(uid); + EnsureComp(uid, out var psionic); if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) { @@ -98,7 +68,7 @@ public void AddRandomPsionicPower(EntityUid uid) EntityManager.AddComponent(uid, newComponent); - _glimmerSystem.Glimmer += _random.Next(1, 5); + _glimmerSystem.Glimmer += _random.Next((int) MathF.Round(psionic.Amplification * psionic.Dampening * 1), (int) MathF.Round(psionic.Amplification * psionic.Dampening * 5)); } public void RemovePsionics(EntityUid uid) @@ -122,12 +92,25 @@ public void RemovePsionics(EntityUid uid) if (EntityManager.TryGetComponent(uid, comp.GetType(), out var psionicPower)) RemComp(uid, psionicPower); } - if (psionic.PsionicAbility != null) - _actionsSystem.RemoveAction(uid, psionic.PsionicAbility); + if (psionic.PsionicAbility != null){ + _actionsSystem.TryGetActionData( psionic.PsionicAbility, out var psiAbility ); + if (psiAbility != null){ + _actionsSystem.RemoveAction(uid, psiAbility.Owner); + } + } + + _popups.PopupEntity(Loc.GetString("mindbreaking-feedback", ("entity", uid)), + uid, + // TODO: Use LoS-based Filter when one is available. + Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), + true, + PopupType.Medium); _statusEffectsSystem.TryAddStatusEffect(uid, "Stutter", TimeSpan.FromMinutes(5), false, "StutteringAccent"); + _glimmerSystem.Glimmer += _random.Next((int) MathF.Round(psionic.Amplification * psionic.Dampening * -5), (int) MathF.Round(psionic.Amplification * psionic.Dampening * -10)); RemComp(uid); + RemComp(uid); } } } From 8c0fc8d3b8415d58f6b2072a9287360ba46afce0 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 16:02:58 -0400 Subject: [PATCH 18/79] Finishing Mind Swap rework --- .../Abilities/MetapsionicPowerSystem.cs | 2 +- .../Psionics/Abilities/MindSwapPowerSystem.cs | 20 +++++++++++-------- .../Abilities/NoosphericZapPowerSystem.cs | 3 +-- .../PsionicInvisibilityPowerSystem.cs | 1 - .../Abilities/PyrokinesisPowerSystem.cs | 3 +-- .../Abilities/TelegnosisPowerSystem.cs | 3 +-- .../Psionics/SharedPsionicSystem.Insulated.cs | 19 ++++++++++++++++++ 7 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs index 44953767f19..fd9b8107568 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -131,7 +131,7 @@ private void OnFocusedPowerUsed(FocusedMetapsionicPowerActionEvent args) true, PopupType.Medium); - _audioSystem.PlayPvs(component.SoundUse, component.Owner, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); + _audioSystem.PlayPvs(component.SoundUse, args.Performer, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); _psionics.LogPowerUsed(args.Performer, "focused metapsionic pulse", (int) MathF.Round(psionic.Amplification / psionic.Dampening * 3), (int) MathF.Round(psionic.Amplification / psionic.Dampening * 6)); args.Handled = true; diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index 04b90fe4d44..8f191949472 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Actions; using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics; using Content.Shared.Speech; using Content.Shared.Stealth.Components; using Content.Shared.Mobs.Components; @@ -10,8 +11,6 @@ using Content.Server.Popups; using Content.Server.Psionics; using Content.Server.GameTicking; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; using Content.Shared.Mind; using Content.Shared.Actions.Events; @@ -36,9 +35,9 @@ public override void Initialize() SubscribeLocalEvent(OnDispelled); SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnGhostAttempt); - // SubscribeLocalEvent(OnSwapInit); SubscribeLocalEvent(OnSwapShutdown); + SubscribeLocalEvent(OnInsulated); } private void OnInit(EntityUid uid, MindSwapPowerComponent component, ComponentInit args) @@ -49,7 +48,6 @@ private void OnInit(EntityUid uid, MindSwapPowerComponent component, ComponentIn _actions.StartUseDelay(component.MindSwapActionEntity); if (TryComp(uid, out var psionic)) { - psionic.PsionicAbility = component.MindSwapActionEntity; psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.MindSwapFeedback); psionic.Amplification += 1f; @@ -132,8 +130,8 @@ private void OnDispelled(EntityUid uid, MindSwappedComponent component, Dispelle private void OnMobStateChanged(EntityUid uid, MindSwappedComponent component, MobStateChangedEvent args) { - if (args.NewMobState == MobState.Dead) - RemComp(uid); + if (args.NewMobState == MobState.Dead || args.NewMobState == MobState.Critical) + Swap(uid, component.OriginalEntity, true); } private void OnGhostAttempt(GhostAttemptHandleEvent args) @@ -185,11 +183,13 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) MindComponent? targetMind = null; // This is here to prevent missing MindContainerComponent Resolve errors. - if(!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)){ + if (!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)) + { performerMind = null; }; - if(!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)){ + if (!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)) + { targetMind = null; }; //This is a terrible way to 'unattach' minds. I wanted to use UnVisit but in TransferTo's code they say @@ -240,5 +240,9 @@ public void GetTrapped(EntityUid uid) _metaDataSystem.SetEntityDescription(uid, Loc.GetString("telegnostic-trapped-entity-desc")); } } + public void OnInsulated(EntityUid uid, MindSwappedComponent component, PsionicInsulationEvent args) + { + Swap(uid, component.OriginalEntity, true); + } } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index 61917df3c7a..cceb3ef2075 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -31,9 +31,8 @@ private void OnInit(EntityUid uid, NoosphericZapPowerComponent component, Compon _actions.TryGetActionData( component.NoosphericZapActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.NoosphericZapActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + if (TryComp(uid, out var psionic)) { - psionic.PsionicAbility = component.NoosphericZapActionEntity; psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.NoosphericZapFeedback); } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index cf3da800ed7..af2ae0c7f05 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -50,7 +50,6 @@ private void OnInit(EntityUid uid, PsionicInvisibilityPowerComponent component, _actions.StartUseDelay(component.PsionicInvisibilityActionEntity); if (TryComp(uid, out var psionic)) { - psionic.PsionicAbility = component.PsionicInvisibilityActionEntity; psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.InvisibilityFeedback); psionic.Amplification += 0.5f; diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs index 28b4d1b597b..8300b204dca 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -34,9 +34,8 @@ private void OnInit(EntityUid uid, PyrokinesisPowerComponent component, Componen _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.PyrokinesisActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + if (TryComp(uid, out var psionic)) { - psionic.PsionicAbility = component.PyrokinesisActionEntity; psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.PyrokinesisFeedback); } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs index 1000ff453f5..00d06e6dd28 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -34,9 +34,8 @@ private void OnInit(EntityUid uid, TelegnosisPowerComponent component, Component _actions.TryGetActionData( component.TelegnosisActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.TelegnosisActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + if (TryComp(uid, out var psionic)) { - psionic.PsionicAbility = component.TelegnosisActionEntity; psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.TelegnosisFeedback); } diff --git a/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs b/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs new file mode 100644 index 00000000000..c59f98db7f0 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs @@ -0,0 +1,19 @@ +using Content.Shared.Abilities.Psionics; + +namespace Content.Shared.Psionics +{ + public sealed class PsionicInsulationSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInsulated); + } + + public void OnInsulated(EntityUid uid, PsionicInsulationComponent component, ComponentInit args) + { + RaiseLocalEvent(uid, new PsionicInsulationEvent()); + } + } + public readonly record struct PsionicInsulationEvent; +} From fa213b7ef866982a152d3fc39df59c6e45565c24 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 16:58:05 -0400 Subject: [PATCH 19/79] Noospheric Zap updating --- .../Abilities/NoosphericZapPowerSystem.cs | 26 ++++++++++++------- .../Prototypes/Nyanotrasen/psionicPowers.yml | 3 ++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index cceb3ef2075..d849d383033 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -1,7 +1,8 @@ using Content.Shared.Actions; using Content.Shared.Abilities.Psionics; -using Content.Server.Psionics; +using Content.Shared.Damage; using Content.Shared.StatusEffect; +using Content.Server.Electrocution; using Content.Server.Stunnable; using Content.Server.Beam; using Content.Shared.Actions.Events; @@ -15,6 +16,8 @@ public sealed class NoosphericZapPowerSystem : EntitySystem [Dependency] private readonly StunSystem _stunSystem = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly BeamSystem _beam = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly ElectrocutionSystem _electrocution = default!; public override void Initialize() @@ -35,6 +38,7 @@ private void OnInit(EntityUid uid, NoosphericZapPowerComponent component, Compon { psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.NoosphericZapFeedback); + psionic.Amplification += 1f; } } @@ -45,24 +49,26 @@ private void OnShutdown(EntityUid uid, NoosphericZapPowerComponent component, Co { psionic.ActivePowers.Remove(component); psionic.PsychicFeedback.Remove(component.NoosphericZapFeedback); + psionic.Amplification += 1f; } } private void OnPowerUsed(NoosphericZapPowerActionEvent args) { - if (!HasComp(args.Target)) + if (!TryComp(args.Performer, out var psionic)) return; - if (HasComp(args.Target)) - return; - - _beam.TryCreateBeam(args.Performer, args.Target, "LightningNoospheric"); + if (!HasComp(args.Target) && !HasComp(args.Performer)) + { + _beam.TryCreateBeam(args.Performer, args.Target, "LightningNoospheric"); + _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(1 * psionic.Amplification), false); - _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(5), false); - _statusEffectsSystem.TryAddStatusEffect(args.Target, "Stutter", TimeSpan.FromSeconds(10), false, "StutteringAccent"); + _electrocution.TryDoElectrocution(args.Target, null, (int) MathF.Round(5f * psionic.Amplification), new TimeSpan((long) MathF.Round(1f * psionic.Amplification)), true, ignoreInsulation: true); + _statusEffectsSystem.TryAddStatusEffect(args.Target, "Stutter", TimeSpan.FromSeconds(2 * psionic.Amplification), false, "StutteringAccent"); - _psionics.LogPowerUsed(args.Performer, "noospheric zap"); - args.Handled = true; + _psionics.LogPowerUsed(args.Performer, "noopsheric zap", (int) MathF.Round(psionic.Dampening * -4), (int) MathF.Round(psionic.Dampening * -6)); + args.Handled = true; + } } } } diff --git a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml index f40b688fd18..cb3f88d6a4a 100644 --- a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml +++ b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml @@ -6,5 +6,6 @@ TelegnosisPower: 1 PsionicRegenerationPower: 1 MassSleepPower: 0.3 -# PsionicInvisibilityPower: 0.15 + PsionicInvisibilityPower: 0.15 MindSwapPower: 0.15 + NoosphericZapPower: 0.15 From 2ef711cee8c027774eb9bdae2fedb17d19ab91a9 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 20:18:02 -0400 Subject: [PATCH 20/79] Almost done --- .../Components/IgniteOnCollideComponent.cs | 4 +- .../Nyanotrasen/Chat/NyanoChatSystem.cs | 8 +-- .../Psionics/Abilities/DispelPowerSystem.cs | 8 ++- .../Abilities/MetapsionicPowerSystem.cs | 13 ++++- .../Psionics/Abilities/MindSwapPowerSystem.cs | 4 +- .../Abilities/MindSwappedComponent.cs | 2 +- .../Abilities/NoosphericZapPowerSystem.cs | 15 +++-- .../Abilities}/PsionicAbilitiesSystem.cs | 2 +- .../PsionicInvisibilityPowerSystem.cs | 30 ++++++++-- .../PsionicRegenerationPowerSystem.cs | 36 +++++++++--- .../Abilities/PyrokinesisPowerSystem.cs | 54 +++++++++++------ .../Abilities/TelegnosisPowerSystem.cs | 58 +++++++++++++++---- .../Psionics/AcceptPsionicsEui.cs | 2 +- .../Psionics/AntiPsychicWeaponComponent.cs | 0 .../Audio/GlimmerSoundComponent.cs | 6 +- .../Psionics/Dreams/DreamSystem.cs | 1 - .../Psionics/Glimmer/GlimmerCommands.cs | 0 .../Psionics/Glimmer/GlimmerReactiveSystem.cs | 0 .../Glimmer/PassiveGlimmerReductionSystem.cs | 2 - .../Structures/GlimmerSourceComponent.cs | 0 .../Structures/GlimmerStructuresSystem.cs | 0 .../Invisibility/PsionicInvisibilitySystem.cs | 3 + .../PsionicInvisibleContactsComponent.cs | 0 .../PsionicInvisibleContactsSystem.cs | 0 .../PsionicallyInvisibleComponent.cs | 0 .../Psionics/PotentialPsionicComponent.cs | 0 .../PsionicAwaitingPlayerComponent.cs | 0 .../Psionics/PsionicBonusChanceComponent.cs | 0 .../Psionics/PsionicsCommands.cs | 0 .../Psionics/PsionicsSystem.cs | 39 ++++++++++++- .../PsionicRegenerationPowerComponent.cs | 2 +- .../Telegnosis/TelegnosisPowerComponent.cs | 3 + .../TelegnosticProjectionComponent.cs | 6 +- .../Abilities/Psionics/PsionicComponent.cs | 6 +- .../Events/PyrokinesisPowerActionEvent.cs | 4 +- .../Psionics/SharedPsionicSystem.Insulated.cs | 15 ----- .../Prototypes/Nyanotrasen/Actions/types.yml | 2 +- .../Prototypes/Nyanotrasen/psionicPowers.yml | 1 + 38 files changed, 229 insertions(+), 97 deletions(-) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/DispelPowerSystem.cs (95%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/MetapsionicPowerSystem.cs (93%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/MindSwapPowerSystem.cs (98%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/MindSwappedComponent.cs (94%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/NoosphericZapPowerSystem.cs (87%) rename Content.Server/{Nyanotrasen/Abilities/Psionics => Psionics/Abilities}/PsionicAbilitiesSystem.cs (99%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs (84%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicRegenerationPowerSystem.cs (86%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/PyrokinesisPowerSystem.cs (50%) rename Content.Server/{Nyanotrasen/Abilities => }/Psionics/Abilities/TelegnosisPowerSystem.cs (52%) rename Content.Server/{Nyanotrasen => }/Psionics/AcceptPsionicsEui.cs (95%) rename Content.Server/{Nyanotrasen => }/Psionics/AntiPsychicWeaponComponent.cs (100%) rename Content.Server/{Nyanotrasen => Psionics}/Audio/GlimmerSoundComponent.cs (80%) rename Content.Server/{Nyanotrasen => }/Psionics/Dreams/DreamSystem.cs (98%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/GlimmerCommands.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/GlimmerReactiveSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs (94%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibilitySystem.cs (98%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicallyInvisibleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PotentialPsionicComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicAwaitingPlayerComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicBonusChanceComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicsCommands.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicsSystem.cs (79%) diff --git a/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs b/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs index a58d3a3c122..710c37b62fe 100644 --- a/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs +++ b/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs @@ -1,8 +1,6 @@ -using Content.Server.Atmos.EntitySystems; - namespace Content.Server.Atmos.Components; -[RegisterComponent, Access(typeof(FlammableSystem))] +[RegisterComponent] public sealed partial class IgniteOnCollideComponent : Component { /// diff --git a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs b/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs index e0fb18fcae4..62d8032df1d 100644 --- a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs +++ b/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs @@ -64,7 +64,7 @@ private List GetDreamers(IEnumerable removeList) private bool IsEligibleForTelepathy(EntityUid entity) { - return HasComp(entity) + return TryComp(entity, out var psionic) && psionic.Telepath && !HasComp(entity) && !HasComp(entity) && (!TryComp(entity, out var mobstate) || mobstate.CurrentState == MobState.Alive); @@ -95,9 +95,9 @@ public void SendTelepathicChat(EntityUid source, string message, bool hideChat) if (_random.Prob(0.1f)) _glimmerSystem.Glimmer++; - if (_random.Prob(Math.Min(0.33f + ((float) _glimmerSystem.Glimmer / 1500), 1))) + if (_random.Prob(Math.Min(0.33f + (float) _glimmerSystem.Glimmer / 1500, 1))) { - float obfuscation = (0.25f + (float) _glimmerSystem.Glimmer / 2000); + float obfuscation = 0.25f + (float) _glimmerSystem.Glimmer / 2000; var obfuscated = ObfuscateMessageReadability(message, obfuscation); _chatManager.ChatMessageToMany(ChatChannel.Telepathic, obfuscated, messageWrap, source, hideChat, false, GetDreamers(clients), Color.PaleVioletRed); } @@ -114,7 +114,7 @@ private string ObfuscateMessageReadability(string message, float chance) for (var i = 0; i < message.Length; i++) { - if (char.IsWhiteSpace((modifiedMessage[i]))) + if (char.IsWhiteSpace(modifiedMessage[i])) { continue; } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Psionics/Abilities/DispelPowerSystem.cs similarity index 95% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs rename to Content.Server/Psionics/Abilities/DispelPowerSystem.cs index 8cde75f461d..14e3ea14aeb 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/DispelPowerSystem.cs @@ -11,7 +11,7 @@ using Content.Shared.Actions.Events; using Robust.Shared.Audio.Systems; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class DispelPowerSystem : EntitySystem { @@ -70,7 +70,7 @@ private void OnShutdown(EntityUid uid, DispelPowerComponent component, Component private void OnPowerUsed(DispelPowerActionEvent args) { - if (HasComp(args.Target)) + if (HasComp(args.Target) || HasComp(args.Performer)) return; if (!TryComp(args.Performer, out var psionic) || !HasComp(args.Target)) return; @@ -81,7 +81,9 @@ private void OnPowerUsed(DispelPowerActionEvent args) if (ev.Handled) { args.Handled = true; - _psionics.LogPowerUsed(args.Performer, "dispel", (int) MathF.Round(psionic.Dampening * -2), (int) MathF.Round(psionic.Dampening * -4)); + _psionics.LogPowerUsed(args.Performer, "dispel", + (int) MathF.Round(-2 * psionic.Dampening + psionic.Amplification), + (int) MathF.Round(-4 * psionic.Dampening + psionic.Amplification)); } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs similarity index 93% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs rename to Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs index fd9b8107568..6279aa88622 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -13,7 +13,7 @@ using Content.Shared.Psionics.Events; using Content.Server.Psionics; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class MetapsionicPowerSystem : EntitySystem { @@ -82,6 +82,9 @@ private void OnShutdown(EntityUid uid, MetapsionicPowerComponent component, Comp private void OnWidePowerUsed(EntityUid uid, MetapsionicPowerComponent component, WideMetapsionicPowerActionEvent args) { + if (HasComp(uid)) + return; + if (!TryComp(uid, out var psionic)) return; @@ -96,7 +99,9 @@ private void OnWidePowerUsed(EntityUid uid, MetapsionicPowerComponent component, } } _popups.PopupEntity(Loc.GetString("metapsionic-pulse-failure"), uid, uid, PopupType.Large); - _psionics.LogPowerUsed(uid, "metapsionic pulse", (int) MathF.Round(psionic.Amplification / psionic.Dampening * 2), (int) MathF.Round(psionic.Amplification / psionic.Dampening * 4)); + _psionics.LogPowerUsed(uid, "metapsionic pulse", + (int) MathF.Round(2 * psionic.Amplification - psionic.Dampening), + (int) MathF.Round(4 * psionic.Amplification - psionic.Dampening)); UpdateActions(uid, component); args.Handled = true; } @@ -132,7 +137,9 @@ private void OnFocusedPowerUsed(FocusedMetapsionicPowerActionEvent args) PopupType.Medium); _audioSystem.PlayPvs(component.SoundUse, args.Performer, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); - _psionics.LogPowerUsed(args.Performer, "focused metapsionic pulse", (int) MathF.Round(psionic.Amplification / psionic.Dampening * 3), (int) MathF.Round(psionic.Amplification / psionic.Dampening * 6)); + _psionics.LogPowerUsed(args.Performer, "focused metapsionic pulse", + (int) MathF.Round(3 * psionic.Amplification - psionic.Dampening), + (int) MathF.Round(6 * psionic.Amplification - psionic.Dampening)); args.Handled = true; UpdateActions(args.Performer, component); diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs similarity index 98% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs rename to Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs index 8f191949472..0beea77aa53 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs @@ -14,7 +14,7 @@ using Content.Shared.Mind; using Content.Shared.Actions.Events; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class MindSwapPowerSystem : EntitySystem { @@ -222,7 +222,7 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) perfComp.OriginalEntity = target; targetComp.OriginalEntity = performer; } - + //It shouldn't actually be possible anymore to get trapped under most circumstances, but for niche edge cases, I am leaving this here public void GetTrapped(EntityUid uid) { diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs b/Content.Server/Psionics/Abilities/MindSwappedComponent.cs similarity index 94% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs rename to Content.Server/Psionics/Abilities/MindSwappedComponent.cs index 92fc94773db..82c0313bca6 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs +++ b/Content.Server/Psionics/Abilities/MindSwappedComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { [RegisterComponent] public sealed partial class MindSwappedComponent : Component diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs similarity index 87% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs rename to Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs index d849d383033..7e4ba64afde 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -1,13 +1,12 @@ using Content.Shared.Actions; using Content.Shared.Abilities.Psionics; -using Content.Shared.Damage; using Content.Shared.StatusEffect; using Content.Server.Electrocution; using Content.Server.Stunnable; using Content.Server.Beam; using Content.Shared.Actions.Events; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class NoosphericZapPowerSystem : EntitySystem { @@ -16,7 +15,6 @@ public sealed class NoosphericZapPowerSystem : EntitySystem [Dependency] private readonly StunSystem _stunSystem = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly BeamSystem _beam = default!; - [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly ElectrocutionSystem _electrocution = default!; @@ -63,10 +61,17 @@ private void OnPowerUsed(NoosphericZapPowerActionEvent args) _beam.TryCreateBeam(args.Performer, args.Target, "LightningNoospheric"); _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(1 * psionic.Amplification), false); - _electrocution.TryDoElectrocution(args.Target, null, (int) MathF.Round(5f * psionic.Amplification), new TimeSpan((long) MathF.Round(1f * psionic.Amplification)), true, ignoreInsulation: true); + _electrocution.TryDoElectrocution(args.Target, null, + (int) MathF.Round(5f * psionic.Amplification), + new TimeSpan((long) MathF.Round(1f * psionic.Amplification)), + true, + ignoreInsulation: true); + _statusEffectsSystem.TryAddStatusEffect(args.Target, "Stutter", TimeSpan.FromSeconds(2 * psionic.Amplification), false, "StutteringAccent"); - _psionics.LogPowerUsed(args.Performer, "noopsheric zap", (int) MathF.Round(psionic.Dampening * -4), (int) MathF.Round(psionic.Dampening * -6)); + _psionics.LogPowerUsed(args.Performer, "noopsheric zap", + (int) MathF.Round(6 * psionic.Amplification - psionic.Dampening), + (int) MathF.Round(8 * psionic.Amplification - psionic.Dampening)); args.Handled = true; } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs similarity index 99% rename from Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs rename to Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs index 860b7baab21..1bfacb0f119 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs @@ -16,7 +16,7 @@ using Content.Shared.Examine; using static Content.Shared.Examine.ExamineSystemShared; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class PsionicAbilitiesSystem : EntitySystem { diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs similarity index 84% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs rename to Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index af2ae0c7f05..77690c49f48 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -14,8 +14,9 @@ using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Throwing; using Robust.Shared.Timing; +using Content.Shared.Psionics; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class PsionicInvisibilityPowerSystem : EntitySystem { @@ -40,6 +41,7 @@ public override void Initialize() SubscribeLocalEvent(OnAttackAttempt); SubscribeLocalEvent(OnShootAttempt); SubscribeLocalEvent(OnThrowAttempt); + SubscribeLocalEvent(OnInsulated); } private void OnInit(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentInit args) @@ -71,6 +73,12 @@ private void OnShutdown(EntityUid uid, PsionicInvisibilityPowerComponent compone private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityPowerActionEvent args) { + if (!TryComp(uid, out var psionic)) + return; + + if (HasComp(uid)) + return; + var ev = new PsionicInvisibilityTimerEvent(_gameTiming.CurTime); var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseTimer, ev, uid) { Hidden = true }; _doAfterSystem.TryStartDoAfter(doAfterArgs); @@ -78,11 +86,13 @@ private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent compon ToggleInvisibility(args.Performer); var action = Spawn(PsionicInvisibilityUsedComponent.PsionicInvisibilityUsedActionPrototype); _actions.AddAction(uid, action, action); - _actions.TryGetActionData( action, out var actionData ); + _actions.TryGetActionData(action, out var actionData); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(action); - _psionics.LogPowerUsed(uid, "psionic invisibility"); + _psionics.LogPowerUsed(uid, "psionic invisibility", + (int) MathF.Round(8 * psionic.Amplification - 2 * psionic.Dampening), + (int) MathF.Round(12 * psionic.Amplification - 2 * psionic.Dampening)); args.Handled = true; } @@ -132,11 +142,14 @@ private void OnThrowAttempt(EntityUid uid, PsionicInvisibilityUsedComponent comp } private void OnDamageChanged(EntityUid uid, PsionicInvisibilityUsedComponent component, DamageChangedEvent args) { + if (!TryComp(uid, out var psionic)) + return; + if (!args.DamageIncreased) return; ToggleInvisibility(uid); - _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(4), false); + _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(4f / psionic.Dampening + psionic.Amplification), false); } public void ToggleInvisibility(EntityUid uid) { @@ -153,5 +166,14 @@ public void OnDoAfter(EntityUid uid, PsionicInvisibilityPowerComponent component { RemComp(uid); } + + private void OnInsulated(EntityUid uid, PsionicInvisibilityUsedComponent component, PsionicInsulationEvent args) + { + if (!TryComp(uid, out var psionic)) + return; + + RemComp(uid); + _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(4f / psionic.Dampening + psionic.Amplification), false); + } } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs similarity index 86% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs rename to Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index 707e8d61298..995bebb0fbe 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -17,7 +17,7 @@ using Content.Shared.Actions.Events; using Robust.Server.Audio; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class PsionicRegenerationPowerSystem : EntitySystem { @@ -28,7 +28,6 @@ public sealed class PsionicRegenerationPowerSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { @@ -51,11 +50,16 @@ private void OnInit(EntityUid uid, PsionicRegenerationPowerComponent component, { psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.RegenerationFeedback); + psionic.Amplification += 0.5f; + psionic.Dampening += 0.5f; } } private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationPowerActionEvent args) { + if (!TryComp(uid, out var psionic)) + return; + var ev = new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime); var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseDelay, ev, uid); @@ -72,12 +76,16 @@ private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent compon _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-begin", ("entity", uid)), uid, // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !_examine.InRangeUnOccluded(uid, entity, ExamineRange, null)), + Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), true, PopupType.Medium); _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); - _psionics.LogPowerUsed(uid, "psionic regeneration"); + + _psionics.LogPowerUsed(uid, "psionic regeneration", + (int) Math.Round(6 * psionic.Amplification - psionic.Dampening), + (int) Math.Round(8 * psionic.Amplification - psionic.Dampening)); + args.Handled = true; } @@ -90,6 +98,9 @@ private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent compon /// private void OnMobStateChangedEvent(EntityUid uid, PsionicRegenerationPowerComponent component, MobStateChangedEvent args) { + if (!TryComp(uid, out var psionic)) + return; + if (HasComp(uid)) return; @@ -114,11 +125,15 @@ private void OnMobStateChangedEvent(EntityUid uid, PsionicRegenerationPowerCompo _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-self-revive", ("entity", uid)), uid, // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !_examine.InRangeUnOccluded(uid, entity, ExamineRange, null)), + Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), true, PopupType.MediumCaution); _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); - _psionics.LogPowerUsed(uid, "psionic regeneration", 20, 40); + + _psionics.LogPowerUsed(uid, "psionic regeneration", + (int) Math.Round(10 * psionic.Amplification - 2 * psionic.Dampening), + (int) Math.Round(20 * psionic.Amplification - 2 * psionic.Dampening)); + _actions.StartUseDelay(component.PsionicRegenerationActionEntity); } } @@ -132,6 +147,8 @@ private void OnShutdown(EntityUid uid, PsionicRegenerationPowerComponent compone { psionic.ActivePowers.Remove(component); psionic.PsychicFeedback.Remove(component.RegenerationFeedback); + psionic.Amplification += 0.5f; + psionic.Dampening -= 0.5f; } } @@ -150,6 +167,9 @@ private void OnDoAfter(EntityUid uid, PsionicRegenerationPowerComponent componen { component.DoAfter = null; + if (!TryComp(uid, out var psionic)) + return; + if (!TryComp(uid, out var stream)) return; @@ -160,12 +180,12 @@ private void OnDoAfter(EntityUid uid, PsionicRegenerationPowerComponent componen var percentageComplete = Math.Min(1f, (_gameTiming.CurTime - args.StartedAt).TotalSeconds / component.UseDelay); var solution = new Solution(); - solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(component.EssenceAmount * percentageComplete)); + solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(component.EssenceAmount * percentageComplete + 10f * psionic.Dampening)); _bloodstreamSystem.TryAddToChemicals(uid, solution, stream); if (component.SelfRevive == true) { var critSolution = new Solution(); - critSolution.AddReagent("Epinephrine", 10); + critSolution.AddReagent("Epinephrine", MathF.MinMagnitude(5 + 5 * psionic.Dampening, 15)); _bloodstreamSystem.TryAddToChemicals(uid, critSolution, stream); component.SelfRevive = false; } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs similarity index 50% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs rename to Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs index 8300b204dca..d93b17f55cc 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -1,24 +1,20 @@ using Content.Shared.Actions; using Content.Shared.Abilities.Psionics; using Content.Server.Atmos.Components; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Popups; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Server.Mind; +using Content.Server.Weapons.Ranged.Systems; +using Robust.Server.GameObjects; using Content.Shared.Actions.Events; +using Content.Server.Explosion.Components; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class PyrokinesisPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly FlammableSystem _flammableSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly GunSystem _gunSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; + [Dependency] private readonly PhysicsSystem _physics = default!; public override void Initialize() { @@ -30,14 +26,15 @@ public override void Initialize() private void OnInit(EntityUid uid, PyrokinesisPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.PyrokinesisActionEntity, component.PyrokinesisActionId ); - _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData ); + _actions.AddAction(uid, ref component.PyrokinesisActionEntity, component.PyrokinesisActionId); + _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.PyrokinesisActionEntity); if (TryComp(uid, out var psionic)) { psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.PyrokinesisFeedback); + psionic.Amplification += 1f; } } @@ -48,20 +45,39 @@ private void OnShutdown(EntityUid uid, PyrokinesisPowerComponent component, Comp { psionic.ActivePowers.Remove(component); psionic.PsychicFeedback.Remove(component.PyrokinesisFeedback); + psionic.Amplification += 1f; } } private void OnPowerUsed(PyrokinesisPowerActionEvent args) { - if (!TryComp(args.Target, out var flammableComponent)) + if (!TryComp(args.Performer, out var psionic)) return; - flammableComponent.FireStacks += 5; - _flammableSystem.Ignite(args.Target, args.Target); - _popupSystem.PopupEntity(Loc.GetString("pyrokinesis-power-used", ("target", args.Target)), args.Target, Shared.Popups.PopupType.LargeCaution); + if (!HasComp(args.Performer)) + { + var ent = Spawn("ProjectileAnomalyFireball"); + + if (TryComp(ent, out var fireball)) + { + fireball.MaxIntensity = (int) MathF.Round(20 * psionic.Amplification - 10 * psionic.Dampening); + + if (psionic.Amplification > 5 && EnsureComp(ent, out var ignite)) + { + ignite.FireStacks = 0.1f * psionic.Amplification - 0.1f * psionic.Dampening; + } + } - _psionics.LogPowerUsed(args.Performer, "pyrokinesis"); - args.Handled = true; + var userVelocity = _physics.GetMapLinearVelocity(args.Performer); + var direction = args.Target.ToMapPos(EntityManager, _transformSystem); + + _gunSystem.ShootProjectile(ent, direction, userVelocity, args.Performer, args.Performer, 20f); + + _psionics.LogPowerUsed(args.Performer, "pyrokinesis", + (int) MathF.Round(6f * psionic.Amplification - psionic.Dampening), + (int) MathF.Round(8f * psionic.Amplification - psionic.Dampening)); + args.Handled = true; + } } } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs similarity index 52% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs rename to Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs index 00d06e6dd28..aa0f5487c08 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -1,23 +1,17 @@ using Content.Shared.Actions; -using Content.Shared.StatusEffect; using Content.Shared.Abilities.Psionics; using Content.Shared.Mind.Components; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Server.Mind; using Content.Shared.Actions.Events; +using Content.Shared.Mobs; +using Content.Shared.Storage.Components; -namespace Content.Server.Abilities.Psionics +namespace Content.Server.Psionics.Abilities { public sealed class TelegnosisPowerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly MindSwapPowerSystem _mindSwap = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { @@ -26,6 +20,9 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnPowerUsed); SubscribeLocalEvent(OnMindRemoved); + SubscribeLocalEvent(OnDispelled); + SubscribeLocalEvent(OnMobstateChanged); + SubscribeLocalEvent(OnStorageInsertAttempt); } private void OnInit(EntityUid uid, TelegnosisPowerComponent component, ComponentInit args) @@ -38,6 +35,8 @@ private void OnInit(EntityUid uid, TelegnosisPowerComponent component, Component { psionic.ActivePowers.Add(component); psionic.PsychicFeedback.Add(component.TelegnosisFeedback); + psionic.Amplification += 0.3f; + psionic.Dampening += 0.3f; } } @@ -48,21 +47,60 @@ private void OnShutdown(EntityUid uid, TelegnosisPowerComponent component, Compo { psionic.ActivePowers.Remove(component); psionic.PsychicFeedback.Remove(component.TelegnosisFeedback); + psionic.Amplification -= 0.3f; + psionic.Dampening -= 0.3f; } } private void OnPowerUsed(EntityUid uid, TelegnosisPowerComponent component, TelegnosisPowerActionEvent args) { + if (!TryComp(uid, out var psionic)) + return; + + if (HasComp(uid)) + return; + var projection = Spawn(component.Prototype, Transform(uid).Coordinates); Transform(projection).AttachToGridOrMap(); + component.OriginalEntity = uid; + component.IsProjecting = true; + component.ProjectionUid = projection; _mindSwap.Swap(uid, projection); - _psionics.LogPowerUsed(uid, "telegnosis"); + if (EnsureComp(projection, out var projectionComponent)) + projectionComponent.OriginalEntity = uid; + + _psionics.LogPowerUsed(uid, "telegnosis", + (int) Math.Round(8f * psionic.Amplification - psionic.Dampening), + (int) Math.Round(12f * psionic.Amplification - psionic.Dampening)); + args.Handled = true; } private void OnMindRemoved(EntityUid uid, TelegnosticProjectionComponent component, MindRemovedMessage args) { + if (TryComp(component.OriginalEntity, out var originalEntity)) + originalEntity.IsProjecting = false; + QueueDel(uid); } + + private void OnDispelled(EntityUid uid, TelegnosisPowerComponent component, DispelledEvent args) + { + if (component.IsProjecting) + _mindSwap.Swap(uid, component.ProjectionUid); + } + + private void OnMobstateChanged(EntityUid uid, TelegnosisPowerComponent component, MobStateChangedEvent args) + { + if (component.IsProjecting && args.NewMobState is MobState.Critical + || component.IsProjecting && args.NewMobState is MobState.Dead) + _mindSwap.Swap(uid, component.ProjectionUid); + } + + private void OnStorageInsertAttempt(EntityUid uid, TelegnosisPowerComponent component, InsertIntoEntityStorageAttemptEvent args) + { + if (component.IsProjecting) + _mindSwap.Swap(uid, component.ProjectionUid); + } } } diff --git a/Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs b/Content.Server/Psionics/AcceptPsionicsEui.cs similarity index 95% rename from Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs rename to Content.Server/Psionics/AcceptPsionicsEui.cs index 80fd8946f28..7c652664c64 100644 --- a/Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs +++ b/Content.Server/Psionics/AcceptPsionicsEui.cs @@ -1,7 +1,7 @@ using Content.Shared.Psionics; using Content.Shared.Eui; using Content.Server.EUI; -using Content.Server.Abilities.Psionics; +using Content.Server.Psionics.Abilities; namespace Content.Server.Psionics { diff --git a/Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs b/Content.Server/Psionics/AntiPsychicWeaponComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs rename to Content.Server/Psionics/AntiPsychicWeaponComponent.cs diff --git a/Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs b/Content.Server/Psionics/Audio/GlimmerSoundComponent.cs similarity index 80% rename from Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs rename to Content.Server/Psionics/Audio/GlimmerSoundComponent.cs index 850be3e831c..9a6c62381be 100644 --- a/Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs +++ b/Content.Server/Psionics/Audio/GlimmerSoundComponent.cs @@ -2,12 +2,8 @@ using Content.Shared.Audio; using Content.Shared.Psionics.Glimmer; using Robust.Shared.Audio; -using Robust.Shared.ComponentTrees; -using Robust.Shared.GameStates; -using Robust.Shared.Physics; -using Robust.Shared.Serialization; -namespace Content.Server.Audio +namespace Content.Server.Psionics.Audio { [RegisterComponent] [Access(typeof(SharedAmbientSoundSystem), typeof(GlimmerReactiveSystem))] diff --git a/Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs b/Content.Server/Psionics/Dreams/DreamSystem.cs similarity index 98% rename from Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs rename to Content.Server/Psionics/Dreams/DreamSystem.cs index d6067717c94..15e1593a859 100644 --- a/Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs +++ b/Content.Server/Psionics/Dreams/DreamSystem.cs @@ -4,7 +4,6 @@ using Content.Server.Chat.Managers; using Robust.Shared.Random; using Robust.Shared.Prototypes; -using Robust.Server.GameObjects; using Robust.Shared.Player; namespace Content.Server.Psionics.Dreams diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs b/Content.Server/Psionics/Glimmer/GlimmerCommands.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs rename to Content.Server/Psionics/Glimmer/GlimmerCommands.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs rename to Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs similarity index 94% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs rename to Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs index f0da85ce453..57c74398b08 100644 --- a/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs +++ b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs @@ -4,7 +4,6 @@ using Content.Shared.CCVar; using Content.Shared.Psionics.Glimmer; using Content.Shared.GameTicking; -using Content.Server.CartridgeLoader.Cartridges; namespace Content.Server.Psionics.Glimmer { @@ -17,7 +16,6 @@ public sealed class PassiveGlimmerReductionSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; - [Dependency] private readonly GlimmerMonitorCartridgeSystem _cartridgeSys = default!; /// List of glimmer values spaced by minute. public List GlimmerValues = new(); diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs similarity index 98% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs index 1c9cb55f2dd..f85460a69f5 100644 --- a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs +++ b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics; using Content.Server.Abilities.Psionics; using Content.Shared.Eye; using Content.Server.NPC.Systems; @@ -44,6 +45,8 @@ private void OnInit(EntityUid uid, PotentialPsionicComponent component, Componen /// private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, ComponentInit args) { + RaiseLocalEvent(uid, new PsionicInsulationEvent()); + if (HasComp(uid)) _invisSystem.ToggleInvisibility(uid); diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs b/Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs rename to Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs b/Content.Server/Psionics/PotentialPsionicComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs rename to Content.Server/Psionics/PotentialPsionicComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs b/Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs rename to Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs b/Content.Server/Psionics/PsionicBonusChanceComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs rename to Content.Server/Psionics/PsionicBonusChanceComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs b/Content.Server/Psionics/PsionicsCommands.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs rename to Content.Server/Psionics/PsionicsCommands.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs similarity index 79% rename from Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs rename to Content.Server/Psionics/PsionicsSystem.cs index 9da293df0b5..7920a09844a 100644 --- a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -4,13 +4,14 @@ using Content.Shared.Weapons.Melee.Events; using Content.Shared.Damage.Events; using Content.Shared.CCVar; -using Content.Server.Abilities.Psionics; +using Content.Server.Psionics.Abilities; using Content.Server.Electrocution; using Content.Server.NPC.Components; using Content.Server.NPC.Systems; using Robust.Shared.Audio.Systems; using Robust.Shared.Configuration; using Robust.Shared.Random; +using Content.Shared.Psionics; namespace Content.Server.Psionics { @@ -49,6 +50,9 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); + + SubscribeLocalEvent(OnInnatePsiInit); + SubscribeLocalEvent(OnInnatePsiShutdown); } private void OnStartup(EntityUid uid, PotentialPsionicComponent component, MapInitEvent args) @@ -84,6 +88,16 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) { + component.Amplification = _random.NextFloat(0.3f, 1.2f); + component.Dampening = _random.NextFloat(0.3f, 1.2f); + + if (TryComp(uid, out var innatePsicaster)) + { + component.Amplification += innatePsicaster.Amplification; + component.Dampening += innatePsicaster.Dampening; + component.InnatePsiChecked = true; + } + if (!component.Removable) return; @@ -98,7 +112,7 @@ private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit arg private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove args) { - if (!TryComp(uid, out var factions)) + if (!HasComp(uid)) return; _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); @@ -138,7 +152,7 @@ public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, boo } if (applyGlimmer) - chance += ((float) _glimmerSystem.Glimmer / 1000); + chance += (float) _glimmerSystem.Glimmer / 1000; chance *= multiplier; @@ -159,5 +173,24 @@ public void RerollPsionics(EntityUid uid, PotentialPsionicComponent? psionic = n RollPsionics(uid, psionic, multiplier: bonusMuliplier); psionic.Rerolled = true; } + + private void OnInnatePsiInit(EntityUid uid, InnatePsicasterComponent component, ComponentInit args) + { + if (EnsureComp(uid, out var psionic) && !psionic.InnatePsiChecked) + { + psionic.Amplification += component.Amplification; + psionic.Dampening += component.Dampening; + psionic.InnatePsiChecked = true; + } + } + + private void OnInnatePsiShutdown(EntityUid uid, InnatePsicasterComponent component, ComponentShutdown args) + { + if (TryComp(uid, out var psionic)) + { + psionic.Amplification -= component.Amplification; + psionic.Dampening -= component.Amplification; + } + } } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs index 2f86615b836..a4fc8b632ca 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs @@ -12,7 +12,7 @@ public sealed partial class PsionicRegenerationPowerComponent : Component public DoAfterId? DoAfter; [DataField("essence")] - public float EssenceAmount = 20; + public float EssenceAmount = 10; [DataField("useDelay")] public float UseDelay = 8f; diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs index cd298c3ec0f..e1a523c50d3 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs @@ -22,5 +22,8 @@ public sealed partial class TelegnosisPowerComponent : Component [DataField("telegnosisFeedback")] public string TelegnosisFeedback = "telegnosis-feedback"; + public EntityUid OriginalEntity = default!; + public EntityUid ProjectionUid = default!; + public bool IsProjecting = false; } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs index 9d627cb42d8..93359f2758c 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs @@ -2,5 +2,7 @@ namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class TelegnosticProjectionComponent : Component - {} -} \ No newline at end of file + { + public EntityUid OriginalEntity = default!; + } +} diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs index 7c7befa33c3..cdccee393c4 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs @@ -20,9 +20,11 @@ public sealed partial class PsionicComponent : Component public List PsychicFeedback= new(); [DataField("amplification")] - public float Amplification = 1f; + public float Amplification = default!; [DataField("dampening")] - public float Dampening = 1f; + public float Dampening = default!; + public bool Telepath = false; + public bool InnatePsiChecked = false; } } diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs index 896ec0bb63d..4639aadd55b 100644 --- a/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs +++ b/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs @@ -1,2 +1,4 @@ namespace Content.Shared.Actions.Events; -public sealed partial class PyrokinesisPowerActionEvent : EntityTargetActionEvent {} +public sealed partial class PyrokinesisPowerActionEvent : WorldTargetActionEvent {} + + diff --git a/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs b/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs index c59f98db7f0..5c89f39354c 100644 --- a/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs +++ b/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs @@ -1,19 +1,4 @@ -using Content.Shared.Abilities.Psionics; - namespace Content.Shared.Psionics { - public sealed class PsionicInsulationSystem : EntitySystem - { - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInsulated); - } - - public void OnInsulated(EntityUid uid, PsionicInsulationComponent component, ComponentInit args) - { - RaiseLocalEvent(uid, new PsionicInsulationEvent()); - } - } public readonly record struct PsionicInsulationEvent; } diff --git a/Resources/Prototypes/Nyanotrasen/Actions/types.yml b/Resources/Prototypes/Nyanotrasen/Actions/types.yml index 376d92e3efb..71a92ec4516 100644 --- a/Resources/Prototypes/Nyanotrasen/Actions/types.yml +++ b/Resources/Prototypes/Nyanotrasen/Actions/types.yml @@ -94,7 +94,7 @@ description: action-description-pyrokinesis noSpawn: true components: - - type: EntityTargetAction + - type: WorldTargetAction icon: Nyanotrasen/Interface/VerbIcons/pyrokinesis.png useDelay: 50 range: 6 diff --git a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml index cb3f88d6a4a..b577d419e38 100644 --- a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml +++ b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml @@ -9,3 +9,4 @@ PsionicInvisibilityPower: 0.15 MindSwapPower: 0.15 NoosphericZapPower: 0.15 + PyrokinesisPower: 0.15 From 4e919eea09ea3888d0b43b26ee635126c929af05 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 20:23:41 -0400 Subject: [PATCH 21/79] guh --- Content.Server/Psionics/PsionicsSystem.cs | 33 ++----------------- .../Abilities/Psionics/PsionicComponent.cs | 4 +-- 2 files changed, 4 insertions(+), 33 deletions(-) diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index 7920a09844a..06d0a51c84d 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -50,9 +50,6 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); - - SubscribeLocalEvent(OnInnatePsiInit); - SubscribeLocalEvent(OnInnatePsiShutdown); } private void OnStartup(EntityUid uid, PotentialPsionicComponent component, MapInitEvent args) @@ -88,15 +85,8 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) { - component.Amplification = _random.NextFloat(0.3f, 1.2f); - component.Dampening = _random.NextFloat(0.3f, 1.2f); - - if (TryComp(uid, out var innatePsicaster)) - { - component.Amplification += innatePsicaster.Amplification; - component.Dampening += innatePsicaster.Dampening; - component.InnatePsiChecked = true; - } + component.Amplification = _random.NextFloat(0.3f, 1.1f); + component.Dampening = _random.NextFloat(0.3f, 1.1f); if (!component.Removable) return; @@ -173,24 +163,5 @@ public void RerollPsionics(EntityUid uid, PotentialPsionicComponent? psionic = n RollPsionics(uid, psionic, multiplier: bonusMuliplier); psionic.Rerolled = true; } - - private void OnInnatePsiInit(EntityUid uid, InnatePsicasterComponent component, ComponentInit args) - { - if (EnsureComp(uid, out var psionic) && !psionic.InnatePsiChecked) - { - psionic.Amplification += component.Amplification; - psionic.Dampening += component.Dampening; - psionic.InnatePsiChecked = true; - } - } - - private void OnInnatePsiShutdown(EntityUid uid, InnatePsicasterComponent component, ComponentShutdown args) - { - if (TryComp(uid, out var psionic)) - { - psionic.Amplification -= component.Amplification; - psionic.Dampening -= component.Amplification; - } - } } } diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs index cdccee393c4..e1574485074 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs @@ -20,10 +20,10 @@ public sealed partial class PsionicComponent : Component public List PsychicFeedback= new(); [DataField("amplification")] - public float Amplification = default!; + public float Amplification = 0.1f; [DataField("dampening")] - public float Dampening = default!; + public float Dampening = 0.1f; public bool Telepath = false; public bool InnatePsiChecked = false; } From ca07c5cd9d2ae5584e7d4d5405689c0fb3de1bcf Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 20:36:35 -0400 Subject: [PATCH 22/79] More migrations --- Content.Server/Psionics/Abilities/DispelPowerSystem.cs | 2 +- Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs | 2 +- Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs | 2 +- Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs | 2 +- Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs | 2 +- .../Psionics/Abilities/PsionicInvisibilityPowerSystem.cs | 2 +- .../Psionics/Abilities/PsionicRegenerationPowerSystem.cs | 2 +- Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs | 2 +- Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs | 2 +- Content.Server/Psionics/PsionicsSystem.cs | 2 +- .../Psionics/Abilities/AcceptPsionicsEuiMessage.cs | 0 .../Psionics/Abilities/Dispel/DamageOnDispelComponent.cs | 2 +- .../Psionics/Abilities/Dispel/DispelPowerComponent.cs | 2 +- .../Psionics/Abilities/Dispel/DispellableComponent.cs | 2 +- .../Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs | 2 +- .../Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs | 2 +- .../Abilities/Metapsionics/MetapsionicPowerComponent.cs | 2 +- .../Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs | 2 +- .../Abilities/NoosphericZap/NoosphericZapPowerComponent.cs | 2 +- .../PsionicInvisibility/PsionicInvisibilityPowerComponent.cs | 2 +- .../PsionicInvisibility/PsionicInvisibilityUsedComponent.cs | 3 ++- .../PsionicRegeneration/PsionicRegenerationPowerComponent.cs | 2 +- .../Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs | 2 +- .../Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs | 2 +- .../Abilities/Telegnosis/TelegnosticProjectionComponent.cs | 2 +- Content.Shared/{Nyanotrasen => }/Psionics/Events.cs | 0 .../{Nyanotrasen => }/Psionics/Glimmer/GlimmerSystem.cs | 0 .../Psionics/Glimmer/SharedGlimmerReactiveComponent.cs | 0 .../Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs | 0 .../Psionics/Items/ClothingGrantPsionicPowerComponent.cs | 2 +- .../Abilities => }/Psionics/Items/HeadCageComponent.cs | 2 +- .../Abilities => }/Psionics/Items/HeadCagedComponent.cs | 2 +- .../Abilities => }/Psionics/Items/PsionicItemsSystem.cs | 2 +- .../Abilities => }/Psionics/Items/TinfoilHatComponent.cs | 2 +- .../{Nyanotrasen/Abilities => }/Psionics/PsionicComponent.cs | 2 +- .../Abilities => }/Psionics/PsionicInsulationComponent.cs | 2 +- .../Abilities => }/Psionics/PsionicsDisabledComponent.cs | 2 +- .../Abilities => }/Psionics/SharedPsionicAbilitiesSystem.cs | 3 ++- .../Psionics/SharedPsionicSystem.Insulated.cs | 0 39 files changed, 35 insertions(+), 33 deletions(-) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/AcceptPsionicsEuiMessage.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs (89%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DispelPowerComponent.cs (93%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DispellableComponent.cs (69%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs (93%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs (98%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs (96%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs (93%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs (93%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs (94%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs (94%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs (96%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs (94%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs (96%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs (79%) rename Content.Shared/{Nyanotrasen => }/Psionics/Events.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/GlimmerSystem.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/ClothingGrantPsionicPowerComponent.cs (84%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/HeadCageComponent.cs (96%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/HeadCagedComponent.cs (81%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/PsionicItemsSystem.cs (98%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/TinfoilHatComponent.cs (90%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicComponent.cs (95%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicInsulationComponent.cs (82%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicsDisabledComponent.cs (84%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/SharedPsionicAbilitiesSystem.cs (98%) rename Content.Shared/{Nyanotrasen => }/Psionics/SharedPsionicSystem.Insulated.cs (100%) diff --git a/Content.Server/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Psionics/Abilities/DispelPowerSystem.cs index 14e3ea14aeb..cb7ef8313cd 100644 --- a/Content.Server/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/DispelPowerSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Actions; using Content.Shared.StatusEffect; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Damage; using Content.Shared.Revenant.Components; using Content.Server.Guardian; diff --git a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs index 6279aa88622..c30abd84f57 100644 --- a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Actions; using Content.Shared.Actions.Events; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.DoAfter; using Content.Shared.Examine; using static Content.Shared.Examine.ExamineSystemShared; diff --git a/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs index 0beea77aa53..1e50a586b4f 100644 --- a/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs @@ -1,5 +1,5 @@ using Content.Shared.Actions; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Psionics; using Content.Shared.Speech; using Content.Shared.Stealth.Components; diff --git a/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs index 7e4ba64afde..ce55cb3bb7d 100644 --- a/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -1,5 +1,5 @@ using Content.Shared.Actions; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.StatusEffect; using Content.Server.Electrocution; using Content.Server.Stunnable; diff --git a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs index 1bfacb0f119..74e6ed3b091 100644 --- a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Actions; using Content.Shared.Psionics.Glimmer; using Content.Shared.Random; diff --git a/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index 77690c49f48..9422dfb9acf 100644 --- a/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -1,6 +1,6 @@ using Content.Server.DoAfter; using Content.Shared.Actions; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Damage; using Content.Shared.DoAfter; using Content.Shared.Stunnable; diff --git a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index 995bebb0fbe..e6ef1ac6d73 100644 --- a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -3,7 +3,7 @@ using Content.Server.Body.Components; using Content.Server.Body.Systems; using Content.Server.DoAfter; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Actions; using Content.Shared.Chemistry.Components; using Content.Shared.DoAfter; diff --git a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs index d93b17f55cc..444675d9b3f 100644 --- a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -1,5 +1,5 @@ using Content.Shared.Actions; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Server.Atmos.Components; using Content.Server.Weapons.Ranged.Systems; using Robust.Server.GameObjects; diff --git a/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs index aa0f5487c08..f03b001fc70 100644 --- a/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -1,5 +1,5 @@ using Content.Shared.Actions; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Mind.Components; using Content.Shared.Actions.Events; using Content.Shared.Mobs; diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index 06d0a51c84d..f2cb8754326 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.StatusEffect; using Content.Shared.Psionics.Glimmer; using Content.Shared.Weapons.Melee.Events; diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs b/Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs rename to Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs similarity index 89% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs index ce86111fc4b..89168d2b259 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs +++ b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs @@ -1,6 +1,6 @@ using Content.Shared.Damage; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { /// /// Takes damage when dispelled. diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs similarity index 93% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs index 837bdd96a87..1426712cf94 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class DispelPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs similarity index 69% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs index 40352004187..4bb5ee653d2 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs +++ b/Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class DispellableComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs similarity index 93% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs rename to Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs index c092cacd8b8..dcd1d2c1c42 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class MassSleepPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs similarity index 98% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs rename to Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs index e36a3c70e8a..1f2f6954e77 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs +++ b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs @@ -8,7 +8,7 @@ using Content.Shared.Mind; using Content.Shared.Actions.Events; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { public sealed class MassSleepPowerSystem : EntitySystem { diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs similarity index 96% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs index 0e12d05dead..8570668f744 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs @@ -4,7 +4,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class MetapsionicPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs b/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs similarity index 93% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs rename to Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs index e617c48cf2d..94b73c41e38 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class MindSwapPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs b/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs similarity index 93% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs rename to Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs index 24c144079e4..997db65e1b1 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class NoosphericZapPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs similarity index 94% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs index 3b29a1e4367..d9c36f5b22a 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class PsionicInvisibilityPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs similarity index 94% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs index 9037b8bcdfe..2a9dd7642ba 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs +++ b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs @@ -1,6 +1,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics + +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class PsionicInvisibilityUsedComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs similarity index 96% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs index a4fc8b632ca..3184bf7de5b 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class PsionicRegenerationPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs b/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs similarity index 94% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs index d2af000e269..1f88741b9a9 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class PyrokinesisPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs similarity index 96% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs index e1a523c50d3..f1a71332b18 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class TelegnosisPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs similarity index 79% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs rename to Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs index 93359f2758c..bc18ff9f3c2 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs +++ b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class TelegnosticProjectionComponent : Component diff --git a/Content.Shared/Nyanotrasen/Psionics/Events.cs b/Content.Shared/Psionics/Events.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Events.cs rename to Content.Shared/Psionics/Events.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs b/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs rename to Content.Shared/Psionics/Glimmer/GlimmerSystem.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs b/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs rename to Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs b/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs rename to Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs b/Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs similarity index 84% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs rename to Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs index 4cbb05c8395..f09efc3064c 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs +++ b/Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class ClothingGrantPsionicPowerComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs b/Content.Shared/Psionics/Items/HeadCageComponent.cs similarity index 96% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs rename to Content.Shared/Psionics/Items/HeadCageComponent.cs index acaa832860f..c03241e47c7 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs +++ b/Content.Shared/Psionics/Items/HeadCageComponent.cs @@ -1,7 +1,7 @@ using System.Threading; using Robust.Shared.Audio; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class HeadCageComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs b/Content.Shared/Psionics/Items/HeadCagedComponent.cs similarity index 81% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs rename to Content.Shared/Psionics/Items/HeadCagedComponent.cs index f8af46b8878..0f826f7a05e 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs +++ b/Content.Shared/Psionics/Items/HeadCagedComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] /// diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs b/Content.Shared/Psionics/Items/PsionicItemsSystem.cs similarity index 98% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs rename to Content.Shared/Psionics/Items/PsionicItemsSystem.cs index f88acf61f3c..950353c5dfb 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs +++ b/Content.Shared/Psionics/Items/PsionicItemsSystem.cs @@ -2,7 +2,7 @@ using Content.Shared.Clothing.Components; using Content.Shared.StatusEffect; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { public sealed class PsionicItemsSystem : EntitySystem { diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs b/Content.Shared/Psionics/Items/TinfoilHatComponent.cs similarity index 90% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs rename to Content.Shared/Psionics/Items/TinfoilHatComponent.cs index 5086b9f4977..6ef7bdc823b 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs +++ b/Content.Shared/Psionics/Items/TinfoilHatComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class TinfoilHatComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs b/Content.Shared/Psionics/PsionicComponent.cs similarity index 95% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs rename to Content.Shared/Psionics/PsionicComponent.cs index e1574485074..76e629f0839 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs +++ b/Content.Shared/Psionics/PsionicComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent, NetworkedComponent] public sealed partial class PsionicComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs b/Content.Shared/Psionics/PsionicInsulationComponent.cs similarity index 82% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs rename to Content.Shared/Psionics/PsionicInsulationComponent.cs index 12370da5ae4..2ab054b1f8f 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs +++ b/Content.Shared/Psionics/PsionicInsulationComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { [RegisterComponent] public sealed partial class PsionicInsulationComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs b/Content.Shared/Psionics/PsionicsDisabledComponent.cs similarity index 84% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs rename to Content.Shared/Psionics/PsionicsDisabledComponent.cs index 28e7157a9d2..00cf5506523 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs +++ b/Content.Shared/Psionics/PsionicsDisabledComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { /// /// Only use this for the status effect, please. diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs similarity index 98% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs rename to Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs index 2739d5ba31a..a4b283f59ce 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs +++ b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs @@ -4,10 +4,11 @@ using Content.Shared.Mobs.Components; using Content.Shared.Popups; using Content.Shared.Psionics.Glimmer; +using Content.Shared.Psionics.Abilities; using Robust.Shared.Random; using Robust.Shared.Serialization; -namespace Content.Shared.Abilities.Psionics +namespace Content.Shared.Psionics.Abilities { public sealed class SharedPsionicAbilitiesSystem : EntitySystem { diff --git a/Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs b/Content.Shared/Psionics/SharedPsionicSystem.Insulated.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/SharedPsionicSystem.Insulated.cs rename to Content.Shared/Psionics/SharedPsionicSystem.Insulated.cs From 2cbcfb9e36fd711c29090af4deee5d2dd52228ad Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 20:45:39 -0400 Subject: [PATCH 23/79] Final migrations --- .../Psionics/Glimmer/GlimmerReactiveVisuals.cs | 0 .../Chat => Psionics/Telepathy}/PsionicChatUpdateSystem.cs | 4 ++-- .../UI => Psionics/UserInterface}/AcceptPsionicsEUI.cs | 0 .../UI => Psionics/UserInterface}/AcceptPsionicsWindow.cs | 0 .../{Nyanotrasen => Psionics}/UserInterface/GlimmerGraph.cs | 2 +- Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs | 3 --- Content.Server/Psionics/PsionicsCommands.cs | 3 +-- Content.Server/Psionics/PsionicsSystem.cs | 1 - .../{Nyanotrasen/Chat => Psionics/Telepathy}/TSayCommand.cs | 2 +- .../Telepathy}/TelepathicRepeaterComponent.cs | 2 +- .../Telepathy/TelepathyChatSystem.cs} | 6 +++--- 11 files changed, 9 insertions(+), 14 deletions(-) rename Content.Client/{Nyanotrasen => }/Psionics/Glimmer/GlimmerReactiveVisuals.cs (100%) rename Content.Client/{Nyanotrasen/Chat => Psionics/Telepathy}/PsionicChatUpdateSystem.cs (92%) rename Content.Client/{Nyanotrasen/Psionics/UI => Psionics/UserInterface}/AcceptPsionicsEUI.cs (100%) rename Content.Client/{Nyanotrasen/Psionics/UI => Psionics/UserInterface}/AcceptPsionicsWindow.cs (100%) rename Content.Client/{Nyanotrasen => Psionics}/UserInterface/GlimmerGraph.cs (97%) rename Content.Server/{Nyanotrasen/Chat => Psionics/Telepathy}/TSayCommand.cs (96%) rename Content.Server/{Nyanotrasen/Chat => Psionics/Telepathy}/TelepathicRepeaterComponent.cs (82%) rename Content.Server/{Nyanotrasen/Chat/NyanoChatSystem.cs => Psionics/Telepathy/TelepathyChatSystem.cs} (97%) diff --git a/Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs b/Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs rename to Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs diff --git a/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs b/Content.Client/Psionics/Telepathy/PsionicChatUpdateSystem.cs similarity index 92% rename from Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs rename to Content.Client/Psionics/Telepathy/PsionicChatUpdateSystem.cs index 84602052fe7..7bb88764a1f 100644 --- a/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs +++ b/Content.Client/Psionics/Telepathy/PsionicChatUpdateSystem.cs @@ -1,8 +1,8 @@ -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Client.Chat.Managers; using Robust.Client.Player; -namespace Content.Client.Nyanotrasen.Chat +namespace Content.Client.Psionics.Chat { public sealed class PsionicChatUpdateSystem : EntitySystem { diff --git a/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs b/Content.Client/Psionics/UserInterface/AcceptPsionicsEUI.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs rename to Content.Client/Psionics/UserInterface/AcceptPsionicsEUI.cs diff --git a/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs b/Content.Client/Psionics/UserInterface/AcceptPsionicsWindow.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs rename to Content.Client/Psionics/UserInterface/AcceptPsionicsWindow.cs diff --git a/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs b/Content.Client/Psionics/UserInterface/GlimmerGraph.cs similarity index 97% rename from Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs rename to Content.Client/Psionics/UserInterface/GlimmerGraph.cs index c4a9109dcd8..111c810acb1 100644 --- a/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs +++ b/Content.Client/Psionics/UserInterface/GlimmerGraph.cs @@ -4,7 +4,7 @@ using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; -namespace Content.Client.Nyanotrasen.UserInterface; +namespace Content.Client.Psionics.UI; public sealed class GlimmerGraph : Control { diff --git a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs index 74e6ed3b091..b6ab74627d3 100644 --- a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs @@ -4,16 +4,13 @@ using Content.Shared.Random; using Content.Shared.Random.Helpers; using Content.Server.EUI; -using Content.Server.Psionics; using Content.Server.Mind; -using Content.Shared.Mind.Components; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; using Robust.Shared.Player; using Content.Shared.Examine; using Content.Shared.Popups; -using Content.Shared.Examine; using static Content.Shared.Examine.ExamineSystemShared; namespace Content.Server.Psionics.Abilities diff --git a/Content.Server/Psionics/PsionicsCommands.cs b/Content.Server/Psionics/PsionicsCommands.cs index 959251d1fb7..2eda2cd2bc8 100644 --- a/Content.Server/Psionics/PsionicsCommands.cs +++ b/Content.Server/Psionics/PsionicsCommands.cs @@ -1,9 +1,8 @@ using Content.Server.Administration; using Content.Shared.Administration; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Mobs.Components; using Robust.Shared.Console; -using Robust.Server.GameObjects; using Content.Shared.Actions; using Robust.Shared.Player; diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index f2cb8754326..5c10e4160ca 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -11,7 +11,6 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Configuration; using Robust.Shared.Random; -using Content.Shared.Psionics; namespace Content.Server.Psionics { diff --git a/Content.Server/Nyanotrasen/Chat/TSayCommand.cs b/Content.Server/Psionics/Telepathy/TSayCommand.cs similarity index 96% rename from Content.Server/Nyanotrasen/Chat/TSayCommand.cs rename to Content.Server/Psionics/Telepathy/TSayCommand.cs index 9ba27b65d71..378789ccbf9 100644 --- a/Content.Server/Nyanotrasen/Chat/TSayCommand.cs +++ b/Content.Server/Psionics/Telepathy/TSayCommand.cs @@ -5,7 +5,7 @@ using Robust.Shared.Enums; using Robust.Shared.Player; -namespace Content.Server.Chat.Commands +namespace Content.Server.Psionics.Telepathy { [AnyCommand] internal sealed class TSayCommand : IConsoleCommand diff --git a/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs b/Content.Server/Psionics/Telepathy/TelepathicRepeaterComponent.cs similarity index 82% rename from Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs rename to Content.Server/Psionics/Telepathy/TelepathicRepeaterComponent.cs index fc199f4332a..6e194f76c8f 100644 --- a/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs +++ b/Content.Server/Psionics/Telepathy/TelepathicRepeaterComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Nyanotrasen.Chat +namespace Content.Server.Psionics.Telepathy { /// /// Repeats whatever is happening in telepathic chat. diff --git a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs b/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs similarity index 97% rename from Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs rename to Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs index 62d8032df1d..565e7c7f0e6 100644 --- a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs +++ b/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs @@ -3,7 +3,7 @@ using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; using Content.Server.Psionics; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Bed.Sleep; using Content.Shared.Chat; using Content.Shared.Database; @@ -17,10 +17,10 @@ using System.Linq; using System.Text; -namespace Content.Server.Nyanotrasen.Chat +namespace Content.Server.Psionics.Telepathy { /// - /// Extensions for nyano's chat stuff + /// Extensions for Telepathic Chat /// public sealed class NyanoChatSystem : EntitySystem From 6bb70936a5e1104976b4195add47966ed1447d00 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 21:05:43 -0400 Subject: [PATCH 24/79] Last set of migrations --- .../GlimmerMonitor}/GlimmerMonitorUi.cs | 3 ++- .../GlimmerMonitor}/GlimmerMonitorUiFragment.xaml | 2 +- .../GlimmerMonitor}/GlimmerMonitorUiFragment.xaml.cs | 4 ++-- .../UserInterface/Systems/Chat/ChatUIController.cs | 9 ++++----- Content.Server/Abilities/Mime/MimePowersSystem.cs | 2 +- Content.Server/Anomaly/AnomalySystem.Psionics.cs | 4 ++-- Content.Server/Chat/Systems/ChatSystem.cs | 2 +- .../DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs | 2 +- .../Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs | 2 +- .../Nyanotrasen/Research/Oracle/OracleSystem.cs | 2 +- .../Research/SophicScribe/SophicScribeSystem.cs | 2 +- .../StationEvents/Events/GlimmerWispSpawnRule.cs | 2 +- .../Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs | 5 ++--- .../StationEvents/Events/NoosphericFryRule.cs | 2 +- .../StationEvents/Events/NoosphericStormRule.cs | 4 ++-- .../StationEvents/Events/NoosphericZapRule.cs | 2 +- .../StationEvents/Events/PsionicCatGotYourTongueRule.cs | 2 +- Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs | 2 +- .../Psionics/Invisibility/PsionicInvisibilitySystem.cs | 4 ++-- .../Singularity/EntitySystems/EventHorizonSystem.cs | 4 ++-- Content.Server/Zombies/ZombieSystem.Transform.cs | 2 +- 21 files changed, 31 insertions(+), 32 deletions(-) rename Content.Client/{Nyanotrasen/CartridgeLoader/Cartridges => Psionics/GlimmerMonitor}/GlimmerMonitorUi.cs (92%) rename Content.Client/{Nyanotrasen/CartridgeLoader/Cartridges => Psionics/GlimmerMonitor}/GlimmerMonitorUiFragment.xaml (93%) rename Content.Client/{Nyanotrasen/CartridgeLoader/Cartridges => Psionics/GlimmerMonitor}/GlimmerMonitorUiFragment.xaml.cs (96%) diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs b/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUi.cs similarity index 92% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs rename to Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUi.cs index 0b5fc7ad38c..0d8accb9f86 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs +++ b/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUi.cs @@ -1,10 +1,11 @@ using Robust.Client.GameObjects; using Robust.Client.UserInterface; +using Content.Client.Psionics.UI; using Content.Client.UserInterface.Fragments; using Content.Shared.CartridgeLoader.Cartridges; using Content.Shared.CartridgeLoader; -namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; +namespace Content.Client.Psionics.GlimmerMonitor; public sealed partial class GlimmerMonitorUi : UIFragment { diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml b/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml similarity index 93% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml rename to Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml index 119a1831e6e..3044680e27b 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml +++ b/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml @@ -1,4 +1,4 @@ - diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs b/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml.cs similarity index 96% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs rename to Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml.cs index 43d9202aa45..58bbee38a2f 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs +++ b/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml.cs @@ -1,12 +1,12 @@ using System.Linq; using System.Numerics; -using Content.Client.Nyanotrasen.UserInterface; +using Content.Client.Psionics.UI; using Robust.Client.AutoGenerated; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; +namespace Content.Client.Psionics.GlimmerMonitor; [GenerateTypedNameReferences] public sealed partial class GlimmerMonitorUiFragment : BoxContainer diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index 0ad78f974e5..57b22e3f333 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -20,7 +20,6 @@ using Content.Shared.Examine; using Content.Shared.Input; using Content.Shared.Radio; -using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Input; using Robust.Client.Player; @@ -37,7 +36,7 @@ using Robust.Shared.Replays; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Client.Nyanotrasen.Chat; //Nyano - Summary: chat namespace. +using Content.Client.Psionics.Chat; namespace Content.Client.UserInterface.Systems.Chat; @@ -61,7 +60,7 @@ public sealed class ChatUIController : UIController [UISystemDependency] private readonly GhostSystem? _ghost = default; [UISystemDependency] private readonly TypingIndicatorSystem? _typingIndicator = default; [UISystemDependency] private readonly ChatSystem? _chatSys = default; - [UISystemDependency] private readonly PsionicChatUpdateSystem? _psionic = default!; //Nyano - Summary: makes the psionic chat available. + [UISystemDependency] private readonly PsionicChatUpdateSystem? _psionic = default!; //EE - Summary: makes the psionic chat available. [ValidatePrototypeId] private const string ChatNamePalette = "ChatNames"; @@ -82,7 +81,7 @@ public sealed class ChatUIController : UIController {SharedChatSystem.AdminPrefix, ChatSelectChannel.Admin}, {SharedChatSystem.RadioCommonPrefix, ChatSelectChannel.Radio}, {SharedChatSystem.DeadPrefix, ChatSelectChannel.Dead}, - {SharedChatSystem.TelepathicPrefix, ChatSelectChannel.Telepathic} //Nyano - Summary: adds the telepathic prefix =. + {SharedChatSystem.TelepathicPrefix, ChatSelectChannel.Telepathic} //EE - Summary: adds the telepathic prefix =. }; public static readonly Dictionary ChannelPrefixes = new() @@ -96,7 +95,7 @@ public sealed class ChatUIController : UIController {ChatSelectChannel.Admin, SharedChatSystem.AdminPrefix}, {ChatSelectChannel.Radio, SharedChatSystem.RadioCommonPrefix}, {ChatSelectChannel.Dead, SharedChatSystem.DeadPrefix}, - {ChatSelectChannel.Telepathic, SharedChatSystem.TelepathicPrefix } //Nyano - Summary: associates telepathic with =. + {ChatSelectChannel.Telepathic, SharedChatSystem.TelepathicPrefix } //EE - Summary: associates telepathic with =. }; /// diff --git a/Content.Server/Abilities/Mime/MimePowersSystem.cs b/Content.Server/Abilities/Mime/MimePowersSystem.cs index c1d2643d6fa..3e7605a07d3 100644 --- a/Content.Server/Abilities/Mime/MimePowersSystem.cs +++ b/Content.Server/Abilities/Mime/MimePowersSystem.cs @@ -10,7 +10,7 @@ using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Timing; -using Content.Shared.Abilities.Psionics; //Nyano - Summary: Makes Mime psionic. +using Content.Shared.Psionics.Abilities; //EE - Summary: Makes Mime psionic. using Content.Shared.Speech.Muting; namespace Content.Server.Abilities.Mime diff --git a/Content.Server/Anomaly/AnomalySystem.Psionics.cs b/Content.Server/Anomaly/AnomalySystem.Psionics.cs index 95fda1d5035..3a5a55c0bdc 100644 --- a/Content.Server/Anomaly/AnomalySystem.Psionics.cs +++ b/Content.Server/Anomaly/AnomalySystem.Psionics.cs @@ -1,4 +1,4 @@ -using Content.Server.Abilities.Psionics; //Nyano - Summary: the psniocs bin where dispel is located. +using Content.Server.Psionics.Abilities; //EE - Summary: the psionics bin where dispel is located. using Content.Shared.Anomaly; using Content.Shared.Anomaly.Components; using Robust.Shared.Random; @@ -15,7 +15,7 @@ private void InitializePsionics() SubscribeLocalEvent(OnDispelled); } - //Nyano - Summary: gives dispellable behavior to Anomalies. + //Nyano - Summary: gives dispellable behavior to Anomalies. private void OnDispelled(EntityUid uid, AnomalyComponent component, DispelledEvent args) { _dispel.DealDispelDamage(uid); diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 7eecaa32b43..7190b94e141 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -9,7 +9,7 @@ using Content.Server.Speech; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; -using Content.Server.Nyanotrasen.Chat; +using Content.Server.Psionics.Telepathy; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; using Content.Server.Station.Components; diff --git a/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs b/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs index ec9ec770313..22d96a54146 100644 --- a/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs +++ b/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs @@ -5,7 +5,7 @@ using Content.Server.Psionics.Glimmer; using Content.Server.StationEvents.Components; using Content.Shared.Psionics.Glimmer; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; namespace Content.Server.StationEvents.Events; diff --git a/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs b/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs index a23a5b3d77d..0ce3f9d7c64 100644 --- a/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs +++ b/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs @@ -1,5 +1,5 @@ using Content.Shared.Chemistry.Reagent; -using Content.Server.Abilities.Psionics; +using Content.Server.Psionics.Abilities; using JetBrains.Annotations; using Robust.Shared.Prototypes; diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs index 148598fe2c3..24459d29e22 100644 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs +++ b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs @@ -5,7 +5,7 @@ using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Fluids.EntitySystems; using Content.Server.Psionics; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Chat; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.EntitySystems; diff --git a/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs b/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs index bc3c22cc350..b8cdcb56d47 100644 --- a/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs +++ b/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs @@ -1,4 +1,4 @@ -using Content.Server.Abilities.Psionics; +using Content.Server.Psionics.Abilities; using Content.Server.Chat.Systems; using Content.Server.Radio.Components; using Content.Server.Radio.EntitySystems; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs index 66eea988aeb..89b5a176f24 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs @@ -5,7 +5,7 @@ using Content.Server.Psionics.Glimmer; using Content.Server.StationEvents.Components; using Content.Shared.Psionics.Glimmer; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; namespace Content.Server.StationEvents.Events; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs index 63944563269..89f3bc97501 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs @@ -1,10 +1,9 @@ -using Robust.Server.GameObjects; using Robust.Shared.Random; -using Content.Server.Abilities.Psionics; +using Content.Server.Psionics.Abilities; using Content.Server.GameTicking.Rules.Components; using Content.Server.Psionics; using Content.Server.StationEvents.Components; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Robust.Shared.Player; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs index c04543d2195..6a2c1c3ba7d 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs @@ -10,7 +10,7 @@ using Content.Server.Power.EntitySystems; using Content.Server.Psionics.Glimmer; using Content.Server.StationEvents.Components; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Damage; using Content.Shared.Inventory; using Content.Shared.Mobs.Components; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs index 175318e15bd..8812ed1fe37 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs @@ -1,9 +1,9 @@ using Robust.Shared.Random; -using Content.Server.Abilities.Psionics; +using Content.Server.Psionics.Abilities; using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Content.Server.Psionics; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Mobs.Systems; using Content.Shared.Psionics.Glimmer; using Content.Shared.Zombies; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs index 82c3d72b139..3672d317d9e 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs @@ -3,7 +3,7 @@ using Content.Server.Psionics; using Content.Server.StationEvents.Components; using Content.Server.Stunnable; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.StatusEffect; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs index 63e0a435cb0..753b2e25729 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs @@ -4,7 +4,7 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Content.Shared.Mobs.Components; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.StatusEffect; using Content.Shared.Mobs.Systems; using Robust.Shared.Audio.Systems; diff --git a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs index da3b07d6dab..db61a3753a3 100644 --- a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs +++ b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs @@ -1,4 +1,4 @@ -using Content.Server.Audio; +using Content.Server.Psionics.Audio; using Content.Server.Power.Components; using Content.Server.Electrocution; using Content.Server.Lightning; diff --git a/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs index f85460a69f5..9583f45fdc9 100644 --- a/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs +++ b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs @@ -1,6 +1,6 @@ -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.Psionics; -using Content.Server.Abilities.Psionics; +using Content.Server.Psionics.Abilities; using Content.Shared.Eye; using Content.Server.NPC.Systems; using Robust.Shared.Containers; diff --git a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs index 7784db015d3..ba07375699b 100644 --- a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs +++ b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs @@ -13,7 +13,7 @@ using Robust.Shared.Map.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; -using Content.Shared.Abilities.Psionics; //Nyano - Summary: for the telegnostic projection. +using Content.Shared.Psionics.Abilities; //EE - Summary: for the telegnostic projection. namespace Content.Server.Singularity.EntitySystems; @@ -39,7 +39,7 @@ public override void Initialize() SubscribeLocalEvent(PreventConsume); SubscribeLocalEvent(PreventConsume); - SubscribeLocalEvent(PreventConsume); ///Nyano - Summary: the telegnositic projection has the same trait as ghosts. + SubscribeLocalEvent(PreventConsume); ///EE - Summary: the telegnositic projection has the same trait as ghosts. SubscribeLocalEvent(PreventConsume); SubscribeLocalEvent(OnHorizonMapInit); SubscribeLocalEvent(OnStartCollide); diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index daadd4b518b..09a4489cf4c 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -16,7 +16,7 @@ using Content.Server.Roles; using Content.Server.Speech.Components; using Content.Server.Temperature.Components; -using Content.Shared.Abilities.Psionics; +using Content.Shared.Psionics.Abilities; using Content.Shared.CombatMode; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage; From 51d4c1ba11b45e8f6ab61fc1d91eead440fd14e9 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 21:25:46 -0400 Subject: [PATCH 25/79] Update PsionicsSystem.cs --- Content.Server/Psionics/PsionicsSystem.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index 5c10e4160ca..f51d89200fa 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -48,6 +48,7 @@ public override void Initialize() SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnRemove); } @@ -81,12 +82,13 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel _electrocutionSystem.TryDoElectrocution(args.User, null, 20, TimeSpan.FromSeconds(5), false); } } - - private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) + private void OnStartup(EntityUid uid, PsionicComponent component, ComponentStartup args) { component.Amplification = _random.NextFloat(0.3f, 1.1f); component.Dampening = _random.NextFloat(0.3f, 1.1f); - + } + private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) + { if (!component.Removable) return; From 90ebdb56fcf843d233faed5b251fe34b9102fec2 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 22:05:31 -0400 Subject: [PATCH 26/79] Almost got it, one last bug to squash --- .../Abilities/PyrokinesisPowerSystem.cs | 17 ++++++++++++++--- Content.Server/Psionics/PsionicsSystem.cs | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs index 444675d9b3f..64621313db8 100644 --- a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -5,17 +5,20 @@ using Robust.Server.GameObjects; using Content.Shared.Actions.Events; using Content.Server.Explosion.Components; +using Content.Shared.Mobs.Components; +using Robust.Shared.Map; namespace Content.Server.Psionics.Abilities { public sealed class PyrokinesisPowerSystem : EntitySystem { + [Dependency] private readonly TransformSystem _xform = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly GunSystem _gunSystem = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PhysicsSystem _physics = default!; - + [Dependency] private readonly IMapManager _mapManager = default!; public override void Initialize() { base.Initialize(); @@ -56,7 +59,15 @@ private void OnPowerUsed(PyrokinesisPowerActionEvent args) if (!HasComp(args.Performer)) { - var ent = Spawn("ProjectileAnomalyFireball"); + var xformQuery = GetEntityQuery(); + var xform = xformQuery.GetComponent(args.Performer); + + var mapPos = xform.Coordinates.ToMap(EntityManager, _xform); + var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _) + ? xform.Coordinates.WithEntityId(gridUid, EntityManager) + : new(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position); + + var ent = Spawn("ProjectileAnomalyFireball", spawnCoords); if (TryComp(ent, out var fireball)) { @@ -69,7 +80,7 @@ private void OnPowerUsed(PyrokinesisPowerActionEvent args) } var userVelocity = _physics.GetMapLinearVelocity(args.Performer); - var direction = args.Target.ToMapPos(EntityManager, _transformSystem); + var direction = args.Target.Position; _gunSystem.ShootProjectile(ent, direction, userVelocity, args.Performer, args.Performer, 20f); diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index f51d89200fa..bf829477609 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -48,7 +48,7 @@ public override void Initialize() SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnRemove); } @@ -82,7 +82,7 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel _electrocutionSystem.TryDoElectrocution(args.User, null, 20, TimeSpan.FromSeconds(5), false); } } - private void OnStartup(EntityUid uid, PsionicComponent component, ComponentStartup args) + private void OnStartup(EntityUid uid, PsionicComponent component, MapInitEvent args) { component.Amplification = _random.NextFloat(0.3f, 1.1f); component.Dampening = _random.NextFloat(0.3f, 1.1f); From 52ea8372c6e77b78de89dde086aca8adbd821b0b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 22:22:29 -0400 Subject: [PATCH 27/79] slightly more acccurate but still not quite right --- Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs index 64621313db8..4659ca0f463 100644 --- a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -79,10 +79,9 @@ private void OnPowerUsed(PyrokinesisPowerActionEvent args) } } - var userVelocity = _physics.GetMapLinearVelocity(args.Performer); var direction = args.Target.Position; - _gunSystem.ShootProjectile(ent, direction, userVelocity, args.Performer, args.Performer, 20f); + _gunSystem.ShootProjectile(ent, direction, new System.Numerics.Vector2(0, 0), args.Performer, args.Performer, 20f); _psionics.LogPowerUsed(args.Performer, "pyrokinesis", (int) MathF.Round(6f * psionic.Amplification - psionic.Dampening), From 4f8a6b8806b9efbf5fa7e42a28868a7b133de430 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 22:28:42 -0400 Subject: [PATCH 28/79] Update PyrokinesisPowerSystem.cs --- Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs index 4659ca0f463..c0b35ae6169 100644 --- a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -75,7 +75,7 @@ private void OnPowerUsed(PyrokinesisPowerActionEvent args) if (psionic.Amplification > 5 && EnsureComp(ent, out var ignite)) { - ignite.FireStacks = 0.1f * psionic.Amplification - 0.1f * psionic.Dampening; + ignite.FireStacks = 0.2f * psionic.Amplification - 0.1f * psionic.Dampening; } } From 577e51a1eb8d89fd85a47b1bf5ce80c6724b10c7 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 22:35:26 -0400 Subject: [PATCH 29/79] removing some errant instances of potentialpsionic --- Resources/Prototypes/Entities/Mobs/Player/skeleton.yml | 1 - Resources/Prototypes/Entities/Mobs/Player/vox.yml | 2 -- 2 files changed, 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml index bf41f2dda6e..f9132ce0ea0 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml @@ -8,7 +8,6 @@ interactSuccessString: hugging-success-generic interactSuccessSound: /Audio/Effects/thudswoosh.ogg messagePerceivedByOthers: hugging-success-generic-others - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - type: entity name: skeleton pirate diff --git a/Resources/Prototypes/Entities/Mobs/Player/vox.yml b/Resources/Prototypes/Entities/Mobs/Player/vox.yml index 0a6f4f43644..de1e3da2be7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/vox.yml @@ -3,5 +3,3 @@ name: Vox parent: BaseMobVox id: MobVox - components: - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. From a6f8d40046f204a7df9c09c07db91803e436e8c2 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 14 May 2024 22:37:03 -0400 Subject: [PATCH 30/79] Revert "removing some errant instances of potentialpsionic" This reverts commit 0597405a48a588c9127e1bdbdca1b3d8aae81732. --- Resources/Prototypes/Entities/Mobs/Player/skeleton.yml | 1 + Resources/Prototypes/Entities/Mobs/Player/vox.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml index f9132ce0ea0..bf41f2dda6e 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml @@ -8,6 +8,7 @@ interactSuccessString: hugging-success-generic interactSuccessSound: /Audio/Effects/thudswoosh.ogg messagePerceivedByOthers: hugging-success-generic-others + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - type: entity name: skeleton pirate diff --git a/Resources/Prototypes/Entities/Mobs/Player/vox.yml b/Resources/Prototypes/Entities/Mobs/Player/vox.yml index de1e3da2be7..0a6f4f43644 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/vox.yml @@ -3,3 +3,5 @@ name: Vox parent: BaseMobVox id: MobVox + components: + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. From f677d5aa7e07f3ead3acf25cc9a7c1f107c0f70b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 17:31:32 -0400 Subject: [PATCH 31/79] Final power update --- .../Abilities/MetapsionicPowerSystem.cs | 6 ++ .../Abilities/NoosphericZapPowerSystem.cs | 2 +- .../Abilities/PsionicAbilitiesSystem.cs | 4 - .../PsionicInvisibilityPowerSystem.cs | 1 - .../PsionicRegenerationPowerSystem.cs | 10 +-- .../Abilities/PyrokinesisPowerSystem.cs | 2 +- .../RegenerativeStasisPowerSystem.cs | 76 +++++++++++++++++++ Content.Server/Psionics/Dreams/DreamSystem.cs | 2 - .../Psionics/Glimmer/GlimmerReactiveSystem.cs | 3 - .../PsionicInvisibleContactsComponent.cs | 1 - .../PsionicInvisibleContactsSystem.cs | 2 - Content.Server/Psionics/PsionicsCommands.cs | 3 +- .../Psionics/Telepathy/TSayCommand.cs | 1 - .../Psionics/Telepathy/TelepathyChatSystem.cs | 1 - .../Zombies/ZombieSystem.Transform.cs | 2 - .../Events/MassSleepPowerActionEvent.cs | 2 - .../RegenerativeStasisPowerActionEvent.cs | 2 + .../Dispel/DamageOnDispelComponent.cs | 2 +- .../Abilities/Dispel/DispelPowerComponent.cs | 1 - .../MassSleep/MassSleepPowerComponent.cs | 21 ----- .../MassSleep/MassSleepPowerSystem.cs | 59 -------------- .../Metapsionics/MetapsionicPowerComponent.cs | 1 - .../RegenerativeStasisPowerComponent.cs | 20 +++++ .../Psionics/Glimmer/GlimmerSystem.cs | 2 +- Content.Shared/Psionics/PsionicComponent.cs | 2 +- .../Psionics/SharedPsionicAbilitiesSystem.cs | 3 +- .../nyanotrasen/psionics/psychic-feedback.ftl | 21 ++++- .../Prototypes/Nyanotrasen/Actions/types.yml | 10 +-- .../Machines/metempsychoticMachine.yml | 2 + .../Entities/Structures/Research/oracle.yml | 2 + .../Structures/Research/sophicscribe.yml | 2 + 31 files changed, 143 insertions(+), 125 deletions(-) create mode 100644 Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs delete mode 100644 Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs create mode 100644 Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs delete mode 100644 Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs delete mode 100644 Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs create mode 100644 Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs diff --git a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs index c30abd84f57..ffe8ab00c2f 100644 --- a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -154,6 +154,12 @@ private void OnDoAfter(EntityUid uid, MetapsionicPowerComponent component, Focus if (args.Target == null) return; + if (TryComp(args.Target, out var swapped)) + { + _popups.PopupEntity(Loc.GetString(swapped.MindSwappedFeedback, ("entity", args.Target)), uid, uid, PopupType.LargeCaution); + return; + } + if (args.Target == uid) { _popups.PopupEntity(Loc.GetString("metapulse-self", ("entity", args.Target)), uid, uid, PopupType.LargeCaution); diff --git a/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs index ce55cb3bb7d..c935bc0123d 100644 --- a/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -47,7 +47,7 @@ private void OnShutdown(EntityUid uid, NoosphericZapPowerComponent component, Co { psionic.ActivePowers.Remove(component); psionic.PsychicFeedback.Remove(component.NoosphericZapFeedback); - psionic.Amplification += 1f; + psionic.Amplification -= 1f; } } diff --git a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs index b6ab74627d3..5124aff0688 100644 --- a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs @@ -3,8 +3,6 @@ using Content.Shared.Psionics.Glimmer; using Content.Shared.Random; using Content.Shared.Random.Helpers; -using Content.Server.EUI; -using Content.Server.Mind; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; @@ -20,11 +18,9 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; - [Dependency] private readonly EuiManager _euiManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly MindSystem _mindSystem = default!; [Dependency] private readonly SharedPopupSystem _popups = default!; public override void Initialize() diff --git a/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index 9422dfb9acf..0c50efb5cf3 100644 --- a/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -6,7 +6,6 @@ using Content.Shared.Stunnable; using Content.Shared.Stealth; using Content.Shared.Stealth.Components; -using Content.Server.Psionics; using Content.Shared.Psionics.Events; using Content.Shared.Actions.Events; using Robust.Shared.Audio.Systems; diff --git a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index e6ef1ac6d73..882eb9e0b14 100644 --- a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -147,7 +147,7 @@ private void OnShutdown(EntityUid uid, PsionicRegenerationPowerComponent compone { psionic.ActivePowers.Remove(component); psionic.PsychicFeedback.Remove(component.RegenerationFeedback); - psionic.Amplification += 0.5f; + psionic.Amplification -= 0.5f; psionic.Dampening -= 0.5f; } } @@ -173,19 +173,15 @@ private void OnDoAfter(EntityUid uid, PsionicRegenerationPowerComponent componen if (!TryComp(uid, out var stream)) return; - // DoAfter has no way to run a callback during the process to give - // small doses of the reagent, so we wait until either the action - // is cancelled (by being dispelled) or complete to give the - // appropriate dose. A timestamp delta is used to accomplish this. var percentageComplete = Math.Min(1f, (_gameTiming.CurTime - args.StartedAt).TotalSeconds / component.UseDelay); var solution = new Solution(); - solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(component.EssenceAmount * percentageComplete + 10f * psionic.Dampening)); + solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(Math.Min(component.EssenceAmount * percentageComplete + 10f * psionic.Dampening, 15f))); _bloodstreamSystem.TryAddToChemicals(uid, solution, stream); if (component.SelfRevive == true) { var critSolution = new Solution(); - critSolution.AddReagent("Epinephrine", MathF.MinMagnitude(5 + 5 * psionic.Dampening, 15)); + critSolution.AddReagent("Epinephrine", MathF.Min(5 + 5 * psionic.Dampening, 15)); _bloodstreamSystem.TryAddToChemicals(uid, critSolution, stream); component.SelfRevive = false; } diff --git a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs index c0b35ae6169..77075dab206 100644 --- a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -48,7 +48,7 @@ private void OnShutdown(EntityUid uid, PyrokinesisPowerComponent component, Comp { psionic.ActivePowers.Remove(component); psionic.PsychicFeedback.Remove(component.PyrokinesisFeedback); - psionic.Amplification += 1f; + psionic.Amplification -= 1f; } } diff --git a/Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs b/Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs new file mode 100644 index 00000000000..e184b19396b --- /dev/null +++ b/Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs @@ -0,0 +1,76 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Actions; +using Content.Shared.Chemistry.Components; +using Content.Shared.Bed.Sleep; +using Content.Shared.Psionics.Abilities; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Content.Shared.Mind; +using Content.Shared.Actions.Events; +using Content.Shared.FixedPoint; + +namespace Content.Server.Psionics.Abilities +{ + public sealed class MassSleepPowerSystem : EntitySystem + { + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnPowerUsed); + } + + private void OnInit(EntityUid uid, RegenerativeStasisPowerComponent component, ComponentInit args) + { + _actions.AddAction(uid, ref component.RegenerativeStasisActionEntity, component.RegenerativeStasisActionId); + _actions.TryGetActionData(component.RegenerativeStasisActionEntity, out var actionData); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.RegenerativeStasisActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Add(component); + psionic.PsychicFeedback.Add(component.RegenerativeStasisFeedback); + psionic.Amplification += 0.5f; + psionic.Dampening += 0.5f; + } + } + + private void OnShutdown(EntityUid uid, RegenerativeStasisPowerComponent component, ComponentShutdown args) + { + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + psionic.PsychicFeedback.Remove(component.RegenerativeStasisFeedback); + psionic.Amplification -= 0.5f; + psionic.Dampening -= 0.5f; + } + _actions.RemoveAction(uid, component.RegenerativeStasisActionEntity); + } + + private void OnPowerUsed(EntityUid uid, RegenerativeStasisPowerComponent component, RegenerativeStasisPowerActionEvent args) + { + if (TryComp(uid, out var psionic) + && !HasComp(uid) + && !HasComp(args.Target) + && TryComp(args.Target, out var stream)) + { + var solution = new Solution(); + solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(MathF.Min(2.5f * psionic.Amplification + psionic.Dampening, 15f))); + solution.AddReagent("Epinephrine", FixedPoint2.New(MathF.Min(2.5f * psionic.Dampening + psionic.Amplification, 15f))); + _bloodstreamSystem.TryAddToChemicals(args.Target, solution, stream); + EnsureComp(args.Target); + + _psionics.LogPowerUsed(uid, "regenerative stasis", + (int) Math.Round(4 * psionic.Amplification - psionic.Dampening), + (int) Math.Round(6 * psionic.Amplification - psionic.Dampening)); + args.Handled = true; + } + } + } +} diff --git a/Content.Server/Psionics/Dreams/DreamSystem.cs b/Content.Server/Psionics/Dreams/DreamSystem.cs index 15e1593a859..1731c7a9bf5 100644 --- a/Content.Server/Psionics/Dreams/DreamSystem.cs +++ b/Content.Server/Psionics/Dreams/DreamSystem.cs @@ -1,6 +1,5 @@ using Content.Shared.Dataset; using Content.Shared.Bed.Sleep; -using Content.Server.Chat.Systems; using Content.Server.Chat.Managers; using Robust.Shared.Random; using Robust.Shared.Prototypes; @@ -10,7 +9,6 @@ namespace Content.Server.Psionics.Dreams { public sealed class DreamsSystem : EntitySystem { - [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; diff --git a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs index db61a3753a3..c0802c8b670 100644 --- a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs +++ b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs @@ -3,12 +3,10 @@ using Content.Server.Electrocution; using Content.Server.Lightning; using Content.Server.Explosion.EntitySystems; -using Content.Server.Construction; using Content.Server.Ghost; using Content.Server.Revenant.EntitySystems; using Content.Shared.Audio; using Content.Shared.Construction.EntitySystems; -using Content.Shared.Coordinates.Helpers; using Content.Shared.GameTicking; using Content.Shared.Psionics.Glimmer; using Content.Shared.Verbs; @@ -16,7 +14,6 @@ using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Construction.Components; -using Content.Shared.Mind; using Content.Shared.Mind.Components; using Content.Shared.Weapons.Melee.Components; using Robust.Shared.Audio; diff --git a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs index 859ceb7b83a..268deddf6d9 100644 --- a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs +++ b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs @@ -1,5 +1,4 @@ using Content.Shared.Whitelist; -using Robust.Shared.Timing; namespace Content.Server.Psionics { diff --git a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs index cec755e3260..403e0592617 100644 --- a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs +++ b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Stealth.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; namespace Content.Server.Psionics { @@ -12,7 +11,6 @@ namespace Content.Server.Psionics public sealed class PsionicInvisibleContactsSystem : EntitySystem { [Dependency] private readonly SharedStealthSystem _stealth = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; public override void Initialize() { diff --git a/Content.Server/Psionics/PsionicsCommands.cs b/Content.Server/Psionics/PsionicsCommands.cs index 2eda2cd2bc8..3f9ee794b38 100644 --- a/Content.Server/Psionics/PsionicsCommands.cs +++ b/Content.Server/Psionics/PsionicsCommands.cs @@ -18,7 +18,8 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args) { SharedActionsSystem actions = default!; var entMan = IoCManager.Resolve(); - foreach (var (actor, mob, psionic, meta) in entMan.EntityQuery()){ + foreach (var (actor, psionic, meta) in entMan.EntityQuery()) + { // filter out xenos, etc, with innate telepathy actions.TryGetActionData( psionic.PsionicAbility, out var actionData ); if (actionData == null || actionData.ToString() == null) diff --git a/Content.Server/Psionics/Telepathy/TSayCommand.cs b/Content.Server/Psionics/Telepathy/TSayCommand.cs index 378789ccbf9..8fbaa5e17b2 100644 --- a/Content.Server/Psionics/Telepathy/TSayCommand.cs +++ b/Content.Server/Psionics/Telepathy/TSayCommand.cs @@ -1,6 +1,5 @@ using Content.Server.Chat.Systems; using Content.Shared.Administration; -using Robust.Server.Player; using Robust.Shared.Console; using Robust.Shared.Enums; using Robust.Shared.Player; diff --git a/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs b/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs index 565e7c7f0e6..ad49075e65a 100644 --- a/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs +++ b/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; -using Content.Server.Psionics; using Content.Shared.Psionics.Abilities; using Content.Shared.Bed.Sleep; using Content.Shared.Chat; diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 09a4489cf4c..53128aade31 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -59,9 +59,7 @@ public sealed partial class ZombieSystem [Dependency] private readonly IChatManager _chatMan = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly ActionsSystem _actions = default!; // DeltaV - No psionic zombies /// /// Handles an entity turning into a zombie when they die or go into crit diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs deleted file mode 100644 index 6666ee48d6c..00000000000 --- a/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Content.Shared.Actions.Events; -public sealed partial class MassSleepPowerActionEvent : WorldTargetActionEvent {} diff --git a/Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs new file mode 100644 index 00000000000..4435f475a44 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs @@ -0,0 +1,2 @@ +namespace Content.Shared.Actions.Events; +public sealed partial class RegenerativeStasisPowerActionEvent : EntityTargetActionEvent {} diff --git a/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs index 89168d2b259..c3702880375 100644 --- a/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs +++ b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs @@ -9,7 +9,7 @@ namespace Content.Shared.Psionics.Abilities public sealed partial class DamageOnDispelComponent : Component { [DataField("damage", required: true)] - public DamageSpecifier Damage = default!; + public DamageSpecifier Damage = default!; [DataField("variance")] public float Variance = 0.5f; diff --git a/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs index 1426712cf94..518a28b0967 100644 --- a/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; diff --git a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs deleted file mode 100644 index dcd1d2c1c42..00000000000 --- a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Shared.Psionics.Abilities -{ - [RegisterComponent] - public sealed partial class MassSleepPowerComponent : Component - { - public float Radius = 1.25f; - [DataField("massSleepActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? MassSleepActionId = "ActionMassSleep"; - - [DataField("massSleepActionEntity")] - public EntityUid? MassSleepActionEntity; - - [DataField("massSleepFeedback")] - public string MassSleepFeedback = "mass-sleep-feedback"; - } -} diff --git a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs deleted file mode 100644 index 1f2f6954e77..00000000000 --- a/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Content.Shared.Actions; -using Content.Shared.Bed.Sleep; -using Content.Shared.Magic.Events; -using Content.Shared.Damage; -using Content.Shared.Mobs.Components; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Shared.Mind; -using Content.Shared.Actions.Events; - -namespace Content.Shared.Psionics.Abilities -{ - public sealed class MassSleepPowerSystem : EntitySystem - { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnPowerUsed); - } - - private void OnInit(EntityUid uid, MassSleepPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.MassSleepActionEntity, component.MassSleepActionId ); - _actions.TryGetActionData( component.MassSleepActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.MassSleepActionEntity); - if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) - psionic.PsionicAbility = component.MassSleepActionEntity; - } - - private void OnShutdown(EntityUid uid, MassSleepPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.MassSleepActionEntity); - } - - private void OnPowerUsed(EntityUid uid, MassSleepPowerComponent component, MassSleepPowerActionEvent args) - { - foreach (var entity in _lookup.GetEntitiesInRange(args.Target, component.Radius)) - { - if (HasComp(entity) && entity != uid && !HasComp(entity)) - { - if (TryComp(entity, out var damageable) && damageable.DamageContainerID == "Biological") - EnsureComp(entity); - } - } - _psionics.LogPowerUsed(uid, "mass sleep"); - args.Handled = true; - } - } -} diff --git a/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs index 8570668f744..2fbfe18327e 100644 --- a/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs +++ b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions; using Content.Shared.DoAfter; using Robust.Shared.Audio; using Robust.Shared.Prototypes; diff --git a/Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs b/Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs new file mode 100644 index 00000000000..27a0903e224 --- /dev/null +++ b/Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Actions; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Psionics.Abilities +{ + [RegisterComponent] + public sealed partial class RegenerativeStasisPowerComponent : Component + { + [DataField("regenerativeStasisActionId", + customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? RegenerativeStasisActionId = "ActionRegenerativeStasis"; + + [DataField("regenerativeStasisActionEntity")] + public EntityUid? RegenerativeStasisActionEntity; + + [DataField("regenerativeStasisFeedback")] + public string RegenerativeStasisFeedback = "regenerative-stasis-feedback"; + } +} diff --git a/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs b/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs index 31af85bbb51..8be02f936a9 100644 --- a/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs +++ b/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs @@ -40,7 +40,7 @@ public GlimmerTier GetGlimmerTier(int? glimmer = null) if (glimmer == null) glimmer = Glimmer; - return (glimmer) switch + return glimmer switch { <= 49 => GlimmerTier.Minimal, >= 50 and <= 99 => GlimmerTier.Low, diff --git a/Content.Shared/Psionics/PsionicComponent.cs b/Content.Shared/Psionics/PsionicComponent.cs index 76e629f0839..9a06e54cb31 100644 --- a/Content.Shared/Psionics/PsionicComponent.cs +++ b/Content.Shared/Psionics/PsionicComponent.cs @@ -17,7 +17,7 @@ public sealed partial class PsionicComponent : Component public List ActivePowers = new(); [DataField("psychicFeedback")] - public List PsychicFeedback= new(); + public List PsychicFeedback = new(); [DataField("amplification")] public float Amplification = 0.1f; diff --git a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs index a4b283f59ce..603c5188a52 100644 --- a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs +++ b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs @@ -4,7 +4,6 @@ using Content.Shared.Mobs.Components; using Content.Shared.Popups; using Content.Shared.Psionics.Glimmer; -using Content.Shared.Psionics.Abilities; using Robust.Shared.Random; using Robust.Shared.Serialization; @@ -74,7 +73,7 @@ public void SetPsionicsThroughEligibility(EntityUid uid) if (actionData == null) return; - _actions.SetEnabled(actionData.Owner, IsEligibleForPsionics(uid)); + _actions.SetEnabled(uid, IsEligibleForPsionics(uid)); } private bool IsEligibleForPsionics(EntityUid uid) diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl index 5e6626eb9ca..6bdc84dc3ea 100644 --- a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl +++ b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl @@ -1,6 +1,19 @@ -dispel-feedback = {CAPITALIZE($entity)} projects an aura of normality +# Feedback messages for Focused Metapsionic Pulse +metapulse-self = I AM. no-powers = {CAPITALIZE($entity)} will never awaken from the dream in this life psychic-potential = {CAPITALIZE($entity)} has a slim chance of awakening from the dream -focused-metapsionic-pulse-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly, like a heat haze crawling across the endless desert -psionic-regeneration-self-revive = As {CAPITALIZE($entity)} falls to the floor greviously wounded, - they begin visibly regenerating! +dispel-feedback = {CAPITALIZE($entity)} is a mighty stone, standing against the currents of fate +metasionic-feedback = {CAPITALIZE($entity)} gazes back upon thee +mind-swap-feedback = {CAPITALIZE($entity)}'s vessel seems fit for other souls +mindswapped-feedback = Cursed flesh! {CAPITALIZE($entity)} dwells within the wrong vessel! +noospheric-zap-feedback = {CAPITALIZE($entity)}'s soul writhes with thunder from beyond the veil +pyrokinesis-feedback = The Secret of Fire dwells within {CAPITALIZE($entity)} +invisibility-feedback = {CAPITALIZE($entity)}'s wyrd seeks to hide from thine gaze +telegnosis-feedback = {CAPITALIZE($entity)}'s soul travels across bridges composed of dreamlight. +sophic-grammateus-feedback = SEEKER, YOU NEED ONLY ASK FOR MY WISDOM. +oracle-feedback = WHY DO YOU BOTHER ME SEEKER? HAVE I NOT MADE MY DESIRES CLEAR? +metempsychotic-machine-feedback = The sea of fate flows through this machine + +# Power PVS Messages +focused-metapsionic-pulse-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly +psionic-regeneration-self-revive = {CAPITALIZE($entity)} begins to visibly regenerate diff --git a/Resources/Prototypes/Nyanotrasen/Actions/types.yml b/Resources/Prototypes/Nyanotrasen/Actions/types.yml index 71a92ec4516..55dd48e5470 100644 --- a/Resources/Prototypes/Nyanotrasen/Actions/types.yml +++ b/Resources/Prototypes/Nyanotrasen/Actions/types.yml @@ -36,18 +36,18 @@ event: !type:DispelPowerActionEvent - type: entity - id: ActionMassSleep - name: action-name-mass-sleep - description: action-description-mass-sleep + id: ActionRegenerativeStasis + name: action-name-regenerative-stasis + description: action-description-regenerative-stasis noSpawn: true components: - - type: WorldTargetAction + - type: EntityTargetAction icon: Nyanotrasen/Interface/VerbIcons/mass_sleep.png useDelay: 60 checkCanAccess: false range: 8 itemIconStyle: BigAction - event: !type:MassSleepPowerActionEvent + event: !type:RegenerativeStasisPowerActionEvent - type: entity id: ActionMindSwap diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml index d8e791af1ed..5018a1da8f9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml @@ -23,3 +23,5 @@ Gore: { state: pod_1 } Idle: { state: pod_0 } - type: Psionic + psychicFeedback: + - "metempsychotic-machine-feedback" diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml index f7481abf1ed..4e2183ef0b9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml @@ -17,6 +17,8 @@ - type: Speech speechSounds: Tenor - type: Psionic + psychicFeedback: + - "oracle-feedback" - type: SolutionContainerManager solutions: fountain: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml index ae85cd25e03..8e34a07ea5e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml @@ -29,6 +29,8 @@ - Science - type: PotentialPsionic #this makes her easier to access for glimmer events, dw about it - type: Psionic + psychicFeedback: + - "sophic-grammateus-feedback" - type: Grammar attributes: gender: female From 5ac883e6c112c0e8213bfc815a8d1900fd883071 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 17:34:34 -0400 Subject: [PATCH 32/79] Update psionicPowers.yml --- Resources/Prototypes/Nyanotrasen/psionicPowers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml index b577d419e38..ca1764e204c 100644 --- a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml +++ b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml @@ -5,7 +5,7 @@ DispelPower: 1 TelegnosisPower: 1 PsionicRegenerationPower: 1 - MassSleepPower: 0.3 + RegenerativeStasisPower: 0.3 PsionicInvisibilityPower: 0.15 MindSwapPower: 0.15 NoosphericZapPower: 0.15 From e9f1ae0db41c6db3c9f76f96b95a1e5227d057ae Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 17:40:52 -0400 Subject: [PATCH 33/79] Update psionic.ftl --- .../Locale/en-US/nyanotrasen/abilities/psionic.ftl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl b/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl index 91ae21233a3..a27803aa6f7 100644 --- a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl +++ b/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl @@ -3,8 +3,11 @@ cage-resist-third-person = {CAPITALIZE(THE($user))} starts removing {POSS-ADJ($u cage-uncage-verb = Uncage -action-name-metapsionic = Metapsionic Pulse -action-description-metapsionic = Send a mental pulse through the area to see if there are any psychics nearby. +action-name-widemetapsionic = Wide Metapsionic Pulse +action-description-widemetapsionic = Send a mental pulse through the area to see if there are any psychics nearby. + +action-name-focusedmetapsionic = Focused Metapsionic Pulse +action-description-focusedmetapsionic = Probe an entity at close range to glean metaphorical information about any powers they may have metapsionic-pulse-success = You detect psychic presence nearby. metapsionic-pulse-failure = You don't detect any psychic presence nearby. @@ -13,8 +16,8 @@ metapsionic-pulse-power = You detect that {$power} was used nearby. action-name-dispel = Dispel action-description-dispel = Dispel summoned entities such as familiars or forcewalls. -action-name-mass-sleep = Mass Sleep -action-description-mass-sleep = Put targets in a small area to sleep. +action-name-regenerative-stasis = Regenerative Stasis +action-description-regenerative-stasis = Puts the target into a brief stasis, during which time their wounds rapidly heal. accept-psionics-window-title = Psionic! accept-psionics-window-prompt-text-part = You rolled a psionic power! @@ -63,8 +66,7 @@ action-name-noospheric-zap = Noospheric Zap action-description-noospheric-zap = Shocks the conciousness of the target and leaves them stunned and stuttering. action-name-pyrokinesis = Pyrokinesis -action-description-pyrokinesis = Light a flammable target on fire. -pyrokinesis-power-used = A wisp of flame engulfs {THE($target)}, igniting {OBJECT($target)}! +action-description-pyrokinesis = Hurl a small gateway to the plane of Gehenna at your target. action-name-psychokinesis = Psychokinesis action-description-psychokinesis = Bend the fabric of space to instantly move across it. From f951e229630f51d2f87e1eae0d757c077d19b642 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 18:00:14 -0400 Subject: [PATCH 34/79] some more small tweaks --- Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs | 4 ++-- Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl | 4 ++++ .../Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl | 3 ++- .../Entities/Structures/Machines/metempsychoticMachine.yml | 1 + .../Nyanotrasen/Entities/Structures/Research/oracle.yml | 1 + 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs index ffe8ab00c2f..7b3a417c53f 100644 --- a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -119,7 +119,7 @@ private void OnFocusedPowerUsed(FocusedMetapsionicPowerActionEvent args) var ev = new FocusedMetapsionicDoAfterEvent(_gameTiming.CurTime); - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, component.UseDelay, ev, args.Performer, args.Target, args.Performer) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, component.UseDelay - psionic.Amplification, ev, args.Performer, args.Target, args.Performer) { BlockDuplicate = true, BreakOnUserMove = true, @@ -129,7 +129,7 @@ private void OnFocusedPowerUsed(FocusedMetapsionicPowerActionEvent args) component.DoAfter = doAfterId; - _popups.PopupEntity(Loc.GetString("focused-metapsionic-pulse-begin", ("entity", args.Performer)), + _popups.PopupEntity(Loc.GetString("focused-metapsionic-pulse-begin", ("entity", args.Target)), args.Performer, // TODO: Use LoS-based Filter when one is available. Filter.Pvs(args.Performer).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(args.Performer, entity, ExamineRange, null)), diff --git a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl b/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl index a27803aa6f7..5b368e822f1 100644 --- a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl +++ b/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl @@ -73,3 +73,7 @@ action-description-psychokinesis = Bend the fabric of space to instantly move ac action-name-rf-sensitivity = Toggle RF Sensitivity action-desc-rf-sensitivity = Toggle your ability to interpret radio waves on and off. + +trait-latent-psychic-desc = Your mind and soul are open to the noosphere, allowing for a limited use of Telepathy. + Thus, you are eligible for potentially receiving psychic powers. + It is possible that you may be hunted by otherworldly forces, so consider keeping your powers a secret. diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl index 6bdc84dc3ea..d398c717c07 100644 --- a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl +++ b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl @@ -3,7 +3,7 @@ metapulse-self = I AM. no-powers = {CAPITALIZE($entity)} will never awaken from the dream in this life psychic-potential = {CAPITALIZE($entity)} has a slim chance of awakening from the dream dispel-feedback = {CAPITALIZE($entity)} is a mighty stone, standing against the currents of fate -metasionic-feedback = {CAPITALIZE($entity)} gazes back upon thee +metapsionic-feedback = {CAPITALIZE($entity)} gazes back upon thee mind-swap-feedback = {CAPITALIZE($entity)}'s vessel seems fit for other souls mindswapped-feedback = Cursed flesh! {CAPITALIZE($entity)} dwells within the wrong vessel! noospheric-zap-feedback = {CAPITALIZE($entity)}'s soul writhes with thunder from beyond the veil @@ -17,3 +17,4 @@ metempsychotic-machine-feedback = The sea of fate flows through this machine # Power PVS Messages focused-metapsionic-pulse-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly psionic-regeneration-self-revive = {CAPITALIZE($entity)} begins to visibly regenerate +mindbreaking-feedback = The light of life vanishes from {CAPITALIZE($entity)}'s eyes, leaving behind a husk pretending at sapience diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml index 5018a1da8f9..d773cf87c76 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml @@ -22,6 +22,7 @@ NoMind: { state: pod_1 } Gore: { state: pod_1 } Idle: { state: pod_0 } + - type: PotentialPsionic - type: Psionic psychicFeedback: - "metempsychotic-machine-feedback" diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml index 4e2183ef0b9..58189e49cec 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml @@ -16,6 +16,7 @@ - type: Oracle - type: Speech speechSounds: Tenor + - type: PotentialPsionic - type: Psionic psychicFeedback: - "oracle-feedback" From 2fc2351d8cb3033ab68026160adc6c494c4289bb Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 18:04:27 -0400 Subject: [PATCH 35/79] Update PotentialPsionicComponent.cs --- Content.Server/Psionics/PotentialPsionicComponent.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Content.Server/Psionics/PotentialPsionicComponent.cs b/Content.Server/Psionics/PotentialPsionicComponent.cs index 9499497cd1d..e874296a4c3 100644 --- a/Content.Server/Psionics/PotentialPsionicComponent.cs +++ b/Content.Server/Psionics/PotentialPsionicComponent.cs @@ -3,8 +3,15 @@ namespace Content.Server.Psionics [RegisterComponent] public sealed partial class PotentialPsionicComponent : Component { + /// + /// The base chance of an entity rolling psychic powers, which is increased by other modifiers such as glimmer. + /// + /// + /// I have increased this to 10% up from its original value of 2%, because I estimate that most people won't take the Latent Psychic trait + /// Simply because they might not even know it exists + /// [DataField("chance")] - public float Chance = 0.04f; + public float Chance = 0.10f; /// /// YORO (you only reroll once) From 2e706d17b5bae6e28577fa3096470bcffd31f145 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 18:42:15 -0400 Subject: [PATCH 36/79] Update PsionicAbilitiesSystem.cs --- .../Abilities/PsionicAbilitiesSystem.cs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs index 5124aff0688..3f55e23794e 100644 --- a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs @@ -66,6 +66,16 @@ public void AddRandomPsionicPower(EntityUid uid) public void RemovePsionics(EntityUid uid) { + if (RemComp(uid)) + { + _popups.PopupEntity(Loc.GetString("mindbreaking-feedback", ("entity", uid)), + uid, + // TODO: Use LoS-based Filter when one is available. + Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), + true, + PopupType.Medium); + } + if (!TryComp(uid, out var psionic)) return; @@ -92,16 +102,9 @@ public void RemovePsionics(EntityUid uid) } } - _popups.PopupEntity(Loc.GetString("mindbreaking-feedback", ("entity", uid)), - uid, - // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), - true, - PopupType.Medium); - _statusEffectsSystem.TryAddStatusEffect(uid, "Stutter", TimeSpan.FromMinutes(5), false, "StutteringAccent"); - _glimmerSystem.Glimmer += _random.Next((int) MathF.Round(psionic.Amplification * psionic.Dampening * -5), (int) MathF.Round(psionic.Amplification * psionic.Dampening * -10)); + _glimmerSystem.Glimmer += _random.Next((int) MathF.Round(psionic.Amplification * psionic.Dampening * -10), (int) MathF.Round(psionic.Amplification * psionic.Dampening * -5)); RemComp(uid); RemComp(uid); } From 96174af2caf454e7cfc0e19b3a2a0434158b1a17 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 18:41:37 -0400 Subject: [PATCH 37/79] Update Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs index 3f55e23794e..915abd12224 100644 --- a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs @@ -30,7 +30,7 @@ public override void Initialize() /// /// Adds a psychic power once a character rolls one. This used to be a system you have to select for. However the opt-in is no longer the text window, but is now done at character creation. - /// This is going to get removed when I reach Part 3 of my reworks, when I touch upon the GlimmerSystem itself and overhaul how players get powers. + /// TODO: This is going to get removed when I reach Part 3 of my reworks, when I touch upon the GlimmerSystem itself and overhaul how players get powers. /// /// /// From 60f76ea41d049de7492020f27c592f4400cc69fa Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 18:44:54 -0400 Subject: [PATCH 38/79] remove downstream comments --- Content.Server/Abilities/Mime/MimePowersSystem.cs | 2 +- Content.Server/Anomaly/AnomalySystem.Psionics.cs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Content.Server/Abilities/Mime/MimePowersSystem.cs b/Content.Server/Abilities/Mime/MimePowersSystem.cs index 3e7605a07d3..b3bd3392434 100644 --- a/Content.Server/Abilities/Mime/MimePowersSystem.cs +++ b/Content.Server/Abilities/Mime/MimePowersSystem.cs @@ -10,7 +10,7 @@ using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Timing; -using Content.Shared.Psionics.Abilities; //EE - Summary: Makes Mime psionic. +using Content.Shared.Psionics.Abilities; using Content.Shared.Speech.Muting; namespace Content.Server.Abilities.Mime diff --git a/Content.Server/Anomaly/AnomalySystem.Psionics.cs b/Content.Server/Anomaly/AnomalySystem.Psionics.cs index 3a5a55c0bdc..84f200f47ba 100644 --- a/Content.Server/Anomaly/AnomalySystem.Psionics.cs +++ b/Content.Server/Anomaly/AnomalySystem.Psionics.cs @@ -1,4 +1,4 @@ -using Content.Server.Psionics.Abilities; //EE - Summary: the psionics bin where dispel is located. +using Content.Server.Psionics.Abilities; using Content.Shared.Anomaly; using Content.Shared.Anomaly.Components; using Robust.Shared.Random; @@ -14,8 +14,6 @@ private void InitializePsionics() { SubscribeLocalEvent(OnDispelled); } - - //Nyano - Summary: gives dispellable behavior to Anomalies. private void OnDispelled(EntityUid uid, AnomalyComponent component, DispelledEvent args) { _dispel.DealDispelDamage(uid); From a5c621049392c8270fbb659a81dd20d4b8a176d9 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 19:32:40 -0400 Subject: [PATCH 39/79] Giving pyrokinesis back to ifrit, and setting up base caster stat bonuses to roundstart casters --- .../nyanotrasen/psionics/psychic-feedback.ftl | 3 +- .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 7 +++-- .../Roles/Jobs/Epistemics/forensicmantis.yml | 15 +++++----- .../Roles/Jobs/Science/research_director.yml | 28 +++++++++---------- 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl index d398c717c07..26d2acb87cd 100644 --- a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl +++ b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl @@ -9,10 +9,11 @@ mindswapped-feedback = Cursed flesh! {CAPITALIZE($entity)} dwells within the wro noospheric-zap-feedback = {CAPITALIZE($entity)}'s soul writhes with thunder from beyond the veil pyrokinesis-feedback = The Secret of Fire dwells within {CAPITALIZE($entity)} invisibility-feedback = {CAPITALIZE($entity)}'s wyrd seeks to hide from thine gaze -telegnosis-feedback = {CAPITALIZE($entity)}'s soul travels across bridges composed of dreamlight. +telegnosis-feedback = {CAPITALIZE($entity)}'s soul travels across bridges composed of dreamlight sophic-grammateus-feedback = SEEKER, YOU NEED ONLY ASK FOR MY WISDOM. oracle-feedback = WHY DO YOU BOTHER ME SEEKER? HAVE I NOT MADE MY DESIRES CLEAR? metempsychotic-machine-feedback = The sea of fate flows through this machine +ifrit-feedback = A spirit of Gehenna, bound by the will of a powerful psychic # Power PVS Messages focused-metapsionic-pulse-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index fa51b99325c..7aed6d80e1a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -84,7 +84,10 @@ - type: PotentialPsionic - type: Psionic removable: false - # - type: PyrokinesisPower # Pending psionic rework + amplification: 5 + psychicFeedback: + - "ifrit-feedback" + - type: PyrokinesisPower - type: Grammar attributes: proper: true @@ -108,7 +111,7 @@ requirements: - !type:DepartmentTimeRequirement department: Epistemics - time: 14400 # DeltaV - 4 hours + time: 14400 - type: entity parent: WelderExperimental diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index c3e682e02a9..15b2cdd4fa7 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -7,22 +7,24 @@ - !type:OverallPlaytimeRequirement time: 18000 - !type:DepartmentTimeRequirement - department: Epistemics # DeltaV - Epistemics Department replacing Science + department: Epistemics time: 3600 startingGear: ForensicMantisGear icon: "JobIconForensicMantis" supervisors: job-supervisors-rd - antagAdvantage: 5 # DeltaV - From 4 to 5 - canBeAntag: true # DeltaV - Mantis is no longer a Detective - # whitelistRequired: true + antagAdvantage: 5 + canBeAntag: true access: - Research - Maintenance - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis special: - !type:AddComponentSpecial components: + - type: PotentialPsionic - type: Psionic + amplification: 0.3 + dampening: 0.3 - type: MetapsionicPower - type: startingGear @@ -34,11 +36,10 @@ head: ClothingHeadHatFezMantis id: ForensicMantisPDA eyes: ClothingEyesGlassesSunglasses - ears: ClothingHeadsetScience # DeltaV - Mantis is part of Epistemics + ears: ClothingHeadsetScience gloves: ClothingHandsGlovesColorWhite outerClothing: ClothingOuterCoatMantis belt: ClothingBeltMantis - # pocket2: ForensicScanner # DeltaV - Mantis is no longer a Detective innerClothingSkirt: ClothingUniformSkirtMantis satchel: ClothingBackpackSatchelMantisFilled duffelbag: ClothingBackpackDuffelMantisFilled diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 19cf1419111..ddb779669eb 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -3,13 +3,13 @@ name: job-name-rd description: job-description-rd playTimeTracker: JobResearchDirector - antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff + antagAdvantage: 6 requirements: - !type:DepartmentTimeRequirement - department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 54000 # DeltaV - 15 hours + department: Epistemics + time: 54000 - !type:OverallPlaytimeRequirement - time: 72000 # DeltaV - 20 hours + time: 72000 weight: 10 startingGear: ResearchDirectorGear icon: "JobIconResearchDirector" @@ -21,20 +21,20 @@ - Command - Maintenance - ResearchDirector - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml - - Chapel # DeltaV - Chaplain is in Epistemics + - Mantis + - Chapel - Cryogenics - special: # Nyanotrasen - Mystagogue can use the Bible + special: - !type:AddComponentSpecial components: - - type: BibleUser # Nyano - Lets them heal with bibles - - type: Psionic # Nyano - They start with telepathic chat - - type: DispelPower # Nyano - They get the Dispel psionic power on spawn + - type: BibleUser + - type: PotentialPsionic + - type: Psionic + dampening: 1 #Mystagogue gets a significant buff to his antimage abilities, making him better at dispelling than other people + - type: DispelPower + - type: CommandStaff - !type:AddImplantSpecial implants: [ MindShieldImplant ] - - !type:AddComponentSpecial - components: - - type: CommandStaff - type: startingGear id: ResearchDirectorGear @@ -44,7 +44,7 @@ shoes: ClothingShoesColorBrown id: RnDPDA ears: ClothingHeadsetRD - belt: BibleMystagogue # Nyanotrasen - Mystagogue book for their Ifrit + belt: BibleMystagogue innerClothingSkirt: ClothingUniformJumpskirtResearchDirector satchel: ClothingBackpackSatchelResearchDirectorFilled duffelbag: ClothingBackpackDuffelResearchDirectorFilled From c7037665e97a26a9cacb2e8ababb201b7bb6c0ed Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 15 May 2024 19:42:58 -0400 Subject: [PATCH 40/79] Update familiars.yml --- Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 7aed6d80e1a..003c899fc5c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -84,7 +84,7 @@ - type: PotentialPsionic - type: Psionic removable: false - amplification: 5 + amplification: 4 psychicFeedback: - "ifrit-feedback" - type: PyrokinesisPower From e4163c621925d7df90509102b4d1b9275f2daa00 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 28 May 2024 21:40:16 -0400 Subject: [PATCH 41/79] Update PsionicRegenerationPowerSystem.cs --- .../Abilities/PsionicRegenerationPowerSystem.cs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs index 882eb9e0b14..6958170a5c2 100644 --- a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -12,7 +12,6 @@ using Content.Shared.Popups; using Content.Shared.Psionics.Events; using Content.Shared.Examine; -using static Content.Shared.Examine.ExamineSystemShared; using Robust.Shared.Timing; using Content.Shared.Actions.Events; using Robust.Server.Audio; @@ -28,6 +27,7 @@ public sealed class PsionicRegenerationPowerSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { @@ -73,13 +73,7 @@ private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent compon component.DoAfter = doAfterId; - _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-begin", ("entity", uid)), - uid, - // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), - true, - PopupType.Medium); - + _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-begin", ("entity", uid)), uid, PopupType.Medium); _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); _psionics.LogPowerUsed(uid, "psionic regeneration", @@ -122,12 +116,7 @@ private void OnMobStateChangedEvent(EntityUid uid, PsionicRegenerationPowerCompo BreakOnDamage = false, RequireCanInteract = false, }); - _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-self-revive", ("entity", uid)), - uid, - // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), - true, - PopupType.MediumCaution); + _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-self-revive", ("entity", uid)), uid, PopupType.MediumCaution); _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); _psionics.LogPowerUsed(uid, "psionic regeneration", From 65397130e868a420741e2ba1a987fcca0a6f39f6 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 29 May 2024 02:37:00 -0400 Subject: [PATCH 42/79] Revert "Merge branch 'master' of https://github.com/VMSolidus/Einstein-Engines" This reverts commit 872b30147da98728d3c1b3c6fb7b90865c7bd7f8, reversing changes made to 15fc457e8f1ffa3a05966566dff93dbe6994310a. --- .vscode/extensions.json | 8 +- .../CardboardBox/CardboardBoxSystem.cs | 5 +- .../Cargo/UI/CargoConsoleMenu.xaml.cs | 4 +- .../Construction/ConstructionSystem.cs | 3 +- .../ContextMenu/UI/EntityMenuUIController.cs | 2 +- Content.Client/Gameplay/GameplayStateBase.cs | 2 +- Content.Client/NPC/PathfindingSystem.cs | 10 +- Content.Client/Popups/PopupOverlay.cs | 11 +- Content.Client/Popups/PopupSystem.cs | 5 - .../Overlays/RadiationPulseOverlay.cs | 5 +- Content.Client/Sandbox/SandboxSystem.cs | 3 +- .../Systems/Chat/ChatUIController.cs | 2 +- Content.Client/Verbs/VerbSystem.cs | 8 +- .../Tests/Wires/WireLayoutTest.cs | 103 ---------- .../Systems/AdminVerbSystem.Tools.cs | 16 +- .../Administration/Systems/AdminVerbSystem.cs | 3 +- .../AtmosphereSystem.HighPressureDelta.cs | 2 +- .../AtmosphereSystem.Monstermos.cs | 2 +- .../Bed/Components/SnoringComponent.cs | 10 - Content.Server/Bed/Sleep/SleepingSystem.cs | 5 +- .../TypingIndicator/TypingIndicatorSystem.cs | 2 +- .../Chemistry/EntitySystems/VaporSystem.cs | 4 +- .../Conditions/ComponentInTile.cs | 3 +- .../ConstructionSystem.Initial.cs | 7 +- .../Systems/DeviceNetworkJammerSystem.cs | 38 ---- .../Systems/DeviceNetworkSystem.cs | 11 +- .../Systems/SingletonDeviceNetServerSystem.cs | 5 +- Content.Server/Dragon/DragonSystem.cs | 3 +- .../EntitySystems/ExplosionSystem.cs | 2 +- .../GameTicking/GameTicker.Spawning.cs | 2 +- .../GameTicking/Rules/PiratesRuleSystem.cs | 4 +- Content.Server/Guardian/GuardianSystem.cs | 3 +- Content.Server/Hands/Systems/HandsSystem.cs | 3 +- .../Implants/SubdermalImplantSystem.cs | 2 +- Content.Server/Magic/MagicSystem.cs | 2 +- .../CoordinatesInRangePrecondition.cs | 2 +- .../CoordinatesNotInRangePrecondition.cs | 2 +- .../TargetInRangePrecondition.cs | 2 +- .../NPC/Pathfinding/PathfindingSystem.cs | 2 +- .../NPC/Systems/NPCSteeringSystem.Context.cs | 25 +-- .../NPC/Systems/NPCUtilitySystem.cs | 5 +- .../Pointing/EntitySystems/PointingSystem.cs | 10 +- .../EntitySystems/PowerReceiverSystem.cs | 17 +- .../Radio/EntitySystems/JammerSystem.cs | 17 -- Content.Server/Remotes/DoorRemoteSystem.cs | 3 +- .../Respawn/SpecialRespawnSystem.cs | 5 +- .../EntitySystems/GravityWellSystem.cs | 8 +- .../SingularityAttractorSystem.cs | 11 +- .../EntitySystems/BluespaceLockerSystem.cs | 3 +- .../Store/Systems/StoreSystem.Ui.cs | 9 +- .../Tabletop/TabletopSystem.Session.cs | 2 +- Content.Server/Wires/WireLayout.cs | 2 - .../Systems/Carvers/NoiseRangeCarverSystem.cs | 3 +- Content.Shared.Database/LogType.cs | 1 - Content.Shared/Anomaly/SharedAnomalySystem.cs | 2 +- .../Audio/SharedAmbientSoundSystem.cs | 11 +- .../Chemistry/Components/InjectorComponent.cs | 14 +- .../Conditions/WallmountCondition.cs | 3 +- .../DeviceNetworkJammerComponent.cs | 24 --- Content.Shared/Examine/ExamineSystemShared.cs | 12 +- .../EntitySystems/SharedHandsSystem.Pickup.cs | 2 +- .../Interaction/SharedInteractionSystem.cs | 6 +- .../Spawning/EntitySystemExtensions.cs | 2 +- Content.Shared/Store/ListingPrototype.cs | 5 +- .../Systems/SharedGunSystem.Ballistic.cs | 2 +- Resources/Changelog/Changelog.yml | 2 +- .../Locale/en-US/paper/book-authorbooks.ftl | 8 - .../catalog/cargo/cargoproduct-categories.ftl | 16 -- .../Locale/en-US/speech/speech-chatsan.ftl | 3 - Resources/Locale/en-US/traits/traits.ftl | 3 - .../Prototypes/Accents/word_replacements.yml | 17 +- Resources/Prototypes/Actions/types.yml | 2 +- .../Prototypes/Catalog/Cargo/cargo_armory.yml | 12 +- .../Catalog/Cargo/cargo_atmospherics.yml | 22 +- .../Prototypes/Catalog/Cargo/cargo_botany.yml | 10 +- .../Prototypes/Catalog/Cargo/cargo_cargo.yml | 4 +- .../Catalog/Cargo/cargo_circuitboards.yml | 2 +- .../Catalog/Cargo/cargo_emergency.yml | 16 +- .../Catalog/Cargo/cargo_engineering.yml | 28 +-- .../Catalog/Cargo/cargo_engines.yml | 36 ++-- .../Prototypes/Catalog/Cargo/cargo_food.yml | 16 +- .../Prototypes/Catalog/Cargo/cargo_fun.yml | 58 +++--- .../Catalog/Cargo/cargo_livestock.yml | 46 ++--- .../Catalog/Cargo/cargo_materials.yml | 22 +- .../Catalog/Cargo/cargo_medical.yml | 30 +-- .../Catalog/Cargo/cargo_science.yml | 6 +- .../Catalog/Cargo/cargo_security.yml | 18 +- .../Catalog/Cargo/cargo_service.yml | 38 ++-- .../Catalog/Cargo/cargo_shuttle.yml | 6 +- .../Catalog/Cargo/cargo_vending.yml | 50 ++--- .../VendingMachines/Inventories/theater.yml | 1 - .../Prototypes/Catalog/uplink_catalog.yml | 12 +- .../Entities/Clothing/Head/hats.yml | 5 +- .../Entities/Clothing/Masks/masks.yml | 10 - .../Entities/Clothing/Shoes/misc.yml | 3 - .../Prototypes/Entities/Mobs/Species/vox.yml | 2 - .../reinforcement_teleporter.yml | 2 +- .../Fun/Instruments/instruments_misc.yml | 3 - .../Instruments/instruments_percussion.yml | 2 - .../Fun/Instruments/instruments_wind.yml | 5 +- .../Prototypes/Entities/Objects/Fun/toys.yml | 3 - .../Entities/Objects/Misc/authorbooks.yml | 14 -- .../Objects/Specific/Medical/healing.yml | 28 +-- .../Entities/Objects/Specific/chemistry.yml | 7 - .../Entities/Objects/Specific/syndicate.yml | 4 +- .../Structures/Doors/Airlocks/access.yml | 189 +----------------- .../Doors/Airlocks/base_structureairlocks.yml | 3 + .../Doors/MaterialDoors/material_doors.yml | 3 + .../Structures/Doors/Shutter/shutters.yml | 3 + .../Entities/Structures/Furniture/chairs.yml | 14 +- .../Entities/Structures/Windows/window.yml | 4 +- .../Markers/Spawners/Random/books.yml | 1 - .../Markers/Spawners/Random/boxes.yml | 8 - .../Markers/Spawners/Random/devices.yml | 34 +--- .../Entities/Markers/Spawners/Random/hats.yml | 20 -- .../Markers/Spawners/Random/machineparts.yml | 2 +- .../Markers/Spawners/Random/seeds.yml | 3 - .../Graphs/clothing/ducky_slippers.yml | 22 -- .../Recipes/Construction/clothing.yml | 11 - .../Prototypes/Recipes/Reactions/drinks.yml | 6 +- Resources/Prototypes/Traits/disabilities.yml | 7 - Resources/Prototypes/Wires/layouts.yml | 20 -- Resources/Prototypes/tags.yml | 3 - .../ServerInfo/Guidebook/Engineering/TEG.xml | 179 ++--------------- .../Guidebook/Science/ArtifactReports.xml | 2 +- .../Clothing/Ears/Headsets/base.rsi/icon.png | Bin 387 -> 309 bytes .../Clothing/Ears/Headsets/base.rsi/meta.json | 2 +- .../Ears/Headsets/base_syndicate.rsi/icon.png | Bin 332 -> 288 bytes .../Headsets/base_syndicate.rsi/meta.json | 2 +- .../Clothing/Ears/Headsets/cargo.rsi/icon.png | Bin 402 -> 326 bytes .../Ears/Headsets/cargo.rsi/icon_alt.png | Bin 366 -> 516 bytes .../Ears/Headsets/cargo.rsi/meta.json | 2 +- .../Ears/Headsets/centcom.rsi/icon.png | Bin 307 -> 315 bytes .../Ears/Headsets/centcom.rsi/icon_alt.png | Bin 371 -> 469 bytes .../Ears/Headsets/centcom.rsi/meta.json | 2 +- .../Ears/Headsets/command.rsi/icon.png | Bin 396 -> 325 bytes .../Ears/Headsets/command.rsi/icon_alt.png | Bin 576 -> 504 bytes .../Ears/Headsets/command.rsi/meta.json | 2 +- .../Ears/Headsets/engineering.rsi/icon.png | Bin 405 -> 282 bytes .../Headsets/engineering.rsi/icon_alt.png | Bin 366 -> 490 bytes .../Ears/Headsets/engineering.rsi/meta.json | 2 +- .../Ears/Headsets/freelance.rsi/icon.png | Bin 402 -> 799 bytes .../Ears/Headsets/freelance.rsi/icon_alt.png | Bin 366 -> 991 bytes .../Ears/Headsets/freelance.rsi/meta.json | 2 +- .../Ears/Headsets/medical.rsi/icon.png | Bin 392 -> 287 bytes .../Ears/Headsets/medical.rsi/icon_alt.png | Bin 453 -> 469 bytes .../Ears/Headsets/medical.rsi/meta.json | 2 +- .../Ears/Headsets/medicalscience.rsi/icon.png | Bin 418 -> 316 bytes .../Headsets/medicalscience.rsi/meta.json | 2 +- .../Ears/Headsets/mining.rsi/icon.png | Bin 469 -> 396 bytes .../Ears/Headsets/mining.rsi/meta.json | 2 +- .../Ears/Headsets/robotics.rsi/icon.png | Bin 324 -> 296 bytes .../Ears/Headsets/robotics.rsi/meta.json | 2 +- .../Ears/Headsets/science.rsi/icon.png | Bin 396 -> 311 bytes .../Ears/Headsets/science.rsi/icon_alt.png | Bin 361 -> 498 bytes .../Ears/Headsets/science.rsi/meta.json | 2 +- .../Ears/Headsets/security.rsi/icon.png | Bin 408 -> 283 bytes .../Ears/Headsets/security.rsi/icon_alt.png | Bin 570 -> 455 bytes .../Ears/Headsets/security.rsi/meta.json | 2 +- .../Ears/Headsets/service.rsi/icon.png | Bin 418 -> 311 bytes .../Ears/Headsets/service.rsi/meta.json | 2 +- .../Headsets/servicesecurity.rsi/icon.png | Bin 418 -> 294 bytes .../Headsets/servicesecurity.rsi/meta.json | 2 +- .../Ears/Headsets/syndicate.rsi/icon_alt.png | Bin 515 -> 485 bytes .../Ears/Headsets/syndicate.rsi/meta.json | 2 +- .../equipped-MASK-reptilian.png | Bin 442 -> 0 bytes .../Mask/neckgaiterred.rsi/equipped-MASK.png | Bin 409 -> 0 bytes .../Clothing/Mask/neckgaiterred.rsi/icon.png | Bin 307 -> 0 bytes .../Mask/neckgaiterred.rsi/inhand-left.png | Bin 332 -> 0 bytes .../Mask/neckgaiterred.rsi/inhand-right.png | Bin 349 -> 0 bytes .../Clothing/Mask/neckgaiterred.rsi/meta.json | 30 --- .../Ears/Headsets/prisoner.rsi/icon.png | Bin 317 -> 390 bytes .../Ears/Headsets/prisoner.rsi/meta.json | 2 +- .../Headsets/securitymedical.rsi/icon.png | Bin 408 -> 371 bytes .../Headsets/securitymedical.rsi/meta.json | 2 +- .../Ears/Headsets/service.rsi/icon_alt.png | Bin 576 -> 915 bytes .../Ears/Headsets/service.rsi/meta.json | 2 +- .../syndicate_listening.rsi/icon_alt.png | Bin 515 -> 531 bytes .../syndicate_listening.rsi/meta.json | 2 +- .../Devices/communication.rsi/beacon.png | Bin 447 -> 317 bytes .../Devices/communication.rsi/beacon_dead.png | Bin 274 -> 253 bytes .../Devices/communication.rsi/meta.json | 36 ++-- .../old-radio-inhand-left.png | Bin 0 -> 215 bytes .../old-radio-inhand-right.png | Bin 0 -> 243 bytes .../Devices/communication.rsi/old-radio.png | Bin 0 -> 401 bytes .../communication.rsi/radio-inhand-left.png | Bin 215 -> 311 bytes .../communication.rsi/radio-inhand-right.png | Bin 243 -> 263 bytes .../Devices/communication.rsi/radio.png | Bin 1365 -> 536 bytes .../Devices/communication.rsi/signaller.png | Bin 456 -> 369 bytes .../communication.rsi/walkietalkie-off.png | Bin 348 -> 290 bytes .../communication.rsi/walkietalkie-on.png | Bin 207 -> 116 bytes .../communication.rsi/walkietalkie.png | Bin 509 -> 299 bytes .../Objects/Devices/jammer.rsi/jammer-on.png | Bin 537 -> 0 bytes .../Objects/Devices/jammer.rsi/jammer.png | Bin 329 -> 495 bytes .../Objects/Devices/jammer.rsi/meta.json | 16 +- .../Objects/Devices/signaller.rsi/meta.json | 4 +- .../Devices/signaller.rsi/signaller.png | Bin 456 -> 280 bytes .../Devices/station_beacon.rsi/blink.png | Bin 447 -> 373 bytes .../Devices/station_beacon.rsi/icon.png | Bin 274 -> 302 bytes .../Devices/station_beacon.rsi/meta.json | 2 +- .../Objects/Tools/crowbar.rsi/icon.png | Bin 371 -> 174 bytes .../Objects/Tools/crowbar.rsi/meta.json | 2 +- .../Objects/Tools/crowbar.rsi/red-icon.png | Bin 446 -> 200 bytes .../Objects/Tools/drill.rsi/drill_bolt.png | Bin 702 -> 886 bytes .../Objects/Tools/drill.rsi/drill_screw.png | Bin 691 -> 887 bytes .../Objects/Tools/drill.rsi/meta.json | 2 +- .../Objects/Tools/geiger.rsi/geiger_base.png | Bin 467 -> 427 bytes .../Tools/geiger.rsi/geiger_on_ext.png | Bin 260 -> 228 bytes .../Tools/geiger.rsi/geiger_on_high.png | Bin 218 -> 176 bytes .../Tools/geiger.rsi/geiger_on_idle.png | Bin 218 -> 173 bytes .../Tools/geiger.rsi/geiger_on_low.png | Bin 218 -> 176 bytes .../Tools/geiger.rsi/geiger_on_med.png | Bin 218 -> 176 bytes .../Objects/Tools/geiger.rsi/meta.json | 2 +- .../Tools/hand_labeler.rsi/hand_labeler.png | Bin 479 -> 273 bytes .../Objects/Tools/hand_labeler.rsi/meta.json | 2 +- .../Tools/multitool.rsi/green-unlit.png | Bin 176 -> 123 bytes .../Objects/Tools/multitool.rsi/icon.png | Bin 540 -> 359 bytes .../Objects/Tools/multitool.rsi/meta.json | 2 +- .../Objects/Tools/multitool.rsi/red-unlit.png | Bin 175 -> 117 bytes .../Tools/multitool.rsi/yellow-unlit.png | Bin 174 -> 121 bytes .../Textures/Objects/Tools/rcd.rsi/icon.png | Bin 857 -> 638 bytes .../Objects/Tools/screwdriver.rsi/meta.json | 2 +- .../Tools/screwdriver.rsi/screwdriver-map.png | Bin 310 -> 262 bytes .../screwdriver-screwybits.png | Bin 225 -> 152 bytes .../Tools/screwdriver.rsi/screwdriver.png | Bin 223 -> 227 bytes .../Objects/Tools/seclite.rsi/meta.json | 2 +- .../Objects/Tools/seclite.rsi/seclite-on.png | Bin 260 -> 287 bytes .../Tools/seclite.rsi/seclite-overlay.png | Bin 279 -> 121 bytes .../Objects/Tools/seclite.rsi/seclite.png | Bin 321 -> 286 bytes .../Objects/Tools/spray_painter.rsi/meta.json | 2 +- .../Tools/spray_painter.rsi/spray_painter.png | Bin 772 -> 518 bytes .../Objects/Tools/welder.rsi/icon.png | Bin 568 -> 290 bytes .../Objects/Tools/welder.rsi/meta.json | 2 +- .../Objects/Tools/welder.rsi/welder_flame.png | Bin 255 -> 181 bytes .../Tools/welder_experimental.rsi/icon.png | Bin 907 -> 564 bytes .../Tools/welder_experimental.rsi/meta.json | 2 +- .../welder_experimental.rsi/welder_flame.png | Bin 247 -> 295 bytes .../Tools/welder_industrial.rsi/icon.png | Bin 462 -> 345 bytes .../Tools/welder_industrial.rsi/meta.json | 2 +- .../welder_industrial.rsi/welder_flame.png | Bin 247 -> 296 bytes .../Tools/welder_industrialadv.rsi/icon.png | Bin 548 -> 396 bytes .../Tools/welder_industrialadv.rsi/meta.json | 2 +- .../welder_industrialadv.rsi/welder_flame.png | Bin 247 -> 297 bytes .../wirecutters.rsi/cutters-cutty-thingy.png | Bin 239 -> 217 bytes .../Tools/wirecutters.rsi/cutters-map.png | Bin 411 -> 331 bytes .../Objects/Tools/wirecutters.rsi/cutters.png | Bin 231 -> 228 bytes .../Objects/Tools/wirecutters.rsi/meta.json | 2 +- .../Objects/Tools/wrench.rsi/icon.png | Bin 484 -> 230 bytes .../Objects/Tools/wrench.rsi/meta.json | 2 +- .../Doors/secret_door.rsi/assembly.png | Bin 178 -> 305 bytes .../Doors/secret_door.rsi/closed.png | Bin 117 -> 171 bytes .../Doors/secret_door.rsi/closing.png | Bin 563 -> 516 bytes .../Doors/secret_door.rsi/meta.json | 24 +-- .../Structures/Doors/secret_door.rsi/open.png | Bin 170 -> 219 bytes .../Doors/secret_door.rsi/opening.png | Bin 582 -> 530 bytes .../Walls/reinforced_diagonal.rsi/meta.json | 2 +- .../Walls/reinforced_diagonal.rsi/state0.png | Bin 5943 -> 666 bytes .../Walls/reinforced_diagonal.rsi/state1.png | Bin 5829 -> 639 bytes .../Structures/Walls/shuttle.rsi/meta.json | 20 +- .../Walls/shuttle.rsi/shuttle_construct-0.png | Bin 632 -> 0 bytes .../Walls/shuttle.rsi/shuttle_construct-1.png | Bin 652 -> 0 bytes .../Walls/shuttle.rsi/shuttle_construct-2.png | Bin 689 -> 0 bytes .../Walls/shuttle.rsi/shuttle_construct-3.png | Bin 690 -> 0 bytes .../Walls/shuttle.rsi/shuttle_construct-4.png | Bin 675 -> 0 bytes .../Walls/shuttle.rsi/shuttle_construct-5.png | Bin 671 -> 0 bytes .../Structures/Walls/solid.rsi/full.png | Bin 168 -> 547 bytes .../Structures/Walls/solid.rsi/meta.json | 2 +- .../Walls/solid.rsi/reinf_construct-0.png | Bin 225 -> 891 bytes .../Walls/solid.rsi/reinf_construct-1.png | Bin 266 -> 863 bytes .../Walls/solid.rsi/reinf_construct-2.png | Bin 264 -> 956 bytes .../Walls/solid.rsi/reinf_construct-3.png | Bin 262 -> 956 bytes .../Walls/solid.rsi/reinf_construct-4.png | Bin 265 -> 963 bytes .../Walls/solid.rsi/reinf_construct-5.png | Bin 258 -> 1016 bytes .../Walls/solid.rsi/reinf_over0.png | Bin 481 -> 1128 bytes .../Walls/solid.rsi/reinf_over1.png | Bin 395 -> 994 bytes .../Walls/solid.rsi/reinf_over2.png | Bin 481 -> 1128 bytes .../Walls/solid.rsi/reinf_over3.png | Bin 395 -> 994 bytes .../Walls/solid.rsi/reinf_over4.png | Bin 393 -> 991 bytes .../Walls/solid.rsi/reinf_over5.png | Bin 352 -> 880 bytes .../Walls/solid.rsi/reinf_over6.png | Bin 393 -> 991 bytes .../Walls/solid.rsi/reinf_over7.png | Bin 204 -> 763 bytes .../Structures/Walls/solid.rsi/rgeneric.png | Bin 225 -> 864 bytes .../Structures/Walls/solid.rsi/solid0.png | Bin 391 -> 782 bytes .../Structures/Walls/solid.rsi/solid1.png | Bin 274 -> 415 bytes .../Structures/Walls/solid.rsi/solid2.png | Bin 391 -> 782 bytes .../Structures/Walls/solid.rsi/solid3.png | Bin 274 -> 415 bytes .../Structures/Walls/solid.rsi/solid4.png | Bin 280 -> 423 bytes .../Structures/Walls/solid.rsi/solid5.png | Bin 352 -> 448 bytes .../Structures/Walls/solid.rsi/solid6.png | Bin 280 -> 423 bytes .../Structures/Walls/solid.rsi/solid7.png | Bin 204 -> 261 bytes .../Walls/solid_diagonal.rsi/state0.png | Bin 316 -> 316 bytes .../Walls/solid_diagonal.rsi/state1.png | Bin 292 -> 297 bytes .../Windows/plasma_diagonal.rsi/state0.png | Bin 729 -> 15748 bytes .../Windows/plasma_diagonal.rsi/state1.png | Bin 704 -> 15665 bytes .../Windows/plasma_window.rsi/full.png | Bin 430 -> 1597 bytes .../Windows/plasma_window.rsi/meta.json | 2 +- .../Windows/plasma_window.rsi/pwindow0.png | Bin 762 -> 2063 bytes .../Windows/plasma_window.rsi/pwindow1.png | Bin 735 -> 1099 bytes .../Windows/plasma_window.rsi/pwindow2.png | Bin 762 -> 2063 bytes .../Windows/plasma_window.rsi/pwindow3.png | Bin 735 -> 1099 bytes .../Windows/plasma_window.rsi/pwindow4.png | Bin 734 -> 1161 bytes .../Windows/plasma_window.rsi/pwindow5.png | Bin 680 -> 1064 bytes .../Windows/plasma_window.rsi/pwindow6.png | Bin 734 -> 1161 bytes .../Windows/plasma_window.rsi/pwindow7.png | Bin 270 -> 247 bytes .../reinforced_plasma_diagonal.rsi/state0.png | Bin 764 -> 15911 bytes .../reinforced_plasma_diagonal.rsi/state1.png | Bin 737 -> 15885 bytes .../reinforced_plasma_window.rsi/full.png | Bin 443 -> 2495 bytes .../reinforced_plasma_window.rsi/meta.json | 2 +- .../rpwindow0.png | Bin 776 -> 2930 bytes .../rpwindow1.png | Bin 877 -> 1696 bytes .../rpwindow2.png | Bin 776 -> 2930 bytes .../rpwindow3.png | Bin 877 -> 1696 bytes .../rpwindow4.png | Bin 874 -> 1745 bytes .../rpwindow5.png | Bin 721 -> 1695 bytes .../rpwindow6.png | Bin 874 -> 1745 bytes .../rpwindow7.png | Bin 270 -> 910 bytes .../state0.png | Bin 765 -> 15734 bytes .../state1.png | Bin 739 -> 15695 bytes .../reinforced_uranium_window.rsi/full.png | Bin 452 -> 2067 bytes .../reinforced_uranium_window.rsi/meta.json | 90 ++++----- .../ruwindow0.png | Bin 750 -> 2366 bytes .../ruwindow1.png | Bin 872 -> 1169 bytes .../ruwindow2.png | Bin 750 -> 2342 bytes .../ruwindow3.png | Bin 872 -> 1138 bytes .../ruwindow4.png | Bin 874 -> 1133 bytes .../ruwindow5.png | Bin 704 -> 1088 bytes .../ruwindow6.png | Bin 874 -> 1129 bytes .../ruwindow7.png | Bin 270 -> 267 bytes .../Windows/reinforced_window.rsi/full.png | Bin 437 -> 2063 bytes .../Windows/reinforced_window.rsi/meta.json | 2 +- .../reinforced_window.rsi/rwindow0.png | Bin 758 -> 2229 bytes .../reinforced_window.rsi/rwindow1.png | Bin 620 -> 1148 bytes .../reinforced_window.rsi/rwindow2.png | Bin 758 -> 2229 bytes .../reinforced_window.rsi/rwindow3.png | Bin 620 -> 1148 bytes .../reinforced_window.rsi/rwindow4.png | Bin 615 -> 1130 bytes .../reinforced_window.rsi/rwindow5.png | Bin 706 -> 1025 bytes .../reinforced_window.rsi/rwindow6.png | Bin 615 -> 1130 bytes .../reinforced_window.rsi/rwindow7.png | Bin 268 -> 272 bytes .../reinforced_window_diagonal.rsi/state0.png | Bin 768 -> 16179 bytes .../reinforced_window_diagonal.rsi/state1.png | Bin 741 -> 16152 bytes .../Windows/tinted_window.rsi/full.png | Bin 387 -> 9436 bytes .../Windows/tinted_window.rsi/meta.json | 2 +- .../Windows/tinted_window.rsi/twindow0.png | Bin 2397 -> 10814 bytes .../Windows/tinted_window.rsi/twindow1.png | Bin 2230 -> 8214 bytes .../Windows/tinted_window.rsi/twindow2.png | Bin 2397 -> 10815 bytes .../Windows/tinted_window.rsi/twindow3.png | Bin 2230 -> 8477 bytes .../Windows/tinted_window.rsi/twindow4.png | Bin 2236 -> 8217 bytes .../Windows/tinted_window.rsi/twindow5.png | Bin 2336 -> 6896 bytes .../Windows/tinted_window.rsi/twindow6.png | Bin 2236 -> 8464 bytes .../Windows/tinted_window.rsi/twindow7.png | Bin 1915 -> 4882 bytes .../Windows/uranium_window.rsi/full.png | Bin 432 -> 1321 bytes .../Windows/uranium_window.rsi/meta.json | 90 ++++----- .../Windows/uranium_window.rsi/uwindow0.png | Bin 773 -> 1688 bytes .../Windows/uranium_window.rsi/uwindow1.png | Bin 739 -> 1225 bytes .../Windows/uranium_window.rsi/uwindow2.png | Bin 773 -> 1688 bytes .../Windows/uranium_window.rsi/uwindow3.png | Bin 739 -> 1225 bytes .../Windows/uranium_window.rsi/uwindow4.png | Bin 739 -> 1216 bytes .../Windows/uranium_window.rsi/uwindow5.png | Bin 664 -> 795 bytes .../Windows/uranium_window.rsi/uwindow6.png | Bin 739 -> 1229 bytes .../Windows/uranium_window.rsi/uwindow7.png | Bin 270 -> 297 bytes .../uranium_window_diagonal.rsi/state0.png | Bin 729 -> 15629 bytes .../uranium_window_diagonal.rsi/state1.png | Bin 703 -> 15604 bytes .../Structures/Windows/window.rsi/full.png | Bin 427 -> 1224 bytes .../Structures/Windows/window.rsi/meta.json | 2 +- .../Structures/Windows/window.rsi/window0.png | Bin 714 -> 1632 bytes .../Structures/Windows/window.rsi/window1.png | Bin 518 -> 1183 bytes .../Structures/Windows/window.rsi/window2.png | Bin 714 -> 1632 bytes .../Structures/Windows/window.rsi/window3.png | Bin 518 -> 1183 bytes .../Structures/Windows/window.rsi/window4.png | Bin 523 -> 1187 bytes .../Structures/Windows/window.rsi/window5.png | Bin 666 -> 800 bytes .../Structures/Windows/window.rsi/window6.png | Bin 523 -> 1187 bytes .../Structures/Windows/window.rsi/window7.png | Bin 268 -> 301 bytes .../Windows/window_diagonal.rsi/state0.png | Bin 735 -> 15988 bytes .../Windows/window_diagonal.rsi/state1.png | Bin 702 -> 15966 bytes Resources/engineCommandPerms.yml | 1 - 375 files changed, 562 insertions(+), 1451 deletions(-) delete mode 100644 Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs delete mode 100644 Content.Server/Bed/Components/SnoringComponent.cs delete mode 100644 Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs delete mode 100644 Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs delete mode 100644 Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl delete mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml delete mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png delete mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK.png delete mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/icon.png delete mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-right.png delete mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-right.png create mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio.png delete mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png delete mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-0.png delete mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-1.png delete mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-2.png delete mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-3.png delete mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-4.png delete mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-5.png diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 737b90563e8..83bca6f97bc 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,12 +1,6 @@ { "recommendations": [ "ms-dotnettools.csharp", - "editorconfig.editorconfig", - "aaron-bond.better-comments", - "tamasfe.even-better-toml", - "slava0135.robust-yaml", - "slevesque.shader", - "macabeus.vscode-fluent", - "redhat.vscode-yaml" + "editorconfig.editorconfig" ] } diff --git a/Content.Client/CardboardBox/CardboardBoxSystem.cs b/Content.Client/CardboardBox/CardboardBoxSystem.cs index 90a21d8e41b..50f9de239d5 100644 --- a/Content.Client/CardboardBox/CardboardBoxSystem.cs +++ b/Content.Client/CardboardBox/CardboardBoxSystem.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.CardboardBox; using Content.Shared.CardboardBox.Components; using Content.Shared.Examine; @@ -11,7 +11,6 @@ public sealed class CardboardBoxSystem : SharedCardboardBoxSystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly TransformSystem _transform = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { @@ -56,7 +55,7 @@ private void OnBoxEffect(PlayBoxEffectMessage msg) foreach (var mob in mobMoverEntities) { var mapPos = _transform.GetMapCoordinates(mob); - if (!_examine.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) + if (!ExamineSystemShared.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) continue; var ent = Spawn(box.Effect, mapPos); diff --git a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs index e60335bc45c..baf0d31f1f1 100644 --- a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs +++ b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs @@ -93,7 +93,7 @@ public void PopulateProducts() if (search.Length == 0 && _category == null || search.Length != 0 && prototype.Name.ToLowerInvariant().Contains(search) || search.Length != 0 && prototype.Description.ToLowerInvariant().Contains(search) || - search.Length == 0 && _category != null && Loc.GetString(prototype.Category).Equals(_category)) + search.Length == 0 && _category != null && prototype.Category.Equals(_category)) { var button = new CargoProductRow { @@ -122,7 +122,7 @@ public void PopulateCategories() foreach (var prototype in ProductPrototypes) { - if (!_categoryStrings.Contains(Loc.GetString(prototype.Category))) + if (!_categoryStrings.Contains(prototype.Category)) { _categoryStrings.Add(Loc.GetString(prototype.Category)); } diff --git a/Content.Client/Construction/ConstructionSystem.cs b/Content.Client/Construction/ConstructionSystem.cs index 66000a8457d..ae1724c3bf6 100644 --- a/Content.Client/Construction/ConstructionSystem.cs +++ b/Content.Client/Construction/ConstructionSystem.cs @@ -27,7 +27,6 @@ public sealed class ConstructionSystem : SharedConstructionSystem [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; private readonly Dictionary _ghosts = new(); @@ -196,7 +195,7 @@ public bool TrySpawnGhost( return false; // This InRangeUnobstructed should probably be replaced with "is there something blocking us in that tile?" - var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager, _transformSystem)); + var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager)); if (!_interactionSystem.InRangeUnobstructed(user, loc, 20f, predicate: predicate)) return false; diff --git a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs index a60619baa35..ae1b3ec3bf0 100644 --- a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs +++ b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs @@ -170,7 +170,7 @@ private bool HandleOpenEntityMenu(in PointerInputCmdHandler.PointerInputCmdArgs if (_combatMode.IsInCombatMode(args.Session?.AttachedEntity)) return false; - var coords = args.Coordinates.ToMap(_entityManager, _xform); + var coords = args.Coordinates.ToMap(_entityManager); if (_verbSystem.TryGetEntityMenuEntities(coords, out var entities)) OpenRootMenu(entities); diff --git a/Content.Client/Gameplay/GameplayStateBase.cs b/Content.Client/Gameplay/GameplayStateBase.cs index 6236cd8e958..bdbd69d1086 100644 --- a/Content.Client/Gameplay/GameplayStateBase.cs +++ b/Content.Client/Gameplay/GameplayStateBase.cs @@ -104,7 +104,7 @@ private bool HandleInspect(ICommonSession? session, EntityCoordinates coords, En public IEnumerable GetClickableEntities(EntityCoordinates coordinates) { - return GetClickableEntities(coordinates.ToMap(_entityManager, _entitySystemManager.GetEntitySystem())); + return GetClickableEntities(coordinates.ToMap(_entityManager)); } public IEnumerable GetClickableEntities(MapCoordinates coordinates) diff --git a/Content.Client/NPC/PathfindingSystem.cs b/Content.Client/NPC/PathfindingSystem.cs index 7bf3df1f0b9..548edd601ce 100644 --- a/Content.Client/NPC/PathfindingSystem.cs +++ b/Content.Client/NPC/PathfindingSystem.cs @@ -23,7 +23,6 @@ public sealed class PathfindingSystem : SharedPathfindingSystem [Dependency] private readonly IResourceCache _cache = default!; [Dependency] private readonly NPCSteeringSystem _steering = default!; [Dependency] private readonly MapSystem _mapSystem = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; public PathfindingDebugMode Modes { @@ -40,7 +39,7 @@ public PathfindingDebugMode Modes } else if (!overlayManager.HasOverlay()) { - overlayManager.AddOverlay(new PathfindingOverlay(EntityManager, _eyeManager, _inputManager, _mapManager, _cache, this, _mapSystem, _transformSystem)); + overlayManager.AddOverlay(new PathfindingOverlay(EntityManager, _eyeManager, _inputManager, _mapManager, _cache, this, _mapSystem)); } if ((value & PathfindingDebugMode.Steering) != 0x0) @@ -141,7 +140,6 @@ public sealed class PathfindingOverlay : Overlay private readonly IMapManager _mapManager; private readonly PathfindingSystem _system; private readonly MapSystem _mapSystem; - private readonly SharedTransformSystem _transformSystem; public override OverlaySpace Space => OverlaySpace.ScreenSpace | OverlaySpace.WorldSpace; @@ -155,8 +153,7 @@ public PathfindingOverlay( IMapManager mapManager, IResourceCache cache, PathfindingSystem system, - MapSystem mapSystem, - SharedTransformSystem transformSystem) + MapSystem mapSystem) { _entManager = entManager; _eyeManager = eyeManager; @@ -164,7 +161,6 @@ public PathfindingOverlay( _mapManager = mapManager; _system = system; _mapSystem = mapSystem; - _transformSystem = transformSystem; _font = new VectorFont(cache.GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10); } @@ -484,7 +480,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) if (neighborPoly.NetEntity != poly.GraphUid) { color = Color.Green; - var neighborMap = _entManager.GetCoordinates(neighborPoly).ToMap(_entManager, _transformSystem); + var neighborMap = _entManager.GetCoordinates(neighborPoly).ToMap(_entManager); if (neighborMap.MapId != args.MapId) continue; diff --git a/Content.Client/Popups/PopupOverlay.cs b/Content.Client/Popups/PopupOverlay.cs index fb6bb3bf565..1305d8bb947 100644 --- a/Content.Client/Popups/PopupOverlay.cs +++ b/Content.Client/Popups/PopupOverlay.cs @@ -21,8 +21,7 @@ public sealed class PopupOverlay : Overlay private readonly IUserInterfaceManager _uiManager; private readonly PopupSystem _popup; private readonly PopupUIController _controller; - private readonly ExamineSystemShared _examine; - private readonly SharedTransformSystem _transform; + private readonly ShaderInstance _shader; public override OverlaySpace Space => OverlaySpace.ScreenSpace; @@ -34,16 +33,12 @@ public PopupOverlay( IPrototypeManager protoManager, IUserInterfaceManager uiManager, PopupUIController controller, - ExamineSystemShared examine, - SharedTransformSystem transform, PopupSystem popup) { _configManager = configManager; _entManager = entManager; _playerMgr = playerMgr; _uiManager = uiManager; - _examine = examine; - _transform = transform; _popup = popup; _controller = controller; @@ -78,7 +73,7 @@ private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, fl foreach (var popup in _popup.WorldLabels) { - var mapPos = popup.InitialPos.ToMap(_entManager, _transform); + var mapPos = popup.InitialPos.ToMap(_entManager); if (mapPos.MapId != args.MapId) continue; @@ -86,7 +81,7 @@ private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, fl var distance = (mapPos.Position - args.WorldBounds.Center).Length(); // Should handle fade here too wyci. - if (!args.WorldBounds.Contains(mapPos.Position) || !_examine.InRangeUnOccluded(viewPos, mapPos, distance, + if (!args.WorldBounds.Contains(mapPos.Position) || !ExamineSystemShared.InRangeUnOccluded(viewPos, mapPos, distance, e => e == popup.InitialPos.EntityId || e == ourEntity, entMan: _entManager)) continue; diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index 479fb02906c..cf96c41241a 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Shared.Examine; using Content.Shared.GameTicking; using Content.Shared.Popups; using Robust.Client.Graphics; @@ -27,8 +26,6 @@ public sealed class PopupSystem : SharedPopupSystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; [Dependency] private readonly IReplayRecordingManager _replayRecording = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; public IReadOnlyList WorldLabels => _aliveWorldLabels; public IReadOnlyList CursorLabels => _aliveCursorLabels; @@ -54,8 +51,6 @@ public override void Initialize() _prototype, _uiManager, _uiManager.GetUIController(), - _examine, - _transform, this)); } diff --git a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs index 9012767ef3f..adc535b2684 100644 --- a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs +++ b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs @@ -121,10 +121,7 @@ private void RadiationQuery(IEye? currentEye) private bool PulseQualifies(EntityUid pulseEntity, MapCoordinates currentEyeLoc) { - var transformComponent = _entityManager.GetComponent(pulseEntity); - var transformSystem = _entityManager.System(); - return transformComponent.MapID == currentEyeLoc.MapId - && transformComponent.Coordinates.InRange(_entityManager, transformSystem, EntityCoordinates.FromMap(transformComponent.ParentUid, currentEyeLoc, transformSystem, _entityManager), MaxDist); + return _entityManager.GetComponent(pulseEntity).MapID == currentEyeLoc.MapId && _entityManager.GetComponent(pulseEntity).Coordinates.InRange(_entityManager, EntityCoordinates.FromMap(_entityManager, _entityManager.GetComponent(pulseEntity).ParentUid, currentEyeLoc), MaxDist); } private sealed record RadiationShaderInstance(MapCoordinates CurrentMapCoords, float Range, TimeSpan Start, float Duration) diff --git a/Content.Client/Sandbox/SandboxSystem.cs b/Content.Client/Sandbox/SandboxSystem.cs index 6a1129bb75d..d16751e3715 100644 --- a/Content.Client/Sandbox/SandboxSystem.cs +++ b/Content.Client/Sandbox/SandboxSystem.cs @@ -16,7 +16,6 @@ public sealed class SandboxSystem : SharedSandboxSystem [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IPlacementManager _placement = default!; [Dependency] private readonly ContentEyeSystem _contentEye = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; private bool _sandboxEnabled; public bool SandboxAllowed { get; private set; } @@ -109,7 +108,7 @@ public bool Copy(ICommonSession? session, EntityCoordinates coords, EntityUid ui } // Try copy tile. - if (!_map.TryFindGridAt(coords.ToMap(EntityManager, _transform), out _, out var grid) || !grid.TryGetTileRef(coords, out var tileRef)) + if (!_map.TryFindGridAt(coords.ToMap(EntityManager), out _, out var grid) || !grid.TryGetTileRef(coords, out var tileRef)) return false; if (_placement.Eraser) diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index 57b22e3f333..79c1909ebaf 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -626,7 +626,7 @@ private void UpdateQueuedSpeechBubbles(FrameEventArgs delta) var otherPos = EntityManager.GetComponent(ent).MapPosition; - if (occluded && !_examine.InRangeUnOccluded( + if (occluded && !ExamineSystemShared.InRangeUnOccluded( playerPos, otherPos, 0f, (ent, player), predicate)) diff --git a/Content.Client/Verbs/VerbSystem.cs b/Content.Client/Verbs/VerbSystem.cs index 77f46a3fc97..329a8977a68 100644 --- a/Content.Client/Verbs/VerbSystem.cs +++ b/Content.Client/Verbs/VerbSystem.cs @@ -20,7 +20,7 @@ namespace Content.Client.Verbs public sealed class VerbSystem : SharedVerbSystem { [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly ExamineSystem _examine = default!; + [Dependency] private readonly ExamineSystem _examineSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly IStateManager _stateManager = default!; [Dependency] private readonly EntityLookupSystem _entityLookup = default!; @@ -77,7 +77,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true bool Predicate(EntityUid e) => e == player || entitiesUnderMouse.Contains(e); // first check the general location. - if (!_examine.CanExamine(player.Value, targetPos, Predicate)) + if (!_examineSystem.CanExamine(player.Value, targetPos, Predicate)) return false; TryComp(player.Value, out ExaminerComponent? examiner); @@ -86,7 +86,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true entities = new(); foreach (var ent in _entityLookup.GetEntitiesInRange(targetPos, EntityMenuLookupSize)) { - if (_examine.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) + if (_examineSystem.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) entities.Add(ent); } } @@ -147,7 +147,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true { var entity = entities[i]; - if (!_examine.InRangeUnOccluded( + if (!ExamineSystemShared.InRangeUnOccluded( playerPos, xformQuery.GetComponent(entity).MapPosition, ExamineSystemShared.ExamineRange, diff --git a/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs b/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs deleted file mode 100644 index 920dc088186..00000000000 --- a/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Content.Server.Doors; -using Content.Server.Power; -using Content.Server.Wires; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Map; - -namespace Content.IntegrationTests.Tests.Wires; - -[TestFixture] -[Parallelizable(ParallelScope.All)] -[TestOf(typeof(WiresSystem))] -public sealed class WireLayoutTest -{ - [TestPrototypes] - public const string Prototypes = """ - - type: wireLayout - id: WireLayoutTest - dummyWires: 2 - wires: - - !type:PowerWireAction - - !type:DoorBoltWireAction - - - type: wireLayout - id: WireLayoutTest2 - parent: WireLayoutTest - wires: - - !type:PowerWireAction - - - type: wireLayout - id: WireLayoutTest3 - parent: WireLayoutTest - - - type: entity - id: WireLayoutTest - components: - - type: Wires - layoutId: WireLayoutTest - - - type: entity - id: WireLayoutTest2 - components: - - type: Wires - layoutId: WireLayoutTest2 - - - type: entity - id: WireLayoutTest3 - components: - - type: Wires - layoutId: WireLayoutTest3 - """; - - [Test] - public async Task TestLayoutInheritance() - { - await using var pair = await PoolManager.GetServerClient(); - var server = pair.Server; - var testMap = await pair.CreateTestMap(); - - await server.WaitAssertion(() => - { - var wires = IoCManager.Resolve().GetEntitySystem(); - - // Need to spawn these entities to make sure the wire layouts are initialized. - var ent1 = SpawnWithComp(server.EntMan, "WireLayoutTest", testMap.MapCoords); - var ent2 = SpawnWithComp(server.EntMan, "WireLayoutTest2", testMap.MapCoords); - var ent3 = SpawnWithComp(server.EntMan, "WireLayoutTest3", testMap.MapCoords); - - // Assert.That(wires.TryGetLayout("WireLayoutTest", out var layout1)); - // Assert.That(wires.TryGetLayout("WireLayoutTest2", out var layout2)); - // Assert.That(wires.TryGetLayout("WireLayoutTest3", out var layout3)); - - Assert.Multiple(() => - { - // Entity 1. - Assert.That(ent1.Comp.WiresList, Has.Count.EqualTo(4)); - Assert.That(ent1.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); - Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire"); - Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); - - Assert.That(ent2.Comp.WiresList, Has.Count.EqualTo(5)); - Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); - Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").InstanceOf(), "2 power wire"); - Assert.That(ent2.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); - - Assert.That(ent3.Comp.WiresList, Has.Count.EqualTo(4)); - Assert.That(ent3.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); - Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire"); - Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); - }); - }); - - await pair.CleanReturnAsync(); - } - - private static Entity SpawnWithComp(IEntityManager entityManager, string prototype, MapCoordinates coords) - where T : IComponent, new() - { - var ent = entityManager.Spawn(prototype, coords); - var comp = entityManager.EnsureComponent(ent); - return new Entity(ent, comp); - } -} diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index 9d66338c8bf..c68336deab8 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -718,21 +718,9 @@ private void AddTricksVerbs(GetVerbsEvent args) Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/caps.rsi"), "mag-6"), Act = () => { - _quickDialog.OpenDialog(player, "Set Bullet Amount", $"Amount (standard {ballisticAmmo.Capacity}):", (string amount) => + _quickDialog.OpenDialog(player, "Set Bullet Amount", $"Amount (max {ballisticAmmo.Capacity}):", (int amount) => { - if (!int.TryParse(amount, out var result)) - return; - - if (result > 0) - { - ballisticAmmo.UnspawnedCount = result; - } - else - { - ballisticAmmo.UnspawnedCount = 0; - } - - _gun.UpdateBallisticAppearance(args.Target, ballisticAmmo); + ballisticAmmo.UnspawnedCount = amount; }); }, Impact = LogImpact.Medium, diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index f5b237b4492..c4754af9340 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -66,7 +66,6 @@ public sealed partial class AdminVerbSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly StationSystem _stations = default!; [Dependency] private readonly StationSpawningSystem _spawning = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; private readonly Dictionary> _openSolutionUis = new(); @@ -417,7 +416,7 @@ private void AddDebugVerbs(GetVerbsEvent args) Act = () => { - var message = _examine.InRangeUnOccluded(args.User, args.Target) + var message = ExamineSystemShared.InRangeUnOccluded(args.User, args.Target) ? Loc.GetString("in-range-unoccluded-verb-on-activate-not-occluded") : Loc.GetString("in-range-unoccluded-verb-on-activate-occluded"); diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index cb50ff114e0..77b5bf18af2 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -236,7 +236,7 @@ public void ExperiencePressureDifference( // TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs. if (throwTarget != EntityCoordinates.Invalid) { - var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); + var pos = ((throwTarget.ToMap(EntityManager).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); _physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics); } else diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index dcbc1e86ee2..f156125b0ff 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -661,7 +661,7 @@ private void AdjustEqMovement(TileAtmosphere tile, AtmosDirection direction, flo // Turns out: no they don't. Temporary debug checks to figure out which caller is causing problems: if (tile == null) { - Log.Error($"Encountered null-tile in {nameof(AdjustEqMovement)}. Trace: {Environment.StackTrace}"); + Logger.Error($"Encountered null-tile in {nameof(AdjustEqMovement)}. Trace: {Environment.StackTrace}"); return; } var adj = tile.AdjacentTiles[direction.ToIndex()]; diff --git a/Content.Server/Bed/Components/SnoringComponent.cs b/Content.Server/Bed/Components/SnoringComponent.cs deleted file mode 100644 index 09f80327ba7..00000000000 --- a/Content.Server/Bed/Components/SnoringComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Content.Server.Bed.Sleep; - -/// -/// This is used for the snoring trait. -/// -[RegisterComponent] -public sealed partial class SnoringComponent : Component -{ - -} diff --git a/Content.Server/Bed/Sleep/SleepingSystem.cs b/Content.Server/Bed/Sleep/SleepingSystem.cs index b4972544338..685b1087d70 100644 --- a/Content.Server/Bed/Sleep/SleepingSystem.cs +++ b/Content.Server/Bed/Sleep/SleepingSystem.cs @@ -67,10 +67,7 @@ private void OnSleepStateChanged(EntityUid uid, MobStateComponent component, Sle if (TryComp(uid, out var sleepSound)) { var emitSound = EnsureComp(uid); - if (HasComp(uid)) - { - emitSound.Sound = sleepSound.Snore; - } + emitSound.Sound = sleepSound.Snore; emitSound.PlayChance = sleepSound.Chance; emitSound.RollInterval = sleepSound.Interval; emitSound.PopUp = sleepSound.PopUp; diff --git a/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs b/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs index c923738930a..761e9456bcd 100644 --- a/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs +++ b/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs @@ -39,7 +39,7 @@ private void OnClientTypingChanged(TypingChangedEvent ev, EntitySessionEventArgs var uid = args.SenderSession.AttachedEntity; if (!Exists(uid)) { - Log.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity."); + Logger.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity."); return; } diff --git a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs index 1415b6cad3c..7d3f70bc0d8 100644 --- a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs @@ -22,8 +22,8 @@ namespace Content.Server.Chemistry.EntitySystems [UsedImplicitly] internal sealed class VaporSystem : EntitySystem { + [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; - [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; @@ -115,7 +115,7 @@ private void Update(float frameTime, Entity ent, Entity(); - var indices = transform.Coordinates.ToVector2i(entityManager, IoCManager.Resolve(), transformSys); + var indices = transform.Coordinates.ToVector2i(entityManager, IoCManager.Resolve()); var lookup = entityManager.EntitySysManager.GetEntitySystem(); diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index 39705fc1974..e0bdf096296 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Threading.Tasks; using Content.Server.Construction.Components; +using Content.Server.Storage.EntitySystems; using Content.Shared.ActionBlocker; using Content.Shared.Construction; using Content.Shared.Construction.Prototypes; @@ -14,6 +15,7 @@ using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Storage; +using Content.Shared.Tag; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -28,7 +30,8 @@ public sealed partial class ConstructionSystem [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly EntityLookupSystem _lookupSystem = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; + [Dependency] private readonly StorageSystem _storageSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; // --- WARNING! LEGACY CODE AHEAD! --- // This entire file contains the legacy code for initial construction. @@ -463,7 +466,7 @@ void Cleanup() return; } - var mapPos = location.ToMap(EntityManager, _transformSystem); + var mapPos = location.ToMap(EntityManager); var predicate = GetPredicate(constructionPrototype.CanBuildInImpassable, mapPos); if (!_interactionSystem.InRangeUnobstructed(user, mapPos, predicate: predicate)) diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs deleted file mode 100644 index 3d3820562d6..00000000000 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Server.DeviceNetwork.Components; -using Content.Shared.DeviceNetwork.Components; -using Robust.Server.GameObjects; - -namespace Content.Server.DeviceNetwork.Systems; - -public sealed class DeviceNetworkJammerSystem : EntitySystem -{ - [Dependency] private TransformSystem _transform = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(BeforePacketSent); - } - - private void BeforePacketSent(EntityUid uid, TransformComponent xform, BeforePacketSentEvent ev) - { - if (ev.Cancelled) - return; - - var query = EntityQueryEnumerator(); - - while (query.MoveNext(out _, out var jammerComp, out var jammerXform)) - { - if (!jammerComp.JammableNetworks.Contains(ev.NetworkId)) - continue; - - if (jammerXform.Coordinates.InRange(EntityManager, _transform, ev.SenderTransform.Coordinates, jammerComp.Range) - || jammerXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, jammerComp.Range)) - { - ev.Cancel(); - return; - } - } - } - -} diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs index 20ee7a5dd1b..83967c9bbd4 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs @@ -351,14 +351,13 @@ private void SendToConnections(ReadOnlySpan connections, var xform = Transform(packet.Sender); - var senderPos = _transformSystem.GetWorldPosition(xform); + BeforePacketSentEvent beforeEv = new(packet.Sender, xform, _transformSystem.GetWorldPosition(xform)); foreach (var connection in connections) { if (connection.Owner == packet.Sender) continue; - BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString()); RaiseLocalEvent(connection.Owner, beforeEv, false); if (!beforeEv.Cancelled) @@ -387,17 +386,11 @@ public sealed class BeforePacketSentEvent : CancellableEntityEventArgs /// public readonly Vector2 SenderPosition; - /// - /// The network the packet will be sent to. - /// - public readonly string NetworkId; - - public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId) + public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition) { Sender = sender; SenderTransform = xform; SenderPosition = senderPosition; - NetworkId = networkId; } } diff --git a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs index cdc083feacd..fd62514d006 100644 --- a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs @@ -1,5 +1,4 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Server.DeviceNetwork.Components; +using Content.Server.DeviceNetwork.Components; using Content.Server.Medical.CrewMonitoring; using Content.Server.Power.Components; using Content.Server.Station.Systems; @@ -39,7 +38,7 @@ public bool IsActiveServer(EntityUid serverId, SingletonDeviceNetServerComponent /// The address of the active server if it exists /// The component type that determines what type of server you're getting the address of /// True if there is an active serve. False otherwise - public bool TryGetActiveServerAddress(EntityUid stationId, [NotNullWhen(true)] out string? address) where TComp : IComponent + public bool TryGetActiveServerAddress(EntityUid stationId, out string? address) where TComp : IComponent { var servers = EntityQueryEnumerator< SingletonDeviceNetServerComponent, diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 6400472d036..93d6bc8db0b 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -28,7 +28,6 @@ public sealed partial class DragonSystem : EntitySystem [Dependency] private readonly RoleSystem _role = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; private EntityQuery _objQuery; @@ -147,7 +146,7 @@ private void OnSpawnRift(EntityUid uid, DragonComponent component, DragonSpawnRi // cant stack rifts near eachother foreach (var (_, riftXform) in EntityQuery(true)) { - if (riftXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, RiftRange)) + if (riftXform.Coordinates.InRange(EntityManager, xform.Coordinates, RiftRange)) { _popup.PopupEntity(Loc.GetString("carp-rift-proximity", ("proximity", RiftRange)), uid, uid); return; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 6351d999a98..1a5a5c40118 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -331,7 +331,7 @@ public void QueueExplosion(MapCoordinates epicenter, CameraShake(iterationIntensity.Count * 4f, epicenter, totalIntensity); //For whatever bloody reason, sound system requires ENTITY coordinates. - var mapEntityCoords = EntityCoordinates.FromMap(_mapManager.GetMapEntityId(epicenter.MapId), epicenter, _transformSystem, EntityManager); + var mapEntityCoords = EntityCoordinates.FromMap(EntityManager, _mapManager.GetMapEntityId(epicenter.MapId), epicenter); // play sound. // for the normal audio, we want everyone in pvs range diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index bf69b4b9094..54587e95be3 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -394,7 +394,7 @@ public EntityCoordinates GetObserverSpawnPoint() // Ideally engine would just spawn them on grid directly I guess? Right now grid traversal is handling it during // update which means we need to add a hack somewhere around it. var spawn = _robustRandom.Pick(_possiblePositions); - var toMap = spawn.ToMap(EntityManager, _transform); + var toMap = spawn.ToMap(EntityManager); if (_mapManager.TryFindGridAt(toMap, out var gridUid, out _)) { diff --git a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs index 98926536b9d..f83d719c219 100644 --- a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs @@ -201,7 +201,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (!gridId.HasValue) { - Log.Error($"Gridid was null when loading \"{map}\", aborting."); + Logger.ErrorS("pirates", $"Gridid was null when loading \"{map}\", aborting."); foreach (var session in ops) { ev.PlayerPool.Add(session); @@ -230,7 +230,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (spawns.Count == 0) { spawns.Add(Transform(pirates.PirateShip).Coordinates); - Log.Warning($"Fell back to default spawn for pirates!"); + Logger.WarningS("pirates", $"Fell back to default spawn for pirates!"); } for (var i = 0; i < ops.Length; i++) diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index d3a717c74af..627c336a36b 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -34,7 +34,6 @@ public sealed class GuardianSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly BodySystem _bodySystem = default!; [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -329,7 +328,7 @@ private void CheckGuardianMove( if (!guardianComponent.GuardianLoose) return; - if (!guardianXform.Coordinates.InRange(EntityManager, _transform, hostXform.Coordinates, guardianComponent.DistanceAllowed)) + if (!guardianXform.Coordinates.InRange(EntityManager, hostXform.Coordinates, guardianComponent.DistanceAllowed)) RetractGuardian(hostUid, hostComponent, guardianUid, guardianComponent); } diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index a0e872dbeb1..a783a9e0968 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -31,7 +31,6 @@ public sealed class HandsSystem : SharedHandsSystem [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PullingSystem _pullingSystem = default!; [Dependency] private readonly ThrowingSystem _throwingSystem = default!; @@ -192,7 +191,7 @@ hands.ActiveHandEntity is not { } throwEnt || throwEnt = splitStack.Value; } - var direction = coordinates.ToMapPos(EntityManager, _transformSystem) - Transform(player).WorldPosition; + var direction = coordinates.ToMapPos(EntityManager) - Transform(player).WorldPosition; if (direction == Vector2.Zero) return true; diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index 8eb27414481..ac415a04342 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -99,7 +99,7 @@ private void OnScramImplant(EntityUid uid, SubdermalImplantComponent component, return; var xform = Transform(ent); - var entityCoords = xform.Coordinates.ToMap(EntityManager, _xform); + var entityCoords = xform.Coordinates.ToMap(EntityManager); // try to find a valid position to teleport to, teleport to whatever works if we can't var targetCoords = new MapCoordinates(); diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs index 92cd794ce2c..2c9b11dbd3d 100644 --- a/Content.Server/Magic/MagicSystem.cs +++ b/Content.Server/Magic/MagicSystem.cs @@ -168,7 +168,7 @@ private void OnProjectileSpell(ProjectileSpellEvent ev) foreach (var pos in GetSpawnPositions(xform, ev.Pos)) { // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map. - var mapPos = pos.ToMap(EntityManager, _transformSystem); + var mapPos = pos.ToMap(EntityManager); var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _) ? pos.WithEntityId(gridUid, EntityManager) : new(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position); diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs index 3485bd2a18c..3e030aa8197 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs @@ -22,6 +22,6 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs index 9d000ca2eb8..6d8977bb7a7 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs @@ -22,7 +22,7 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return !coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return !coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs index aaccb426d71..5d616ba630e 100644 --- a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs @@ -23,6 +23,6 @@ public override bool IsMet(NPCBlackboard blackboard) !_entManager.TryGetComponent(target, out var targetXform)) return false; - return coordinates.InRange(_entManager, _entManager.System(), targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return coordinates.InRange(_entManager, targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs index a59af88ff58..95f931cdd6a 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs @@ -405,7 +405,7 @@ public async void GetPathEvent( return null; } - var localPos = xform.InvWorldMatrix.Transform(coordinates.ToMapPos(EntityManager, _transform)); + var localPos = xform.InvWorldMatrix.Transform(coordinates.ToMapPos(EntityManager)); var origin = GetOrigin(localPos); if (!TryGetChunk(origin, comp, out var chunk)) diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs index e7af2c91073..7ac6768e359 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs @@ -56,30 +56,7 @@ private bool IsFreeSpace( return true; } - // TODO: Ideally for "FreeSpace" we check all entities on the tile and build flags dynamically (pathfinder refactor in future). - var ents = _entSetPool.Get(); - _lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.ChunkOrigin, ents, flags: LookupFlags.Static); - var result = true; - - if (ents.Count > 0) - { - var fixtures = _fixturesQuery.GetComponent(uid); - var physics = _physicsQuery.GetComponent(uid); - - foreach (var intersecting in ents) - { - if (!_physics.IsCurrentlyHardCollidable((uid, fixtures, physics), intersecting)) - { - continue; - } - - result = false; - break; - } - } - - _entSetPool.Return(ents); - return result; + return false; } /// diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index 33941be9292..fc483f68c3b 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -43,7 +43,6 @@ public sealed class NPCUtilitySystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SolutionContainerSystem _solutions = default!; [Dependency] private readonly WeldableSystem _weldable = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; private EntityQuery _puddleQuery; private EntityQuery _xformQuery; @@ -297,7 +296,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon { var radius = blackboard.GetValueOrDefault(NPCBlackboard.VisionRadius, EntityManager); - return _examine.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; + return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; } case TargetInLOSOrCurrentCon: { @@ -314,7 +313,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon return 1f; } - return _examine.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; + return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; } case TargetIsAliveCon: { diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index 9b2e14eff8b..a7c455e6a5d 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -36,9 +36,7 @@ internal sealed class PointingSystem : SharedPointingSystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly SharedMindSystem _minds = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; private static readonly TimeSpan PointDelay = TimeSpan.FromSeconds(0.5f); @@ -98,11 +96,11 @@ public bool InRange(EntityUid pointer, EntityCoordinates coordinates) { if (HasComp(pointer)) { - return Transform(pointer).Coordinates.InRange(EntityManager, _transform, coordinates, 15); + return Transform(pointer).Coordinates.InRange(EntityManager, coordinates, 15); } else { - return _examine.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); + return ExamineSystemShared.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); } } @@ -143,7 +141,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E return false; } - var mapCoordsPointed = coordsPointed.ToMap(EntityManager, _transform); + var mapCoordsPointed = coordsPointed.ToMap(EntityManager); _rotateToFaceSystem.TryFaceCoordinates(player, mapCoordsPointed.Position); var arrow = EntityManager.SpawnEntity("PointingArrow", coordsPointed); @@ -151,7 +149,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E if (TryComp(arrow, out var pointing)) { if (TryComp(player, out TransformComponent? xformPlayer)) - pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager, _transform), _transform).Position; + pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager)).Position; pointing.EndTime = _gameTiming.CurTime + PointDuration; diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 048fda23553..5ed39d51787 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -20,8 +20,6 @@ public sealed class PowerReceiverSystem : EntitySystem [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; [Dependency] private readonly AudioSystem _audio = default!; - private EntityQuery _recQuery; - private EntityQuery _provQuery; public override void Initialize() { @@ -37,9 +35,6 @@ public override void Initialize() SubscribeLocalEvent>(OnGetVerbs); SubscribeLocalEvent>(AddSwitchPowerVerb); - - _recQuery = GetEntityQuery(); - _provQuery = GetEntityQuery(); } private void OnGetVerbs(EntityUid uid, ApcPowerReceiverComponent component, GetVerbsEvent args) @@ -82,7 +77,7 @@ private void OnProviderShutdown(EntityUid uid, ApcPowerProviderComponent compone private void OnProviderConnected(Entity receiver, ref ExtensionCableSystem.ProviderConnectedEvent args) { var providerUid = args.Provider.Owner; - if (!_provQuery.TryGetComponent(providerUid, out var provider)) + if (!EntityManager.TryGetComponent(providerUid, out var provider)) return; receiver.Comp.Provider = provider; @@ -99,7 +94,7 @@ private void OnProviderDisconnected(Entity receiver, private void OnReceiverConnected(Entity provider, ref ExtensionCableSystem.ReceiverConnectedEvent args) { - if (_recQuery.TryGetComponent(args.Receiver, out var receiver)) + if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver)) { provider.Comp.AddReceiver(receiver); } @@ -107,7 +102,7 @@ private void OnReceiverConnected(Entity provider, ref private void OnReceiverDisconnected(EntityUid uid, ApcPowerProviderComponent provider, ExtensionCableSystem.ReceiverDisconnectedEvent args) { - if (_recQuery.TryGetComponent(args.Receiver, out var receiver)) + if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver)) { provider.RemoveReceiver(receiver); } @@ -121,7 +116,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G if (!HasComp(args.User)) return; - if (!_recQuery.TryGetComponent(uid, out var receiver)) + if (!TryComp(uid, out var receiver)) return; if (!receiver.NeedsPower) @@ -157,7 +152,7 @@ private void ProviderChanged(Entity receiver) /// public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null) { - if (!_recQuery.Resolve(uid, ref receiver, false)) + if (!Resolve(uid, ref receiver, false)) return true; return receiver.Powered; @@ -169,7 +164,7 @@ public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null) /// public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null) { - if (!_recQuery.Resolve(uid, ref receiver, false)) + if (!Resolve(uid, ref receiver, false)) return true; // it'll save a lot of confusion if 'always powered' means 'always powered' diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index 53e0409af06..fdf02f94df5 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -1,13 +1,8 @@ -using Content.Server.DeviceNetwork.Components; -using Content.Server.DeviceNetwork.Systems; -using Content.Server.Medical.CrewMonitoring; using Content.Server.Medical.SuitSensors; using Content.Server.Popups; using Content.Server.Power.EntitySystems; using Content.Server.PowerCell; using Content.Server.Radio.Components; -using Content.Server.Station.Systems; -using Content.Shared.DeviceNetwork.Components; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.PowerCell.Components; @@ -20,8 +15,6 @@ public sealed class JammerSystem : EntitySystem [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly StationSystem _stationSystem = default!; - [Dependency] private readonly SingletonDeviceNetServerSystem _singletonServerSystem = default!; public override void Initialize() { @@ -43,7 +36,6 @@ public override void Update(float frameTime) !_battery.TryUseCharge(batteryUid.Value, jam.Wattage * frameTime, battery)) { RemComp(uid); - RemComp(uid); } } } @@ -56,19 +48,10 @@ private void OnActivate(EntityUid uid, RadioJammerComponent comp, ActivateInWorl if (activated) { EnsureComp(uid); - var stationId = _stationSystem.GetOwningStation(uid); - if (stationId != null && _singletonServerSystem.TryGetActiveServerAddress(stationId.Value, out var netId)) - { - EnsureComp(uid, out var jammingComp); - jammingComp.Range = comp.Range; - jammingComp.JammableNetworks.Add(netId); - Dirty(uid, jammingComp); - } } else { RemComp(uid); - RemComp(uid); } var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state"); var message = Loc.GetString("radio-jammer-component-on-use", ("state", state)); diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index d335911901a..6403c41addf 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -22,7 +22,6 @@ public sealed class DoorRemoteSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly DoorSystem _doorSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; // I'm so sorry [Dependency] private readonly SharedAirlockSystem _sharedAirlockSystem = default!; public override void Initialize() @@ -68,7 +67,7 @@ private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, Befo || !TryComp(args.Target, out var doorComp) // If it isn't a door we don't use it // Only able to control doors if they are within your vision and within your max range. // Not affected by mobs or machines anymore. - || !_examine.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) + || !ExamineSystemShared.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) { return; } diff --git a/Content.Server/Respawn/SpecialRespawnSystem.cs b/Content.Server/Respawn/SpecialRespawnSystem.cs index 2822c94093f..51c092be18b 100644 --- a/Content.Server/Respawn/SpecialRespawnSystem.cs +++ b/Content.Server/Respawn/SpecialRespawnSystem.cs @@ -20,7 +20,6 @@ public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TurfSystem _turf = default!; [Dependency] private readonly IChatManager _chat = default!; @@ -130,11 +129,11 @@ private void OnTermination(EntityUid uid, SpecialRespawnComponent component, ref private void Respawn(EntityUid oldEntity, string prototype, EntityCoordinates coords) { var entity = Spawn(prototype, coords); - _adminLog.Add(LogType.Respawn, LogImpact.High, $"{ToPrettyString(oldEntity)} was deleted and was respawned at {coords.ToMap(EntityManager, _transform)} as {ToPrettyString(entity)}"); + _adminLog.Add(LogType.Respawn, LogImpact.High, $"{ToPrettyString(oldEntity)} was deleted and was respawned at {coords.ToMap(EntityManager)} as {ToPrettyString(entity)}"); _chat.SendAdminAlert($"{MetaData(oldEntity).EntityName} was deleted and was respawned as {ToPrettyString(entity)}"); } - /// + /// /// Try to find a random safe tile on the supplied grid /// /// The grid that you're looking for a safe tile on diff --git a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs index f1d0af6f905..ce4334391db 100644 --- a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs +++ b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs @@ -18,13 +18,13 @@ namespace Content.Server.Singularity.EntitySystems; /// public sealed class GravityWellSystem : SharedGravityWellSystem { - #region Dependencies +#region Dependencies [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IViewVariablesManager _vvManager = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - #endregion Dependencies +#endregion Dependencies /// /// The minimum range at which gravpulses will act. @@ -155,7 +155,7 @@ public void GravPulse(EntityUid uid, float maxRange, float minRange, float baseR /// The minimum distance at which entities can be affected by the gravity pulse. /// The base velocity added to any entities within affected by the gravity pulse scaled by the displacement of those entities from the epicenter. public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRange, in Matrix3 baseMatrixDeltaV) - => GravPulse(entityPos.ToMap(EntityManager, _transform), maxRange, minRange, in baseMatrixDeltaV); + => GravPulse(entityPos.ToMap(EntityManager), maxRange, minRange, in baseMatrixDeltaV); /// /// Greates a gravitational pulse, shoving around all entities within some distance of an epicenter. @@ -166,7 +166,7 @@ public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRang /// The base radial velocity that will be added to entities within range towards the center of the gravitational pulse. /// The base tangential velocity that will be added to entities within countrclockwise around the center of the gravitational pulse. public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRange, float baseRadialDeltaV = 0.0f, float baseTangentialDeltaV = 0.0f) - => GravPulse(entityPos.ToMap(EntityManager, _transform), maxRange, minRange, baseRadialDeltaV, baseTangentialDeltaV); + => GravPulse(entityPos.ToMap(EntityManager), maxRange, minRange, baseRadialDeltaV, baseTangentialDeltaV); /// /// Causes a gravitational pulse, shoving around all entities within some distance of an epicenter. diff --git a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs index bc0de7c8c64..3c44a7fc7af 100644 --- a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs @@ -2,7 +2,12 @@ using Content.Server.Power.EntitySystems; using Content.Server.Singularity.Components; using Content.Shared.Singularity.Components; +using Content.Shared.Singularity.EntitySystems; using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using System.Numerics; @@ -13,8 +18,8 @@ namespace Content.Server.Singularity.EntitySystems; /// public sealed class SingularityAttractorSystem : EntitySystem { + [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; /// /// The minimum range at which the attraction will act. @@ -64,7 +69,7 @@ private void Update(EntityUid uid, SingularityAttractorComponent? attractor = nu attractor.LastPulseTime = _timing.CurTime; - var mapPos = xform.Coordinates.ToMap(EntityManager, _transform); + var mapPos = xform.Coordinates.ToMap(EntityManager); if (mapPos == MapCoordinates.Nullspace) return; @@ -72,7 +77,7 @@ private void Update(EntityUid uid, SingularityAttractorComponent? attractor = nu var query = EntityQuery(); foreach (var (singulo, walk, singuloXform) in query) { - var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager, _transform); + var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager); if (singuloMapPos.MapId != mapPos.MapId) continue; diff --git a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs index 356768769bb..9995ed40c12 100644 --- a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs +++ b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs @@ -26,7 +26,6 @@ public sealed class BluespaceLockerSystem : EntitySystem [Dependency] private readonly WeldableSystem _weldableSystem = default!; [Dependency] private readonly LockSystem _lockSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly ExplosionSystem _explosionSystem = default!; public override void Initialize() @@ -387,7 +386,7 @@ private void DestroyAfterLimit(EntityUid uid, BluespaceLockerComponent component switch (component.BehaviorProperties.DestroyType) { case BluespaceLockerDestroyType.Explode: - _explosionSystem.QueueExplosion(uid.ToCoordinates().ToMap(EntityManager, _transformSystem), + _explosionSystem.QueueExplosion(uid.ToCoordinates().ToMap(EntityManager), ExplosionSystem.DefaultExplosionPrototypeId, 4, 1, 2, maxTileBreak: 0); goto case BluespaceLockerDestroyType.Delete; case BluespaceLockerDestroyType.Delete: diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 49db980451e..281d8f57267 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -5,7 +5,6 @@ using Content.Server.Stack; using Content.Server.Store.Components; using Content.Shared.Actions; -using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Hands.EntitySystems; @@ -249,12 +248,10 @@ private void OnBuyRequest(EntityUid uid, StoreComponent component, StoreBuyListi HandleRefundComp(uid, component, upgradeActionId.Value); } + //broadcast event if (listing.ProductEvent != null) { - if (!listing.RaiseProductEventOnUser) - RaiseLocalEvent(listing.ProductEvent); - else - RaiseLocalEvent(buyer, listing.ProductEvent); + RaiseLocalEvent(listing.ProductEvent); } //log dat shit. @@ -324,8 +321,6 @@ private void OnRequestRefund(EntityUid uid, StoreComponent component, StoreReque if (!component.RefundAllowed || component.BoughtEntities.Count == 0) return; - _admin.Add(LogType.StoreRefund, LogImpact.Low, $"{ToPrettyString(buyer):player} has refunded their purchases from {ToPrettyString(uid):store}"); - for (var i = component.BoughtEntities.Count - 1; i >= 0; i--) { var purchase = component.BoughtEntities[i]; diff --git a/Content.Server/Tabletop/TabletopSystem.Session.cs b/Content.Server/Tabletop/TabletopSystem.Session.cs index c2bb8426fc2..f16f3f01e98 100644 --- a/Content.Server/Tabletop/TabletopSystem.Session.cs +++ b/Content.Server/Tabletop/TabletopSystem.Session.cs @@ -31,7 +31,7 @@ public TabletopSession EnsureSession(TabletopGameComponent tabletop) // Since this is the first time opening this session, set up the game tabletop.Setup.SetupTabletop(session, EntityManager); - Log.Info($"Created tabletop session number {tabletop} at position {session.Position}."); + Logger.Info($"Created tabletop session number {tabletop} at position {session.Position}."); return session; } diff --git a/Content.Server/Wires/WireLayout.cs b/Content.Server/Wires/WireLayout.cs index 621992c915a..ecafba013e0 100644 --- a/Content.Server/Wires/WireLayout.cs +++ b/Content.Server/Wires/WireLayout.cs @@ -28,13 +28,11 @@ public sealed partial class WireLayoutPrototype : IPrototype, IInheritingPrototy /// initialization) /// [DataField("dummyWires")] - [NeverPushInheritance] public int DummyWires { get; private set; } = default!; /// /// All the valid IWireActions currently in this layout. /// [DataField("wires")] - [NeverPushInheritance] public List? Wires { get; private set; } } diff --git a/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs b/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs index f2e051669a2..aed32bc89c3 100644 --- a/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs +++ b/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs @@ -9,7 +9,6 @@ namespace Content.Server.Worldgen.Systems.Carvers; public sealed class NoiseRangeCarverSystem : EntitySystem { [Dependency] private readonly NoiseIndexSystem _index = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; /// public override void Initialize() @@ -20,7 +19,7 @@ public override void Initialize() private void OnPrePlaceDebris(EntityUid uid, NoiseRangeCarverComponent component, ref PrePlaceDebrisFeatureEvent args) { - var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager, _transform)); + var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager)); var val = _index.Evaluate(uid, component.NoiseChannel, coords); foreach (var (low, high) in component.Ranges) diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs index ba94b0f3738..70a6119130e 100644 --- a/Content.Shared.Database/LogType.cs +++ b/Content.Shared.Database/LogType.cs @@ -98,5 +98,4 @@ public enum LogType ChatRateLimited = 87, AtmosTemperatureChanged = 88, DeviceNetwork = 89, - StoreRefund = 90 } diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index c335cd7b858..a3bb1e14679 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -129,7 +129,7 @@ public void StartSupercriticalEvent(EntityUid uid) if (HasComp(uid)) return; - AdminLog.Add(LogType.Anomaly, LogImpact.Extreme, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); + AdminLog.Add(LogType.Anomaly, LogImpact.High, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); if (_net.IsServer) Log.Info($"Anomaly is going supercritical. Entity: {ToPrettyString(uid)}"); diff --git a/Content.Shared/Audio/SharedAmbientSoundSystem.cs b/Content.Shared/Audio/SharedAmbientSoundSystem.cs index 5f17261825c..6318ba25573 100644 --- a/Content.Shared/Audio/SharedAmbientSoundSystem.cs +++ b/Content.Shared/Audio/SharedAmbientSoundSystem.cs @@ -5,19 +5,16 @@ namespace Content.Shared.Audio; public abstract class SharedAmbientSoundSystem : EntitySystem { - private EntityQuery _query; - public override void Initialize() { base.Initialize(); SubscribeLocalEvent(GetCompState); SubscribeLocalEvent(HandleCompState); - _query = GetEntityQuery(); } public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent? ambience = null) { - if (!_query.Resolve(uid, ref ambience, false) || ambience.Enabled == value) + if (!Resolve(uid, ref ambience, false) || ambience.Enabled == value) return; ambience.Enabled = value; @@ -27,7 +24,7 @@ public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent public virtual void SetRange(EntityUid uid, float value, AmbientSoundComponent? ambience = null) { - if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value)) + if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value)) return; ambience.Range = value; @@ -42,7 +39,7 @@ protected virtual void QueueUpdate(EntityUid uid, AmbientSoundComponent ambience public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent? ambience = null) { - if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value)) + if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value)) return; ambience.Volume = value; @@ -51,7 +48,7 @@ public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent? public virtual void SetSound(EntityUid uid, SoundSpecifier sound, AmbientSoundComponent? ambience = null) { - if (!_query.Resolve(uid, ref ambience, false) || ambience.Sound == sound) + if (!Resolve(uid, ref ambience, false) || ambience.Sound == sound) return; ambience.Sound = sound; diff --git a/Content.Shared/Chemistry/Components/InjectorComponent.cs b/Content.Shared/Chemistry/Components/InjectorComponent.cs index 437c5e327d2..188028c8f8f 100644 --- a/Content.Shared/Chemistry/Components/InjectorComponent.cs +++ b/Content.Shared/Chemistry/Components/InjectorComponent.cs @@ -30,7 +30,7 @@ public sealed partial class InjectorComponent : Component /// Whether or not the injector is able to draw from containers or if it's a single use /// device that can only inject. /// - [DataField] + [DataField("injectOnly")] public bool InjectOnly; /// @@ -39,26 +39,28 @@ public sealed partial class InjectorComponent : Component /// /// for example: droppers would ignore mobs /// - [DataField] + [DataField("ignoreMobs")] public bool IgnoreMobs; /// /// The minimum amount of solution that can be transferred at once from this solution. /// [DataField("minTransferAmount")] + [ViewVariables(VVAccess.ReadWrite)] public FixedPoint2 MinimumTransferAmount = FixedPoint2.New(5); /// /// The maximum amount of solution that can be transferred at once from this solution. /// [DataField("maxTransferAmount")] - public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(50); + public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(15); /// /// Amount to inject or draw on each usage. If the injector is inject only, it will /// attempt to inject it's entire contents upon use. /// - [DataField] + [ViewVariables(VVAccess.ReadWrite)] + [DataField("transferAmount")] [AutoNetworkedField] public FixedPoint2 TransferAmount = FixedPoint2.New(5); @@ -69,7 +71,8 @@ public sealed partial class InjectorComponent : Component /// The base delay has a minimum of 1 second, but this will still be modified if the target is incapacitated or /// in combat mode. /// - [DataField] + [ViewVariables(VVAccess.ReadWrite)] + [DataField("delay")] public TimeSpan Delay = TimeSpan.FromSeconds(5); /// @@ -77,6 +80,7 @@ public sealed partial class InjectorComponent : Component /// right SolutionCaps to support injection/drawing. For InjectOnly injectors this should /// only ever be set to Inject /// + [ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] [DataField] public InjectorToggleMode ToggleState = InjectorToggleMode.Draw; diff --git a/Content.Shared/Construction/Conditions/WallmountCondition.cs b/Content.Shared/Construction/Conditions/WallmountCondition.cs index fe4336e6fc7..bf3016d4974 100644 --- a/Content.Shared/Construction/Conditions/WallmountCondition.cs +++ b/Content.Shared/Construction/Conditions/WallmountCondition.cs @@ -19,9 +19,8 @@ public bool Condition(EntityUid user, EntityCoordinates location, Direction dire var entManager = IoCManager.Resolve(); // get blueprint and user position - var transformSystem = entManager.System(); var userWorldPosition = entManager.GetComponent(user).WorldPosition; - var objWorldPosition = location.ToMap(entManager, transformSystem).Position; + var objWorldPosition = location.ToMap(entManager).Position; // find direction from user to blueprint var userToObject = (objWorldPosition - userWorldPosition); diff --git a/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs deleted file mode 100644 index 75de0cb8a25..00000000000 --- a/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.DeviceNetwork.Components; - -/// -/// Allow entities to jam DeviceNetwork packets. -/// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -public sealed partial class DeviceNetworkJammerComponent : Component -{ - /// - /// Range where packets will be jammed. This is checked both against the sender and receiver. - /// - [DataField, AutoNetworkedField] - public float Range = 5.0f; - - /// - /// Device networks that can be jammed. For a list of default NetworkIds see DeviceNetIdDefaults on Content.Server. - /// Network ids are not guaranteed to be limited to DeviceNetIdDefaults. - /// - [DataField, AutoNetworkedField] - public HashSet JammableNetworks = []; - -} diff --git a/Content.Shared/Examine/ExamineSystemShared.cs b/Content.Shared/Examine/ExamineSystemShared.cs index f792862be14..5a3fb872293 100644 --- a/Content.Shared/Examine/ExamineSystemShared.cs +++ b/Content.Shared/Examine/ExamineSystemShared.cs @@ -144,7 +144,7 @@ public bool IsOccluded(EntityUid uid) return TryComp(uid, out var eye) && eye.DrawFov; } - public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) + public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { // No, rider. This is better. // ReSharper disable once ConvertToLocalFunction @@ -154,7 +154,7 @@ public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float return InRangeUnOccluded(origin, other, range, predicate, wrapped, ignoreInsideBlocker, entMan); } - public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, + public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, TState state, Func predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { if (other.MapId != origin.MapId || @@ -171,7 +171,7 @@ public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates othe if (length > MaxRaycastRange) { - Log.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); + Logger.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); length = MaxRaycastRange; } @@ -207,7 +207,7 @@ public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates othe return true; } - public bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public static bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -216,7 +216,7 @@ public bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = E return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public static bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -225,7 +225,7 @@ public bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float r return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public static bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs index 20e08b2767d..bbae03e45b3 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs @@ -114,7 +114,7 @@ public bool TryPickup( && (itemPos.Position - xform.MapPosition.Position).Length() <= MaxAnimationRange && MetaData(entity).VisibilityMask == MetaData(uid).VisibilityMask) // Don't animate aghost pickups. { - var initialPosition = EntityCoordinates.FromMap(coordinateEntity, itemPos, TransformSystem, EntityManager); + var initialPosition = EntityCoordinates.FromMap(coordinateEntity, itemPos, EntityManager); _storage.PlayPickupAnimation(entity, initialPosition, xform.Coordinates, itemXform.LocalRotation, uid); } } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 0e390ecea45..7d5e390b6f0 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -459,7 +459,7 @@ protected bool ValidateInteractAndFace(EntityUid user, EntityCoordinates coordin return false; if (!HasComp(user)) - _rotateToFaceSystem.TryFaceCoordinates(user, coordinates.ToMapPos(EntityManager, _transform)); + _rotateToFaceSystem.TryFaceCoordinates(user, coordinates.ToMapPos(EntityManager)); return true; } @@ -612,7 +612,7 @@ public bool InRangeUnobstructed( Ignored combinedPredicate = e => e == origin || (predicate?.Invoke(e) ?? false); var inRange = true; MapCoordinates originPos = default; - var targetPos = otherCoordinates.ToMap(EntityManager, _transform); + var targetPos = otherCoordinates.ToMap(EntityManager); Angle targetRot = default; // So essentially: @@ -785,7 +785,7 @@ public bool InRangeUnobstructed( Ignored? predicate = null, bool popup = false) { - return InRangeUnobstructed(origin, other.ToMap(EntityManager, _transform), range, collisionMask, predicate, popup); + return InRangeUnobstructed(origin, other.ToMap(EntityManager), range, collisionMask, predicate, popup); } /// diff --git a/Content.Shared/Spawning/EntitySystemExtensions.cs b/Content.Shared/Spawning/EntitySystemExtensions.cs index 507a0f4aa27..14b171baeb1 100644 --- a/Content.Shared/Spawning/EntitySystemExtensions.cs +++ b/Content.Shared/Spawning/EntitySystemExtensions.cs @@ -16,7 +16,7 @@ public static class EntitySystemExtensions SharedPhysicsSystem? physicsManager = null) { physicsManager ??= entityManager.System(); - var mapCoordinates = coordinates.ToMap(entityManager, entityManager.System()); + var mapCoordinates = coordinates.ToMap(entityManager); return entityManager.SpawnIfUnobstructed(prototypeName, mapCoordinates, collisionLayer, box, physicsManager); } diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index 25245327ce9..2f067afbeeb 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -98,9 +98,6 @@ public partial class ListingData : IEquatable, ICloneable [DataField("productEvent")] public object? ProductEvent; - [DataField] - public bool RaiseProductEventOnUser; - /// /// used internally for tracking how many times an item was purchased. /// @@ -123,7 +120,7 @@ public bool Equals(ListingData? listing) Description != listing.Description || ProductEntity != listing.ProductEntity || ProductAction != listing.ProductAction || - ProductEvent?.GetType() != listing.ProductEvent?.GetType() || + ProductEvent != listing.ProductEvent || RestockTime != listing.RestockTime) return false; diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index 91aad895821..a8f7ee23956 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -261,7 +261,7 @@ private void OnBallisticAmmoCount(EntityUid uid, BallisticAmmoProviderComponent args.Capacity = component.Capacity; } - public void UpdateBallisticAppearance(EntityUid uid, BallisticAmmoProviderComponent component) + private void UpdateBallisticAppearance(EntityUid uid, BallisticAmmoProviderComponent component) { if (!Timing.IsFirstTimePredicted || !TryComp(uid, out var appearance)) return; diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1f876cf9a7f..89dcd2f5822 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4051,7 +4051,7 @@ Entries: - type: Add message: >- Glass/Crystal shards and floor tiles now deal damage and embed in - victims when colliding with them. + victims when colliding with them. id: 6107 time: '2024-05-11T01:23:00.0000000+00:00' - author: FoxxoTrystan diff --git a/Resources/Locale/en-US/paper/book-authorbooks.ftl b/Resources/Locale/en-US/paper/book-authorbooks.ftl index ae886e835af..b1981d9e152 100644 --- a/Resources/Locale/en-US/paper/book-authorbooks.ftl +++ b/Resources/Locale/en-US/paper/book-authorbooks.ftl @@ -253,11 +253,3 @@ book-text-inspiration = As a freelance writer, Sarah was always in search of ins Without a moment's hesitation, Sarah took out her pen and notebook and began to write. She wrote about the beauty of the scene, the peacefulness she felt, and the surreal quality of the moment. She wanted to capture this feeling and share it with others through her words. As she finished writing, Sarah heard the snap of a twig and looked up to see a man approaching her with a camera. He introduced himself as a nature photographer and asked if she had seen the waterfall. They struck up a conversation, and soon they were both laughing and sharing stories of their adventures. As the sun began to set, the two of them packed up their gear and said their goodbyes. Sarah felt grateful for this unexpected encounter and the inspiration it brought her. She knew that this moment would stay with her forever, and she felt a sense of serenity knowing that there was still so much beauty in the world waiting to be discovered. - -book-text-janitor = [bold][color=black][head=3]The Tales of a Tired Janitor[/head][/bold] - Cleaning a space station as a janitor is like being trapped in a cosmic custodial nightmare. You'd think floating through the vastness of space would be glamorous, but no, I'm stuck scrubbing space grime and extraterrestrial goop off the walls. It's a thankless job in a zero-gravity abyss. - First off, let's talk about the mess. Space dust, alien gunk, and who knows what else accumulates faster than a rocket launch. It's not just about sweeping up the crumbs; it's about battling interstellar filth that seems to have a life of its own. You'd hope for a sleek, futuristic space station, but you get a swirling vortex of space garbage waiting for you around every corner. - And the tools they give us! You'd expect state-of-the-art cleaning gadgets, but nope. They raided a dollar store on Earth before launching us into the cosmos. Mops that barely work in microgravity, spray bottles that run out in one use, and don't even get me started on the space janitor jumpsuit. I feel like a reject from a sci-fi B-movie. - Speaking of jumpsuits, the lack of respect is astronomical. The scientists and astronauts zoom past in their sleek suits, utterly oblivious to the fact that I'm the unsung hero keeping this place from turning into a cosmic trash heap. I bet they don't even know my name. "Hey, Space Janitor!" That's what I get. No appreciation for the elbow grease I put into keeping their precious station spick and span. - And let's remember the hazards. Cleaning up alien slime? Yeah, that's a regular Tuesday for me. One wrong move and I'm dealing with an intergalactic biohazard. It's like playing Russian roulette with space critters that could burst out of some hidden nook and cranny. I signed up to mop floors, not play host to extraterrestrial invaders. - Being a janitor on this so-called Space Station 14 is a cosmic joke. Where did the other 13 stations go? It's not all spacewalks and futuristic gadgets; it's scrubbing toilets and battling alien goo. If anyone thinks space is glamorous, they clearly haven't seen the mess we space janitors deal with every single day. It's time they appreciate the unsung heroes of the space station – the custodians of the cosmos. \ No newline at end of file diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl deleted file mode 100644 index f2451527b09..00000000000 --- a/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl +++ /dev/null @@ -1,16 +0,0 @@ -cargoproduct-category-name-armory = Armory -cargoproduct-category-name-atmospherics = Atmospherics -cargoproduct-category-name-cargo = Cargo -cargoproduct-category-name-circuitboards = Circuitboards -cargoproduct-category-name-emergency = Emergency -cargoproduct-category-name-engineering = Engineering -cargoproduct-category-name-food = Food -cargoproduct-category-name-fun = Fun -cargoproduct-category-name-hydroponics = Hydroponics -cargoproduct-category-name-livestock = Livestock -cargoproduct-category-name-materials = Materials -cargoproduct-category-name-medical = Medical -cargoproduct-category-name-science = Science -cargoproduct-category-name-security = Security -cargoproduct-category-name-service = Service -cargoproduct-category-name-shuttle = Shuttle diff --git a/Resources/Locale/en-US/speech/speech-chatsan.ftl b/Resources/Locale/en-US/speech/speech-chatsan.ftl index 6ce575e648d..4c8cf5db54c 100644 --- a/Resources/Locale/en-US/speech/speech-chatsan.ftl +++ b/Resources/Locale/en-US/speech/speech-chatsan.ftl @@ -114,6 +114,3 @@ chatsan-replacement-41 = what are you doing chatsan-word-42 = ofc chatsan-replacement-42 = of course - -chatsan-word-43 = ig -chatsan-replacement-43 = i guess diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 7a3564edf66..c097a689dd8 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -29,6 +29,3 @@ trait-frontal-lisp-desc = You thpeak with a lithp trait-socialanxiety-name = Social Anxiety trait-socialanxiety-desc = You are anxious when you speak and stutter. - -trait-snoring-name = Snoring -trait-snoring-desc = You will snore while sleeping. diff --git a/Resources/Prototypes/Accents/word_replacements.yml b/Resources/Prototypes/Accents/word_replacements.yml index 92b3d7de9b3..147aebb5c5d 100644 --- a/Resources/Prototypes/Accents/word_replacements.yml +++ b/Resources/Prototypes/Accents/word_replacements.yml @@ -1,4 +1,4 @@ -# Accents that work off of word replacements. +# Accents that work off of word replacements. # this is kind of dumb but localization demands it. # i guess you could just specify the prefix ('mobster') and count and let the system fill it @@ -263,7 +263,7 @@ accent-pirate-replaced-30: accent-pirate-replacement-30 accent-pirate-replaced-31: accent-pirate-replacement-31 accent-pirate-replaced-32: accent-pirate-replacement-32 - + - type: accent id: cowboy wordReplacements: @@ -366,7 +366,7 @@ accent-cowboy-words-97: accent-cowboy-replacement-97 accent-cowboy-words-98: accent-cowboy-replacement-98 accent-cowboy-words-99: accent-cowboy-replacement-99 - + # For the chat sanitization system - type: accent @@ -409,9 +409,8 @@ # chatsan-word-35: chatsan-replacement-35 # chatsan-word-36: chatsan-replacement-36 chatsan-word-37: chatsan-replacement-37 - chatsan-word-38: chatsan-replacement-38 - chatsan-word-39: chatsan-replacement-etcetera - chatsan-word-40: chatsan-replacement-etcetera - chatsan-word-41: chatsan-replacement-41 - chatsan-word-42: chatsan-replacement-42 - chatsan-word-43: chatsan-replacement-43 + # chatsan-word-38: chatsan-replacement-38 + # chatsan-word-39: chatsan-replacement-etcetera + # chatsan-word-40: chatsan-replacement-etcetera + # chatsan-word-41: chatsan-replacement-41 + # chatsan-word-42: chatsan-replacement-42 diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index 22f16bd9568..b91b26e3570 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -120,7 +120,7 @@ priority: -20 icon: sprite: Objects/Devices/communication.rsi - state: radio + state: old-radio event: !type:OpenUplinkImplantEvent - type: entity diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml index 6341042bf89..399181b4fab 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml @@ -5,7 +5,7 @@ state: icon product: CrateArmorySMG cost: 9000 - category: cargoproduct-category-name-armory + category: Armory group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateArmoryShotgun cost: 7000 - category: cargoproduct-category-name-armory + category: Armory group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: implanter0 product: CrateTrackingImplants cost: 1000 - category: cargoproduct-category-name-armory + category: Armory group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: training-bomb product: CrateTrainingBombs cost: 3000 - category: cargoproduct-category-name-armory + category: Armory group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateArmoryLaser cost: 4800 - category: cargoproduct-category-name-armory + category: Armory group: market - type: cargoProduct @@ -55,5 +55,5 @@ state: icon product: CrateArmoryPistols cost: 5200 - category: cargoproduct-category-name-armory + category: Armory group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml index c85210adf6a..0aa49383992 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml @@ -5,7 +5,7 @@ state: grey product: AirCanister cost: 1100 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: blue product: OxygenCanister cost: 1100 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: blue product: LiquidOxygenCanister cost: 2500 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: red product: NitrogenCanister cost: 1100 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: red product: LiquidNitrogenCanister cost: 2500 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: black product: CarbonDioxideCanister cost: 2200 # Until someone fixes it co2 can be used to oneshot people so it's more expensive - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: black product: LiquidCarbonDioxideCanister cost: 4000 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: yellow product: StorageCanister cost: 1010 # No gases in it so it's cheaper - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market #- type: cargoProduct @@ -87,7 +87,7 @@ # state: water_vapor # product: WaterVaporCanister # cost: 2600 -# category: cargoproduct-category-name-atmospherics +# category: Atmospherics # group: market - type: cargoProduct @@ -97,7 +97,7 @@ state: orange product: PlasmaCanister cost: 4000 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market #- type: cargoProduct @@ -109,5 +109,5 @@ # state: green # product: TritiumCanister # cost: 15500 -# category: cargoproduct-category-name-atmospherics +# category: Atmospherics # group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml index a6671ff0998..4a80b76a3fa 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml @@ -5,7 +5,7 @@ state: seed product: CrateHydroponicsSeedsExotic cost: 1000 - category: cargoproduct-category-name-hydroponics + category: Hydroponics group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: seed product: CrateHydroponicsSeedsMedicinal cost: 500 - category: cargoproduct-category-name-hydroponics + category: Hydroponics group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateHydroponicsTools cost: 500 - category: cargoproduct-category-name-hydroponics + category: Hydroponics group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: seed product: CrateHydroponicsSeeds cost: 550 - category: cargoproduct-category-name-hydroponics + category: Hydroponics group: market - type: cargoProduct @@ -45,5 +45,5 @@ state: jug product: CratePlantBGone cost: 750 - category: cargoproduct-category-name-hydroponics + category: Hydroponics group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml index fb3b2da41a8..9dac47b6f15 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml @@ -15,7 +15,7 @@ state: orebox product: OreBox cost: 500 - category: cargoproduct-category-name-cargo + category: Logistics # DeltaV - Logistics Department replacing Cargo group: market - type: cargoProduct @@ -25,5 +25,5 @@ state: icon product: CrateCargoLuxuryHardsuit cost: 15000 - category: cargoproduct-category-name-cargo + category: Logistics # DeltaV - Logistics Department replacing Cargo group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml b/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml index a96780fc3ed..0af5b5db016 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml @@ -5,5 +5,5 @@ state: cpuboard product: CrateCrewMonitoringBoards cost: 2000 - category: cargoproduct-category-name-circuitboards + category: Circuitboards group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml index 2715e0c3501..2777f859a07 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml @@ -5,7 +5,7 @@ state: icon product: CrateEmergencyExplosive cost: 650 - category: cargoproduct-category-name-emergency + category: Emergency group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: fire_extinguisher_closed product: CrateEmergencyFire cost: 1500 - category: cargoproduct-category-name-emergency + category: Emergency group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateEmergencyInternals cost: 500 - category: cargoproduct-category-name-emergency + category: Emergency group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateEmergencyInternalsLarge cost: 2000 - category: cargoproduct-category-name-emergency + category: Emergency group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: radiation product: CrateEmergencyRadiation cost: 1000 - category: cargoproduct-category-name-emergency + category: Emergency group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: item_wall product: CrateEmergencyInflatablewall cost: 500 - category: cargoproduct-category-name-emergency + category: Emergency group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateSlimepersonLifeSupport cost: 300 - category: cargoproduct-category-name-emergency + category: Emergency group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: icon product: CrateGenericBiosuit cost: 800 - category: cargoproduct-category-name-emergency + category: Emergency group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml index 754e30f133a..b5468fd982c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml @@ -5,7 +5,7 @@ state: coillv-30 product: CrateEngineeringCableLV cost: 300 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: coilmv-30 product: CrateEngineeringCableMV cost: 300 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: coilhv-30 product: CrateEngineeringCableHV cost: 300 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: coilall-30 product: CrateEngineeringCableBulk cost: 750 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateEngineeringElectricalSupplies cost: 4500 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateEngineeringStationBeaconBundle cost: 500 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateEngineeringJetpack cost: 1000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: icon product: CrateEngineeringMiniJetpack cost: 750 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: icon product: CrateAirlockKit cost: 1100 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: icon product: CrateEvaKit cost: 5000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: ammo product: CrateRCDAmmo cost: 2500 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateRCD cost: 800 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: base product: CrateParticleDecelerators cost: 15000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -135,5 +135,5 @@ state: sheaterOff product: SpaceHeaterAnchored cost: 300 - category: cargoproduct-category-name-engineering + category: Engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml index bd00b0c2d4c..ece817b746e 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml @@ -5,7 +5,7 @@ state: jar product: CrateEngineeringAMEJar cost: 2000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateEngineeringSingularityGenerator cost: 4000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateEngineeringSingularityContainment cost: 1000 - category: cargoproduct-category-name-engineering + category: Engineering group: market #- type: cargoProduct @@ -37,7 +37,7 @@ # state: emitter2 # product: CrateEngineeringSingularityEmitter # cost: 3000 -# category: cargoproduct-category-name-engineering +# category: Engineering # group: market - type: cargoProduct @@ -47,7 +47,7 @@ state: ca_on product: CrateEngineeringSingularityCollector cost: 1000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -57,7 +57,7 @@ state: completed product: CrateEngineeringParticleAccelerator cost: 2000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -67,18 +67,18 @@ state: solar-assembly-part product: CrateEngineeringSolar cost: 500 - category: cargoproduct-category-name-engineering + category: Engineering group: market -- type: cargoProduct - id: EngineTeslaGenerator - icon: - sprite: Structures/Power/Generation/Tesla/generator.rsi - state: icon - product: CrateEngineeringTeslaGenerator - cost: 4000 - category: cargoproduct-category-name-engineering - group: market +#- type: cargoProduct +# id: EngineTeslaGenerator +# icon: +# sprite: Structures/Power/Generation/Tesla/generator.rsi +# state: icon +# product: CrateEngineeringTeslaGenerator +# cost: 4000 +# category: Engineering +# group: market - type: cargoProduct id: EngineTeslaCoil @@ -87,7 +87,7 @@ state: coil product: CrateEngineeringTeslaCoil cost: 1200 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -97,5 +97,5 @@ state: grounding_rod product: CrateEngineeringTeslaGroundingRod cost: 400 - category: cargoproduct-category-name-engineering + category: Engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml index 1a6f8380961..e5069959296 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml @@ -5,7 +5,7 @@ state: margherita-slice product: CrateFoodPizza cost: 450 - category: cargoproduct-category-name-food + category: Food group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: margherita product: CrateFoodPizzaLarge cost: 1800 - category: cargoproduct-category-name-food + category: Food group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: nutribrick product: CrateFoodMRE cost: 1000 - category: cargoproduct-category-name-food + category: Food group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: flour-big product: CrateFoodCooking cost: 750 - category: cargoproduct-category-name-food + category: Food group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: tin product: CrateFoodDinnerware cost: 750 - category: cargoproduct-category-name-food + category: Food group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateFoodBarSupply cost: 750 - category: cargoproduct-category-name-food + category: Food group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateFoodSoftdrinks cost: 1200 - category: cargoproduct-category-name-food + category: Food group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: icon product: CrateFoodSoftdrinksLarge cost: 2400 - category: cargoproduct-category-name-food + category: Food group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml index c29458a1ee5..d84fedd543f 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml @@ -5,7 +5,7 @@ state: icon product: CrateFunInstrumentsVariety cost: 2000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: tuba product: CrateFunInstrumentsBrass cost: 2500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateFunInstrumentsString cost: 2500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateFunInstrumentsWoodwind cost: 2500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateFunInstrumentsKeyedPercussion cost: 2500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateFunInstrumentsSpecial cost: 10000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: box product: CrateFunArtSupplies cost: 500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: birthday product: CrateFunParty cost: 1000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: display product: CrateFunWaterGuns cost: 750 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: plushie_h product: CrateFunPlushie cost: 1000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: plushie_lizard product: CrateFunLizardPlushieBulk cost: 500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: d6_6 product: CrateFunBoardGames cost: 1500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: implanter0 product: CrateFunSadTromboneImplants cost: 1000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: implanter0 product: CrateFunLightImplants cost: 1000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: icon product: CrateFunBoxing cost: 500 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: crate_icon product: CrateFunPirate cost: 400 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: crate_icon product: CrateFunToyBox cost: 900 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: implanter0 product: CrateFunBikeHornImplants cost: 1000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: fig_box product: CrateFunMysteryFigurines cost: 4000 - category: cargoproduct-category-name-fun + category: Fun group: market - type: cargoProduct @@ -205,15 +205,15 @@ state: icon product: CrateFunDartsSet cost: 900 - category: cargoproduct-category-name-fun + category: Fun group: market -- type: cargoProduct - id: FunCrateGambling - icon: - sprite: Objects/Economy/cash.rsi - state: cash_1000000 - product: CrateCargoGambling - cost: 10000 - category: cargoproduct-category-name-fun - group: market +#- type: cargoProduct +# id: FunCrateGambling +# icon: +# sprite: Objects/Economy/cash.rsi +# state: cash_1000000 +# product: CrateCargoGambling +# cost: 10000 +# category: Fun +# group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml index 922e2951b6c..6ef0ab4e211 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml @@ -5,7 +5,7 @@ state: 0 product: CrateNPCBee cost: 7000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: butterfly product: CrateNPCButterflies cost: 4400 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: cat product: CrateNPCCat cost: 1200 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon-1 product: CrateNPCChicken cost: 4000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: crab product: CrateNPCCrab cost: 3000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon-0 product: CrateNPCDuck cost: 6000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: corgi product: CrateNPCCorgi cost: 1200 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: puppy product: CrateNPCPuppyCorgi cost: 1200 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: cow product: CrateNPCCow cost: 3200 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: goat product: CrateNPCGoat cost: 1200 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: goose product: CrateNPCGoose cost: 2100 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateNPCGorilla cost: 1100 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: box product: CrateNPCMonkeyCube cost: 2000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: box_kobold product: CrateNPCKoboldCube cost: 2000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: icon-0 product: CrateNPCMouse cost: 4400 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: parrot product: CrateNPCParrot cost: 3000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: penguin product: CrateNPCPenguin cost: 2100 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: pig product: CrateNPCPig cost: 1100 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: snake product: CrateNPCSnake cost: 3000 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: icon-0 product: CrateNPCHamster cost: 2800 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -205,7 +205,7 @@ state: lizard product: CrateNPCLizard cost: 1100 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -215,7 +215,7 @@ state: kangaroo product: CrateNPCKangaroo cost: 2800 - category: cargoproduct-category-name-livestock + category: Livestock group: market - type: cargoProduct @@ -225,5 +225,5 @@ state: mothroach product: CrateNPCMothroach cost: 5000 - category: cargoproduct-category-name-livestock + category: Livestock group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml index 6f945001d93..e3b07af13ba 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml @@ -5,7 +5,7 @@ state: glass_3 product: CrateMaterialGlass cost: 1000 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: steel_3 product: CrateMaterialSteel cost: 1000 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: plastic_3 product: CrateMaterialPlastic cost: 1500 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: brass_3 product: CrateMaterialBrass cost: 2500 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: plasteel_3 product: CrateMaterialPlasteel cost: 3000 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: cloth_3 product: CrateMaterialTextiles cost: 1000 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: plasma_3 product: CrateMaterialPlasma cost: 2000 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: cardboard_3 product: CrateMaterialCardboard cost: 750 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: paper_3 product: CrateMaterialPaper cost: 1000 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: fueltank product: WeldingFuelTankFull cost: 1500 - category: cargoproduct-category-name-materials + category: Materials group: market - type: cargoProduct @@ -105,5 +105,5 @@ state: watertank product: WaterTankFull cost: 1000 - category: cargoproduct-category-name-materials + category: Materials group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml index 1addf523e4b..01a7192b35b 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml @@ -5,7 +5,7 @@ state: firstaid product: CrateMedicalSupplies cost: 2400 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: beaker product: CrateChemistrySupplies cost: 750 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: vial product: CrateChemistryVials cost: 1000 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: burnkit product: CrateEmergencyBurnKit cost: 700 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: toxinkit product: CrateEmergencyToxinKit cost: 600 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: o2kit product: CrateEmergencyO2Kit cost: 600 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: brutekit product: CrateEmergencyBruteKit cost: 600 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: advkit product: CrateEmergencyAdvancedKit cost: 1200 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: radkit product: CrateEmergencyRadiationKit cost: 600 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: bag_folded product: CrateBodyBags cost: 700 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: icon product: CrateVirologyBiosuit cost: 800 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: implanter0 product: CrateMindShieldImplants cost: 3000 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: icon product: CrateChemistryP cost: 850 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: icon product: CrateChemistryS cost: 750 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -145,5 +145,5 @@ state: icon product: CrateChemistryD cost: 750 - category: cargoproduct-category-name-medical + category: Medical group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml index 756a223e74d..f370155e075 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml @@ -5,7 +5,7 @@ state: artifact_container_icon product: CrateArtifactContainer cost: 500 - category: cargoproduct-category-name-science + category: Epistemics # DeltaV - Epistemics Department replacing Science group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: ano13 product: RandomArtifactSpawner cost: 2000 - category: cargoproduct-category-name-science + category: Epistemics # DeltaV - Epistemics Department replacing Science group: market - type: cargoProduct @@ -25,5 +25,5 @@ state: icon product: CrateScienceBiosuit cost: 800 - category: cargoproduct-category-name-science + category: Epistemics # DeltaV - Epistemics Department replacing Science group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml index 2ad7628ddb3..a616202bdba 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml @@ -4,8 +4,8 @@ sprite: DeltaV/Clothing/OuterClothing/Armor/platecarrier.rsi # DeltaV - resprite state: icon product: CrateSecurityArmor - cost: 800 - category: cargoproduct-category-name-security + cost: 1000 # DeltaV - raise price for buffed armour + category: Security group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateSecurityHelmet cost: 550 - category: cargoproduct-category-name-security + category: Security group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: base product: CrateSecurityNonlethal cost: 4000 - category: cargoproduct-category-name-security + category: Security group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateSecurityRiot cost: 5500 - category: cargoproduct-category-name-security + category: Security group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: box_security product: CrateSecuritySupplies cost: 500 - category: cargoproduct-category-name-security + category: Security group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: handcuff product: CrateRestraints cost: 1000 - category: cargoproduct-category-name-security + category: Security group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateSecurityBiosuit cost: 800 - category: cargoproduct-category-name-security + category: Security group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: idle product: DeployableBarrier cost: 1000 - category: cargoproduct-category-name-security + category: Security group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index f27adb65a4a..a2c0af9ce7f 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -5,7 +5,7 @@ state: cleaner product: CrateServiceJanitorialSupplies cost: 560 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: normal product: CrateServiceReplacementLights cost: 600 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: mousetrap product: CrateMousetrapBoxes cost: 500 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateServiceTheatre cost: 1800 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: closed product: CrateServiceSmokeables cost: 1500 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: closed product: CrateServiceCustomSmokable cost: 1000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: pen product: CrateServiceBureaucracy cost: 1000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: default product: CrateServicePersonnel cost: 1000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: book0 product: CrateServiceBooks cost: 1000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: book_engineering2 product: CrateServiceGuidebooks cost: 1300 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: icon product: CrateServiceSodaDispenser cost: 850 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateServiceBoozeDispenser cost: 750 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: box product: CrateServiceBox cost: 400 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: icon product: CrateJanitorBiosuit cost: 800 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: icon-hot product: FoodCartHot cost: 2000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: icon-cold product: FoodCartCold cost: 2000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: icon product: PetCarrier cost: 500 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: icon product: CrateJanitorExplosive cost: 1000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -185,6 +185,6 @@ state: icon-cart product: JanitorialTrolley cost: 300 - category: cargoproduct-category-name-service + category: Service group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml b/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml index 278104caed1..96a193881ef 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml @@ -5,7 +5,7 @@ state: base product: CrateEngineeringThruster cost: 1500 - category: cargoproduct-category-name-shuttle + category: Shuttle group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: base product: CrateEngineeringGyroscope cost: 4000 - category: cargoproduct-category-name-shuttle + category: Shuttle group: market # - type: cargoProduct @@ -25,6 +25,6 @@ # state: avionics-systems # product: CrateEngineeringShuttle # cost: 3000 - # category: cargoproduct-category-name-shuttle + # category: Shuttle # group: market # locked: true # only the QM has permission to order by default diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 3e303c32127..d0ae444bf77 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -13,7 +13,7 @@ state: base product: CrateVendingMachineRestockBoozeFilled cost: 3500 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -24,7 +24,7 @@ state: base product: CrateVendingMachineRestockChefvendFilled cost: 680 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -44,7 +44,7 @@ state: base product: CrateVendingMachineRestockDinnerwareFilled cost: 2000 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: base product: CrateVendingMachineRestockCondimentStationFilled cost: 300 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: base product: CrateVendingMachineRestockEngineeringFilled cost: 3200 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: base product: CrateVendingMachineRestockGamesFilled cost: 750 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: base product: CrateVendingMachineRestockHotDrinksFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: base product: CrateVendingMachineRestockMedicalFilled cost: 1750 - category: cargoproduct-category-name-medical + category: Medical group: market - type: cargoProduct @@ -104,8 +104,8 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockChemVendFilled - cost: 3820 - category: cargoproduct-category-name-medical + cost: 6300 #Delta V - was 3820, see rebase PR #53 + category: Medical group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: base product: CrateVendingMachineRestockNutriMaxFilled cost: 2400 - category: cargoproduct-category-name-hydroponics + category: Hydroponics group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: base product: CrateVendingMachineRestockPTechFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: base product: CrateVendingMachineRestockRobustSoftdrinksFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: base product: CrateVendingMachineRestockSalvageEquipmentFilled cost: 1000 - category: cargoproduct-category-name-engineering + category: Engineering group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: base product: CrateVendingMachineRestockSecTechFilled cost: 2200 - category: cargoproduct-category-name-security + category: Security group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: base product: CrateVendingMachineRestockSeedsFilled cost: 3375 - category: cargoproduct-category-name-hydroponics + category: Hydroponics group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: base product: CrateVendingMachineRestockSmokesFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: base product: CrateVendingMachineRestockVendomatFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: base product: CrateVendingMachineRestockRoboticsFilled cost: 1600 - category: cargoproduct-category-name-science + category: Epistemics # DeltaV - Epistemics Department replacing Science group: market - type: cargoProduct @@ -205,7 +205,7 @@ state: base product: CrateVendingMachineRestockTankDispenserFilled cost: 1000 - category: cargoproduct-category-name-atmospherics + category: Atmospherics group: market - type: cargoProduct @@ -215,7 +215,7 @@ state: base product: CrateVendingMachineRestockHappyHonkFilled cost: 2100 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -225,7 +225,7 @@ state: base product: CrateVendingMachineRestockGetmoreChocolateCorpFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -235,7 +235,7 @@ state: base product: CrateVendingMachineRestockChangFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -245,7 +245,7 @@ state: base product: CrateVendingMachineRestockDiscountDansFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market - type: cargoProduct @@ -255,5 +255,5 @@ state: base product: CrateVendingMachineRestockDonutFilled cost: 1200 - category: cargoproduct-category-name-service + category: Service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index bb21bc36d47..92e4032b0cb 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -87,7 +87,6 @@ ClothingShoesBootsCowboyBrown: 1 ClothingShoesBootsCowboyBlack: 1 ClothingShoesBootsCowboyWhite: 1 - ClothingMaskNeckGaiterRed: 2 emaggedInventory: ClothingShoesBling: 1 ClothingShoesBootsCowboyFancy: 1 diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 1e81cdf2dd1..7f64ebbd23c 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -428,7 +428,7 @@ name: uplink-reinforcement-radio-name description: uplink-reinforcement-radio-desc productEntity: ReinforcementRadioSyndicate - icon: { sprite: Objects/Devices/communication.rsi, state: radio } + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 16 categories: @@ -444,7 +444,7 @@ name: uplink-reinforcement-radio-name description: uplink-reinforcement-radio-desc productEntity: ReinforcementRadioSyndicateNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: radio } + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 16 categories: @@ -476,7 +476,7 @@ name: uplink-reinforcement-radio-monkey-name description: uplink-reinforcement-radio-monkey-desc productEntity: ReinforcementRadioSyndicateMonkey - icon: { sprite: Objects/Devices/communication.rsi, state: radio } + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 8 categories: @@ -492,9 +492,9 @@ name: uplink-reinforcement-radio-monkey-name description: uplink-reinforcement-radio-monkey-desc productEntity: ReinforcementRadioSyndicateMonkeyNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: radio } + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: - Telecrystal: 6 + Telecrystal: 8 categories: - UplinkUtility conditions: @@ -724,7 +724,7 @@ id: UplinkUplinkImplanter # uplink uplink real name: uplink-uplink-implanter-name description: uplink-uplink-implanter-desc - icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: radio } + icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: old-radio } productEntity: UplinkImplanter cost: Telecrystal: 2 diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index c845d7cc4a0..43d6c7c9b70 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -809,8 +809,8 @@ - type: entity parent: ClothingHeadBase id: ClothingHeadHatMagician - name: magician's tophat - description: "A magician's tophat." + name: magician's top hat. + description: "A magician's top hat." components: - type: Icon sprite: Clothing/Head/Hats/magician.rsi @@ -827,7 +827,6 @@ - type: Item size: Small sprite: Clothing/Head/Hats/magician.rsi - storedRotation: 0 - type: Storage grid: - 0,0,0,0 diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index ad738792a73..1f70211caa8 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -514,16 +514,6 @@ tags: - WhitelistChameleon -- type: entity - parent: ClothingMaskNeckGaiter - id: ClothingMaskNeckGaiterRed - name: red neck gaiter - components: - - type: Sprite - sprite: Clothing/Mask/neckgaiterred.rsi - - type: Clothing - sprite: Clothing/Mask/neckgaiterred.rsi - - type: entity parent: ClothingMaskClownBase id: ClothingMaskSexyClown diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml index d1f6e083f40..ee1708caef6 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml @@ -47,9 +47,6 @@ collection: FootstepDuck params: variation: 0.07 - - type: Construction - graph: ClothingShoeSlippersDuck - node: shoes - type: entity parent: ClothingShoesBaseButcherable diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index a271e9d0846..5e40254e3a8 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -14,8 +14,6 @@ - type: HumanoidAppearance species: Vox #- type: VoxAccent # Not yet coded - - type: Inventory - speciesId: vox - type: Speech speechVerb: Vox speechSounds: Vox diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml index a8489866fc7..f6d57f53a50 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml @@ -7,7 +7,7 @@ - type: Sprite sprite: Objects/Devices/communication.rsi layers: - - state: radio + - state: old-radio - type: GhostRole name: ghost-role-information-syndicate-reinforcement-name description: ghost-role-information-syndicate-reinforcement-description diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml index edad2b40631..8c3aed0d069 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml @@ -89,7 +89,6 @@ program: 125 - type: Item size: Small - storedRotation: -90 - type: entity parent: BaseHandheldInstrument @@ -119,7 +118,6 @@ - type: Item size: Small sprite: Objects/Fun/Instruments/gunpet.rsi - storedRotation: -90 - type: Tag tags: - Sidearm @@ -143,7 +141,6 @@ - type: Item sprite: Objects/Fun/Instruments/bike_horn.rsi size: Small - storedRotation: -90 - type: Clothing sprite: Objects/Fun/Instruments/bike_horn.rsi slots: [Belt] diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml index b09ea96f7b4..a255ab4a32c 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml @@ -98,8 +98,6 @@ - type: Tag tags: - KeyedInstrument - - type: Item - size: Small - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml index e99f825d483..3b89d1075be 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml @@ -141,7 +141,7 @@ sprite: Objects/Fun/Instruments/panflute.rsi state: icon - type: Item - size: Small + size: Normal sprite: Objects/Fun/Instruments/panflute.rsi - type: Tag tags: @@ -160,9 +160,8 @@ sprite: Objects/Fun/Instruments/ocarina.rsi state: icon - type: Item - size: Small + size: Normal sprite: Objects/Fun/Instruments/ocarina.rsi - storedRotation: -90 - type: Tag tags: - WoodwindInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 67c6e1194b7..6697aa711e0 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -643,9 +643,6 @@ requiresSpecialDigestion: true useSound: path: /Audio/Items/Toys/mousesqueek.ogg - - type: Tag - tags: - - ToyRubberDuck - type: entity parent: BasePlushie diff --git a/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml b/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml index 70d984240ea..c3f5170001a 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml @@ -387,17 +387,3 @@ - state: book6 - type: Paper content: book-text-inspiration - -- type: entity - parent: BookBase - id: BookJanitorTale - name: the tales of a tired janitor - description: A clean looking book, smelling vaguely of soap and bleach. - components: - - type: Sprite - sprite: Objects/Misc/books.rsi - layers: - - state: book0 - - type: Paper - content: book-text-janitor - diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index 9fde67afb44..bd789214f99 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -786,7 +786,7 @@ # Syringes - type: entity name: ephedrine syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeEphedrine components: - type: SolutionContainerManager @@ -799,7 +799,7 @@ - type: entity name: inaprovaline syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeInaprovaline components: - type: SolutionContainerManager @@ -812,7 +812,7 @@ - type: entity name: tranexamic acid syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeTranexamicAcid components: - type: SolutionContainerManager @@ -825,7 +825,7 @@ - type: entity name: bicaridine syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeBicaridine components: - type: SolutionContainerManager @@ -838,7 +838,7 @@ - type: entity name: dermaline syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeDermaline components: - type: SolutionContainerManager @@ -851,7 +851,7 @@ - type: entity name: hyronalin syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeHyronalin components: - type: SolutionContainerManager @@ -864,7 +864,7 @@ - type: entity name: ipecac syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeIpecac components: - type: SolutionContainerManager @@ -877,7 +877,7 @@ - type: entity name: ambuzol syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeAmbuzol components: - type: SolutionContainerManager @@ -890,7 +890,7 @@ - type: entity name: sigynate syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeSigynate components: - type: SolutionContainerManager @@ -903,7 +903,7 @@ - type: entity name: ethylredoxrazine syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeEthylredoxrazine components: - type: SolutionContainerManager @@ -916,7 +916,7 @@ - type: entity name: phalanximine syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringePhalanximine components: - type: SolutionContainerManager @@ -929,7 +929,7 @@ - type: entity name: saline syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeSaline components: - type: SolutionContainerManager @@ -943,7 +943,7 @@ #this is where all the syringes are so i didn't know where to put it - type: entity name: romerol syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeRomerol components: - type: SolutionContainerManager @@ -956,7 +956,7 @@ - type: entity name: stimulants syringe - parent: PrefilledSyringe + parent: BaseSyringe id: SyringeStimulants components: - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index ae4aaed7d21..ab65940fabc 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -364,13 +364,6 @@ - Syringe - Trash -- type: entity - parent: BaseSyringe - id: PrefilledSyringe - components: - - type: Injector - toggleState: Inject - - type: entity id: SyringeBluespace parent: BaseSyringe diff --git a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml index 883f66816de..2b5762aaef2 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml @@ -57,10 +57,10 @@ - type: Sprite sprite: Objects/Devices/communication.rsi layers: - - state: radio + - state: old-radio - type: Item sprite: Objects/Devices/communication.rsi - heldPrefix: radio + heldPrefix: old-radio - type: UserInterface interfaces: - key: enum.StoreUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index d07a73b022e..51f121c64ff 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -6,8 +6,6 @@ components: - type: AccessReader access: [["Service"]] - - type: Wires - layoutId: AirlockService - type: entity parent: Airlock @@ -16,8 +14,6 @@ components: - type: AccessReader access: [["Lawyer"]] - - type: Wires - layoutId: AirlockService - type: entity parent: Airlock @@ -26,8 +22,6 @@ components: - type: AccessReader access: [["Theatre"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockScience # DeltaV - Chapel is in Epistemics @@ -36,8 +30,6 @@ components: - type: AccessReader access: [["Chapel"]] - - type: Wires - layoutId: AirlockService - type: entity parent: Airlock @@ -46,8 +38,6 @@ components: - type: AccessReader access: [["Janitor"]] - - type: Wires - layoutId: AirlockService - type: entity parent: Airlock @@ -56,8 +46,6 @@ components: - type: AccessReader access: [["Kitchen"]] - - type: Wires - layoutId: AirlockService - type: entity parent: Airlock @@ -66,8 +54,6 @@ components: - type: AccessReader access: [["Bar"]] - - type: Wires - layoutId: AirlockService - type: entity parent: Airlock @@ -76,8 +62,6 @@ components: - type: AccessReader access: [["Hydroponics"]] - - type: Wires - layoutId: AirlockService - type: entity parent: Airlock @@ -86,8 +70,6 @@ components: - type: AccessReader access: [["Captain"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockExternal @@ -104,8 +86,6 @@ components: - type: AccessReader access: [["Cargo"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockExternal @@ -114,8 +94,6 @@ components: - type: AccessReader access: [["Engineering"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockExternal @@ -124,8 +102,6 @@ components: - type: AccessReader access: [["Atmospherics"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockExternal @@ -150,8 +126,6 @@ components: - type: AccessReader access: [["Kitchen"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockFreezer @@ -160,8 +134,6 @@ components: - type: AccessReader access: [["Kitchen"], ["Hydroponics"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockFreezer @@ -170,8 +142,6 @@ components: - type: AccessReader access: [["Hydroponics"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockEngineering @@ -180,8 +150,6 @@ components: - type: AccessReader access: [["Engineering"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockAtmospherics @@ -190,8 +158,6 @@ components: - type: AccessReader access: [["Atmospherics"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockCargo @@ -200,8 +166,6 @@ components: - type: AccessReader access: [["Cargo"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockCargo @@ -210,8 +174,6 @@ components: - type: AccessReader access: [["Salvage"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockMining @@ -220,8 +182,6 @@ components: - type: AccessReader access: [["Salvage"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMedical @@ -230,8 +190,6 @@ components: - type: AccessReader access: [["Medical"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockMedical @@ -248,8 +206,6 @@ components: - type: AccessReader access: [["Medical"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockChemistry @@ -258,8 +214,6 @@ components: - type: AccessReader access: [["Chemistry"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockScience @@ -268,8 +222,6 @@ components: - type: AccessReader access: [["Research"]] - - type: Wires - layoutId: AirlockScience - type: entity parent: AirlockScience @@ -278,8 +230,6 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] - - type: Wires - layoutId: AirlockScience - type: entity parent: AirlockCentralCommand @@ -308,8 +258,6 @@ components: - type: AccessReader access: [["Captain"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -318,8 +266,6 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -328,8 +274,6 @@ components: - type: AccessReader access: [["ChiefEngineer"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -338,8 +282,6 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -348,8 +290,6 @@ components: - type: AccessReader access: [["ResearchDirector"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -358,8 +298,6 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -368,8 +306,6 @@ components: - type: AccessReader access: [["Quartermaster"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockSecurity @@ -429,8 +365,6 @@ components: - type: AccessReader access: [["Security", "Command"]] - - type: Wires - layoutId: AirlockSecurity - type: entity parent: AirlockCommand @@ -439,8 +373,6 @@ components: - type: AccessReader access: [["External"]] - - type: Wires - layoutId: AirlockCommand # Glass Airlocks - type: entity @@ -450,8 +382,6 @@ components: - type: AccessReader access: [["Service"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockGlass @@ -460,8 +390,6 @@ components: - type: AccessReader access: [["Lawyer"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockGlass @@ -470,8 +398,6 @@ components: - type: AccessReader access: [["Theatre"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockGlass @@ -480,8 +406,6 @@ components: - type: AccessReader access: [["Bar"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockExternalGlass @@ -498,8 +422,6 @@ components: - type: AccessReader access: [["Cargo"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockExternalGlass @@ -524,8 +446,6 @@ components: - type: AccessReader access: [["Engineering"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockExternalGlass @@ -534,8 +454,6 @@ components: - type: AccessReader access: [["Atmospherics"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockGlass @@ -544,8 +462,6 @@ components: - type: AccessReader access: [["Kitchen"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockGlass @@ -554,8 +470,6 @@ components: - type: AccessReader access: [["Janitor"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockGlass @@ -564,8 +478,6 @@ components: - type: AccessReader access: [["Hydroponics"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockScienceGlass # DeltaV - Chapel is in Epistemics @@ -574,8 +486,6 @@ components: - type: AccessReader access: [["Chapel"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockEngineeringGlass @@ -584,8 +494,6 @@ components: - type: AccessReader access: [["Engineering"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockAtmosphericsGlass @@ -594,8 +502,6 @@ components: - type: AccessReader access: [["Atmospherics"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockCargoGlass @@ -604,8 +510,6 @@ components: - type: AccessReader access: [["Cargo"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockCargoGlass @@ -614,8 +518,6 @@ components: - type: AccessReader access: [["Salvage"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockMiningGlass @@ -624,8 +526,6 @@ components: - type: AccessReader access: [["Salvage"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockChemistryGlass @@ -634,8 +534,6 @@ components: - type: AccessReader access: [["Chemistry"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockMedicalGlass @@ -644,8 +542,6 @@ components: - type: AccessReader access: [["Medical"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockMedicalGlass @@ -662,8 +558,6 @@ components: - type: AccessReader access: [["Medical"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockScienceGlass @@ -672,8 +566,6 @@ components: - type: AccessReader access: [["Research"]] - - type: Wires - layoutId: AirlockScience - type: entity parent: AirlockScienceGlass @@ -682,8 +574,6 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] - - type: Wires - layoutId: AirlockScience - type: entity parent: AirlockCentralCommandGlass @@ -702,8 +592,6 @@ components: - type: AccessReader access: [["Command"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -712,8 +600,6 @@ components: - type: AccessReader access: [["Captain"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -722,8 +608,6 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -732,8 +616,6 @@ components: - type: AccessReader access: [["ChiefEngineer"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -742,8 +624,6 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -752,8 +632,6 @@ components: - type: AccessReader access: [["ResearchDirector"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -762,8 +640,6 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -772,8 +648,6 @@ components: - type: AccessReader access: [["Quartermaster"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -782,8 +656,6 @@ components: - type: AccessReader access: [["Security"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -792,9 +664,8 @@ components: - type: AccessReader access: [["Detective"]] - - type: Wires - layoutId: AirlockCommand +#Delta V: Removed Brig Access #- type: entity # parent: AirlockSecurityGlass # id: AirlockBrigGlassLocked @@ -802,8 +673,6 @@ # components: # - type: AccessReader # access: [["Brig"]] -# - type: Wires -# layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -812,8 +681,6 @@ components: - type: AccessReader access: [["Security"], ["Lawyer"]] - - type: Wires - layoutId: AirlockSecurity - type: entity parent: AirlockSecurityGlass @@ -822,8 +689,6 @@ components: - type: AccessReader access: [["Armory"]] - - type: Wires - layoutId: AirlockSecurity - type: entity parent: AirlockCommandGlassLocked @@ -873,8 +738,6 @@ components: - type: AccessReader access: [["Salvage"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockMaint @@ -883,8 +746,6 @@ components: - type: AccessReader access: [["Cargo"]] - - type: Wires - layoutId: AirlockCargo - type: entity parent: AirlockMaint @@ -893,8 +754,6 @@ components: - type: AccessReader access: [["Command"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -911,8 +770,6 @@ components: - type: AccessReader access: [["Engineering"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockMaint @@ -921,8 +778,6 @@ components: - type: AccessReader access: [["Atmospherics"]] - - type: Wires - layoutId: AirlockEngineering - type: entity parent: AirlockMaint @@ -931,8 +786,6 @@ components: - type: AccessReader access: [["Bar"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -941,8 +794,6 @@ components: - type: AccessReader access: [["Chapel"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -951,8 +802,6 @@ components: - type: AccessReader access: [["Hydroponics"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -961,8 +810,6 @@ components: - type: AccessReader access: [["Janitor"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -971,8 +818,6 @@ components: - type: AccessReader access: [["Lawyer"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -981,8 +826,6 @@ components: - type: AccessReader access: [["Service"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -991,8 +834,6 @@ components: - type: AccessReader access: [["Theatre"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -1001,8 +842,6 @@ components: - type: AccessReader access: [["Kitchen"]] - - type: Wires - layoutId: AirlockService - type: entity parent: AirlockMaint @@ -1019,8 +858,6 @@ components: - type: AccessReader access: [["Medical"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockMaint @@ -1029,8 +866,6 @@ components: - type: AccessReader access: [["Chemistry"]] - - type: Wires - layoutId: AirlockMedical - type: entity parent: AirlockMaint @@ -1039,8 +874,6 @@ components: - type: AccessReader access: [["Research"]] - - type: Wires - layoutId: AirlockScience - type: entity parent: AirlockMaint @@ -1049,8 +882,6 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] - - type: Wires - layoutId: AirlockScience - type: entity parent: AirlockMaint @@ -1059,8 +890,6 @@ components: - type: AccessReader access: [["Security"]] - - type: Wires - layoutId: AirlockSecurity - type: entity parent: AirlockMaint @@ -1069,8 +898,6 @@ components: - type: AccessReader access: [["Detective"]] - - type: Wires - layoutId: AirlockSecurity - type: entity parent: AirlockMaint @@ -1079,8 +906,6 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -1089,8 +914,6 @@ components: - type: AccessReader access: [["Captain"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -1099,8 +922,6 @@ components: - type: AccessReader access: [["ChiefEngineer"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -1109,8 +930,6 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -1119,8 +938,6 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -1129,8 +946,6 @@ components: - type: AccessReader access: [["ResearchDirector"]] - - type: Wires - layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -1139,8 +954,6 @@ components: - type: AccessReader access: [["Armory"]] - - type: Wires - layoutId: AirlockSecurity - type: entity parent: AirlockSyndicate diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 476e715175e..53a32e0f6fa 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -130,6 +130,9 @@ - board - type: PlacementReplacement key: walls + - type: IconSmooth + key: walls + mode: NoSprite - type: PaintableAirlock group: Standard department: Civilian diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index 3709b739a3e..8dfe2f62a51 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -51,6 +51,9 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] + - type: IconSmooth + key: walls + mode: NoSprite - type: Occluder - type: BlockWeather diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index 55010eea512..1819c9d0ef2 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -72,6 +72,9 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] + - type: IconSmooth + key: walls + mode: NoSprite - type: DoorSignalControl - type: DeviceNetwork deviceNetId: Wireless diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml index 0b3c291af25..518ff2f066e 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml @@ -4,7 +4,7 @@ abstract: true description: You sit in this. Either by will or force. placement: - mode: PlaceFree + mode: SnapgridCenter components: - type: Clickable - type: InteractionOutline @@ -65,8 +65,6 @@ id: ChairBase abstract: true parent: UnanchoredChairBase - placement: - mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -89,8 +87,6 @@ id: StoolBase parent: OfficeChairBase abstract: true - placement: - mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -120,7 +116,7 @@ - type: entity name: stool id: Stool - parent: UnanchoredChairBase + parent: ChairBase description: Apply butt. components: - type: Sprite @@ -245,7 +241,7 @@ - type: entity id: ChairMeat - parent: UnanchoredChairBase + parent: ChairBase name: meat chair description: Uncomfortably sweaty. components: @@ -289,7 +285,7 @@ name: web chair id: ChairWeb description: For true web developers. - parent: UnanchoredChairBase + parent: ChairBase components: - type: Sprite sprite: Structures/Web/chair.rsi @@ -353,6 +349,8 @@ parent: ChairFolding id: ChairFoldingSpawnFolded suffix: folded + placement: + mode: PlaceFree components: - type: Foldable folded: true diff --git a/Resources/Prototypes/Entities/Structures/Windows/window.yml b/Resources/Prototypes/Entities/Structures/Windows/window.yml index ee2ad6bc28f..fca0b975e98 100644 --- a/Resources/Prototypes/Entities/Structures/Windows/window.yml +++ b/Resources/Prototypes/Entities/Structures/Windows/window.yml @@ -69,7 +69,7 @@ acts: [ "Destruction" ] - type: Airtight - type: IconSmooth - key: walls + key: windows base: window - type: InteractionPopup interactSuccessString: comp-window-knock @@ -242,4 +242,4 @@ sprite: Structures/Windows/cracks_diagonal.rsi - type: Construction graph: WindowDiagonal - node: windowDiagonal + node: windowDiagonal \ No newline at end of file diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml index 59e3690b6bc..28340ead40a 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml @@ -45,7 +45,6 @@ - BookMap - BookJourney - BookInspiration - - BookJanitorTale # Guidebook Books - BookSpaceEncyclopedia - BookTheBookOfControl diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml index 181bacca45e..a75f31cf0f7 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml @@ -36,7 +36,6 @@ - BoxCandle - BoxCandleSmall - BoxDarts - - BoxCartridgeBB chance: 0.7 rarePrototypes: - BoxHugHealing @@ -50,7 +49,6 @@ - PresentRandom - BoxHolyWater - MysteryFigureBox - - BoxCleanerGrenades rareChance: 0.05 @@ -102,8 +100,6 @@ - BoxMagazineCaselessRifleRubber - BoxMagazineUniversalMagnumPractice - BoxMagazineUniversalMagnumRubber - - MagazineBoxSpecialRubber - - MagazineBoxSpecialPractice chance: 0.15 rarePrototypes: - BoxMagazinePistolCaselessRifle @@ -125,8 +121,4 @@ - BoxShellSoulbreaker - BoxMagazineUniversalMagnum - BoxSpeedLoaderLightRifle - - MagazineBoxSpecial - - MagazineBoxSpecialIncendiary - - MagazineBoxSpecialUranium - - MagazineBoxSpecialMindbreaker rareChance: 0.015 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml index abd4d86a1ef..c8efdbdc8cf 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml @@ -1,7 +1,7 @@ - type: entity parent: MarkerBase id: RandomBoards - name: random device & board spawner + name: random machine board spawner components: - type: Sprite layers: @@ -71,16 +71,6 @@ - HotplateMachineCircuitboard - ElectricGrillMachineCircuitboard - FatExtractorMachineCircuitboard - - SpaceHeaterMachineCircuitBoard - - StationMapCircuitboard - - Igniter - - IntercomElectronics - - DoorRemoteFirefight - - RadiationCollectorFlatpack - - ContainmentFieldGeneratorFlatpack - - SolarAssemblyFlatpack - - StationBeaconPart - - HandheldStationMap chance: 0.8 rarePrototypes: - TraversalDistorterMachineCircuitboard @@ -117,26 +107,4 @@ - ShockCollar - GlimmerMonitorCartridge - PotatoAIChip - - CargoTelepadMachineCircuitboard - - FlatpackerMachineCircuitboard - - OreProcessorIndustrialMachineCircuitboard - - TurboItemRechargerCircuitboard - - PowerCageRechargerCircuitboard - - HellfireHeaterMachineCircuitBoard - - HellfireFreezerMachineCircuitBoard - - BiofabricatorMachineCircuitboard - - SalvageExpeditionsComputerCircuitboard - - RadarConsoleCircuitboard - - RipleyCentralElectronics - - RipleyPeripheralsElectronics - - HamtrCentralElectronics - - HamtrPeripheralsElectronics - - HonkerCentralElectronics - - HonkerPeripheralsElectronics - - HonkerTargetingElectronics - - RemoteSignallerAdvanced - - SignalTimerElectronics - - LogProbeCartridge - - HoloprojectorField - - DeviceQuantumSpinInverter rareChance: 0.25 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml index f0dd4709034..b9def15132e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml @@ -42,18 +42,6 @@ - ClothingHeadCage - ClothingHeadHelmetKendoMen - ClothingHeadBandMerc - - ClothingHeadHatCowboyWhite - - ClothingHeadHatCowboyGrey - - ClothingHeadHatCowboyBrown - - ClothingHeadHatBrownFlatcap - - ClothingHeadHatGreyFlatcap - - ClothingHeadHatPartyRed - - ClothingHeadHatPartyYellow - - ClothingHeadHatPartyGreen - - ClothingHeadHatPartyBlue - - ClothingHeadHatWatermelon - - WaterDropletHat - - ClothingHeadHatRedRacoon rareChance: 0.03 prototypes: - ClothingHeadHatAnimalCat @@ -110,13 +98,5 @@ - ClothingHeadHatFlatBrown - ClothingHeadTinfoil - ClothingHeadHatStrawHat - - ClothingHeadHatCowboyBountyHunter - - ClothingHeadHatCowboyRed - - ClothingHeadHatCowboyBlack - - ClothingHeadHatGladiator - - ClothingHeadHatMagician - - ClothingHeadHatHetmanHat - - ClothingHeadHatTacticalMaidHeadband - - ClothingHeadHatPirateTricord chance: 0.5 offset: 0.2 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml index 61a99faa2f1..7785e5aaa82 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml @@ -36,5 +36,5 @@ - MatterBinStockPart - CrateMaterialSteel - CrateMaterialGlass - chance: 0.50 + chance: 0.45 offset: 0.0 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml index 0c3370890c8..9f183dcefbd 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml @@ -48,7 +48,6 @@ - PeaSeeds - PumpkinSeeds - CottonSeeds - - LilySeeds chance: 0.95 offset: 0.0 rarePrototypes: @@ -65,6 +64,4 @@ - LemoonSeeds - SteelcapSeeds - KoibeanSeeds - - SpacemansTrumpetSeeds - - LaughinPeaSeeds rareChance: 0.05 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml deleted file mode 100644 index e017096fa90..00000000000 --- a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml +++ /dev/null @@ -1,22 +0,0 @@ -- type: constructionGraph - id: ClothingShoeSlippersDuck - start: start - graph: - - node: start - edges: - - to: shoes - steps: - - tag: ToyRubberDuck - name: a rubber ducky - icon: - sprite: Objects/Fun/ducky.rsi - state: icon - doAfter: 1 - - tag: ToyRubberDuck - name: a rubber ducky - icon: - sprite: Objects/Fun/ducky.rsi - state: icon - doAfter: 1 - - node: shoes - entity: ClothingShoeSlippersDuck diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index f1eb270af73..4fe2c474bb4 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -85,14 +85,3 @@ description: Two huds joined by arms icon: { sprite: Clothing/Eyes/Hud/medsec.rsi, state: icon } objectType: Item - -- type: construction - name: ducky slippers - id: ClothingShoeSlippersDuck - graph: ClothingShoeSlippersDuck - startNode: start - targetNode: shoes - category: construction-category-clothing - description: Comfy, yet haunted by the ghosts of ducks you fed bread to as a child. - icon: { sprite: Clothing/Shoes/Misc/duck-slippers.rsi, state: icon } - objectType: Item diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml index 7608369b2ce..e5afdbd6def 100644 --- a/Resources/Prototypes/Recipes/Reactions/drinks.yml +++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml @@ -454,11 +454,11 @@ id: IrishCoffee reactants: Coffee: - amount: 1 + amount: 2 IrishCream: - amount: 1 + amount: 2 products: - IrishCoffee: 2 + IrishCoffee: 4 - type: reaction id: IrishCream diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 2f1a7f92d26..064b34adbaf 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -60,10 +60,3 @@ description: trait-frontal-lisp-desc components: - type: FrontalLisp - -- type: trait - id: Snoring - name: trait-snoring-name - description: trait-snoring-desc - components: - - type: Snoring diff --git a/Resources/Prototypes/Wires/layouts.yml b/Resources/Prototypes/Wires/layouts.yml index b30e68545df..338bf188ba0 100644 --- a/Resources/Prototypes/Wires/layouts.yml +++ b/Resources/Prototypes/Wires/layouts.yml @@ -15,26 +15,6 @@ - type: wireLayout parent: Airlock - id: AirlockService - -- type: wireLayout - parent: Airlock - id: AirlockCargo - -- type: wireLayout - parent: Airlock - id: AirlockEngineering - -- type: wireLayout - parent: Airlock - id: AirlockMedical - -- type: wireLayout - parent: Airlock - id: AirlockScience - -- type: wireLayout - parent: HighSec id: AirlockCommand - type: wireLayout diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index c6a0ab3f8fd..2694cbeaf39 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1190,9 +1190,6 @@ - type: Tag id: Torch -- type: Tag - id: ToyRubberDuck - - type: Tag id: ToySidearm diff --git a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml index 9e8697a9e13..a2a04e03ef0 100644 --- a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml +++ b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml @@ -1,18 +1,18 @@ - + # Thermo-electric Engine (TEG) - The TEG generates power by exchanging heat between hot and cold gases. On the station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to cool down circulated gases. + The TEG generates power by exchanging heat between hot and cold gases. On station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to make a cold side. - The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core and circulators; the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. + The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core, the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. ## Generator - The main generator itself is a machine made up of 3 major parts: the central generator and two "circulators", in this arrangement: + The main generator itself is a machine made up of multiple parts: the core generator and two "circulators", in this arrangement: - - - + + + The circulators take in either a hot or cold gas, and pass it through the machine to exchange heat. The gas then gets output on the other end of the circulator. The generator produces the actual power and outputs it over an HV wire. @@ -21,172 +21,19 @@ There is no preference for which side must be hot or cold, there need only be a difference in temperature between them. The gases in the two "loops" are never mixed, only energy is exchanged between them. The hot side will cool down, the cold side will heat up. - ## The Pipes - - There are 2 major pipenets to worry about here: The Hot Loop (where gas will be burnt for heat), and The Cold Loop (where circulated, heated waste gas will either be removed into space or cooled back down). Make sure that [bold]both pipenets do NOT mix[/bold], as only heat should be transferred between the two through the TEG. - - # The Hot Loop - - As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context, that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. - - As stated above, there are many different layouts one can follow to heat up (or cool down) gases; this part of the guide will cover 2 common methods one will often see for the hot loop when the TEG is setup: The Pipe Burn, and the Burn chamber. - - Side note: Plasma fires burn relatively cool compared to, for example, Tritium fires. It may be viable to extract Tritium from an extraction setup (using a 97/3 ratio of O2/Plasma) and react it with Oxygen to get truly hellish temperatures for power. Although, this is just a recommendation; I'm not ya mum. - - ## The Pipe Burn - - Also known as the naive method, this is generally discouraged when working for efficiency. However, if all you need is a smidge of power to run the station, and you don't feel like setting up the burn chamber, this method will do. - - TODO: Remove this section when atmos pipes are updated to have pressure/temperature limits in a future atmos refactor. - - Most (if not all) pipe burns follow this general layout: - - Gas input -> High-pressure pump -> Pipe segment (with heater) -> Low-pressure pump -> Circulator - - - - - - - - - - - - - The Gas input is pretty self-explanatory; this is where you will input the O2-Plasma mix to be burnt. A 2:1 (67/33) ratio of Oxygen to Plasma is recommended for the hottest burn. - - The High-pressure pump serves 2 purposes; first, it prevents the burn from backwashing into the supply pipe, which would be.. bad, for many reasons. Second, it maintains a positive pressure in the following pipe segment, which is important to allow the burn to continue, especially since hot gases expand. - - The Pipe segment is where the burn actually occurs; to start it off, one can use a heater to increase the temperature up to the ignition temperature of Plasma. Afterwards, the reaction should be self-sustaining, so long as the Pressure and Moles supplied remains high enough. Be warned; if you wish to remove the heater, it will carry some of this superheated gas with it, transferring it to the next pipenet you connect it to. Best to space the gas through a space vent, if you must. - - The Low-pressure pump (whose pressure should be [italics]slightly lower[/italics] than the input pump) prevents [italics]all[/italics] the gas from passing through the circulator, which could result in the loss of the Moles required to sustain a burn. - - The Circulator is where this generated heat will flow to the cold loop; afterwards, feel free to space the waste gases. - - Note: Pressure pumps are used here as, while they pump on pressure (not flow-rate, which is comparatively faster), they are a bit easier to control when it comes to the limited Plasma supply on-station. However, the steps shown can be followed with volumetric pumps too. - - ## The Burn Chamber - - The burn chamber is the preferred method for heating up gases, and it is commonly used for other purposes too. (see: Tritium production) - - Most (if not all) stations have the burn chamber separated from the main atmospherics block by a 1-wide spaced grid, presumably to prevent conduction. The chambers consist of 3(+1) important parts: - - The Air Injector/Passive Vent - - The Space Vent - - The Radiator Loop - - Most normal burn chambers don't come with Heat-Exchangers; instead, they have air scrubbers (and optionally, an air alarm) to help filter for Tritium, which is a highly reactive, hot-burning gas that can also be used to heat the TEG efficiently. - However, this is a slightly more advanced setup than just burning plasma, as it needs 2 burn chambers instead of 1 (one for tritium production, one for burning said tritium), so remove the scrubbers and retrofit the burn chamber with a parallel array of heat-exchangers instead. - - The air injector (or Passive Vent) injects air (or allows air to flow) into the burn chamber. Either should be supplemented with a pump before it, to keep pressures high. - There is a notable difference between the passive vent and the air injector; the air injector can only keep injecting air up to 9MPa, which can be reached very easily with a good burn. Ideally, switch out the air injector for a passive vent connected to a volume pump. - - The space vent (designated as a blast door to space on one side of the burn chamber) allows waste gases to be expelled and destroyed. Open this to keep the pressure under control. - - The radiator loop collects heat from the burnt gases and brings it to the TEG. To maximize efficiency, hook up the heat-exchangers [italics]in parallel to each other[/italics], with a pressure pump at max pressure after the array and a volumetric pump before the array. - The pressure of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. For example, having 2 heat-exchangers would mean you should set the pressure to 100 L/s. - Finally, fill the whole loop with (ideally) a high heat capacity gas, like Frezon or Plasma. (Yes, Frezon =/= Cold. Frezon has one of the highest heat capacities in the game; so long as it isn't reacting with Nitrogen, it can actually be heated and can store heat really well!) - - # The Cold Loop - - As with the Hot Loop, the Cold Loop must also be setup in order to operate the TEG. However, the Cold Loop is usually a lot more low-tech than the Hot Loop; in reality, the Cold Loop only has to be "relatively" cooler -- hey, room temperature is technically cooler than the surface of the sun, right? - - There are 3 main methods you will see used for the Cold Loop: The Water Cooler (see: Liltenhead's video on the TEG), the Coolant Array and the Freezer Loop. - - ## The Water Cooler + ## Burn Chamber - An equally naive method as the Pipe Burn, this simply involves taking some useless gas (in this case, Water Vapour) and flowing it through the TEG and into space. It's dirt-cheap and simple, at the cost of efficiency and permanant loss of gas. + As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. - Setting this up is so simple, even Hamlet could manage it. Just take an output of a gas (here, Water Vapour), send it through the Cold side of the TEG, and then vent it into space. - - - - - - - - - - - TODO: Remove this section when gas miners are removed in a future atmos refactor. + TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. ## Coolant Array - This is the default method for the Cold Loop you will see on a variety of stations. Being of moderate complexity and having no losses of any resource, this [italics]should[/italics] be the main method of cooling down the TEG. However, every station at the moment somehow has their heat exchangers hooked up wrong, reducing efficiency greatly. (Thanks a bunch, NT!) + A whole bunch of heat-exchanger piping in space. There's not much to say here: gas goes through and cools down. - To use heat-exchangers properly, they must be setup in [italics]parallel[/italics], not in series (like what you see on most stations). A gas pump at max pressure should be placed after, and a volumetric pump before the heat-exchangers. - The flow-rate of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. - - Simply speaking, the Coolant Array consists of 3 major parts: An input connector port, a few pumps and the heat-exchanger array out in space. It can be setup like so: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Connector Port: Use this to input a gas with high heat capacity; most of the time, Plasma or Frezon is used to do so, as they both have very high specific heat capacities (although most any gas will do). (Yes, Plasma =/= Hot. You can cool it down, and it acts as a really good heat exchange medium.) - - Input/Output Pumps: Used to make sure gas keeps flowing through both the Circulator and the Heat-Exchanger array. As the gas cools down and heats up (and as it flows through the Exchanger), pressure must be applied for it to keep flowing. - - Heat-Exchanger: Basically, just a bunch of heat-exchanger pipes in space. Not much to say, besides the fact that it cools down the gas inside it. Make sure the heat-exchangers are placed on lattice, not plating! Otherwise, the heat-exchange efficiency will be greatly reduced, as the heat-exchangers aren't directly exposed to space below them. - - ## The Freezer Loop + ## The Pipes - Most of the time, you will see this method being used in efficient TEG setups. It's basically just the Coolant array, but replacing the Heat-Exchangers with a freezer. Even though the freezer does use power, it is only a small fraction of what the TEG can generate, and it's better than the default Coolant array at the moment, so go fish. + TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. - Just follow the steps for the Coolant array, but use a freezer in place of the Heat-Exchangers. As so: - - - - - - - - - - - - - - - - - - - - Once again, use Plasma or Frezon in the loop for max efficiency (although most any gas will do). diff --git a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml index a377c980e55..b7ba3d4c8b4 100644 --- a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml +++ b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml @@ -14,7 +14,7 @@ A large portion of Xenoarchaeology gameplay revolves around the interpretation o - [color=#a4885c]Edges:[/color] the amount of nodes that are connected to the current node. Using this, you can calculate the total number of nodes as well as organize a map of their connections. -- [color=#a4885c]Current value:[/color] the amount of research points an artifact is currently worth. Extracting will set this to zero and traversing new nodes will increase it. +- [color=#a4885c]Unextracted value:[/color] the amount of research points an artifact will give when extracted. Extracting sets this to zero and traversing new nodes increases it. Reports are a helpful tool in manipulating an artifact, especially in the later stages where you are traversing nodes that have already been activated. diff --git a/Resources/Textures/Clothing/Ears/Headsets/base.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/base.rsi/icon.png index 76cf88f02e7da24dc4e0c870d0f97c23a378dec1..44e093f26ad03f1554ba2c82804912058ee2d74b 100644 GIT binary patch delta 282 zcmV+#0pB!B!#L_t(|ob8l7io-AvM!#%2gIozT7f4vL2^iGn7Os32pTHN$ zjRs88smL~)PL~50j)JYH!EnZ0RX8G(+OB>A*Do;B#=_VT8nen^%i(~kC%&u|5~rF=kMbYKc~}O zyi)4AmTlV(@=@JEL_W`R|7ib}QvO!r8G>dY6#{i#|M~W#RDR2&3PUR&RH9Gvm)kY^ gz(pdF$W&Yae-qKP6n_}ZAjqfBaOluhu$-iX zB#0u*5md3W+k0tX%N*+gApVWeiB60pf$iVHOjcE=YC&)ZqW1YzK7&+)>Y8 zJSRCpk`)3lN8k`A36Nb7QIhqj;s9!aQ3s4VVAKHv?f?L_T728mW+AZv00001voPmKM zQAYJLkm4x`@(cct01QI+&z%E`a~60+7BevL9R^{>JPl&6RcZ9f@RAy%7ocSy3GfOt5R29e05fPQr*4AtF3A>w_tgCBm zVQ!Zc5b0y-E3cr&z`)R{tneO436=!;1^-6_4618qCIKZm3p^r=85sDEfH31!Z9ZwB zV5_H#V~B~+I)TxIG^i9L3_v-{Zr2-X>E~x;dy!b zgqnWNhKMhkb3O}Z=qTO!W6Lbj^mVuId!-j9o4&qbUo$u1%5Uzu|7_&yI^B5dflgxZ MboFyt=akR{06h$KCjbBd diff --git a/Resources/Textures/Clothing/Ears/Headsets/base_syndicate.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/base_syndicate.rsi/meta.json index 687531cde51..774e33fbe70 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/base_syndicate.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/base_syndicate.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Edited by Flareguy for Space Station 14. Originally from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Edited by Flareguy for Space Station 14. Originally from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/icon.png index fa790f7e9908db0be117835f39c7dcf37e749983..671111e4bc651c86eee58143c75981fba5a05cea 100644 GIT binary patch delta 300 zcmV+{0n`4H1I7Z7BYy!6Nkl}HVG^<>yGDV{+>LgGJN8~_7p9lIII%E}nL zql+lDmpli2`}U1t&6+g~-@bht7zfY-3@r!bx(YH}xpIXe*MC)zfq{X6fsdD$Vh6Ag ztMKIELktokTnt=XKN%!MxEM|zKE&|p^Jj`3Ky*G5)%LGqjdh`%Kzfx;{TByK@1=%4e;^uGR)Zf8gJaw#OKHW ymk&wxIaM7&i6!M^2N%r~+$b0YqhJ)!3jhFIX;GoKhVf|t0000VQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0Lb#b0%17+)TuWND~=ibr^FFNI{;?6yom{t=oz2` z-ZD@ENREP@Wu{=dBPfYztOm+*Kwf|qgeqrF|=3xNQ#DomViSR4S zD+U!M6^7?8UvV%zd~gfJa!GLshLntKFu$U#kSO!W$^~D)ePsYy1_bcX0P#WMFpG&z z7bH6XYVdzhwu3qX?x^Q4o|Bv)$qE6OBXEe51jsIkD9L(MaR9Zzr~^hFFzSE-cK`sL Wa(=4DC}uVQ00009;h!d-uLy-@Cg4ks?Ly9I;c5Qb^OFim@-`q9d}S5*`y z3IYJ2)9s>BDSy~=C)bY<1;JM(JS*TPtNc#$%e!an9~`4mDZnsIUwKvru*_c`u59yC zsf5$>TL3_#QUD>uvlXELtQJh^7?e^}t5r}+1LX(>005uwZwq5nI^G-rN%5f|LIboq zBajr2VlDwq(@@MM0!rFZ6mn&tvErAW4$F zll%St()f%lv$LaJsOcnHoe`cseggj!JRzJQ%R~ra_ZNrE&(U+rH>D&=Y)=%IewlUk rejA2sl|lpjHFIjM<&G37(x&wb&nUgko0fn-00000NkvXXu0mjfMLO2r delta 336 zcmZo+dB-$CvYwfNfx%@-*D)Z)SRCZ;#IWw1%u67LCEd~2k%3`jKlh(RRv=$Dz$e62 zSJzlxLCwP4&dW1UL{v&%(BRCf^0kf5p1!&Dv4$ZbAuCp_C@O21Gk+ye$IjaiL5A~} z1o;L3M*$31?#x&Sl;SM#n5ZsT&#>Op#WBRf|Ln!re1{b{SQ7#+Y`t6a|M=aDH$~sP zeO@+6&9r8t$cj5p_!$MiZ#R_-;7AnUyYj1|mEBN?{}5B3pm+>(l3?K>hSZV;U2bb` zG^jE7RSLu}c*#7=f-Q1}>ilLMewR-rjL()beqYX~^O^U>d<(|lV?6=x{LA(=s=2MW zc3!K0x=MVf0wHk3|Jf)u#;oa z)`$qci>2@3W9)lea}OX~VO}8k0NF}dF@=a@rD&mS-0Z?}`MN+R^Gz}tAQFlEcRD_s ziHJqFi*mn*wbm=PHblfK2df;6jbb9=5a%XUllNB^0KoYeOMeB}?><6ER1&zt`50Pj zY*diq{RNzJ=wJfp9F*4W3pBys5;#r`hNAcJBBmHUY>y_MqUj6jpYRmbajoD;+W(W)aJ}z2~;aRyJ9Pl;w=gC3;vG; z7;IlCwE-nK3p^r=85sDEFfi2f9bufR%_j{Mt?_hm46*Qkdm&n=L4kucU`LwN&i`NA z`lU9kG`sLO;Ns&G9#56+UlcZ&Bv&5I6EHU54i;_~m=-RuxXCj@;QEmTZ;r|;^zS-u zJ8@CdOI~iXG_m?O4PCx*2Y&`SwN)})4BYVEU%}aBLhgLN5Jp@1&~Em%-7jU%&5-}x cJS&K=d96{up_7o5U@^g~Ey6jJ3u$f0C8@gPw}eaXzVDas zyGwwQl9GQ$$-1Cnnj8Qssv6yU9*r``$tBRVEFK?!u2!h1YJYUiBO<+^VVYbd8&4)m zl8|_IPyvxBDM8b+c)S`}BvL1K9EY>z5_8|*>N~LAdm#ZJlfY5hg#KWl99OG9lIxm= zj^jivnEO70FhmfB(MFXa_wH?47S}Zm05F}+P=9biZ5seU?q8v6np7oHE0BaJzeo-M ztu9B`2Haj9L4O!Z#mOzOo18zkKqLdz@))?qet*gz&Em4**bG-C=z*1OTx9 zIb7FGjh{NfFpQ|ip6BhI-!M)7b~=s5XN$|s|AbVDxIf4~2qC=IR=CX3iz97m7zRJl w^}TNO>_%)r10RLFOPajG_-G*HI|PZ!4!3;(khU-LB^ zaIhw1I9iv!{=NUL-)^gg_v-T04L3gYc3n_2*`CGa&b@0D4vH;)76GsRipm}FxWmb9 z;TBWC+u?eIlX=R;MlGq0Nz7IZ9}LPKahLpP(CRy=amHv~vkJe_FWj7tCj diff --git a/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/meta.json index 84f02032366..1e84b43d94d 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon.png index 9023333660826fa40f4c0b68a142dc4e12b17aa6..30e1697c3ce082b64e96a81d29505423503e98e7 100644 GIT binary patch delta 299 zcmV+`0o4AC1H}T6BYy!5Nkl1Ka)7S2 zH-koDA%m{9HvK=4 z)-4qM;^N})Z29u#OX`;q5)u;sJwlRj=6`W<@&Cw2Ke~+7|tKwiZ||Q;&Wtx x%ZH@;oT`qX#3XXEgNx<~ZWN4yQ7{VV1pxH%RrLglhgbjr002ovPDHLkV1gqYlHC9R delta 370 zcmV-&0ge8}0*nKYBYyx1a7bBm000ie000ie0hKEb8vpVQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0LXHWoLo5n_St(3496M%Q{o7s9RRaj#zGNA{O)lE ziU7$`VAh`xrcV`4go}xYO8tNH`WacFK#~K3j!$4PsZeF8kAJ_-@cYDlNE85pq=Y1h zBFhm}$pze8++arl9YC^Pk{qzkvVdW8`~(JHO&}Xd{LZ~Q4CDfm8~_S()uaLx%RzwL z_$SE$;H(DBatsXK4AcZ9g#f}4Xkt(xub}q->(?&~+}u12AexwvAvqC#WqHM*qNKv` z{N)RVhYxO{SZgjRF2RtJkqzcolob+X9$C5I>$k5AAj^ON9vUD%NE~J{vFUN5CER{Ka#U6C_z70CNNmagqSp1ra4#k17tJ78rHFr~^hFFyIaV01k3`k;tpE Qi~s-t07*qoM6N<$f>a=vmjD0& diff --git a/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon_alt.png index 51a87cef7994958a1e61f7f23301d9c5201d84ef..a01e0c6c13e9e939597ff9f756a3fcaa3073a6d2 100644 GIT binary patch delta 479 zcmV<50U-Xs1o#7xBYy$ENklf+?$q%IC31;IZ-S{%A`?ocTXZLyB6ElLweD-O@0T&UWbOQX2tTaLTj-TQLy z-2ovXA^(ixcR|!J2mq#3)g8MpmwoRumO#ujX|UgWd&88fx_|9BBGL<@hCw1&rCL=+ z35jpNDj))l3J^0*8axd@5}p&2i3B;_E}q-%Pk9GE=Uzwv@Fg(eHQ_FwSEeJ8Z^3m< zLo$(YQ}Enw!?JByw(S%li`D=Wk~ zr~UIQN?%-4JbxZ15D~Ij;+#vJf@cbTqE@eC`|ub5P`Erru~N-2x5{ z`mGNF2~?_8#j=JZ}D6A|=ODoFO zj<#=bY$d~)RrBH(mf4*-d_QmA+j(O~kJSh00~iJf2B)huet(q9$lhI<{uO}C6^p{& zYh%?YgfxKOoTOG%v?D`1;B*eN@gaB5Qed~);2rlF+65^9G8y%ZvG>>47j!~~i;%XS zqF2>V_HaPiT@VKF4ozuQUulf|-2w#`*gXT#)rAy<5CEA+Qd`(ti`M5T`ba8?-03Zj zceVkK${^e$E`KSAmH^!RFL^=}m`AJuLPo+Vphzj#`KJQ=rgxenfOaGVKt_kjIA%iO zhIyI`BZ2F)o9+VWwf=R2!1g3oHeA2fs4lt=K;{>*OJLB2PDmPnMcyHEVF1c;IGSKN z*Nf)#`KKdUwmY^2$iAJMkcM^$E!H92E;nYESL^1P^nVdl^D|JkqAMpMhsdP0_Uo{+ zf1UmJ`gKjEBBUi;1Kh;x@Ue>s9ly=Co7y$+kRs`jE<)CPDnBQlz5(&O!ra0V0)9Ud zn{l*~G(f5NNM=>40}jEjXY@^Q2m8BF6tQ|R)Q+1$kjOk=$g_3PdN6z+;1CpP9Y9M@ qZC+SyT_MY5BJB!5C)5Y%Ilwm%yYQoVR*XFW0000)Yu~@d^1_r`e2H1rglmGw#07*qoM6N<$ Ef-{zO?EnA( delta 378 zcmV-=0fqjW0+j=hB!3BTNLh0L01m_e01m_fl`9S#0003;Nkl0)rX8-T4EK0tNS%Wi?Qio5Ap$ftrA%5P&%XT@1#SS5W)^_3IY~Zf+h15KTBo4Ef z*mOa%1E2=~2W2~`BjApD{^B{w36iW3fH?w(I7xu)f{2o=M->N93yeBo)B&Ro7;pyw Y09Yn{%O~)p!vFvP07*qoM6N<$f~V4+{Qv*} diff --git a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/icon_alt.png index 98259eb0700d261983bb1064ac563b845e8e7af4..f1559927e0c2fbfda565987acf5bcf246f14b74e 100644 GIT binary patch delta 475 zcmV<10VMwJ0_p>h8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00EpyL_t(o zh3%9vPr^VH$N$JsC}~Yd%pD(~Obr7}h;it^#J4aZeijEE^&>Da>f*rQ%w#%&k;w?y zMH-47$aBD6K*9DX=+ghv^zPmLfA`+I0}>@l^v_DkE+`rX0e?V7QN-AzZAU_fwmIg1Man1V)<-N~TH6*^q$<4Xj%hd9xYDjivp>vrO+($XL%=*y%d=zY`yZK-F-C{FzV>9n)B8S|Y|K(@fbV9@+WV86C{dz)>JuxN!21^- R>ka?_002ovPDHLkV1ks9*^~eP delta 336 zcmaFG{ElgYWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hQfKQ04 zuCB4Xf|`Z7otI~zh^UmjpuyYw36FQXdHUvVFVda#@cW7tD~ie*=FDFS)M01)Zx@i_ zFA4Gs{*M9}uH2ci5Gci2;4x8Mu%2PPr;B5Vh5y-$ulWuuaIhu>T-bWI=Kt}#7jKHb zdHcLDyz<1?WMJv0Z5dR^jK0)yq<|M(wLky`U3%cCa z+-Oi^@T(MvU+|K7mIYhn4AuF~I{Yr5N*JFlW&FOJPvQbcRxoK#ty?AOaM13?wep1N_nU+6 YRo~TDe>w4bJkSpep00i_>zopr0Oin(B>(^b diff --git a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json index 84f02032366..1e84b43d94d 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon.png index fa790f7e9908db0be117835f39c7dcf37e749983..0ff3f2c989362d67e30f45835f939895d8ce6e62 100644 GIT binary patch delta 777 zcmV+k1NQuq1D^(vBYy#IX+uL$X=7sm04R}lk-JO7P!z_0ZG99UDCi*K&_TsPK@`MM zD(F%j+6q=(l9;qYTSJl};wrc}2o9o)ufhL7SHV?55EMbg&E3}`63=Z4710}R&X4cj z?{M-3!il_5aBIe(Q1qPSWIQ&TnTypw(?BD2v=Y?}*PcpEq<{H$ecTdK^=3fz`v2aa zt8vkE4G2YrM-1EXgk>5ME1s=*Q@Gv8X^X-K!u^g6D151OJ>VzB*?`{^JL%*&gjLU2 z_6O@f*vL5r;XdK+LcU~F=22hLWEN*qQafdL;gV#MI5BieERn}!Kx$Dk``b5I_D!=a z9z)(Xt2pAwl7AC#zo;eYYD%?4H|5E*s&fCGr)v!l1>KwCQ2XfnuRTz|4PRTn|9R;9 zUq=vmfb(M2zbrY8zKgz9)w=hgWgSj0s+zt7XB*IQZ)=WLmLjslmIW^-(42v`YiO7c zvZ|bOde+{CvC&A3uF&c=6%|NqR}K2di3jMd|+s zI?Vr{Y`6OV^ZbN#1Mv=kTF1o5 z3T81gP$vx%?Esi}S^jBIeT~7$ zM2CT!i;Kb3M33Rv*^3OHK7AtFVwgsvBT`LG?SFr^?sIU!|6=^lF!!<~!}XiDQS^(8 zi^H?V%a<=v|>}zz}$2I0000VQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0Lb#b0%17+)TuWND~=ibr^FFNI{;?6yom{t=oz2` z-ZD@ENREP@Wu{=dBPfYztOm+*Kwf|qgeqrF|=3xNQ#DomViSR4S zD+U!M6^7?8UvV%zd~gfJa!GLshLntKFu$U#kSO!W$^~D)ePsYy1_bcX0P#WMFpG&z z7bH6XYVdzhwu3qX?x^Q4o|Bv)$qE6OBXEe51jsIkD9L(MaR9Zzr~^hFFzSE-cK`sL Wa(=4DC}uVQ0000(VDLS diff --git a/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon_alt.png index d943c6341894bbb5e80d5364580876e348130608..d3be4bc4972bb24a3d83d698ce2839f951ffa86d 100644 GIT binary patch delta 980 zcmV;_11tRQ0^bLa8Gi-<0047(dh`GQ0d8qSLr`gBV*mgsk#&(hOT$nUh97ISVigA+ zL>xL)aZnKjag++Ws6$)9uO*31E2J?bEmB+s7YD&Xbn$EOALuH$DhPrih`71?wTQ%X zn?gnOhMV*7-uoU--au&5GV)${6!Lb#O->|Yvvc#Y$TN*ZsedO-zh-#ORBAlUzw6_c z8dY!lRImT<{kft`8P9;42H|1DaSOsS4U?+{NAad`n~~F&gb##!T^UgLQt5iYPl~ev zzbSUp$uS72p0Vr?)_<^(bMwMI!tuOSG%E9`FKNoyGbyPZvODoeGC_hEIz^VTD9|U> zmdyV44U~P;tbd5dkhen#R~%V#;_Vf+C|xsBP0=&*Sd>)mzw`9Wp~0YgQv&K9egCx! zBHQq_<@=w9zW;RuwGVJ^SN$uJ)5yE%TU9N-4=w9(dQsK%9XQ*7_IpQjwX#$zJ7k*h zasthB(0UDx3qe+ubB^yIy(Yit3U>FPTkf|kegpOfXnzHIGe))m000SaNLh0L01FZT z01FZU(%pXi0006PNklkcjm+6F}|#GItin2kon2K!Ja(fT$L~r@PytoQ6oGoVtH-P<0(nt}3yww^xF5^468>^l`vC1(;e zUyTZNlu)VtOr=C)H0l74H8p|AaV`-o-Q38J4}U8ADp_9zypn0fM1tDyY!=^>T^RWE zS&myLmO(xpC43c-6bgosE5Ge+7uFrM0txG$gdM&FNe-N$(%ni(9zxo(=>6lH7D)v&JRSakWLBI zq<;V*M1(;8G$+AY9>b^)2{hQ?x`(S~0>*jK277_C#EarIdV1|kW)*%l6ClXEO=4-} z0fV#aSR67dz&Twt5uj_fu-ypDW|1{6aQWPfs0iUKcZRW*V;F|vyA!?v@p!y^k_&}` zYdk$X^B)SJKnnP>7uR|NoO*c75DArtTTK{Uxv%3fOXupT`K~Kc1GrBFnqx87mGRSi zT`Iv#C9dLRPF;QB>A2XZ}i{j-9t3f(+*` z3Gxg6j{+F3+?lZuD8*UeQ6E{%z`%C|gc+x5^GO3m*L%7+hFJKYz4)5%umT5bLcoQs zcWeG1zkBhf=$p6C%Ok#$@~MRJ*;2;u%lX1}KJ&hqZ^0OR ztS7*of7!l9wH4RSt9J&j%CcW;$Z-0_>21=*4l6jh&R;joX!A9J zuCX|1d3dCRrqTp@S=554P4iP#ohJ<#$=3IPZ6FW`d^%rqikVsC!vX!}g0^jE^)7~) zwP~91F|)oTJV_EAhG8{{?>WU;mf?8*MVh8dbDtCN-lM82czo|)Bd`VUC19<^-{}X| zS^z*C$NLF5=U|LM6h$z`z&VG$?-vU^d`v_{^E@B_Wm%%G>zjTe8rQPxy7dngGiy;4 zllxCZdM&X!BBDg3A~GqkS@^w>UBairmV`e&D4P#lAP@-b#Xm6GU!qP=N>~5@002ov JPDHLkV1m(#b}|3} delta 365 zcmV-z0h0co0*C{UB!3BTNLh0L01m_e01m_fl`9S#0003xNkl7o?(cJei;0U#{eSuD8Cjt~k^^SXdBI@S=FPAuFqq-mHGc_k6o7!SsU5@F(}&1% z1XXf@yqqGK-nMlG$$Ck0Kx&EvLpjj*Dw;_s;_KEfWFQxih*8BhF^&18eQ4t0ZO-#s;oCtrgzG4Upj%PS@Xe-0j ztCvtLx3lwRFlIJ00Q0NM3yCt1tX%N$(R~JxWk3KA4GL(=$bEbnVR&x{wy$;tU=3c4Gr zmPG(iDi+n)$7G^?&P4(>+ot{ZuiXx%Vo^OW5lOwFYFQKq^M9t(!a1RM?y3TDpmPCg zwoUul(2+=7*lx8bj3O*otAn}&hqaF-0B8x^B`tUz4hxlX`6#$)7-+Xzsszi`3Y+Z~ zo9$LLY8o!?-kNQbX&3;2&)E#)@mS5(>vfohq1_MKJTw}_IVUM4Nh!&39Ezfdq?E)t zPo0H};hdA_d4DSS^V^yn$5BFQBocezH{ucmL4Ys}F&d2!hN0FOnFIh}Fc=(-1wrt4 z0z!yP5}5^j--i$auIu9cYHe*e060Aq~yMNYvvr*5~a{Wbrmwq%Uay=k8OviRyut%+>&qQ6VQ*LWGm7D0000VTo; z0C_=!{~-F|`wNT%;s8-aDF#t#Wrl~FFHp;V(j4&m{xb$@gQ1lM2HXL#G{A6f02~0y z0iZMh!m!)`0+i+mq8wmi^UzOtlGR876k?~T)QR# zjsg%cHnn3od-@Prj-X05l$TQk)7!SLAXzU-4oFRrU?>OrUPUtrMSR`bg$(2Zk{kdE z^3L8W3~_SfpMN9=fU+7W%hmQ(GEftc6ap|upo_uS+S+>m-@JaqAR;Ql0HTQr8Ilv> z57t)^3I0kx?hJi%FP z?a2#{^?eNtrf2ZgByA01#o9q!xNxEey|!!E&;7|x{!h#-kVqu{I~PM96OkyT;JruN zwu5H-xEfNvSv31_4LspSrjWQCTE3Mf?pA`$q5%;}6oGHHvVX+G%Pa18w_|(H69^%o zsw#vK;tPCy%E>&tz~ftUGS4mm0M=T(Kd)h}1pp|e;t4qCV2nYQWiZCTIS23kXn{Z9 zF*8e^=Z9RDCF;69n%7z%7NhIBNj|D0h)9Z}kiPrZTFXy~$zf*ES_?Dx3d~miTS=7i ozOpgpXD`a^3mcb6BoeXs0x@t}GjErB1ONa407*qoM6N<$f{v_)_W%F@ delta 393 zcmV;40e1ep0-^(uBYyx1a7bBm000ie000ie0hKEb8vpvHul4>cW2iy=LN|7Z{ZLE%~lh-VgcOy4>-R#`sM5P zp9MgxcCvjYkAE)@k)>D_P!K;o^<11TOCdgBS)-scNoCkWC~{A5OD=+L2W`LcEx9vk z!`s-5;)A`dME7ZJf%p`lWTE0}P)xo`oOCYO0KJPPtz8cyh6*|XdmyzcpdkM6S>ucb1jw2+SqM1{G#knKWBq~Y$6a%G@AK}xy8;z4 zD72J9OBJ>McHD&HBMs-qUQzMm1%wb_jQyWL(NqFEX(khq(tkO}-1p&m-c~6BQc5t! zKtyUd=!DLzR4WCDK)f&i9fAqawU1m501a%r@U1}8Z= z38=0?(-xq*hHI%a!QA&V3nZ>_v(Zo&hd)21uTMNYFYq#(t*jS9gx69^nScKfk-ELy zSL^P-5JD|WBq3E3>YU?l{2E#NLNZ@wU505h&s8Ez@QshF@P@0XsHiB5ZxOg<)UVlL Qz5oCK07*qoM6N<$g7S;1RR910 delta 444 zcmV;t0YmVTo; z0C_=!{~-F|`wNT%;s8-aDF#t#Wrl~FFHp;V(j4&m{xb$@gQ1lM2HXL#G{A6f02~0y z0iZMh!m!)`0+i+mq8wmi20S&o5W9|JW3Ng;r61gaQ}Ew7;V z|LfN;4BXs23?Q1AkRdq{er0*ZprWM0@ciWqhKCPsp;#^{F2RtJkqzcolob+X9$C5I z>$k5AAj^ON9vUD%NE~J{vFUN5CER{58dMk`p9ZApmm(4sntI*#!|L mS&u3XpcWW)z^DU89RL7+LYE1kW>c;J0000R7XW`#M776bQn-e~{QGVWV e7K_EQ6nDZmQxRY1InSElpxFf9#ih`af`IAdyJ?ckZSbX36vX zoa?$q+qM_;TI=&-48yRiBdjRHmCgN iMOl5}5{X1278NIywOTV4Lxu|g0000t|$z0!a=y#&n*+s?D2WQGZ}C!!30~a1?-mq=Y1h zBFhm}$pze8++arl9YC^Pk{n?5&k*c;70o0DhJOh0JNND|kPAq104T`g)F-1@4g%!H zKS>S%Wi?QiV=(Mype7(G1mKQ96N9nk71aKJ{rZK0o12FLL=zJ-BqzeJEUy?;lvEg= zzkI>)@WCw<%W5UXB^XjNvcdd{vO=QFBP$nt{q~gsWEl{^Lj%MIiNh==HeHbH0I0$L zLD>%K2)Lu3zj#h^f+Q;hV2;2cP7)xyAfhDeQN;n&0;3KXb-<_t2HXJvQigqU&FZ8y P00000NkvXXu0mjfY~7m2 diff --git a/Resources/Textures/Clothing/Ears/Headsets/science.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/science.rsi/icon_alt.png index c935e5a13b7f8be499b366732f8364b81b156f69..c86c128c245c261460adbc2a919580c5a1a36759 100644 GIT binary patch delta 464 zcmV;>0WbdP0`dcp83+ad0047(di0Tw7k>eyNkl#H4*dX(rc*I=srDtLiI7kmhjY3MwI#eYy6`N7 zyZ_zuW3S_J=6!MjGz^1A@4vQNR78%pnj#EC*tU%@ z3^VOf2mk=S?;iHXX6w{vus8rAq!2`50M~Uv2!Ul;==FNAEGyIcLI4xT5&Hc;hma(R zC-Ss8$6~Qad<_!|R8{3!E|<%L^>tmRx2+ZkA#hz6&% z^`c5msj4bHRg{BI#y-8Dz8{-XVSwLeQ5`kzQl(1$wSE9vn7)JLv0%CY0000RJo2OT9xiv>M=As0Ku zr7v(cs7oIafANLUSB6C)#?o>>Yu>v}m>9q?K@KZ`A31OKFVdQ&MBb@0KzAXEdT%j diff --git a/Resources/Textures/Clothing/Ears/Headsets/science.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/science.rsi/meta.json index 50f9fe3394b..1e84b43d94d 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/science.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/science.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/security.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/security.rsi/icon.png index 195117997db22a6b1c73cab9c4749c2bb21e1da8..cced512164758d3551c213d943a0c03ba3395d0f 100644 GIT binary patch delta 255 zcmVui$OO8+rgeK()JB zmAa-wQFO2v|DZI_k^~ao=gS{pu~_~c$7C`QX^$~9ZHv0Djn>X_F$oXD5WbX1k_1Gg zPZQ|F0YE8*D2jHISiA#$c%C~*({yX@I)Se10O!+YS$4j_5qSKTfDi)r+Y3Sn0D#BX zxdH&-y6(_#+IF+R;?Lw71lpH!7(c5DkFuPs=bR7EQYp2|M>T delta 381 zcmV-@0fPRU0+<7kB!3BTNLh0L01m_e01m_fl`9S#0003>Nklt+19Tw>f(u2T!H3X=g6P7X52Ho=0jEXBl^HA)VsF|^?LwHF z4DBXoleu?D&NnwVnF3}k58wejfCpd$ECn_7H~##1pPL#0nSb9d?&#;!(vL|i7l_ON z#(a5u7++!@2R#8iwc#T67VN$br(Cb}C*W+Wzydfb7I1eZ&}=;7Eh*!x6zhCg4Qa4~ z$mJA>qRPOwI!+#G5+4 z5fSnbs{$zmNp_BN=Kbp0mXh)tLM(vBES0fp!um#Cm;dGYVZuDDRMFbo*YU~mVWzdL z0AwOTW&@?yGR2fP###G<4KP|*(Xksrq)<^OVmG8!1q{SLd6uj%BGt5vZpBW&I!4>Z+{hViOwY$g`v$?ql!df z;N5g;w`t1jW^>ecIPSfZ04fP|iUR)L-+R5QtN)VwLU1>oW-WN#Y)FhDF(x~xWvG36 zM`37vApm$@F40&*!XGtHS*Y1EiGMNnWqlC*ub}VE^3Q0MO}l zc!}f6|Aaz`yvQk(QdVni%e;DdN?S@P?X~Zpd@}dxeJ4wjvsG#=@Ncp_-&*dLmX@F9 Y1IM`6pHRCt{2mcL5^VHn3B zNie!p^1u|%bV)K4gvN%3XeelCXt$}qp`jrf+S_U=8g*}TYm{Bh5=%+tv;^roqrA#3whhW0-$kWNg&U| zwQm%H8$fRyrF0cABSR7Jcto<6$}c1ZE~gWMp|GJSZ~>r^fV4)QTP+!;A;U$8p-1l( z<%9evAa4|y0fH-Wwd%WLJ@@f?f#2tbYhrGLN%z&&_JAb7-_0`wGfU8z;cJ3iwc0+ns+X0R%H#{G;f1P1nSPp>dowZGQZ3^J#X*!0v0MOf%7$rH^3-|Pq zz?RHA9VY@5-!ir&HX+%qL15##{uDLi$*(pjcJ(vtEPsO~osdE#Yiie%23;?auaBJL z+H3%~m}`I<3A)2%9J{22vEjyXO(!HvI=G9F44>{#$I}lWdRN%nKZMOl1THVmC;lHd zK(q0R#`^jJM6YM~j&Kimw;%{?^h2m1I!%Y8)Jd0eyhJPp{Ih7?(l@7!Ts<_MrD3c>_0F(=G z6U23L0=8MYsgf;;a7t4kMNoh+d2F%%BugG?tog<-z~k}!cP1{$L}WuDaIR~VW$CoG zGel&WxgA7g|D<>v$F^yj-Xx|j$!VHmvp*n7lCE_>6EMbL`+r-)7&E>=p64&)!3Cly zx=nWL$9OCO0MJ@varuJQ8UPRqF`fW3LrRGt2q2{dGvi#>odw?hOy;whU9MJb{Czy) z=X82luas(^WmQ%Ee^f+dvn+f1{*_YpUg8~`?m#F6ilTUV_JeeO&$A9)JMUGZOYx7l iYw!!_@pwFAaTNvIA7Z2|dw$jc0000;U>K17H9QfB|3wxOQ3m^!=z=_x(r2PBVGj=z3 zL@yAT0c7!oN*Q^IJ%aVM+tluzEUMV>NKt&ehgw}=0h}EMnAl&zO?4S}o|BG%RB}pW zv>>#vV5x8kcs|_ZZ4X%~L;}Fh!veUdH&Ce_V{Wzv4-FM>Jv~5IybfIZ@DAp?ij#Eb z&jO%RbI&1sEe!Db^4L{;wCG^9 zR!{xyt&L3iw5}lfib2H^scw)@aalO)Ua$c=i3Ocq2SP!$gEo61wK^an{)n@r{SozY mdbt4PB?Djp3_#xjz5#i+fJ79`{QCd^002ovPDHLkU;%>a!mXeH diff --git a/Resources/Textures/Clothing/Ears/Headsets/service.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/service.rsi/meta.json index 9c2f13fda0b..df6ee47d086 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/service.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/service.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/servicesecurity.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/servicesecurity.rsi/icon.png index 87d994febb8eb12e10c6ab112d6dde73e9de1b1b..0b1f751416654df08f1a601633bc0a7b0a355984 100644 GIT binary patch delta 267 zcmV+m0rdW&1EvCyB!BHmL_t(|ob8l74}vfdhF=^>%G9Jcv1v3q(UCs^zl49u=BA5o zH^B-K#=01y1BA+lgME^wx#XIAu3vz|;rMqvn`9y~fe@(b8bwi9t(^=J8D{PV5t*M9 zkD|!5Z9AL9#wIyQ5}eN-;y9jK_d9{6X#npvuPu;e*E z8UPRov7P`kLrMwX_aUVOGoz~O$pWK4lihY}j;B)>UoRKj?)Q)NN~!KymSs8rM@2*? zP1D}@uaq+H5@WEs1A!38^L+5^7wP<+z7B0WpH*T?@vpaQ@eAj0I2>#71p4-0q*qZX RE&u=k07*qoL;U>K17H9QfB|3wxOQ3m^!=z=_x(r2PBVGj=z3 zL@yAT0c7!oN*Q^IJ%aVM+tluzEUMV>NKt&ehgw}=0h}EMnAl&zO?4S}o|BG%RB}pW zv>>#vV5x8kcs|_ZZ4X%~L;}Fh!veUdH&Ce_V{Wzv4-FM>Jv~5IybfIZ@DAp?ij#Eb z&jO%RbI&1sEe!Db^4L{;wCG^9 zR!{xyt&L3iw5}lfib2H^scw)@aalO)Ua$c=i3Ocq2SP!$gEo61wK^an{)n@r{SozY mdbt4PB?Djp3_#xjz5#i+fJ79`{QCd^002ovPDHLkU;%>Ax~-1@ diff --git a/Resources/Textures/Clothing/Ears/Headsets/servicesecurity.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/servicesecurity.rsi/meta.json index 62fac00b4eb..dd2fdcc360a 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/servicesecurity.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/servicesecurity.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/syndicate.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/syndicate.rsi/icon_alt.png index 892f6d12f0e391ba8a708a1639f624d60de62ad1..f7cddb85c006bad87732439467c85c78cf62e1b3 100644 GIT binary patch delta 460 zcmV;-0WMGyU5N}J@pAMYh8P*G9w$5=%dG#d>G z0H?OCzdbG%h2xYGXuGb=zJDYMPHkI1%ZL~+Xf_&BC3{*ft$#y8YV1b^RH8!(+O8|J z)hHs7JF(a8%J(?Ndb8Q-JFwe(B>|w2KrL^={lkNGes=aPxkCtg-L7uIdb2?oMF^uv zZ&VXX@7}iSN{0{tz_agzbFRl`vl$#hj4F{^fkUYBKl?s9oettS)?=J=gi&M^r?fye zxgw5Z3`Qd@!G9RbZN*Un4k1X>6lt0Q0B&w?F&+*J#W+d;0Fv#_A9x z5ah-`$(uka)jN5$T73%`1cBucA}{N82qBOp30_}bj75?gLn)P6k$o`6BR{fNNVWLb*-f-5R2{uQ5fOvV4I5VPU{00000I&vVHg_Y8AAR02$okp_&-?uzWg+V#MCjpt7=H32fTmH<23TIH za@D7K?p9n<>cR*@3joIV_YSCi+fLTteWTuBpw4|KfpAwVMi65G#P}$oAia20Axxy5 z0(gpC2d`az$A27avLkGz1t4K|oCUg?tMOWkd|re10+k!UU$wsd)OFNF?f@{3D2#&0 z9Y9i$m9zkmV{gmjoS%d@$vW25{NqSA?T%vs-rrv0pH(9jLbjW_BOsgBtQ7%)P>o~$ z`#VN5mUaz@k$5X|I|fLa$7t8mA$1~RT!h?w;zlGVo@3g8nX|KM5h52X@ebpCp@BY?F y7w^xTCu(n6=qDVID!sz*$hw}A@!`Oc`yTz+vR@9N{n zE*^&rKbI-pQF$g3n4qU=WUkEKs%MLD#Z zZk_o0`oia5kLkHKS_HqDeqhys2_MZT2w$kTPmxIHy1kW`;j4=Agpkx^x%5@WZ}UID zjAQ(8i~ZJ${@{7Z^|qVerL6bcJLT7dS=>zue^~vm@kOwi|M*%B^e}^`tDnm{r-UW| DT{(Is diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png deleted file mode 100644 index 5a37ace23e68bc693b636d6409220d71466ae9ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G9p zi(^Q|oVT|Oxehr9v_1^f*}}mcrWA2RFSJNJdi})iincBHT(!B6T7@c1Ez91j;K6ct zX2yg6zxH^hi3gqO02%=T9UEur|Cvy9{8r=Zmp;~)Ov3jv?ko<{3)UB^&wBW?Xy&gw zmc7@j4L5R}ojduIXkE2cPg2o0U)xoi4n29r{>nUIs)~|QQBL&KJrjhBwyrc+*l{nv ze(Gh{y^On0M*@wz-ttZV^eb@=h-C~60!!a3y5;OW_=Y{=YH)7DQxIFTBvW=g7$k77w1alox)LiaTPwqe^_Pj7i_IlP#X+b7olx zXaq!g{@X9=w13Z*)CzwVpvgesF!O9qT+6wH#hK?OzU@AJa!chbhFQBhZt7VRp}?mu98-qj^V@HpS1 zujikb?0kJi?7_dva&M82+`QM`1@*hP@jVXKw`~8!ZPGSP9AYs815d+yHW&HVk=u`* z`Y})PMe^QbtQ?lcA8!9HUs`0hz~{xxMxW3p58qXW$lX3IB)3Fy;F)U1Hi&=O7 qrO+2!;}7A+Tnno{eEG+CV4?o;F1P-kci&%v4EJ>Pb6Mw<&;$TKbd<9I diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json deleted file mode 100644 index 9094fa918f0..00000000000 --- a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Originally sprited by belay5 (Discord) then recolored by Nairod (Github)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-MASK", - "directions": 4 - }, - { - "name": "equipped-MASK-reptilian", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/prisoner.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/prisoner.rsi/icon.png index b6f68da96e1cc4016112b717a63d53ca7f79e94b..354b1eee71dbb1607d5667604e7fc502e768f105 100644 GIT binary patch delta 346 zcmV-g0j2)E0)_*S83+ad0047(di0SYAb$yPNLh0L01m?d01m?e$8V@)00032NklyfcoYiDiy%p`gqHw=!0-ZfbR-yN=0>h`qgyi4 zuAQQv`Fl;e`>(evcs!oJrzcelLP#D20c2SQoO7eIO=y1vli!zIMgYStablt`^?xU7 z@_0vuVvPGDut3W|0VZD`j-?3~7#ToTk8c}Xpl#rMl?zEdZi}{o$yhEnQz2z+iBSvo zBL?&t3q=NDDAWd{78F&ZV*E`Az_~xo zAa9y~G@zQ$!RQ~rXLx>zgf`Jhhf8f8 sQ-PZR000hUSV?A0O#mtY000O800000007cclK=n!07*qoM6N<$f~e4lZU6uP delta 272 zcmZo;-pe#Wl7pFnfx%@-*RhF;3iVn6J|V7N-Vx$rQb&9l{?{`^M6VGMmD1MMGcodF z*uGs?*Vw|`PF_K6&is`?Z4DaH4nT^pB*-uLKQdr&J#gm)P=>R>BeEE%;0OpaPSxg< z1`0NLx;Tbd_`f|L$ah$QqapFgBH>ei*ITbinOr+_7x$O?4AsAj#J>3RORzF9oSZ&C zjiF;l2Pea`IfdMPhZ%mp@Lg~v{OF`85$y-hK4-8+STDFO8?oqB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0003M zNklY2nSUm{stSstz`l35{=!y( zk_SNmYtMr?j^*`aN6;jvD9aMUFdPj+sRk(d_HcnDNv1Et)AIL+a_;d8R5}9{1%74jyU$fX8K5g!7ZewOU4(rQ qU9xlA5cO}l2G9T+U~Yi700RI8zZHRui_7r<0000Nklt+19Tw>f(u2T!H3X=g6P7X52Ho=0jEXBl^HA)VsF|^?LwHF z4DBXoleu?D&NnwVnF3}k58wejfCpd$ECn_7H~##1pPL#0nSb9d?&#;!(vL|i7l_ON z#(a5u7++!@2R#8iwc#T67VN$br(Cb}C*W+Wzydfb7I1eZ&}=;7Eh*!x6zhCg4Qa4~ z$mJA>qRPOwI!+#G5+4 z5fSnbs{$zmNp_BN=Kbp0mXh)tLM(vBES0fp!um#Cm;dGYVZuDDRMFbo*YU~mVWzdL z0AwOTW&@?yGR2fP###G<4KP|*(Xksrq)<^OVmG8!1q{SLd6uj%BG-rJANMF6ZIh}diCGe za}1YMn*qKd;#p>Khj^YiyX9Dd_lU<>MJ^Ga5GObtkoZ>UipOt)%N~CT=7rn>;1@lm zau+LI%qrXU zjJ_7?;N&QyLVw-_sWs}VQq@RTY3itp-2dlkYctbc_i!2*e0AN=Ng%inG#jq_d+NH) zGa&E+T$>$#m2#T6jWNfgIywO;=?cPt`XP9pGK$Au#R^2Wn-+Bj*oevupPHiJ0ALSVSr@P~d> zn#+rY4rGC`V~D_bTQ1prJ{P6^exG4Z#|Z(}Nq?>fgTyq=#PdA<^m@G{j$@wVyUtpr zYC$p@jRg7q<5L0=BuGU>;Xjb43^rSq#m3_?i=v3#t$ZHyF#B_r1khp-QFc@o@NM^w zdvd$W6|>3$zylGEu zNOrBq#dB%fV$(0Kd)PYwB4ib!QKcHqzsd;!33!ID2?rX&CW01jnXNoGw=04e|g00;m800000 T0Mb*F00000NkvXXu0mjfu5^_h delta 552 zcmV+@0@wYM2fzf7BYyx1a7bBm000ie000ie0hKEb8vp=JZ}D6A|=ODoFO zj<#=bY$d~)RrBH(mf4*-d_QmA+j(O~kJSh00~iJf2B)huet(q9$lhI<{uO}C6^p{& zYh%?YgfxKOoTOG%v?D`1;B*eN@gaB5Qed~);2rlF+65^9G8y%ZvG>>47j!~~i;%XS zqF2>V_HaPiT@VKF4ozuQUulf|-2w#`*gXT#)rAy<5CEA+Qd`(ti`M5T`ba8?-03Zj zceVkK${^e$E`KSAmH^!RFL^=}m`AJuLPo+Vphzj#`KJQ=rgxenfOaGVKt_kjIA%iO zhIyI`BZ2F)o9+VWwf=R2!1g3oHeA2fs4lt=K;{>*OJLB2PDmPnMcyHEVF1c;IGSKN z*Nf)#`KKdUwmY^2$iAJMkcM^$E!H92E;nYESL^1P^nVdl^D|JkqAMpMhsdP0_Uo{+ zf1UmJ`gKjEBBUi;1Kh;x@Ue>s9ly=Co7y$+kRs`jE<)CPDnBQlz5(&O!ra0V0)9Ud zn{l*~G(f5NNM=>40}jEjXY@^Q2m8BF6tQ|R)Q+1$kjOk=$g_3PdN6z+;1CpP9Y9M@ qZC+SyT_MY5BJB!5C)5Y%Ilwm%yYQoVR*XFW0000pGs7XXYR9Hvtl`(6=Kp2M4TdW1sG1lF>NXM*#LlG3A&|lcqLP0D@ z2f=?J#i^O+{GMupZm_ch<}unl)vI$NWz%xgZ8AI~r*u7q}tZfZ6EYqb&|^ZDMo19j~o$xE_WE`^oP@5x4?t-y1? zpE=Lv4#E)txqsl61QE>Ppin4itD!ZF0yE~Ix5-3Qt5xcQ!C*iVkeSV9M>AsW0u?Sl z!X3vEtKBj&kU_W!Ckp@$XCTpNx2dmI>tn=QlbX z3P-ChhmOPo01}V&I)y*ATJ)Q#L}G!>W<%F)uSXKR9CD_dybT%b^>VpPeJQ2L2Is|a zIMi-IpdDb__RnGBx^C!r9KV;vBK0BhKAjq!g2q5X6$t~C*lj)EDiryi^hqBIBy#)EFa-*xN3`aU2K@H7F4(<8N_tBJ1VCZ6U3 fkcA3>sRR4~DJ}D_3S&RE00000NkvXXu0mjfWXR_b diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi/meta.json index c5495e43df0..9879138a5c9 100644 --- a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Resprited by DangerRevolution (github) from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Resprited by DangerRevolution (github) from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Devices/communication.rsi/beacon.png b/Resources/Textures/Objects/Devices/communication.rsi/beacon.png index cd94b9738a05ffbf12b4527479336fabaf91a047..fa3d280d0b74a373b33d68983e1d8ea66e8da22a 100644 GIT binary patch literal 317 zcmV-D0mA-?P)F)n?n`R1vLw1LN;PQ>vMY>q!((6a8 zzTbLxdC9vw2tY(cM0BQNyk6$4zsP-oo7+juea5jqKmIYdge+B6jaC2vJU?wl%^$sh z-2Ch-aPIzn0h6H%y!YQ8xwdTwKX2^(%c0>S0sy$0ejJ(-ElaS-A5?&<0sxw(!D2qc z{oQImwtm>|$E{f8C%5IjkE)8gt^ok=efMR~%j+A8qAs(Ea{at7j^j|V_vPv8cl7foDVn=TiUVzBXyAHK zl&BT6>h3cm<|)y+uZ#ab*DaXy(%_$c1@ErxefN#_@g8Hy4AGhP>zd8?IaS%mIFt{# zB&zNDbZ-0Ct6O{bojLs1H_0XG!1Jl=1wOMr{oL9pnYQSu>&X(K_bpeA3yzvz(t5o; z;rHF;H}{@=SNQlvUtjy&FN~YM&XacWw+)UIyY~3KeSPYTV1^T`)uQ)rj{a$=E_rel z^O9MmVJ9OP=f%$}+RK(WX^z!_ZH-nAyFo67fDneauMeM{`19{(ABIbF?!CJDVtS51 zJ)6hnQ`cg?KDcr^jeUvV9rxG8hVlkXJ-vPWe>6JJv#TV3dYfP&ukqJPUchI{!5Rfw mhG)z(_-~j5uxEfn;{bbL<^G@f$87F_Z1HsUb6Mw<&;$VXyS-!p diff --git a/Resources/Textures/Objects/Devices/communication.rsi/beacon_dead.png b/Resources/Textures/Objects/Devices/communication.rsi/beacon_dead.png index 7e25d7455d6d2c667c15b2b5ab706ef64d00e9f2..64e7a30d49f2bb604e4d85d41e7eb2748b1fec65 100644 GIT binary patch delta 236 zcmVW`mv2M5cL85{RdDgsbpCnMgFbw10S+0xxRe`#$-x3&o zO2hF9hT3+280s3t zw%+^9%xIbh0MMs+lR2KwD9ci{3eg0dbD4+`LO=-NX_kn<%sIv=k`S*TrG%=gL^%!O mQ90+tKc2LE!!QivC%6JIdp+WT|L-;c0000+oKjKTG!89e+_{puG&9u6{1-oD!M<{Fqr2 diff --git a/Resources/Textures/Objects/Devices/communication.rsi/meta.json b/Resources/Textures/Objects/Devices/communication.rsi/meta.json index e9350caad8d..bfd0e069f3e 100644 --- a/Resources/Textures/Objects/Devices/communication.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/communication.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris and modified by Swept at https://github.com/discordia-space/CEV-Eris/commit/efce5b6c3be75458ce238dcc01510e8f8a653ca6 // Radio, Beacon, Signaler Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", + "copyright": "Taken from cev-eris and modified by Swept at https://github.com/discordia-space/CEV-Eris/commit/efce5b6c3be75458ce238dcc01510e8f8a653ca6", "size": { "x": 32, "y": 32 @@ -31,28 +31,7 @@ "directions": 4 }, { - "name": "radio", - "delays": [ - [ - 1.8, - 0.1, - 0.1, - 0.1, - 1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 1.8, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] + "name": "radio" }, { "name": "radio-inhand-right", @@ -89,6 +68,17 @@ { "name": "off-walkietalkie-inhand-left", "directions": 4 + }, + { + "name": "old-radio" + }, + { + "name": "old-radio-inhand-left", + "directions": 4 + }, + { + "name": "old-radio-inhand-right", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-left.png b/Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cb184a79c41bc605c32bdce52bfbcf245ce02a GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=^E_P~Ln`LHy|t0|kbwYeKyyS3 zZ-jz#OJUFk3D(x*iq;OUlZEcPTE5)NxKHPI`Myx^~S{`^VmO?PqT7 za$)zoJmpi={yX=6YZ{p^W!(OJt4mtf8n%?wO5pWdm=~oB~#qq=_go#`WYA& z%$oSu;g(&3zw+tkko)+uPHG3uZsRYhO2c z^3|9F%EvaD$X1*JIS&jr)XU|w1)W*F(H}&2aZk86JAz;Oar`Q-4<*JI&MZ_vaQW;3 i^HA0e?d%K;4e|PtD|HXgzpeHHq}kKe&t;ucLK6U7i(c{o literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/communication.rsi/old-radio.png b/Resources/Textures/Objects/Devices/communication.rsi/old-radio.png new file mode 100644 index 0000000000000000000000000000000000000000..23315c58a2c7b98d3587c7696fd24ef507461066 GIT binary patch literal 401 zcmV;C0dD?@P)vTFwg z6_IF42&F1$9ZG}9%gZB0>hQklcz5saOgla~JrC`xEYKP5xejB=6acBr94Upr zvJLdB3WzpPEtja4OVSwra0By8t3f_2jzUSG+3+!~GytZRrrGcTsNGxvkX={~jiZnr vqRt&K#w}Ty6tC{!xlZUY>iH$qXf&E{dy$VBeQ!MQ00000NkvXXu0mjfVjZ)E literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/communication.rsi/radio-inhand-left.png b/Resources/Textures/Objects/Devices/communication.rsi/radio-inhand-left.png index e1cb184a79c41bc605c32bdce52bfbcf245ce02a..ddd9d320f9dea2333626c80bd1963fb726f77038 100644 GIT binary patch delta 284 zcmV+%0ptGH0k;B>B!B)%L_t(|obB2%3IZ_@K+(zS5$tU&1-IJL188AwYbEgjf(P*= zdJ79rB7(4$FtVOtC1c32|G~CdGMOYW836zQ001COj8UyZsH(lbRF&nLw{2@VTo%Fd zC-Y-#u)bGkeOI`QyK zPXC-t1Ms-1Y*wq{C;d0GU8R#Im|TUqwm`9|>hc!wXz&3500000000KYv?}~dnL4$a zYi007QP%;m=tpoJ0E>PE*Jpr5KZ5HFD6Su&?}Mhrqox@3Be=f>Qu`5H2cWoqgxp)e ivL68e004s`A{8IGP~iJo-Tf*600003Gx97D) zW{Ru^WM!u`;IS;>2hGTAE$ISYy_d)Y000000HB(Y{Xp72U^Gu7`+@L%z@8$0i_15l p%x)lq2DI_rK=})>8vp>{KVOAWEDy%&U1k6P002ovPDHLkV1oSMQ)B=D diff --git a/Resources/Textures/Objects/Devices/communication.rsi/radio-inhand-right.png b/Resources/Textures/Objects/Devices/communication.rsi/radio-inhand-right.png index ac3ef8ab79fb3fb4c6b95711cfdc62173f490985..fc5fdee22a317165e292d6dafffaf9aa41bf236d 100644 GIT binary patch delta 235 zcmey&*v>RTrT(0!i(^Q|oVT|OxeghK9Q%0vmhz6>J8rLB%)X*|^Xkb<%wIU#G<1t! zh%WiS73a|6q-OX?Z_>6YlcxXA=Tq5JlX6m>0R;Y}_Y~f8n^G2;vsU)Kitx#rZFlb& zmD}%MI&tzY#tPL3lh&u)l}p+9T13KjAE!Y0?nf5gpLusYTc2_yA zdUrAWm@VEJ{qAxH#8{Bgi^Qwa6F!vZznIIozV3j2loj({VTW`F&-4Y~zh=JV;W?#0 im(hwDsE}iFM-9Wl-L~6zy0`U%bb7k_xvX@0{lu2Lqd!C(ZW}ctcKkszV^kvN1&kp`NEO1E6)9_eu;lTLx!c>*gbQXrziVGNdGghm1IouXnFPpIoZ N-_zC4Wt~$(69Cc*TqOVi diff --git a/Resources/Textures/Objects/Devices/communication.rsi/radio.png b/Resources/Textures/Objects/Devices/communication.rsi/radio.png index bbc73c505e5646dcea0c096c3b08b25513dcee3d..eb57264b858e705554298b886911a667fa507548 100644 GIT binary patch literal 536 zcmV+z0_XjSP)Px$(n&-?R9J=WR=rOGF&uqYhzcwOS#DyGgaL5i%Y@zK28oM_D}$qn6N`(6zraD` zVjPW&VPSDq5(z;J#KZ_L4wZmNBoZZrI^gl)SFQyyQQp#P@7MQxef{0Fz!+ov1vs5f zCOVf4LxA7!7oIy50Y;;7^a6Tquh;9s0`wx2ToJ;2ML&wBOJ;USKnt)2Bvwu`iIqBML0Dyi-ktI5??6gsVe3|^+c z*CSzj#6yOmd|gMQ(Ez0slu|rRlrT9h;rR}zoU;wByqX=z&Q$yQ7K;T2g8{W#O)JHx z5c&@Qz~XTf2h9vj0H!V~D6VY+;4ebW0%i*Z$sQ)m5hS?TZ;vHS#r8uGu)f6+&Lwe$ zTYTNm`)Gb0)|ZnHF+b+Odnk$m_pQ6rKTPci@eFhth7_f*t)v+D76=RQxZQ}w;|M7V zV)3{rjkthxHrq+AIxtcJUpY|C@g0cV0!oQ?f?so>_dHNnK1dC4-(c)v!oIUv4nJ@ErkR#;MwT(hLl& z?4B-;Ar*7p&fS}LIY6SV_sFfK_6n&BSdTDFW#GKAXv2mnOw2ktdwKO5t6v;B#^lW^ z%pGd(z_er=GgDNX*M<4gD*{ebCuR_x<}BlEU+^X8%nd1MBjm{0dx*|8n+6GHly! z*0ex?!?yIDO;JjRqXG&br!YtGroLX{d{Rq z|NUe0B^jn~y1mx=;bT%X+q8E01BhuiY1BP%rl^ynOWbRr86n+xnV+ zOU_dYR;a74zt3ZE+wy(MIqA8Yi@&qWwC}yU_fY@Q{MYX}8>%0C>wo|8FSq>l#lNRp zH}5hNeSiDk7WuU~ZWp(|{`}F-{DFyi-quIAFB@O}m-hSl`nh+)m;QMBx7CiL=#tHz zJDztKf2_Uzp8cVH>#f_dy{8H+F7}mO<7@hvE~d8lyZ?Tc&*7DSY#9q)e#n=$F`pmv z>i4p#OYgCVqI0r$(N-E1WGf4$syczNN4pX(>oZ?2cx z@@4t_%4`3$`sx!H>g;z+|9|vI_tYgi-A3$v;P9^3J5^O`sg=qnw|}mEIh)4pTZN7H zkDXUdd?dh7h!O9K4Cumj42AZ886MUBVm$Kq3vWkzV>P!FK`p%rvs~BSMps`=sl5J&OLt^rVH|!iQ&r3Il*)#mxh++thobrWv4#WS4 zF1vra^2J13&w(q+=^v-X4qh65gp?}`|HM_^UVE&u@0=wobbWeVx5A+M$#O;1} zvugLuXLR~1ta4o7(0p^Y$#o4sB&TomyPH${r|6qh<>tDEIfgU738(Zl)-n9~!u&x0 zJt)qI4sLf~Tz;DPlD#1(Q`f}%pth@XSSA$R2F>F}8?Jq+D^YoTZU@?Rm+UMj0^L`eYx;{Ms QEGHQ}UHx3vIVCg!04W4|3jhEB diff --git a/Resources/Textures/Objects/Devices/communication.rsi/signaller.png b/Resources/Textures/Objects/Devices/communication.rsi/signaller.png index d6b68cba775e1dabde93e46de284f49f0b30a35e..1b14a3a13605242c53b964bc4f02b43a768acc79 100644 GIT binary patch delta 343 zcmV-d0jU1S1MvcoBYy!nNkl1t&6U1T%w^Az9NvM+rp@NfxE)K5J zC5w}P!AblFE{+BNKnI85;G_=XAR=xRTExvEjcG`{I|rvq1@8!oa_{&Z-+K@5-F*jE zR#tyeK@g~-yxgLUepJfo zp=#c^(I96w_q740bO8WV&Es`HAFGuPJm|rR>#DYt--a*(a0dCuhM#KS^Pu!bgb_e{ zXKP};+X*>TO6v%Wo?#NFbUPt&ln_S=XXn=>aZ0qHKOl_~kW#X~y#~P5%{@u~g$wQ| z_Z^0sUPcLwrcfhpk52(;H5<&#&(Uf&j1n*c@JA(}f9BYyx1a7bBm000ie000ie0hKEb8vpVQ!P zkmUd`?}-1~wyt0tFb6z*aE*alU}#3cpmTs_jNN|_eSFCwlG6pr4p5CZ`Ok3X7u-@1 zaBxwFG5?e52$CECvedy*onhYgtqguH=5TReV_h(PV9!kkQhxziQIOQ-jl$o2_A&#x zfFuXlc(XG2>geK>|HFO{m=0*@fFoOfGd#Su9jE-``@b1T1w=dGu$}Jz*mGYQWEHs? zo;`G8Fi-G+%bi@XgF#AuAH#E?Jk1<%@;(y-122UA^3G+Tr3g6?UrL^VEI_maN*-Ti zRM0X8XT6X#c7Gsw3nA&m&T#iGjU502l1AKM`tIE)IOR#LCWcN?tgWs0ADj63N3R(S z)B&Ro Z001=ZcCSkjr3wH5002ovPDHLkV1lbQyT$+j diff --git a/Resources/Textures/Objects/Devices/communication.rsi/walkietalkie-off.png b/Resources/Textures/Objects/Devices/communication.rsi/walkietalkie-off.png index 50f3927824f1ac568ddb6af0bad43f9201e8623c..70e2b3a2a56ff9d446ed8f379c3fad5ab524ab40 100644 GIT binary patch delta 274 zcmV+t0qy?W0-^$t8Gi-<0047(dh`GQ0O?6YK~#90?UXT&!axi~|E#!xPccm*QTiC0 zBWxPZFx854P;dnbE`daW6qFNew}mAd%D)973LWu86zn`{3Xk;duNm7wp-`BC7$d#f zk2#GL1OLZBjFCBwH)fF|R#gIkna$zl`Jz06whzPM5xkq3N`IIt=(d4XO{`C!!`=6C zhjSNDe{pg?_ZM93>Xqi9s_eFbs>;6aIgUN~++&zhLff`TDS1=)P*vLg@dfU&C!eba zetvJG*EG!#d&$~_B9bHb8Q822sA@t)U}g{zR5h_#9kR_l#oUX?ZDKrrFD+gu6yAoG&CqGDt30x(Kj#yDld#U_76z$l?3?( z|3?N4t_SX%0LpL{ctjR6Fx2xM0jfH}I8~cZ8YsHZ)5S5w!hi3CgF=TCcwC%?S{MEK z|9;oP>W07<2QQX4=G@l_$Q1wMG~vkEle-rbfBD`vql{NAZCR3x_2LA*ck3Q4Hst1P zTGHzvcIfQ;BQseRPbfU`h z@<`CMad|8t@w)AYp7+C(Y!yCDne}FGSbEd-^ecb*{LwtL(U^1okFboltSjehm$L5+ RT@Q3EgQu&X%Q~loCII{0gVO*2 diff --git a/Resources/Textures/Objects/Devices/communication.rsi/walkietalkie-on.png b/Resources/Textures/Objects/Devices/communication.rsi/walkietalkie-on.png index da72f40e03f66d37d06b52899e1eb9f189c64367..0bf04a782db0e0813899de8605f0cd665fea2f42 100644 GIT binary patch delta 86 zcmV-c0IC1a0d$ZgP&-LPK~z|U?a(0#03Z~D;faDr_6*+jWx*ht1oNu@msYkg0RZs5 s*8o|0J>k`J4qFk;M!Qe1}1p@p%4< z6rf;=r;B4qgnP0C>*55Fo~A$pF1LdY%x)UKLMQD0zuMo;CO(Cou{y6Nc}A9o+onpN zfLSUZwmlcP;grH7q|81+l7DA zt~~$}8>klmF~E?G1%w$;t9EOhiUIPZ3_p^cpTss02m}Ve7$e%)(U3-hf&VdJj1iy0 zYclZ(W@Z5Z=iCrpx*sZgh|8mT$sSUf=}Xi%;E+Xfnols_ynpJwVm-pNcp_d(?|iB+ zSX>{t+{Z0_?0**>%q)j25@wdNETyS6`P6M_twoxqu-0l*=wN1XdHV$_t;wgVf%EOt zdP$PhT8q~tBqE=1oq_FYhgmEjA~@$jM3}{b?P}+3rV~RCBDINT`+fEBKp^mQyaC~7 Wcnq&YI#>Vz00{s|MNUMnLSTX_8hg+H delta 483 zcmV<90UZ9T0{sJ!B!3BTNLh0L01m_e01m_fl`9S#00056NklBXCP)ttWfmlPw3cYyTs=Zqe*(%_W;u6#3tiv|~p{GJ=%7=$`~8At_WrGd9ShZy#h z*kOnXkzp2D4u5!lYZC)Q52l!^GMyYy7z9jc3=>cVb%5o;MH)Nc{DWrWtatM&q`=P1>s0{|( Z0RZRCzZ#?z%#r{A002ovPDHLkV1gl*$^ZZW diff --git a/Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png b/Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png deleted file mode 100644 index 987e571b263f8b1a1c863755865ddbb5f496cfbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 zcmV+!0_OdRP)5+Iv#X1vlY<|@&)`S! zGYHPzoE%+>n}Z;fT1C;N2el0}Q3@%fXY$I0APU|k*E4W`NZ;KBdcT*;y(IqvD3%7$ z09*j=_8uLNr{FkGh7tf7(g67axH=ue-OUh=FBAd%B(^h{cy~x@fKquqZYM#c034n* z!`~*@_LQ=*muC{67pV_i0Lg5>E6RS~-bS#l^YCYo)Jw2y)}gm}$9BUqfcO-6lp26d zE~-rHK!^0@-UBj}Ux4JEuhlAe0JNyoLUiOf81H8Rbi#?)wrhBwI8I;JEOWTu=I|@du*GPpnNi_usHzD~4BO&i5aw0HVyJ$)hMLVSqVZIw3v{;<1(c z0}KK|7GhT+UzLz4$~^gX)U0nnsag(OTU2Tx`qdwBKX9B-6A17rpG%+&K>GvQACMsp bpd8=}cvi=k6xZ2A00000NkvXXu0mjfjHTr1 diff --git a/Resources/Textures/Objects/Devices/jammer.rsi/jammer.png b/Resources/Textures/Objects/Devices/jammer.rsi/jammer.png index 99e0246bfb1acdddf9df6c748233bfd2b808c0bf..6de27ba924f109e4b6bcf08e517a0ec822575e90 100644 GIT binary patch delta 449 zcmV;y0Y3i80`CKmIDY}5Nkl6vkf-K{idOLjAg~(YO|O zcmb~<8!d*Vn=aY8GU*vum9SPC5@~{93W-+UglPr?GBs@oreD&`zjnUgn|U*7%rFet zq++mPMF0^%1hBmT2i~0_G^}6tLtX8YJSS}k21OUx%o_|gup98q6R$Z;p@QkQA zt*?Xd4Sh#@!^&v8Jj2NQi*FDe4PR` z-AkoN-5v~9zK7Y5iMTESeF0#WtBOMQ{G?ETR;x8z6-~Ify!N7Ik0L_QzCZv_G~v3P zj@L(*e;GtzHzAGweLRM2Ham}AUpYCCu`d7=8$C_LAUebaAPC$6g#&P}Y2*lsqDb1! rW-~A%U-tlnpzZx3i2x#ie*^Fhk4mZEqh?^5kDm)JkL(bdIKZbv8c0e*E&70ADXG3E*#XGDMF-^g zo@57L13FA%3|IcWB3nPj4xq$xsyF}{*b8g^2hj)LUMD&&P=D0{QtXTj&wl%mgsHgxK?*fX^v>*z4`xZ=J{Pve&InW|loJ)QB0v3P9z|3%vfiy65qhLTBuufPQ zOn+ke#vuGt?f(^qzhM4LJ^?UI^SS^TfD#=w07(w`^zj>*Cb!(D*a0_goFcilqpAaF g0Y)7#;0^!)$P*M&!Hni>ga7~l07*qoM6N<$g7i9kt^fc4 diff --git a/Resources/Textures/Objects/Devices/jammer.rsi/meta.json b/Resources/Textures/Objects/Devices/jammer.rsi/meta.json index c5cc9f56d24..2923d9ac636 100644 --- a/Resources/Textures/Objects/Devices/jammer.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/jammer.rsi/meta.json @@ -1,23 +1,15 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/93d9c70530c7299ef0af96fe2178096b2a62e036/icons/obj/device.dmi", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/c65da5a49477413310c81c460ea4b243a9f864dd", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "jammer" - }, - { - "name": "jammer-on", - "delays": [ - [ - 0.8, - 0.2 - ] - ] + "name": "jammer", + "directions": 1 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/meta.json b/Resources/Textures/Objects/Devices/signaller.rsi/meta.json index 0f259d9b457..cefaeebebfd 100644 --- a/Resources/Textures/Objects/Devices/signaller.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/signaller.rsi/meta.json @@ -2,7 +2,7 @@ "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi, signaller2 created by TheShuEd", + "copyright": "Taken from Goonstation at commit https://github.com/goonstation/goonstation/commit/354d9635460c296dc7dce23ab39481dc4de6dc00, signaller2 created by TheShuEd", "size": { "x": 32, @@ -18,4 +18,4 @@ "directions": 1 } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Devices/signaller.rsi/signaller.png b/Resources/Textures/Objects/Devices/signaller.rsi/signaller.png index d6b68cba775e1dabde93e46de284f49f0b30a35e..37a47342a6a0fadd153c1abb049caefe51b50e43 100644 GIT binary patch delta 264 zcmX@XJcDV1WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ04 zd8nt5s(4_oPs_BbAQqAH!or5PT!E6d+7mN@6h}#rU+{kjV7S-3HxekuS>O>_%)r2R z7=#&*=dVZs3YL1hIEGmGU!CAx&)1;928{u)8H0aHR=D5Vkpy%BgQu&X%Q~k7#wGyW CcVF!Q delta 441 zcmV;q0Y?6q0>}f98Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00DYQL_t(| zoMT}aU@+={Q3sIa059)||J$~%U>q<9JbZACfm&c_M!}$SfMtx`e-M3q$sv-{1<4Lj zjW_wvaOM}>QV?)(QHL@Alj;bP900P^!BL%I-uA5welF&4aerT9T`+xM&rJqW0a;Oy z)a8xB-+cBm1G#`C2iSPCGWhD~;*|fxeh-)qXy||=TYob=ytW;u{Nww-8At_0JK(UL z?*G_xUm0W-xfz~4bYd`1@PNymT(E;dN`4>1bD%uU9B}eJ69WS;g#Gf)WuT=9IS^k; zo`Ebtv;#^WUw>p&&@u*Ry^u6^AbATR>BP=(_b!bc00NRm++h0d-6uHZNv$S^PEo9_ zt@j_B`1wb#84Tq_Y43nHuir56F$jR!W(%G%oJx=aTmEVLGluh?3}ickXa~G}^^8%8 zK?NKN`m(CI{*Path7KUt j5~@0Y+F;ZHqYeN7H12kP%@jeom;=LYOsz~-U3H|W)iH{a6!f4<6pSRmxU z&cBZT8J^29ELfMFv6hjccK_kWzZh%xHy888URS-{B=XNy+F;$?2!>>yYqxIRm@(hk z>;HOQ0jG+kB0Yu~x65p-yDBSdt!>0z8+A@UnDaU6_2k(TZtc%t?lIhOt*N+g)he~e z7SAV7wrrj9&sA8+se(b{bWzv=32PtCV_*Isk`H+jaYDvW|KI&TFrR&7-DtCOrf8kX RKVUdAc)I$ztaD0e0st59p{oD@ literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZnt_3_ z(9^{+q+-t78}{CZ69m{kXmivtI38RXG^gp2f}WH5NB+Ad#Vck%Ps(Ea{at7j^j|V_vPv8cl7foDVn=TiUVzBXyAHK zl&BT6>h3cm<|)y+uZ#ab*DaXy(%_$c1@ErxefN#_@g8Hy4AGhP>zd8?IaS%mIFt{# zB&zNDbZ-0Ct6O{bojLs1H_0XG!1Jl=1wOMr{oL9pnYQSu>&X(K_bpeA3yzvz(t5o; z;rHF;H}{@=SNQlvUtjy&FN~YM&XacWw+)UIyY~3KeSPYTV1^T`)uQ)rj{a$=E_rel z^O9MmVJ9OP=f%$}+RK(WX^z!_ZH-nAyFo67fDneauMeM{`19{(ABIbF?!CJDVtS51 zJ)6hnQ`cg?KDcr^jeUvV9rxG8hVlkXJ-vPWe>6JJv#TV3dYfP&ukqJPUchI{!5Rfw mhG)z(_-~j5uxEfn;{bbL<^G@f$87F_Z1HsUb6Mw<&;$VXyS-!p diff --git a/Resources/Textures/Objects/Devices/station_beacon.rsi/icon.png b/Resources/Textures/Objects/Devices/station_beacon.rsi/icon.png index 15c1e94221d6ad947744547dfc7b4a8634b81917..67f3f53eb5010a9b612cd02ec21f1d09fb71a651 100644 GIT binary patch delta 286 zcmV+(0pb3V0tpxz|{T;`{9({iY5uxk4q!ywY7;7H|gb?uFFJ@!En+a delta 257 zcmZ3-G>K_~WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hWfKQ0) zP8VHqF)3|rz0Ax?MP-A|&N*J*5pVYd0p(5Zn;h-1sVbgC1MVN2M)YY zX;{?Y=pq=($gDhz$wWIq)|5kpW0AH%prdhPpg`zBaRo+(5;2aK5l{#&5lX!-nn|g9 zhv#!v(AOGG7z7F90u1grCDQBmX~$%sdnAxBDj>seublQUwmTi#m8%uu8Dj$cYiDq_ z%A)P~um^N8BA{EjyxAbz-G;~_u?1eOoX^-D(*ANj2}d)Q01ux{rcdE~XY3e;g}+NA z0aNfu0w&=f3tgCoelQ)B~wG&!lQ;BpBG j5H&F1TBIeR!oaZTJ&*r8>HKp*s~9|8{an^LB{Ts5G#oeh delta 432 zcmV;h0Z;zO0lou}7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0004SNkliBuElru`WV*><}y)L~30k z4<#P@G3^_7WcEk7>KldF?`4<=%jYw@GxIh9D^4sB3;b_^2-kES z(wP*WzrGBh+kIfRb?1>#A|S)JvzbZ#sBnUVM}l0SlH6jC4%{&EaB*JeH6epFHxmg` z0fg`6lCbW=ombB5I2KDKUfVxB@H|5%AmFLZGz`lX_#TbGW^a6zySl+}4}^t8K)`o& z4Qh>BFdg`{3xAjM^xOx($if2h%Kw62nN7g&{`L9cIhqRz$naLD_bXi9^<>8|Dtubz z5}<<5B|r(ES%4ZolYk0%WC2z1NCGP10Reyi#$aQ4cN)n?^^6=I5Wr|sClg())4t(% zJ2gC1;NG(MD7qHHv76Zn-~j>rWx~!i78%z#+;@E{6Dh#BFy@;pOXw+34V@~m%)|mK a7x)1^VdyatfcNqM0000InD(2OxQ zts!k}GcG1G$z&$U#4L2-x4Gw@Iro0woO|vA{^LLXGK5Bg`+xiU)zdp3HB55+%5qg6 zj}ube_WS)D9r9X(@>4bE2oY1OiSU#Y0LZc|loR{?ek4gE9*+a?>-(L0nk_hTR3L=g zR)hy&aB#5Pr|Q0NI7~DerK_upa5xM=!LR8Zy57g=#R*eeiP1|Fph8}7b2zYUE5ZXH zNs{3R1Oj9-8Gj^6LQxa|W@cs#yYRD=Fx@Wqm7_3U@-O1zVAnFCVY3KNDwSe#a?&&~ zm&-9eHin`oh@!~1A~`@|4vSrwgOPJjtpdtoQ*)5Xx=FoRHpO@VlF6juh(scQw)W|C z8i3y3USe=qX&srY=8FX-YBqcvxKX?g{8$$#;mT~dS*Yw zdGuHtT5U_#6%ZPBs|Wga*?w~^CCTT$*iNce*bnb6HGUM|I^kA#?s3t+23EJisuozt z*WKDC6jXui0%WrA^11ags#^nDMWuBCR;5WT~U1=C8HLw5x002ovPDHLkV1kCMo$vqv delta 678 zcmV;X0$Kg`2EGN5B!3BTNLh0L01m_e01m_fl`9S#0007TNkl)_bF+d?TN9| zXCVqj7NK~!dG(LJ``Kvk8X=?s_?Sh6RES6}L^dv$QJ@>J_~gUkF+>cALVP1Xp$m~b zwg6d3vFf)?)AZ8mG=@h_w*K^tfB$G>>CrS>F1oZ)9)DIAAj5TCRt}Hq+ejp!*=(jV znT+?@c}I@m6|A7dyii>1cme*hMR_4{G^8SEdEV;2MdPAx;h4se0!XA(^uoWF4}_t- zJj>i)SnoYYD<6n5NHLZ3kAbym68B%nufaTtn81zs4C{B;95*~4NJ=WAxVTO3fo)Q= zS^Lhk|9?edm3upfA!lo9<69D6YO4JR`bL|w@Yp#T5? M07*qoM6N<$f`msr{Qv*} diff --git a/Resources/Textures/Objects/Tools/drill.rsi/drill_screw.png b/Resources/Textures/Objects/Tools/drill.rsi/drill_screw.png index 0951ee8d9b7a5d07f776e4d62489a86da62cd2a9..c51ae6332b212cb66cd2b9d58ffe841152d0d747 100644 GIT binary patch delta 864 zcmV-m1E2h}1@{J!B!2;OQb$4nuFf3k0009qNkl1uos%^ax>0(fl z;B6z_h^Vzgu~6D7-l4V@Z@6^bT@_tO1^o$L7a~O(NUY$-Si2~c3L;`9A-eEJg7z3= zZ5!IgHsfMC(`06nOw2+TzMFH-%zM7?nKS1G|Mg#gSyDOXj(?60_4JNMWhXg)d9h%g zDkn+xx}qo??eE6p0XI0PzWBsYiK7i}S2dh(v09$H&l z@pwEmG&JDz`F{{XAcSCabkwM4XH>E?8icttD?6=uv(qZ`lP(T6La@)BXRZQBCXDB;PFNd8z?y~^gKOSacQmg-%hJQDaEawCHzo6jqXl`y+0TPJ> zot>Qw4{I}h@Z_r;R87?@wem}9`PqiLrM9Gf{kzYqC3#T*I}m^y`#)Md+qY=tJ@q<) zKmdSLDrI=zC$UWq4)%ei-(!HhPijG@c5BJbcwP{Fr+K6PsFB?3^%~wn$sGZhK}MF^ z9SdVBz<<^)%bsvT?}wy4(GPb(?*#eu7{xOn!*dbY)}7evU3A=6?euS4|rw)@}CT@>H`h|H+8znqAN2 zhd7TOYh4R1$&vuUKDTdrkbJZoTe4Xmn$ zxlGBWou{lSk)DH}X?XeEdKi_Q18JdBGY2bbAX8RqT`Kc)ke;@GTNI%GYZGhJYmHf5 zUs+%OM+kvI?SQJStz~&LcK`qoi^UK^Fm&m4-gAA~IhB4undNvHS~nYE>nm4|?gRQ= qpb~k#UgJb93qXgc6u>U|KcU}Fxn=bu4hl8^0000TD1rg8#IW}-YVV{Jb3ojv!@(9dhnEUZ=O9wkY1J*3Z;}D6dNfNwM|$B z8%b1huq*`H?aZvZZno=YXEsF&ez2Lp&3xayH*ep&k6Xr_0DoZtV-wTn>TFq>aAr9l z6BfWo?fzssg`w0(De`-5T~JqGxXg z`HsN{(gKb?yoL6@=8PQyWMI@}g!_jD=*4}I{%5>@T0Z0J?DTej#8efI3v4R{fe?lMmYr56I_fOIM0nP@pzfYW*1CRd%_iZCH+$oM z&AmBN~ID@BogL{{+Wj0bF3oA zt&m;3vH~o(1z90-He@1L`-H%R1e%tP^V?c11DYuXt?>WV1Ab6f#<=-2n~mR*st1BL zWEe_WVLk5;PX0v#}Kav!jQU=T|A)Qfdksp_;_yEdKegaT$uzu zf-iK|z>m7sBp$_1!1wsi}dNtxp?k3$`&p{SKE@&31uz>R)HU40? zIix}YHi|8HSM9qhI-0fhe31FHj&Ie%SAL_t(|oMT}aU@+={Q3s4VVCXu)+(`F7jD7OlWk$L>0A#tc zf((PQqAbJR`;S3F|H*X($qv|9!}s4SR*AtT@*czi51ud_S+2yeZSlkZ{w<$Kb_7Wd zfLQJbwj2a@?LQ8tLHr}j9T_$<>?hd~B!>Xl=fL2{CSK*mKz}kAdbwb6?G1+5X6)kE z&vMe%0igH=rGrB=o-i=++rh>EeLTdlV-qI>%@ZLEfGlsCB@WJlpqx;b26D`Pa*QHB z4Ztjilml$!8biJVV3vbu28NgPb-;opTN$oh_{Y$m!^}`Q{|4DTONe+1a>N!JKhO*_DAplC8AbFZPVBI}thKgyy3>%CfsU8Mkxgul!D%v_gKuD6o z%wrY9zR3b$OOXLc93;vs4?tfV3_}bwhp-P@F&BR{d@(jyho2IRF5fzm3J^`Cjn= O00004uk@Q5sCVBk9f!i-b3`J{n@ z>?NMQuI$e^S%i!%Lb7dM0EG%YT^vI)?!CS4%hjMD(DqQUN$-Iqlk)p|fyF0`cknB2 zsI}*A*XZ~jS!W>6yh~D$;lOd9w+=5;cIf(a8(sTmdg|z5*Jq}#t5~01n`bnA@}6xC zr%!&aW(1ndus_kndGhwBGrlUW+!gZt=cYUxSq6p!$z`2|0#Z`ZHy?u3c)I$ztaD0e F0szMUPVoQ$ delta 243 zcmaFD*upeHvYwfNfx#!Bbqb|fr6=?E{-7{-fw#y`4|*Aa+tdp{jdMj^@T}ox8Y6Y;*Gw?ntnQRo?FV$JhO!> zbFJsE!{y8!9vT2 diff --git a/Resources/Textures/Objects/Tools/geiger.rsi/geiger_on_high.png b/Resources/Textures/Objects/Tools/geiger.rsi/geiger_on_high.png index 7b160b48d7b2c8cc6397a18f7b7ac306120d6d78..15edc91e52938302e7edd8e02013a69dd0304f09 100644 GIT binary patch delta 159 zcmcb`xPftkWIY=L14D6D)fXVemgMd3!tfsi7wla=87RV8;1OBOz`%C|gc+x5^GO2* z*-JcqUD=;;vIyx)UX4)F01DZ9x;TbJ98OM4rj@Q5r1N*@7X#;MwT(m+9H zPZ!4!3;(xg9Jv@2I9vkV_x_*hJlCmL(6#!$TI>8r{K8YtJ20hZt#%0A`1j%LBMdiG rH|$Bc<8}TsQ~Ile2U${^9_(Y#pTWP@hJh;c#Cm@WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx}0fKQ04 zRHRA5{=|hZW=q$a0L2y_<+%r>SWANZg8u^n!|!c;!9W4d0*}aI1_r((Aj~*bn@<`j z=wzucY)XHkaDv_x3l~-)9aVawq}%IV9;TYP-H!5vESq{&?E*=S3j3^P6~ t8>$=jB;4^j|CuTM)xm=-sZ9^|G3d|WUu(m_6$>*M66Z9+7 zHcnXl@|bs`&Z2zx#l>I+Ty6(7fT|@LbQlgTe~DWM4fY=JY) delta 201 zcmdnMc#Cm@WIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx}0fKP~P zmn6@#0?Yrid^bDE0>#WLC0c}brt@5zopr0P09Y!~g&Q diff --git a/Resources/Textures/Objects/Tools/geiger.rsi/meta.json b/Resources/Textures/Objects/Tools/geiger.rsi/meta.json index 11fbd436814..10968b47768 100644 --- a/Resources/Textures/Objects/Tools/geiger.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/geiger.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from Paradise https://github.com/ParadiseSS13/Paradise", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/bfc9c6ba8126ee8c41564d68c4bfb9ce37faa8f8", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/hand_labeler.rsi/hand_labeler.png b/Resources/Textures/Objects/Tools/hand_labeler.rsi/hand_labeler.png index 77fbcef30da736b4008b8a3c372a3bc43424dda2..9938103840821ec610fa3ff217b4c8a3965985b5 100644 GIT binary patch delta 257 zcmV+c0sj8q1Caud7=Hu<0001iRA0W=jG90004WQchC>1bUyXb7osrRTWf8T3TAh z%$aRnU0rPu+4l1C&c#Y*vu4ej1`z delta 465 zcmV;?0WSWL0^b9W7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0004zNklemU<3GDd$a17H9QfPVo<4NzIH`SS1PK|S+p z05HGt8cI(GA~67)JI+#|@4AgZDp4?r0bo8cIi>W`!?p58o!+l6BNItI1Fn0n0I;&9 zc>xh71%Tt*sqE5rb8}E%I;UjiSHvEyd#@fnKRt>km36gO(|UlB34nZV?TE77VYT{w z2@T0M^3ds*gcK z#QB+7>U8hL;OUBwObYLBY7ytuc0MhCc1U29O3BXS800000NkvXX Hu0mjfc3aR= diff --git a/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json b/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json index 3c793a97322..216140cec3c 100644 --- a/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/hand_labeler.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/. Inhand sprites by Macoron.", + "copyright": "Taken from https://github.com/tgstation/tgstation at commit 44636483b7b2868b3e42c92205539f11f6d7968f. Inhand sprites by Macoron.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/multitool.rsi/green-unlit.png b/Resources/Textures/Objects/Tools/multitool.rsi/green-unlit.png index d0bac8b61eb217c36e109147a9aef63d1eee1b10..fccc17e9193e7371d0b0630e1eb19d25699ad886 100644 GIT binary patch delta 93 zcmdnMSUo`{+{x3$F(jfjS%P(Of=EwOpaB<~ltEC+|NpE07nmhWN2VF_mT+tcSQPo; rl(@xjThkb0F1LdkP}LLJB_t#mk}_B?1f4VtV*mnAS3j3^P64z&Jsrp0PN{-HBn{IhmIX3=Aykj=qiz3>*8o|0J>k`J4qFk;M!Qe1}1p@p%4< z6riB1r;B4qgnP0C>*55Fo~A&9M~uo-)Fe;LH~OJp_1SXD@dF>CVkbRZc$0O~+2p26 r%xr9T7@;b;+zx6;url*VNHBa4V`uyJH9ReWB7cQ1V z2*l1|m^ej{VaE>A%pp4wQVUR&1_ZBsq1YK@Ibh?)_Y4!K++kqIQGttr_#knbJ3wB3 zCL<^z-napE1QdYy_wV0iaBw)l$iP5{f{0pxYzJs)K(b>VQ!P zknI2k6Nmr)-u?^|8w(lp>-+z2+`5tB!I=Y$baMa*IM|poYy>(4OamQ24j|b9AfLn7 zGv+Knp+R!L?!04o_TduIAwiM@Ko<13w=oQ1VBm+atXRtgeU}zRZprF2sL!2%S zaIdFoI+uEIRNu9ENg<~)QlJyQVO2Y#sQ#22C@ufvA`rThFdnDfl(0*wj2a(qCPSl zS;kL_k>r&FAaLg7KA?^AU_K~Hl6wAuEx&c{GwmGEw|x5=u!7P04+?6Pr8;nNP@+7t zi~($U*P_o1`)=K(O>GDQ>)wkoTwSP!QXzpVDFomq$vm>MVMa;N@Ij92f!S`KqW9VE2B{dj5>gt002SGvy^e9L(~8O002ovPDHLk FV1oM6-}(Rm diff --git a/Resources/Textures/Objects/Tools/multitool.rsi/meta.json b/Resources/Textures/Objects/Tools/multitool.rsi/meta.json index c5c4ed87cb9..bf4315734b7 100644 --- a/Resources/Textures/Objects/Tools/multitool.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/multitool.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/94f27c7b25bbde39c1412e24fb32bf6470fcc394 // Icon Taken from https://github.com/ParadiseSS13/Paradise", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/94f27c7b25bbde39c1412e24fb32bf6470fcc394", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/multitool.rsi/red-unlit.png b/Resources/Textures/Objects/Tools/multitool.rsi/red-unlit.png index 71a6ee8f67b5927c7f206be27be23abaa61c00b5..a141fec4bf9b5deaf39c994e771dbe07e8da5698 100644 GIT binary patch delta 87 zcmV-d0I2`30dKfnzk|bp- tk^2+Y$^CLy&Hg}(43Bp`BuUb*fDJgg0_WdhT?zmI002ovPDHLkV1lX&C6oXF delta 146 zcmXS2&p1J)p0PN{-HBn{IhmIX3=Aykj=qiz3>*8o|0J>k`J4qFk;M!Qd`Cc-ajG_- zG*HmR)5S3)!aZ4nb#a17Pg9`5BSz&ZYLa^z?$ xv&{X75ht6?t6i=713feBzTPzf004iIv;nEo2J8>CYB~S_002ovPDHLkV1gJ+CH4RS delta 145 zcmb*8o|0J>k`J4qFk;M!Qd`Cc-ajG_- zG*Hml)5S3)!u{BlG!?8#U|^qcponco-h=&1UtS7fXn4ljQ6oo${78KPehM{Q?n4v8l3~IZQVyS|O zOe`f+7Pk5iutfX@vmhjtF$*lsT5uay7lDV!K>`m{S-_DTMU`00@Ng2>aS~7 z=RPOz%elvnCCjpyr!LHO_XWTLU;zMJOj`&}^e{R;Q>p-5@_)<7TbA@+08T!^<6T(W zfNt(S084E+IM%~iLZku!w7!YjJNp7a#)IOHfRLs{SlS#9n*cBjBLsM~J^qW=t_pW1 zsov1TaS$UN&@>JEhYIci0C`pPduoGLv+&!6fkTm2uZep6QPiC~@USo*B5@U%rYSj& zgXej?wl!=QPJiDQ`s+Ql(Lc7``0Mi!(33p@;x+|D_roC66CE&3Ge&Dw^$-f=?~2X4 zxl2wH!fFKCaG%XSCnE>cz zOR610WnVviOaMU;jOZ@QHjT^!83fy{-4Czb({zh|uBwGM10Ok(x3+A2KBmwPTod5s;07*qoM6N<$f>`(+ A5dZ)H delta 835 zcmV-J1HAnH1lb0VBYyx1a7bBm000ie000ie0hKEb8vp^i_2mJfr(;6A1|>z^dX3m50yQvLg7P@y-9%zefhAF1R)VdzC?^5 zSRh!stPCt@D4R(_pc$J{!ZO`+W@mIAcXza~9`?X;@7%q2&VTRz&$;K$Cj4Vd1Ec}c z00{w_j+UrW#TM>&j+SwIsdN~}ZUk)`0zl3^XHIj!p|YCW(wsuP2GqX^ku(I~KgirF zW4pO^9FQ5RX<*S%CzYjwH37H}N~+fTl5i0@cY5sDv0q9FkV>&t6(}kyKyxopH89Q3 zli9V*2qXOb09N)%R;>qj+ z9Iy6cWJF}l*Ln`yatK`wxxE{eCqiiJvj9LzNI4LWJ?kKbLINVXph+JL3?UqrV)KSj zSFT{PBMa~q8}plcbNC%?jj)yjG!sct0;o!pX~9D=)f;v|&g?8z=fGc(cB1zTX> zX4U&xQ-3UbXD*D*Oem|q(*$78G*8Of8{$0BjhvH_yp&|_!mUDHg?AYKGz+^c50M|* zX2>}~h{LM}-^-2e4&;k4ycrx8@=kHgDdTaaTW#wL*}M=^iv>lFr9@6< zmMQqqbFmVW_WKKIi?wf4N1A*dyzaOg!xWC^Q4 z-r!eh$^Q;CFy}~9;1^$O1KkLJTj@G$8AIEMm%7|7681arT;-RBP%yt?Emkt zC~BCwL>WFDEMr7g|M_$`R`c)y7HpR1xIl!>jCA1Qr_P;)v*$exMR6#XW+cPU#|OxY zObi$ESvCA;lQ4luvT(u0|Nr@h(-3AJDTcpao-zD-afZQ?_hUF*Tv%8bMV*+K7=xsw zBtv<5Iow{15C8>rs`^nd+sw!qE{-h(zFl7qra>X_=lv~)PsbVsu2pa1{> delta 283 zcmZo;+Qu|NrJl3EBeIx*f$smm{q4U4bWFDzvA+^c ztoZqhcg8WMf6CTOM;Ytw?b$9X#OGGFO0wR!-{TN?oF{~xsbAi{VRhx6PmIiV1<$XQ z-ckJU_nMQN-`0wP0=s`bnHS>O40l)w@CJA1X=pMib0xIhKe+0TRoK=k4F{+5y2~Pb d^o5NJ5WIY=L14D6D)fXTY@9E+g649D0!MZp>q^Bv+fXnTm1G8JsxA3sAf9x02 z+>RA&41Rv@(9O4R-$s0$$h;y=fM>_<-T&J+wzjqgJ~?vah=hu&s^qEDryqXftKfi| jpdrDkEMs6`z`(HczYt4S{^YMfs~9|8{an^LB{Ts5L&Y`} delta 208 zcmbQi_>ggeWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx}0fKQ04 zqqApOZG(!MX78jaK(R#+|Ed5f){-E<;Qv6t@Ov9yFi?QAz$3Dlfr0M`2s2LA=92~r zdU?7yhFJK&?eXMdP~c&H`{}=V_AD(=r4Dz&Il;61qW>HaKjH1f*u#C3D>6HtKd&A^y^Ls8q476>gTe~DWM4fk7GtS diff --git a/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver.png b/Resources/Textures/Objects/Tools/screwdriver.rsi/screwdriver.png index 9e1369973418dd4a0e681f2cb730f43b07e17418..9d0d820ddaa8a7610582061de5121e0fe779d51c 100644 GIT binary patch delta 210 zcmV;@04@LD0pkIX8Gi-<0047(dh`GQ0IEquK~z|UV;BXaU=)mkQ7{TdJYd8Y06jfD z|3Ne_FE3o|^XJbfY9u8k8KR@38IjeOl$2mKk0byy3?KOZ{ri6q2B`&M5PQ|CRRr~6 z0~juzIdkTJJ3Bitn}>%7F8<}q7o3JDC@3&Ic<_MX(4j*N=}YP9B!vPCx&SDsH8nNy z8Upe$h@LuiDwv<0oy~Ch@@0}O2Z6zt21das7zLwX6pRA80tN;K0N&L{g44@Iu>b%7 M07*qoM6N<$f+sjqKL7v# delta 206 zcmaFNc%N~CWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx|bfKQ0) z%$YNLdV0Qp{|*$WEwRm-86?~2mhKo zJtkXy***r!t=_<$R9@M)^z82^?VLw`9{9`1SIWKo>C=$^K!X`PUHx3vIVCg!0Na^N AF8}}l diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/meta.json b/Resources/Textures/Objects/Tools/seclite.rsi/meta.json index d466ad62d59..86f25b0b7a1 100644 --- a/Resources/Textures/Objects/Tools/seclite.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/seclite.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/lighting.dmi", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/52cbeaf94322209d4c6596818dda9fb3654729d3 and modified by Swept", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/seclite-on.png b/Resources/Textures/Objects/Tools/seclite.rsi/seclite-on.png index e02d6ee077424adc4cbf9fc449925864a056d150..317e638c18c679b0a0ee848973c731e7a901d786 100644 GIT binary patch delta 271 zcmV+q0r38W0-pkq8Gi-<0047(dh`GQ0OmeLU~vc%BofpuCFuov+nQ`66ZA9f9mn#jx=re6cX@>w!K4|ULenNn5Jp{$nv$Hz#H)d5Pw)4U5KK{3F*4dxf6yV zG)=P^zl->8S(Z>$m0gQCOHGgv+z7$EzSZs%VN8-ljIR&{NT5U5ofMIIp1s{f0mc|- zBZ7HxEu166Ff6$g$xY7YK;SLlhmZD%PDHLkV1mdxcBlXV delta 243 zcmbQw)WS4DvYwfNfx%@-*D)Z)SRCZ;#IWw1%u67LCEd~2k%3`jKlh(RRv=#@z$e62 zT3Xu5%F4^jD<~-F>(}Rzk&!q&P}~{DS{O0K>iJy^%mM&H|6fVg?4j zBOuH;Rhv&5D46K!;uvD#|F+*Thwp#_2TS?ZY5)K4P*4qYezj4&eTQOV6W7fGmgnw_ zUFNpo44ZZ&CVuPb(_SZV;eZgUwbeD5)?*qUmU&JNI4CuhtM+~LP0`!#YC8ANY_Pre h<`ECTATm? diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/seclite-overlay.png b/Resources/Textures/Objects/Tools/seclite.rsi/seclite-overlay.png index 7ea22fa4c673b9069203b7c9aea6b79030624493..a5e9f773ed55bfbc12fbbdce978c3733689ff043 100644 GIT binary patch delta 91 zcmbQvR5?K<)WOrmF(jh(?L|W_1_d6LgWdn@m(11os7=aN_HbyC^{CHbVPGhmd3amt vF0Hp;+1IhT^lxIR7mE;#<7Z%4(6)rL*jZtbwErhd1|aZs^>bP0l+XkK{`Vjk delta 250 zcmV!4MC`~i)=g%J~3jsh5bb&Id;{c!k3?v077q=rL zhz5lU%|iemU<3lHIA9AS1K3BT09YcVc?htuus~U;fQ?-V>}Z-h;PmO63@cY1W%&N> z0K=q7YeDfpgKk+684OrKGzvz+C>RBU9565d0A?&i+Z#0Exc~qF07*qoM6N<$f>26Z A(f|Me diff --git a/Resources/Textures/Objects/Tools/seclite.rsi/seclite.png b/Resources/Textures/Objects/Tools/seclite.rsi/seclite.png index 1064101c28a568b4dc9acf68e1ff423b8e473014..d8ace36de984710ee0aa9095539bc689fc209fa8 100644 GIT binary patch delta 258 zcmV+d0sa2L0-gepB!A^eL_t(oh3%BF3WG2ZhOfoJQ78q$!AEd(^UXT-&3pqN!9fs8 z!BMA_zi=VFv^{7m9lUS3ON_byeiO+s48zzwJ83{s6fPVO!w{|cCCRhmRaMb6O+4+^ z6q3k^vMj0VI;!iM=6MbuIl1-|WFwIP2F2k*p66aj-}l~~EPKoDLc{U9hTthCr);0Y5kH|0#W8)Cf4X&f3j7@3uSO5S307*qo IM6N<$f@ZpRga7~l delta 294 zcmV+>0oneZ0>J{1B!3BTNLh0L01m_e01m_fl`9S#0002JqVK_WqId6ylbqZBq4mXUkrwWQbkUH{NP{a6AZ00JNY0&s4C zIF9ere$zCULjX8&k|flRqDYlxN#9=~0$1Q(O%sPIn^;r%VKxW6EsV3o%90*43z$rVDlCJPdOAY==Jjf};z>twU@!=w@14}_h}yf^PV z@4eXsa&mG$I^MjFzVA!jS`Y-z`#KqB1q+5taBu^sUuK?u?SI)>lu#lY zLL_Tp7;61gyDVE(%(5x?(f4TFzK))yQpuz@LA4u?#{kspbpQr~!IW)g2IAn}?`S

R+>SW-=sx=Xa~}X{6Y(iMk*>dmL`1h2O*FP( z??*K5T@|bwSTkTay($8L&YuE82+HL$#bOcYTLsKyU|x0_vvZAa6RV#!197cyA3`qv z{ZF5Miv8UQ)yf1>98s-6yJL;-)`X^@i?Yx)RO$AhP-d9!f&Nt=u$N(mRud@?(f-;Q zkg1OqV-wCH!jp&4YDQxhhs+ZE`ulpnRS~*(gKBepnfN=Q?Ez(zWOH3cjxRI)oOqLQ j{Qn@$TZ880yenP+m)WPJs1y#N00000NkvXXu0mjfMi}PH delta 749 zcmVA5 zY33`l*SfKbr#7o;zIo2<+im8(=lWLZ55xDq@j2gbzWL^RyMGlnS^p2f;NUenJbWj# zDF7IJDzymJkSBl$e(8Ka^mR4`o&{F`XYhj^hMWr$LJQywj+#!Bsz4|KL~xdJAcTNn z7*&H%0u&dH(P~4u)N4r0RqR1iWz^akIZP(TPjZ_UEZTSG9m&fc)5 zZ-EVAtM^!pW`DkA*PR6|z?F9ca<>x+3y$_Qa$9@1na^Pc2x;OLVGs^29uo?|oWN@W zz~C3dy~T;1IB=iY8WzAVM7u%ZGuB1k>f*smi!?@mUR~hOIv6FuliQzRqTiB!ZghqF zXs;hSDf>XVFu3>|TEif4_*4#FFEwbtBT9g}=f9yg-G2%qov@9Km$tqCV3f7z()Td~ zs#?Hzr%(Ta8nRD&eU$+9jr-x>bQX6hf;xSbaE(9kNy7LB@T2m;Sd1VtwhH)kBS$b03dk^2@w- zH(#4uA;U7zu$lpr^?^(-!a!%hO%-JT(|_-HH)btAhDucNH4GxSD?ow%km>g$adpKt z?CT`HzLZ*k)S?xtOKhjn@NVde*7IRzTd1xM#MKpwkNX4nJOaFWI1mH}1Arjq3gFyr f(1CpcY=r&-6d`W^T{1fl|v8Gi!+002a!ipBr{06$PnR7C&)02vt>AS*y7CMGH=DJv=}F)=Yc zJv~H1LPtkONHzdSNJvyvR8><`X=!O{Pyu&$cYIz1jQ{|db`H;<52tCijsO4v0d!JM zQvg8b*k%9#0Fg;VK~y-)-IGZYLLm%9L7PYm%^$-3&*}lbhJS?%tIW1vCFu+){Zjx7 zy?4a=^bRw#Pk@`bk)n~j&FPm6?wyoG@{!&Bxm|lOqgYBQ`8bZZE{rNA^io@_r=0U* zSP18ZI;s>D!PtjzE;8Ue1E30#4X`S-2{z#y03aK}lVJ-14z;iX_i>MbQL$Rpk3Q-J YRQd(HNLK_J01E&B07*qoM6N<$g5soRH2?qr delta 554 zcmV+_0@eMZ0=NW_8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00HVrL_t(| zob8p%O9D|8#=oFIf}qkxp*=|37@~_7NiL-RfFPj=H}xM_%c4!vI>ANKCO0(%*`|F+ zCAnx}2||#NIHg1?B!s)$Tx+IreB@)ajK0;mkKy~BJLlfhiGLr~Kfpi0?*`}|G!Z_2 zON2UF3P8N;N*D=^RqTYxOvN=6{h}J z!Cv#Ul}Nu|H28(s;Xy^fvL}!Y0=I4-mbTqsHhg%^+Vk_NR0c|ApRi9H^Xt~Bukmtd zAP?vbCQE{p1%J4B0_JQsFg_m^*4EKw&p{U7_%A0638Y0eGYF?`< zUPEent<{prXjCwl?xAyyKz#cUQF96r&gHPljh%#GZ+~=LST9urvI6iBG*jN3uY7Sa zHWh%19`hy#VdBh<20hOFfqeE9YNZtbRDAV|Wl$)vuU31}G)^1~l3SY6g%y`>Fvx-g{laSdQ$g s2KY21k|VJ!s;L*C32L8r;LifQ1C@uwSxGc<%>V!Z07*qoM6N<$f+Q9AIRF3v diff --git a/Resources/Textures/Objects/Tools/welder.rsi/meta.json b/Resources/Textures/Objects/Tools/welder.rsi/meta.json index 407f85d4cf6..5f876da9ae0 100644 --- a/Resources/Textures/Objects/Tools/welder.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/welder.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/199fffd989d6f7fd6ea9c5188c875137df4f34b8 // Icon Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/3c5cb36e811725e1479c4c025b04220027230632/icons/obj/tools.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/199fffd989d6f7fd6ea9c5188c875137df4f34b8", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/welder.rsi/welder_flame.png b/Resources/Textures/Objects/Tools/welder.rsi/welder_flame.png index 6c8ef525ccd7a64c212523ae35c1a3adda12ddf2..20aa48abf68c85cebc135633200b994f8efd9c66 100644 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!N$PAcy*Sa5Rk)J;1OBOz`zY;a|FVdQ&MBb@089@=M*si- literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YsBY z)5S5QV$RzedwH1*dD;@AlX$jqcsm>wIqCCJB;>fr%_iHPUY4VsR^d-dC(4^wiYz@@ zKB<`-s56_fs$5?=TuoK%md|p=RmUG1PES)pcW)hV4?82an}9MKV(uae0%BFqJXu-b)bDx3)Jzf1=);T3K0RU-PTd)8C diff --git a/Resources/Textures/Objects/Tools/welder_experimental.rsi/icon.png b/Resources/Textures/Objects/Tools/welder_experimental.rsi/icon.png index d33656a0be4000ed43d259b1404726e98595ca41..446d4b21bf7742ce04c265fb06bf89a17c91643c 100644 GIT binary patch delta 550 zcmV+>0@?kG2ebr`8Gi!+005o0f$RVP08UU$R7JqRz$hpvXlQ6qP*5;1FhD>+I5;?F z0A@1)W@Z4)nE=e0GtA60%v4lVASghY0A>I){{R60005a77#IKmW=Kd#W&i-0007JY z03aYB+w%7O00001bW%=J06^y0W&i*HczRS=bVOxyV{&P5bbo1YZU6vyoKseCa&`Cg zQ*iP1gNKs3ILmWA5}ybnxFsx z0T4+PX{)+vJ9T=g>(?`H=YazU{q6mulxZ_iS9E<@mi~FFw5w0VjRI69F*t|PSe-O8yu7o0LP%gW4;bd5rc4oVR)P%#?1x-3T=pSQ0}A{ z+7RQQ{F@{~pDD&ccXIx3?{FY={#Txql=MvfpqZcFP(PR-?<&|27K2bfSPX*wU`-I{ o2Wx`V4uT5Pz~WJ2P+g&Fp+L$x{$; zumA`+SO5eZEP%XFRaK+!EnB-q`t?*IWVcb-Rwk3FyA8ki6i4GrM) z+{e1h`pK_I@?WV!MrW)S$@U4oBNDI1r_dGIjy_irfXIIyy@{1?Nj&*Ji{Y<>NMb@1Fn7c% zsACc{3x!dAyR?3K`^hf^*boOcKEHy)c_o2OVg&4vXS2DIyxT8E^lS5jOZdsJ(DWms zY&@r{F3G7udY5+X?h|?Gr4QosIDHowgPteT5w&SuLB6xO8IL+Tv}|&*H!z=WN{fAvGLs=p64g ze@y{8-}hn~381}@Hpf`%#8Y{lCwFoW;01qG0mSySAL3mj_05et{jh%U*PH>3{5IzV z+~((Bg%NPD00=l(00bN?00Isc009RJATQV-!2W`LW|=eE~8Z`R%ShfcPqT69|zx_6M*(z$(}u zQ0*rB1Hk@(vS5FJ0qhT8e*pUf;1<{)-~m7T18Nmue*pUf*dOp;g9Sjq!2%%Q_zV29 V_Xtar;P3zd002ovPDHLkV1nJ;q!a)E diff --git a/Resources/Textures/Objects/Tools/welder_experimental.rsi/meta.json b/Resources/Textures/Objects/Tools/welder_experimental.rsi/meta.json index 1e4258956e3..75650c19288 100644 --- a/Resources/Textures/Objects/Tools/welder_experimental.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/welder_experimental.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/199fffd989d6f7fd6ea9c5188c875137df4f34b8 // Icon Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/3c5cb36e811725e1479c4c025b04220027230632/icons/obj/tools.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/199fffd989d6f7fd6ea9c5188c875137df4f34b8", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/welder_experimental.rsi/welder_flame.png b/Resources/Textures/Objects/Tools/welder_experimental.rsi/welder_flame.png index c4cac4606ac872e32a0a3b4df7fdb4540bc5087e..1efc7aaa60d236c09804dc0a9323648015d16b1c 100644 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQYryHA+84w9GEfV$B6_Wn(<>s z!Ve&skdW}>$B7?5egGvrBz~NjaoNPu7pR`GB*-tA!Qt7BG$5zCDkP%BCAB!YD6^m> zGe3`kp<+&OSV2+g_bJZhXNCOYs3r?@pfj{QT^vI!PA4ZwutqdY;M9sYVVrvYo)P!d`?lO? mSuTp02=lr*mx}OMGBDhmz`?N3ItWQ<|33|HvxvXV=-0C=2JR&a84_w-Y6 z@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoPXky#FA7XQz{V5ArtmH< c^elw{0LzCCj!+{7kpKVy07*qoM6N<$g4gVLr2qf` delta 448 zcmV;x0YCoP0?q@F7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0004iNklV=>FAqk0`zoGDgNa-_7|Uz2 zF~Xt{nD(OvvzZa7umZUGdV5FbSI>_Mf(%TW&ttWIe!M~8dHVOE@2d)q<2VOW2!Q6g z0$x%9y1A`x7k>*K7a1D?IOlk=m>wOgd@nbQV1B-4UiVL z=S{mUmJJ!_01rfRz9=13AimjGO^ft@Q^;MsD|4?&?cu q1wj7~GPyHZJp$LJr2(o`1Mm&4YnlqU^tWXI0000HYaZfQYryHA+84w9GEfV$B6_Wn(<>s z!Ve&skdW}>$B7?5egGvrBz~NjaoNPu7pR`GB*-tA!Qt7BG$5y@DkP%BCAB!YD6^m> zGe3`kp<+&OSV2+g_bOFCU9!Sn=np2f6s_}>U~@8 nvn&@yOoVyeoJ&P`EEyQ?O<+FpeccaPpe_baS3j3^P6uG literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YsBZ z)5S5QV$RzeYXzAV1==3=&*V7en8!I$lhM;tUGt%eszUIwsSUdwj`*svHtZ;8-H`?N3ItWQ<|33|HvxvXkc z%p)V88yj&E5kd_OCI<(5dwZxf7Hj|j00DGTPE!Ct=GbNc003`#R9JLGWpiV4X>fFD zZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDSycTa*U0*I5Sc+(=$pS zoZ^zil2jm5sk9(7FQq&+CndE=iHkEOv#1y-YRJWzR+N~V3SlcNxca$(4F>=PKOC-y ziw-XU005XtL_t(2k)@Ea5yCJGMHNqA8^fms-X36Yd=KD&eb zbE9`(Uy_Ob5O(*+s_qbz??~SYdc+J<+Q4+po2H9_nQnmAX;>Z#P79c=XVjV^5D{3l zW;pTYpe^6&;>e*4F%QD?_2#l0EWsDxB(&Pz??{i(=5;!D~Q# zP>hJ|u=Li1TBif|whh&OAFN&vjP*QJ?rvZlDO<4^5q~-7JKZiogs{fre9rz^6QltR z1rQ;`CMCj*<17#Wle-Sg0TAr~sFmdI9}~lJAl~X zLIGgmXYy*R+5mKF3g8JKA5dOrfHr`zG+6-j5BZnQ0AB$4A3=xnp#Tg5G;6YI;9mlK Z0T=1hN)URuay9?}002ovPDHLkV1hy&?hpU~ diff --git a/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/meta.json b/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/meta.json index 87568bcddbd..ab4744aaa63 100644 --- a/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/782006a07ef7f16f70128489b3e78b210ee4bbbe // Icon Icon Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/3c5cb36e811725e1479c4c025b04220027230632/icons/obj/tools.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/782006a07ef7f16f70128489b3e78b210ee4bbbe", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/welder_flame.png b/Resources/Textures/Objects/Tools/welder_industrialadv.rsi/welder_flame.png index 809abc51eeb836157923b69ffbb551e0bd64a5b3..d8ba3f28bdc7cc71fd50d8352f699f748e44cd3f 100644 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQYryHA+84w9GEfV$B6_Wn(<>s z!Ve&skdW}>$B7?5egGvrBz~NjaoNPu7pR`GB*-tA!Qt7BG$5z0DkP%BCAB!YD6^m> zGe3`kp<+&OSV2+g_bQ)bPd;iXEW7W+oBs3CF9Gw|9WyWl-B<8QnmON7l zYicRw**Qft=5Ne_X^adU=M#*h`=$22WQ%mvv4FO#pr8dXWGC literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YsBZ z)5S5QV$RzeYXzAV1==3=&*V7en8!I$lhM;tUGt%eszUIwsSUdwj`*svHtZ;8-HWk XIQ~%k!X785D3GY9tDnm{r-UW|X0lPz diff --git a/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters-cutty-thingy.png b/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters-cutty-thingy.png index 09cfe9a497ae2b589ee05b3495f7618f3e1e0ec4..f331df4390e4cd2193af7bf878126a071b8badc7 100644 GIT binary patch delta 200 zcmV;(05|{d0oehN8Gi-<0047(dh`GQ0H8@kK~z|U?UOMM!ypVrosKNbNZi0P_df+U z-~ueHRF2ZfaS|k&sp@|c!XVine}Di00Dxbo>yc9GcF&9x%d7!0#>+y2_kNh0b0(|# zniVgl>;-fz;?B8|_`=LYH%>f)nOFNm24rj@Q5sCVBk9f!i-b3`J{n@ z5uPrNAr}5``w#Lp7;rc*eEffZWYm>#m+h(Q!u-|d$FyJSh~+H&u{7aOYues83qL8w z-u4F*SNbrWGoIrnyQXmM+2|GA2J_=~Sg&xo-)Jz)r_L~e`{;A0BaA;D@_pa9B$p9r O34^DrpUXO@geCwJRZhYH diff --git a/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters-map.png b/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters-map.png index 4ad153c1068e8f52696f5ef2a280a419dde4aba9..a68f4c12577f44b8d8cce23be32ec1556b0f85ca 100644 GIT binary patch delta 305 zcmV-10nYxL1Iq%CBYy!BNklZq}6o!9jvcSL;DQ{AyrhZ6db(>kO|<5cF2(TEzbu0-v54VgJBqkxqAZFfH%Mz0207& zadox!ue3?lfPIbUSc*p+PZbsqp*Ozo_9UW%)*4xs`K0tjw|@_)`{#I$Llr=Tb})W? z{a_>IX!ayYyguZ4-V@Q8kPANhskkvFkWyOu-W^l%D2h;)-i)Hwo0{~xLq~t8wZM_==IdNWsK?6oxBG~gpZ-(j)-2JsBZVP}jRTHAe>k$yi00000NkvXXu0mjf DU3ih> delta 385 zcmV-{0e=3=0-FPnBYyx1a7bBm000ie000ie0hKEb8vpVQ!P zj5=V{0izBWd=5z9=l)NO#=F1&FdY8&laZrUn>d7k^G)U~qKy{EzGi6bC?q z6mJx;SUQ1y0Wt{0M`nWn$YCI`W#d+c$B!SN=)H66I#?~TBQVkc!Fb)fodISsObEnQ zQPcdNnUjrSG00Mo9Eir|V4@NsC~63W0LbUlr%VOMy`{M|!;@!E!43gg4pIkm1hVBA z4#1rVk(8Y|#Cia;5CmdlQ{V=IEQSG)ypO*(iYdS}@E_zboN0jAL?{n*1WY}yTmS+f z%g_PdTmXuHrtfS(9}&)q|2Tg^(#x&uIMv+2BZt)iAaL;iXW|N%ZwyocgRdwab-<_t fMjbHf0D1!eas!}p`@|`?00000NkvXXu0mjflbE8u diff --git a/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters.png b/Resources/Textures/Objects/Tools/wirecutters.rsi/cutters.png index 68c8a3ed715738ad6d3cff7bf54aece317ffea32..3f79cb157cacf02c6412154c488d2af8c68a7928 100644 GIT binary patch delta 211 zcmV;^04)FK0ptOY8Gi-<0047(dh`GQ0INwvK~z|U?UcO@10f8BeNjp}W}v5Y#|+HC z0Ia|cHwkMn12aHHPvl4^CDP?ja&(d6uX(P(etrOgAPB`b@Tf^&}7`lI>Cfe->H zrM|NQ3Kb$kt@XO|J*5nAr~kASG$rA^f2h+4URJP8yqdpyAaq^=~$FZloe{|pXVE588woCO|{#S9F5M?jcysy3fAP%y;P z#WBRf|82h^AAB)v%UIhk){-2IL>zexHfcTVfCSHk!OF2W>c3))C+bh4f zy~o-^Y|$iUrgQ4zB`KQ{`*{9!PV!^n(7hOXTzpEj;}RyP``k`{6Lo@t7BG0a`njxg HN@xNA?kPvt diff --git a/Resources/Textures/Objects/Tools/wirecutters.rsi/meta.json b/Resources/Textures/Objects/Tools/wirecutters.rsi/meta.json index 826b1c44ca9..cd294908267 100644 --- a/Resources/Textures/Objects/Tools/wirecutters.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/wirecutters.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d // Icon Taken from Paradise at https://github.com/ParadiseSS13/Paradise", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/wrench.rsi/icon.png b/Resources/Textures/Objects/Tools/wrench.rsi/icon.png index 1b8a2697e25e78a3b62154d3f105b4882a5027f5..4d24ac7fae1286a77c92964bdfbec03ca4e806ae 100644 GIT binary patch delta 214 zcmaFD{ETseL_G^L0|P^2NcwRgr4`^4;`+bgznYp_NJz-cnKR|&>hUko)TsK3$9r$#! zIADr_LBTnz)+9sb=F3thsyb23%TsjqX9=;2g)p+kPv>62q_dC5go)ury8OIUQ5Ghk OwG5uFelF{r5}E+v*+~`v delta 470 zcmV;{0V)3G0ptUa7=H)`0001UdV2H#000SaNLh0L01m_e01m_fl`9S#0004&Nklk`N04-hD4~e|x7+if6O6{Bc1P;s*e`oecm21{q>F7>PnedZ1Lkm@^Os zAvGcaJnxMT9A^e`=(sAE+o#voGcg46BNYI=cxqgqgSj@2Yq{{`T;Q>S2@@GX$4yvyZFWiXw}U~)Ug!6>d! z5acGraC2po-hwAKlUM@w^b0yjICj`hFkH;2xyWFVv`~1;;mOPl@A`Git&-N=1e(s^ M>FVdQ&MBb@0K5S)Jpcdz diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/closed.png b/Resources/Textures/Structures/Doors/secret_door.rsi/closed.png index 0f60f5243cc68934e4abaaa02445eb6b1b36b864..b68b06f10df2173eed99cb28d5f2e1b887e0b5f8 100644 GIT binary patch delta 154 zcmXS2%{W1#o`a2nfuXpn>I;x!EDmyaVpw-h<|UAm>gnPb64Cnh`bJ&`MFHl6yN^qn zDg?6ro!;cao1(C<$M+3eSmWi2xfq_qCQaX_03GfMVH83!6c6PR~u<-Tu)m`y&Ay8b!)5S4FVrp_i zLt}tO1GmANCZ?L6{{amb>^vk2+65nT-)UrEI59QLQE#eD4NyIUr>mdKI;Vst07cCm A)&Kwi diff --git a/Resources/Textures/Structures/Doors/secret_door.rsi/closing.png b/Resources/Textures/Structures/Doors/secret_door.rsi/closing.png index 9dd42badabf989bf60e5806b1583651ff77a9a75..0bb895b050f0d11e75d4ceed4e62cdac855c6d56 100644 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^2|(ofA8$SVG)Q<`o&VHXi(4;R@40u;x@yn28awv$nd*l(uDafL z{PB_CG9#JQRk^pF>YlAmu?YKm>t)HTic@}V$)W4_-hbb@{0&I(pYI-LlLZV0Tnvke zB$CsnDb9QsaW#AW_3THQ){=dpd%yi{JE#6%6=bp9{PR$Y-`3cP+wZxXC-_|^t53}B z{f8>|_b)!)di+tsX8By6>uX>B0a2 delta 549 zcmV+=0^0qA1hWK?8Gi!+007eJf;<2K00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000kAOjJcMFfc#`a=(`^UCv)SO8ZadN?voT!dC=Kv&z0gDHJ zP*SPRDM0R76tH?EKu>7SF+gllz~-p|S^}M^bmW;U0e@5*il+r&l4v2f^E0N#!a%j5 zczOU@j@-`SJ!L1MFE?q1}Ocza|%E$3|Ku9p!TP84tQhZwSZI}Nmw75JmJ=nW7WZZU}oXkrgXR4=*V@O2n+lz)=&58mofxVY2 z+vIIpzrSy>ZG9m5M&$A_&!Bf<)^nBi@b_%JCTypsWT??+J0)lxyV9bU?B5KI1+Z4W zQCylLbwDmD&Sa>L$eziz;k(h*`ZLTn2bgVKfEbJz4oK}eU+j08;akDE zpPxh0-z2`z1!|r5e5YPi_A16V3%{@9`gEh3S>&(Ynl|UXZ9o??c)I$ztaD0e0sxb=ZN&^=a>}IR_^M|M)jI(J%3XaQkgp6o;ec)3?=6WWL@`mnpgbeX^Bdhe7*MNB!yD&8I4q&LkFI z$o%#FxsI&hvkew6zE+h6Ncy)}>hM*`v_s{86n;?PHDHinV>rx^Ai==H+>pp%z{AkS zcmTKH;#FN`FPy;U?7uG?a!fdpue;f9zGk@de*rL4j-P$%N0%9gA1(N7W4+?X=5?=c ze?MXQYWsPM7u#~xOOrsV4qw@H`Cq2~zGdIn{oDTj+qVt-Za=zMBL4wR=wXq(Kw@~j zN_+e1T8Ea{+KDo9dfyoZ%f7l6RqVLK?sDU*_{oQGMeP51S&8=tSY;0}=DJ_5J+OT5 qk6HJ2|GK~L_U*&J^12c3(Vtkmw&2XHnTvsu%;4$j=d#Wzp$P!4QQz+X delta 568 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 HMVbEwwkFzU diff --git a/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/state1.png b/Resources/Textures/Structures/Walls/reinforced_diagonal.rsi/state1.png index a0ce5d516e8da1f72bed5c044fcf8019a2aac9c8..814483e1a6e32d29bd6c9a5648a3496337be5677 100644 GIT binary patch delta 615 zcmV-t0+{{9E&l|NBYy%$Nkl2VKoI`XOqY?LaSAW18jfT)g#1aq$fA9A_Ai}%duE%z^0KoAl!<-}R^qg>jURo{bE#NpN zoGT-7RvQw|mkjzGIY-!a_-nf@9iy4V<8}v?{Qo8J z?6?w+YR@_${cwsb=#vUKim=n^NWkZGDmD%b18HFBS)jOgI2?++lPXUHR5<@+qQKc& zC_;c3iD1=gW$Xa7E`*;Hp$QHz^xr64QwJkJ5m@Oh?&C3AmG6y{HjE3W5R(X2yJ}P6 zcveQ>Qn*P3;i^rCO96gx7{fx(&D9m&>Tudkwm*9L?c6Kb8H@k`002ovPDHLkV1m-p B8B+iN literal 5829 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 X_sHm<;lFx500000NkvXXu0mjf_TU|m diff --git a/Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-3.png b/Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-3.png deleted file mode 100644 index 7098ec309a42368ab631fc9bca706b12cd0010e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmV;j0!{siP)9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyA5cGLxYb`^0 zbu+=x0XgEx!7X5QRC55#a$+1omIGoFfdz)50^D~?7tUgM^5ij`kL+`hBVa&AMwTHu zJ`E*Q?%#jFuy{VCfFn8t&>ev6V_?~V5$vZ=><32&wh$r80ic2iR1UxrAvOoVYz0{a z3RYO|0I@+1K$b^#A-V&wmIJVo5R?r;0Gk6qK1a3`oegscdcs6@04N*cED1qHF*XOl zf)!)|GC+0!OdKSJ9t{*Z0NF6)V8@pCkmZr}QRD!SMaUt5uT+FNfb0+;lnBvNKei}< z0S9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyA5cGLxYb`^0 zbu+=x0XgEx!7X5QRC55#a$+1omIGoFfdz)50^D~?7tUgM^5ij`kL+`hBVa&AMwTHu zJ`E*Q?%#jFuy{VCfFn8t&>ev6Q;?6)0W6_n3lX9m04j(; zaRAnG09F!$vLOgya{#c^#A+$b0U-MHiTxM}6FCGx*$`(*2r7!PIRNG>^q@x$0a%oP z#Lz>5A_t(yJ-$K-S5#2s0Fcj+Lx30ukR1Yq5+NuJAOmbsKqw7>vLVjO2)QVxWiBA9 zD5iTk0ICgk^x&qAOLGl z6KVjE)g*&eMg!I;9k6COtY9K}pVm;=nMt*LGqJ_Ao4JqnfvI{;?+{d@NqCQh9MmXMYb z$EpA6vzJ)qh|!auoyVZ4qy*Lvas=D~Aj@+L3mC3my2PNZrw67%0K~=yVDd0ILh4{< zg6PTp6TprDJHXV!@jr-DP+Y*Uaoq;E$PtuS4s$Wg5wNISxnU23y`3dt2iVyA5cGLxYb`^0 zbu+=x0XgEx!7X5QRC55#a$+1omIGoFfdz)50^D~?7tUgM^5ij`kL+`hBVa&AMwTHu zJ`E*Q?%#jFuy{VCfFn8t&>ev6Q;?6)0W6_n3lX9m04j(; zaRAnG09F!$vLOgya{#c^#A+$b0U-MHiTxM}6FCGx*$`(*2r7!PIRNG>Y(bALD$qlL zA_t(yJ+@#+4gqXwfg%The25$Z#5jQL5FnHYL1};xAe06`*$`)Cgj^KUG8Yh46w|#N z0M&-bA%I>NP*M_-RTLAdjA&jL5K|o!TM>a8CPY=opw`NOHb`(b$$+gQ5P&tO31vmH znq;ubXuuk!1J*2u^^69rV=^eZW}rkhpq*3XR88;hIRKrH<)7+hcJTn6dzS z>i+l8E}#+@009((JnrC13AYvKj_K}!e^P;PUVl!(Uk9<vNx(1+>blm~N3bkQ`?qa7&N0RMS(wW8kid80 zMc_r?_Ye?5=zj&wiqL1!b=|1OYPHffEkv&C-dGt1m&;{VUYDY}T#!N~zlxWLbt~Sr~?a z5CSRX^E$9vQI;iL*U`2uP16tr0q|XC!9*v2&u91|@P8ukKb|VZ6SfaCVcWKtritJ- z%RNF>Rjk)*eSL)fBfKZYqY7z~5QHIrq+B$XODQSKlFeqramL?u9P*+dO_I@AuD77b zbKbUF(j*}-3c9YFT|>Hwv=0lZN&o-=07*qoM6N<$f)tJY#sB~S delta 152 zcmZ3?vVw7fL_HHT0|Nt}$fR^2#S`EY;%Z=EU}0h5?Ck98>nnU|+kc>VxTlL_h{V+7 zga*cqp$P`9j!cKb69c$doB7y|u2ir()9h#{dZdHJNXfA$L_s;{KM*Wyl2{+MHi|c? zrMYLPRRGTp;|F}r)}rq!W|TjWYpIr$<1k=gIJh}S&|aRg? BGI{_2 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/meta.json b/Resources/Textures/Structures/Walls/solid.rsi/meta.json index 246ebe31b94..85b809570de 100644 --- a/Resources/Textures/Structures/Walls/solid.rsi/meta.json +++ b/Resources/Textures/Structures/Walls/solid.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris/blob/c34c1b30abf18aa552e19294523924c39e5ea127/icons/turf/wall_masks.dmi and modified.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-0.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-0.png index 1e2da3352b75d4ada2d78b93cfa36e15d6fefaf6..828730d9f3d82e3f4e25ee4b0e4f0dd50970d037 100644 GIT binary patch delta 880 zcmV-$1CRXS0s97!7=H)`0001UdV2H#00TlvL_t(|oXuC=PunmM|0Sd}EQv`Lfk3Ke zMRa+9zE=GIkGvNiI#A>h4XG$mU_Z$^w`bp7&Ua^@G8_&wd?K`b zLMeT5F=Gsr(iiD#z!=*YKq*BShFHWgEJ9j0QA#l$kKy}%D}N2c@L9#Vj@)3i$QTR; zSi~_@Rc#y>=jU)7rJAlq^>i1>b!ick49( z;LFZVjoP-2D2k9}^{^tA1ppY0MkOz6#YMZe{pgJ(0kJGp#jKx{f1?yx16{AzFio?j zTzQh2>kvXT8-D-*s`_{;8Gwg}hnleWK+`lSyQmz%CI+fd{)+0CWwjdcQTRU%I5;?{ z{io|XZfW_=jQ-`Zns-=S^i~&5EzC5!!R~qm!<#!&N+f0z~SLx z&A_Y6OIb&bPfnxVdDW3q{#vaNF5d(d2=<`}?_B;mKJis}} z&97gL9%#*iBuPql!JlM-wzUP*vKq5M)&bx5aXXn{yW2&YB(?gT=Q-yblgXquIOnZ( zKv5K=NrLTe7q^p%R1Oqk;QIO+w&Ng*A{Y%Nq|*!E`!prAPgK>s}#5NkaWak4ml12lVI9d_X*1v<=D| zToX_p2aKM+K!H1;?kfuX>kZMm8t!9!wII1dwPYEC3`#|*!j`%L;+izORVftD00000 LNkvXXu0mjf(}+4VpU;txy%4xSt632YMy)9HA?*Yeg z3Ke+QZhxaFFEb79A0D`zOrBqXmzsn}M@KJPfh0*vJ+KRRcXxdI`t{E$kbUPt5YXv# zN~A#$5QZVH>y{ev&Ees%SKx!=ki>Cmey@M$K@gOla@QPC6on*?c~h(5d0wFc%3v@^ zg%Dg_U2$-5fU2tbBz&l-!0$}LLrp`k*YSNHDSstWN={BrRu#xpX7GIr^P({6Wbtdz3Ak)g05*@wSz eI8|Qzc>V*Yqj)Xq?1mr!0000X&{1 delta 250 zcmVn+avq?ljR49>ckxdGOFbsubboRdD0n(y-!3(H(fT1w=zsjW54yBowMZ*XAX&zCl z&V@>Tq)wEseF{x@BxV3CDKrrw?mXap3Vp`}955Xz0G|OorgMGRhXW2baPyUQ`U1{- z=3Ky3wm33aYtSp;`3fQJ9Kve%>&x{ul}aVkPA8MhwW_KfaYTqefo>R#$74$6G9|-cv)vvk zR}_U$mc{*k55R{)Az{nqGPk$4gkiF*3|$9cJRToqId}L_sa*b%4bQ{SbxyJjIMSf*?p20HCTrzDfu@K0YRby#={kE{=Uj4m{VuDU@GA{d%lS z0ly3HE+A0@0QGtu|EXvqj7B3|*TpnV+U<5?&1?R8z0Q0-PZtnPu<2yNMYc+%rG@8xC5QF2Af*E4W_ex4c7_x+fBFc`c@4sdaC@#`|M+wB+(2K0J8G);>?hi%)L z0`Bha`1{+p)C?${PA5F0=QPg#O&*S@U z$8x!h3o(&_PnL!6d5QUb*yq#fH1$oh=76Fo_@2if`8-m}^bFkG+;DbwhN`OZBz#E8 zz*{Eac`k=mEHax19%2uC%rUajK$Fbt0_ zfNHf0JfCV#ZRAf|o5pb@z}s$VwOXuKE7qG$B1jMf{N*@&-|YZW?N=!Yf*`Rr3`5qN z4eQk^aWIJmLn+au}MThR49>ckxdGOFbsubboRc|1Ej^-3tm8_2N;C8|5YZfR-~Et77ZVy`6Fu8 zx%f~RsS~AhpRECp#0-EXTLTf|E&wiM>pN!P0Ka7ep#TK_n}}dDFqM diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-3.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-3.png index 2b48ffb696b72a8846a07c9bbd5e2d124112e184..ee44f0d40055ab2a033294a3def8d84ed4a8fa1c 100644 GIT binary patch delta 946 zcmV;j15Nyf0=x&17=H)`0001UdV2H#00V+^nXyFeb#NL-}+eQen*S-g~ZEph*LNK4tS$}yRC0)-QB!plxnP8e` zuAR^4JBdS%Fkm&>(Q36=c^;~&WCcxJ{`wNwX5)|O7(i3r^iRC)oO|yz;#`^-L51#KYu@$k6{=9bi3VHkWoCW*Ho)j zo*o~m*XvRVRoE(=UM};z*>IS#lmIR+E&!<4>i{$w4H}I`sy_>d#Ujs}4SKoEWHOPG zEi+)6ChqMmwrw+;PBWbthC#dCmR}sj+1XiUdx+U|if!Atx3`$4nVkXS_!uDsjb<}8 z*s?4+=YRA0oXgA06hYWF7z{ECv(aoKgupmHj%7fLX5h#5H2{S|fm*F5$@~5O)=?zo z$+p>S20*{xXEYko>-Az82$l5v$;tiEXc~^=d@KV|xUP%qy0qKv+<(42trT?kjld&qa;Q`_-p$suPql%3kn z?tfo`oeb-YUGXDG*3-@aeBY<6>+%r!U!3KQS$ZC2U1u3Nj)#cVz;dyWzk?u%Jpk2e z71-Wtk~Zv5j*YIcC`T-S^=d_{)nd6=u=Ko?6W{mwdotni=?Ngy{$tztzMmQ!1OZFW zW4TzQE+#U7@M2QZbtx9f=ljVC_xJa?wky$W=8pA!KgJOvwi)fi|8Y50e)skKUr6y> UQ2<)w+5i9m07*qoM6N<$f*;z|)c^nh delta 246 zcmVn+auSrBfR49>ckzEdiAPj_S@c<6-0EM{kBwhfGCotLjUu6r5F?44hXuhQMkEqw+ z<4a+pL6jy}tN~BN41lFr0}Lw_i9N^|U9KWp(ekcN87=H)`0001UdV2H#00W9iL_t(|oW+;VZsJG~#(%b$v1S7XgdA}| z(+5}|2vWo$Z-8>*&NFi7Xyp}9B$5M*4@`Wp(n8^1cI0ei?_tsgW1D1>8OovNrXFj(#H&m zS#LH8&oxcsZ`M7gm4QMpq25smE@vsB{H zOz=YfRS2RC8Gi%;#bPlTMp%B~NCkJ*pa0u;} zP`_>~*MYadah#8+f6M{Lap?E^A9f;@0|51UoyV7?QMkUoMoJm~9}EVu91e%^d&{yo zKR?g3>HB`R1FD0$vl(B7NRb0bDY?A7L`sS0d0bsxC4Wezlv=mjjmG0~=1d>ATWYl$ z-{y0gtybI#b=Y+{vs~sW2sp_oCFO)=Su`3A48x$=Y|?BtF${xlw;NfOm8l1CQY`Wm z1eoPA)9EyB*>MDH+vfJ>1^~k_sMqT$BdX25%s4S-Sr&P-2XJSzxR12Y&axw5ot`3u zpxJ6Alz$z^iPv08$?ffJia@;^3!0L(qlLzKNbN^9Y}-_sR;bH*NPp-!Llq2!${3sQ@@I_Y>8#dk%BIO`?>MfI$br>z8UK!= zDDeQ)YBgYYt2vZv{7`ql!uB~54s16YI-L%y<&xEUoiY-JA^%LL{QLboK&JdQpA&{* zN;irkR_isZn+avPnciR49>ckzEdiAPj_S@c<6-0Htx?NxXm>Phhh5zseSrje^q$nlI_lAEH{F z*PFsXofwTSg(W-?GXRzpmWU8{0q`M(y+Z;X7}pd)$N&N3(sD2T3Xc=`Y0uh10o(cK zRKQreSTl%s;0*AztEQe+_f0M!vy1a_fr#FK>Ch#YWI!%b0Zqxf$Gzk<{T%btgXQ6& zUz7els@9v~UdC@0RIjjEa(#ySP|YcuW7qltZ6P+1f5Ab700000NkvXXu0mjf277AT diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-5.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_construct-5.png index bbff6b658403c39270cdfb3c43bbc20a2e67602e..be5832d69d35ac0c3660ec69bd4e9d2cf3f15dcf 100644 GIT binary patch delta 1006 zcmVXWQ7tY_Zr z?9A-0(Cv0J{6k3eg%EP`W6$$I2stS~0?+ey4iG}%`##oD1b;@a5v7AZxW6=JPqSte94+q5uFUlSwYh(*8%)TJ1d=aST;aaA+pk zl7A%x8Am2bf`3Y-QXm($HYrD%rhEqgKos9sB?IvG_Es?VJCG!a+1@7yu*-o%2!Dk7 zw5?JHJ_5&a&QU+l0mpIB@AuDkqL2ds&}cNU*(MFe{rx?{Fl4_6g8`GaZL|M%UB}JM z4cBH61bhc*2YYl~d?lnn4gg^o;_mJaVHm>qeT+t<9DivThC-*)$;RU`ccz;-M!jCg zH_wC7YOziz0=o{UR;zeT5?pdhi8`U{I-1QUWLbt~S+Fb%vMi(1>14XDbM*k=vQoio zl0dCiF`La;%VrTUO%v0H2LOO9%V;zj1tYZ0ZfBeu({&wXvj>1j*JXXgy1r%+5W3xN zMkAnU8h^fAT;Q@&!6uIJW7`KD$H8DQz-TmrEX$=NNs{39_7=8nqu1-P|366*v-$ny z1&hT3rfKf>0vdtv`5B();n8)OGR<}h!!TeN2KSwUR~?V83(xZqK0h;Z;2;O|t1A#f zV6RevrA1bQGLgcNe%$6hOT90$6tpIm}4 z3=8C+Bnd$faC6{f1ojbzp`hzJEX#VI)!q_VmW5`sS?XL_1PVFuS(dShV{ZSZr8XXq zkt7MG(FEhIO~ZUX=XS!wGNYXk0BqZ4Wm)FLWu<~3 z2!Bx1H2A*HPDHE~3&L*BK@dPWXhw(a)wXT)`+aW0@xW`tz}{xWJH;FWt&We7AH!MO z@wwzc$!^F7rK7`t1Vt{9E?KW1+C00>XFp{Pz{-4e8{pAG!xbmCl zAx+bQZkAuEdT%j07*qoM6N<$f~?Qn#sB~S delta 242 zcmVn+at4TybR49>ck?ReGAPj{oIDm&Z05lFj;sQXNz{LGmxdr9MP|x{6^Cc~P5RIA~ zzZ4dlywGT?B`^ya1Hkxd3A`sW1;B-Bd6xz3NYKjTzh6dihqFLZQRcXM9cz2C#ROu0NF?#sFd#-?-W(^vj$%x{?`~< sSHpdbuNE|}P%U{p!+0olN_Ff}KWq;+kt06!Pyhe`07*qoM6N<$f+Ip+rvLx| diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over0.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over0.png index f6b33bcb1896a6421fb770b714c9f611c4ea85ea..8141637bd69025bf356c13441bf9d5b704d9f3b7 100644 GIT binary patch delta 1118 zcmV-k1fl!k1Lz2l8Gi-<0063Kaozv`1TRTMK~#90?OWSUB0&%>$RfDFFvKkJMTuFL z#Kl+RPx!h1gyB{8!MHJq4+cU|F3X^aY)&slniddK&CmmTl1||;0##GfbvZRLS~Jeh z&PI}7P^nZzI(%8T0T{(%@xya!wVFClmr^)k04VeD@Ic*8hkvr3xA451n;R;XN)uVB zR7Bq$7yY+IK>5?tQzhf^_{{aITBUqGKP9Db#sIkT*VosS^L@&B9>rp@sRaZ4D3$2z z?yfqYr4-KW0RWT-y1gEG+3eJN=}d?u17&ZNRfa(>_5 z(qXYkFT)|-*X!@jJvus~ySuxoW7TRk`l&Eyc(~$F9wF}J=54(;%4pgP(Gbbt7QXDdBC?qL4Rd<@BkWzJ~BK2fb#u*-^zDK z&I4>iya`@hT#Rr<8jXfp=jZ2>_kzJd$(PqxC6UVh84Rf1ZYzbMxU`;^LhJ#iJF=Ua zfID;Q`mkAIKp?d@&uV)A1V{S`LEdjRM3ESDiU zN$c@P-T(2{=So#crD-e5t z&e!|CPpww#T`EjkI=pdVQ0MDW4}jL{*mAAlJENPTAU43Nc>A!hlBOuy<79M&u}Pv?;u^%XRJmN9#JpMjJ%f3H z`&vy^jhqBUo*F9@3QB?*g7P0RLtZYoSpUh#slj0 zx|$t8KLI5*Hp*EZV9p~*;moKk9*STfWzJ?Y)Y3|6POojlnQCxW7by%xrW{_?9D2@ct(No;p+nbt4*vLm_6p5P2C^i}U0xukIHk;}=@>d0x zQaELRb<7SpV}M?_t4I?VVcsOkQ@c%xL_*CYu$02N2PYxt%@^<-f-a?SCKX=x;c0Uo kK?-N0z_Q9%okJj^zuW-DBb&$^4*&oF07*qoM6N<$g7GUA2mk;8 delta 466 zcmaFC@sN3fWIZzj1H;_yjcNS%G}f0G|+7 z0|NsK3kzpwXLWUTUteD%BO{>9flrG5K#IL2$S?Rm7%)hAGrIwWI14-?iy0XB4uLSE zsD@Vq&=Mz47srqY_p8&p`I;4Y>Rl_({{R1E>lZJP1uh~c%iZ2 zail=9RZ~H-!-Nm_BjaYSP-qp=R_yFrq2S4z=JDwyXM%?7Jr46@ENL35EMW>y#hD)- z+pyrm<%}lV`GP5?6)Z;ojmnhQ}Ybs|o3VO_%x}METVRn0|p`iiO-F+qE ztCx6$6sQO>{rTP(UGQ_?^GuG-4m@ANac?etk30vjG9OyC0tj z{w&+BclvpM?TPEW?Uoh0`u9csVr-E<-^AB)aNA!-&f|WuI_X?_z))uJboFyt=akR{ E0L$CGF#rGn diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over1.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over1.png index a7800d9dcc3075ae1afa8be8f379d8627587d222..6f2bcb665a352d0023c9ef17c2fc5fb6c7cb60d9 100644 GIT binary patch delta 983 zcmV;|11S891L6me8Gi-<0063Kaozv`1F1SqHAKuN_~d)9HxwRp!ET0q*bb9e+B{NCqOhB72dwv>#hBk&*!ODtBKE&xiC%u#Ce3cVzIbp0qArj z5}~*fI-AVNkZ}Sa)FHkj#BK8O=sc_hhYlDg0OtF!0NUUKq}hvMGMQ+(pYJR{H`x0D z<#Kt6C(`ft#c_9cxB6{9n+bk?c@YffCTDdL)oPX127mjSVOOv%z;2Eod1sh2p6b`j zOYSYTf-L}^IxrfI1n+7AUPGGzWQ)^w=w7 zYytj^Mt_t{r3CvCTAX0WTC^Oc0OrwL#SAd?k#J{kcMiNw}(FfaH!9*fU%cx1C#Bg8sQg$-zfr#K0~ zy#U7duZIW0y0)tK3AO-gz8*;pnbtZQ0Z7TyZ+}W>nGUu9YQCP7WX915;CHYEa4T=W zFSxRGlgs4ktmAMo6^)l*GeX;%{~fkn;>g8(lEQ0(!lk$S@5C1IlDF!clIr0DC4iW delta 379 zcmaFF-pxEgvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ04 zk&%&sfq|2gle4q4y1KfBg@v!LFHrL2()T_H%&Z+J4{$blSa2D>4IJX_mstQ4?(A)eM#Lg1F=4FMenJDLn60i$b(gN!7B} znqJR>tKTR6Vqvhps+<=zpCMuOeEWlS%ol%7Z7N|FN@GcTDK(vIS@e&Ik{MsuuUT^W zP|(2=?s}W%NlzNyawZuma8w(6vtHJ{V_Z-dWpMKlJB#>?#@pB5Y-hRsjp57wgsm2j Su4n>%&EV$RfDFFvKkJMTuFL z#Kl+RPx!h1gyB{8!MHJq4+cU|F3X^aY)&slniddK&CmmTl1||;0##GfbvZRLS~Jeh z&PI}7P^nZzI(%8T0T{(%@xya!wVFClmr^)k04VeD@Ic*8hkvr3xA451n;R;XN)uVB zR7Bq$7yY+IK>5?tQzhf^_{{aITBUqGKP9Db#sIkT*VosS^L@&B9>rp@sRaZ4D3$2z z?yfqYr4-KW0RWT-y1gEG+3eJN=}d?u17&ZNRfa(>_5 z(qXYkFT)|-*X!@jJvus~ySuxoW7TRk`l&Eyc(~$F9wF}J=54(;%4pgP(Gbbt7QXDdBC?qL4Rd<@BkWzJ~BK2fb#u*-^zDK z&I4>iya`@hT#Rr<8jXfp=jZ2>_kzJd$(PqxC6UVh84Rf1ZYzbMxU`;^LhJ#iJF=Ua zfID;Q`mkAIKp?d@&uV)A1V{S`LEdjRM3ESDiU zN$c@P-T(2{=So#crD-e5t z&e!|CPpww#T`EjkI=pdVQ0MDW4}jL{*mAAlJENPTAU43Nc>A!hlBOuy<79M&u}Pv?;u^%XRJmN9#JpMjJ%f3H z`&vy^jhqBUo*F9@3QB?*g7P0RLtZYoSpUh#slj0 zx|$t8KLI5*Hp*EZV9p~*;moKk9*STfWzJ?Y)Y3|6POojlnQCxW7by%xrW{_?9D2@ct(No;p+nbt4*vLm_6p5P2C^i}U0xukIHk;}=@>d0x zQaELRb<7SpV}M?_t4I?VVcsOkQ@c%xL_*CYu$02N2PYxt%@^<-f-a?SCKX=x;c0Uo kK?-N0z_Q9%okJj^zuW-DBb&$^4*&oF07*qoM6N<$g7GUA2mk;8 delta 466 zcmaFC@sN3fWIZzj1H;_yjcNS%G}f0G|+7 z0|NsK3kzpwXLWUTUteD%BO{>9flrG5K#IL2$S?Rm7%)hAGrIwWI14-?iy0XB4uLSE zsD@Vq&=Mz47srqY_p8&p`I;4Y>Rl_({{R1E>lZJP1uh~c%iZ2 zail=9RZ~H-!-Nm_BjaYSP-qp=R_yFrq2S4z=JDwyXM%?7Jr46@ENL35EMW>y#hD)- z+pyrm<%}lV`GP5?6)Z;ojmnhQ}Ybs|o3VO_%x}METVRn0|p`iiO-F+qE ztCx6$6sQO>{rTP(UGQ_?^GuG-4m@ANac?etk30vjG9OyC0tj z{w&+BclvpM?TPEW?Uoh0`u9csVr-E<-^AB)aNA!-&f|WuI_X?_z))uJboFyt=akR{ E0L$CGF#rGn diff --git a/Resources/Textures/Structures/Walls/solid.rsi/reinf_over3.png b/Resources/Textures/Structures/Walls/solid.rsi/reinf_over3.png index a7800d9dcc3075ae1afa8be8f379d8627587d222..6f2bcb665a352d0023c9ef17c2fc5fb6c7cb60d9 100644 GIT binary patch delta 983 zcmV;|11S891L6me8Gi-<0063Kaozv`1F1SqHAKuN_~d)9HxwRp!ET0q*bb9e+B{NCqOhB72dwv>#hBk&*!ODtBKE&xiC%u#Ce3cVzIbp0qArj z5}~*fI-AVNkZ}Sa)FHkj#BK8O=sc_hhYlDg0OtF!0NUUKq}hvMGMQ+(pYJR{H`x0D z<#Kt6C(`ft#c_9cxB6{9n+bk?c@YffCTDdL)oPX127mjSVOOv%z;2Eod1sh2p6b`j zOYSYTf-L}^IxrfI1n+7AUPGGzWQ)^w=w7 zYytj^Mt_t{r3CvCTAX0WTC^Oc0OrwL#SAd?k#J{kcMiNw}(FfaH!9*fU%cx1C#Bg8sQg$-zfr#K0~ zy#U7duZIW0y0)tK3AO-gz8*;pnbtZQ0Z7TyZ+}W>nGUu9YQCP7WX915;CHYEa4T=W zFSxRGlgs4ktmAMo6^)l*GeX;%{~fkn;>g8(lEQ0(!lk$S@5C1IlDF!clIr0DC4iW delta 379 zcmaFF-pxEgvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ04 zk&%&sfq|2gle4q4y1KfBg@v!LFHrL2()T_H%&Z+J4{$blSa2D>4IJX_mstQ4?(A)eM#Lg1F=4FMenJDLn60i$b(gN!7B} znqJR>tKTR6Vqvhps+<=zpCMuOeEWlS%ol%7Z7N|FN@GcTDK(vIS@e&Ik{MsuuUT^W zP|(2=?s}W%NlzNyawZuma8w(6vtHJ{V_Z-dWpMKlJB#>?#@pB5Y-hRsjp57wgsm2j Su4n>%&EVh{)#>2w7rQg?KSx zxx+8u#?SSpe*o_6!MHJ^ZVbc#E(nN$&Fj#UVVsrOt;Xpd=OvSu;Cyt|yy>p4DkH?i zYPDkBpjNA`%H=ZM-Q7_%8WjidC6l4W>+9C*FD@=vHbglW2Y&&f12h2#W6 zdwcZj{@!9PjB!9Nm!p^YoYI*L#p7{{xiCrrH#awe=kxgnb6|`E_G2-MM5Aw*i*ORu zU<{s+NG8Q;PUd1yM`I5T4g^EyMCy!ngBGDM7~$~Gt1Bv%%VM_g-rl}B_vGY+uCK2* ze(Q8PEE}{?0Dp|Xyu74*K5s2`l}hD}0$QyWB@zkBX0z6{olb}KY%Lss5@d$`;sDM@q_*yJdDwz}tAeT7+3ZQjFIGIe8Jli-0s0MoyY&M%Kypdk7 zCysi(ZvAaGoeF+gECf%+V|t!WX)qWFgJF2P-DZs;5`W>Dz*c}$j#8#hK+ZCB{a&qF zVXfa_I{_q|i-lYNp;{aN((|=Py>G+uT<8fhhpcH^N4x{ZX;Z(rG!vp2= zd6ECa%pV8^xS`waZv2Ym#qaTW7ms2i+zoPXAZ6}kQxGbEdjmPaIoT8_QGkruvDBFc zwgV8{Ab-LGW1Sxkheo-8y$qs$_wDddu$Nk%ZU`qq4aVRrKD`6jbHHdc`mgH(vl)_` z8atZ=wgcqeUNUxipUMG9Wh0k|geLO($y7?s$UX>c2c*^+TQEx4kB^V8#S(4-Wmn+m z1a0+tM1v@6O*Gy6yFp1pL?$~?&O$}Uq==9m2Y=Y>^<>)^nSxIr2(cZotGfM1VJAt^ zQmG`^nHAP?tIRHqRjXBNeRHedOUSx_v#5D~er|SYtXM1xMr8=bZ>tRH1|<%VZ*?}C zZLJL=d7=~84uJ9Y0_ipd=oTX=p9D=)fbUIGjYebR1}LMw*CB#W&i>h*ot>HABxMJ3 z3V+)=MC50u0@^tM36=L0Ao~yk)gxqwh!w_Tp#-M_WSoK3MisPk0NyO}3TUEmQ-HG{ zfeS5LW!*w%8D6VKxEs`944$y7J_O%C0j&F8fM^mMDlp~-$z1sEfYEwcbAx@ShaRIs zp|DYn4*b8&Aj*`-a=D~_zb_ny6ue|E!c9p~gE4rcvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$g*fKQ04 zk&%&;laqyog|Dx#v$M0hy1IdZ0Z@|nAH!cD#ZeOE7yKUr816OijRcBu7I;J!GcfQS z24TkI`72U@g3ml%977`9-%h(&&vjUV$JI3J*Z=xGQ{r+~u>_uOIm=vm@|N=?$DneP zf_oDMlpL%+^ExIe%@Zu>QPdIj*}kEQO=dakWZgXqH;iB8F`kcof8w^s>>Ev+KWqsx zxO-?GBg?*DdzV~16m+nJ`*nK3ypWx1JZA6FPk6v^NiB_4P9Zlae1gz@!yv}fd}oRr zTef)WDs*Z6Vm11^Aj#o?%sUA|5ulRu3m7sd>;CX{AIp{5k zDzs6m(7CDD829G|-~%`#DBS}m7J&+-g4K%%3L&(x&fui*q>(G2ldqB8y9Yo~+hxOGFp!@vm&-j# zK`=|;E|n6AC_0c-1Qi3~KrjZ#+}~Rz73@LK1_V5@b$cP)DQkmw20*Gqv>(2{9(-3W zmqoYRm47Qqg@1Pj_*gDwimOyA2Oa>WGntIYX{oc<>ygIu&HzYt$nQvTwkQwf;U&0S zz&itAa|90%mKdPiUM`dQ+{t*sd4Ow>&jXsx<_0q|9*^Z!uh)0qE#BXy{8+7|L~t{! zymq@ydWJ-TrUKamOm{pMo#D=y)u-oY>X1%BHUMTFn14>EQl9Gp+;C<9VdQBO#g`Xx zmrnmY17OCXv@R7)5133Q)Zv^XmMkzF4tcdY1Gn8E^#;n#O&JOl{fyDsaoB$ot2Gm9_{fMdJ?^To+icnJT4pkjdHAGkbz3&sG*45~&@e1xldX-aHs1f7rIVq?V~ u19YwcN5_cW1HcpDIg-i% delta 336 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 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/rgeneric.png b/Resources/Textures/Structures/Walls/solid.rsi/rgeneric.png index 1e2da3352b75d4ada2d78b93cfa36e15d6fefaf6..665f36c54ef14702a9b79f040faa3732bb015eb6 100644 GIT binary patch delta 853 zcmV-b1FHPt0pJFZ7=H)`0001UdV2H#00SpUL_t(|oW+;TZ{j)>#ebxQ&`Ai1sv;I` zqiXuHXxSqE|7G`d7QBus4=f_8DiD%a0#Z7Q)&}wcnR(OBk*t&4*uGaM*VlHf-|xTj z7jY~fT-QC=SqOpax(B%mgbe=auqgGTG}``j7!@ z+aG$p9*ZzU)3n0&?fxFeaZ367!$av4RttdPaJZxL@ph-SZNI4zMQVVAVVcBIgkhTKx?ad} z6w&Q=iK8el{eQcyZQG=2s_a^}qo!?4%Op_^Hi?tGzi0W!c$^z2$7bg)4WJB-dYzi4 z?Pb~TS5P^Ck3!`Dn(xV0m8;^o$k^?60dO4WwJ?wgLcg6!G873qcUzc^*QDT?M|~-vglQI!TgH zD_Az2P6xvvRq(0ALsfaU843x8JKM zAomR+#D7}=LI^z1tE9jo$RIydfqnQC1>!i)<-n&Y5Wa7v+fD&x|5XKYt3YnKLWrCK zf1(cjI~wgMpz6SQJm%==2u;&eB`i{4Fc=)+T z^1QW`%JNzTSrwYPuFeBlD2biPft=C*$T(DZNY1He5 zEWdA$`(FWUA50ff#OdiNaTJjxNg+3M9pCqJzcYKj+#5iernD`K`PR`H-g4yW=?Q?d zPKS9Ia@Oe(%w~$q5X@#cww;?3GC45cGs&Mq)`topS}f@Gddz3D!bkyTK|sA;=V>}s ztWN8?;$*ojy_C$ukojzuyO^i|kBs#fR__ fm($wczMlUCaU6w_?t%9p00000NkvXXu0mjf@qezW delta 209 zcmV;?051RF2H^pa7=Hu<0001iRAaWak4ml12lVI9d_X*1v<=D| zToX_p2aKM+K!H1;?kfuX>kZMm8t!9!wII1dwPYEC3`#|*!j`%L;+izORVftD00000 LNkvXXu0mjfy?s#@ diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid0.png b/Resources/Textures/Structures/Walls/solid.rsi/solid0.png index 3849504b6ff74b96092fbd1ca668480707dba2e7..fe570c054fac195b1de49c70d9a0856eb79ebc8f 100644 GIT binary patch delta 769 zcmV+c1OEJn1C9oe8Gi-<0063Kaozv`0@X=GK~#90?VDe2qc9N0KN|vgfe4=R$^p{X zoFK=}33%Ne04WCu0umy^pMA)ZW>?!luxoo8eiBk!*_q+%I36HM&5Prh%dQpzL{WtOevdrM;4hb>=lQ7{;he z1lkDTFPHfF{*E9F;d>qkA%m9)v{(W?K^Ou6PGt$tbuskqSXC9bO|1j~07|bx*#W5Q zdem4hd)%M!MTiOTVYC%M7PA1V9Z=0IfNBR+GYg>Ffu6rJJgy_+6KInNd7gLsnNo_& zP@bYFzip5)hN`OI{=UI~L2#}4 z1J@paF@HIOEVu=z>l&2OhqZjuyqckuYIh!x^Gr~Nk%_!~9xw}_+5y$f0;qOCHM0OR zjPzCEzW%>hEM%A+g_PoGb-92srd<*QXpp1y?+Y--Zhs?$z;T?xPEi2Z?RNkF`vOrE zAx+cU?=m|?v=9IQvMhsXnxK?|5CX>7s0iRi+j?DK?iH5AEP!eUR5J^p+5y#QE5OUO z%J#Hv3&Su#@bN71GrrwRQ|aM=APn(?F%$#+2Ed=`^Hj810!5zVZM{Z%I3O>I!G44L zzGEJ=iGcgw0hx6JEd)rCL|OB+76Jh3s>Qzm*(C^1fyPf~00000NkvXXu0mjfg`Q$I delta 375 zcmeBUYiFJySC^ma`xE7FNEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ z51uZLArbCxr@!TEHsEmm{q^5@8;$b%9uvdV4Jos}{Mj=xd1_bGv9?VO5jVNBa>b5x zIbSHqW8An&e9NU(j2j;bhGaXe*}-zHA>t!v50EbspuVdiqL904N3T-Fb$Q0dh@A@= zj&D7e8nV~=u;87@3(q+^ISkCBA`X-an=N6NU1Zt+Xg1$K76c%X8{?TXRO-YIuaU2NCS_WPHh6Z$L{O@pKmvRWpw;?eY$mm!{H{nil{7 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid1.png b/Resources/Textures/Structures/Walls/solid.rsi/solid1.png index 9ac2271692b8f0116025dbc2b68c5e44b53d8e06..4374ed1e1011027c4388033aad7d9985000188ba 100644 GIT binary patch delta 400 zcmbQlG@p5bWIY=L1H-D!!g~x1jA@=Ojv*Cu-p=ywYB3ODSiHZ=!HT&UYt2 z#VWSt;<;yZ(yZ+(CUO19%Jm4;nl<6rffj*HDK$MCC-!WgbTItEUh&?3!>(hG8Moy+ zKR?b~65D>RpFKnBqP7kj|Ap_iR`zlaEci1WWu29u(+NvgHejtf%`%RLsWy? zA7#6~#TmBtzQVgCcKj7yfFj9!fyv~Ntz-7bTvx%Q-?jJGe>fn(ej;*<$N@oi56#$z zjf#8^<_P!Be;&C?!AT||avHaZ#SzA~#2=q$wQqg)_^Xj+dhxvFo|=-+V?;mZ{g(%u zUJtTcgfrmt{-lWvZxmyE#j&+um&(4*h)t$Cfb zX6v%t{qH>g*Ub8E?>Euwy!f4eoELx^e5W#c)#NS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ zYEKu(kO=p;R}HxiC?!luxoo8eiBk!*_q+%I36HM&5Prh%dQpzL{WtOevdrM;4hb>=lQ7{;he z1lkDTFPHfF{*E9F;d>qkA%m9)v{(W?K^Ou6PGt$tbuskqSXC9bO|1j~07|bx*#W5Q zdem4hd)%M!MTiOTVYC%M7PA1V9Z=0IfNBR+GYg>Ffu6rJJgy_+6KInNd7gLsnNo_& zP@bYFzip5)hN`OI{=UI~L2#}4 z1J@paF@HIOEVu=z>l&2OhqZjuyqckuYIh!x^Gr~Nk%_!~9xw}_+5y$f0;qOCHM0OR zjPzCEzW%>hEM%A+g_PoGb-92srd<*QXpp1y?+Y--Zhs?$z;T?xPEi2Z?RNkF`vOrE zAx+cU?=m|?v=9IQvMhsXnxK?|5CX>7s0iRi+j?DK?iH5AEP!eUR5J^p+5y#QE5OUO z%J#Hv3&Su#@bN71GrrwRQ|aM=APn(?F%$#+2Ed=`^Hj810!5zVZM{Z%I3O>I!G44L zzGEJ=iGcgw0hx6JEd)rCL|OB+76Jh3s>Qzm*(C^1fyPf~00000NkvXXu0mjfg`Q$I delta 375 zcmeBUYiFJySC^ma`xE7FNEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ z51uZLArbCxr@!TEHsEmm{q^5@8;$b%9uvdV4Jos}{Mj=xd1_bGv9?VO5jVNBa>b5x zIbSHqW8An&e9NU(j2j;bhGaXe*}-zHA>t!v50EbspuVdiqL904N3T-Fb$Q0dh@A@= zj&D7e8nV~=u;87@3(q+^ISkCBA`X-an=N6NU1Zt+Xg1$K76c%X8{?TXRO-YIuaU2NCS_WPHh6Z$L{O@pKmvRWpw;?eY$mm!{H{nil{7 diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid3.png b/Resources/Textures/Structures/Walls/solid.rsi/solid3.png index 9ac2271692b8f0116025dbc2b68c5e44b53d8e06..4374ed1e1011027c4388033aad7d9985000188ba 100644 GIT binary patch delta 400 zcmbQlG@p5bWIY=L1H-D!!g~x1jA@=Ojv*Cu-p=ywYB3ODSiHZ=!HT&UYt2 z#VWSt;<;yZ(yZ+(CUO19%Jm4;nl<6rffj*HDK$MCC-!WgbTItEUh&?3!>(hG8Moy+ zKR?b~65D>RpFKnBqP7kj|Ap_iR`zlaEci1WWu29u(+NvgHejtf%`%RLsWy? zA7#6~#TmBtzQVgCcKj7yfFj9!fyv~Ntz-7bTvx%Q-?jJGe>fn(ej;*<$N@oi56#$z zjf#8^<_P!Be;&C?!AT||avHaZ#SzA~#2=q$wQqg)_^Xj+dhxvFo|=-+V?;mZ{g(%u zUJtTcgfrmt{-lWvZxmyE#j&+um&(4*h)t$Cfb zX6v%t{qH>g*Ub8E?>Euwy!f4eoELx^e5W#c)#NS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ zYEKu(kO=p;R}HxiC2133TFEdd|lF(lMRc zgB91>1-5W$U16*b@=C8rSivk49`#S_6@zbc-O}Z5vJ2k-HnuUi!YH@%WT>%zJ>Lef z(GX8KB!e9MN8$g8zfI9M{D?=Ne|tq!NP9xz@jb$$Mr@x|%M6%BKY tt>pP1>7V?sTyq!PdPL6pGB6GpJYD@<);T3K0RWGKt~USx delta 264 zcmZ3^JcDV1WIZzj1H;_yjcNS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao>Fr%o3R|8P6 z(bL5-B*OjeRY$G{10I))SHAsAzjmO$e1g{tr|`^sMHl>C1EjgHz1i`FEp4R(YYb}< z+m3am``_-GZ5h(YwS(&k&y5yKk$De}$^81y^6!QJnT0)#c8Pp@nfBNw@`Wm-C%C!K zSjtq*@?#yxW*z35n=O%L93R?+(<0d_st@VN`x_kNJXvJQ7%IJ^8R!}YPgg&ebxsM4 FO#r~nUo8Lt diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid5.png b/Resources/Textures/Structures/Walls/solid.rsi/solid5.png index 3c0b42ddbf73d53c54c8da7192a85975e452677a..d4f50d419fb8f69add5073a70b824eeec4e1212c 100644 GIT binary patch literal 448 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~KnvaSW-L^LDm(UbBIS>v}`k zB_-V3B3QLgY>MQWtuUGCor0Ih)=V$g-+n6hB;B08zdG?O+1k+{_WIOqxu!hLNjmkNB3{?q}CCb}dPixKI=0&?9*EIBU!^n`!;ayt8Jp z0XaU}@4o!!{3o)Ykgt28V6IN!=6vGhPaE$c=YX+R* zbB*QY)cfu;Or?)s)Or;@gOlUopHusFx4 zPiAnjcrKkYo%dPgH_d`ZJ86Z+>gMwXe^i|rmri-Tc!Hg9LHEz<1Dp4X&f2>0JY!9J zXM^eTy&7fzOG`z>;30v)7^ds6o-SoQq%eE=|QcHN28SV5^Uz~ z`y=Lb;q}9WN&VbEYT_2G%1Kw%d+;s4_{cKOI^i>x+RuBQ0!{V3#J^F=Exq`bBrh;# O7(8A5T-G@yGywqjI>0*s delta 336 zcmX@W{D5hKWIZzj1H;_yjcNS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao@Fyrz36)8Z$ zlb$Y)ArbCxr$_TO8}P8aRrzjT{5GXNb!&*4R(H#kG&}J!mkO51TP%T^ZlMhpGq^&! zC9bnRs(r?_=Dcnq#}vVuFY7t){o2pHs(Dj0Q2GM50DJU?Wem?*JA$_*R65@G7Fa%q zW0lzL^8(ACFugZ!x|q&#EuHnB|8J{074aYXTLt2133TFEdd|lF(lMRc zgB91>1-5W$U16*b@=C8rSivk49`#S_6@zbc-O}Z5vJ2k-HnuUi!YH@%WT>%zJ>Lef z(GX8KB!e9MN8$g8zfI9M{D?=Ne|tq!NP9xz@jb$$Mr@x|%M6%BKY tt>pP1>7V?sTyq!PdPL6pGB6GpJYD@<);T3K0RWGKt~USx delta 264 zcmZ3^JcDV1WIZzj1H;_yjcNS%G~10G|+7 z0|NtRXJ-ow3twMfpjd%duQ-rmEeY}q{tpBUzqj!P0|ht>JR*x382Ao>Fr%o3R|8P6 z(bL5-B*OjeRY$G{10I))SHAsAzjmO$e1g{tr|`^sMHl>C1EjgHz1i`FEp4R(YYb}< z+m3am``_-GZ5h(YwS(&k&y5yKk$De}$^81y^6!QJnT0)#c8Pp@nfBNw@`Wm-C%C!K zSjtq*@?#yxW*z35n=O%L93R?+(<0d_st@VN`x_kNJXvJQ7%IJ^8R!}YPgg&ebxsM4 FO#r~nUo8Lt diff --git a/Resources/Textures/Structures/Walls/solid.rsi/solid7.png b/Resources/Textures/Structures/Walls/solid.rsi/solid7.png index b4bc95f4f0d177ba63d815287f9152514b148456..a880e87e0e001365eb01e4fbc7bcacb119635fcf 100644 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=XFOdTLn`LHopq46*+AgHy3qF1 zCvvXy6?$yz`pa*4t(K|s?4;sz-vsZUee`-)*!vInbpEk(DHJ$pHXLAF%D}`vg^5EZ z07c+D@9g#GJ{xcTr?&CoN8td5MrJQY7CsGD0gDA94i6fFNE5hIXrJ)AUVd-R_YvYwfNfno0U#y3EUu{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx|nfKQ04 zv$Hdhxhqn{9Y`^i1o;L3XL!2ZzzfLZEbxddW?S0SpXW57Z1cPqtBK eU|=m^cu_a?JrASQvTl2zX$+pOelF{r5}E+rfH=Yc diff --git a/Resources/Textures/Structures/Walls/solid_diagonal.rsi/state0.png b/Resources/Textures/Structures/Walls/solid_diagonal.rsi/state0.png index 5976a6c5c8cddc3e0ce7cd57b773685b44112b56..fe95c81ed3254839a2b29b07e5556fdc599f2ab1 100644 GIT binary patch delta 300 zcmV+{0n`4x0=xo{8Gi-<0047(dh`GQ010qNS#tmY3ljhU3ljkVnw%H_008buL_t(o zg~ivs4TCTchT#tr(vd1G-~~`5_8)@OGz?&*(8YyQL`Xmk@z0%o3p}ql#EHTfgIv>f zoe?>4DJ8N5EciH%=>s;n5NQMUcv+U|0&F;dGyz9A09-f$S_5EQ!Gb^g z{t#yiSmTej#iW!K2Y`b5Q@nrdlTx@hjTI*kaM}5O$W{=7lLdt0BmpsabU-W~6+nRp z2T yq{e~OJCFm{S|xu2a^X@+h_jyt%CX_YFyI5HZw?UUZBdHi-m-=zuCEe#l;%t)I3q2aD>@YnDx{W%%*Ncl9!C?|(X8u;i$cXMXPd;4XXf?u0LP4EI=1 z+-9f}PWaz+;QoW%@#f_h?yQ&QK2`VT+ml6~ufATaoEpdU>etsD@00qP9{nz4v|KJL T)$qsD3*=-^S3j3^P6>Ndj8%=73hbDS!g64xqxT z0x0p~0BXD_fCJAC;KH*4IPt#$xhIt+pyZ^sO!69*o>bBR?w!XItUwwM0(#)zfL=HN fsH;bV#C!lqTN3j#Z6XfW00000NkvXXu0mjf9&&e` delta 255 zcmZ3BdH3sBPRm&{)v#ZeOE7yKUr816Oijhv_`QQzq4;uvD# z-+Iwe=zszTi=)q!KmU(AZd6jr`DPUxvw*$7jzN@XMT~&Qe!&-enGCELZWS-syOrn6 zxj774q18-FPFM9GEVpOe=AQ7H@y2h?82g6zax!-tH@{bSA>FZyHPKw*9kYoyg$n>gTe~DWM4fZKYy6 diff --git a/Resources/Textures/Structures/Windows/plasma_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/plasma_diagonal.rsi/state0.png index 84f71e4833af719f7573047e0912d80edf61c378..60d1c0421b3fecf74c453715810e8e5ffcf32774 100644 GIT binary patch literal 15748 zcmeI3e{2)i9l(z?OG82z5E7&lYF#rby6$}Ev(G=Sj`_jFzd0QSnQR(GoVYcXnbs zFV0i6R@y)BB>Vh*-}n7~-}`*u_v`!Tp0BN0a!=6@iU@+Zr@G2h2kr*_Q&<4L)y~cv z;5Ic<)ua+c@l5?Qg?P2MlpweRa($!L==}*NC?OLsDn7{+4@JOif^aQ}M|h!C(hNQ+ zAcxD0SKr-dG{|C^v4Qo{-blIBB3E@rrKO!U^+IQ>;1rDu+(oW92ONYXjW@(Y!LZ83 z%Zy3C9QdsdQ$|B_iq=|YT%-pyG&PsDu#xQaj-9_M+D=PZAI#1B^sd2PN$Qi8H!;@ zFoRS(!WthZ!|L3WlTkk&Nfn}UM3a@ULHEo1ls2u*Xw(CxuaSL)BI!V3b%Y(DNX7XG zWj4`NE+bJ$+eF%;!Q|3Jfs%q!ND6Bzuruehi?k@3qP8d#giNa^3=DGO^`>LzTyH3p zGqkEzv;zbqNOM}M^&Jt3s*_ZuEh=4)Fnrii86$Dl?chGkvPKawVul!LlT`#YN>B&S~XQgf{(H zFA58i3X-8_B?+V|S-6Y&z}V4IMNoF9+J>kIvdCqEI;?(&)hYQ&J1sg$vssczr@-1s ziFJs))9-NF^jzr03tVK@rTa~ej*XbT9n^aDW8n32)nQfR!FH-WZZKey!O8@QcKFRs zmUPgdM~P0Wll0jvHqvT!SRGD*w$cofJR4)pGbY`beI&SnRy$V`*L*-AfKP z<3d%*dfq#rH0ZfmDyJ8aiRG@T8s+8F? z9W@5tJH5+)|8DTkszIo#^AbeoJc4-US%SDV4DJ^RqKzhqubRQ@uCEZpY-RJ$4pkCF z-XqnXMfLH)gUg<7Jylz}@~r*niGjbo$cXc2iYJ%9>%4R*(!K0jN&I4W>8cz3-roMc zf|MVvDkM7AyO#`~XA)QL+hJ;O&_Akde&<+l)0TXycj5KleRlTr zf`W!EwkN+_ecv45Vv^LhTup{}U7yZ21~K=Gf0;_f-B_x#4^+xPT;@Jajk z_BXZM-dr00+pjG<*DPllbK}r&?W^7%e1Ds^=aDy;B^sXbUs=egU)MgpYtGi*!~2Ri z%;q+BCDiQ&#MJZu>Mz{9^|PAGiO*lJyt`ts?{MAh!W&hW?#+|WZ(Z`>+$qB**P6BW z@7;Lkf!eynVPad^ild%l;^5(hhSMFtfB#VaqruzppWohjqJyzB91x_`0>zZhF=aZ|^e=T{wGR;a|V**|lMK8ZrOGfdb#NbU!$9M0G`t Kr*Cods{aE2tbMlt delta 687 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 delta 661 zcmV;G0&4xSdcXycBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GV3IPN_*4_XB0KG{>K~z}7#na0P z0znXj;c75}Wdu)pGJuKCB#gtf+@lOKw*?P+6UAM39^GA?!1q(o0P$jsPhsLA1PBvP zDftI{;^)ofBuqSwcfSSZZ~#65OL*812Vvs7;g*goby$fXSm51)Zpr0 zP>ZVuwBTw1t++}+58fTni+2TR;LQPAcvFBTULBx~R|Qz$#Q|1$QGg}B8eon84e-Dh v1HACr08jiUz#IPxVBqfn77hTy!~x(14wUkwK{{2*00000NkvXXu0mjfpVcXg diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/full.png b/Resources/Textures/Structures/Windows/plasma_window.rsi/full.png index 41d24e9d2c47761eb99532452d5d92a59c25810a..b20d5ebd5efacbed1185a649c410e9eee61d80c5 100644 GIT binary patch delta 1581 zcmV+|2GaSi1HBB8BYy@2NklZ@qG_2qqxZnY} z;0bvJZV(TExaStMf*lEI(b^t%);pe4Rb@tSkyYJ2?HO~3R;#FbPyg^c z9udbK(0r+b+cFHtF>JXPkL=~({#G);&wlvxw~`9bK?JBv$A9KNIiTv36J>iw2kIXjGv zWO!Gm;k-^;TYu-@)r-^t4Ci%Py-3~aW$pmd#&X_R0vO(u{_4wNjWq-Ee1w4f5%z8s(U zZTOafh~~T5@;)8w65_SGz>-#==H*#@Xt9(xdy6f?LVv^v5U!Oh1_%Om%948v!g}jT zozhl;yf$07z=J@i^)k+YQ^JRtq%H^(I*epLxXwfrV0o@5d`zFEp6cWN#>@I%+3`AE z`dvEKDnGFtjgB)SUL!d$sKX#8HCKHsfueG>y`FUdw*L7nN|U(NM}U6NKezB0W9hGL2%mx27HL#NAJdq+UR&_P`oyQ07Vs&i z37}HC{k=-9Iw?oYEX>|9Ofs!r=8hme3jBz_>updz)Gb& zq5p%`hv19l(5T-B58nk|I%+WaX-WV$^-7sQfGbD3dsANiFW}=vnV{2w zRex6Aivf>V!b^s4(uwDpvyW&Gu~JYE*L{e-Tvy76dJi0SKJT^4htB~-#g(95*MdYxV9NyVt~UV)Y_*B;63Lf-bpl07tL#J49_YT@fV` za5saWj2C4*1P3TFl}~{085rKWXl&PZRDa2Qe)1#h$BS~}LySIpe+d35%ahs7ZVh4D zwQ$odurb3}=x9}HQMPrp{|DTpX&)R~8bX^Hly-_(vsoFByn2~Cd~u68k1xJeVzxcfE*1d^$&Py1scJRAgs4m`1({9)a4{~&y$XRlvn+W^iknie4b=S zhu~$ZclW@h5kN_|`?QM~eQH6Ij#aE{ie?~`6y?$dFnwQdtg{W$*F>D=r|FA4w}$|w zM$1xOr~WuC9WJ*1o@uuuJBnc`a(_BgjxKL3`4pj~Z7-0uiJ+EiFZ~aaK@3E^7K~{3 zF)2*?O46BNY_oa$SZ6DlzL7|RPSC{=|5&nVW<~jl zYKeKOwNBnVf~#Y)tWs_RWgo(MmX6Fo1yDXQx0S|vQ_rD|eby;OVK@?vsxHr{rdPj~FiFZyo3kgZSq?I^drlmLw9b!{t#Iv483z!ao4L?!<9 z$Lr6d1eipdp!z7xlMKPb(|^+C-J8;U?NOCfhx2OI>069v)&c1I`F-Mqx!GO%d&@xd z&vG5#m#TzGlC6vY#TfVyV>k|Ys}0dvpYX8)st}{33J{f|q%i{0N{SkulD)T;6jPWo zPooe%x~H{uC-%&9Z!7-#_rILXmfUMZK4;bZ8Xmy0Ve(yd-Li4xS0=W$&31k;cCPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0YgbdK~z{r?U%ud!Y~kqtGH0;p-9-HK0_bFH}JkEuU>tCy?XWJ z-8b-gy2m9*4~4=Cnt!%aZNxUQE%A^ahS+v8^JOArGD?!<5`Q=p0fb>l4^b4+IJELS zr?DuC8vv3^De1$|5<(C}1%MYwz8A+`mSyls$+LgW<2Vk!}%OWgHY)J_YzqhgVhAYw z{GicR#qS@DoPQj@bpU+}9)#ow^op5)Hv({SwF3M%tjz?XwE`?`jg6Vg7+@%Q01w~+ zJb(u<2EZ|DW2R~Z;L}X?1?UZ|jZf1iwN`*3Ua_|1(EGJy%D+mE3I8FwNn23b)ROg{ z96~I_L~Ny6w_U4%vx|xItC{o5DLpw+5L^KS;%bH*st!1P00000NkvXXu0mjf?ijG! diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/meta.json b/Resources/Textures/Structures/Windows/plasma_window.rsi/meta.json index 888b3527fb6..4a033410903 100644 --- a/Resources/Textures/Structures/Windows/plasma_window.rsi/meta.json +++ b/Resources/Textures/Structures/Windows/plasma_window.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/9c7d509354ee030300f63c701da63c17928c3b3b and modified by Swept", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow0.png b/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow0.png index a4adc74bb5e0771858117099462f9ab51715dd47..fe379e2fef50ab07c64a4f9ff75b663ada0ee10f 100644 GIT binary patch delta 2050 zcmV+d2>ti^1&`We zmmu&Vd4(WvkoU+r$SWiVBZnM=+;a<($chChP+*y~WtpZ(&P;b#4l_%xNRfy<6YoYJ zvEb}X@6^=SRoz`xJz~Z9?K^+?-Bs5Lr2rbf>cV9i#xEZJ^nYh#AUVayNzSwIHDHQQ})4 z-pHSR^mPq{uz!hrr`{6iKdLMU5$00Zl+sZtV$s)#e7tfMWM6#{R)$xNcsL&E5>m- zGN4xU(CnwKbnXsU4|EeM-`{Q>V3=f@-H8=WxT4L*MdeH5^?1>10IPKUbG)F}OXGEE zOEp^d*nb<0h9jUTx=tUbJD09sqkQ`$jb09~d=>z}{gTQqUx^{1g~Xz>9ibT2j!TcY(3;rp9E`;6izmI;8ge(-R<&OlfPc z-o(AQ`zhD0_`W5KCZMXSxUBr5_Z2y{nZ8`Kb8xH80IUva3fWU&^g1AQ`4pCvms$XY z#eX2@1%&W6cQgQDQ>nDmCN{n)MiWr)gtz)5`I)~DW^Ws|;mu-^qX&v!#kqyjxht#( z0i(@O!=F_)lj&25AgBbDH~tX!_N;A?;)md$8#Vl6P5fM!3v2OOS0PQ9-e z&kD-TK{l)O1;#C_0QA+6&);DP!Vb&Rl~0AE2`F9pTv7(`Oj1zm4q+yF_7Z|UwSSr9 zotq*zJmIA+C2U!>W4BiB2BQhM|M|V!(C7BHY0%#6$H`@)>>`trz z!rbCwDr_F7`siM>g-x@;VJyZIQ2gD+Ve?r6_2WRZpJ)y;s)R+%``sV;wI6OhIl9+w zmy`9#4U8rrY}?l2*uh1=_V=Qh%o}hVRfHU27eKycj1Pwo%YVhxb?j@s zEb96-UfOUo)a24GH$2Qw|NmV;ky9LbUMgS=o0}YjJCbUFN{2O%Q&T!OI?wa4v+{v( zd^C6?++Y5FUbX2BBW~MwhtpPWzpo-Y?eR)I;^;!7nf0NUp*9!kH%tKSQ_9+<2& zmcGv0`NYX5eb1jOFEJ!P-G7UppIZ+O#s@<~ub0lde3C1G&btn%GU>V6okG7lQgrwH zsu0kYYUuehW!?Rf@(!-pFOn#dg4SXkFnSDFHhbtze_44i=l&ixdU5ea2mr_VXyw!3 z1O)WTXV29|#h8TS#nk16DyJOHN*%C}EayR7`e^2T62w#Wd;7FDH7R@pvDJEifqw54W3 z=jB)Z;4hATQs!(b(y~W?tXU);p;#EB~ilWqL3g1&EidKK##8Z*>%_cYpe$W zZP6lV%Fle?6II*^ZBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0*^^VK~#8N?VB-612GiGPf;jzC~}IEodnko4zAM04P#3DrzAo)h4fo3y#ev9&mizovWJ#9j~vC^b#Gew#KxT|9(OcH&~8F2;x z(*$UJb2U?3M1LA!Qd?V&MlbJ~;v(7roxJJ|=n+=YN1YMh12pEyZ;DH4444(c0E*rc z44~*O>|*F<{r-fSW2jXc7BNjsW&NjDjM(Xvh3m&32WPqf;#PB9!XrS@TY>=;y(Jhx z(HV^DHkAdo0hsEtq^mi}unjkr%PL@=?{(rsEsUC~D?D0(t+W@TaCP}gh zYyGFMuitc?0?>Fx2HA$$%9H5Q1tOO zm$?jrk_nFhMQ6Mp1n;&Vty^Llphk!elf9$LY>BBwPA)0ZjhL z^rp%J+kmnY44~*O!2pWhQfMIp%$KDvmab3r41yIT7E_o?F{NhBEc^YP>bxvn1i=7` z-VzL;=q;r&K+OtPaS?5Rt|l9ncMr7aqt1x$0bJUIEO8NOfa=<~yXj66WPA5Oi;Fk| z%;eST@7KEqKSf`2Mw$U*$!J2002ovPDHLkV1mglQS$%* diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow1.png b/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow1.png index b0289b7d65a15e6f4a8c5b4862772304fac0d388..d75684f5d060b5e3ccb613eb3af2ddd2aaffc192 100644 GIT binary patch delta 1079 zcmV-71jzf}1e_%7dXY=7YaDVgq?Ii%&tVtvSLB)L- zX!0xVhj!yTC!lvtBm9Q}y}qFo02qi-0F?hxwcU1n=LGD1H9B6tj8+_&2mn@pMPYy6 z^8sM_XM}6_hNCLGEu0f@ba1+VHsj^yhJsnmB0wMz=%a(vL6zNheCGu4T$CQEApi&< zX&V8=b3v8ec7J^51Q21h>0k701LIpek^ehdLIADezoPzS?C*~j5RhI(QU4;l9a=zu zTR3-u0A{KF6u<(&m315Bp1sKa&S--Irm1#@cyUR48M_tQK)}qhwL%*RaEh%bz&g1) z`1<)bHlM%u{TGjH=U{`aSHO+{*AsA!ItUo2`qP5z4YVpz|7Wd zkh_=koujTTkpGXCwfVkt)I@;vvu*x<($Cx7qlPa-`Nda}P;~7UTOS3i6<`Ft^mWmT z%H(Bc9WOEKhBW~km?dc_QbfEokO&YqLZk=^&{v2^la$%&ScDC%2_Q|s0e~1l^%VM_ zX+N(HrK)3l@op0Fn7&NC4np)w;~)8ukPL zXVDvGF|k9HP?CiaARtW~9-eH5kKG)n&=PHwxsX; zouu^y?%cfld+t^)(~IN22>LuX;pFb%k5@k~K7R+m&tL!IJSS)(4=8v_%E~*%lB$ z$OBe04q=E$tIiUzz-9|%3z&Kk59fWLH2|FO>rQTg00k-_fP{r6clyKdm>GbK^~AXf znt$2?YXxL|z_x_JloQO=@ONSGTo`nYCUWsHN=n!1Feuy(5j3HIq<)XI57?$KSn31v zVQ|iY^R3XZ56DIVF>jq8DVVXI7&t}~1fX910Jwciw@mzGVJ%3-&j=I45{Quw+4SK1_a2nJv&g1r#A$LObUK zJEwrnEc94iCN=M*0?7YZ)8M+-?@jd}YdTj>@0J1#jDRH!UqyU$Fh9-wJ_ta;u`u`! xDqxofV3!8~yF6f*2PD|#0oCZF0-WUm{{oTD)vp-+rab@v002ovPDHLkV1l+I0S*8F delta 712 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 diff --git a/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow3.png b/Resources/Textures/Structures/Windows/plasma_window.rsi/pwindow3.png index b0289b7d65a15e6f4a8c5b4862772304fac0d388..d75684f5d060b5e3ccb613eb3af2ddd2aaffc192 100644 GIT binary patch delta 1079 zcmV-71jzf}1e_%7dXY=7YaDVgq?Ii%&tVtvSLB)L- zX!0xVhj!yTC!lvtBm9Q}y}qFo02qi-0F?hxwcU1n=LGD1H9B6tj8+_&2mn@pMPYy6 z^8sM_XM}6_hNCLGEu0f@ba1+VHsj^yhJsnmB0wMz=%a(vL6zNheCGu4T$CQEApi&< zX&V8=b3v8ec7J^51Q21h>0k701LIpek^ehdLIADezoPzS?C*~j5RhI(QU4;l9a=zu zTR3-u0A{KF6u<(&m315Bp1sKa&S--Irm1#@cyUR48M_tQK)}qhwL%*RaEh%bz&g1) z`1<)bHlM%u{TGjH=U{`aSHO+{*AsA!ItUo2`qP5z4YVpz|7Wd zkh_=koujTTkpGXCwfVkt)I@;vvu*x<($Cx7qlPa-`Nda}P;~7UTOS3i6<`Ft^mWmT z%H(Bc9WOEKhBW~km?dc_QbfEokO&YqLZk=^&{v2^la$%&ScDC%2_Q|s0e~1l^%VM_ zX+N(HrK)3l@op0Fn7&NC4np)w;~)8ukPL zXVDvGF|k9HP?CiaARtW~9-eH5kKG)n&=PHwxsX; zouu^y?%cfld+t^)(~IN22>LuX;pFb%k5@k~K7R+m&tL!IJSS)(4=8v_%E~*%lB$ z$OBe04q=E$tIiUzz-9|%3z&Kk59fWLH2|FO>rQTg00k-_fP{r6clyKdm>GbK^~AXf znt$2?YXxL|z_x_JloQO=@ONSGTo`nYCUWsHN=n!1Feuy(5j3HIq<)XI57?$KSn31v zVQ|iY^R3XZ56DIVF>jq8DVVXI7&t}~1fX910Jwciw@mzGVJ%3-&j=I45{Quw+4SK1_a2nJv&g1r#A$LObUK zJEwrnEc94iCN=M*0?7YZ)8M+-?@jd}YdTj>@0J1#jDRH!UqyU$Fh9-wJ_ta;u`u`! xDqxofV3!8~yF6f*2PD|#0oCZF0-WUm{{oTD)vp-+rab@v002ovPDHLkV1l+I0S*8F delta 712 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 O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0zFAYK~#8N?VB-9!$1&44FZWSLI$NuDh`m6gCKDQT1q$ol(bv{ ziGy$mDySl`P&y=#z~9Uy&a$Q;n)xg3K4~;-yPD_qTFz{?Dt|Jw+3c&X>#Av*>SpKe zR!(<}j}EH$myc?(SUfe)Z*q2>llk$r4FAQpWEv>G2MX;%j?JM9z@3-7e>rrQEujm* zv=57~C;L+wnnM==V#VY6_aF%YN?1G=Kx>i^fWn80#~Yv<7(o|+g8Ko&;w=|Px&Ra# z2Jk2z&;_8-SbyM}$7_);07VXk2T3e~Oo{->*-`{Z&X$dT54aycT*&ZWZ2CRFDdiE6 zoGnFwkkGSa{*f9Xf&F}qPs}MR6xIY)xUK=R4y@LKoE`zCmGH9{K=uW&aa{vsxRijs0dk6livVqU zh7wZ1T!1z^V-ixpRDd=)V-ivkVJ1MQcuYb+*qF|Mn1nFcn6CkS39;xd5-}G5AYmxj zxCls@B7Z<~wiE%9vxWYD0rvia@(4)ImLfoMwiE%9Y1EVWz5#>>bOE|gAPijdkU$rp z`vm#{yd=;C=sp1r;3*-AMX*^lO$H@ck%RzcNP;Cv26!xN<~_!~=u~VJS$!X05Q<$oOMEx;WUzGwZM2?V0r8_7P$7qp%aa7U99Hhks0S-3M2%fBa+b8yEe? z<>C^dn!@B|Iu#>Eq4%~F*Mk6yQMI$N2vJd}&0M8hw(5Ei0HLN5W<#5rP!N!%XvGCe zC7~_^G$hnudY&dWQB}~Ts9*uGW*=}tJqR!u5hKm}VT2MCg#`=fQnCevW!~(zFp*q$ zAxd3+sDTAoY=34Gy_AsA@uSAEs*VNv%N{E(uy=caur&;>xWEADl%?D|0V6vMw}-(3 z7ExeWmVWO9v`xpdH4GM9pu@gJfsq{=wuZri3$)n7Jzz%|T)}=>0PG5b1s5oF1B5yd zpa@_kRGFNmYdREM07~2dp$-H9sO~cR1xn8ZWp|hD_Q&AI%QMIb67zs5MF;+s*6thX@8_q*$+>2fU9DO*u)$}|~ zn)kyf=$H`T=p=0Z^ILqrNybyx5xBvbfOwFe&VOeOLY7=)Vp9brQL9!&PB+P1^}E8E z0Dp6AROd9Pc( z+U5@>T0nj>yUPA2zQ8;00%fHlx%?l1F|$L=?iJa(vR9O80r{^t@{_;%bXc3oLpcQG zC!Mb^&hiIq+G~TV_kdE*@~gl*zX^JOFMq$``+{p@U;Z!P4F>{z55PC-LO^%TZ}$fB zTca)nKrwL|vzkQhlHUq7cq_MdrCThI*LKOBPy-9dAD^u&?~=Qr4i!lvI6;>1s;*b3=DjSL74G) z{)!X^2Bu<97srr_xVN*n-OQUOXRFRjS{9=9(rMuWtGRu<=I-Bqq4NLN>t7EYyeoXvx%$fYvhbsYdkpvd zQ{Nn|o_`=}VzX5@3qz?GC&McpA%-iFDhw+&doTo~Ph?ndPKnWBZflL)hLD(s8zC)z$|_+V3~qQ@61^udsscLe|!Z^C~Hv4s%_Z8nByJXva{bAE!6n z{*ct<;GJd0S;&T#En~wqmbZT2>5!9kJIZ9)@O0(# z?hVIYg#4dTTl`DQ3#jCdeEi?nGwUDhU$FJvHT%%~g(;2uxGS=blvUKGw%ITrdi6^- zB6*YQ2HU?ypNv2n_N?9h9%!lB%WoUok9uoFD(E-n-SJ*?e0yBe?G29e82$U!$2OX( z`Idh7Dfy!2C6*%I5HhSf zm|fd&zG1^Izgdh2yOozn9*{fG%)GidGC1cipT+NoEH7mb>|@yy*13pB>CfH+S2kDr zSMCmw3a+osV!X!njUj95%&k7h9N4B>_J;Sby)R#TgPEgg!T-{mznC*6+Lojz@Gl5j n=@Ru?$t!u0hE)4jhn4e>om6P>`JQD8OqdLwu6{1-oD!M@Z;)KA6 z=1CK0C@U{b;Y~~A5chA|eJ_6bQ(> literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Nr~~jv*CsZ)Y3wHaG|zkn>4kRh;3-m?qF9 z8nYpUk%uRD`n@|(+IK%${?Yh((c7N&H{N|ss5#oRRfHj1li^wr!=RAVU>JMXNU#^A%%^)jIp>Z z_^qi4qaij#t#%pnw1kFoPq86ij)(@U$%gZ!&2F$WCdz8JTkMk!G)Y+r(oC31oHnx- zlC{u=-plAt2fv&V!OxZyJky&FNG@ZQs)kvDsH>|p)tOClq>`W*h9O9rplKY8z?Fp| zm5bsbB{v?VFHV7|@DVAjN^;1c#pQf*jp{NQwM6|_@4ABF{zM_AmmQ!;M7c0QnMfj) zlfd`;gli&!*wh4`5CdXR45^yf}F-(WChYDJw^ z3lQ`oP3ft47luWmL{#LO2ro{n1xv|IwR%Fy^hKp8*z%hOY zW7BG(9bOP3F)uA{Ogk`R@^Vn~)wY4h!xn`Ul>^HuDsTgZNdhzDL?0;%JcIlElm+K3 z76;DQd_LUg^U)47=MZS#AKM!P-4iqG4c(U=gigJ18)K&^#=(Gvi^7l#kIyqH*q}r+ zBNAxmTp($TwiW@bg(9sMlJVJbJ0n;FU6akQ>m0OevKe+wcs?JJ zR5#t54N@n0X*UM(f2~q*4=cKDR;$_SBw#h{Q7lEpKzV@#{XZFl?7RGtSkZSG6^f-NfqbM{vXi>+7<^x%ETo4ensN+KOfvh?%2nbr#aiRG@Rvi}v1TE^g(0m}P zjtc^U7Ij=`K9E(%1pz^eIxaLH$g1OlfS^Sk7n%=b)p0>U(4vkD%?GmTxF8^CQOAYm z16g%k5D>Je<3jU+tU4|T2wK!}q4_{o9Tx-yE$XaHx?DW?RYOhL>MUcI^KjK`D?i+A%U<4b zrR>ed*2b$FR%Kx6^1R;zZS&Pdr}yoD`kZ_AmQ7tfzS9>+Pu(Bs%E|sA7~7ru-^m%Z z+YU8~ul)JW5&Mmdj;vQ^cf5HFFWYK8aJ_5uv=PC(b6?*1*=TG}L3Q5RtR3%{);0(y znp-#TZra`1m>G<=R5Hz_<3}yq)v>l>UCnz-Pkb`2Vo{FwK>O>P{Kf63*Vs?2tZlnJ zxnkqlrZnu+oqs)Y_2qlZZ|rS)_C_X__VF9e?;Wa|x%bc~)0s=*h_O6r11ILD4__U>=XTqHi$bIyy3vPD@F1Gu@Yd9CUOE2kk zHTHCFoV4Wa`P7Eyv6ze*(vME8XkF2|X2!&eE-?M&8CyF8otd!&M1nQ3!>e0FiCbLIlWnDto|t!Z^_ZM%xcXFqUx@#5gUZ0wFt;;I+! Sxvf3QT{LY*!MjuEzw|%x_1DV) delta 722 zcmV;@0xkWgeEbEFBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GV6*!h3P)Gm(0QpHoK~z}7#n&+k z!Y~+y;V%WDG?RpkdWKFtj;o8i(9xmj5nLQRPLJUlic`8c)IpSrEjCU5{22q`c?k(5 z0OQE>yc3+bQVN0-x7H%z!keanlrnBWA5YU10OAGo@$Is#-}4Cv-rW`ee-P&kjNt&F zwWhrVWB65{3avHTwxtW0f*+boDL8SG9dN+`gbi@Tg9gmOg9XgRg9P~C-T}V2S3n4S zc0ee6RzOJHIUqFd6hMJb4xqv(1yJID1E}%iYF7zPJj=4-9f*Y+V}1i-;v2KC1t

z2wCv;;}tOUW9dJgsqpi?Bq~JzqbQ~PEV9;;<4P$!0TpTkfuT94W&i*H07*qoM6N<$ Eg5tSH8UO$Q diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/reinforced_plasma_diagonal.rsi/state1.png index 7bd92db59f70ce83df278ad44857a3797ff47877..e724d3b9f78d115d79ca3ded3230db216cfe4056 100644 GIT binary patch literal 15885 zcmeI3Yj6|S6@V8?c^Gi0)ABMTvJ#v$j8*CC8V>@7I3tsQ8?2RR@(5@}n zF2s;93~5s!#A!_3m}wJ+S4;<}sY3`!!(&K!wFxD`h6Fl=g6nu1V!+Tq?@G2LU(0ux zBs2Z9JEN7(J@=e*?|1Gw+CRItAb-yIgsBM_hK(BveXzAU~%$gTDBMYZ|GY;7fLc*!Zga?$FXW7U$i(hxf`7up{Hz`6@(Nlq$p_LPpd>1_n8CIwP^;uGiy<8(NZc zssVyNq;V~!;u;^17xI!=k!VYARt2xrI+ z_DW~@c}5of#iHnTgil#PKSE7bR_Ih|9$zSUIWZvp*p9;{(R@d}@!5>bJ1BxO=m@ip zG8U6&+GwRoV;Vuy1QFvTJQMQa6gk0F6ZJuY15GJDNRp<^u|8sE!ahL#aE#2{mzUVN zF@89fc8PuuBRd2SQ_kZ)Z@C?h4#v!koGLm?bc=qlEZ$+T$T4jrDm2#{zy(}+* zWJobd0;viW?kuK!;Ap?XEjYq$gA-YSqoYBsMwiuS<6Sxn!C7@A$@4lJYclJ2la*s^ zF00L~3Gs;(3M#kQb$<%GJ?0d7!&6TosEI!(UtYN?vD;!$KN<*;fyX9TLw1Hb3<-Cyv`VB zg96R-3!t4d?wC2sUO2E9lhtA%ZDvMCxR^4X(FXQn1$|v-;!I^^nTw)Wi>-ezaoh|F zl`ANDuYuB_cJYL5nIbG#^N-;(~ynMHLsC z52RIbK|s)=iVMvL(yF*1AZSs=h2{fkRa_7dw5Z}j^MSM~E(i!(RB@sCKw1?S1OzRr zxX^qct%?f*f)-U=Xg-iu#RUODiz+TOA4sd>f`Fh!6&IQhq*ZZ2K+vL!3(W`8s<$5<^yR}To4ensNzENfwU?v2nbqKaiRG@S``-r1TCt#(0m}RiVFgQ7Lm9TqHm`1 zUhq0<0K9jax?s#P@Xo4+%`J3dSnUi9tA8HDdhdbns~A>AVA!=%@Ve`37&b|KdFkQV z7&iP+UUp`2@Z6z>ne*B+CLejYxqiYM6O*Pc`}L7$x$?xM=>>1<8ww`PKB9NePrFf_ z)m2`4@%dNUl8e$dG)fh-xD zx;Dp@y*4|O`~@%+fjKc$9c|stOwi!7c%g3 zZAU#tO}39mVV4V*2C2Hr(c;|w!|{>pOTRo>bov)JMzmiCj`HqlZ)WaK$zQa=Tzsl~ z@34*4Kic(Tban+;k4d?%}bxQiA*PEEcuMY=m zPU_n3zGU9)-u2wXtN-j;eX>e=XwB2cE0;%N8EZe=`u*D*60nDxm#5S{)A&Vd%jKrJ zj{KxauODxlaTeTrnpUmYbAFoXK;euQzoz!&%b9%LG-~mg+BdfZe>mIePd<0TJ;~H) zd9G#ctv_%4)Z6*S!q&9UTaMk>VO#fv^IyH=q>7@Y-6Jl(@OIv+uBR?<+j8@r&ZapH zoAw&k%*DFej!JWYRsMwhpEfPIbm^<4rJWb#aSV4SseWGi?ytL>D(kP7l55N+tbP8O z2ZnuKdav}^>dSxauD#yA_qWUa+-l~NKx<%3W9x#pu2)<98DpAF_{ooN-@STsS~5Ou y7&iaCo(*01ny!pVJaj4V?5V%6E18Df9fxt$((UVe$6r!j*v`wz&u*Djy6S)8Ho|uR delta 695 zcmV;o0!aOheBlLEX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GV6gZCrVF>^L0NzPNK~z}7#n&+o z!XOlY;h!cZO_)r>Jvwo7I(5CTmt+!Lagl%=JUbv4&kB&hcLzw}y8?k&PDHLkV1m#LJ~99R diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/full.png b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/full.png index a1c5c2115fc19c9b01bc5e8eb039ffff5e143553..4cfc4c45da5178cb9fb00132bd47b9570301ad6b 100644 GIT binary patch delta 2486 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 M07*qoM6N<$g2jQit^fc4 diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/meta.json b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/meta.json index e716cdf4ed6..f66453a57d8 100644 --- a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/meta.json +++ b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/9c7d509354ee030300f63c701da63c17928c3b3b", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow0.png b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow0.png index 89446260094332a599021485bc68cfd23e52cf75..faeb000b4af4ee778ba66b9e19d9156b78305548 100644 GIT binary patch delta 2924 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 diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow1.png b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow1.png index b4ba2ac0075caab209b751b8869d58c40248069f..46547d6b996bc58da7c10e55cafb0fd78fcd9801 100644 GIT binary patch delta 1681 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 hc8I#i{`~MD^%I~G=8N?Y=_dS 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 diff --git a/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow3.png b/Resources/Textures/Structures/Windows/reinforced_plasma_window.rsi/rpwindow3.png index 7f987f7a8ef60a676a08ed91fc81eebb21aa23fd..46547d6b996bc58da7c10e55cafb0fd78fcd9801 100644 GIT binary patch delta 1681 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 Yzrx(A<|rn?4FCWD07*qoM6N<$g7_;%tN;K2 delta 852 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 Yzrx(A<|rn?4FCWD07*qoM6N<$g7_;%tN;K2 delta 852 zcmV-a1FQVe4eADvBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!Tt1rb-1jTe^irN*shhDM-;l zg$@o5E>12k(hPzQ5kYWv5p+{Qmr^Lz5|;|K4c%(HmqODtX@63Z7hm(vcg;_*(xG=p z{iWW0!jJFo-f+qLzWej;j!=S3B9UORSd5fPB@zmS;A)$AJWlHMI(b@po#lEI-3^aUX^pBzxM!E zR#s5=Bup0o)fQs_sJ0jbK()mf0IDs<08ni)27qddF#z;L;Rl^>xKq`zytm0B(DFH9KJ<$DVC`7_JAZ+l${9Pj?FlZuPpt zQI5EFSCCj1{w%Eg3moRyqS5q&b;1tg>MU|d=QMb zY|-e7GJiXEwx9I%^+7FoD7S!{W0Sj(3PTy)`Z)jY5)@HTHefonoP$(`=Jn;&6Ub3e zHsJH{k0Vcpj)VU)JQRib z^yU2-NTonGU}9o|pDRf33eC*SDBT147*MHHNNIbA?3bzQl>@>7)kuTh0@CU9M#Srn zkJWCk1zTa^8+y2YCkd$(9Wf31<2eb^kQQh0000c)RZTeYZ)dZ(?Lz5ns{gQWkdhbxhwD2J_$Zi z($2FJaBeCy5`siYk)439sXV!X0rn)s@_8TG2>`+*XsZ@~f1||X$Vc&cAAKOe0Dud8 zw{(*-fJ=p2cYiNB3E2s7DGzRx8?WsU@aW=1X{#2}{<9N6qZ;z>Gdf`2*8V@pP5>Dn zn%ZY{00|}$vJ>F>_tBIdg%03wQ+okC`uE^4~&FvZ8D0{}OrnSUqK z0XNbwVDUk-$%z&=kpBga;IDd)Ao`I!z(X>92zPS*C0OQ~A z#EtRVPW(J4!~`($VgMK#U9ewvC~!GqvK!4ICcqajzJXOyH+}MXA5nrJ7cZf9$_5*= zik`=%h(Z7tFQIlC`H;5HjVLjI2Q{ArXRzV2mPm+E&r1;{27skGw_vdZP;Sg>c~{=A z0l>*x0Dr*q=?m-L-AVhG;z@M?8PDM_enjYBgjhPj&-J7OI&1ksxWFYk03C}T(*C7L zq67M>0f0n0;Hhf)7)YW6fcC|Y82w8SZ3e)lKsbMAe*yNJKK5~9?%o@A8f4}00YgoL zM`$aDuW9g_2K$F=8jSHJ=hC40^Xuhc)8HlLaDO>{_8s2RHuh1Bl*9aaz9&H1 zzZA*KVcy<{z?ifg4zy1-Pml{(*@Lmeo!`S|Wy!%1!_W zjd3inSBsjt=|41Z4p- zURyP1BR~8D6CD1c$r&9mi~|#d(4xsG4ou*BaPoR^@_KNxZP6r!4)_Po4zi-ku!6Aw O0000%&aN^ literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Nr~~jv*CsZ)Y3wHaG|zkUKI#fhADGLBz=; z;BXMDfx(v8s^ZD=?3yf`I(?Z~Ux3bTcbc*hT zWQV$rDGf~^VUo1O5QjExr!aJgo5l@=I8KUj5~dv}g@#Gfw59DhCQcp7M-r1X-IHud zUdub4CNuqKZ$>)3ef!?q{k?rp_s@N=a`oMLIk)9d6qQ$A=Ba{ro%Z>{O!%#|wqAj^ z*`c!a3Pt7KtbMYmy-&@jDDJpaQ>WH>D>y+86!D^54~k-e5S&d>&gHQXFEj&HR}UJb zpi4h;tWU3#M3=tS;x&3hrJzwNYYl_y*3~saYqQ`G^~>Ek&KL(B1c1uxVgY|p;bJa* z+%E@zYs0i&7oVawyYwYmKwX`;QdcU6fzDE7H3&wlO=oiyF&3N6Y+I&djf{mhnrM^J zz?wL-ku$Tpu}kmHfxnz#(Z^MJ?ivdRC6~TYRYM$2N2AfAsHsQ}H_(j3;h>Ey&9VkK z!=SVTRX%12Dg_BA<9<9q5yDbPmE@pK^UK%E5!I#FYk`v2*uDaxWT2oj#tu@XV|<8a zii~t7BT-1&gd$;od}*RU13w6WpsGMSCZk=bQC4N8QJx}XQaxp0m=muz89U>81A&a8 z6?N4Xh+qt9MoXopB?RaypvaN109I{*TPeu2dsXtKk~6`RrkQf>ASO*=rfCvp@uQH) zkQ45eD-8o)mBTf%>~|+lS>-rFU1@3jROyz~NE=l4#8qI0E=DZ z9X`9ms^vl}Ug#pVF3oRzbYjHx?cmm{9RshID-S9v54Th9al?Tk39ig;wVUe&J1__g z58D?oTMfKPG#OaYWOdkhqmOq$Xp_uSD;sk?9v!;Qym7NwZ?*wmfE)LLDL0-7l;&(w zpfzC$wsYQ}Hb>iw2=`*H7X_05Sc9E0I}G)#*>2!%5HKT{M8@i1MOF~T_maWQq)=s& zmiHDU4O(uh!F>})Q+ba!-Vh&FfYw%A`tiP!?9^~-@^Z%86UPf$%XSM|)dSH$Gb0N8JAfL9_%H0t7D-TzEc+mf%8w;6;K9&j-;G zTnG@nNO0l#AX4T@FKy5=YwboE(8c(#Nx_Hy_pJv@O9KEeD8Fy z|Csjjt4=7Z@={dmS1GD}8%2HeDZCF+RK!S87dOM#U7w_=eEG3WC+?!C8HRFCNlom{ z{yl5HzOZEe!2XtBemMBV!09EUSvkdn*1Smml{3{N9q-n5@9B8(p4?l1G%I)AJB#1R zpSOMZk6+q;x})LJ+7NcTO5wy#|_Fn{=; zAGI5w0raU^Jw4p{?%A((z2V-FO*Jkm-n97TJAbqP6NfWoHw(t`{9$FwigTj`t;2eeVu=L{QT0zOIK`rwl{je?ex7GgN`Ki~6zWbKa(eUikBiSp0tgY?+f6EJ~4RtLu4CuYc(e6+0H%UUm)k6&4)o zh5jz~@4BsW?ZcMNSWk5H(F!g8r9$D`z3<)`Ty$g3G2OD;E1G}&gU$y$XWzQa-f;E# z%V+P_{i62Ie}DDB)g7*$tc`J}yS6UBkiFpa#)I7t9dRGs`o=-GI%Ywymr z**D$4MBmg`HS5+9$BjAH&)@RYCug1=@D>a&ZaO$;(KFXZ*DMgKyKVc*mj34-^U8+L zojCOB0oP{RSKdC?e)!GOdB3mj?cE=_e(6f?)z+Wx*y&D?qT!d$i7 z_QDHucONY;{C;fb;jfi!ZCBg+D%UQ2{&?j07fU{fM4p>b_~pE#S!dK&UcdK3{+5xU soEfjzHeIKr4I8S@Zv9#3r#9;1kq362+?{((do#Lx)oRb-m76>M3mj%}1^@s6 delta 723 zcmV;^0xbRZdi@2EBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKp2MKrbE=X9p)m7b)?( zq|hS9JC1vJ?|WbFz5|3tg{fxOB%o@Rk&4H}Y;IKyyh1=f&3|zS5;OHgdNBjf@pTU$ z-|r$k%e(H+(Wm512KYqcDANs#c!PL$)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozk6#Irl;JbU<~MfvF(ph zAg~KG>$d%UY}?Hf!2b+fX>EVC0nB}pUT@*Z%x0}MUsk|8;gpO#Q4 z0Pkn?O*vrj7U*4b`_?+g=>w3VUM=4M2Zz8|k+Ro4-Xz`A*|&ddTK)S0Md5Ol8b}Lg z00006VoOIv0RI600RN!9r<0K(7k>Z;bV*G`2j~J04mlGnc=mDt008+(L_t(o!^PJz z3c@fH#_=zrP@73Yz{$x2bn1b;gwO*Nyo3kp8JwJiQk+r;1sz1GXr)cw%gY!Dzds>? z1P~lqmfe*kZj6DF#GP}PNa0P>Kx-X0po=F-0s!#>y7;LQ8R)|S zz*@_D3;OWe&gRxyv~9~5Fa)3Pn?gzAEITj;2S6Jz7AFnx!N~%Aagu-#JUAc}4+@~b zy#uIluK-GXbO1FzDu4qY9KeMS3gE=kH2ojIjbApVRFZh_4#dLiy8aG`iBGq6r6lo> zTOffiud8RkuOCbI>CA;6$|Q5Hx*tWY^?RXnjvY6~-~k(D`iq@-gqZ*U002ovPDHLk FV1h0lLiPXv diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/reinforced_uranium_diagonal.rsi/state1.png index c40b161092bf1688a7c328fd6fab6c2df6b94fdf..3799df51bf9225b991de796f1ca3d2d663373420 100644 GIT binary patch literal 15695 zcmeI3eQ*=U6~NcVb*U+Cnx+$I1}fx+gtVtSeM=Wv*s(}#il{KAwn<4i-L2#UNhfq? zOLn1nNJ49zvefQB}Iz|f#1puui(Fe2x08k}yE+3s}OoZm56IJ2GQtgMw| zELPse@ivPgdl|h|=$9uUh4^OQ?b&chsx@|KTAXLuWHM<=T1`qK%$nV9H_KUAi-kcm z7_~d52`MI~)?}Pa`tdO-uMku^wOXT550tyI`-;YMfnsWw9iqslgg9$9 zacnUoNzB>AI}?%g(j<|E5g3IrO+|L*qIU5PMN`xcr9{Y_x@2IK6Td$fyXbnO(W0SM zZCMvWkVRV5Qf=vuL$(>JN@qfZ%ev53YKrY%lSBFBO!1^^O0FHIo#KYny`F!WSL7$*OuZ6Q%8P362 zY%OL7Z*%cx+qXG0&v6A#GBYtBenpZ)-FY8obf7IQX5_%mn_Y!I3TEOyQ2j`PCd|l7 z;oJg0lE{aYL{!kca#RRIHXaLm*!*C@%-pHs8Zvvc%_ux@;kr%?(40lapMG*$g4$7VQoO+Fg?1 z4!PV8Jr{cMA{Y5}>3-9rQzI5`hqPY(82J5sQ%uzaw4ElO7Y&$Xv@(}N3ZnP|Bbqro znw0KEztK8 zGHT~Sq+pJ|7YXgf4Mm&if)WEQPBRlU+Z>FGa|D@CP!Qa1Xbn0Y&h$A)dnw{(TBt@@ z&wDqP20b^c;ijph`MjqaZ(K;IP;V=>#>u{t>(pp!?((GD6EBE*%l3+T)kDd{P8rQF z3pbOer*mcqGX4w9OUFodz!<4(WL%|Zm3E>kAuTB+V0{?X(@Yv##_Low+TPY%p1bD4Zjt*psvonDC^ z{XbW)VsxT}boH1$?6k3bG@6zhc4Eve`ZY!)wpRp*|boNo8~Ro#AMBD z$wtG53#{}TgUr9yYIF|^y$-wGYWJ}CFm4f$Q!vuzlhMDHs`nEsij=m&6-5o(OBog@ zvWA&d72Iv6n_*@Y-OHleXf}5rJ*`jXy4dIWBfq21(<|nS2El-kMT(2e2h&nq7!a~Z zagq68T8aw;LKZ15G9OG!abZBnBE?1KgJ~%)3Vor!L$??281k9Tx33&mg2&IkVT4%%m>p_To@3tNO6(*U|Na`140%lE;1iXOL1X9 z$Rfo>=7VV|E({1+q`1g@FfGM}0U?VN7nu*HrMNI4WRc<`^TD(f7Y2kZQe0#{n3m$g zfRIIsi_8bpQd}4ivPf}}`CwX#3j;zHDK0V}OiOWLK*%ByS5^MWR2V~#qbAXFrw<)D zg`R5#2C=c(4?xe20QBAiz=v1S_uBw;asa%u9zE{*3jnTHcHaHx+W{!AZ1UB&q)tD- z=fv`(b=TeZ(u#(mp|$;ME|uLYJwEbkh4#j=BkMPR;mqvVmG<4+`m1jFZ^fT}a`W(0 zru+7tT^so7-_|s}a4@!a-q_n$zjfm9KR2uAYm?_63_abqY4g3;>>q3I53cyt;lYtx zzUXLtwfe%Y)`=k${^z^CxvH*dpKa@cg8ER^Isc#S3TmhDVOXyUH3OD?bvespx-^&`Sf zKX@HndD*bm0G)gPP;uqq(}(M}FRBJhXMwAOt4@6~zwdSZk>{pmD}7Jgwtn0H04k+k A9{>OV delta 697 zcmV;q0!IDMdgBFEX>4Tx04R}tkv&MmKp2MKrbE=X9p)m7b)?( zq|hS9JC1vJ?|WbFz5|3tg{fxOB%o@Rk&4H}Y;IKyyh1=f&3|zS5;OHgdNBjf@pTU$ z-|r$k%e(H+(Wm512KYqcDANs#c!PL$)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozk6#Irl;JbU<~MfvF(ph zAg~KG>$d%UY}?Hf!2b+fX>EVC0nB}pUT@*Z%x0}MUsk|8;gpO#Q4 z0Pkn?O*vrj7U*4b`_?+g=>w3VUM=4M2Zz8|k+Ro4-Xz`A*|&ddTK)S0Md5Ol8b}Lg z00006VoOIv0RI600RN!9r<0K(7k>Z;bV*G`2j~J04mljW$Lr$&007@fL_t(o!^PJz z4#FT5fZ?AeCN)f^;RYU{lZWdKyo3kx7)~yXbTZM&24kx&ya$Xhe18Ze02N2y_fJz3 z@460C6AvNK)WW^@SZm7$#CY4b0ObN={5Tx0@A;+%e&5{y%AA2E9KboJdw&a-@W& z#y16M;Hv|)@Kpht_}>6+{AWN3d@-ODJ{wRH{|YFLe+1OPr+~R1OZ;@!!U0VDQMA@h f3n2t`9N-1PCdA8BN8=m-015yANkvXXu0mjfL83K% diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/full.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/full.png index a1c44f239f04f38430c1b7d52c090dca8a4f54e1..10342c5705897d15d15cec6e6e15d43900b21769 100644 GIT binary patch delta 2053 zcmV+g2>SQL1CtPtB!3BTNLh0L01FcU01FcV0GgZ_000NYNkl^G~7zLDP_ay*ecJtI=*Ya~` zz?BX`%tTL%A z3Z>(CwrV-PpE1>G_bUL1Y_Fi*|G5a38%IOm-;_1$lOpYMMSP^Xc~a>3;;a1-X$Qj3 zF`@@XtEDshSc!XZf*=sNTIAehePEG*N9x2Qbuw1&sDH}te9f3(I7CXg_b?v6pI9zI zWq~8?5|fGJGsZ~e?tt0rk*GRcs=Ag9)7>%IPaMA<}1%Qx1Y1yWc{iR|(t!KxZFR6n|FJDDW z`5+tvJcmM3hO|QDRLFCA_J{)j`Z1l2+$ZJjp2#`OwUTRsGzd{oJAF>k_J9k7O~PA~BvKYA>|t!ZC4#Tt!TevrxSz)m~_)xkXNMizuoH zauc-fP)K{K;R$Eb!63mkLIHpTRzx=W%Y5ovPgjwrgHPHu$Ja>g@?l-wTNEMZJ>3a( z#cthjCqo*a6;$P0bKC&1E4l{&Q2cg*JAdo^JAJMkM?*Am#RPz&ckED{!-UBimNeoe~~`$lZ42&0Ap#=x~D6^d*Y`_ZAXv~t%;fXkv^I!LD#}7*5hwH zOU^gOtZb9tL`UtQ*xb6s)loaBZnk9vP|Aqc?Z!QhpMVhOtGmb!9`;n-+#|*XP=88F zcKftfR{aWj-FaD=dS6DB9$-}m3;6matF4R2Ml*(_RwOL-k93X(DN6NX+&`~W7QgPx zx(U5II5!)W2>U0J(HcXPZ4J7uNLW&D_b@RYF>CtDxdQOD~0I9Wx z;q4wKnc-%HDgc=1F25@!V1y_DAb&Tm>bj;h0HCSr2}=J!*8m_PQUHMJU1dDm0?1Lu z0A$=hyS3OOYKu(jYL8Om5yN)cpq+`IQ|~wL&GX6916tNaL|Y85<}0UZ(sGSG$c1ko)y%oYDzgqmNm7Npg#dt? zX*QdPFEgx$K)IVU%0{{1$$v%C=AU0DUzqc0VZor*UGu?BTq9A=|A^c#x{hvpA0RA-c(f zscn9ooY;e@oq_cEMMC_xZ;QY`{SI&=JPfUgnE=a-*wmc``uV1~(0>3qV{fUaYsp2+ zBMUPNSm^pUPoprjOVFklRKz zyYWWsGGIx^Q7Wc{yMHWCCo>NecrVWwvrm?d@j(4qHm=xEy&fMHceKq(N_J=|qpD7d8FJJ9N-l+s_UTxYwXxuzFXx}F6f71W9F=l1WKU-l(zNnTp} zOxg{NRpwW^2qE?j#0bwAe;W6=%gQ2e^oEKdlW^{#eW$P65zTn{rJ95ZQta1 zPHkD1cL4~VWf=|hO%Mbm;wAtc2+jlZcF)^G}dKM4G0}E5KB6gFjB`Zx9^k3h<$b U03mOCK>z>%07*qoM6N<$f~`xgk^lez diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/meta.json b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/meta.json index 84639dad70e..739d63b2474 100644 --- a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/meta.json +++ b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/meta.json @@ -1,46 +1,46 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "full" - }, - { - "name": "ruwindow0", - "directions": 4 - }, - { - "name": "ruwindow1", - "directions": 4 - }, - { - "name": "ruwindow2", - "directions": 4 - }, - { - "name": "ruwindow3", - "directions": 4 - }, - { - "name": "ruwindow4", - "directions": 4 - }, - { - "name": "ruwindow5", - "directions": 4 - }, - { - "name": "ruwindow6", - "directions": 4 - }, - { - "name": "ruwindow7", - "directions": 4 - } - ] -} + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "resprited by AsikKEsel | Original source: from vgstation at commit https://github.com/vgstation-coders/vgstation13/raw/99cc2ab62d65a3a7b554dc7b21ff5f57c835f973/icons/turf/walls.dmi and modified by Swept ", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "ruwindow0", + "directions": 4 + }, + { + "name": "ruwindow1", + "directions": 4 + }, + { + "name": "ruwindow2", + "directions": 4 + }, + { + "name": "ruwindow3", + "directions": 4 + }, + { + "name": "ruwindow4", + "directions": 4 + }, + { + "name": "ruwindow5", + "directions": 4 + }, + { + "name": "ruwindow6", + "directions": 4 + }, + { + "name": "ruwindow7", + "directions": 4 + } + ] + } diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow0.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow0.png index ee388930016be622eb0a63c291c95bc0fe0446a3..dfe885bf85353c9892107604d33eb36f0480e742 100644 GIT binary patch delta 2355 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 IM6N<$f>@(TkpKVy diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow1.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow1.png index cb46c4deda811693284d6b9b027bfb7742c2c4e9..e1ca7ea363976b27b350b4be8191b9df97a6c9b9 100644 GIT binary patch delta 1148 zcmV-?1cUqN29XJnB!3BTNLh0L01FcU01FcV0GgZ_000C-Nkl5TNpusmge|4ggN=!8IvaOeXXnqG=b=WE!>+=M^M4jHpX2`K@%znpe*4~+ z_a5P#LngaZd(WDW#(3h}-<6HOul4QpjfE-!fO_%U#T#ct@~a|)w*oVN$iWxCX_ete z9OkpXzedaFrnY*fxe5T7GWEJ~0hE7#~)d+(mUWi`)gkvTT#7d z+il=3z&OQYimi^VM7-n8cFw)T)bUcyxM+Uq9k4sK_kV4X@wbaNUKSZIy#xBsXTOn| zU-~K_n@|AR1;{28Kz0GL2?dZ{fNZwC0K!J-g`eIyCNln`hhMuWT7wANz5_x5WEUWt zPypEl$R-p(b^)^4_5uiRiOJs55=Gbvnjfd_e>OD%a83b09a~Y?H!aoil3p(^6JY^f z)Spmr5`X^m;+(!|+xnUNEC3{{_bSnov6^x5R}e$^FYrgz9w}8VELBVlP7LF&Z6SZ} z-~yWtHfqF^iG?s zdj&CsSAn8($1i^QGcEVT-CL~6na{A8W=`|uEq{%{^BFwUi*LnCh_Dr_fYjq{QG_SK z{`1*O0DxC&KQr-M?s4_0o3u54ggw&J;J(Y2mB&N&C z>QTe(C?L|+-i2g=$Gj75UQqd^3$V_WZa4$^)5OZe0`&+DBY;6PvO|wyA8R5Ygmnd# zw;=?e3MJmGsg3rJfL^l$tx387YlnCFZ0e@kc5siEj2r0d?D5qL%iCuXH0CXWBZhsI zR6NF*U*(n`32wxgW$ zfy4KAt}xF1c=dSBnSwYI4u^G&@dR{jqwD%BsARdobECGH+p&Lprmt(pI?gB!g zP{rsPe$UASU< z+TQ`mWU^v~zu&V@CX->h2kru9=M!aX5T~GPn^#X(jzdWWcL8&y=>?4NICO3EGF(bQ zNdv)F z#kJA?2+Yh*+x`wPO^lk`JDStstZwKVqb(pFk5kP8z3nUoRr9(0XbT{Rn^4+EMKyh0 z4?>R%%mV(mAK>wLQ0taAO|n+2!PP$Pb{l!UUVl_?)Y0bqP3AGMa43r*a>Kijy47m+ zYHLN%OP(Bx0GG>!oOfzP($1t#6y0t&yuu&39EKDYDF9MfqyR`^kpduvMGAlv7AXKy zScDhAeLWfs1~J(iXfzs#tQ5a$UwYR&_k9tc&xe}LCUQS$q)7gY?9|q1|CbnVqyR`^ zkxBv}g+&U06c#A}Qdpz_NMVrzAcbXU1ds#M&*>i#vI-<^?}6$;GBg6nfhjpe-DPim ba3J&-iPJcFc2Y^e00000NkvXXu0mjfk!^nm diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow2.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow2.png index ee388930016be622eb0a63c291c95bc0fe0446a3..773a2b3fff343d7aa621a31db801276464f4a3ef 100644 GIT binary patch delta 2331 zcmV+$3FP+f1*Q^^B!3BTNLh0L01FcU01FcV0GgZ_000QsNkl1YitzP75?VV z%+Ab?7q9UPdu^|fU9eIc7Gj$fm78Fr#1)SimxLBoph8lpqVS_q)c{gy)CQwgO)E!f zjffK&wKPy_r~nBNHX)YKf(e+|N`NjxYkU2`I9{{f*F5g@2Y;AAMIq|Y87q80ujbBo z=bLlSx%ZxP8N)DOCm4o-^itIhsVn?dJZb98R;`ZdeP7q}|3XG@+mhGD=k z3=G3Sho>{O^JELh5<=EK_o7yvyO^IXc}$Z}2LS*olYh<3Vzx&eFxDsDp%?;zrjCJ| zK|l$MqyhhxJTc_Er2xPm+7GhZ7am9gz_|aIDQerN001DWvY#FbW6!$Aq`#xsjr0@; z7eqKABaJ$}=bTcYV#FBYbTY*0Bv=(S($DB@go`m|sqMFb1^Fm^Pe$36Y(`O1e4zLW z#RoF8xqrehw{1N_03ZP%XU~J(?zIKY(c3NncV*1z|E(kWA$svE!7XemdS2VT`V+nF zhew1LkJp|4fAdd|DR2jbB`mW$et}v_Y9-mj5G~6xiVmg;0MOq52>@W$Uor%%_-z+J z>I##-hM4N>EO3NK*HfqFEDNw3Ui;o8^wt$k3Oh@a+ zw+&xsfx}APN5N7j7_1&j^bGZ)yLvz=YJZdYM5V{lo!`S?ofG`gcnSb&3%?5h=vzIR za`oOaeWGI)mQI09&I+R6ng6!``6-w_5js(Ke97aUX=q$Qn-2!~-Ag~lPu)M!e~dEe zRMY21tTfYh3otFf&5sHb-gc3MYLgHARd2gULd#+d0NQMvRxywA{?pGejtW8TJ%2gM z^}qflX4Z|Fr8f=JQ^2js#>8{1UUJ^W$rOnJ)3MTd>#%~&?1%D{K^l}maO0T6OP&%3blG-ni{h3|q`}J)AK)QY# zbRq?0Nb^tS%(}cPbiMj;aen8DFBAZ_uLn#|fe1fFWMG@sfs3)2>mvwnh)%mvMU`G0o${q185 z`B?7qL=gb!$rRH!zh9gAP9z-wCK18ikAKT7zggJ28%zB2yq)v_oKT|&W2I712$WM`7o$vlGrOE z{8!4;kj!;Jaq_+{uNYdZrhjnLosF0qNKn#UJ2E)GZB7OZA?7_Sv%y!x$^%s)HsOhe zLH5jXmrg0&wrrzTQ&63LHw`;ev?t6zA_KcJEo&nEdom7>M4f^|2e~!{874rAOxP0W>tOa5P^C zsDY(dpeQN6?1gM*xM|dgEwJqP|G&bt0ADAE-&S{I3H~-i-8AEQHbZdpAEGybEjn^m zj)`XZ&BD@k!0z}3%6}4;v6}Z$uclSmy*=WWn#xr}@$>=u0$>J1lZa)zg$0xSR8zs(%5{8j`BB$Ns#4>G}Y( z$So=U-OZx~iif6=t0f2dZK1bPP4Nzz^ZhaD>nyVNmb_=GSlIS36fe&*xHgdozN#IV zswJ=jwhQ1mA0}FTQe#hZ++boDfxsXc-WW?+#c#U+002sjf!e70#{ON1%!@o-rLt3? zR5#+O6t1yR1Am5L*;aYl2;l21aI|iG+bHSCwDgq7b^#KV9$M5U^WD`0O3zR)g4IKb zr^*SsdT%j(t0y0*9hj;mumZLVa382nbz_sW!qPF>eq%%{&14FjcyZ~LXPEI+MBUx@ zF~KQ`G&HWDZFNT;TYG>YOf7_L7XX(A(chSf-jkz-V}HG%`mdL=feoJ<&C2N*4(Ia# zi1(OmJhcAcKid8m*e?J8xOn~9RUY=Wy<5e=_il_LBFNCxBseIbgbgi9h<4PQ)JrJs=nIhAy_ptNUFK9EF&A2aO(Y~Kz$>lXolZP(}j4HP9zx)x2KNm~E_002ovPDHLkV1l!9 BU^f5& delta 726 zcmV;{0xA8b67B_%B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ic z000ic0Tn1pfB*mjgGod|RCr$Po3Tm*K@f&dQHV(;Az&d|D1u!oO<|*HZ3OWFd;}ZO z2Z-4C2tI%aHn!2mB3h*rL<_}22*D~bprHK6tgJ^ax!f3?yMNgahFMM|%)hg@yR)|= z-ak_;7C)&Oi+a7zia~?`nM}rS=W;pU4??wCO@{yozS(Tj)99ok1M>O2A3S`k)$*oy zCT{4@eL3B_T&89$L z<4=C@CKLKmtAEv4F^I|l1Jd7Q0<2Idgc=u-0@!4;S+Cu0hZ+}=LjYhHpobCU#Bp=q zf7pfd+4=!BV{0Uvn7`k)^A-3;qw&4A zpL(D1?klfLX6oba=D4^aKwd3Q0P<>a0+5dl-tyfnDSxo1pmMn!TGoaT*s$0ouGCF~ z!JfD6H+E~ohAjXVIbnvL|LYpxps>?#C|r*1nOJg>J6f!o2;zlee@fPGRM zG}Hv7!%n~T$70um5uoB=q+8F!l7jlBuoHm1TATpn)$*@X5QzGjT-eNVv3RHBGr3{m z1R$>#Cjfc1Bt`)H)Y&#JqNhRB5)fps%@z07m{0f&K=8p{w~dQP0qhzgEco4lZCu0+ z0aH4UT1HFNt+7Fa{|!WC06cPkWUIuvH7m2jOV07*qo IM6N<$f)tZUc>n+a diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow3.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow3.png index 7977b29f0cc6fdce99b0fa912ebe23b2a3fe692a..e10cff828eaca524427883090f88e0a16bbc1ae8 100644 GIT binary patch delta 1117 zcmV-j1fu)s2J#4yB!3BTNLh0L01FcU01FcV0GgZ_000CeNkleB9LK-& zW_D+1*_9}^(cP>Sy6hp5l!yv}qEt%~NG~F7P7#WQ(1PtrdnloW&<0{}ftEn_Vh*7d z@sgG#B%xVa0;v@&HV3tIb)QUezr$=P+Ych>r1S{8~rZH*w@?ZE( zaQ@HRXq^oCGUv5202osty;fWX_V2g+zeIV6HT0`a>z#TZ(|igTL;H`f_%m-8EkI>} zirR5G6zU=Hr+-=cGFRR}w)7ao-&{bkQo;DpIq~b`IrPPP;BZH%Ol8&L(Yhw7AwVv` zN56mkIRMererf^s$A9A&WZFMTr$=Slldl5DuOGWh znV)(hoVeK|^#^H?8X;)`Rwf%NG9NW%^UESFz=y#%7>2>`-&@w7 z`)vJgwtoZ!lrzB&rVj_I#$Uuk$RPbyn0jMF7HI(vJUDqC0DO0R+QOT8i*rY`r(*t@ z?nU$OTX+;9ty)|hy!(mVBgi4W3M{b#Uz>8&Oz*nIZA*Z2%)I`G**X#Q0S*To)Q;04 z-2qJ;D9%`iBn1qW0WQR8GL@Ht& zZf-++D(24&6fFPrBXTS5Y60_otL9+xtg>T?B*#4g6vat6VI`>RU`!=u3{?7|pPHE!&tfG`llKz7n`M37*bXD!j}c?(iiP z>{5TB5}12R-V0nE0+))@T-_S~>;8`2f!ccs^hk`heYVQgm$PTGVV2 zb;^TRzx98;oU}&P$L*H~*7W~!h*I`^0e|^PQ2+pU_yY1QSKbgK&#s!V9oOCp`7%^I z)F@gf!q0hxZO`Ba&%{D+&{kVr+0?9is|R(^5;wwdW(GzXJsmHEC^ zS3Sb65r8pO3F32wxgW$ zfy4KAt}xF1c=dSBnSwYI4u^G&@dR{jqwD%BsARdobECGH+p&Lprmt(pI?gB!g zP{rsPe$UASU< z+TQ`mWU^v~zu&V@CX->h2kru9=M!aX5T~GPn^#X(jzdWWcL8&y=>?4NICO3EGF(bQ zNdv)F z#kJA?2+Yh*+x`wPO^lk`JDStstZwKVqb(pFk5kP8z3nUoRr9(0XbT{Rn^4+EMKyh0 z4?>R%%mV(mAK>wLQ0taAO|n+2!PP$Pb{l!UUVl_?)Y0bqP3AGMa43r*a>Kijy47m+ zYHLN%OP(Bx0GG>!oOfzP($1t#6y0t&yuu&39EKDYDF9MfqyR`^kpduvMGAlv7AXKy zScDhAeLWfs1~J(iXfzs#tQ5a$UwYR&_k9tc&xe}LCUQS$q)7gY?9|q1|CbnVqyR`^ zkxBv}g+&U06c#A}Qdpz_NMVrzAcbXU1ds#M&*>i#vI-<^?}6$;GBg6nfhjpe-DPim ba3J&-iPJcFc2Y^e00000NkvXXu0mjf$CiNq diff --git a/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow4.png b/Resources/Textures/Structures/Windows/reinforced_uranium_window.rsi/ruwindow4.png index a50fafe0ed2f6c7e70c0d0444aa84f70270f1ef0..2dff7e5127da870b33ddd1f786a203e300ab2265 100644 GIT binary patch delta 1112 zcmV-e1gHDz2JHxtB!3BTNLh0L01FcU01FcV0GgZ_000CZNkl7{~uJ z@9n<6&2HHw(!O+;y}0yHnh>E40SPr#v`{apVlTx=dMHZOQ?y_~L91fC6_g$lsFZ?| zm`ep)thFqKU<<~i^q}iy*)`kHB%5TD-S_s*jEAt&g1ae9nSY7o{jT4>{eSsqX1;G{ z<`E$Tbh1009+|(A@KRzYx%c#U;jfEhwc(|U{;pRRt(Sg$@#bdFf0O>|2N``+=HVv> zXFP`$TBOP{8&GGuFYgVGo+a7C3!X~dEn@(s28mb}_OciOAxxRBDxs!O zN|M)Oq4USjAU+dUnv-?|yq+YtCvB7U`~Du=L2qvdcSc*b&mtI^eLyM$Ww(H`&p6{Q zukzxFC0CWcb^{)Q8q^>c*6(noqAJDyi=Yn(`hX3BK7SzS1A;z4OCLaF_XA$fzIAl7 z&s;rn?a=&0n>*4vXujzTh4%gRnwKLhV%N)s@cnFdSSkTY)QteI#)cOzd!_2K$cYsJ z&Xm^sMkq6&Ufb)nJ~bY-R`<8--Hw7n1BydsKb`5YyPQsRXOiLEv9+3gyP$myQkp>a z@PaoudViKo_vMw=`evvzfDpEq#Yn`mK&e5L>28A35fGn=)APsAAbC9&0;OBR1a*tx zXp7a`+rjtP4p_hM+mp8G^(3`d0(Fbvi6z(NRn9o$1(f~DK-rDVKF~f2lum&Q>vy=Z zG5@u%{&j*rK$TF?2O#JJf<7SV1GZovAiW>3JAa)XS?_#Ggn!LHVrJ!Fg2(PI5CCWv z*S#MgeLrCSO2V@z?9k#l%LC{Cx|#aEC6xO#R0RNgGHNx8>qL4ABzTmz4HztSBOan= zh=5Xb-%5pZuU2Y+K>-8J<9d;v0&8C7%Tje2e^-il``gd4?z*^m@)I#roW%>t=fF4< z27fhZqj+Mcqjd^M8}RO*@1FyJsi`?y>MHR+j8&2Txjmfio2vl8smK9p(H*o=Ts(8@ zL+QUl0%-%t?>!$oV^Onsa&6;4QwRe9oUy1`Kjd^SwOWnh;^1!|NhKi3lc)k;$UJ{P zn|)6z0ZF8*z~fwH+sbHPg>@4cpgRHG1b+tTPCz$-0lE{=&9*l{x)YS;aqbs1L-u`v zZ9f7619T^#o4^3w3Fsy;Kz9PV+4cr#e{b;Wk!y#fz95VL_luMB6K$@{rmC#Ib_3pt z^i!M$pPHJp9@#d3W3B>3$f?KyYMtKEFfOaF{kMSbgB9%tB<~&l3;>K9rkQ_!wNb`7 z6Wy6)_@PS_Jb|d$C@%Kh{6I!udle|qGGClzMy|h9<92w)swXdahC e`v}l|y#5b0A$=t}Z2Hsy0000qyaTFhst8{ zAok!z@a|cfo0k^B-ynDqR1ic-?ZJ>%Fs5y`xzz-(A=osC3V+$Oo9wvLeu9-AvNOa< zoO#OdezVY$eRi`mvqKfcnMfpp1Azc)Hk-)n^}^9Zg25nawOYvcq?sXk9J$Hr5|mV^ zklZm01GU?2=%FKZKN%PSKA#U=%$!+wKWH4Zzwd^AF)#vnAq7ARixdDUEK&fZut))r z!XgDg3X2o~DSs@??*nGGCl;VQg5U2)#=XEI$ws4r$O?}fA2%1x(LQ z?L*l!mW5GkXW!#?x$9f{)^H2B`SgkoWzSe`%k%Z65yn4UyBq5p!!6+2t8fv@o>2{# z$9y(=*=#Di#ZN`90+>eu+{PZK&9d773;+i(-vL+WrX4>6kcH4*v+Ge+SH1ADFx+1O zP1C5arGGsSs4r)ihg-n)`Sf=v9fK9Tv+_K53A$Wh7I32!TZEE^y|=N_L#VmHEFk?k zeC*CpFW8eIGdEd%3|%g;j{^3LjboAo6Rzv19t(*WU|(^I-wH*mr3(PT6NklB|dg!Gsv=u>Qm|k!w1|hr zR@fGd3QgCqm}T80_(3$TqHzPR?(CXr=6iZ5y-2ccS$&_w&VTPXF#P}gc;0zuc4sKp zbpey^qaPk_-zJ;G>bNs(f6_L@e1B(1iqL0zPiy^S1F3&I|HrjQf2|~+t>ola!9?`2 zJ~{T33A75dr5O1w^^M|)a?M>Ki42K+nnXxBhNK7`iL7+Ob1iJw`#tPp9c@xMze6e? zeFApX4A3{VDSzmUZiM}(4io?=c3*UZ|18WXB=XS(e31K61I4A+q|Zs+o8JmuUzi_% z_$Xf_m5(lJ!1m=*G-(4ZTpsu5WR=mMU7d`~o0O)VS({XS%_)&js2 z0QfIEz^edVz}DaT$1wBJcL8iX0oVnw@dRKOz{V4RU4H-m(oW&P20%Y4?*bty_|Ca-TOJH?# zFrXwCN`Lo2NuSvHm3yO*=GO;1NX0J;F##uUPb!fuaiL8+`aEUwj_X ztnQkI$VV5y$;>wAH84*(Zqpy6Dl7@HU0|+Z?$22vZ}Jpt1VTErO!G`zQKU%ZmxIUz z^nZ^Hq!O`sxE27;LiXxE$Nzp9BGF)Zh%Et9FFgET(67SScml8sVB-nEE`W_E0J{J- zRWE?T{$2q4{er5W08apR0c<=0*afih1Yj4yrs@Tte=%}ydm?74n)>qbs`+GQ-gFbOc$kC)^nWFAC!o36cEc`a1Tb8SU!w;(d0u{llSGL` zKKcZVHhwGKPFLLwi10!}Z)oilLJKA1cXKkWXxj_-4= zleZ@oQu*i;FszO{d`e(^tjE&6qbl_dG# l1z%1ZlsB16?F_GjzW_RDWP5lu9N7Q>002ovPDHLkV1m;x@CEu5v3s`F-#D)(ftT1(7XWu2;-ItL zf7^V)t8%CdfNgIV|9MrkaLJCk0Kio|JpU2|A%L)p_r3W3k{|>?;lASG1eh$CP!|9N zn*rFxbM6Fn0e?`O9e_mffcl5f$#Z#u%O5OK{K|g_nRng}34%HWG)Mw4M@tfbIa-!J z29F;Oy~o%hEPISCOL_z_M@tfbIa-nc%&atbz!ehgBP!_&MwSy=RXJ=I^NtUJIi z-n{b^+OP?r;>_ZKs;Xu}8`d4*Djtw-e$0dYCFm-CvVRB!kyF4`{LaT7u5=L*0NBMp zb>CZ~(Fm{TAtr#J;-M*OHb%7&6F|+6*X!Z5?*~m$ZNzs#Xo$W8AYcXnFU9o;5YP#R zb~w!iXe0U#z~xkeJrbjVhyZGO+7d#5T>!PXToOWnRe;^$H6?^1f=vJw?UG=IHmp0q zCBY7DM1LA1^Zxj_-M|0;jS<(Kr_e@3K*%Hkn4={Lz#J{=V{+Q_1?dsM94$!z=4eR* zFslJSlzbt9`Z3sUx5v1gVbO8A?{od_tC|&SP3UxaM@{ zQ=!g87c%*s#(!eA=E~AnZooQ|{j+xV{3t05F4!`4H;n<5YNScmk?|q~gm}_)WeGKe zQj)$A37#E3iI%CD)SQ$Xu-cbk#<-z51D=~S66onmviJpk>nwuN`(Eru1 z`pxxySKpn_wOZdsKh!>YEgRfDGi(=0h3_~p8+tN5^RZ9@g2)>Iw&RVIFWSqsDlhU1 z2lJ%X`+7(-V7<1l*ZOoWtd~2ttKE)*L<1JHH8+#rX>=yK(49|(iU-%6<~xs-uR&51 zC=4#x*?;q+WU_x&YOQaCJOc>vGG2r<={hLYh&0^|kU9cdregH$@JXa^M1r7nQ!IQy(*Xh$2%vFXEy7b^&8mH~T&tpF&f&!6)A+}-F!sS${K4E526w#& zkAJ&7Kr~t}o{Y9BodUuJoG6Tb2>|ydN_45K%nE@Op1Ii?D)c`x0pO_7OLc0{dU5{N zZ=VVO3ju@;AXB}k;$z#i#rLhJ2b!D*03bfLOm@xyrVgQN9YR#y3E90)MLU4N#qcYJ3A!C!m@wZ-8(oD9Vf6FKC45 z_X1mf1o#H1PCzxj0jd*Fjcr^WC>U7138-1xmEamd2gH9|L8Fxi$x5n0)6?JDoFvfX4t2jpJe{9|5Y5 a*Z&1WAAozTGqyaTFhst8{ zAok!z@a|cfo0k^B-ynDqR1ic-?ZJ>%Fs5y`xzz-(A=osC3V+$Oo9wvLeu9-AvNOa< zoO#OdezVY$eRi`mvqKfcnMfpp1Azc)Hk-)n^}^9Zg25nawOYvcq?sXk9J$Hr5|mV^ zklZm01GU?2=%FKZKN%PSKA#U=%$!+wKWH4Zzwd^AF)#vnAq7ARixdDUEK&fZut))r z!XgDg3X2o~DSs@??*nGGCl;VQg5U2)#=XEI$ws4r$O?}fA2%1x(LQ z?L*l!mW5GkXW!#?x$9f{)^H2B`SgkoWzSe`%k%Z65yn4UyBq5p!!6+2t8fv@o>2{# z$9y(=*=#Di#ZN`90+>eu+{PZK&9d773;+i(-vL+WrX4>6kcH4*v+Ge+SH1ADFx+1O zP1C5arGGsSs4r)ihg-n)`Sf=v9fK9Tv+_K53A$Wh7I32!TZEE^y|=N_L#VmHEFk?k zeC*CpFW8eIGdEd%3|%g;j{^3LjboAo6Rzv19t(*WU|(^I-wH*mr3(PT6TT?wr_|5y`QONt!RX7lrC}LEltVCs?gGsQu?r#&+!gTe~DWM4fngUnA literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enaIvS0V@O5Z+u4S^4Gsba^8U=G(fAZq3j za5#w7z+g*kRqAzPCHhZ-yrUl@PsgY{#|1s$tkh+4{1mvGRt5$Ie7Pgg&ebxsLQ E06wu-kpKVy diff --git a/Resources/Textures/Structures/Windows/reinforced_window.rsi/full.png b/Resources/Textures/Structures/Windows/reinforced_window.rsi/full.png index 73b05e9b2a0e57f6bbbf74c2203f6a234ab05f53..34c51d7c3d6a3b995f8df92ed1176e988a2ad8cb 100644 GIT binary patch delta 2050 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 delta 735 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 delta 735 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 E0C52bHvj+t diff --git a/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow5.png b/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow5.png index 6770b1a2357e8a4a28f4bb16a59fdcda5cff46a0..6f16899eded8c32a19b7a837eaf03ccfda43eec9 100644 GIT binary patch delta 1004 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 E0C52bHvj+t diff --git a/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow7.png b/Resources/Textures/Structures/Windows/reinforced_window.rsi/rwindow7.png index 0e02c2e8de00c8cbba348e75dd3a5b8dbce1d31b..f7fe3b636510031699b058d6ca713ee68030872c 100644 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=*F9YvLn`LHoxPEl$xz_HznPrN z7BqHNs5P}|CM-|y(9UVR8~-FCQ%Li*QOf=A7nyEt{{3SSad^-W#L&p>#mK^^!75;} ofJA}6;xl;uGvU>Ee3MSRaj8(Qx{jql1nxza8-i#ZjF(v4-9*E*<*eb%1t;ulh z(@(h%-|hZSoyTx3hyjNhED|r6zr=&}W6CY<`N)v;l&3B*C{zLHSO!m5KbLh*2~7YR Cu2;wa diff --git a/Resources/Textures/Structures/Windows/reinforced_window_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/reinforced_window_diagonal.rsi/state0.png index cd8aca5579705880e93303708f4e5c727687e3c4..eb9489ddb47bb11907f90822a5ba80accfef0552 100644 GIT binary patch literal 16179 zcmeI3e{37o9l$TG=pa?9($F^Q2C-a~Qql9B&pz9Cb=;+Kx@6!Gl5}wjqnz)a?MrN* z>pM4g*0HKlSK0vsRsjh`8e4||X<6HK6x6b@t=-lFRXPfzzlkC}#@_k2 zU+lMR@W(VgONsq`-}n7~-}`*O_kDMN+@9W^&onizXrw5rsk_VH2fr=m-{lM7e|>E1 z&+zMtWY>^RQ45>RzXob@e+xxq-Y^v%fyp#Hq@=pBqezS7?u!- zsEIb~JI8)twWvy)b&wCRfn*1Ws$F9#&_C8QAdij6f?{3oYxHJB=pYUZ$&!i361tda zv*!GY@V7b4SS`6J#z>pB-3(|626`67eZ`ZdKncCT4pL+?Qj)RT zSf-YdBA0BE=~OJYG(~1W48%dg(4n2Zrd=|s8JZr|>Vzz*>js872?R>9YpypQuNhi5 zI=4Xt1*A1C^?_^>FnvJR(kU5qZi8D{S!?%(8ZIZN%9E+7yLOOK>zJ9EyjiXk@)`2N zy^0+vAQ@U}K+|Hre3kVU5n4Jra#dxyZct4q+Ni$9%b+IZe3!iezhnR($8rvub6Y&wy6g8YJ`>?};whwTe$nv6tuk=wd6ZHYFA4M{xIeDp^ zTj58M#juu&ONLL4OA){%6A>>{9;}#Isw%NVi)ksiEZ}o^nOeg&t^AstHp{v_Ap;#I zL$62@OjYi}-5^D(M~jM>>dUtcMUz!UEC+S7f=h9+EbV5UPTFn1iKW91w@31XSVi&hxw5M^FK@cwx)>e0uDx-=p@hP6 z*bO(%^L00#UuT80S%Gd!sqmzbVij}Dy(n-m0Pw&Wb^uxe9vC77b0^t3xEG%11ljHa zA-Aizml|$nh3ZnxlFC+RI9F2rU~BbgxukMEJt?JhV0NrFYq4dO4uO1?6lx{c`9w)J zPXnK9HWZ+EnX1w9vPzcT`~-D&I_HL9mU;acqfwB+HKe?&+^qUebS-R*N-5ADftTuB zdS%{gwHfOE-(7$oArZQ??W3h3q_7^AlX#kycn{4hPB$$miVQ1Jv4`CbmqYMK#WYuB z5#6F$RTY49=R%>Uvm)<=w<^V+UNNh_lWLxGII`xFhVmNasFa8R#m5wPRvbWA^uL_B zx%I<5nEx(w$Z7n4khy$5t9xRx&(7|lUh_swg#8!x0x8$`>|SQpSh;5M^Mhs|jiqz* z-5d))jNSZSFs)RhrbBqsN;PU)w%n9Z4IfvCh74C&nRko%TbX|NU;}(Eo_E0W6CFk^ zdesbw1^p_#mC?y;nW^#d9aS4}N|6-7oL$SaZR$ z)Ohm9qfZ~%x9q)z2i8xYI<#-m8Ee;9j2o_YTv)QZ&+&?-Cw+MQ-e-F6U$T759{YC! zUweOY-L;JH{{Am4a_HXR^r_>oy#3Wd*UnqN_1e50k=0K>@kGn6liR1K*4 z+;UsnJSsWzoNXQT>9ze`OU@q(?)zE##KP_CZt0UJHvH+$schF&^ZBuI2ezxk%+9hd%C)ATnUyZ-ROJF~yJa`ErZJf6L;Ejd4N%iRxL>|FZZ^V>r$UwUr$ zX6Ez5#sTo_-9i70=LWpY@Qo{iM_#@(cB;Sec#KapWqvt)$HMH^V-J4&C$}~no%rx{ zYj9hi_Va%To3EX@_|#-;@)xbm+{Haou;=LC@1FeRUl;u9gMZF6Y(5ulZEk<4`L2mi zL~nlm)i+Lmm)n2!8<)0kd3fU9W#4N*cFz#E`tW?p-@Il%MV)JhO$=$4&3$9 l_=#(Lr@p^<=lc27*_POjMO!!SGGA-&?(FeTZMc2szW}LG%sl`A delta 726 zcmV;{0xA8oet-s$BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKp2MKrb<;R4t5Z6 z$WWbH5EbbtRV;#q(pG5I!Q|3EXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOiPeENGIZAF25=UUJ*n;&3_1D5;OH=W-$xT@pTU$ z-|wP4%e(H+F{l(w2KYqcIi?#H@dokirloV> zj5;c)!a|gGjeisqX*!R4_(vUoid-_eDq!STKn*G+#}EDozk6#Ir>EScU>xXuvF(p> zAg~Lx8n*p?Y}>69!2b+fX&ry93B*20Z*;Wq5iqn3TwHfFc@MbU0Y;v5$&eh$PfI8k zf%h}|raUlw3ke?Z;bV*G`2j>h42`(Cj+33gs008_+L_t(o!^PJz z4uUWg#__LAgg4gN!P$Yqa0o|F;pprEoV|m)qq{5d44SY4V_9{AU<5l#E9HlUBkaSQN2aN|}1KJdu_zVJx_KJjF+{2$;Of88%9C5b0VGQ0z!@Ukp_1481f zY?~`d{A&s%@NNo*ZY=$yvnMb7aXn|Me^Df&?!$KN6W3bf1FKOJy7*C8<^TWy07*qo IM6N<$f+QD8Hvj+t diff --git a/Resources/Textures/Structures/Windows/reinforced_window_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/reinforced_window_diagonal.rsi/state1.png index 4130608cea1b0074f870bd6a0abf28dfa6bec2fb..65254207165b957f648e77219eb234caf994a8b2 100644 GIT binary patch literal 16152 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 diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/full.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/full.png index 371b38edb204fd13fe1521208356135a1f129acf..6baa538dad92fff2a6c364b70fd4a5d045c04afc 100644 GIT binary patch literal 9436 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 nXYAxZ&0s4b(PK|I`T=@cMw+$i_EG->@F4?q delta 361 zcmV-v0ha#UNrMBBBYy!(NklzlCjnr09MUc0end*r-fcs%-p8{Zh>#{`ISVVuV*Rc z;=_vu2-bSB3bC)P_}AZG2t#S`7r5M>)f_fsy0m?|4?)lkDzFxvbLb}O4s17Q zj0pjl8A_??X!Ze8K{5BVQ;iC-%Jx~F~s2(i5p#iblP00000NkvXX Hu0mjfh8dyu diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/meta.json b/Resources/Textures/Structures/Windows/tinted_window.rsi/meta.json index cdbfb466b44..30517fd0ac6 100644 --- a/Resources/Textures/Structures/Windows/tinted_window.rsi/meta.json +++ b/Resources/Textures/Structures/Windows/tinted_window.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/ f141c349e063f7318d8c8a2417d840f0b2d06600, modified", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow0.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow0.png index 5539fa6154e17c821e8867ca5f77bccaacec935b..414ffd9f3ee92a394adcaab92ef34f74bbb1afd5 100644 GIT binary patch literal 10814 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 ZYxlTu#$ZI33;lct)RncBDiy54{s+=SrBna_ delta 1468 zcmdlNa#v`AvN2;@rn7T^r?ay{Kv8~LW=<*tgU0!(6Ky>X2Z*%#2QLlMY7!GEJP|Ng zr=zQ5vfDxqQLo9F@>=yP9<(0+ZSj8Y;o9$vPHT^ttWM^+P;%Snn2O=tNKxkX9~R0x zo>>r{HqCIl$B~QM_Pu*)b~ScN`osFGYtwYuez-h}Oq*f$k?rG^Ww{0S)cH0ytr40p z+&}Az!bj!nqW$+Rp2vz+q}}jQecpNaNYcL6sbXoY!OHVg`c};H`{{Hmd20P&7_qq0s#aH12|9N6w`quAc^QoT{mzy4y?>WA_xAkqJ3k$NF*XSnt<^s=p_ze!fwRCPvY3H^TNs2H8D`CqU|?W* zGg(N;pOJTRqL2$SFPFmPWkOCYKw4q)OCkBmJi>aD?S$wV{EYk%f{%NoHD_m48uYYF0REKV#-O;LghCTAq(rKhIY zD(Ndt))RA>Tq341d6AfUy@EcHNjCcErrYRaa|lG8OKNd)QDyE=aCEi0!a<8;s>x;OD-ZN2N+5Ee&;F2`1er$v@I;j6D+c<;3S`ssECjyj{60r^Em6B)Ng z>GH_cSfK%4D>_(8!?8hzn<*d<;7?*)$8c&vuPXET%U?C z%wUs9Wce9sQO#j}{lmv!e_YOntT@l$T=JyX(^8Ug(;-fWdr@;3>YuE2-NR#c>uz<{ zKjzoppT2r7SZ5>GK3n>WK9}oy6KV6am(*>~dKLyZ?AdC;cp|!6xS=NN!<6{+orsi@qGIO8%wlkJ(vGVy``Q=;J2y!?0`prpv!XNwiwrJt6pXPJRvyL6guFw8j2{BLllB1Z=lm)1p?v=xmtW33KWpl~Xe#{s=zBUrhC}X&Q-g`* zfx_btl^-u-_<1Gbzd+8G-O=VwY;PDh@FX!$ncXX}fA#$owTj9AqAX508|)HYmM7YA zdHvO_+*-C74>qbETW1iS-uR-{)|};B^YZ$@)(D2WU}@7UEL)WQ_OHIZd#ku|{eiCT ziKWW?)}nlyxH67G0_Dltrz^Y#JbulJxpT_s)&3hFXT^j;J-=t`oF0Zh*JjQZxq4b5 zi<6`1@vfkeUEISxHUHx3vIVCg! E0BoaL-~a#s diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow1.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow1.png index a7a0cad53aff9f936f9dc456b55d44b57fc39e4f..90131a48bf96cc8117ce389ac97229626c1ca243 100644 GIT binary patch literal 8214 zcmeHsc{G%5`2P&DFNqLhOb9h*F_szoRt6K1ElXy@#0+MJv1AD;kzJ9Ulx)cw6-8O1 zv`A$Qy`(HH)`aiy_HO6*{pUUB_x-yZ+eV@6{#91FZD!?nr3jhEF zFlHt;tf#^D#m&jOmy!KP0RaAjkQ0s!8ypklNAvX{`;b74U_TOw6h!s_0D=bZXHjUw zXhG90`rcZOuh}kwm`JvUS4^Uw8>fR$$9JEEwL_54bm$+4>SHykTCzsp;Q zkE%NT2Toc#g%ixo)d(+IVvQ+RW07W8Ko(iSGr> z(tFQ-_T9Rha zv@~=r&55Zt(h+yAC_EpKY`MIo-T$`u5oaFX+XD{mJz^1;=ibmf>pPxI?32_q!=^V4lGtaHu*>IU zbxH8GA8N=C4@jK>UHtO2!$e2+LZG8EY2wE9Bm9@7=}%BsT~32^#k^y`ymbev_q8*10hnni`?WXw~)EY6+KRGK@S-nT?tqRzuGfoZ8mA(oku=F zSnp8fy(eYml`XLxacmK0DJs}z{v~rI^2-X-a*a8(Mqxwo5P8})aD=j=>sG2;9sVPn zU45%SOwdN7y2X0(bfvFtP;r`1CeYEZJ32_6oBN}Crt8xiqWq}#*-tRHUf_XRoZ{$i z_J`N>KFp0()5nkWC$AqEcEK+A@okBsJfDY&H1*xt;8(wms1w99#je`kGF$dPHN;JE zyuHp~v^Ia8FRiS4OtVpRdzrP8V3&F4Vz1Mo<+~~695tgKQ=_k$$j6iqW~4s7eP2WN z$~>$wHg!lPz?*6Zo)X%{d&-=t!+fl_UaH=$QbXvE^1kX~T*SNHfE6cEvV^_s&g*)_ zh4*>%RMwUbu^+we=v?-;rzrEO27Y)@yLjKwncUQN5MGg!bH9aH`xG^-vp&?}9o1|f z`rS{}b6LxH14vna3Q}WNrgehp8z=3`C(At-mv8Osu))w>UA+TzhfIq?_Ex-oa7*hr zZO;%|4k(P3TGNzbwvMg6(VP!&`CeUP^=|t0;e)g3IU92?Hbx@*jwZFYx$Qej*jknw z&zR%>8tlTn6!l77?BT*}`BH7u>GiCGUR^3W68CE0AKT^wvw4$#n?W~*yt_jz(cAbc z)NM9%3YR#j*>tB4wvzmGSdVShe4m8)fyf)u{3DCe{UQRC&R~O4WxO{IbQ8AR8*Gwy zDATzEOI%zE5w*$b`Qg|go>ZY#GdKkSG@RIT9oFqYE<;tEDq*5SanIKu~im2wK=rD zs#m_MJk_1-0k7p%_5L#8Pw)9aZN6ddoRc5Jf7bhM>|RI+MMBxQKQT+C&s#lnv*}l!rFwEj4_2RtJ4K}Ii8&pa6pBa?tMIvYO}Q;U!rZ4-{$68y$+QC)jo`Y0K zh(bnMn4I(5J*fxRyA#_Nt(Bzxzh8c(4w7{2H8+-Pv}#Lq5mQgE>)stP%NJe?w&=Z* zM^aGt-{akVMC5YV^;)ibMbS%4q3^eO<_-FEW-vdPfua%xrmxb?Bim?a`JCo#F$e4ZqaN zt4RlYv8XxwcNz!CXQ)$!FZI+#29I{RdJ_6kW(J{o>2KAr=i|gqln$AfFJ{J`E)col zUXfDS(6q{T2Jv$Fxz*zLsTrb9CDK>NKUd+XnwZ5KK6TTNH@V=al0xg*ZC;usu&mdJ_p>~?Ce=cWhVduX!! zI^&Qz_l$}JoS4N&~MNf(7^V^?t+-ydhq_Q)= zJ1ONoN_;ebabOL$Z-bo0R~C3=c$7iZ6dcS2UMo{Ss_6p%_(AZxa$#7l;`7v)N&-R#>9C(_DWQvn$~0h#@#>d#^>|{vrK#U>Pt4@hej!i z3GH8Z0eN^J`s4zWgblefC0wgt@9+fK?9XF_ygC}dFG zL-tA}+WU34^qltGl}Z_XlD`;V^TP}<(vX=%0a*wtF=wjFjFTKghv^TfJ&x~e_f_Jn zxR)wLKi0?{Pqos?&@$F#2Uh>=`94`L!yG&J@kXAI?MUcYic)82z0;&$Xw(m@itkd( z*LV%IxNq-m%S9tLitsn1AM!VLKy+v_G4YsP(#e(frZwk5myi;b;0GT$4!w5AG{lAo zN^p}7ROz(M962j9xW|1cA!IZ(=&F>K&~JvVrX|Hg{V}rTV&&HE9aMwf6a#O;RF9lv zBY6tBS==lB`Q)rraV`ddQ%)& z72-D8|4c29C=pdOBM|vPc-GWXzqp8pPe#GzQoTPLTY;-pS%s|p-t~J2)+NWLilHLT zF`6b|$Kj2Z^O^5sRaWjQ|15HQwtiDZUZl&3WVvi^@YV^LCGs^zLSHt_x8C)h@@tQm z+%kjkSC5Ye!=0}tJwaJVQb!NE&mp-|2zL3(xZY#-+j+GgUJWVa4-a+c%jC!L4tfa^ zC#pGhauPX34^Ldg^pTVazCH(QIA$$-7Qs@0k9To*iF!u7<4o^`_p7=Uz%fSdb$rsx zkY*?1p$aH+%-*CvbM|zxrHK;5^w40Xhjrvk%LO6Z8nH)pTGi`$4!a(yv#VGQ2vnkbgxH8)zQw1cb~iA+fF|;^htc;Ceg5nTMU>fgsf=S{O~T( zh#rmrmi5w+X!4Re>kK1FW}Q_Wv6g6pFGUqc^u?1@gD8HivkU;BqaWmlBY2Y-AUw&F zOw|Q1+-(Je$V6SRgE|(5^)n`UkJ%FU=DQN1;$q7y^nwKv)(KdN7rN3xZJT2eu)8$1ow$2{f`F zgX~KMZDZo_z5xtfFqowW{gEHV4~zX1o=X440*eo55Y7(@SA{_-6zJbQ=nT_97RaxJ z{#OtB3D%JhYD1#?2G9s3(?AlHap3O|M8co`egQO}opOi-D9MLJVVTldQQ`jxc@%@S z{?lWd0#7oh)5((6QY425g#>4Aema2g0r2p*w9RQG@(G_;6+hp?iNSzU?q z`FmE|P(&7#23!qEAZe*XwBR@r1c}1qAX+2@3PMET5t<$-7*dNs*vW=SKp*j?QE;s3 zBvWvnB&Z+Nb4RgFINHz}qYFl;!v2z2``{QJEC*e%C7Bu!^q1lUnL@H<;I`R>YakIQ zH4PX722gy0Aka?RqH%=ZgV1q- zB;rmWmf!Cxf)|eJNn)+To~b6 z{Y<)kbw44p%;|`VusGtKo!ly~><{5K{tyL^PxPY97|*Z~Tg}(537)|#8%`tU&xny$ zpgdADPS|(173Cy)I&6abkU8&H)Yno&ary8M&9mR6rlZ=!^Y+1C-VC1LzHRMAXu9O| z!aD9?T=B)S<1PA=HEqH1wI{1;rgYc%+EElz*5|s|fc2ssWw`IjFz{{ov_`*yCl_zHuW0jI(T*m zaaPq`ZnfdMu8+A@U-wb?d98qpOCvH^=*}>ZGmp`oEUj$Nli$a_;JJu(Dp(NXu56-v z=S?mG&0bZcYCd=<2eT=d4M<`#>-*-$@}_=<1EPd!m0yfE&ae)roOp|)CIHXvuca(% zTf*aK=0pbo_(ZlZAmD0_1WU-pz+g?erhwvnT!2k*$7;88j){yR@jV;y>Xr`PNhkWf$Fl%V7P4#O!w-E1Z-lU0f6zMqK}(q) zEb~0axqRStt$?8~U_B`!gP0%;sHSusTy9o0eTD2`D+c?&QGq1s3h+X{X6X3yjok4s{f~j~U%X_KOWR!X?vs8xv*+U(a{fMmj`sbF5f41wDub!P zrdyGHXGj9NL(2huk?kX4ouzSQRjGSkR`))V{b;gD+43@b!O*VCqIM5t%n(#pCC zz>Bh^*rTcKh%sz2kuX%e-&}D=?S|U>+|m3Za&nxzfzon+hf)0T@#o;K&!;QPZYv;AjP91pdEWuOsTsfrKW8CB8-s19=nYGY zIV-@Jo0ztK;%XnrWceesmKlhI1k_4 z49~v+`OzBe`i89}``ZOMV3+2Ra|8Civ;lo8LOOD)K~Qx5ZI+7au-W0g^Cy<7?x%nq zqCL0)Qr{|&_jeE4e}J(+Sgq$%&cWUKJwdC3R&Pcq&p>TiCq zz>mDhyR;6Cxv8S=4wri~21%NRRJ39`!$sC&Ent delta 1282 zcmbQ{uuX7+vN2;@rn7T^r?ay{Kv8~LW=<*tgU0!(6Ky>X2Z*%#2QLlMY7!GEJP|Ng zr=zQ5vfDxqQLo7wQd;#Z9<(0+ZSj8Y;o9$vPHT^ttWM^+P;%Snn2O=tNKxkX9~R0x zo>>r{HqCIl$B~QM_Pu*)b~ScN`osFGYtwYuez-h}Oq*f$k?rG^Ww{0S)cH0ytr40p z+&}Az!bj!nqW$+Rp2vz+q}}jQecpNaNYcL6sbXoY!OHVg`c};H`{{Hmd20P&7_qq0s#aH12|9N6w`quAc^QoT{mzy4y?>WA_xAkqJ3k$NF*XSnt<^s=p_ze!fwRCPvY3H^TNs2H8D`CqU|?W* zGx;KqKO^sC1zs0sUM_{nsk}}sKw4q)3SRlir+M`z|K+ux?7*ipxqwe?@+>~>$tU?V zCx7MhnC!ssFu9rEWAZtEF;xY3Pu~D5#{f@TB_llpB?vblC$S_gzbMyM$tN?fv_fgJ zkbsgnL@F$`s5mn}52V`AK+niRX>y=|=;TZR*%Xk~AYfCGTj1+!<&jxjl3!G52NMQL z6s4qDIVGke2|)#OG8KwTT+2$V5|c~7h8HK6rKTuB1(P!p^U_mOY?bttCchPMm~1Sl zF*#9Cy1+|e?Xi8Du=wXHE<)0gXgN6*@s>TCa#F}OOEROvL!WL7+;eDY*dE*Z z^XGv&7(`WhoXywl-@`WDPeQ>n-Kk+7ll-*Psr&CUUVb@cDr?&2$o;$l^V!a?%gZzT z`snM+kBq_kN8+1Y12?dVe~moA)3E9&5Vy`{^VeS=nfWH&_^?-Uj1J3!EJJ26zULBn zMC#Ip%L~4gP2;XEeA&b%{_Ro7r9)flMSUfEqAxu<6lb&ZM4UmcYec=D$5P%6It*Xa zqzw z@x0A9JERLH=xq3XXtCwd`f!U5#xDnhS>3gzuCRT#<^CXlqnsf`Hw_7w!8osY1@3kW zhXiD1F>eXZIrl&4szu-9`;!yiAN+WCpK#)x&#Yoh0b6G4w}Cm3!PC{xWt~$(69BuH0%QOH diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow2.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow2.png index 5539fa6154e17c821e8867ca5f77bccaacec935b..ae12f39860f52ffc274a700f9d45e285625ff1f8 100644 GIT binary patch literal 10815 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 delta 1523 zcmZvY2~ZPf6vq>e6omi^2~|+yq7{TCn-Dgel*kp7P>yg^OjUG~?52w(gpg6xVrVEx z6#-en6A4qb9t3GY23m@8SSeOfglemz#_1@^AqA>dM;edLbR55#|NG|szW2U)?_U+s zG^@Xudo6m2gem(@5h zV$7FMb3a88Z8?iqxguWhk)3Yqi0-;d?hm1P&GW2(uxIi@kDL*1tA z^#|`wQlqcbTKH$%7eM9T4o|^jZlmc{H>x+@d=~x>)i_IMW_Ok4lc&5qZ0v@~59kS0 zI=O-_wx!Qxkq77zcGjCk4${3zs&gP2L3|K}P&o+0a)E*aDdfr^9>B^`YvbaC5>2)q)hIBDSOi!}AVDaF5F(c& zTo?i&fkF=Qa1;Vjn9B#{Tv!>5LtGe9@&K~M#U}>l1o0FY5)2|76a#qzISL{eR{$yn zaxNbiKs-dD09ZO9GJ%y1i=s&f`Vaw5DbuNR}ThDPvE#PK}TR3J*p=%HP%9atahCzdS%b66Y^%c zXd+vmsoS*lKWu%_DRE&0s`?*#3o{7vu`45qm93B3pcg7WM>Q%;DFWEQTSC0YD4b_? zS{}>;IXG%HTA_qN0iVwW5m>3@3Q&O@h6Df^JKLAsJloR%@r4lN&*4}jz+(Szf)Mt* zQ-!eKx4@e^F_x{+5!zRKzy9M5O%gA&X4XETwNs7h(N|e$juus{$Mh^rqZAnc9T2*- zZ>FY=LZJ>y#NjD9X(IZ1feoA8-Du z!e&N>zkT7CnSOCI$BK&0`xcvD_FU{)JHK=zJ`X|57ar$K$$v^~7!ALf7jR)EEr7XW zt7lk3n5`!JpQ(%^mQ~c;^q{u z>a%pDg|u|1LF%ZLhWO|s^!fnG6z=KNN-GHSxU(%!mEAyW%UZQ+_4OSm6Y~2;)Pck2 zo($MN@E<$;vU%~v39r;?(^K!#^O}a=i#)Yu0rk&2z7d==q#{Ms$@XOX<^FT~X-`Cs zkG-#Nq@;ib+#251L%Qp&9d0R7BHgwzIpflF(g0F&?>4z^tbP1en;Uv_!k%d(J-wIu zUS%Cag#mxf7_lL|9@2nh*YdJSDriXjOQIwW)uL@5FSqM#_CNRz5mDJlxm z1f(b+C}jZYO+dks@&$C}omt=eXV&_@f0L|x@45Tz{hYm@z3*9fuY1kZME5uoKNA1| zIIgd!Wlp)OA07;JlyfoBcN_pwb=bwJ{IPJ3grPLOpH_56y%B}dcBX-PTXjpf&=;^Bg(>Q)*7zc(FtZHv5^`dpGw z^!}6Ii=B9IZ6B&=cyF*56VbZ48P+<-+tk#!>flW)%cxr)QT9D}|8qlx(4;E)?ZCau zi(y`g+sILQ%|{}1OxqeB+5s=JFOSNnT>TLfK{vl$TmH!{xG_3s+xPi$-uOY*UfkEc zO0_+QxN(E-Q=*T8>UU1&jWe_V5XmH)D63u3Q@pLX-J7<-qNDyI{@v0!oc09~301W% z*0f>ygRlPE9A$jjx-*(7n@eB1mfjY!A!q!v*JUFXNxb8Zy?zVNAF}m7JqUf=(3?G? zot$Ah=VBpu0p+5MywhAzo|ON&WL*uag_^j&W?+pm$J%f5hhZkd0Oc#WjxT5-2f%*FV5nmw~%{4JwrVsFiNFE$0!k~1<6qD*?AX%8|=2qm=2`$Vdb?U@F z*Sl7pmue_kQ$0}f-o~P*=Kc8#D`5C#xJ6f4_2~JfER@ozK-IC}2iqJmiHfNL!MDtG z1;SHR<=?_LWvbpHelQvG?pAC_m6X>ugovlX-3CgvOAssfEI&>Kd?L=-2aI`cpL;KC zqZS@Pqj2zmm(~2+#bE90CHc=-e!Fgxilw{wN}Fw}6$s3^f(@_|!9iwNs!Co3rBWvt z#f)sk@GGT%+zp>hy;{#+^-Qal_IoQk)ntto!TVisF(U6^iyZg>_Ye(Xh z5})xm0Rr%49O_$Y>V_HT^C*eSAMk?&Go~x9)jz5osGkK46~)aB_(z4C?0?%~5z9}m zp;ZPF{F*#YUVK6t*NkHt#eIB3=#c>yPM**m2RylZtFn=c(8wE@z1~<*8P;E733Ib?;aBVvvuVqNdAm7OOtJ|5-+eQP@gD>V-XtX-4v%qN& zMe$-V$KAK_*5fiGH#h@_;Pwp`GZoLAZSjnkhwJ!4{bH+!W^UdR3^}Qs&Rih#g$)*E z^6C5M4H8&M{*~T#zPIq0oXD1YK~9<-fBI4nTc=cGd^NGC7x8}XH!@pw{N8P9lQ+*V zVnuMh%5XL&$ufZEvOR8;mY^FiX)YWopK#o;E_U;#$At1|;~Ez|m%5ltEvpz!omE?R zkqEng>Te0DX`PALsXW5i?gk;dnx}U3PC-O2r#PQ;D|8zWkB;@y3wS($uPFI?Qzw0* zfYCg*fj7-=CYNf%nc=K@v}&Y{Ld=h?1|zx^8BkwuK2mr4OS6d3rU`3#XPkON{pr-q z_0A_oxx#UEX$Evx%=BfOZ?t;^dq$~I3yjY;mxakx86GPP|2l>}-aS^YB7sz8)-d&q zqfeHj%@^?hT%hUJi-RlN1;xJ`%K?!xPROisJLt6~{tmGWZZWmz7^nlO^RZQwdzGSZ zhjt3s;v^v^@efnaw03y#N37D(XqIr%Io*_8?Z#P%=-j`}PprRhF}R)dwt6)Y8UdN) zG+V>$fJ5BM?*U3bh=yVw-W*kS^3!1DWbb%y%tm^^mojL=9erZ@I#T4m5=Z^w*Qn(! z3C4ld!S^X7zKTcvplrvrLb^r!F}WGiDQ)dCvxVR?L2QrKzcgdVCGI_hvo}-7pcBQkGrC z;V}1MC&^$7;Z!>^O1SXyZ1lL1>#0FD(JJxy`&_@XWf~%i5W#?ix9!85Uv6V=j$9q( zJ}*IoP#gXY$ah@o<@}9cD`}^c2YC?SGnijd{2-@vU0J7A7MoHRnY)2D$oy2xZCsQ@ zdPr$=$~X_TeG1=h5zgA(1j#9HS_}ICvVZ;gNuQ4-AvQTZ&GV%(bGGBOLxkM;s=&)# zi%*S>r(7QU#*JMQq`DQ&zA&g$rI>=g!+6Og%t@g^GHkY(`?W9BCKD}`>4VcT#AhaX zfPfux8koD43rdV=-*Y24YkJm8w!P{*ooYfYr@A^gf-$|AtqgsW7x7k??~EvfS{Oy1 z6&dAC;^%RiT7G&Xm<@SJ_i7(Bb`c%r4d> z!r)Xyw{8lU(TLM&wc`$7QJg)VE7Ha#|&k?(^BiF z*_HP5IAVip8MzA8Z?<8`chV&+=FIz8m>%_G3GPd|G*BEv14C6)%xyCiqWZCtSCElF z-@vmzhdU-2uojb$JlC~su5|&D!|VhoF`cHPt)E_=x9T00GVKH^{w{P;2g^{ikT5Tb z;Kjr3#!7Jxc26=|F{jFwhU8-ehPq+~cyGnu!7!zWp2kd0_CY#pU8I7{-8=fuh3>DW zkM(}r?E)vazdzQr(KP!(_4w71)`$?peWC`j@D{OP?NPL|*U9}tB2XLtseEBa!bLUd zYUfN>jkGcPUg;dw_04iG{gWmo)~;7uW5d1~M~f8HxmsMyV{YT4nFBO;rsTYRCKqcm zQ+Zo_#aA5SaNE4G0`~O8=^L#hDs86c`_nd{Zgiy_uUPAqNuNJHeA~h_CZ@TT&O;4| zPO6l3(unC3j1|3M{RmOXIIURv?p>qZL#t6+jC7y;e9|pu)894J+iYvXsXZ_6mc=3% zn=evJsmzr3LLTk+TO@QBOKV)?XP*&>_3i4{pcVwya>!fBUPIus@;Q`3lo~V$G%hNB zY~uHH!>f(d?yY6lvqKeDVyQzN;W;{e?W|1+S2@sxmu2KE9wVivM)Muq;54(d539&+ zYj@BYQ&5lD{t!`M4y}Qa$2oJ>s2DwIGUsh&8Jq=_?etyfeIKzui zq}Q%b17+aNTdWg2LmJ1%onhHy35@M1@c*`7pIASC#*B9?}^rE`|T(nQEV+BrRq&e}N_rbgR*EPL6R4;e2s-cVTdUBhWe#kq(5=dDW@ zf=Y?P1`ZsNjXd^F_L0H1=X$$h{Kr{FCj`RYG80-ZML(MJ-_LUyDZ^xh+s?Uo4-WUM z3nl146AUUH@-nPOwiD+FX&Hj2--fq-mK^qZ+T1f@&zp{$G6&dCpU_R__ zv2Nice*zaFw6B)O946AQMWS>s$N7nrzQxAa2#xdhl*Qt`od~i)o<5Wr06`L11z)7?`2~CIx$uu|Z%j(y2p; zpBP#M63&n4LneBA0S_^;PTu}x6%dFr5B$SFPak9BKjFPdzgVE~As2-8k%P)Y_D{~7K=StY!x6Lt2wvn!b1BI3gZ>G{h+=I60$WI4~CK344MFJ8k zujr%z$0Gj%rSC-|W4&;MLnsQkERljEk0m(akXSre0SbeI;R=+rDx&0JU}t9-5|6|q zXF3M150+M7^r}Zh+h6d|53Fh zdJ-(i*h4m<2sjKSkANv6p>PF={7;{ctgQ)tBuXV7VnQLZFvTPD!?d6&!BB|B9@Z%Z z;7Cr11+D2vz>>ZFEWN!wR6vIiz(dQU@&+pZOo|?nM9~O7toUCwe-`WV^X}&(;6Xf^ z0s@c97LCRIT!e%TAmEP{qS*bM!ntC-TnLos`&U8zAt(NqWD)QX1QY_pg5^3nfxYG?W55iUufgM5W~4wF6xVhdepgP zu6}WLNaO$G?^iDVA6KA2|GUUP;`d*={-x_5G4PL+|E;cn>H0?u{3GRmtLy)aE~fu9 zJOnSwTTmdSoiTw#QajzoDYnV#*zjxsY!z6~)W#+hLj| z6Bi$M(>jNN=WJPD@s&=)g9rMWsZ&!Db-aSRwx#Gg#ihkbDTXLDV3LVRysY_DxPFdy z;tAok>1Uy=Yh&~~ON4^ELb%9cTOBEm6R;60(H$m{-#MCDLd2aHNe}N_bqOD{Kn~g` zx&&|U*^U{!#YbX**@Olxhc`RM^E`Ske2PKZfaweB%Oi~wVwYwbmNx|EqFOFxpM(w+ z1y3ecACOz2gH-S6-doWKLh8rvJF6dY+@N>bRZVQ+P02-6tx#Y;tFcprm@&{a%_i zmn~!42Wz|xW%VTY?CC8ky?3Rl$d|7~A?6R3{gVR&YkF5EvS)WM0irnk%GNda!YIut zos*%i7Qp53ZzO^`lrZ|}*-~0sX0F473UD`*k0PWe>ltgaD$lmz-T9|7=)|Pe8GDxN_B$L>U2Ex_D!%2e&xQxJ9El0DT-;wE!)hm@V(7ubcxn zk;7YexxJ%W--gt8FKA#ran89t#esk9DR&+Q`s~&a7`C;dCD6`){R3X$_G! zai^*DkUG(|wdpg}5k`e5fN|)zhpr#Lk@fpSoJxHPO9HBO;SiIZ^{^ zxj$|JAOQ=R{;D%)?gH4;(p8MbvH_=9Dzrek^_-Kckv{;dG<9r;gUHxk`k8R5&uN2a z02eijVtb72_SyP$r50z_EhA?JbT6rrOb4Zb;;s4y@i$?Gb5uPQBQ?e4-;DI&~vI=C>nl?uQuHqO!G3u_5oCr@5 zV_Xvn%eqdl`N4MOYLAE5$d(G`y^yIw#drz= zgu!6$%7uyN-;Hh;8$Q@f8wAU!~rpBp=}F?yjHiT@4MzUe@E&Ks+xl&9fMko*aAO zm@AD0aj-CmXWzAPRef`5=Zj1ZYao9l9>MRABKzNdIg&gf0f;OXD!Wl(IA?S)WOuyh z#+ToihwK^_sphr0Xd*`zKF(gCR*iZFGl?j Dt^%_Y delta 1570 zcmZuxYfuwc7~PbIA_tN#C!$W4cm9K#tEP!>Pn~$b{p>z~LP2pP#s#G9UY}a(+?y0DHpcnn%%X z;e&LRk+>f3_h46hhrHEN$|4++eJXtSR+lGCNBx17nx3$fH7V$xuxaP$)B^m#-}O7( z+QG8o!nqC}%vI(+OCO1su}Tbq4HK@-ukD+dI*+!l6NNl}SM8#guG@OAc1yq68n@VK zBtQ3H5z4M}9yq%9Nx_)#>HKqV=<7zMrY6UDQ_1?A%zZvpO0UL7b!NA>w#kkj;(2me zOG#x}al%E~xN=JBSvAg@Tf14Gb@1*KEw=C2u;5(VVz}hU*i&Tuai;ZV<)&NHk^j=n z?z$RINAXtx061x5Q}qDgJl_TyP=0U$0N9U_gY-ligA8Cu>=^UdWG*Ahhgzu-qEirJ z39iR1KQL}9^D%Wf@gn}S>jS)yXxrCGPE&*h|%M$Xii~l^fF(+HC7aMc5STh%XEhKq!pLAq0_&FfNSA6+wKEjCb|&gN1Ur zkcYq!EW+dvpFm*8&O;Qz1k6K(3W{0e>XU(RgZLOO42FbU6o>dCISL7Jo(NKi z%{cOK2#J7%&;k`+`G z!ZF$&NDgj5ZBe*Ui(*;0fsLybp(aoVhKKdfQ?~*D?OvQDGR3(5(f5}U&db~^n$+SX z>AK=pdw-Ur(^^GbzIOpo;N70ovYH>*Jn6TPwIppJ>ngosi5xy}9bzh5@7<>l@{acL!CPdec`ipZ~RH zI6cYBF0H0)tz-go|2UxY*^N5?OstSe04dP>FqR*ogvBcxqnI&|tMkwJUOL&+$0(}c zn0I8|Pd(mE`$4t5oUHQ$R)6jJUJNcv8KGZ1?QLQ-J0&fy4}7_c_NB9xnM`f##)ngG zuN<)$!U|ta-qCjP*l{JVkaL?HFNZ~Zj*cs-!doI5J?cICx53tg7)FN1d}(qp>*eY> zU7G4QE*Xhux1Aktm=kc8ky&SdowKN@^H_2Q@4(n;+QXu@yT6}mu{Q>4C$YRZ|<&ZULj) zcQ?}ZCmrp_!nDbm4RB%oL*K!&sW4IGh{gJWY}E!Qnd^z(A+XiHx_(XRh5Vtis~rrP giQZjy&H4gxSv#WnG=1xS+Xn^2#Uw~-qcY6@0o+YhW&i*H diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow5.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow5.png index b26c7be0b2da6c07fc5f962d1858683c3a6cd74f..83797163f225f940ae731ded308e1418c5611567 100644 GIT binary patch literal 6896 zcmeHLc{r5o`+rBuzDz0-8B-LR#TbmqZe+`v&~jupV`R*j8GDwHoh+dgkxo(4DHM`5 zM2nIoOV$=^gs4;M`;I#2)b;!RbFS<6{jYbfdFOfW<#XTn=eeKfdfth%voRABmK6p7 zK+M9N-~j#_^1g!W!21=t&maH@-VJhe;W`lgVJtS&o$f`2aRXUY7&Ut>$}t5i^sI(Mm{rFO4l z%ZlNUzQ?j~QO((%Ine{~+4kTIezt@O-PmRR6|X7PYi-vLJ@M`Pcr!gHv>sJiqxorq zd3;%!EN@A-zbMi}crRo4#p*a75A7kGT0$(2)wrhxV{k9G8R+SYZR)Mc57@f6F2f8J zdd#5OOzm>8;9U+ouuNf4B6UbFuLVD0{kii_*5Ketzlj^;Im;_Ft*bM7WNAI=imHLL zLA`BniE_%VHC!?DwZjn#WZ~YSXr`&7L{vldIw!})Lwmy?kdif)JbY&S?m?tD2Ni|z zDoKP-?n)Mjq$J7`vut~(hr`;mHGfFGy%dA+LG_nFmpnJBwa4bGkZx8)4krxFbxA+e z-AJmQY;^uZP03&DA?xMmcw*o-pL1>f^{Am`g_ewP*qtmrQ(3vIG~rht+W5u_bJYI(O)uvL;__JC!&)1jkx$&ZrH>>hk8^W=`Q(xWz`gm@=LpFjicWqpC@X5X@> zv}|m>Lh0T!zPEav4-5XDA$|QOrK`(HJ1X1$4==B#dsj54Bs#ra&et3z%vq` zH%9qkC!TP*umrhQnPTPHft8V?Y%EbwQnBh*E!fhkO13yxbtuKF3Q%2(6vd zQ>N#ebhk265fl2?UlZ+VrM(_v82M+8EiO`L^DrVLtAipBuuI41+JN@D*Gc5p_cb5C z%n>Dy^v>KB9js*Pm5=yK==Z|CiW?k-ciP0p^maP6Ro}!q3~e2~=L6e-yGSu}wDrR7 z54&{)9ajHXBtU1bBe>f6NVPpi8yItSR(QBBK;&?9e~!MmslfeR>z_G#4bhD=eXMGmK1WsvhqdJP#MRJS zj&9MHt_^clKBjz9|5^0;-gjY6&x<4UfoVs^9=WD`DI zZ^hDvPNd{Yiy1e2ltwsX;-iP(zK+FenPSr=v-UA8GBR|VggWD~#h zi~CNo?KL4;{A*J$gg)#Yh?8w@DiiY%@#I*a*xCB5q3<0~8)+Em`nz_+lcvJ?I=<$| z{9S1=HbZ=q$Acsi#QmIPJ-Tn|ZX9fnePmYmIamE`Qp|%f>!^f2^FsLUWSL;fY+y|#D&lI) z&0`nu$UvRG`f3?hYoKK`&tK@v1ms4C4JF;r2?)}|_vFKN^Ho-+IRN99@!?yeHW&vh zLVTQ}<|iBFq$1}dilI}N-L|!>UUZt4EH6oX4&#tbZ1O#oE1gtad^XesZRvWilomI( zlo*|zni-ZBdfvmJJLPIl?&$MRY?0jfry1FoHQTTmqe540%sA|Dd@ZbqF@-a{d8MIf z7!gyDHDPqSx%-&;Y!PxuF3#H4^R$={wv6BH#=>O$eZW$3IpmgjkD*Rx`JWLNqdqw` z3CXWtaD5C42Vq-(3sRgpY*@9pe%$^IT@ck?^}6A~Kzlg* z!Fs>8Vu&gk_i6L?xR`jW^yq_i(f^`!?x+#rrwZ*?yy#b*D((f#xvI(+7s?PmI=Lc|4!m~7HvHC!IDn6 z?v(xd6)`?jx8_GsNE`n#uYpekF^^JR2XUKrT`vu2WYon`tj;Vn^a=2@w!6Cydu@Ph zz-WFo*tPd_!3l)od!LtmqgUgl(i5&5;;RqJz2AQ;d5x5si;&!i@bP7qAU|KySk%Vjr$Ts$f1t`(Rm&jKNNnCuOJ>^V)^g;VBFmlH zvi8PmHZya3AYU*V$(QqXS8Oy}H0c@kpxuE!|GF8rW>--_T&C1-dwoY!hAtU)4p_FT z^o^Sv&*4w4?}TD6c)8}Pxkc|M=vI_fI9QS^9U>%8BZ4;DPJYd{+o|N-FvohaW5{3Q z#Ct#Gh8x_xs)u;1s0-0@@8$2pj-LzmNWNqib9kli-cqX5@y@efW|zN08aFz1#Xj0( z1Rii?>EJ=e#deu=;lFe>b@WwM{>|nvJM4qpf9W&fCm8>R4x$~!0__s-~;sFtGIY@%oC&F zuvHW8Q9ZbewH?fa$)>`vNGuYKFb$ylVc`10FkLpq9q&Nc^Bn?w(t~?&xhy;icMdY&x0rjDu?OI zCR0uQsNURdKSEH*fBUn1*K$Y7AOgTjL2#vM(<^3xXb;7avbylIaxu>QIY{ zrIN{L41!A0#v!oo8bkyUhe0EB)O9r7acD9Xjn@7F%EFt&C3=&oJSY$xNe6LAXbl~T z4h4V<`jE)XPQ99-Cc7PibBTkVX_%Sa60J>B8`e-dDB)EJi_rtb{2YY z3=;j1#LkPzbq5{v;Ct!bz5)Lz9O(?|J}!~Rrn(juqobjvp{1>k#cH9y1zN>(qOv() zC-N}W(MSw#)txsjc(53dSR$`aL4Z{`SPR~SO(k-fY)2;3OApS2fbl$6+Z(3)ZBoqX z9MB?=*YV$b-k3=H_VjHDc+po?FxYC_;)&#MK{!M|DrGeg==V)U_8@xGsNnkk-cWzZ z>HlT2s8lT~TAS*Q(ALxe8765_5kx8#gCMDEQ%GctJ61~z`!hO+>CW{hvZ+Qiuu`xZ zuz^;qf$dzSQsrlBe-A2;Cp5UW(dr0{h9d@pSI6M7+G^_Rcr+T0`d%=Kx2pfDSQqtw zIMH1-_+c9W{l3Y-?FHPeP=9Y%-#O#a_&>b9&&B^R0to#p$iL$E7hS*T`d1A6E8}0? z^^2~5#lXKZ{?%RoZ*&R&^TI>*22Vl$;OmT(=6JqY9PA^zK*uAgu5w zv_UjT$$gS@;dB%&W?{_$&4`24goH0uxFPmfU=; z_fe!#he16vRTiC62hW5VhbO99?rbzp^h??xrGh^h{6Rpz)*N}}uo9ZRE01qu+L*xC z$e~ir1*tJ_2b?&!=J`?!T5@2mtY-fg{aZ85LXrXNO3E^89Rw~JSX?hJ8;3qA6+3+R zHa1YAVgRx(m)n{mr(*cveEXVN+M@M=yxC2H*D5(jbH^4T=Ff`LwCm~>(GGdjz9;?t z%iCv$a$kQA1tOsAYjY+m$H14Y(JK=wHqP$am1YbCqGh0sg)?Vj4>TT{&ee2won*d#aWYo{ z(QccKJg6WXIk)dMk@V?x*)BPE=1%YLf z_<=HsPu-O0R}~(0%%=^tZ-wvsy3&9;*+J6SV?HIbz8hEKi_h?J1)jWCA#QRqaR|wA zv+*jS%q)ELiGG!r!N-+2KH70-^A-5Q`Dh$~E{cEn^)X~2eL6#cb;JXA)4Aeg0i^cT zwEvCkaa|3y7EItoN&nr6;@ZXjyum$yAOL{@{NaGi^A2RxB9dYb0Usm*K0}`7!;xpx zmc>a>!fzP4} zh0zX%36~S0I%b_SZKdT}f~TiE%Qo+U0O;vM`{ZwWEQ5RjDKjhwdAHM&01L?<{%jCv z++JU*ILB^F;E_6VtG=St@J94)m*Fz)I=g;15=ZH3jSU)A9DPyCHtsF(Fk8jVZx^Si z_6*HMyyiADPZe`S_hOhzu~2wZjk44D)~qjnGJk%t9%_{QEn%PhDh=NV>MpcTGyaDg zbn%2fhBG^oelg$7-Fr|~-f`pRB3H=%R0v?aT(O9f?6}5%eL~D_xyA2&boqzj{mjcs zY>LI8WbRfkRG3@NF+a9;MbL;ueC)__7G6N~Lw8s9ym4qy^I5d?{;jg!EKJw7lpytv zAeMta!1*odR`Bg*&dz)hKw;4m06-bw35ytnCCtEtBQ3EYti^<)OfLwxV;td83<-9?2EmEg)o>2h z4Zeb11wX-h!nQaToQMmC^*B}ln9QRwQ{@t_k^zY%Tp^z(EL0Y! z5vWi`q$z1!-h3|wH;tbRy$5+IT&a+s%z(%cjI|7gIhG!9x~01sB!3V^C;vB|PX511 z=5^tG1y3%LnVZdJ%%hvanWoC*qnVr%zLIOMf>bgtZx>$)@};H`*$tbT5A4Qj|Vj7%H< zCLX!D!>Zl^EKv;w6!}f3FQ&HVHX&-&FRfqI6;9n-_)}+@6cF#^@UL^|mie zP0oJgq|icI3}vO4p0rAq2^&Q5t#64X5=R4y?66 z<;6F9dopqA&ZUIKc|Tc(ZVU~?Py!8h>i7>^BHFlakJFVu6aFA=hzRp9Y0i& zHM$%?FaRpyuG$9F+u|R~p5c0#Q;V91@1U-_GLbgOic!&*)(Z@1PIebR)S}iQDPG04 z3-#9C25iTDTJVxj_iDOO0T*pNk5|qNKN=gJc(<6jbyZARP8Pxm#y5ZLbqnb3E5Gk{ zZfLvi{i<`Du6cMYpX|a>qt|`4@mMRtpDQ{2U|QIFV`w#QDM|l7M diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow6.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow6.png index ea4706b1911f1825e785f39c9bfe83f1f3defead..2cae7c43a4c77e1c531fe25b58c365624492faf0 100644 GIT binary patch literal 8464 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 K>J(`?NB$R18wZsD delta 1608 zcmZuxYfuws6y21EB1r%Zv8bbQ0gJ*Wn-DgSLJ$Z_DuEc#4k*fIvm1ku#3U*z7$%CN zw#p+yDLQ+!>H{e5tbC91pfYoe6cmDG_!e2XA48gv<5vki?d)NsEO^P7t+N((PiMl@q`zseEj z_<9fGs1bK&Ac!!MALkf#~;TNN8`zmEEcV)ZdrbJ`2H0RZ4(h)Xd6 zfaf$PC_q{H=K$b3YeRi}oi^@(DMp39%G6VMeXNtkvsS&KOnc z*PA0i(DstXw#}zU+A`@OwsQJB+j)BM6jpXtrp_eJ&NA3~=}eDo)WG4gVGd}U>*XKF zRfnqid{h7-JRF1g!cYN(!l(*D5S0ky!k9`O$_H(kUb6y(DwU9jzz{6LR1lv)VF*Qd z0!YO})L{h7LxgIQc+AT`9pQ%ZF1&q!y`o0zw4yg%}31)R=gY z-k61wvb9;L2Im-b8j!VECRd1~6tW1A$A%|DMJ8${NNNNauhp&325l1W=@ta$!EhKN z2t_7X%W`29L(jCZ;-|LzaEZr_#XsK=n3b1N_+SR-v5^7!#_S|mC{9IMAkVMBnvmA&L}e5 zfMRQLGYi+LBP^g1jFeoNqH6&F%6*wMDmi=AlOHZ6oKtw`>r)Dq@|A@xuE9)qj}>ZJ z&g@(ucXpeyc^RMG^ek`&b6)BU<~8bpc`EpveSo29x&MIL&lfdDo(_!}*gmwO8E@|2 zaPnq%KDzTzMfxf7>5^JqxsIsx5(Lz?w2JCm!KmWvhn7H4Zd}LSGL0Tgjia--g@a-|Jw0olREWP@9F7@XSSXh zsh<>bhL%z5dV@2kpyOy#I&c5*DaxaQ)_cF7tj{l!Z)!SCgo%x)-eT=*z2JAHD$=bR zs7iH0+LP`$^v)`OEqFh@@EkSo@NXnyZv&6OdsMcgqjGG0>TO_X`|bwHKIM@sn8c8j zQ4ictLm1QT*w(Hz1B`sSg2j4*X?fr`iepQ UmuXw}IWH(c7MmcgiB7lv3lLLlQUCw| diff --git a/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow7.png b/Resources/Textures/Structures/Windows/tinted_window.rsi/twindow7.png index a422e8c1526371137e017ed0c42b0ec483f2f93f..17304ce1044032ee392be2dcc63be90d6580eef0 100644 GIT binary patch literal 4882 zcmeHLX;c$g77i)|*%W0}gfh5-*%PufkzENIhyfK`W~fvup_D9UAwfV91x0Z~2Nh{V zdk|$56|iM#+-Mg@)OKra8(hFfToKz5RKR`-h-tv*m{di@>kH@oQ-T&c)cWdpO+Cxyz%XwIWy#snkj-7LP*OL=_65226^> z8ScK=u~_}c%O?GP%(-c2vPX`(bSAd=rQOTdk5d~PpX}jZZ}+v^ZZ^~jpOO}S_U*@& zysp5e5b?St`RXuhQ9V@?P`iWokC^MDWSmIfj8`jedz1{#A_WjX{HqA*DcniQZ&h;Bz)@_$EW3&t3>HPUR)R( zw7RmiKHRyvUYDKa87bQ~P2lG1ebjpSyW;eg(!_&sNlSF4{eIdRm&=fWzEIR5Xikui(Rhv^K7Zd+|GlvHQVeUdQx;xOXQ0|z?j zp+DOVRoUmvTQ}a!Oz1f$tlXu{{>)Z8fAi}xgd>oDaRZe7UFeXpkB>2?Q*$F@TpP{0 zE9(6NCuXh^4SXE&=%refs-l@nXam(2HoUE}C+sBLWWiwX0Sf1Y){mtS# z=Jzt~)I}BM8}tpGMUT$m*mdga}>djnj*3 zeycg&Wc8tTJ8o6k@U~?1HuRN)^^)PSK?yOh(Hw`x3!V7*~A77nX^>OS& zpz3t*IdPVeccb04$HRSxD*VFh1h*7dcVK_Yai)hhqpV#sY17}{d*^N3)6v{&t#}yU zmCV|7GNoosgihO~qxD?wvORaS&b3r9PYnid3c7DCHzrq7i zGpJx>DXN9Us0>r^2yNA;2oNUW5#}=m6oD!Tjl)8htI^2i;Zex)r3gnt@SASsYv2L^ zIjV&rgFIfL;Tm`Z6D}8A8^vS-WHQk%q&Y#NvW2RsT>Z6Oreo!G$ODdY7!M%*g#ZhJdF^&7{RCp zQDZ7Crc^*iOjxYcX?X+!&_kc%ldA-Ret3nZj|IR7*#N7^R1$?Omy-v2XtW^-0HiOV zKlRW=fqjZBLN!XA8bL!6P=(fWAcO?z_gCrE@uqYn2pNq><-k+}R;7NiZDjgklO)*h9^-F7g z9BSl=0%n^+CDQ0oG#Z!6;LvQ^vmJ|Kh~gWH4YG0DiqPu)ToY zirl|l^>JpT@h?33YVjAY0H6mK`6_+~=^CW#s~Gqy}O9Ocv+_TL7T$E*ONp|Dg3=5 zSu{u1HcNpnS9nwpWgfkT2jqPHD3A4zp_Kv>ym?p0MIk)$`Y5AE(u>$ake) zKbY8Lc}y6GRBnv9Cd{0i`Q7^BIVb&^OV1{5C|gic+QNHhUCWW9yPlP2Y&lKHfdW&r zyuzl`24*E}bQnFAyE&;7Kkig0Y1g8O6!o-%A&%M2_>Zgamoa}I-K-F??X)NFyuCmf z*pG?-cBYwNbSP4&OD z=jzZl*&9JjL7S81;Y!WY{N^`ip*Id?vreBGPZ1S7*KOA8k6(RpKfk4G1uo5AefU*S zcQSZ5wGhvm8H|$|KeIhJM#*qhXp9DjvmR~yn&EQuT!0X-PO~y4UtJG}3=g$!^GN=doN@d&_xGEFC9o$>`{w_{e-%6G2Y8UwEZ{^S%6C z@4Uyk1J3~m`&j3PmG^81NdCv=^bL*pqvQv}zf`CGR&yc8W(9WV1?Vmujvo>pToM?Y F_6HOSG7bO$ delta 966 zcmbQF_M2~lvN2;@rn7T^r?ay{Kv8~LW=<*tgU0!(6Ky>X2Z*%#2QLlMY7!GEJP|Ng zr=zQ5vfDxqQLo8&1+?l{JZL@s+v5G)!?oWToz@;PS)I&tq2#vDF%`qPk)q7&KP;4Y zJhLD?ZJOb9k0Tei?R)pq>}u?k^oR9V*QV*R{cw2{nKr}hBiqL-%W@0usq<}aS|c=H zxPR6ag^$YDMf>ktJdYKtNW0;q`n>b-k)(aCQ^nF)gO%s0^sSiX_tWWC^3?jzV(Du` z5_|1_ayv)Xrp|o5rA^?l(zFQ;9IT=ufla*{Z>==NCY9)I{m8%TAInaWBGH2^YCWFnU~E^T_+-H?i1H{>q{=S(R07vOlZ#ucqaSzMA|RA~nj21*pAq**y7rXvYK1#>bd=d+6nDHNBumX%l~XC&sOr>58{ z=_^fM#O^Tp1-r&%F%I>51$`u)Hu~tM+2~`l7^2Q4wK%ybvjF5?uo)21AQv|v52()y zs53XUBoV~3uP8`N&Q2{+NX-K}p-9Qz?%iYEaA2g=FZOhC45^5FJKK=A!9n1F+!KXH z*+2~k5o@6fhl5xR47S8p6;GCbH);N{^E$7$8Si_v?_BdoQR8bt3~QD$M0hi9n8uW# z%X%P+t6{4ML-x-a{vXxz|9kl}WNR|uP=g|23DNz9@s~c>02E2ET+p!!hF4-dbuSO~ R*8v^O;OXk;vd$@?2>>aBXYBw0 diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/full.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/full.png index 5695bc0c26c731ad7753c4817a372db5d7479cbb..f7b6e10f869a9ba3ee1d2f09f066f153b5e21e5e 100644 GIT binary patch delta 1302 zcmV+x1?l>*1E~s-B!3BTNLh0L01FcU01FcV0GgZ_000ErNklm1cWW=*sk>-1S_6Ke zxx6sKg~{ImcyRMxB1E|()eV579Io5fm?)0(TKYI?-(rChkO~2?c*g1Cp6M;TnEL=6 z1-?KE3tt0DkTro!@bs5+7h!H~2wd8&B(vJ%ld1DSgn#&yzZ?t-+5=1Qp8EoC@f8?B zUjX14V8Y|~KEb;)XCdW-4;!P2;188(5O2Na-lBwyB{g@efOJ%p0Vq@yL|n3qQFd?H z$!y^Zm=~)6A~EnmDFsCjauHs>d>>~9h8sBkZxvVqAQ#?0cj$gT?7c$4bMRCZW_@T+ z13Cn7ZGXPDCV0h6av*yrC%MjT0NbIH7@Jyd0|PotqbUF> zDad^nBsSk(`mQOCmsQX{zy9?bRDWtIyaEsrL0mTaQC!g|?bcCocMX6L zwCN~MZr?{$ug&lE(JmuFR!H`A@2ay005Wizwz52GbyD=I>kc4=z%VS*kqq5#%Nl@C z2_snfnl%XlI-{F{hH2FUgc~PqR$EgXOCjqG;Xl?{ZS4S%ud1d%G*TVFtUb+Db)#t^ zP=Cr}#-3^nkdbk|`QsD-DG{d`>NZ;V{>l$53dM5uWG;6W{R*Oq`JZs(!L?eX<|7zyLw}$h@bOnVp6=hziKC~Ft%t*BUwVp<=7!jo z?4sb6u$QV3Sq~=|)D9-N{B0@T-*AG%GY9G0 z{s=iMsA&~2UcSbHTj1h9mjQTe+rt?E93k)daka&Bi@NXlD8)@O_N{7 ze&OSeK`PP%e-X$cdiwi@MqXb6t$#U`cz}WV3t+~{xltUWRvVObk=v$pG7 z4r4P5+FP-ix=PuEj4v6*f#@_{bTP&l06lMK!x0FJkb&~g!5PsmGh^7S96rL!b>?aw zYtdQJB{dF0fK0MkCm3TMv?i}5#Fjvrj2UB~b0B5_g8KMY9?$;;gjcr_8V_4L!T@CSsfP57~!&FvPZ#nO`PCCZi-t&VQao5rFUe^biCAjYF#_ z3L49@yaOP4mSyx|Xhl&(5ETGkAo=1m+U0o;pOifNR~&|+cUWd?&M5)J`|%DAfcXCV z>J?%>{h;KCovuz5z}xLRD}@6bG2!;EvmTQRNefdeun{X)Cv?_hRYh!6VEbwd2moRT zXf}DL(Nw?3AAcG-Iex1E>J~f+$q}fH>44V)aB{H%{5OnE2coe8ENqR5=}H@5C^-NJ z-~b$e1JDM*F=}GEss-TFO!Nil4UCOX(>gU)fFasgQ*!A4wPeD-N{$KF5Z$CKD6MPB zdQT1^7Gff{kkoBU6|in+a diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/meta.json b/Resources/Textures/Structures/Windows/uranium_window.rsi/meta.json index e4e4f5004e3..099201b4184 100644 --- a/Resources/Textures/Structures/Windows/uranium_window.rsi/meta.json +++ b/Resources/Textures/Structures/Windows/uranium_window.rsi/meta.json @@ -1,46 +1,46 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "full" - }, - { - "name": "uwindow0", - "directions": 4 - }, - { - "name": "uwindow1", - "directions": 4 - }, - { - "name": "uwindow2", - "directions": 4 - }, - { - "name": "uwindow3", - "directions": 4 - }, - { - "name": "uwindow4", - "directions": 4 - }, - { - "name": "uwindow5", - "directions": 4 - }, - { - "name": "uwindow6", - "directions": 4 - }, - { - "name": "uwindow7", - "directions": 4 - } - ] -} + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "resprited by AsikKEsel | Original source: from vgstation at commit https://github.com/vgstation-coders/vgstation13/raw/99cc2ab62d65a3a7b554dc7b21ff5f57c835f973/icons/turf/walls.dmi and modified by Swept", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "uwindow0", + "directions": 4 + }, + { + "name": "uwindow1", + "directions": 4 + }, + { + "name": "uwindow2", + "directions": 4 + }, + { + "name": "uwindow3", + "directions": 4 + }, + { + "name": "uwindow4", + "directions": 4 + }, + { + "name": "uwindow5", + "directions": 4 + }, + { + "name": "uwindow6", + "directions": 4 + }, + { + "name": "uwindow7", + "directions": 4 + } + ] + } diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow0.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow0.png index 31bfc29cf0acfbe6522db842e91025891a0ce052..7be507678d49517ac92392e78b96843349952311 100644 GIT binary patch delta 1672 zcmV;326y>|2AB%TZkN08pnU9 zE`9ImPG+VvSuc}TNYsuuWK~#W6c;g|E&&ly9~bsb6hs(sciAWkqO!10`XC5KU0e-b zgUhmB5@862WMd{VF49O9c0^Ri1XoI;F8i!9QeB~rhX7{V0&JgG3lEaZ zXBn_cghF5f0e^6;@i`wK{S+w#S6#H8i}Phx8~w`E@eqInw|m2Em@0G6;6K0(AQTwF zCX_&6P_!fzquQ@m_hZjR7BEwKM~OKe0(chKaLZ+zcxHANkPrj`)O{F8@TVh}vwO#Z&TY4=QO837&*2?=ihqZ!99xQIb~4WH9S5+V?ElOE zn|e9h>KP1Su+y8=%c+&^r;vyyv@hn5X{U~d0FKKLDSne50uu%;ecg(O0KgOu?~i?` zoi{cDBt+!#tqIe3?cX{O4*`T=wM_E+OK!l|9Gt~N03*8TKD)>!yF|U!9Vcf+)Y_O< zfQ*>|^nXr*LUldhnv-|k8g{rwYoxl(ezKpF(++Q~`y2O<|CO)9X)4d=l;e3-C`;Yx z=Hm{nLm&uT=A3DrlpUc}fU?=ge?H$0_&{1G^-n@uFjRHVvWSTx1PdD9^PQm00{YD8 ziC2a<=%QQ^vs05?Ki;GFd#p~~DHC=1Yd)aHa4J<&4RW$V1s{Df-K=e5QGZd-K& z!)Au#K}fXg(OalnKt0V`pe8(~&N1zxj2>}KcqF9-i;zu9Mvv@;43Kt!q$<5Klm+A1@56M`@z}+XK zDPSU;=Fueax8wII?9C=Y?L z2O8&;&W-SzV79lgrG!kIDy&CGqdSH-@4M34twJ0JMb7cU!qBe6kV_ zHC;#tu&@UD90*$cB3^^<4nIa9B!}k@@!8~I0DgPHl_W_roGSz11}@{y2_|Z%cz?L> zHTpuEc~R#VA;2A9M*Ej7;ZU-3oRK~+PVK>#DJ&7CvowL4bio!pg(O#8cp23*ufpkg%)iP43_jlc(SHrx=v=$J zb?X&8S2;qhn!tm@Eg;t5_iI z^@MggXcM4fr6~%7t1hnSqFfQQ31A3;X(lNq3Y5KgOn}gXAuyC&8~w22;eQJ&FNmmO z<9#=cjy=4{I;+G#haTg(nU{Fm+D~a)up%dG--WOLTZKO!4tX1nj9lnhKh(wv` z3||DNew}%O1tZD3pM3;CPUy=Wh>ZaC&_(nhZy*)|2qOo;T~}|>&K(N@q&N$JiA7H8 z&ESuP00fdr;gUD?J4o>mpnnaYfCZs9cOV{LjFWY^JsREr)sAtfu# zOk>F+)`~2r%aIZg~{}xv!5na%s SNQM9a002ovPDHLkU;%<4c>$>a delta 749 zcmVy+<)xbo%zAz4P%15|Gt@d zGqYJqN~YWGK5)~E!C)YYL4^Q~M#Hq5&8G2-(C_!_Apn9O4u{-3Kefn!cDrqY-@Ry` zjz%MNr{<4yaK3YO%uO%euvY)m#)Nl__)%lg~*$>0CKb4`kB0c`M;4akU0 zqc(tkW2 zCzHvf^dTVr=e=HUVF3_4sD%JN8Q>DP!zB}k0DEtOp9H_&etNMGaxewa&6nY~+7v?W zEzNUAxPR548kRB%QXw=`3Y$(Pyv7hX;bty2c*=wnRbj360$F$V))2TGJby(MVgc+u zeU{-&Ks#aq=;_Yf*Sl5)5ei!cs=`uM0nJ1K*au4#fPJu(T7`kEH$?%;XB1OdO0lHo ztt{7{f7Rz@=`x4{un(3f0Q+F6i~#nA>8VLkEoOk-O|~-LJ+Q_f^+tULSP}9}ib??} zwefV#NfIpU-2-b<)K!AiH4UDszZZ|u>Q)IZ6#Q$TN&p)?VNQ?dF)1pBK=41E4gSZ| f-1I`00ZH-*6;1wq5j@1C00000NkvXXu0mjfL?cvp diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow1.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow1.png index e395832e8e39f6a7f69e6c36c189a1f45bfbbdef..9979f28e945787ba4ffab8d70010c70209c7f274 100644 GIT binary patch delta 1205 zcmV;m1WNnk1<47JB!3BTNLh0L01FcU01FcV0GgZ_000DgNkl&HWrgUS7B7#0x#fMTMv@iNrAN&)<7a>@oC4wOMN0_(xpirp@Emn{O zf?%jkXdW6i*f#g1+1q4xX2*xwT)b_hXE|pi`+1o&yXWlpw}0Q6Gkf^`&Wa!i(8=)C z3o|m~?@#{pn#}l^%-~iq|B(|m>H>~l47(HD#(S0>wk;2E!8gIofd5olU%LVQvEGCB zme|7$0{XF82^{F?1Yj%}fDRylo7Pg;t^syNT3@>X-}FsT@hj}scDViEE&vzvZ}X(| zgtO@vs0VebUVjC{G`X|zBj?ESR{jl=BGnRoq5BzdW$uF+fS=tJVnVQL?1gXm;o%)? zfLl8cA=7aqL?H}Qa;#`ReD>Hys0cQ|7KE|d&N)uECA z0R;Wh`q~ZXxlyABIJo5dum7#5dE~eUbce@DIeqO0*nbnf*L3O|I>n{yJ~hh8NfqLt#G1JHyU%PHk^io(W z^KEv5_aA-2Qhk;Dmx-q1R3N<&I_}Fy9i=Nl->&XX{@N~%jBgzcu+JYf5$WCn+r+fkp*i7#+Ri2|NN@UGA_}X{p04k@zwn@?y zOfSxc=W$1wbTiZ$kbcZ^vWVk(6s!^$(SJxsDvZKn%*}B*e`Y?BJAC zT0I&Q@fm4FE+SF}Y&fgDI0}O+LRl@N+mXk$D zKUOELOsN@-+`#4hCC1zwU@4Q1hAsh?4Qv99{|5Vh^ZqR)8U`HA4b%v82a5Ou_vlqc T5^UWA00000NkvXXu0mjf8ooA= delta 715 zcmX@f`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+gS&*g&jqXsh_Oc9Gj&hdYz4BtK8)^GaBT+Jx~>2Sn=VByn

8g6oNhQZu{wxx-Ib-us)7V~O z-+SGZn>A-{CzhEj&)__4FfGV$;T5&M#|+mvzA-G)c%@-!v*ydnt659_ACPlcDz#42 z(geuYH?56OzQMd=-`u(3;f8HNvzHpnizW0X@GrQ-u}<@*{hBY4mUnk@XS;}<@=%+u z$TR1N#5YNU?Q#3+7a!TtKYwn-POfa0YKHJ#;_oyK`5s(+a{2TIw+-75e0SXBEosqf z_{R9bpIa+md-dcu>8FL|AC`I;#;76PT;d=V@~<&JVD`+}8*X{b{1!j2=Y9R+lt!5YOV1Yb zCvNq;T=Kl|!!tH7u@kxm?|xcdHhk8*`8z`;+nKe~&!#u{l+QcACw(sC69%nbFRtu&H)7W5)=Te~_$xhuS!1eKb$JU{+?t$y+5y^Q|8?fQITpMUOo@wIBv)vSr@8=G$PI6^!L3WFGifb2p> zsIQ@cQmVhtePhIw#p%qg>i3+|s~=zgn2@xq;L8KUk8AI{h%6PtjZlOq~p#u6{1-oD!M|2AB%TZkN08pnU9 zE`9ImPG+VvSuc}TNYsuuWK~#W6c;g|E&&ly9~bsb6hs(sciAWkqO!10`XC5KU0e-b zgUhmB5@862WMd{VF49O9c0^Ri1XoI;F8i!9QeB~rhX7{V0&JgG3lEaZ zXBn_cghF5f0e^6;@i`wK{S+w#S6#H8i}Phx8~w`E@eqInw|m2Em@0G6;6K0(AQTwF zCX_&6P_!fzquQ@m_hZjR7BEwKM~OKe0(chKaLZ+zcxHANkPrj`)O{F8@TVh}vwO#Z&TY4=QO837&*2?=ihqZ!99xQIb~4WH9S5+V?ElOE zn|e9h>KP1Su+y8=%c+&^r;vyyv@hn5X{U~d0FKKLDSne50uu%;ecg(O0KgOu?~i?` zoi{cDBt+!#tqIe3?cX{O4*`T=wM_E+OK!l|9Gt~N03*8TKD)>!yF|U!9Vcf+)Y_O< zfQ*>|^nXr*LUldhnv-|k8g{rwYoxl(ezKpF(++Q~`y2O<|CO)9X)4d=l;e3-C`;Yx z=Hm{nLm&uT=A3DrlpUc}fU?=ge?H$0_&{1G^-n@uFjRHVvWSTx1PdD9^PQm00{YD8 ziC2a<=%QQ^vs05?Ki;GFd#p~~DHC=1Yd)aHa4J<&4RW$V1s{Df-K=e5QGZd-K& z!)Au#K}fXg(OalnKt0V`pe8(~&N1zxj2>}KcqF9-i;zu9Mvv@;43Kt!q$<5Klm+A1@56M`@z}+XK zDPSU;=Fueax8wII?9C=Y?L z2O8&;&W-SzV79lgrG!kIDy&CGqdSH-@4M34twJ0JMb7cU!qBe6kV_ zHC;#tu&@UD90*$cB3^^<4nIa9B!}k@@!8~I0DgPHl_W_roGSz11}@{y2_|Z%cz?L> zHTpuEc~R#VA;2A9M*Ej7;ZU-3oRK~+PVK>#DJ&7CvowL4bio!pg(O#8cp23*ufpkg%)iP43_jlc(SHrx=v=$J zb?X&8S2;qhn!tm@Eg;t5_iI z^@MggXcM4fr6~%7t1hnSqFfQQ31A3;X(lNq3Y5KgOn}gXAuyC&8~w22;eQJ&FNmmO z<9#=cjy=4{I;+G#haTg(nU{Fm+D~a)up%dG--WOLTZKO!4tX1nj9lnhKh(wv` z3||DNew}%O1tZD3pM3;CPUy=Wh>ZaC&_(nhZy*)|2qOo;T~}|>&K(N@q&N$JiA7H8 z&ESuP00fdr;gUD?J4o>mpnnaYfCZs9cOV{LjFWY^JsREr)sAtfu# zOk>F+)`~2r%aIZg~{}xv!5na%s SNQM9a002ovPDHLkU;%<4c>$>a delta 749 zcmVy+<)xbo%zAz4P%15|Gt@d zGqYJqN~YWGK5)~E!C)YYL4^Q~M#Hq5&8G2-(C_!_Apn9O4u{-3Kefn!cDrqY-@Ry` zjz%MNr{<4yaK3YO%uO%euvY)m#)Nl__)%lg~*$>0CKb4`kB0c`M;4akU0 zqc(tkW2 zCzHvf^dTVr=e=HUVF3_4sD%JN8Q>DP!zB}k0DEtOp9H_&etNMGaxewa&6nY~+7v?W zEzNUAxPR548kRB%QXw=`3Y$(Pyv7hX;bty2c*=wnRbj360$F$V))2TGJby(MVgc+u zeU{-&Ks#aq=;_Yf*Sl5)5ei!cs=`uM0nJ1K*au4#fPJu(T7`kEH$?%;XB1OdO0lHo ztt{7{f7Rz@=`x4{un(3f0Q+F6i~#nA>8VLkEoOk-O|~-LJ+Q_f^+tULSP}9}ib??} zwefV#NfIpU-2-b<)K!AiH4UDszZZ|u>Q)IZ6#Q$TN&p)?VNQ?dF)1pBK=41E4gSZ| f-1I`00ZH-*6;1wq5j@1C00000NkvXXu0mjfL?cvp diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow3.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow3.png index e395832e8e39f6a7f69e6c36c189a1f45bfbbdef..9979f28e945787ba4ffab8d70010c70209c7f274 100644 GIT binary patch delta 1205 zcmV;m1WNnk1<47JB!3BTNLh0L01FcU01FcV0GgZ_000DgNkl&HWrgUS7B7#0x#fMTMv@iNrAN&)<7a>@oC4wOMN0_(xpirp@Emn{O zf?%jkXdW6i*f#g1+1q4xX2*xwT)b_hXE|pi`+1o&yXWlpw}0Q6Gkf^`&Wa!i(8=)C z3o|m~?@#{pn#}l^%-~iq|B(|m>H>~l47(HD#(S0>wk;2E!8gIofd5olU%LVQvEGCB zme|7$0{XF82^{F?1Yj%}fDRylo7Pg;t^syNT3@>X-}FsT@hj}scDViEE&vzvZ}X(| zgtO@vs0VebUVjC{G`X|zBj?ESR{jl=BGnRoq5BzdW$uF+fS=tJVnVQL?1gXm;o%)? zfLl8cA=7aqL?H}Qa;#`ReD>Hys0cQ|7KE|d&N)uECA z0R;Wh`q~ZXxlyABIJo5dum7#5dE~eUbce@DIeqO0*nbnf*L3O|I>n{yJ~hh8NfqLt#G1JHyU%PHk^io(W z^KEv5_aA-2Qhk;Dmx-q1R3N<&I_}Fy9i=Nl->&XX{@N~%jBgzcu+JYf5$WCn+r+fkp*i7#+Ri2|NN@UGA_}X{p04k@zwn@?y zOfSxc=W$1wbTiZ$kbcZ^vWVk(6s!^$(SJxsDvZKn%*}B*e`Y?BJAC zT0I&Q@fm4FE+SF}Y&fgDI0}O+LRl@N+mXk$D zKUOELOsN@-+`#4hCC1zwU@4Q1hAsh?4Qv99{|5Vh^ZqR)8U`HA4b%v82a5Ou_vlqc T5^UWA00000NkvXXu0mjf8ooA= delta 715 zcmX@f`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+gS&*g&jqXsh_Oc9Gj&hdYz4BtK8)^GaBT+Jx~>2Sn=VByn
8g6oNhQZu{wxx-Ib-us)7V~O z-+SGZn>A-{CzhEj&)__4FfGV$;T5&M#|+mvzA-G)c%@-!v*ydnt659_ACPlcDz#42 z(geuYH?56OzQMd=-`u(3;f8HNvzHpnizW0X@GrQ-u}<@*{hBY4mUnk@XS;}<@=%+u z$TR1N#5YNU?Q#3+7a!TtKYwn-POfa0YKHJ#;_oyK`5s(+a{2TIw+-75e0SXBEosqf z_{R9bpIa+md-dcu>8FL|AC`I;#;76PT;d=V@~<&JVD`+}8*X{b{1!j2=Y9R+lt!5YOV1Yb zCvNq;T=Kl|!!tH7u@kxm?|xcdHhk8*`8z`;+nKe~&!#u{l+QcACw(sC69%nbFRtu&H)7W5)=Te~_$xhuS!1eKb$JU{+?t$y+5y^Q|8?fQITpMUOo@wIBv)vSr@8=G$PI6^!L3WFGifb2p> zsIQ@cQmVhtePhIw#p%qg>i3+|s~=zgn2@xq;L8KUk8AI{h%6PtjZlOq~p#u6{1-oD!M1vt zk;bE2R44HT7c2y+L*yE_lt8;^TDmYPm}JxJ(nWtl>84=XLV_2CLVrZPa~Cb7q!bdG zLb1UVYSP%mix`O}@!gJf8;@o*UCj7GFZSYybEa7DMn}>dy?>t`owqdce9oXJI!6}+9?FEncZW$HcvxT$s0-VqEV1mw+n0=qz%E$ z(p>O7tO4kjIsn;cl+zV#*QI1uAr_51Okorz<4%EV#jC;7>S+Vuc|ooZz-Cwj&@XiW zj9ifG@9Ss{K%=DV0mC=1%*xEyT@R2x7cG1e9)HbS0*=D8y1)tFGp%53x_|?o5v&OB zg{-}_qyhBDdk@B2Vh_jn>BnNlw;|C5z_>pE3BV6)ehGrz!BSWH`Y%ZX_^xk~x>skn zxfAC4Fjjnz=hf$2$i70$Z_#k;#0-P`i$8ObJnt6YCM`13!M8)w$AIheAI$>%>Z}kK zf`8Rm*wqOOyYHI=+}(Ksxy0e5qz8>10Q}b;{=bg_Ggg^(w?!^#-~v4%&vmy2z+L`? z^CsW~=l)C!>M0O_-!E$~EolHfx100;2S54#>;Kr&IP$m$bO(=9vJuEh8o)`nvPE6d zxE|H04glQ&=vD`S?f`VF13-5Gx^?OSNPp)7vU;QR!I;ea-}2v{-v0}Q59y8rmf9(JOuyTw$1@4&340a``RpQ)8kFsQ!0hq6E^EAB4%Ex2bt6&&mnSVVm zXRRH;{j*;lj4v$wh!v0X*3e~=eukG4X8>^h7LQ&$T8R?_GC!> zJ`y%p&jFBkf{sziYhb10WQddXpehc_?niI4d-D1ZQjHbuD*y-@B#sT47A0d78Wxx? zcGJNIHvYExdK>>&s2xD@tFS?WASGy;7z9n0<8G%-9S$WMD}Mn_dR{s7?CW~~0000< KMNUMnLSTZLmN?S@ delta 715 zcmX@W`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+u8fOg&jqXtM9zAvfHgwikIV6eiW8^WWFU>c6)Lu-x%_!Vjw#ofdt&7r(CG zbmd10^R*6}D^W2F0ojF&4r`CHGHewSXFwD9RM{XuZCPTy^V{dG&nu_SjV|jhkFUSS zwRQgczIEm2)iy6SZtz=vxJvEeGIXsdX8mF~QT;J$?KZB}{&8Ox9bM7Y$6CbTDBuy1 zyJSK(_uAIlj7SCc3mLx**VtM9w5$=5bvw>v+3>8pGcqFAXy)IFs!wM_x9Ch@Ua|dj zy=}elAMqtqn#=w^)&+`%H_kcHJ9FBvEn0CWloN`U+Oe0e>^_c?KIGk&wGux zCvNrJT=LlO{)Hl1hKE?EQ$8=&)7Gl<&j#D;7tz45aC@jrcsBarZ#((AO(K}+k+>V{iBzM6({ zta82jam}VpwhhJE%hzdtY@2IW{@rdjLpIBAksEOzj%l>smN;z3q!#{aiD1G16W*6N z68IO~yJx?2U&}{h1)G13UwD4-Pjj5<<@8YP*oOXwXP-MWzv^yVcs1?ck=K$D$~TxZ zOkDn^s#XIHe)wn7$Ir>a-x!({Zq)3~`O~!JYSzR$=4yt0@7;q=2}R{D($G3ArEtW* YeX?HTk(G*Wz|_g$>FVdQ&MBb@0K&LFeE1vl z`_r@qQ%WM8EOjXcIypJ1i!OC?=_0tblPE5QK!-rVMXGL{?ciW1Gr5R3=+a4O=~TK% zF-4lvmh}EQoJd7;tB~@2ft+W$+;Dlny!kliz)QvS3t~!n?1vEfFywMv zIEIn7sJwayyqj9Waa}%aeq?TV1tQs!)D2i|y*3vUog01(jEU*18_;leA#6hsLli>d zf?E>PS2v*g%zpuf|GNJ_Gr&clZh+Jm%|m|{P{tadU4S;$0PO;_=_>;~g>w4JfEc+y zLBHrL12pJ)A#{EB{+(W)@AdzDuMB(#h#R0W(4B{PH5vomdGy!Mp@20&y8vyh0ony< zBlbq9U2E36ez1n>LP*4bcCA_8T+AS8ftvsUgdPM%34i%>k$opvG;e!n!%6S~-Ca3A z(t!8?D1#p}y*I_}>P@mF5tGkDwgdc_HIQlk7n~T}mp()M|O;u~nx`YYp z2Fzw>S%F5dYpx?Xef2S5zVv{F@rO+BO_>{!*U1vdpxy!ZcIr^_p@PW{9Iiktr?1`t zlmn9$I897;;6!$_MBRY-tr!n002ovPDHLkV1iYX BW&i*H delta 639 zcmV-_0)YLS2ABnqB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000ic z000ic0Tn1pfB*mjElET{RCr$Pnn6kfK@dep(RGMXTm%Dx2MD6RK-c#<04Y^Te=?<)iblIH$B}6)f)|&@qc*yIT#F@*=*K~Znm!F zcHnULsCj*VZszm(Wcv0fcUQSPdAgF}T5L+Df#O@B&=7KM4qX7=yuAI3uD5InT>z$i zT>P+qFp{A;bO9h$JidPqvJjxe#bW`qCJO;5ysLQZ0AXMRT>uJh2Z)QeTpZ~FP;4B) zqj*3UfI?G&XMY~sBK?=(@$LS(4Ay1(o9uhGX&@LW%XM68QurU*mDjqz%+^+;1(;1K|9!#B^ zAHQL~2BeA)gG?|N08+*0umb=W0U$1Za{6((h%>oG!+%YHqQ#>r8Z|~KxCvMkuFa3- z-jAjz8}}KI8?I}BtOLunpr}tkSx5+H0rXq|8`m{JhD!-J8z8r6xCqduXDlHH%mrw( zGbJGhOa*9@GbJGx5oQ8(il-#BgN^A7NJ)r;jrkhTmXM0@kVx$eNiLQuKytBE0g{WQ zo)VK>EO=Fb1Jtv?6JSAkY z2u{D7CY=(j$U=b9CBc#`1hl7kEWsMO0Gts(yF4Yq1G)e`ClE{Uf-WFxkcNf{LavQz ZnlFM&P>D2+`?3H4002ovPDHLkV1ld#2S)$^ diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow6.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow6.png index 4097d024fc29b07a3490bafc6219ed5d0ca86404..eabc47c84b865b76a0c4cadd8a6c043917b318bf 100644 GIT binary patch delta 1209 zcmV;q1V;Pg1A#8 zKZf~YhDbj~QfUZQ8ipFHnk)*VYr_z?m(w%hnPdoxdwilIWxKU{@!`!%zwS_`<{D67>4N7$o0|L z`HyxOFka@1b2quRa*IO2#+|HS-|o55XHo<~lRZ%k%Dq}Tf|0+2IP$~Cm1x+ zG(?S=`W&TPLz#6v0HmTXJiGLmgcV|K*~+Zr0l+X=?%HP0^;peR@p5bGtd%)+QY{MO z>c|-5&H#{5W*rXzi6l@4;BI0Cd|#P$JOGH&v#|@9d4F}*vi*R!e!Vt!SXt^$R;KLR zJ(Nl=cLr|p!P+OR1bKz>H+ANvYfNLw~LE~5Q3Tzs%#IHvKg>nPmye>F4a9uO3wkq znH-id*nctgw&L5RB@xn9`~RDi0q8AT3~`=qw@R}fpWHzifKsl(Onr`qs4-}y!BjO}3^#Jrs9RM@Wb63Ci9)Lzk_X9?*kAKd}?612YAYBa2e_W3Sfq-_H$u4l3 z(KwNe#t9E_z&E2A;cv^@OG_F+!8&^|-V#lmFr+|=Qn(9t7Xag7AJ{iOA3e}|;H z*4K+94dBbd6b-*Y)vdH@eR!|xFL^;yk0px5EMq- z(tqcGi6ynuY# z1mJXw=Y|*M`}bIb(>CBl*Zyn(jWh@#EXdkROB%qLsem)U!B4*b`9HR7&;32%RP;J6 z8-bjp0UUNKTig|od{m=O0O$@tw@v`)4u3$mP5|f*K(~%P0O?vlR+m>N#$@*YzJKQU zJ}+<-Isu?N0NpwPpgREFIsu?N0NpzF0JJ|eVQY2j3DCNh^;YW@PiLVvwV z85giH5iAEal18h^+An9V9l*ohPY=cyp5CX+wzx9%Ch0Is-i{ui^1^_H$~-@;E)s?z zH!i-zspQ!g9r8a(dod)QTxu<@_5v`t7cG}92Mv-LgDf`PzMv+aEiJd-X7|(OucQ`M zw9fz_S|D+nkPTQi|AgH%BpjM9G%|tBziqz3(LGnF9YFE3)&j|Mp#*det!-UVa$)5! Xp#Wu4&1DdR00000NkvXXu0mjfVJ$+& delta 715 zcmX@h`IvQrNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x382Ao>Fr%o3 zR|5kBQ-!CCV@O5Z+u8fOg&jqXtM9zAvfHgwikIV6eiW8^WWFU>c6)Lu-x%_!Vjw#ofdt&7r(CG zbmd10^R*6}D^W2F0ojF&4r`CHGHewSXFwD9RM{XuZCPTy^V{dG&nu_SjV|jhkFUSS zwRQgczIEm2)iy6SZtz=vxJvEeGIXsdX8mF~QT;J$?KZB}{&8Ox9bM7Y$6CbTDBuy1 zyJSK(_uAIlj7SCc3mLx**VtM9w5$=5bvw>v+3>8pGcqFAXy)IFs!wM_x9Ch@Ua|dj zy=}elAMqtqn#=w^)&+`%H_kcHJ9FBvEn0CWloN`U+Oe0e>^_c?KIGk&wGux zCvNrJT=LlO{)Hl1hKE?EQ$8=&)7Gl<&j#D;7tz45aC@jrcsBarZ#((AO(K}+k+>V{iBzM6({ zta82jam}VpwhhJE%hzdtY@2IW{@rdjLpIBAksEOzj%l>smN;z3q!#{aiD1G16W*6N z68IO~yJx?2U&}{h1)G13UwD4-Pjj5<<@8YP*oOXwXP-MWzv^yVcs1?ck=K$D$~TxZ zOkDn^s#XIHe)wn7$Ir>a-x!({Zq)3~`O~!JYSzR$=4yt0@7;q=2}R{D($G3ArEtW* YeX?HTk(G*Wz|_g$>FVdQ&MBb@0OtojiU0rr diff --git a/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow7.png b/Resources/Textures/Structures/Windows/uranium_window.rsi/uwindow7.png index f2aec98846cb982515e94d2f3e994d085109e69b..f75790a41878a5b5e9df599eb3004fc19dc29d2f 100644 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkQ1G^= zi(^Q|oVT+#@-`cYuo@=um7Ng!;xlWW>L%vq2R#lSzZQkYDkJCQ+V6G~_nfO; zeWw1}_rRI+wGaPqV9a2YV!ps+!nT0*-Hhn4!XFIb`xm|DmsjXTlF69%is?(`zEh9? zGeFg5@Ce*jsF}B3XuJ3P=c{}ER@Nb#l)>Y`eLz y`@}0OkOX!d{?4>d{6rE%RKqcbEes&rXX%$%%2g+2GNk~$$>8bg=d#Wzp$PyK^Ji!P literal 270 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 UzWfgt^#A|>07*qoM6N<$f<`MZ(f|Me diff --git a/Resources/Textures/Structures/Windows/uranium_window_diagonal.rsi/state1.png b/Resources/Textures/Structures/Windows/uranium_window_diagonal.rsi/state1.png index 772c39f64193e84526e379b91b594ec019c24264..5286b1e17e622aec224cf58ea6b78db7afea79bd 100644 GIT binary patch literal 15604 zcmeI3Yiu0V6@bTiL5v&_QL$AL7&Z;0rL*(c*~g4_H+H-ZcF2a*b`uAZlG&NN-cfdU zhMlp!c3jCZF%cq4r1A)_@Muw*5Q0=IbrF%$3J6V=N}z;BZ7lQpQ&AM9Dqu)baPREf z*Xt{*Ao1spv^#t5x#ygFzjM#o`7;l1+;CT2?GI}yimGdCjkLo%?R>6X1i!6;fzRP> zvDv!CqNwYZI-eTq>1P`#N`6!C?6SL}>t)qQxfRWb0e3cK!r2rRT%9!)bqBEN80gm1 zA=jl7e{|8h7IJO&M!Bfj3=(?lKn8RSZ0J-6cBqo(S{<$pW@YFg1#E@Rrjlt(&W2n$ zzcT#o46`meH^tr&ay2;t>8|KTy4lD8+Uxc)D(Cale#y;y{eIE^Q(EA7FUxsY561`| zS>$9qeS({34jTaQEm6O9xo?nnkPpy>)Jt9pT*445ilnWzs~Kbm4IbMjI-x5AI6 z%5fu;QtYsvQn~?arn`e|d9Y$;=~T(hM$*W@Wr46K$W|M!Y85fm9_Ls$rBz_TWLOnR zf~m?C?i!_g`e;#+)Wi9K$>pE{F&+>l5NG_H7GQWD07g>1J_dLLnj*ymlF!M7 zQ@qecd0md*-01X(mD|Cs*Et5!sN9yeYz1zoEfR(UZXK>n;T1ms0teUQ_(##JRC24J9gY}SqE*ID6gMxc8#I&9}k zvSN<27Y**k&x@j@`eTfsae(nFVw{mgPmBTnSOAEUPt-h8aW7Te%m~%0J9+O%(%|H# z13WN&w4C=`<299x1)R1LauxeZsZ+zLr7M_gPqLyqEjz3_RSzKUX`|(3p=SEbbj}Sy z-hYMp>@oThAdTx9c~`kvvpcbjxZS5@KvOrYr@1t=yw~YwsQc2eB)u`zfylJHxH7#5IJgwVdp%4ujuCQ_* z4D$b49q<_zgneGG#~WnPVbo%yo(0LShz|d?ET^A%V5FQ4s;FwXWj4bKMZqwis*0!0 zTr1wZ z^1=Gn`!+?Qdp}ux+MIV|=$h-ksO>%XR`kZ zg^w+HcKn?yi|E~dYN*=^)l^_Y`s)`jovaB=GP}+V?78fD*;x2?!W^3T?=AE1n>Ts< z=r7jn`}*bO2M0qn^J*vmv*($AzQ1?V$fmqwy>8Lz(TVK%@{zlj4?Q1zbF$;3_T{f>JI_xYPL4nN zcXnj{kn7m^gG*j{{MDx$t~T!ey8X2qb{)TXe%)qu{2xc3xN~b_==jCnt7qPMWLxW+ zZ$cj&*n95aU1QI$ddl$|`ZRQ4Y}gt*P{)dmS8jjwx7tgu3|$)BKXLEq>B(g)SBx~C zbrw20R)5Qfoqrg=@W%e%ow;`PiQ&-+_xi@;<0FfIWC*`r+2Mo`)*X7c_Uzc1RZneQ xuw?a-J@uzu_y7Lvg23c^3rF{v)K|AsQ@>n$^3rn&uk&7VTg!&Xt82Co{}0}mEfxR( delta 660 zcmV;F0&D&BdA|jaBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKp2MKrbE=X9p)m7b)?( zq|hS9JC1vJ?|WbFz5|3tg{fxOB%o@Rk&4H}Y;IKyyh1=f&3|zS5;OHgdNBjf@pTU$ z-|r$k%e(H+(Wm512KYqcDANs#c!PL$)6zNb6NgwyQi#uqCk(nE@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozk6#Irl;JbU<~MfvF(ph zAg~KG>$d%UY}?Hf!2b+fX>EVC0nB}pUT@*Z%x0}MUsk|8;gpO#Q4 z0Pkn?O*vrj7U*4b`_?+g=>w3VUM=4M2Zz8|k+Ro4-Xz`A*|&ddTK)S0Md5Ol8b}Lg z00006VoOIv0RI600RN!9r<0K(7k>Z;bV*G`2j~J04-N;XXXp$7006s5L_t(o!^P9f z2|_^(h2ayh0U3AV1;GNQK0C54#g&XQYZtl`#rv2?l9L9$p92Ai7h`-06AvLkn0QLb zKj0f5POGCZ@$2K_x4;+!FqF!BB7V7tH)et+KV0!r|l^I4d<$z>PR;Obvc zi>n5-;A#P_xJp0|-W|}3cLiwR%>i0?Q-CI39iWX@1z6z40akcXfF-^dV2#fPc;J%( uUifH$C;k`UjsFBN@J|2>2LNH>0PqH@&E+BUD&+_O00001IP)GBYy;sNkla8U9U|P zB)rPk%+*}Y`Mx=?d#(VSICZAMQ@{`3e{ejaeISsaxYWuJ2bw%@I>POg5xLOW37IWZaXE< za+0+c^~nkD_XH$KLQ8x?-{bk|Nm>~+E?(f+XJ3828v+{V&z(K;(U&M=s8>URAY@~0 z9e|-)Qh!Q#)Q)z8a|gtj!Fo_6g@9fN{=WNYB;hM-f@)D zD5D>5<^Kp!iq&?64FcNRLy$Vh{4ZBVLfnJ3j_cPKktpuJ>kAO+)uk&M&1f!!twg3lEfkUk?K&>wgvUEZcPfB7#wxv1)~2OJf@J}wqjNJTf$8xYrG4(NZGZCn zu6(`3ZNAaj(b!5K~ek7m369Ng{T`L zN(RG;EuNd{)->I^F0dMPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0YFJaK~z{r?Uy|gf-n$9qZK2KiZutYqOkT5oWj!D16W&f3Jzgy z?E$DoZE)x`-%f%76~fsDESIHnn||Bnh=?n!W{4 zJdR_!(Kn9ckVGbc0Tf^P+u(7D*ks{GVs5AK+%C_}PT^rAYvu%&Yd^pQNN~EApyJ4V zK8BgVSllG=%f$+yOP7wwilc@YBXRgf7|wePINQfDtePMnGEtkI_1z zOR0eJG|L?@bVGTX{-kmRq(qabDh_^~h}2_LYm{6OK3AQHif6difm~u=&_yLDz$ca- wAX|`0poSPD{^P}D@K>|JUrwnv2#mb|4AL%YCpANW01E&B07*qoM6N<$f?46LSpWb4 diff --git a/Resources/Textures/Structures/Windows/window.rsi/meta.json b/Resources/Textures/Structures/Windows/window.rsi/meta.json index 9f6536937a3..41b8be18b43 100644 --- a/Resources/Textures/Structures/Windows/window.rsi/meta.json +++ b/Resources/Textures/Structures/Windows/window.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/raw/99cc2ab62d65a3a7b554dc7b21ff5f57c835f973/icons/turf/walls.dmi and modified by Swept", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Windows/window.rsi/window0.png b/Resources/Textures/Structures/Windows/window.rsi/window0.png index 95094714d3b20738d39d4ac64f7507ff94577854..37bade4a4a71e531e2b23af81c6e620a18dc4185 100644 GIT binary patch delta 1616 zcmV-W2Cwg*jBYy@bNkl1OKep|82)C?>z;di`=HbZf+5(NqLBt06*p*1 ztVSh<_((((7NTJ-dlxKCh)W*}4N+JaHYyP$F-8`)J_n26EPwU>U>2GFRG#z*Npwe5cH~|8+I7Tk(BTosqZG+b9 zh%Ew(Q1B>}YQuHpY!hlT0FGrfM79wGfTqd_<+t^$MV12XIS)kq+9cJ#aPVG@WEkM5I+mT8N5s;9grl;Cff)CT-TLHmLv$u)9~9?p}l+=1K%E9 zcG*S{5QZU&#D(uVxWA(f#TXbkb`-rk_k6g}y~h=I0e`A=cY{GG!HsfVuS~7dZh=`7 z_~*(E?Xry^APfUIgrH+p3n;Zf?Z)i!i-9pF5OI$FKTd0xYYYJ*CV*U(dFlXZf)NA= z<;8aNJ+&k zv=ZPuHhw>G1_`)yd`y5g0_s74DB;p(b?);EK^pGOUVnP)9TcWYxaZzhl&c}4S{1O&NJuNc zMfaP#!Dc3scZ;pl;-LD4$1_4`O_JBoC;&KWwJ;Z$JpTC@|y7Y2(>`K5i^c5Y_xko(GcYYlnD@u z&tkG3flva^wjk1+)tDizZgE7G3&Imj1VEEbP>#(AqLc|3{qgH1-K6HT z5XBfPRxmy>iT*Kwa*k+$=jwto0iPW?DUS&OJW3HK428i0EDrG5iNJw`a}e9c(|>Do z7#J;sGc$4m$^=+V`Sh6T35!zrG&O~AW~+;ZD{R>yVGUgmtwaC#B_xwYRnZNBG6BPf zK3#CkmcAEJ%CASQ93hDlgry?#ZLPSbOUv6pnSjOA@CWwq+q?0#-JrIOeAb8O`Is(E zsfun0wD|$T{^!okNeSw8goI06s(;kvc~eWXPSLl7UIHk^WVsIJc_3(XP=;`9`_IYm7Z&?9U4PGm?X;mK1+cS1b8!3{<*DBXqRn9ukg&8 zC#p%5+=Y#joF@>;qo$0bUA9rXK$38oVATmTz8NAGSQOsWIMKKLbsSqn?*RZMN5~9+ zlraP#7@w}9T&;tX2*VYiYk&KDHw~LVH)I0VvXnoWG32{Jio9!K=+rqR+yRRNc&-gr zt;`K^C`H5=i1?h&wxtW++UzTfHiCedh#G>8q0mQ9Q-IAqkDx6#lQZB1W5p>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0$)i)K~#8N?VGPs!$1(m1FAy}P!ysLAHf^+4Ui}V0>xlKR8)Xv zPzVGH**EALRK(*dP!up_>LB0EUgjDuG|i^XCU?J?uX~e<&VPQne|t%{f{F>l@Q0d( zh@yyw!vG{dolfa$ej3pOI-QP6{`lnT@%w!e>>P9_^z~An z`e%34EW|cN5m54oU9|Ivizowd=aCdlh*2NwMw9_W+Jt3dA<+Pkm;fCfg_+_a)qsTE zz5U?p^CMGSM1LEglaIk{mn9bBdw@pI`e|{gjREVz8$i)nya5!QgO__?=Kp2B!;y;r&RK2OJY-#V3IsGM08CAWf*|1-M=#KysX3`f?&+ECncZyG_=6%!Siv7$Au+)m zGz3u;6))n!AS*H_ZxYWrc#p^AB7q?05RV2$JxFqhKd_1`MnXamQ4`&`$!2!CXS%zp zF6 z-TmBL@hM9E&CDQZB2Ck>9q6`dG$82|DG>TTk~{}a9yc0A?FLK+!D>4%@2Cc2$drQL zEZ&=Hc|aKI_LAWGDANq>C^U{=y8+#O_ajMj^pYXI{^kdO0eg1MVsU91_uMfJDHW15 z1NS_9HUB-P0DtV>@i3ym)BTSc#;@Ig6KBrpfua-k2`avp17oOFV*?x*L#-Mc;J_Ga)uuPV zcq8=0^RE~sHcox`zENVsbR%Sp#J0cK)d>p1)|9kprwMp_5_}lLo7l2?Uf^-0LZH=b znue@Ym47fnN>EIDQYS4MOhOG~Y`=X9f5b&*XQdY-DbGz~h9t}3bI*nAH#eaB_{?hi z)ED2uZ~K^?eE<<>=tM#ur9(*1hbWVq|5Rp}QLa+P z23-E=m|242jc5Lk>sq&r4S4jmw+`N{MqvKfp|^L=9YFueBDzn_;^^mRv7Bc3_2c)d zzMg+ARXwt z8GjIX#m;YL=3ZMN*ClHPq@vgg-FN3Ur+$K39ZP2-0{0le+_9jRk;rwNV@uWy5WQvG z76n*|Q)G!dOQAIbWHZ9W->)H-3W4u|OE>NVdj|BcgLxhn7Jk&PMc@V)v1UL&2$3~g z$kQAt_rbXv6QQ+Ha0X3{_U?H^zgCXS1Aq1&0U=iFeEUM`0%#Xx%>b(IrUK`Yt_wFN zK_~t%aM!c1VoT7#>-!$WyPqwfz3oNKv*nurM zu@4|NkSZT}IzZO!ps(zGFHYP6BQ`*+fS3Wdm^X340Ad6Ea_uK(K!lvI6;>1s;*b3=DjSL74G) z{)!X^2FBT*E{-7;ac^ho`y6(VILd7y5+JgukHz_tfX*tpMi)f`4i2WnM~<*aurM|{ zE||bk(|mA(!YqYCVU1Jr#?1`7_6T~k-Kh25r~Cfzr25mlLvmi~m+#%ZUbcIV=jAWL zcNMx88Qg8&-Jo;Yhv}1zd@kb`<%G?p8~gJFo}cY?E@__OuxsOn9a}zKtn7EXefaKK z-8!v~LKWS^3JQj1!tc&E?7jTjxTM+QR@_}DbB^zVAHMxc$_i^sFMOUa{ zi7V5DEi=rWUR&$dUrv1XX-THlnTU%b4wsY|J)*X7DKvl7%Zyx^%<@G$i04v_VL!wB zrnae8W=?91_oWrX8B2W{>s-4WXK6>VPB_@}ODjR_!QZUYT|dw7jn9j^$l<{DIo>v* zXxr}Np39b{FIs+l(W~uL^@_H;Y2% zLh%PxV(V9MY3;pr;M1+V#h?EKYxq5TcKP1+hPUz8|0n$2=MW50IgtVG7Y_!oF;034 bUHcdgY5i|w&E6aUj6McWS3j3^P6g*jBYy@bNkl1OKep|82)C?>z;di`=HbZf+5(NqLBt06*p*1 ztVSh<_((((7NTJ-dlxKCh)W*}4N+JaHYyP$F-8`)J_n26EPwU>U>2GFRG#z*Npwe5cH~|8+I7Tk(BTosqZG+b9 zh%Ew(Q1B>}YQuHpY!hlT0FGrfM79wGfTqd_<+t^$MV12XIS)kq+9cJ#aPVG@WEkM5I+mT8N5s;9grl;Cff)CT-TLHmLv$u)9~9?p}l+=1K%E9 zcG*S{5QZU&#D(uVxWA(f#TXbkb`-rk_k6g}y~h=I0e`A=cY{GG!HsfVuS~7dZh=`7 z_~*(E?Xry^APfUIgrH+p3n;Zf?Z)i!i-9pF5OI$FKTd0xYYYJ*CV*U(dFlXZf)NA= z<;8aNJ+&k zv=ZPuHhw>G1_`)yd`y5g0_s74DB;p(b?);EK^pGOUVnP)9TcWYxaZzhl&c}4S{1O&NJuNc zMfaP#!Dc3scZ;pl;-LD4$1_4`O_JBoC;&KWwJ;Z$JpTC@|y7Y2(>`K5i^c5Y_xko(GcYYlnD@u z&tkG3flva^wjk1+)tDizZgE7G3&Imj1VEEbP>#(AqLc|3{qgH1-K6HT z5XBfPRxmy>iT*Kwa*k+$=jwto0iPW?DUS&OJW3HK428i0EDrG5iNJw`a}e9c(|>Do z7#J;sGc$4m$^=+V`Sh6T35!zrG&O~AW~+;ZD{R>yVGUgmtwaC#B_xwYRnZNBG6BPf zK3#CkmcAEJ%CASQ93hDlgry?#ZLPSbOUv6pnSjOA@CWwq+q?0#-JrIOeAb8O`Is(E zsfun0wD|$T{^!okNeSw8goI06s(;kvc~eWXPSLl7UIHk^WVsIJc_3(XP=;`9`_IYm7Z&?9U4PGm?X;mK1+cS1b8!3{<*DBXqRn9ukg&8 zC#p%5+=Y#joF@>;qo$0bUA9rXK$38oVATmTz8NAGSQOsWIMKKLbsSqn?*RZMN5~9+ zlraP#7@w}9T&;tX2*VYiYk&KDHw~LVH)I0VvXnoWG32{Jio9!K=+rqR+yRRNc&-gr zt;`K^C`H5=i1?h&wxtW++UzTfHiCedh#G>8q0mQ9Q-IAqkDx6#lQZB1W5p>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0$)i)K~#8N?VGPs!$1(m1FAy}P!ysLAHf^+4Ui}V0>xlKR8)Xv zPzVGH**EALRK(*dP!up_>LB0EUgjDuG|i^XCU?J?uX~e<&VPQne|t%{f{F>l@Q0d( zh@yyw!vG{dolfa$ej3pOI-QP6{`lnT@%w!e>>P9_^z~An z`e%34EW|cN5m54oU9|Ivizowd=aCdlh*2NwMw9_W+Jt3dA<+Pkm;fCfg_+_a)qsTE zz5U?p^CMGSM1LEglaIk{mn9bBdw@pI`e|{gjREVz8$i)nya5!QgO__?=Kp2B!;y;r&RK2OJY-#V3IsGM08CAWf*|1-M=#KysX3`f?&+ECncZyG_=6%!Siv7$Au+)m zGz3u;6))n!AS*H_ZxYWrc#p^AB7q?05RV2$JxFqhKd_1`MnXamQ4`&`$!2!CXS%zp zF6 z-TmBL@hM9E&CDQZB2Ck>9q6`dG$82|DG>TTk~{}a9yc0A?FLK+!D>4%@2Cc2$drQL zEZ&=Hc|aKI_LAWGDANq>C^U{=y8+#O_ajMj^pYXI{^kdO0eg1MVsU91_uMfJDHW15 z1NS_9HUB-P0DtV>@i3ym)BTSc#;@Ig6KBrpfua-k2`avp17oOFV*?x*L#-Mc;J_Ga)uuPV zcq8=0^RE~sHcox`zENVsbR%Sp#J0cK)d>p1)|9kprwMp_5_}lLo7l2?Uf^-0LZH=b znue@Ym47fnN>EIDQYS4MOhOG~Y`=X9f5b&*XQdY-DbGz~h9t}3bI*nAH#eaB_{?hi z)ED2uZ~K^?eE<<>=tM#ur9(*1hbWVq|5Rp}QLa+P z23-E=m|242jc5Lk>sq&r4S4jmw+`N{MqvKfp|^L=9YFueBDzn_;^^mRv7Bc3_2c)d zzMg+ARXwt z8GjIX#m;YL=3ZMN*ClHPq@vgg-FN3Ur+$K39ZP2-0{0le+_9jRk;rwNV@uWy5WQvG z76n*|Q)G!dOQAIbWHZ9W->)H-3W4u|OE>NVdj|BcgLxhn7Jk&PMc@V)v1UL&2$3~g z$kQAt_rbXv6QQ+Ha0X3{_U?H^zgCXS1Aq1&0U=iFeEUM`0%#Xx%>b(IrUK`Yt_wFN zK_~t%aM!c1VoT7#>-!$WyPqwfz3oNKv*nurM zu@4|NkSZT}IzZO!ps(zGFHYP6BQ`*+fS3Wdm^X340Ad6Ea_uK(K!lvI6;>1s;*b3=DjSL74G) z{)!X^2FBT*E{-7;ac^ho`y6(VILd7y5+JgukHz_tfX*tpMi)f`4i2WnM~<*aurM|{ zE||bk(|mA(!YqYCVU1Jr#?1`7_6T~k-Kh25r~Cfzr25mlLvmi~m+#%ZUbcIV=jAWL zcNMx88Qg8&-Jo;Yhv}1zd@kb`<%G?p8~gJFo}cY?E@__OuxsOn9a}zKtn7EXefaKK z-8!v~LKWS^3JQj1!tc&E?7jTjxTM+QR@_}DbB^zVAHMxc$_i^sFMOUa{ zi7V5DEi=rWUR&$dUrv1XX-THlnTU%b4wsY|J)*X7DKvl7%Zyx^%<@G$i04v_VL!wB zrnae8W=?91_oWrX8B2W{>s-4WXK6>VPB_@}ODjR_!QZUYT|dw7jn9j^$l<{DIo>v* zXxr}Np39b{FIs+l(W~uL^@_H;Y2% zLh%PxV(V9MY3;pr;M1+V#h?EKYxq5TcKP1+hPUz8|0n$2=MW50IgtVG7Y_!oF;034 bUHcdgY5i|w&E6aUj6McWS3j3^P6!EKN>NIr{=f(gEf&#I zP(f6D(HDyZB=irk?>_im3%(RYgdqA*d=W)KL8(ZsVk$;#DJ`Lh+G=XrWV83~&b@a= z&fMLyDUudvof+Bv0=WZwXV1Cc&Y79-oVg5|kWy-W!M^7XoPWIQ>6fu33h~PR2k`di zi>PnA6$|r+F*AGUwaxl6#_+}qyFSyg@9A{54PEk`BjB%Qf?O0vZ8||f$QTMpe0S<+ z#9?66wpnYNfYBdg$O;M3=@_%?R0vE>-J`CN?;Eq}3<2cGy?1U?ZC(hYcHIE;;Q0)V zv6@kLoFTy6Z-2fK&Jd8L3Dy&i+iDSt=BhEfP7vS;fhh2i2#KXXu0mAIg@F?U6j4Q8 z7Z=Zf`94Hz&6sT`_5q&ffy)3nZzHQT(30kU7bix5OcQn8xA$R8`U0M|M7w!7K|mBm zXm!{AmBNE4%;^Cq2w3ae_z0dM4$MWS_F#MUgHuo4NPm_t%pZPzX7&(TmzOd3L85oQa(9`%m&F>0~5zy24r1@RS!Wi|1v_5Hm(*CZ%iYKyzfsQh#@rLSqDw#wV>$nxC{k5*S@k#5G=0{%+z&6Z#cGbe01mb|LDVO~8$gvbm1`^)b0YU_^ieK3K(w00(@q ziV*=0_+S-7Pk{CJ1?YT%PX8k>&J6GS0)Kd7tP`-~`8ib}p|m*_P3k;_S09JhN#KudxprUVd*DTZYGq?t{i~1P*Rt=# zad|3`Q0174CLt4$odi2>pTM6I&8gn0svMTKo7nKYt>q z2bi9|A2pAmQ7bD;qL4WE`(>Oze?e)FJ-Z*oE!~%^-qN&hoq#vLC{K*kRgIvEsGVc! z>oeeafiSL>v$Pc5gH`22fB5}{f!TK=1gJnl#ZxMpB+P@)I}m<=qFY?O9@zj7Xj>=X i(kJs}fy4#?{0&-Fd}{Oz delta 498 zcmZ3?+08ORxt@WsILO_JVcj{ImkbOHEa{HEjtmSN`?>!lvI6;>1s;*b3=DjSK$uZf z!>fUTfpLMSi(^Pd+}qi@9xQ<(t@CgByqdvtnWfvH8153}2Cw#kqEZzcuImpRxfTK1f){K*`Cx%&I5Vr36Lq}@MLyIJ|*Or6vB zCaZ9!Mz$TD`Zn$R#%6yfE92R%)1NPoD6f-w|M1U>t^J#X78~etF)VXsJg`NBVTKqh z!{tQ`2~i>pKHW?WnTFq)!?xertx+v8-*54y&XX%Y6vQ9-^}5kcZvS43JHOvCinu=T=p z_!(n`eaF)!@BKNdDqwD-b69jO6WGdZkT-VNb-LD7?@tK$QqQOi_1cd0O!suRTAgXA z^PQB~#`#_H!QFtBhkGYzHk_AM3}z_Z!Sc)0vrSTM3)g|XiuFwI7%TGE?qq+kcc+&f cv(pcTpp*;28=@nPgg&ebxsLQ08%5>{r~^~ diff --git a/Resources/Textures/Structures/Windows/window.rsi/window5.png b/Resources/Textures/Structures/Windows/window.rsi/window5.png index df4ef650886770bca3ae09bcd7cc067227552802..df8dd36cf54e1eeb9e03f2c59d16196a74347996 100644 GIT binary patch delta 778 zcmV+l1NHox1)v6yBYy(tNkl?6Jd8u8Y^* zcX+h;2~Lu*#updh+0y5&Oh$kd$UF~iZ8xv{4dMcP3sXct1(Z zp?kvS`Rg-BtlsAx$F2#L?*Z%rNKAD7U>87QqU%RJ1WJ&DD7643$U&6K3&3_F)SbU} zHTQ>^dsZ7ETUZ33#_vBnhmelEl?&wnP8_4zY;uI}3xDgG;9%P~pQElW!*Qg6EsG$I zF{~VO?!PBl!*u5mbeeL7FNAdxq{g3~n!tyikNYp*WB$ck&hWXg3ZOPN&{jYiMbNGX zfA1(~`23vMBIy(fGK>wjkZBEM8e_kf*}@l5`F#MN0LnGBfARp37l1qg#v33E>smy$ zfARp37k>b0f^h9;wFIErKY0KSw8H8wgY8DcEQ7=kZv;;km$$tEg0S|0^&m8JL0Gk| zFqOayUxwz6a->iQTMv--0Tfa114@vCD7643$U&4^0PcWwX^cDI4pe>!h~F2u_~4C| zzu>>WFCa~Ak`jnnNNti5pcbG6IfzmVP=Xvp5q~ey79EvU=E@BD2J$XVkuV%0hzqdK zcL9IXH?W#+jz}HFZ1KhCfa3?padK+Xcm}XlJRvUu7vepDJOZtuVE{hPOi!4~5qc3@ zeDNMY9s%+SkY|9r1LPs#L|g#l5y-Uh43Kw#JOnfmvH;*Wtb^T!`Dp6<00000NkvXX It^-0~g57m!n*aa+ delta 642 zcmV-|0)73U2ATzsBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0xwBKK~#8N?VF)e12GVW4`db4D#SSq>I9mHsN@My3>E|e0hU4W z1js%F8iB&#PM}&q)k62!y~(ACX=nG(O!Cd_?9I9VyCe)rx_?uFX`1GDJRVnz#iBYs zoj&pFj>Ds-`uYB%$96eyyLUd%k2m-HxDmVDVNiHsG^r`2lnHPF^yR5erkB^TudE4N z01f*<_?o*qZ~;UpJk5U#k`Ul92+s?kDyayd;IZ(k3j%Z~+w7FGf8) zk-`+9grQOoPk+D#P{>$Wkjf$mqX^)hEkywLY}tB0;Oye|iXS&(+yCdcrAz_t*-`{> z&z2&9yDFne9W6BK0-TVt>ERa?RRLc3YH$Bwtam) zKqP!Js0$!M;ZyhvK$r+%2H{_44|ne`vvYn0!%{$pgny?)QTJdJg{1%*^YwDx_G6z8 zMbVg#fYh*F1KQOT=+}bWra%Yn_tSB>+zUWsy#{oM1pi750uupp=(%DbAqCV0$YEzl zLJDXL=st5qLJ}g>1UN%{O@do!R7XHaf?sIV*8opKsGz6|AV@;2(3l8FnIeFDwiE%} zvjzTp0ekfQf-(iTXG;;lJzI(Z?l9<_AXXNnFal(A#4i&GZ~<~pz%9l^0$hOH6ObY- zC8V+l_M0Oy30kBgK!{0DBMAZC5Fbd;1}=c^2+(nPNP-1$0dh|uAi)H<0QZ1&`G0pn c%7Ci+18Fi5jjyEM0ssI207*qoM6N<$f@qr%%K!iX diff --git a/Resources/Textures/Structures/Windows/window.rsi/window6.png b/Resources/Textures/Structures/Windows/window.rsi/window6.png index 30629fcac2aec115a9940cbd378b6039b439491d..13aaa2107eb3d7196a96e5530e1996c6cbe0b650 100644 GIT binary patch delta 1168 zcmV;B1aJF`1fvO%BYy;HNkl!EKN>NIr{=f(gEf&#I zP(f6D(HDyZB=irk?>_im3%(RYgdqA*d=W)KL8(ZsVk$;#DJ`Lh+G=XrWV83~&b@a= z&fMLyDUudvof+Bv0=WZwXV1Cc&Y79-oVg5|kWy-W!M^7XoPWIQ>6fu33h~PR2k`di zi>PnA6$|r+F*AGUwaxl6#_+}qyFSyg@9A{54PEk`BjB%Qf?O0vZ8||f$QTMpe0S<+ z#9?66wpnYNfYBdg$O;M3=@_%?R0vE>-J`CN?;Eq}3<2cGy?1U?ZC(hYcHIE;;Q0)V zv6@kLoFTy6Z-2fK&Jd8L3Dy&i+iDSt=BhEfP7vS;fhh2i2#KXXu0mAIg@F?U6j4Q8 z7Z=Zf`94Hz&6sT`_5q&ffy)3nZzHQT(30kU7bix5OcQn8xA$R8`U0M|M7w!7K|mBm zXm!{AmBNE4%;^Cq2w3ae_z0dM4$MWS_F#MUgHuo4NPm_t%pZPzX7&(TmzOd3L85oQa(9`%m&F>0~5zy24r1@RS!Wi|1v_5Hm(*CZ%iYKyzfsQh#@rLSqDw#wV>$nxC{k5*S@k#5G=0{%+z&6Z#cGbe01mb|LDVO~8$gvbm1`^)b0YU_^ieK3K(w00(@q ziV*=0_+S-7Pk{CJ1?YT%PX8k>&J6GS0)Kd7tP`-~`8ib}p|m*_P3k;_S09JhN#KudxprUVd*DTZYGq?t{i~1P*Rt=# zad|3`Q0174CLt4$odi2>pTM6I&8gn0svMTKo7nKYt>q z2bi9|A2pAmQ7bD;qL4WE`(>Oze?e)FJ-Z*oE!~%^-qN&hoq#vLC{K*kRgIvEsGVc! z>oeeafiSL>v$Pc5gH`22fB5}{f!TK=1gJnl#ZxMpB+P@)I}m<=qFY?O9@zj7Xj>=X i(kJs}fy4#?{0&-Fd}{Oz delta 498 zcmZ3?+08ORxt@WsILO_JVcj{ImkbOHEa{HEjtmSN`?>!lvI6;>1s;*b3=DjSK$uZf z!>fUTfpLMSi(^Pd+}qi@9xQ<(t@CgByqdvtnWfvH8153}2Cw#kqEZzcuImpRxfTK1f){K*`Cx%&I5Vr36Lq}@MLyIJ|*Or6vB zCaZ9!Mz$TD`Zn$R#%6yfE92R%)1NPoD6f-w|M1U>t^J#X78~etF)VXsJg`NBVTKqh z!{tQ`2~i>pKHW?WnTFq)!?xertx+v8-*54y&XX%Y6vQ9-^}5kcZvS43JHOvCinu=T=p z_!(n`eaF)!@BKNdDqwD-b69jO6WGdZkT-VNb-LD7?@tK$QqQOi_1cd0O!suRTAgXA z^PQB~#`#_H!QFtBhkGYzHk_AM3}z_Z!Sc)0vrSTM3)g|XiuFwI7%TGE?qq+kcc+&f cv(pcTpp*;28=@nPgg&ebxsLQ08%5>{r~^~ diff --git a/Resources/Textures/Structures/Windows/window.rsi/window7.png b/Resources/Textures/Structures/Windows/window.rsi/window7.png index 0e02c2e8de00c8cbba348e75dd3a5b8dbce1d31b..1a2e65fad78efe662cf60742e0d6afd2088f1e6b 100644 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Up!qLLn`LHogK(~$bf;>T&0m+ zq(MM{$;p9H?!cu21G~6c<%#A0WA&$-W=}7f=QJ&~Q?8)4uJ7cJ-#n|^vw}0-p ziOeY`I9{^be)tM;zp1UGGK?m6&+hv)*nAU!itCLw)Z4C53gQu&X J%Q~loCIB+RX~6&h literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!G)eKjv*CsZ)Y#$ZEz4cAa^WQx{jql1nxza8-i#ZjF(v4-9*E*<*eb%1t;ulh z(@(h%-|hZSoyTx3hyjNhED|r6zr=&}W6CY<`N)v;l&3B*C{zLHSO!m5KbLh*2~7YR Cu2;wa diff --git a/Resources/Textures/Structures/Windows/window_diagonal.rsi/state0.png b/Resources/Textures/Structures/Windows/window_diagonal.rsi/state0.png index 39ffd5be1fd6a117d57e55f02f9ac0cc33eb5ef5..df5805957d6b0d0b891e10d01cb5a46e4c36e95a 100644 GIT binary patch literal 15988 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 T+&>K!JMPxP$~!+ZV$;QnZ1 delta 659 zcmV;E0&M->e7*&cBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ$>+VQ9BfI z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<`9$B7iW07=OT^#7sSrUd+IAeBHyx z*Sjds@;>+H=vVS41AHR!9McVpc!PLm)6zNb6NgwyQi#uq#|^q5@gvt|m)|%S9Ts?I z$jGGTi9^ITl3X&m%3$PJKou$^#}EDozq>UHQ{5*!IUL z(6b9P>$d%UY}?Hf!2b+fX>EVC0nC1qUT4l)$$E+a0rYQDSO@H-6Or7z5RQp)!z?k5pttbR*U}t z000JJOGiWi8UPvq8b846fRP~=e*gz`Nliru=L{GUB{Sbi)dTf+E8t>CcOeIJdj10piO!KZJ>=lpsvJloB8C zi64%qvoP`dWsciG4F?btu!aMego*F=*>?k5_-(oR1+?G*W?|wkSI~o-WnV!rZW=Ix zn+1&GCIK2;9Z Date: Thu, 13 Jun 2024 18:24:36 -0400 Subject: [PATCH 43/79] Revert "what" This reverts commit beb81ff621b39111e3fd4e788eb701f29149a236, reversing changes made to 510dedf8f75aa7abdb32812e39d46da434f5cc0d. --- Content.Client/Input/ContentContexts.cs | 1 - .../Language/LanguageMenuWindow.xaml | 18 - .../Language/LanguageMenuWindow.xaml.cs | 134 ----- .../Language/Systems/LanguageSystem.cs | 76 --- .../Systems/TranslatorImplanterSystem.cs | 8 - .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 1 - .../Systems/Chat/Controls/ChatInputBox.cs | 1 - .../Language/LanguageMenuUIController.cs | 89 ---- .../MenuBar/GameTopMenuBarUIController.cs | 4 - .../MenuBar/Widgets/GameTopMenuBar.xaml | 10 - .../Administration/Managers/AdminManager.cs | 2 +- .../Atmos/Components/AirtightComponent.cs | 32 +- .../Atmos/EntitySystems/AirtightSystem.cs | 2 + .../AtmosphereSystem.GridAtmosphere.cs | 8 +- .../AtmosphereSystem.Processing.cs | 2 +- .../EntitySystems/AtmosphereSystem.Utils.cs | 3 +- Content.Server/Atmos/GasMixture.cs | 7 +- Content.Server/Atmos/TileAtmosphere.cs | 3 - Content.Server/Chat/Systems/ChatSystem.cs | 153 ++---- .../Chemistry/ReagentEffects/MakeSentient.cs | 20 +- .../Language/Commands/ListLanguagesCommand.cs | 39 -- .../Language/Commands/SayLanguageCommand.cs | 53 -- .../Commands/SelectLanguageCommand.cs | 48 -- .../Language/DetermineEntityLanguagesEvent.cs | 29 -- .../Language/LanguageSystem.Networking.cs | 59 --- Content.Server/Language/LanguageSystem.cs | 289 ---------- .../Language/TranslatorImplanterSystem.cs | 72 --- Content.Server/Language/TranslatorSystem.cs | 225 -------- .../Mind/Commands/MakeSentientCommand.cs | 10 - .../Radio/EntitySystems/HeadsetSystem.cs | 16 +- .../Radio/EntitySystems/RadioDeviceSystem.cs | 5 +- .../Radio/EntitySystems/RadioSystem.cs | 66 +-- Content.Server/Radio/RadioEvent.cs | 14 +- .../Speech/EntitySystems/ListeningSystem.cs | 7 +- Content.Shared/Input/ContentKeyFunctions.cs | 1 - .../Components/LanguageSpeakerComponent.cs | 29 -- .../TranslatorImplanterComponent.cs | 35 -- .../Translators/BaseTranslatorComponent.cs | 47 -- .../HandheldTranslatorComponent.cs | 15 - .../Translators/HoldsTranslatorComponent.cs | 11 - .../ImplantedTranslatorComponent.cs | 9 - .../IntrinsicTranslatorComponent.cs | 10 - .../UniversalLanguageSpeakerComponent.cs | 11 - .../Language/Events/LanguagesSetMessage.cs | 13 - .../Language/Events/LanguagesUpdateEvent.cs | 8 - .../Events/LanguagesUpdatedMessage.cs | 15 - .../Events/RequestLanguagesMessage.cs | 10 - Content.Shared/Language/LanguagePrototype.cs | 37 -- .../Language/Systems/SharedLanguageSystem.cs | 39 -- .../SharedTranslatorImplanterSystem.cs | 36 -- .../Systems/SharedTranslatorSystem.cs | 34 -- Resources/Changelog/Changelog.yml | 24 - Resources/Locale/en-US/language/commands.ftl | 8 - .../Locale/en-US/language/language-menu.ftl | 4 - Resources/Locale/en-US/language/languages.ftl | 71 --- .../Locale/en-US/language/technologies.ftl | 2 - .../Locale/en-US/language/translator.ftl | 8 - .../DeltaV/Entities/Mobs/NPCs/animals.yml | 13 +- .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 5 - .../DeltaV/Entities/Mobs/NPCs/nukiemouse.yml | 10 +- .../DeltaV/Entities/Mobs/Species/harpy.yml | 13 +- .../Entities/Mobs/Species/vulpkanin.yml | 7 - .../Mobs/Cyborgs/base_borg_chassis.yml | 7 - .../Prototypes/Entities/Mobs/NPCs/animals.yml | 129 +---- .../Entities/Mobs/NPCs/argocyte.yml | 7 +- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 65 +-- .../Entities/Mobs/NPCs/regalrat.yml | 13 - .../Entities/Mobs/NPCs/revenant.yml | 1 - .../Prototypes/Entities/Mobs/NPCs/shadows.yml | 11 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 7 - .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 7 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 23 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 12 - .../Entities/Mobs/Player/observer.yml | 1 - .../Entities/Mobs/Player/replay_observer.yml | 1 - .../Prototypes/Entities/Mobs/Species/base.yml | 9 +- .../Entities/Mobs/Species/diona.yml | 7 - .../Entities/Mobs/Species/dwarf.yml | 7 - .../Entities/Mobs/Species/human.yml | 8 - .../Prototypes/Entities/Mobs/Species/moth.yml | 7 - .../Entities/Mobs/Species/reptilian.yml | 7 - .../Entities/Mobs/Species/slime.yml | 7 - .../Objects/Devices/translator_implants.yml | 132 ----- .../Entities/Objects/Devices/translators.yml | 205 -------- .../Doors/Airlocks/base_structureairlocks.yml | 1 + .../Structures/Doors/Airlocks/shuttle.yml | 1 + .../Structures/Doors/Firelocks/firelock.yml | 2 + .../Doors/MaterialDoors/material_doors.yml | 1 + .../Doors/SecretDoor/secret_door.yml | 1 + .../Structures/Doors/Shutter/shutters.yml | 1 + .../Doors/Windoors/base_structurewindoors.yml | 1 + .../Entities/Structures/Machines/lathe.yml | 18 - .../Structures/Machines/vending_machines.yml | 7 - .../Entities/Structures/plastic_flaps.yml | 2 + Resources/Prototypes/Language/languages.yml | 493 ------------------ .../Nyanotrasen/Entities/Mobs/Species/Oni.yml | 7 - .../Entities/Mobs/Species/felinid.yml | 9 - .../Prototypes/Recipes/Lathes/language.yml | 190 ------- .../Prototypes/Research/civilianservices.yml | 40 -- .../equipped-OUTERCLOTHING.png | Bin 622 -> 411 bytes .../Armor/bulletproof.rsi/icon.png | Bin 236 -> 244 bytes .../Armor/bulletproof.rsi/meta.json | 2 +- .../Armor/riot.rsi/equipped-OUTERCLOTHING.png | Bin 648 -> 1562 bytes .../OuterClothing/Armor/riot.rsi/icon.png | Bin 231 -> 293 bytes .../OuterClothing/Armor/riot.rsi/meta.json | 4 +- .../security.rsi/equipped-OUTERCLOTHING.png | Bin 413 -> 343 bytes .../OuterClothing/Armor/security.rsi/icon.png | Bin 193 -> 252 bytes .../Armor/security.rsi/meta.json | 2 +- .../equipped-OUTERCLOTHING.png | Bin 484 -> 428 bytes .../Armor/security_slim.rsi/icon.png | Bin 195 -> 277 bytes .../Armor/security_slim.rsi/meta.json | 2 +- Resources/Textures/Interface/language.png | Bin 739 -> 0 bytes .../Objects/Devices/translator.rsi/icon.png | Bin 278 -> 0 bytes .../Objects/Devices/translator.rsi/meta.json | 17 - .../Devices/translator.rsi/translator.png | Bin 202 -> 0 bytes .../fire_extinguisher_closed.png | Bin 303 -> 429 bytes .../fire_extinguisher_open.png | Bin 315 -> 420 bytes .../Misc/fire_extinguisher.rsi/meta.json | 2 +- .../Misc/stock_parts.rsi/adv_capacitor.png | Bin 345 -> 420 bytes .../Misc/stock_parts.rsi/adv_scan_module.png | Bin 725 -> 927 bytes .../stock_parts.rsi/advanced_matter_bin.png | Bin 430 -> 426 bytes .../stock_parts.rsi/bluespace_matter_bin.png | Bin 1283 -> 627 bytes .../Misc/stock_parts.rsi/capacitor.png | Bin 391 -> 254 bytes .../Misc/stock_parts.rsi/femto_mani.png | Bin 416 -> 589 bytes .../Misc/stock_parts.rsi/high_micro_laser.png | Bin 333 -> 278 bytes .../Misc/stock_parts.rsi/matter_bin.png | Bin 457 -> 462 bytes .../Objects/Misc/stock_parts.rsi/meta.json | 50 +- .../Misc/stock_parts.rsi/micro_laser.png | Bin 357 -> 263 bytes .../Misc/stock_parts.rsi/micro_mani.png | Bin 390 -> 366 bytes .../Misc/stock_parts.rsi/nano_mani.png | Bin 428 -> 394 bytes .../Misc/stock_parts.rsi/pico_mani.png | Bin 404 -> 373 bytes .../stock_parts.rsi/quadratic_capacitor.png | Bin 367 -> 729 bytes .../stock_parts.rsi/quadultra_micro_laser.png | Bin 421 -> 371 bytes .../Misc/stock_parts.rsi/scan_module.png | Bin 478 -> 491 bytes .../Misc/stock_parts.rsi/super_capacitor.png | Bin 291 -> 419 bytes .../Misc/stock_parts.rsi/super_matter_bin.png | Bin 523 -> 397 bytes .../stock_parts.rsi/super_scan_module.png | Bin 564 -> 1182 bytes .../stock_parts.rsi/triphasic_scan_module.png | Bin 770 -> 631 bytes .../ultra_high_micro_laser.png | Bin 389 -> 304 bytes .../Weapons/Melee/stunbaton.rsi/meta.json | 2 +- .../Melee/stunbaton.rsi/stunbaton_nocell.png | Bin 253 -> 431 bytes .../Melee/stunbaton.rsi/stunbaton_off.png | Bin 224 -> 362 bytes .../Melee/stunbaton.rsi/stunbaton_on.png | Bin 1753 -> 1091 bytes .../Decoration/banner.rsi/banner.png | Bin 397 -> 1577 bytes .../Decoration/banner.rsi/banner_cargo.png | Bin 415 -> 519 bytes .../banner.rsi/banner_engineering.png | Bin 381 -> 724 bytes .../Decoration/banner.rsi/banner_medical.png | Bin 420 -> 428 bytes .../Decoration/banner.rsi/banner_science.png | Bin 417 -> 537 bytes .../Decoration/banner.rsi/banner_security.png | Bin 402 -> 742 bytes .../banner.rsi/banner_syndicate.png | Bin 394 -> 569 bytes .../Decoration/banner.rsi/meta.json | 2 +- .../Furniture/furniture.rsi/meta.json | 4 +- .../Furniture/furniture.rsi/rack.png | Bin 315 -> 250 bytes .../Singularity/collector.rsi/ca-o0.png | Bin 152 -> 1477 bytes .../Singularity/collector.rsi/ca-o1.png | Bin 149 -> 1415 bytes .../Singularity/collector.rsi/ca-o2.png | Bin 151 -> 1383 bytes .../Singularity/collector.rsi/ca-o3.png | Bin 148 -> 1421 bytes .../Singularity/collector.rsi/ca-tank.png | Bin 198 -> 2071 bytes .../Singularity/collector.rsi/ca_active.png | Bin 3159 -> 10749 bytes .../Singularity/collector.rsi/ca_deactive.png | Bin 3131 -> 10791 bytes .../Singularity/collector.rsi/ca_off.png | Bin 990 -> 2755 bytes .../Singularity/collector.rsi/ca_on.png | Bin 1521 -> 3212 bytes .../Singularity/collector.rsi/cu.png | Bin 990 -> 558 bytes .../Singularity/collector.rsi/meta.json | 2 +- .../Singularity/collector.rsi/static.png | Bin 1608 -> 664 bytes .../Wallmounts/screen.rsi/meta.json | 2 +- .../Wallmounts/screen.rsi/screen.png | Bin 398 -> 266 bytes .../Structures/Walls/solid_rust.rsi/full.png | Bin 2228 -> 2155 bytes .../Structures/Walls/solid_rust.rsi/meta.json | 2 +- .../solid_rust.rsi/reinf_construct-0.png | Bin 2248 -> 2293 bytes .../solid_rust.rsi/reinf_construct-1.png | Bin 2272 -> 2303 bytes .../solid_rust.rsi/reinf_construct-2.png | Bin 2269 -> 2340 bytes .../solid_rust.rsi/reinf_construct-3.png | Bin 2272 -> 2339 bytes .../solid_rust.rsi/reinf_construct-4.png | Bin 2268 -> 2372 bytes .../solid_rust.rsi/reinf_construct-5.png | Bin 2265 -> 2381 bytes .../Walls/solid_rust.rsi/reinf_over0.png | Bin 3233 -> 3230 bytes .../Walls/solid_rust.rsi/reinf_over1.png | Bin 3206 -> 2990 bytes .../Walls/solid_rust.rsi/reinf_over2.png | Bin 3233 -> 3230 bytes .../Walls/solid_rust.rsi/reinf_over3.png | Bin 3206 -> 2990 bytes .../Walls/solid_rust.rsi/reinf_over4.png | Bin 3191 -> 2903 bytes .../Walls/solid_rust.rsi/reinf_over5.png | Bin 3128 -> 2908 bytes .../Walls/solid_rust.rsi/reinf_over6.png | Bin 3191 -> 2903 bytes .../Walls/solid_rust.rsi/reinf_over7.png | Bin 3083 -> 2840 bytes .../Walls/solid_rust.rsi/rgeneric.png | Bin 2248 -> 2332 bytes .../Walls/solid_rust.rsi/solid0.png | Bin 3281 -> 2943 bytes .../Walls/solid_rust.rsi/solid1.png | Bin 3147 -> 2638 bytes .../Walls/solid_rust.rsi/solid2.png | Bin 3281 -> 2943 bytes .../Walls/solid_rust.rsi/solid3.png | Bin 3147 -> 2638 bytes .../Walls/solid_rust.rsi/solid4.png | Bin 3156 -> 2554 bytes .../Walls/solid_rust.rsi/solid5.png | Bin 3128 -> 2565 bytes .../Walls/solid_rust.rsi/solid6.png | Bin 3156 -> 2531 bytes .../Walls/solid_rust.rsi/solid7.png | Bin 3083 -> 2495 bytes Resources/keybinds.yml | 3 - shell.nix | 2 +- 194 files changed, 202 insertions(+), 3374 deletions(-) delete mode 100644 Content.Client/Language/LanguageMenuWindow.xaml delete mode 100644 Content.Client/Language/LanguageMenuWindow.xaml.cs delete mode 100644 Content.Client/Language/Systems/LanguageSystem.cs delete mode 100644 Content.Client/Language/Systems/TranslatorImplanterSystem.cs delete mode 100644 Content.Client/UserInterface/Systems/Language/LanguageMenuUIController.cs delete mode 100644 Content.Server/Language/Commands/ListLanguagesCommand.cs delete mode 100644 Content.Server/Language/Commands/SayLanguageCommand.cs delete mode 100644 Content.Server/Language/Commands/SelectLanguageCommand.cs delete mode 100644 Content.Server/Language/DetermineEntityLanguagesEvent.cs delete mode 100644 Content.Server/Language/LanguageSystem.Networking.cs delete mode 100644 Content.Server/Language/LanguageSystem.cs delete mode 100644 Content.Server/Language/TranslatorImplanterSystem.cs delete mode 100644 Content.Server/Language/TranslatorSystem.cs delete mode 100644 Content.Shared/Language/Components/LanguageSpeakerComponent.cs delete mode 100644 Content.Shared/Language/Components/TranslatorImplanterComponent.cs delete mode 100644 Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs delete mode 100644 Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs delete mode 100644 Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs delete mode 100644 Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs delete mode 100644 Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs delete mode 100644 Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs delete mode 100644 Content.Shared/Language/Events/LanguagesSetMessage.cs delete mode 100644 Content.Shared/Language/Events/LanguagesUpdateEvent.cs delete mode 100644 Content.Shared/Language/Events/LanguagesUpdatedMessage.cs delete mode 100644 Content.Shared/Language/Events/RequestLanguagesMessage.cs delete mode 100644 Content.Shared/Language/LanguagePrototype.cs delete mode 100644 Content.Shared/Language/Systems/SharedLanguageSystem.cs delete mode 100644 Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs delete mode 100644 Content.Shared/Language/Systems/SharedTranslatorSystem.cs delete mode 100644 Resources/Locale/en-US/language/commands.ftl delete mode 100644 Resources/Locale/en-US/language/language-menu.ftl delete mode 100644 Resources/Locale/en-US/language/languages.ftl delete mode 100644 Resources/Locale/en-US/language/technologies.ftl delete mode 100644 Resources/Locale/en-US/language/translator.ftl delete mode 100644 Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml delete mode 100644 Resources/Prototypes/Entities/Objects/Devices/translators.yml delete mode 100644 Resources/Prototypes/Language/languages.yml delete mode 100644 Resources/Prototypes/Recipes/Lathes/language.yml delete mode 100644 Resources/Textures/Interface/language.png delete mode 100644 Resources/Textures/Objects/Devices/translator.rsi/icon.png delete mode 100644 Resources/Textures/Objects/Devices/translator.rsi/meta.json delete mode 100644 Resources/Textures/Objects/Devices/translator.rsi/translator.png diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index fa631938100..03f4f3f38b7 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -55,7 +55,6 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.UseItemInHand); human.AddFunction(ContentKeyFunctions.AltUseItemInHand); human.AddFunction(ContentKeyFunctions.OpenCharacterMenu); - human.AddFunction(ContentKeyFunctions.OpenLanguageMenu); human.AddFunction(ContentKeyFunctions.ActivateItemInWorld); human.AddFunction(ContentKeyFunctions.ThrowItemInHand); human.AddFunction(ContentKeyFunctions.AltActivateItemInWorld); diff --git a/Content.Client/Language/LanguageMenuWindow.xaml b/Content.Client/Language/LanguageMenuWindow.xaml deleted file mode 100644 index ff33a6ddf56..00000000000 --- a/Content.Client/Language/LanguageMenuWindow.xaml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Content.Client/Language/LanguageMenuWindow.xaml.cs b/Content.Client/Language/LanguageMenuWindow.xaml.cs deleted file mode 100644 index 312814aca35..00000000000 --- a/Content.Client/Language/LanguageMenuWindow.xaml.cs +++ /dev/null @@ -1,134 +0,0 @@ -using Content.Client.Language.Systems; -using Content.Shared.Language; -using Content.Shared.Language.Systems; -using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.CustomControls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Console; -using Robust.Shared.Utility; -using Serilog; -using static Content.Shared.Language.Systems.SharedLanguageSystem; - -namespace Content.Client.Language; - -[GenerateTypedNameReferences] -public sealed partial class LanguageMenuWindow : DefaultWindow -{ - private readonly LanguageSystem _clientLanguageSystem; - private readonly List _entries = new(); - - - public LanguageMenuWindow() - { - RobustXamlLoader.Load(this); - _clientLanguageSystem = IoCManager.Resolve().GetEntitySystem(); - } - - protected override void Opened() - { - // Refresh the window when it gets opened. - // This actually causes two refreshes: one immediately, and one after the server sends a state message. - UpdateState(_clientLanguageSystem.CurrentLanguage, _clientLanguageSystem.SpokenLanguages); - _clientLanguageSystem.RequestStateUpdate(); - } - - - public void UpdateState(string currentLanguage, List spokenLanguages) - { - var langName = Loc.GetString($"language-{currentLanguage}-name"); - CurrentLanguageLabel.Text = Loc.GetString("language-menu-current-language", ("language", langName)); - - OptionsList.RemoveAllChildren(); - _entries.Clear(); - - foreach (var language in spokenLanguages) - { - AddLanguageEntry(language); - } - - // Disable the button for the currently chosen language - foreach (var entry in _entries) - { - if (entry.button != null) - entry.button.Disabled = entry.language == currentLanguage; - } - } - - private void AddLanguageEntry(string language) - { - var proto = _clientLanguageSystem.GetLanguagePrototype(language); - var state = new EntryState { language = language }; - - var container = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Vertical }; - - #region Header - var header = new BoxContainer - { - Orientation = BoxContainer.LayoutOrientation.Horizontal, - HorizontalExpand = true, - SeparationOverride = 2 - }; - - var name = new Label - { - Text = proto?.Name ?? Loc.GetString("generic-error"), - MinWidth = 50, - HorizontalExpand = true - }; - - var button = new Button { Text = "Choose" }; - button.OnPressed += _ => OnLanguageChosen(language); - state.button = button; - - header.AddChild(name); - header.AddChild(button); - - container.AddChild(header); - #endregion - - #region Collapsible description - var body = new CollapsibleBody - { - HorizontalExpand = true, - Margin = new Thickness(4f, 4f) - }; - - var description = new RichTextLabel { HorizontalExpand = true }; - description.SetMessage(proto?.Description ?? Loc.GetString("generic-error")); - body.AddChild(description); - - var collapser = new Collapsible(Loc.GetString("language-menu-description-header"), body) - { - Orientation = BoxContainer.LayoutOrientation.Vertical, - HorizontalExpand = true - }; - - container.AddChild(collapser); - #endregion - - // Before adding, wrap the new container in a PanelContainer to give it a distinct look - var wrapper = new PanelContainer(); - wrapper.StyleClasses.Add("PdaBorderRect"); - - wrapper.AddChild(container); - OptionsList.AddChild(wrapper); - - _entries.Add(state); - } - - - private void OnLanguageChosen(string id) - { - var proto = _clientLanguageSystem.GetLanguagePrototype(id); - if (proto != null) - _clientLanguageSystem.RequestSetLanguage(proto); - } - - - private struct EntryState - { - public string language; - public Button? button; - } -} diff --git a/Content.Client/Language/Systems/LanguageSystem.cs b/Content.Client/Language/Systems/LanguageSystem.cs deleted file mode 100644 index 9714078b2c5..00000000000 --- a/Content.Client/Language/Systems/LanguageSystem.cs +++ /dev/null @@ -1,76 +0,0 @@ -using Content.Shared.Language; -using Content.Shared.Language.Events; -using Content.Shared.Language.Systems; -using Robust.Client; -using Robust.Shared.Console; - -namespace Content.Client.Language.Systems; - -/// -/// Client-side language system. -/// -/// -/// Unlike the server, the client is not aware of other entities' languages; it's only notified about the entity that it posesses. -/// Due to that, this system stores such information in a static manner. -/// -public sealed class LanguageSystem : SharedLanguageSystem -{ - [Dependency] private readonly IBaseClient _client = default!; - - /// - /// The current language of the entity currently possessed by the player. - /// - public string CurrentLanguage { get; private set; } = default!; - /// - /// The list of languages the currently possessed entity can speak. - /// - public List SpokenLanguages { get; private set; } = new(); - /// - /// The list of languages the currently possessed entity can understand. - /// - public List UnderstoodLanguages { get; private set; } = new(); - - public override void Initialize() - { - base.Initialize(); - - SubscribeNetworkEvent(OnLanguagesUpdated); - _client.RunLevelChanged += OnRunLevelChanged; - } - - private void OnLanguagesUpdated(LanguagesUpdatedMessage message) - { - CurrentLanguage = message.CurrentLanguage; - SpokenLanguages = message.Spoken; - UnderstoodLanguages = message.Understood; - } - - private void OnRunLevelChanged(object? sender, RunLevelChangedEventArgs args) - { - // Request an update when entering a game - if (args.NewLevel == ClientRunLevel.InGame) - RequestStateUpdate(); - } - - /// - /// Sends a network request to the server to update this system's state. - /// The server may ignore the said request if the player is not possessing an entity. - /// - public void RequestStateUpdate() - { - RaiseNetworkEvent(new RequestLanguagesMessage()); - } - - public void RequestSetLanguage(LanguagePrototype language) - { - if (language.ID == CurrentLanguage) - return; - - RaiseNetworkEvent(new LanguagesSetMessage(language.ID)); - - // May cause some minor desync... - // So to reduce the probability of desync, we replicate the change locally too - if (SpokenLanguages.Contains(language.ID)) - CurrentLanguage = language.ID; - } -} diff --git a/Content.Client/Language/Systems/TranslatorImplanterSystem.cs b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs deleted file mode 100644 index da19b3decf9..00000000000 --- a/Content.Client/Language/Systems/TranslatorImplanterSystem.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Content.Shared.Language.Systems; - -namespace Content.Client.Language.Systems; - -public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem -{ - -} diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 49e8099e0fb..f0537079b97 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -212,7 +212,6 @@ void AddCheckBox(string checkBoxName, bool currentState, Action, IOnStateExited -{ - public LanguageMenuWindow? LanguageWindow; - private MenuButton? LanguageButton => UIManager.GetActiveUIWidgetOrNull()?.LanguageButton; - - public override void Initialize() - { - SubscribeNetworkEvent((LanguagesUpdatedMessage message, EntitySessionEventArgs _) => - LanguageWindow?.UpdateState(message.CurrentLanguage, message.Spoken)); - } - - public void OnStateEntered(GameplayState state) - { - DebugTools.Assert(LanguageWindow == null); - - LanguageWindow = UIManager.CreateWindow(); - LayoutContainer.SetAnchorPreset(LanguageWindow, LayoutContainer.LayoutPreset.CenterTop); - - CommandBinds.Builder.Bind(ContentKeyFunctions.OpenLanguageMenu, - InputCmdHandler.FromDelegate(_ => ToggleWindow())).Register(); - } - - public void OnStateExited(GameplayState state) - { - if (LanguageWindow != null) - { - LanguageWindow.Dispose(); - LanguageWindow = null; - } - - CommandBinds.Unregister(); - } - - public void UnloadButton() - { - if (LanguageButton == null) - return; - - LanguageButton.OnPressed -= LanguageButtonPressed; - } - - public void LoadButton() - { - if (LanguageButton == null) - return; - - LanguageButton.OnPressed += LanguageButtonPressed; - - if (LanguageWindow == null) - return; - - LanguageWindow.OnClose += () => LanguageButton.Pressed = false; - LanguageWindow.OnOpen += () => LanguageButton.Pressed = true; - } - - private void LanguageButtonPressed(ButtonEventArgs args) - { - ToggleWindow(); - } - - private void ToggleWindow() - { - if (LanguageWindow == null) - return; - - if (LanguageButton != null) - LanguageButton.SetClickPressed(!LanguageWindow.IsOpen); - - if (LanguageWindow.IsOpen) - LanguageWindow.Close(); - else - LanguageWindow.Open(); - } -} diff --git a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs index 156fa63884e..1505db48a79 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs +++ b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs @@ -9,7 +9,6 @@ using Content.Client.UserInterface.Systems.MenuBar.Widgets; using Content.Client.UserInterface.Systems.Sandbox; using Robust.Client.UserInterface.Controllers; -using Content.Client.UserInterface.Systems.Language; namespace Content.Client.UserInterface.Systems.MenuBar; @@ -23,7 +22,6 @@ public sealed class GameTopMenuBarUIController : UIController [Dependency] private readonly ActionUIController _action = default!; [Dependency] private readonly SandboxUIController _sandbox = default!; [Dependency] private readonly GuidebookUIController _guidebook = default!; - [Dependency] private readonly LanguageMenuUIController _language = default!; private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull(); @@ -46,7 +44,6 @@ public void UnloadButtons() _ahelp.UnloadButton(); _action.UnloadButton(); _sandbox.UnloadButton(); - _language.UnloadButton(); } public void LoadButtons() @@ -59,6 +56,5 @@ public void LoadButtons() _ahelp.LoadButton(); _action.LoadButton(); _sandbox.LoadButton(); - _language.LoadButton(); } } diff --git a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml index a76943ace85..3c8cd1d164f 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml +++ b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml @@ -63,16 +63,6 @@ HorizontalExpand="True" AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}" /> - - /// The directions in which this entity should block airflow, relative to its own reference frame. - ///
[DataField("airBlockedDirection", customTypeSerializer: typeof(FlagSerializer))] public int InitialAirBlockedDirection { get; set; } = (int) AtmosDirection.All; - /// - /// The directions in which the entity is currently blocking airflow, relative to the grid that the entity is on. - /// I.e., this is a variant of that takes into account the entity's - /// current rotation. - /// [ViewVariables] public int CurrentAirBlockedDirection; - /// - /// Whether the airtight entity is currently blocking airflow. - /// - [DataField] + [DataField("airBlocked")] public bool AirBlocked { get; set; } = true; - /// - /// If true, entities on this tile will attempt to draw air from surrounding tiles when they become unblocked - /// and currently have no air. This is generally only required when is - /// true, or if the entity is likely to occupy the same tile as another no-air airtight entity. - /// - [DataField] + [DataField("fixVacuum")] public bool FixVacuum { get; set; } = true; - // I think fixvacuum exists to ensure that repeatedly closing/opening air-blocking doors doesn't end up - // depressurizing a room. However it can also effectively be used as a means of generating gasses for free - // TODO ATMOS Mass conservation. Make it actually push/pull air from adjacent tiles instead of destroying & creating, - - // TODO ATMOS Do we need these two fields? [DataField("rotateAirBlocked")] public bool RotateAirBlocked { get; set; } = true; - // TODO ATMOS remove this? What is this even for?? [DataField("fixAirBlockedDirectionInitialize")] public bool FixAirBlockedDirectionInitialize { get; set; } = true; - /// - /// If true, then the tile that this entity is on will have no air at all if all directions are blocked. - /// - [DataField] + [DataField("noAirWhenFullyAirBlocked")] public bool NoAirWhenFullyAirBlocked { get; set; } = true; - /// [Access(Other = AccessPermissions.ReadWriteExecute)] public AtmosDirection AirBlockedDirection => (AtmosDirection)CurrentAirBlockedDirection; } diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 152fba8fc4d..548d6a36926 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -85,6 +85,8 @@ private void OnAirtightMoved(Entity airtight, ref MoveEvent e private bool AirtightMove(Entity ent, ref MoveEvent ev) { var (owner, airtight) = ent; + if (!airtight.RotateAirBlocked || airtight.InitialAirBlockedDirection == (int)AtmosDirection.Invalid) + return false; airtight.CurrentAirBlockedDirection = (int) Rotate((AtmosDirection)airtight.InitialAirBlockedDirection, ev.NewRotation); var pos = airtight.LastPosition; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs index beddef4be7e..d43cc81b0f8 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs @@ -399,7 +399,10 @@ private void GridIsHotspotActive(EntityUid uid, GridAtmosphereComponent componen args.Handled = true; } - private void GridFixTileVacuum(TileAtmosphere tile) + private void GridFixTileVacuum( + Entity ent, + TileAtmosphere tile, + float volume) { DebugTools.AssertNotNull(tile.Air); DebugTools.Assert(tile.Air?.Immutable == false ); @@ -413,9 +416,6 @@ private void GridFixTileVacuum(TileAtmosphere tile) count++; } - if (count == 0) - return; - var ratio = 1f / count; var totalTemperature = 0f; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index eba398c1821..1f3ca2145b9 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -272,7 +272,7 @@ private void UpdateTileAir( tile.Air = new GasMixture(volume){Temperature = Atmospherics.T20C}; if (data.FixVacuum) - GridFixTileVacuum(tile); + GridFixTileVacuum(ent, tile, volume); } private void QueueRunTiles( diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index 67c6d5998dd..9b0d0d9670d 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -78,13 +78,12 @@ private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vecto if (!_airtightQuery.TryGetComponent(ent, out var airtight)) continue; - fixVacuum |= airtight.FixVacuum; - if(!airtight.AirBlocked) continue; blockedDirs |= airtight.AirBlockedDirection; noAirWhenBlocked |= airtight.NoAirWhenFullyAirBlocked; + fixVacuum |= airtight.FixVacuum; if (blockedDirs == AtmosDirection.All && noAirWhenBlocked && fixVacuum) break; diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs index 3d73a4d0b16..77fd7018333 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -62,9 +62,9 @@ public float Temperature get => _temperature; set { - DebugTools.Assert(!float.IsNaN(value)); - if (!Immutable) - _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); + DebugTools.Assert(!float.IsNaN(_temperature)); + if (Immutable) return; + _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); } } @@ -91,7 +91,6 @@ public GasMixture(float[] moles, float temp, float volume = Atmospherics.CellVol if (volume < 0) volume = 0; - DebugTools.Assert(!float.IsNaN(temp)); _temperature = temp; Moles = moles; Volume = volume; diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index 0026dbbf4f0..0dd35a29e76 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -28,9 +28,6 @@ public sealed class TileAtmosphere : IGasMixtureHolder [ViewVariables] public TileAtmosphere? PressureSpecificTarget { get; set; } - /// - /// This is either the pressure difference, or the quantity of moles transferred if monstermos is enabled. - /// [ViewVariables] public float PressureDifference { get; set; } diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 7190b94e141..6cdb088dbb0 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -5,8 +5,6 @@ using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.GameTicking; -using Content.Server.Language; -using Content.Server.Speech; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; using Content.Server.Psionics.Telepathy; @@ -19,7 +17,6 @@ using Content.Shared.Chat; using Content.Shared.Database; using Content.Shared.Ghost; -using Content.Shared.Language; using Content.Shared.Humanoid; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; @@ -63,7 +60,6 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ReplacementAccentSystem _wordreplacement = default!; - [Dependency] private readonly LanguageSystem _language = default!; //Nyano - Summary: pulls in the nyano chat system for psionics. [Dependency] private readonly NyanoChatSystem _nyanoChatSystem = default!; @@ -72,7 +68,6 @@ public sealed partial class ChatSystem : SharedChatSystem public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units public const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg"; - public const float DefaultObfuscationFactor = 0.2f; // Percentage of symbols in a whispered message that can be seen even by "far" listeners private bool _loocEnabled = true; private bool _deadLoocEnabled; @@ -178,8 +173,7 @@ public void TrySendInGameICMessage( ICommonSession? player = null, string? nameOverride = null, bool checkRadioPrefix = true, - bool ignoreActionBlocker = false, - LanguagePrototype? languageOverride = null + bool ignoreActionBlocker = false ) { if (HasComp(source)) @@ -255,10 +249,10 @@ public void TrySendInGameICMessage( switch (desiredType) { case InGameICChatType.Speak: - SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); + SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker); break; case InGameICChatType.Whisper: - SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); + SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker); break; case InGameICChatType.Emote: SendEntityEmote(source, message, range, nameOverride, hideLog: hideLog, ignoreActionBlocker: ignoreActionBlocker); @@ -388,14 +382,12 @@ private void SendEntitySpeak( ChatTransmitRange range, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false, - LanguagePrototype? languageOverride = null + bool ignoreActionBlocker = false ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) return; - // The original message var message = TransformSpeech(source, FormattedMessage.RemoveMarkup(originalMessage)); if (message.Length == 0) @@ -419,19 +411,18 @@ private void SendEntitySpeak( speech = proto; } - var language = languageOverride ?? _language.GetLanguage(source); - name = FormattedMessage.EscapeText(name); - // The chat message wrapped in a "x says y" string - var wrappedMessage = WrapPublicMessage(source, name, message); - // The chat message obfuscated via language obfuscation - var obfuscated = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); - // The language-obfuscated message wrapped in a "x says y" string - var wrappedObfuscated = WrapPublicMessage(source, name, obfuscated); - SendInVoiceRange(ChatChannel.Local, name, message, wrappedMessage, obfuscated, wrappedObfuscated, source, range, languageOverride: language); + var wrappedMessage = Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", + ("entityName", name), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("message", FormattedMessage.EscapeText(message))); + + SendInVoiceRange(ChatChannel.Local, message, wrappedMessage, source, range); - var ev = new EntitySpokeEvent(source, message, null, false, language); + var ev = new EntitySpokeEvent(source, message, null, null); RaiseLocalEvent(source, ev, true); // To avoid logging any messages sent by entities that are not players, like vendors, cloning, etc. @@ -464,8 +455,7 @@ private void SendEntityWhisper( RadioChannelPrototype? channel, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false, - LanguagePrototype? languageOverride = null + bool ignoreActionBlocker = false ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) @@ -475,6 +465,8 @@ private void SendEntityWhisper( if (message.Length == 0) return; + var obfuscatedMessage = ObfuscateMessageReadability(message, 0.2f); + // get the entity's name by visual identity (if no override provided). string nameIdentity = FormattedMessage.EscapeText(nameOverride ?? Identity.Name(source, EntityManager)); // get the entity's name by voice (if no override provided). @@ -491,57 +483,41 @@ private void SendEntityWhisper( } name = FormattedMessage.EscapeText(name); - var language = languageOverride ?? _language.GetLanguage(source); - var languageObfuscatedMessage = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); + var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", name), ("message", FormattedMessage.EscapeText(message))); + + var wrappedobfuscatedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(obfuscatedMessage))); + + var wrappedUnknownMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", + ("message", FormattedMessage.EscapeText(obfuscatedMessage))); + foreach (var (session, data) in GetRecipients(source, WhisperMuffledRange)) { - if (session.AttachedEntity is not { Valid: true } listener) + EntityUid listener; + + if (session.AttachedEntity is not { Valid: true } playerEntity) continue; + listener = session.AttachedEntity.Value; if (MessageRangeCheck(session, data, range) != MessageRangeCheckResult.Full) continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them. - var canUnderstandLanguage = _language.CanUnderstand(listener, language); - // How the entity perceives the message depends on whether it can understand its language - var perceivedMessage = canUnderstandLanguage ? message : languageObfuscatedMessage; - - // Result is the intermediate message derived from the perceived one via obfuscation - // Wrapped message is the result wrapped in an "x says y" string - string result, wrappedMessage; if (data.Range <= WhisperClearRange) - { - // Scenario 1: the listener can clearly understand the message - result = perceivedMessage; - wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", name), - ("message", FormattedMessage.EscapeText(result))); - } - else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) - { - // Scenerio 2: if the listener is too far, they only hear fragments of the message - // Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind - result = ObfuscateMessageReadability(perceivedMessage); - wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(result))); - } + _chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, false, session.Channel); + //If listener is too far, they only hear fragments of the message + //Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind + else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) //Shared.Physics.CollisionGroup.Opaque + _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedobfuscatedMessage, source, false, session.Channel); + //If listener is too far and has no line of sight, they can't identify the whisperer's identity else - { - // Scenario 3: If listener is too far and has no line of sight, they can't identify the whisperer's identity - result = ObfuscateMessageReadability(perceivedMessage); - wrappedMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", - ("message", FormattedMessage.EscapeText(result))); - } - - _chatManager.ChatMessageToOne(ChatChannel.Whisper, result, wrappedMessage, source, false, session.Channel); + _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedUnknownMessage, source, false, session.Channel); } - var replayWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", name), - ("message", FormattedMessage.EscapeText(message))); - _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, replayWrap, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); + _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); - var ev = new EntitySpokeEvent(source, message, channel, true, language); + var ev = new EntitySpokeEvent(source, message, channel, obfuscatedMessage); RaiseLocalEvent(source, ev, true); if (!hideLog) if (originalMessage == message) @@ -588,7 +564,7 @@ private void SendEntityEmote( if (checkEmote) TryEmoteChatInput(source, action); - SendInVoiceRange(ChatChannel.Emotes, name, action, wrappedMessage, obfuscated: "", obfuscatedWrappedMessage: "", source, range, author); + SendInVoiceRange(ChatChannel.Emotes, action, wrappedMessage, source, range, author); if (!hideLog) if (name != Name(source)) _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Emote from {ToPrettyString(source):user} as {name}: {action}"); @@ -615,13 +591,7 @@ private void SendLOOC(EntityUid source, ICommonSession player, string message, b ("entityName", name), ("message", FormattedMessage.EscapeText(message))); - SendInVoiceRange(ChatChannel.LOOC, name, message, wrappedMessage, - obfuscated: string.Empty, - obfuscatedWrappedMessage: string.Empty, // will be skipped anyway - source, - hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, - player.UserId, - languageOverride: LanguageSystem.Universal); + SendInVoiceRange(ChatChannel.LOOC, message, wrappedMessage, source, hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, player.UserId); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"LOOC from {player:Player}: {message}"); } @@ -702,29 +672,15 @@ private MessageRangeCheckResult MessageRangeCheck(ICommonSession session, ICChat /// /// Sends a chat message to the given players in range of the source entity. /// - private void SendInVoiceRange(ChatChannel channel, string name, string message, string wrappedMessage, string obfuscated, string obfuscatedWrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null, LanguagePrototype? languageOverride = null) + private void SendInVoiceRange(ChatChannel channel, string message, string wrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null) { - var language = languageOverride ?? _language.GetLanguage(source); foreach (var (session, data) in GetRecipients(source, VoiceRange)) { var entRange = MessageRangeCheck(session, data, range); if (entRange == MessageRangeCheckResult.Disallowed) continue; var entHideChat = entRange == MessageRangeCheckResult.HideChat; - if (session.AttachedEntity is not { Valid: true } playerEntity) - continue; - EntityUid listener = session.AttachedEntity.Value; - - - // If the channel does not support languages, or the entity can understand the message, send the original message, otherwise send the obfuscated version - if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language)) - { - _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); - } - else - { - _chatManager.ChatMessageToOne(channel, obfuscated, obfuscatedWrappedMessage, source, entHideChat, session.Channel, author: author); - } + _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); } _replay.RecordServerMessage(new ChatMessage(channel, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); @@ -834,21 +790,6 @@ public string SanitizeMessageReplaceWords(string message) return msg; } - /// - /// Wraps a message sent by the specified entity into an "x says y" string. - /// - public string WrapPublicMessage(EntityUid source, string name, string message) - { - var speech = GetSpeechVerb(source, message); - var verbName = Loc.GetString(_random.Pick(speech.SpeechVerbStrings)); - return Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", - ("entityName", name), - ("verb", verbName), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("message", FormattedMessage.EscapeText(message))); - } - /// /// Returns list of players and ranges for all players withing some range. Also returns observers with a range of -1. /// @@ -895,7 +836,7 @@ public readonly record struct ICChatRecipientData(float Range, bool Observer, bo { } - public string ObfuscateMessageReadability(string message, float chance = DefaultObfuscationFactor) + private string ObfuscateMessageReadability(string message, float chance) { var modifiedMessage = new StringBuilder(message); @@ -984,8 +925,7 @@ public sealed class EntitySpokeEvent : EntityEventArgs { public readonly EntityUid Source; public readonly string Message; - public readonly bool IsWhisper; - public readonly LanguagePrototype Language; + public readonly string? ObfuscatedMessage; // not null if this was a whisper /// /// If the entity was trying to speak into a radio, this was the channel they were trying to access. If a radio @@ -993,13 +933,12 @@ public sealed class EntitySpokeEvent : EntityEventArgs /// public RadioChannelPrototype? Channel; - public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, bool isWhisper, LanguagePrototype language) + public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, string? obfuscatedMessage) { Source = source; Message = message; Channel = channel; - IsWhisper = isWhisper; - Language = language; + ObfuscatedMessage = obfuscatedMessage; } } diff --git a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs index da16529d515..bf7691fe375 100644 --- a/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs +++ b/Content.Server/Chemistry/ReagentEffects/MakeSentient.cs @@ -1,14 +1,10 @@ -using System.Linq; using Content.Server.Ghost.Roles.Components; using Content.Server.Speech.Components; using Content.Shared.Chemistry.Reagent; -using Content.Shared.Language; -using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Robust.Shared.Prototypes; using Content.Server.Psionics; //Nyano - Summary: pulls in the ability for the sentient creature to become psionic. using Content.Shared.Humanoid; //Delta-V - Banning humanoids from becoming ghost roles. -using Content.Shared.Language.Events; namespace Content.Server.Chemistry.ReagentEffects; @@ -28,20 +24,6 @@ public override void Effect(ReagentEffectArgs args) entityManager.RemoveComponent(uid); entityManager.RemoveComponent(uid); - var speaker = entityManager.EnsureComponent(uid); - var fallback = SharedLanguageSystem.FallbackLanguagePrototype; - - if (!speaker.UnderstoodLanguages.Contains(fallback)) - speaker.UnderstoodLanguages.Add(fallback); - - if (!speaker.SpokenLanguages.Contains(fallback)) - { - speaker.CurrentLanguage = fallback; - speaker.SpokenLanguages.Add(fallback); - } - - args.EntityManager.EventBus.RaiseLocalEvent(uid, new LanguagesUpdateEvent(), true); - // Stops from adding a ghost role to things like people who already have a mind if (entityManager.TryGetComponent(uid, out var mindContainer) && mindContainer.HasMind) { @@ -65,7 +47,7 @@ public override void Effect(ReagentEffectArgs args) ghostRole = entityManager.AddComponent(uid); entityManager.EnsureComponent(uid); - entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. + entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. var entityData = entityManager.GetComponent(uid); ghostRole.RoleName = entityData.EntityName; diff --git a/Content.Server/Language/Commands/ListLanguagesCommand.cs b/Content.Server/Language/Commands/ListLanguagesCommand.cs deleted file mode 100644 index 6698e1b6453..00000000000 --- a/Content.Server/Language/Commands/ListLanguagesCommand.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Linq; -using Content.Shared.Administration; -using Robust.Shared.Console; -using Robust.Shared.Enums; - -namespace Content.Server.Language.Commands; - -[AnyCommand] -public sealed class ListLanguagesCommand : IConsoleCommand -{ - public string Command => "languagelist"; - public string Description => Loc.GetString("command-list-langs-desc"); - public string Help => Loc.GetString("command-list-langs-help", ("command", Command)); - - public void Execute(IConsoleShell shell, string argStr, string[] args) - { - if (shell.Player is not { } player) - { - shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); - return; - } - - if (player.Status != SessionStatus.InGame) - return; - - if (player.AttachedEntity is not {} playerEntity) - { - shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); - return; - } - - var languages = IoCManager.Resolve().GetEntitySystem(); - - var (spokenLangs, knownLangs) = languages.GetAllLanguages(playerEntity); - - shell.WriteLine("Spoken:\n" + string.Join("\n", spokenLangs)); - shell.WriteLine("Understood:\n" + string.Join("\n", knownLangs)); - } -} diff --git a/Content.Server/Language/Commands/SayLanguageCommand.cs b/Content.Server/Language/Commands/SayLanguageCommand.cs deleted file mode 100644 index 2e4a27b1dcc..00000000000 --- a/Content.Server/Language/Commands/SayLanguageCommand.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Content.Server.Chat.Systems; -using Content.Shared.Administration; -using Robust.Shared.Console; -using Robust.Shared.Enums; - -namespace Content.Server.Language.Commands; - -[AnyCommand] -public sealed class SayLanguageCommand : IConsoleCommand -{ - public string Command => "saylang"; - public string Description => Loc.GetString("command-saylang-desc"); - public string Help => Loc.GetString("command-saylang-help", ("command", Command)); - - public void Execute(IConsoleShell shell, string argStr, string[] args) - { - if (shell.Player is not { } player) - { - shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); - return; - } - - if (player.Status != SessionStatus.InGame) - return; - - if (player.AttachedEntity is not {} playerEntity) - { - shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); - return; - } - - if (args.Length < 2) - return; - - var languageId = args[0]; - var message = string.Join(" ", args, startIndex: 1, count: args.Length - 1).Trim(); - - if (string.IsNullOrEmpty(message)) - return; - - var languages = IoCManager.Resolve().GetEntitySystem(); - var chats = IoCManager.Resolve().GetEntitySystem(); - - var language = languages.GetLanguagePrototype(languageId); - if (language == null || !languages.CanSpeak(playerEntity, language.ID)) - { - shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); - return; - } - - chats.TrySendInGameICMessage(playerEntity, message, InGameICChatType.Speak, ChatTransmitRange.Normal, false, shell, player, languageOverride: language); - } -} diff --git a/Content.Server/Language/Commands/SelectLanguageCommand.cs b/Content.Server/Language/Commands/SelectLanguageCommand.cs deleted file mode 100644 index e3363846539..00000000000 --- a/Content.Server/Language/Commands/SelectLanguageCommand.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.Linq; -using Content.Shared.Administration; -using Robust.Shared.Console; -using Robust.Shared.Enums; - -namespace Content.Server.Language.Commands; - -[AnyCommand] -public sealed class SelectLanguageCommand : IConsoleCommand -{ - public string Command => "languageselect"; - public string Description => Loc.GetString("command-language-select-desc"); - public string Help => Loc.GetString("command-language-select-help", ("command", Command)); - - public void Execute(IConsoleShell shell, string argStr, string[] args) - { - if (shell.Player is not { } player) - { - shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); - return; - } - - if (player.Status != SessionStatus.InGame) - return; - - if (player.AttachedEntity is not { } playerEntity) - { - shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); - return; - } - - if (args.Length < 1) - return; - - var languageId = args[0]; - - var languages = IoCManager.Resolve().GetEntitySystem(); - - var language = languages.GetLanguagePrototype(languageId); - if (language == null || !languages.CanSpeak(playerEntity, language.ID)) - { - shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); - return; - } - - languages.SetLanguage(playerEntity, language.ID); - } -} diff --git a/Content.Server/Language/DetermineEntityLanguagesEvent.cs b/Content.Server/Language/DetermineEntityLanguagesEvent.cs deleted file mode 100644 index 13ab2cac279..00000000000 --- a/Content.Server/Language/DetermineEntityLanguagesEvent.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Content.Server.Language; - -/// -/// Raised in order to determine the language an entity speaks at the current moment, -/// as well as the list of all languages the entity may speak and understand. -/// -public sealed class DetermineEntityLanguagesEvent : EntityEventArgs -{ - /// - /// The default language of this entity. If empty, remain unchanged. - /// This field has no effect if the entity decides to speak in a concrete language. - /// - public string CurrentLanguage; - /// - /// The list of all languages the entity may speak. Must NOT be held as a reference! - /// - public List SpokenLanguages; - /// - /// The list of all languages the entity may understand. Must NOT be held as a reference! - /// - public List UnderstoodLanguages; - - public DetermineEntityLanguagesEvent(string currentLanguage, List spokenLanguages, List understoodLanguages) - { - CurrentLanguage = currentLanguage; - SpokenLanguages = spokenLanguages; - UnderstoodLanguages = understoodLanguages; - } -} diff --git a/Content.Server/Language/LanguageSystem.Networking.cs b/Content.Server/Language/LanguageSystem.Networking.cs deleted file mode 100644 index 7517b4185e3..00000000000 --- a/Content.Server/Language/LanguageSystem.Networking.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Content.Server.Mind; -using Content.Shared.Language; -using Content.Shared.Language.Events; -using Content.Shared.Mind; -using Content.Shared.Mind.Components; -using Robust.Shared.Player; - -namespace Content.Server.Language; - -/// -/// LanguageSystem Networking -/// This is used to update client state when mind change entity. -/// - -public sealed partial class LanguageSystem -{ - [Dependency] private readonly MindSystem _mind = default!; - - - public void InitializeNet() - { - // Refresh the client's state when its mind hops to a different entity - SubscribeLocalEvent((uid, _, _) => SendLanguageStateToClient(uid)); - SubscribeLocalEvent((_, _, args) => - { - if (args.Mind.Comp.Session != null) - SendLanguageStateToClient(args.Mind.Comp.Session); - }); - - SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp)); - SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession)); - } - - - private void SendLanguageStateToClient(EntityUid uid, LanguageSpeakerComponent? comp = null) - { - // Try to find a mind inside the entity and notify its session - if (!_mind.TryGetMind(uid, out _, out var mindComp) || mindComp.Session == null) - return; - - SendLanguageStateToClient(uid, mindComp.Session, comp); - } - - private void SendLanguageStateToClient(ICommonSession session, LanguageSpeakerComponent? comp = null) - { - // Try to find an entity associated with the session and resolve the languages from it - if (session.AttachedEntity is not { Valid: true } entity) - return; - - SendLanguageStateToClient(entity, session, comp); - } - - private void SendLanguageStateToClient(EntityUid uid, ICommonSession session, LanguageSpeakerComponent? component = null) - { - var langs = GetLanguages(uid, component); - var message = new LanguagesUpdatedMessage(langs.CurrentLanguage, langs.SpokenLanguages, langs.UnderstoodLanguages); - RaiseNetworkEvent(message, session); - } -} diff --git a/Content.Server/Language/LanguageSystem.cs b/Content.Server/Language/LanguageSystem.cs deleted file mode 100644 index f1bf44c1f4f..00000000000 --- a/Content.Server/Language/LanguageSystem.cs +++ /dev/null @@ -1,289 +0,0 @@ -using System.Linq; -using System.Text; -using Content.Server.GameTicking.Events; -using Content.Shared.Language; -using Content.Shared.Language.Events; -using Content.Shared.Language.Systems; -using Robust.Shared.Random; -using UniversalLanguageSpeakerComponent = Content.Shared.Language.Components.UniversalLanguageSpeakerComponent; - -namespace Content.Server.Language; - -public sealed partial class LanguageSystem : SharedLanguageSystem -{ - // Static and re-used event instances used to minimize memory allocations during language processing, which can happen many times per tick. - // These are used in the method GetLanguages and returned from it. They should never be mutated outside of that method or returned outside this system. - private readonly DetermineEntityLanguagesEvent - _determineLanguagesEvent = new(string.Empty, new(), new()), - _universalLanguagesEvent = new(UniversalPrototype, [UniversalPrototype], [UniversalPrototype]); // Returned for universal speakers only - - /// - /// A random number added to each pseudo-random number's seed. Changes every round. - /// - public int RandomRoundSeed { get; private set; } - - - public override void Initialize() - { - base.Initialize(); - - SubscribeNetworkEvent(OnClientSetLanguage); - SubscribeLocalEvent(OnInitLanguageSpeaker); - SubscribeLocalEvent(_ => RandomRoundSeed = _random.Next()); - - InitializeNet(); - } - - - #region public api - /// - /// Obfuscate a message using an entity's default language. - /// - public string ObfuscateSpeech(EntityUid source, string message) - { - var language = GetLanguage(source) ?? Universal; - return ObfuscateSpeech(message, language); - } - - /// - /// Obfuscate a message using the given language. - /// - public string ObfuscateSpeech(string message, LanguagePrototype language) - { - var builder = new StringBuilder(); - if (language.ObfuscateSyllables) - ObfuscateSyllables(builder, message, language); - else - ObfuscatePhrases(builder, message, language); - - return builder.ToString(); - } - - public bool CanUnderstand(EntityUid listener, LanguagePrototype language, LanguageSpeakerComponent? listenerLanguageComp = null) - { - if (language.ID == UniversalPrototype || HasComp(listener)) - return true; - - var listenerLanguages = GetLanguages(listener, listenerLanguageComp)?.UnderstoodLanguages; - - return listenerLanguages?.Contains(language.ID, StringComparer.Ordinal) ?? false; - } - - public bool CanSpeak(EntityUid speaker, string language, LanguageSpeakerComponent? speakerComp = null) - { - if (HasComp(speaker)) - return true; - - var langs = GetLanguages(speaker, speakerComp)?.UnderstoodLanguages; - return langs?.Contains(language, StringComparer.Ordinal) ?? false; - } - - /// - /// Returns the current language of the given entity. - /// Assumes Universal if not specified. - /// - public LanguagePrototype GetLanguage(EntityUid speaker, LanguageSpeakerComponent? languageComp = null) - { - var id = GetLanguages(speaker, languageComp)?.CurrentLanguage; - if (id == null) - return Universal; // Fallback - - _prototype.TryIndex(id, out LanguagePrototype? proto); - - return proto ?? Universal; - } - - public void SetLanguage(EntityUid speaker, string language, LanguageSpeakerComponent? languageComp = null) - { - if (!CanSpeak(speaker, language) || HasComp(speaker)) - return; - - if (languageComp == null && !TryComp(speaker, out languageComp)) - return; - - if (languageComp.CurrentLanguage == language) - return; - - languageComp.CurrentLanguage = language; - - RaiseLocalEvent(speaker, new LanguagesUpdateEvent(), true); - } - - /// - /// Adds a new language to the lists of understood and/or spoken languages of the given component. - /// - public void AddLanguage(LanguageSpeakerComponent comp, string language, bool addSpoken = true, bool addUnderstood = true) - { - if (addSpoken && !comp.SpokenLanguages.Contains(language)) - comp.SpokenLanguages.Add(language); - - if (addUnderstood && !comp.UnderstoodLanguages.Contains(language)) - comp.UnderstoodLanguages.Add(language); - - RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); - } - - public (List spoken, List understood) GetAllLanguages(EntityUid speaker) - { - var languages = GetLanguages(speaker); - // The lists need to be copied because the internal ones are re-used for performance reasons. - return (new List(languages.SpokenLanguages), new List(languages.UnderstoodLanguages)); - } - - /// - /// Ensures the given entity has a valid language as its current language. - /// If not, sets it to the first entry of its SpokenLanguages list, or universal if it's empty. - /// - public void EnsureValidLanguage(EntityUid entity, LanguageSpeakerComponent? comp = null) - { - if (comp == null && !TryComp(entity, out comp)) - return; - - var langs = GetLanguages(entity, comp); - if (!langs.SpokenLanguages.Contains(comp!.CurrentLanguage, StringComparer.Ordinal)) - { - comp.CurrentLanguage = langs.SpokenLanguages.FirstOrDefault(UniversalPrototype); - RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); - } - } - #endregion - - #region event handling - private void OnInitLanguageSpeaker(EntityUid uid, LanguageSpeakerComponent component, ComponentInit args) - { - if (string.IsNullOrEmpty(component.CurrentLanguage)) - component.CurrentLanguage = component.SpokenLanguages.FirstOrDefault(UniversalPrototype); - } - #endregion - - #region internal api - obfuscation - private void ObfuscateSyllables(StringBuilder builder, string message, LanguagePrototype language) - { - // Go through each word. Calculate its hash sum and count the number of letters. - // Replicate it with pseudo-random syllables of pseudo-random (but similar) length. Use the hash code as the seed. - // This means that identical words will be obfuscated identically. Simple words like "hello" or "yes" in different langs can be memorized. - var wordBeginIndex = 0; - var hashCode = 0; - for (var i = 0; i < message.Length; i++) - { - var ch = char.ToLower(message[i]); - // A word ends when one of the following is found: a space, a sentence end, or EOM - if (char.IsWhiteSpace(ch) || IsSentenceEnd(ch) || i == message.Length - 1) - { - var wordLength = i - wordBeginIndex; - if (wordLength > 0) - { - var newWordLength = PseudoRandomNumber(hashCode, 1, 4); - - for (var j = 0; j < newWordLength; j++) - { - var index = PseudoRandomNumber(hashCode + j, 0, language.Replacement.Count); - builder.Append(language.Replacement[index]); - } - } - - builder.Append(ch); - hashCode = 0; - wordBeginIndex = i + 1; - } - else - hashCode = hashCode * 31 + ch; - } - } - - private void ObfuscatePhrases(StringBuilder builder, string message, LanguagePrototype language) - { - // In a similar manner, each phrase is obfuscated with a random number of conjoined obfuscation phrases. - // However, the number of phrases depends on the number of characters in the original phrase. - var sentenceBeginIndex = 0; - for (var i = 0; i < message.Length; i++) - { - var ch = char.ToLower(message[i]); - if (IsSentenceEnd(ch) || i == message.Length - 1) - { - var length = i - sentenceBeginIndex; - if (length > 0) - { - var newLength = (int) Math.Clamp(Math.Cbrt(length) - 1, 1, 4); // 27+ chars for 2 phrases, 64+ for 3, 125+ for 4. - - for (var j = 0; j < newLength; j++) - { - var phrase = _random.Pick(language.Replacement); - builder.Append(phrase); - } - } - sentenceBeginIndex = i + 1; - - if (IsSentenceEnd(ch)) - builder.Append(ch).Append(" "); - } - } - } - - private static bool IsSentenceEnd(char ch) - { - return ch is '.' or '!' or '?'; - } - #endregion - - #region internal api - misc - /// - /// Dynamically resolves the current language of the entity and the list of all languages it speaks. - /// - /// If the entity is not a language speaker, or is a universal language speaker, then it's assumed to speak Universal, - /// aka all languages at once and none at the same time. - /// - /// - /// The returned event is reused and thus must not be held as a reference anywhere but inside the caller function. - /// - private DetermineEntityLanguagesEvent GetLanguages(EntityUid speaker, LanguageSpeakerComponent? comp = null) - { - // This is a shortcut for ghosts and entities that should not speak normally (admemes) - if (HasComp(speaker) || !TryComp(speaker, out comp)) - return _universalLanguagesEvent; - - var ev = _determineLanguagesEvent; - ev.SpokenLanguages.Clear(); - ev.UnderstoodLanguages.Clear(); - - ev.CurrentLanguage = comp.CurrentLanguage; - ev.SpokenLanguages.AddRange(comp.SpokenLanguages); - ev.UnderstoodLanguages.AddRange(comp.UnderstoodLanguages); - - RaiseLocalEvent(speaker, ev, true); - - if (ev.CurrentLanguage.Length == 0) - ev.CurrentLanguage = !string.IsNullOrEmpty(comp.CurrentLanguage) ? comp.CurrentLanguage : UniversalPrototype; // Fall back to account for admemes like admins possessing a bread - return ev; - } - - /// - /// Generates a stable pseudo-random number in the range (min, max) for the given seed. - /// Each input seed corresponds to exactly one random number. - /// - private int PseudoRandomNumber(int seed, int min, int max) - { - // This is not a uniform distribution, but it shouldn't matter given there's 2^31 possible random numbers, - // the bias of this function should be so tiny it will never be noticed. - seed += RandomRoundSeed; - var random = ((seed * 1103515245) + 12345) & 0x7fffffff; // Source: http://cs.uccs.edu/~cs591/bufferOverflow/glibc-2.2.4/stdlib/random_r.c - return random % (max - min) + min; - } - - /// - /// Set CurrentLanguage of the client, the client must be able to Understand the language requested. - /// - private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEventArgs args) - { - if (args.SenderSession.AttachedEntity is not {Valid: true} speaker) - return; - - var language = GetLanguagePrototype(message.CurrentLanguage); - - if (language == null || !CanSpeak(speaker, language.ID)) - return; - - SetLanguage(speaker, language.ID); - } - #endregion -} diff --git a/Content.Server/Language/TranslatorImplanterSystem.cs b/Content.Server/Language/TranslatorImplanterSystem.cs deleted file mode 100644 index 1e0c13375e4..00000000000 --- a/Content.Server/Language/TranslatorImplanterSystem.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Linq; -using Content.Server.Administration.Logs; -using Content.Server.Popups; -using Content.Shared.Database; -using Content.Shared.Interaction; -using Content.Shared.Language; -using Content.Shared.Language.Components; -using Content.Shared.Language.Events; -using Content.Shared.Language.Systems; -using Content.Shared.Mobs.Components; -using Content.Shared.Language.Components.Translators; - -namespace Content.Server.Language; - -public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem -{ - [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly LanguageSystem _language = default!; - - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnImplant); - } - - - private void OnImplant(EntityUid implanter, TranslatorImplanterComponent component, AfterInteractEvent args) - { - if (component.Used || !args.CanReach || args.Target is not { Valid: true } target) - return; - - if (!TryComp(target, out var speaker)) - return; - - if (component.MobsOnly && !HasComp(target)) - { - _popup.PopupEntity("translator-implanter-refuse", component.Owner); - return; - } - - var understood = _language.GetAllLanguages(target).understood; - if (component.RequiredLanguages.Count > 0 && !component.RequiredLanguages.Any(lang => understood.Contains(lang))) - { - _popup.PopupEntity(Loc.GetString("translator-implanter-refuse", - ("implanter", implanter), ("target", target)), implanter); - return; - } - - var intrinsic = EnsureComp(target); - intrinsic.Enabled = true; - - foreach (var lang in component.SpokenLanguages.Where(lang => !intrinsic.SpokenLanguages.Contains(lang))) - intrinsic.SpokenLanguages.Add(lang); - - foreach (var lang in component.UnderstoodLanguages.Where(lang => !intrinsic.UnderstoodLanguages.Contains(lang))) - intrinsic.UnderstoodLanguages.Add(lang); - - component.Used = true; - _popup.PopupEntity(Loc.GetString("translator-implanter-success", - ("implanter", implanter), ("target", target)), implanter); - - _adminLogger.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(args.User):player} used {ToPrettyString(implanter):implanter} to give {ToPrettyString(target):target} the following languages:" - + $"\nSpoken: {string.Join(", ", component.SpokenLanguages)}; Understood: {string.Join(", ", component.UnderstoodLanguages)}"); - - OnAppearanceChange(implanter, component); - RaiseLocalEvent(target, new LanguagesUpdateEvent(), true); - } -} diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs deleted file mode 100644 index 3b7704b9a71..00000000000 --- a/Content.Server/Language/TranslatorSystem.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System.Linq; -using Content.Server.Popups; -using Content.Server.PowerCell; -using Content.Shared.Interaction; -using Content.Shared.Interaction.Events; -using Content.Shared.Language; -using Content.Shared.Language.Events; -using Content.Shared.Language.Systems; -using Content.Shared.PowerCell; -using Content.Shared.Language.Components.Translators; - -namespace Content.Server.Language; - -// This does not support holding multiple translators at once. -// That shouldn't be an issue for now, but it needs to be fixed later. -public sealed class TranslatorSystem : SharedTranslatorSystem -{ - [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly LanguageSystem _language = default!; - [Dependency] private readonly PowerCellSystem _powerCell = default!; - - public override void Initialize() - { - base.Initialize(); - - // I wanna die. But my death won't help us discover polymorphism. - SubscribeLocalEvent(OnDetermineLanguages); - SubscribeLocalEvent(OnDetermineLanguages); - SubscribeLocalEvent(OnDetermineLanguages); - - SubscribeLocalEvent(OnTranslatorToggle); - SubscribeLocalEvent(OnPowerCellSlotEmpty); - - // TODO: why does this use InteractHandEvent?? - SubscribeLocalEvent(OnTranslatorInteract); - SubscribeLocalEvent(OnTranslatorDropped); - } - - private void OnDetermineLanguages(EntityUid uid, IntrinsicTranslatorComponent component, - DetermineEntityLanguagesEvent ev) - { - if (!component.Enabled) - return; - - if (!_powerCell.HasActivatableCharge(uid)) - return; - - var addUnderstood = true; - var addSpoken = true; - if (component.RequiredLanguages.Count > 0) - { - if (component.RequiresAllLanguages) - { - // Add langs when the wielder has all of the required languages - foreach (var language in component.RequiredLanguages) - { - if (!ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) - addSpoken = false; - - if (!ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) - addUnderstood = false; - } - } - else - { - // Add langs when the wielder has at least one of the required languages - addUnderstood = false; - addSpoken = false; - foreach (var language in component.RequiredLanguages) - { - if (ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) - addSpoken = true; - - if (ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) - addUnderstood = true; - } - } - } - - if (addSpoken) - { - foreach (var language in component.SpokenLanguages) - AddIfNotExists(ev.SpokenLanguages, language); - - if (component.DefaultLanguageOverride != null && ev.CurrentLanguage.Length == 0) - ev.CurrentLanguage = component.DefaultLanguageOverride; - } - - if (addUnderstood) - foreach (var language in component.UnderstoodLanguages) - AddIfNotExists(ev.UnderstoodLanguages, language); - } - - private void OnTranslatorInteract( EntityUid translator, HandheldTranslatorComponent component, InteractHandEvent args) - { - var holder = args.User; - if (!EntityManager.HasComponent(holder)) - return; - - var intrinsic = EnsureComp(holder); - UpdateBoundIntrinsicComp(component, intrinsic, component.Enabled); - - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); - } - - private void OnTranslatorDropped(EntityUid translator, HandheldTranslatorComponent component, DroppedEvent args) - { - var holder = args.User; - if (!EntityManager.TryGetComponent(holder, out var intrinsic)) - return; - - if (intrinsic.Issuer == component) - { - intrinsic.Enabled = false; - RemCompDeferred(holder, intrinsic); - } - - _language.EnsureValidLanguage(holder); - - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); - } - - private void OnTranslatorToggle(EntityUid translator, HandheldTranslatorComponent component, ActivateInWorldEvent args) - { - if (!component.ToggleOnInteract) - return; - - var hasPower = _powerCell.HasDrawCharge(translator); - - if (Transform(args.Target).ParentUid is { Valid: true } holder - && EntityManager.HasComponent(holder)) - { - // This translator is held by a language speaker and thus has an intrinsic counterpart bound to it. - // Make sure it's up-to-date. - var intrinsic = EnsureComp(holder); - var isEnabled = !component.Enabled; - if (intrinsic.Issuer != component) - { - // The intrinsic comp wasn't owned by this handheld component, so this comp wasn't the active translator. - // Thus it needs to be turned on regardless of its previous state. - intrinsic.Issuer = component; - isEnabled = true; - } - - isEnabled &= hasPower; - UpdateBoundIntrinsicComp(component, intrinsic, isEnabled); - component.Enabled = isEnabled; - _powerCell.SetPowerCellDrawEnabled(translator, isEnabled); - - _language.EnsureValidLanguage(holder); - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); - } - else - { - // This is a standalone translator (e.g. lying on the ground), toggle its state. - component.Enabled = !component.Enabled && hasPower; - _powerCell.SetPowerCellDrawEnabled(translator, !component.Enabled && hasPower); - } - - OnAppearanceChange(translator, component); - - // HasPower shows a popup when there's no power, so we do not proceed in that case - if (hasPower) - { - var message = Loc.GetString( - component.Enabled - ? "translator-component-turnon" - : "translator-component-shutoff", - ("translator", component.Owner)); - _popup.PopupEntity(message, component.Owner, args.User); - } - } - - private void OnPowerCellSlotEmpty(EntityUid translator, HandheldTranslatorComponent component, PowerCellSlotEmptyEvent args) - { - component.Enabled = false; - _powerCell.SetPowerCellDrawEnabled(translator, false); - OnAppearanceChange(translator, component); - - if (Transform(translator).ParentUid is { Valid: true } holder - && EntityManager.HasComponent(holder)) - { - if (!EntityManager.TryGetComponent(holder, out var intrinsic)) - return; - - if (intrinsic.Issuer == component) - { - intrinsic.Enabled = false; - EntityManager.RemoveComponent(holder, intrinsic); - } - - _language.EnsureValidLanguage(holder); - RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); - } - } - - /// - /// Copies the state from the handheld to the intrinsic component - /// - private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTranslatorComponent intrinsic, bool isEnabled) - { - if (isEnabled) - { - intrinsic.SpokenLanguages = new List(comp.SpokenLanguages); - intrinsic.UnderstoodLanguages = new List(comp.UnderstoodLanguages); - intrinsic.DefaultLanguageOverride = comp.DefaultLanguageOverride; - } - else - { - intrinsic.SpokenLanguages.Clear(); - intrinsic.UnderstoodLanguages.Clear(); - intrinsic.DefaultLanguageOverride = null; - } - - intrinsic.Enabled = isEnabled; - intrinsic.Issuer = comp; - } - - private static void AddIfNotExists(List list, string item) - { - if (list.Contains(item)) - return; - list.Add(item); - } -} diff --git a/Content.Server/Mind/Commands/MakeSentientCommand.cs b/Content.Server/Mind/Commands/MakeSentientCommand.cs index cacd499ab8d..5e19d135b6f 100644 --- a/Content.Server/Mind/Commands/MakeSentientCommand.cs +++ b/Content.Server/Mind/Commands/MakeSentientCommand.cs @@ -1,10 +1,7 @@ using Content.Server.Administration; -using Content.Server.Language; using Content.Shared.Administration; using Content.Shared.Emoting; using Content.Shared.Examine; -using Content.Shared.Language; -using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Content.Shared.Movement.Components; using Content.Shared.Speech; @@ -58,13 +55,6 @@ public static void MakeSentient(EntityUid uid, IEntityManager entityManager, boo { entityManager.EnsureComponent(uid); entityManager.EnsureComponent(uid); - - var language = IoCManager.Resolve().GetEntitySystem(); - var speaker = entityManager.EnsureComponent(uid); - // If the speaker knows any language (like monkey or robot), they keep those - // Otherwise, we give them the fallback - if (speaker.SpokenLanguages.Count == 0) - language.AddLanguage(speaker, SharedLanguageSystem.FallbackLanguagePrototype); } entityManager.EnsureComponent(uid); diff --git a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs index 53517da6cb4..d18b044205c 100644 --- a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs +++ b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs @@ -1,9 +1,6 @@ using Content.Server.Chat.Systems; using Content.Server.Emp; -using Content.Server.Language; using Content.Server.Radio.Components; -using Content.Server.Speech; -using Content.Shared.Chat; using Content.Shared.Inventory.Events; using Content.Shared.Radio; using Content.Shared.Radio.Components; @@ -17,7 +14,6 @@ public sealed class HeadsetSystem : SharedHeadsetSystem { [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly RadioSystem _radio = default!; - [Dependency] private readonly LanguageSystem _language = default!; public override void Initialize() { @@ -103,16 +99,8 @@ public void SetEnabled(EntityUid uid, bool value, HeadsetComponent? component = private void OnHeadsetReceive(EntityUid uid, HeadsetComponent component, ref RadioReceiveEvent args) { - var parent = Transform(uid).ParentUid; - if (TryComp(parent, out ActorComponent? actor)) - { - var canUnderstand = _language.CanUnderstand(parent, args.Language); - var msg = new MsgChatMessage - { - Message = canUnderstand ? args.OriginalChatMsg : args.LanguageObfuscatedChatMsg - }; - _netMan.ServerSendMessage(msg, actor.PlayerSession.Channel); - } + if (TryComp(Transform(uid).ParentUid, out ActorComponent? actor)) + _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); } private void OnEmpPulse(EntityUid uid, HeadsetComponent component, ref EmpPulseEvent args) diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index fc3f69a3ba2..ace7d8ae31a 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -1,6 +1,5 @@ using Content.Server.Chat.Systems; using Content.Server.Interaction; -using Content.Server.Language; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; @@ -30,7 +29,6 @@ public sealed class RadioDeviceSystem : EntitySystem [Dependency] private readonly InteractionSystem _interaction = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; - [Dependency] private readonly LanguageSystem _language = default!; // Used to prevent a shitter from using a bunch of radios to spam chat. private HashSet<(string, EntityUid)> _recentlySent = new(); @@ -210,8 +208,7 @@ private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref ("originalName", nameEv.Name)); // log to chat so people can identity the speaker/source, but avoid clogging ghost chat if there are many radios - var message = args.OriginalChatMsg.Message; // The chat system will handle the rest and re-obfuscate if needed. - _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false, languageOverride: args.Language); + _chat.TrySendInGameICMessage(uid, args.Message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false); } private void OnBeforeIntercomUiOpen(EntityUid uid, IntercomComponent component, BeforeActivatableUIOpenEvent args) diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 60aa7c2f4fb..e2a61b5022b 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -1,13 +1,10 @@ using Content.Server.Administration.Logs; using Content.Server.Chat.Systems; -using Content.Server.Language; using Content.Server.Power.Components; using Content.Server.Radio.Components; -using Content.Server.Speech; using Content.Server.VoiceMask; using Content.Shared.Chat; using Content.Shared.Database; -using Content.Shared.Language; using Content.Shared.Radio; using Content.Shared.Radio.Components; using Content.Shared.Speech; @@ -32,7 +29,6 @@ public sealed class RadioSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ChatSystem _chat = default!; - [Dependency] private readonly LanguageSystem _language = default!; // set used to prevent radio feedback loops. private readonly HashSet _messages = new(); @@ -48,7 +44,7 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent { if (args.Channel != null && component.Channels.Contains(args.Channel.ID)) { - SendRadioMessage(uid, args.Message, args.Channel, uid, args.Language); + SendRadioMessage(uid, args.Message, args.Channel, uid); args.Channel = null; // prevent duplicate messages from other listeners. } } @@ -56,23 +52,15 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent private void OnIntrinsicReceive(EntityUid uid, IntrinsicRadioReceiverComponent component, ref RadioReceiveEvent args) { if (TryComp(uid, out ActorComponent? actor)) - { - // Einstein-Engines - languages mechanic - var listener = component.Owner; - var msg = args.OriginalChatMsg; - if (listener != null && !_language.CanUnderstand(listener, args.Language)) - msg = args.LanguageObfuscatedChatMsg; - - _netMan.ServerSendMessage(new MsgChatMessage { Message = msg}, actor.PlayerSession.Channel); - } + _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); } /// /// Send radio message to all active radio listeners /// - public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, bool escapeMarkup = true) { - SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup, language: language); + SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup); } /// private int GetCargoSpace(EntityUid gridUid) { - var space = GetCargoPallets(gridUid).Count; + var space = GetCargoPallets(gridUid, BuySellType.Buy).Count; return space; } - private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid) + /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads + /// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy pads + private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid, BuySellType requestType = BuySellType.All) { _pads.Clear(); + var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var comp, out var compXform)) @@ -215,7 +218,13 @@ private int GetCargoSpace(EntityUid gridUid) continue; } + if ((requestType & comp.PalletType) == 0) + { + continue; + } + _pads.Add((uid, comp, compXform)); + } return _pads; @@ -275,7 +284,7 @@ private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, ou amount = 0; toSell = new HashSet(); - foreach (var (palletUid, _, _) in GetCargoPallets(gridUid)) + foreach (var (palletUid, _, _) in GetCargoPallets(gridUid, BuySellType.Sell)) { // Containers should already get the sell price of their children so can skip those. _setEnts.Clear(); diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index a10f070bd25..f040d58253d 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -3,20 +3,20 @@ meta: postmapinit: false tilemap: 0: Space - 29: FloorDark - 34: FloorDarkMono - 37: FloorDarkPavementVertical - 49: FloorGrassJungle - 64: FloorMetalDiamond - 77: FloorReinforced - 89: FloorSteel - 100: FloorSteelMono - 104: FloorTechMaint - 105: FloorTechMaint2 - 118: FloorWood - 119: FloorWoodTile - 120: Lattice - 121: Plating + 31: FloorDark + 36: FloorDarkMono + 39: FloorDarkPavementVertical + 51: FloorGrassJungle + 66: FloorMetalDiamond + 79: FloorReinforced + 93: FloorSteel + 104: FloorSteelMono + 108: FloorTechMaint + 109: FloorTechMaint2 + 122: FloorWood + 124: FloorWoodTile + 125: Lattice + 126: Plating entities: - proto: "" entities: @@ -31,27 +31,27 @@ entities: chunks: 0,0: ind: 0,0 - tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: XQAAAAABXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAAAXQAAAAADXQAAAAAAXQAAAAABXQAAAAADXQAAAAAAJAAAAAABJwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAJAAAAAAAJAAAAAABJAAAAAAAJAAAAAAAJAAAAAACJAAAAAABJAAAAAAAJAAAAAAAJAAAAAABJAAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAfAAAAAABfAAAAAADfAAAAAACMwAAAAAAMwAAAAAAMwAAAAAAfAAAAAADfAAAAAABfAAAAAABegAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAADfAAAAAABfAAAAAADfAAAAAADegAAAAADegAAAAACegAAAAADfAAAAAAAfAAAAAABfAAAAAAAegAAAAACJAAAAAADJwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAegAAAAABegAAAAACegAAAAABegAAAAAAegAAAAACegAAAAAAegAAAAAAegAAAAABegAAAAADegAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: fgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAJAAAAAAAfgAAAAAAfgAAAAAAJAAAAAABJAAAAAABHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAABJAAAAAACJAAAAAAAJAAAAAAAJAAAAAABJAAAAAABJAAAAAACJAAAAAAAJAAAAAACfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAAAXQAAAAACXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAACXQAAAAABXQAAAAABfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAADXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAACaAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAABbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAAAaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAADXQAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAABaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAADTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAACTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADaAAAAAADfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAACJAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAADJAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAA version: 6 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAIgAAAAABIgAAAAACHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAHQAAAAABHQAAAAACHQAAAAABIgAAAAADIgAAAAADHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAJAAAAAABJAAAAAACHwAAAAACHwAAAAADHwAAAAABHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAHwAAAAABHwAAAAACHwAAAAABJAAAAAADJAAAAAADHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-2: ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAA version: 6 - type: Broadphase - type: Physics @@ -1889,276 +1889,303 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-17.5 parent: 2 -- proto: CargoPallet +- proto: CargoPalletBuy entities: - - uid: 20 - components: - - type: Transform - pos: 7.5,0.5 - parent: 2 - uid: 21 components: - type: Transform - pos: 8.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-9.5 parent: 2 - uid: 24 components: - type: Transform - pos: 8.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-9.5 parent: 2 - uid: 25 components: - type: Transform - pos: 7.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-8.5 parent: 2 - uid: 26 components: - type: Transform - pos: 7.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-8.5 parent: 2 - uid: 27 components: - type: Transform - pos: 8.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-7.5 parent: 2 - uid: 30 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,0.5 - parent: 2 - - uid: 32 - components: - - type: Transform pos: 2.5,-7.5 parent: 2 - - uid: 34 + - uid: 32 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-7.5 + pos: 4.5,-9.5 parent: 2 - uid: 35 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,-0.5 parent: 2 - uid: 36 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-1.5 + rot: 1.5707963267948966 rad + pos: 6.5,-0.5 parent: 2 - uid: 37 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-9.5 + pos: 4.5,-7.5 parent: 2 - uid: 39 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-2.5 parent: 2 - uid: 41 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 7.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-1.5 parent: 2 - uid: 42 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-8.5 + rot: 1.5707963267948966 rad + pos: 7.5,-1.5 parent: 2 - uid: 43 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-9.5 + rot: 1.5707963267948966 rad + pos: 8.5,-2.5 parent: 2 - uid: 44 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-1.5 parent: 2 - - uid: 45 + - uid: 47 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-8.5 + rot: 1.5707963267948966 rad + pos: 8.5,0.5 parent: 2 - - uid: 46 + - uid: 49 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-6.5 + rot: 1.5707963267948966 rad + pos: 8.5,-0.5 parent: 2 - - uid: 47 + - uid: 50 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-9.5 + rot: 1.5707963267948966 rad + pos: 7.5,-2.5 parent: 2 - - uid: 48 + - uid: 56 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-7.5 + pos: 4.5,-6.5 parent: 2 - - uid: 49 + - uid: 61 components: - type: Transform - pos: 7.5,-9.5 + rot: -1.5707963267948966 rad + pos: 4.5,-8.5 parent: 2 - - uid: 50 + - uid: 67 components: - type: Transform - pos: 3.5,-7.5 + rot: -1.5707963267948966 rad + pos: 3.5,-6.5 parent: 2 - - uid: 51 + - uid: 71 components: - type: Transform - pos: 3.5,-9.5 + rot: -1.5707963267948966 rad + pos: 2.5,-6.5 parent: 2 - - uid: 52 + - uid: 183 components: - type: Transform - pos: 3.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,0.5 parent: 2 - - uid: 54 + - uid: 900 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,0.5 parent: 2 - - uid: 55 +- proto: CargoPalletSell + entities: + - uid: 34 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-2.5 + pos: 4.5,-0.5 parent: 2 - - uid: 56 + - uid: 45 components: - type: Transform - pos: 3.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-7.5 parent: 2 - - uid: 57 + - uid: 46 components: - type: Transform - pos: 2.5,-8.5 + rot: -1.5707963267948966 rad + pos: 4.5,-2.5 parent: 2 - - uid: 58 + - uid: 48 components: - type: Transform - pos: 3.5,-0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-2.5 parent: 2 - - uid: 59 + - uid: 51 components: - type: Transform - pos: 3.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-1.5 parent: 2 - - uid: 60 + - uid: 52 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-0.5 + pos: 2.5,-2.5 parent: 2 - - uid: 61 + - uid: 54 components: - type: Transform - pos: 2.5,-9.5 + rot: 1.5707963267948966 rad + pos: 6.5,-9.5 parent: 2 - - uid: 66 + - uid: 55 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-2.5 + pos: 2.5,-1.5 parent: 2 - - uid: 67 + - uid: 57 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,-9.5 + parent: 2 + - uid: 58 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-2.5 + pos: 4.5,0.5 parent: 2 - - uid: 68 + - uid: 59 components: - type: Transform - pos: 2.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-6.5 parent: 2 - - uid: 69 + - uid: 60 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-2.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - - uid: 70 + - uid: 66 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-2.5 + pos: 3.5,0.5 parent: 2 - - uid: 71 + - uid: 68 components: - type: Transform - pos: 2.5,-0.5 + rot: 1.5707963267948966 rad + pos: 7.5,-8.5 parent: 2 - - uid: 72 + - uid: 69 components: - type: Transform - pos: 2.5,0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-8.5 parent: 2 - - uid: 73 + - uid: 70 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-9.5 parent: 2 - - uid: 183 + - uid: 72 components: - type: Transform - rot: -1.5707963267948966 rad + rot: 1.5707963267948966 rad pos: 7.5,-6.5 parent: 2 - - uid: 900 + - uid: 73 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-6.5 + rot: 1.5707963267948966 rad + pos: 6.5,-6.5 parent: 2 - uid: 901 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-6.5 + pos: 2.5,-0.5 parent: 2 - uid: 903 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,0.5 + pos: 3.5,-0.5 parent: 2 - uid: 907 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - uid: 908 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-2.5 + pos: 4.5,-1.5 parent: 2 - uid: 909 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-8.5 + parent: 2 + - uid: 960 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-7.5 + parent: 2 + - uid: 961 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-1.5 + pos: 2.5,0.5 parent: 2 - proto: CarpetBlack entities: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index 925e036e09e..c628d199a90 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -21,6 +21,7 @@ mask: - MachineMask - type: CargoPallet + palletType: All - type: StaticPrice price: 100 - type: Sprite @@ -53,3 +54,33 @@ - type: GuideHelp guides: - Cargo + +- type: entity + id: CargoPalletSell + name: cargo selling pallet + description: Designates valid items to sell with a selling computer, or to CentCom when a shuttle is recalled. + parent: CargoPallet + components: + - type: CargoPallet + palletType: sell + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_sell + + +- type: entity + id: CargoPalletBuy + name: cargo buying pallet + description: Designates where orders will appear when purchased. + parent: CargoPallet + components: + - type: CargoPallet + palletType: buy + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_buy + diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png new file mode 100644 index 0000000000000000000000000000000000000000..024678fc209363462f2b44b707900f56c749dc56 GIT binary patch literal 551 zcmV+?0@(eDP)Px$;Ymb6R9J=WSHEk*Kp1_7xCN|8$yAPl!~GpuL`rsNagYuY2t}NVlS2_CgLIJM z{~-P^5d;UPLnMkW0jV9##r(8Y(<;JIv$xX^ff)P)a}fJf#!> zKE1Wa`bIr6|gFG#WvYB*?N1#uzB2yC!0EK`Di4nvuDvyrGNkT6~Z7 zdJRIzj)H(%1pxd50f69~&K(D8zs+}tdEeTh%`S}YTH9SQ;tbvEbU*lh%X}*Q z5AYZ_AK1sh%?JLK4>)(YM0~(|$2_QkUSk7QGd*`W)4SNon&^VU(8s8?O$<6YsM-M^ z;I~%?iTOaSy@8>J-x{Hr$A=8wsxwqtGT{6|%d)t7Pab<8J+TdVUo1&O)uQL!27Px$(Md!>R9J=Wm$7c*KoEvMTUa{DM#2>?9JcivTyI4J9w4>5Ywj7Y;u+GUbDcIt zULkK_+B*tw#Y$jBRw8_b*_>^1;2b82bo|w<|Iy4W|L7NMOsCT#&vQNkmSxe)^Bi?) z03ffETEg&qP&;?c3n4JVFf7!iK^8CGeuX1oM?PQf9_i`H9LK?qe4P8IlQv#YtlDMG zD(T!mv7T7Cu8Z-_KuT#!DNWaPky8Hid0UJ1#M-%FuQ}nxgTt?{Yx+PC1RMQ52m*jj zHMcFVP}q^r#e>6=<^BQGm7>3mlO$=<)n=`E50C!n88uRHQ|8F)1R+EzL3LZxS!xb$ z2c)wUN{LKeP@gNkTJgGGI!kMk(@6dh>`0(>J4W+;{Bn6<2VT?lt(x!Shr=PTmHqCq zl%U~IM{9n7ui^9Vz$-CyuoJCzpi9l0&^z!~AE0~9n|uwQcL&ZspkvNH@F#||5BwKC z;QjD63WbNq;C9f752&lM9>5raYG(2`EJUmuEdt~wAun*{euUmBH z16jPlj{KeBj4%v~`F#HF50l! Date: Sun, 16 Jun 2024 15:06:45 -0700 Subject: [PATCH 45/79] Update Credits (#437) This is an automated Pull Request. This PR updates the GitHub contributors in the credits section. Co-authored-by: SimpleStation Changelogs Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 8c54ecb084d..03d5059e95b 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From 32328cb1ffc7e045c7e8aa30422c6760f646d137 Mon Sep 17 00:00:00 2001 From: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> Date: Sun, 16 Jun 2024 18:14:33 -0400 Subject: [PATCH 46/79] Corpo Jacket Fixes (#462) # Description Adds hand-holes for corpo jackets pending the game being any good. Renames corpo jacket sprites for clarity and organization. ---

Media

See the bot :)

--- .../Clothing/OuterClothing/wintercoats.yml | 40 +++++++++--------- .../equipped-OUTERCLOTHING.png | Bin 9460 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 10509 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9875 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10492 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9782 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10959 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9936 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10546 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9675 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10494 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 10740 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 8727 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9455 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 8689 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9750 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 8865 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 8433 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9422 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9418 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9578 -> 0 bytes 41 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{bc_corpo_jacket.rsi => corpo_jacket_bishop_cybernetics.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{bc_corpo_jacket.rsi => corpo_jacket_bishop_cybernetics.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{cs_corpo_jacket.rsi => corpo_jacket_cybersun.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{cs_corpo_jacket.rsi => corpo_jacket_cybersun.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{dd_corpo_jacket.rsi => corpo_jacket_discount_dans.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{dd_corpo_jacket.rsi => corpo_jacket_discount_dans.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ee_corpo_jacket.rsi => corpo_jacket_einstein_engines.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ee_corpo_jacket.rsi => corpo_jacket_einstein_engines.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{fa_corpo_jacket.rsi => corpo_jacket_five_points_armory.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{fa_corpo_jacket.rsi => corpo_jacket_five_points_armory.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ge_corpo_jacket.rsi => corpo_jacket_gilthari_exports.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{ge_corpo_jacket.rsi => corpo_jacket_gilthari_exports.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hm_corpo_jacket.rsi => corpo_jacket_hawkmoon_aquisitions.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hi_corpo_jacket.rsi => corpo_jacket_hawkmoon_aquisitions.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hi_corpo_jacket.rsi => corpo_jacket_hephestus_industries.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{hm_corpo_jacket.rsi => corpo_jacket_hephestus_industries.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{id_corpo_jacket.rsi => corpo_jacket_interdyne.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{id_corpo_jacket.rsi => corpo_jacket_interdyne.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{zh_corpo_jacket.rsi => corpo_jacket_zeng_hu_pharma.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{zh_corpo_jacket.rsi => corpo_jacket_zeng_hu_pharma.rsi}/meta.json (100%) delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index f3610178b9e..aa4a7b50e65 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -549,9 +549,9 @@ description: A cozy jacket with the Cybersun logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: entity parent: ClothingOuterWinterCoat @@ -560,9 +560,9 @@ description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: entity parent: ClothingOuterWinterCoat @@ -571,9 +571,9 @@ description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: entity parent: ClothingOuterWinterCoat @@ -582,9 +582,9 @@ description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: entity parent: ClothingOuterWinterCoat @@ -593,9 +593,9 @@ description: A cozy jacket with the Interdyne logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi - type: entity parent: ClothingOuterWinterCoat @@ -604,9 +604,9 @@ description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi - type: entity parent: ClothingOuterWinterCoat @@ -615,9 +615,9 @@ description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi - type: entity parent: ClothingOuterWinterCoat @@ -626,9 +626,9 @@ description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi - type: entity parent: ClothingOuterWinterCoat @@ -637,9 +637,9 @@ description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi - type: entity parent: ClothingOuterWinterCoat @@ -648,6 +648,6 @@ description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 5eadcdc1c1ab3fbd2bf67c5055286b407e2e4a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9460 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..35003686d555624fcac17b387f726605cd147bd7 GIT binary patch literal 10509 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..fe470b0074272a504eac30798883e5e2c6c5e027 GIT binary patch literal 9875 zcmeHNd0bQ1mwzm>RRt9kMF~YM2nI+9ghU{+DL5jFY@$Fz76?lMBK0L_|SAAgsxoo1lRGIZJ2eH#2`U;U@RpckVgo`@QF!n|D7P zb=IjkAuG2r~YZs*Zw3UnuC&%gcgDCRM60%uMEDkL8Bd+ zu~h;3e}E<@eot?Jpxxl=^Y>Oedq)kl9?C$^&;-mkKx6O*#(0#G2HF5`gvFx`fPIPd zIgh|pNFEYGGrC1Se#Rtn^fM+=|1%~_(3kq;uZS6$d3}|6I3y%zblQsMe(JN8L-kNIv_RA|QU!l5k z)%x$Wv^VHrjEu1+IJ}j$&6cgUcH4HkxVpJ}?D8a$DO5jyS^$$39uXN89dqE|p~FXh zJeqJS`Sh8yDL{2MSVkKQ*%q_ ztFG7GZ+hPLz8m^DJTl538=sgI;S%Be{F*`bCtOPaE=g%=DQQ^|E(ys<5%49_3%*6k zEVXcwC5A53ME@YCY%>DudXyA);GtEvOw8s^IUV`H}L%1hx=O-o6{9N2I~&9J6BJ+Px`f(3erA4 zrncW1!@b|LrYpFao6Aa3-!#P;LXL`&3QmNjFbA4HcC8%nAYO9TbIvL);3Z~RIvw;6 z%ID>l9ffC|Qq3bghM|O5 zdK(Nq{t!>-y$Jb6VTC^Imxw8&Q1kBw>!#PHQDA8M)YdePa92=kv3ieLpu>(K1mEF; z@YtJ)+rXU*p~t5Xp2sR%@~79aDT2D@=@T$i#fj*PUC7Ea-mFk`q-Y}gzaK2R21YBHL4 zs*B5x6t1t}eB{AUL7pdnPhVFf=h=-1mRI&Sx~K_m;nzNPF8ai9Z^yW%mS>dbPM*&1BXsJ0grR7@!*4y~akZ@lBh|*jqMo4E(5lGB zRSwhZrr2ygqp)Wj`=NdOcs#G6Y?9hqoY0V(nx0yW3q9Snqwt_H4DE~TSOh~Uym47! z?H-4tWri>$*VD{?ZvM1q0MNSIxSxBc&a?i;kSw2YPI#;*dXDS^UnhI7i0pBn2{kd- z*nynZz4;%SUi)Vxyfv9k_gnoK7}8}AFjLuzFyvjJYY}dCNAQIG(nk=GNzaIU>vgBN znwQpCM0l`Dkd!i^-g z^73~&!zRK3W{}~PZ2jQDQQ^s_FmzuYhMe@Le}JK8H{kI&g`wrlixnO9CsbdZZoJw0I>LATJ{GTFyd=&i zi!D@gm^{jUttfnyetS@>9fppk~^)Mbo__cqewT|4`2uZrnrX%aE}lC zksAq$LYjGhbALka&bB@Aml+R>>9KFpvmz=Efn2r~Gy8wXs(ZK!?@U@UZY+;94?3Z9 z9VlK7(??;bAKAoqel znAerQZZBOk6OXtSzJXWZDraqBh5WaGHK)1Wvkk`A5-O3&T zNsD&b4!?L_g+@{p?MVkB`Sb&+OlG+_U&hTALrCABbK{aT^Yu zI!+RBghd4ZTw<)*_7?4o8^&L33ZhM-V~{sp&b~{?{r&}iHZ-oTpl;C3S<|lqwgrC} zdagem3q!eE=d5#zws=4Oy+0cl>#ioa42ls|7#BamePi<6w zxaMS|4E^2aIB+dhL)?l^D{C%9JV@;!bh_%yivaKM0fS9xBSSEh$R2$=Z_{-bC$Qsh z!Ca%bYsV(er8E#oqT0;a%RZu7O{mUxw@|Kdi+U3OUT2cqx7TL?J5V>+rOF+Danm_| zrE`LImg?75;m_XKoJeXlt?LMCPU?KZOdHJIMHvpQMh&?9bm46R=c|snsbKxiU+ClX z3(xGic46Y@#y>meGPVNY-}*7Q^_PijI*610+8GI(m7Q#$&rRjU_$F&%^AuxpYjSsx za8dJFB1;dwOcHmJLvi%(s<$T*S*693%0qMj1| z2|+TS&6}v854>zWPHLNMD4za~GYYDH4Nq`_+0s!c$bZegJmKv&&;<%XQ;fU0nxgk< zK{ut5^pxv6_;W(U@%;6-lHQPY>2)d_ohNp6;l{EDZ}qpi6m^{IDpW|&zW(SRatGuO zUVeriC&OT_^1D%ct1d=bH~39pR!nDikC~^9Jh{2<)yNvPsonhu&d0J`&b?Ax-R+Tl z%Y5`xqqM#xf&fuF9078sjbzSkC_#+dv)_S&e3CP@>Sbl;`}(w!ypo_;)z#k16n8v3 zb7k!5bfSATUW<=y;yg1Qz_JH}tBt49JiBwUht3uW3i$dXY^_Jbgro>&F#xISrL@yY z@TTXY*Ryc7%Y!4l(P04MdJR|r=yTI$?kM^g$4kR;8M(xU59bLtO?eZ3h3XSe*!T0) zk}>CBlood6(pDk(#TSJqyQ6or4@5B2LVN9nPhjX*&N!$|-Zw|wgxulr;j(s4U)RdX z$>+KKdl27s6IJBucjP}9?tg8M*k@V>LzQ(nFb5$xLzvsuZo<&K0)Ba3VSo9$8iw4= z_KK@;OoDb^Va?Z;z--f;vU6JdOn+xr)~U{z31r{5gP|R16U#*9YhI~;`0#}Add&2M z&*<-Ao)t#~$**DPO7v{>)O-ChTAYjJb5C-UyXi0#h~qwgR!Au1^yUjU!BAt~q-!8UzV|RPE9W+k#a$>SRcxqgPT2O28?rcHGjmTQzgS=Z3O)=?zF-Hk zpDRwY0g~N1KR#|Q{4IOT-G|x?_VQoG^W3L)3x8&J!H^&zFd(*IDwTbgGx-94O~w38 zyt0#r+U&kF?^pSn?%c+f$mt6aT@?XUp@CWbbsxY3fF!8iJ2|uaT5i3IZ!dq-(om=5 zgx7P!m*?!Qu~x55F$Fy9aRv#!07@0N#TaPqsR&T0-qF{f^XQ(9vh!DK&)4eFKXFU~ zZiX_=O0} zSH}l*_-@|3?ib2o+A@Zc1EWQzC;pYT?n9j++|X^i73=oCE_pSi)|2sAvhMi#b0emq zr#&`C+<12HIys)go7N3)zaUZD{>yATnArFWFW&fKdh*r$W3$wN#l?u`so`A)0siml|^y`iZ|P8wz3 zVBRMV$M>1kF4GuaxTiOmT_o{)+$nEHV8PmSw%YC6^uR~zA$Oz}nyvh8L#gvmzdC9| z1AZg+xbFv-zx5i93GDA0k*INW&r*B&Qb|?UnO{;@8jFve8rz=3LAc<<&J)Iq??aHH zG0nw;JjK_i=Kx*ORW z*oRnA{Aso^VU(RQJ6uRHfg~JRlVGl38ifZ6f+;MbMpSSRor#Y!(-iB)gT823UsFRY z!U{Cg^Z>_aR*W!;21XB~XMnVcqD7!J%@s6E!^l*;v-OrwD!`SQray}ng4frNjEvNa zG}L2+`RSu@IGnx#S|5!@0tqBDn$99dA?eJuA{8?_tSL-V7%hZFW6(83I*GoFaF&^- zCb+Nh*}vcrd;3}Sbmk`(03Z5M#1MUyo`HUFu>SlROqNXqQ1Z#4ug+k)M2ArHoheL4 zco>Od6G5S~*3MT!Ce6+d2@eYr!y%LODM6HAAj$+*QD2x89W>6)5K-Vq3l0&_0%U(7 z$)Zu`$oj%J(H$|I`Hq0;vwFXf{)}BL45aMs@zxAdxX3*_YcoxeeLR^#qLK09E`?0O z;4l;nl1juGATcInA`)kaqav|55(;IEB4J2G>O56;bS8^PCs9PIfO0(=&_gyRQw@y` zeUVfY&Jc;AQi(_t5($koB$*iCObp3JCPef+6%JuE5S7HB`Cf@sk%20VF_A(hV||fm zG{qQ+L1EEIBGm+q#F9xSIA0?pEY;Xptcpy+Z()Q56Tx!Qf{A_<{SdmJ_=bpZyoIBk znI>A#U~a@Qh{&RX31*txY4q@@xf?FDV9HJwQN$(+i!#CBa2Sk%u^|eLGnx}}ql7U* zB#Ly3kBr54M9YE)U;wd1QJew=;&FflZxu!%vKV153`UTd=Imkf>}`9HPGlmBXia2M zfYRCHXP3{%&qxDsAU)&0NS!@{Oru8sN7AC?(J%$_V99N1Okh7+JT#M0J1L*UT-FKauW70oCJExPBg|eI*n~21Y~@31@^fG9Y1) z7&OTjiSwlzBZ&rR6xPVZ0EH$~zSPcSP+5`0Fp7mA;1O^I!c%-Ouc7Tuqmvnt%ne`4 zNBUDl>i{SN93c%2#FU}&h9;W&|9p5j12PE*G6so8iIRm(AtQ-s6b4DbV9CB%9L3Pr z1ox%8{~dTnz>EtTjmMzy2DtwXcqUjALkg9GL;7M+WF&?}B>{M7W2A|%FUiQzfCy^B zOd`+5#=i|uoM!*d+8HBJMt=_XPb+AuFRJ*TZ=D{g2V5F!wM_ zp@ZMBk>F9+c`D2mJSfZf{>xTt2o}B5%daMb5&00?T}%klTPtc3QJI7YFeuBiv$v6b zE29MAlm(SF#o*sMV(qLgT%ua~&)fftnv?QjUR=|aUz3|WN^L#84sJFMxT0a{c}-j3 zal3b$f=!!>-Ccy^HuiqU&}KJF+5wJ6$c_@ft(roBQ(zL-wMiz`W~0)0TAB!smuNbv7Y| zMh^QuQ?NN_@749X4po4`niGlNMz8(WxZ(zc z-#F?!{MeXZcK57SdB)Ajd?S~U$^5C+-?O}2y%{6swI2swBtIHsPli%C_5p{67!pIR zL|WrbVtOrS^;%)SNw@0ayC23*_raWmJf7sHEKJku`|3xJ?Z)+KuHQse0Rw`#^>X_) zX8%@MH@3FMw7!fPdtG~fp;<|Xd_!!{)$1$#-MVU{WNC)0!YdplecJL@Z`|aVA6EIS zx)2#1nd5=E_0%l_a> zI5sZyu+NQ={?#Vy=?G-|5UfBv_MzJyiuSuD5ATTeZYUaM@2?AlXXJ3*ws q$bNn%k)V4l(;-1d%;b;oex7Iapi1rb=N!>Vmz~WH>paWv_x~$#Alt0~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..06932fff6fa7370f5410813dea7991e4cf15cae8 GIT binary patch literal 10492 zcmeHNc~}$4wr>{M+)zOow;<}EU?2$zBoTaIK%&6Cuab*U< zxTCTSA|e7t+)xoSin5A`2*H66*05yhR{?Qw-hA)fdGFr)-9M(2N>^8%I(2^MoT_uW zJNvh6UO!!Dz77OI)195{-N1Q`vS?|5-)pS!w-7WZjj_Wy(An7p(gJOOQbiq7QPO~- zGO4brq6Vpfw!NUt26ZKkvdmYRGIl-$>I**APk{Q0Pc+IgSQS-hIyk3;f&+CuaJ~i# zYv1@>cR>9YP_)KAvXv0z4X!56>z!S;7~;&Z7&8kZ7>~i>$rwvAmSBj(kO@{~3=Yh% za`rcgz)(mVQb6Opl`>9XQVKeONm-x3v<}qOKFO=pjK-w8{v;eKs^dJJlw&{D-DWE% zn2;T*L*7BU8yuY-!9+?0fghw1vV*iVG&D7)XlZI{YHMrhOw*e_ZR*r%U(KE~Q*Y6H z)Z#_+7cMkhW@cYAQyM>MRwtSt`f_2nFPvqB3@jLjl*SYU)!oG_|yKrUHUOU8Sbf zRMpj{Oi@<{y-A=SQlB+t_7dz`jX7JXnnvMzxZOw3X)RrsU#{==qGy>!K*YD&I&X zyYKJ&4;(vw;^e8+AAd?af8pY#%b8cMUb|j!qwr?Yt>WAF?mu|=sN(UHr!T8ty{@UP zt8Zv|-}<4gUD)yQ*WSMVfkDa8@W`kVmlEg1F^=qaxMl%ds_N=$>Y7SiDylI`;Iq`H zEWv8bUb|J38a~Gew_8hZ-O+RT<=RUv+_rNa`r&vEM{jt@TaWTWTuLl;jOGn^)E&(5ixT zVROU2<@#0VeFnw09>vd^cgRyJ~)+g+fUqf zJ(>vVZ&*UkNO5mlO9!^t(d)#v??)&L0s->QzoYb~1 z1Uj|zIae%le&WF0NWD^QyQ4b*4uGpG6eI+yy&#>VI78_bD9R$ey7$O;OW*+><$05A zL3Hb4VNJfQnNyQ%UEuSg?kC6aXoi26>u4+jRZvC;eq)j4$0_Rc-6u0d4bDNJ$0+&9 zO+p=bj)~qi*B0wL2MS_X5?`LJs9tm+XU(@?7}oS$4}T8=wJekRk232Of&#@(fIsF| zMbp(2Cp_x69z1@Xa3jN5YW`e~K&RV771M7$N)qI-hu3jTMLaWZ0blys?A+NAKmXCq zT;99Ugc|0aTm)(re^3bFp{%{Qh)he_kr4;Si?bWIU926LDH0SQ(8ZC(o5dr{5>myj zfjr!;BE^fw{*h$A1SZhOpl3ntyjBDn*#|ee%1_<6_c}(x3BbB<^LxRjcic9YEwhD3 z*VoGq^UL|sUD895c@AkDQ%+^N^i^SD)^MY(t860zl_3!N4zKIghKs?JEKW{a4f&_~$rq~Oah-bvw%{l`MHn2)mNYRHgkqGr>*R7d3}oC<7#^TfN6HC&WiKjj1^JhN*IB( z#0>}(B}t($dqWzFV)6xE@3YoM*%Zs4!|(j%K?`ZiS<^RcjX5HWxf08->O-Jk!Ve)( zrGKWBP!;Rg-^B}&zm+$xZZ&AyiN4xh(H)LJstDA%z3BT8MXf~eHl(rOCO6}?z$<-; zOWz{Bpv_V9R@$2ep@aUxjxir40G`RUy#BbRnmxFp}SM7=fyr6?TAC zE#ZBWl@x3!W&KuSul6xuln7|XYjpbzcgR7#@?G-_6Rf#~3k1S-c zYfuS**DSX|pbr#9ncFKo$`tfDKj+F&uJJ-k=G2y)ZBi?de{sKc74P98n(f=cH^8TY z5oikn$$$WLwW;23l6WysN}^Z4&q1JIxO%1x=q$&t;KBy4CqZ#0g-%%xCv!!%l?B44 z5}SOFYY7KaZiJ3liUf(T^e+?+SO87`Fy^w+cl7uO^nHv7zAatPD;T~R+E`L2%nA26 zd;82Ag^%$;{_P`h2k{ZymRBuLYcE|ICvm-*EKU|>^d4eo zpL#V!8zLgmZg?=u`<^8nEMY}UOzGUEWjn0zoJgD?}OCQ2^?DGIlj)YuBUZQvAu*~@>D zOM=3 zp?Tmw0-=CyJ+nJrp1SUJWwf7*FYHnJQo9%Zk1mE z_T%@86@{p6{#C=8wUmRjE{ z_<6yn^=tSm9)M+%BI6=Z-g=3#+!}7>$>Yl;{$R`A@amV+)$&3~%0Qm+lSYs%0WTR^ zeBwi^{xgZ*(v^31bVqpBP-tMsjN>Q6`wSjY9$oW{%Gt&5Nr^*!MD6Myf;Fm2!n?UO z#Zx;``6F;?GoNz*5DnGpmUgWD$o&&Os8vNKTOIVEKPnz23s5)Xc%}6PsQVy-wKyD3 zX|x8rZGB3MG9={k9bUjKOZpM$rLEutNGYU6%r~@4)34;RLS`L2-F8H1CEt%guBc%l z0{NwUPIv}i1m9VtcqpZedS(dOAgKbuEP>}$DK(eEm)w2m#i#D2Gc+sF&w{@c*~4Vg z#;3>o;TItDH!IE`fF_D5=Y9<@Na`vmV!y2ycsQ0k2-I{bSXt_)!o!+@W}MI z_Se^z-DC!u%nB=MTAVuVEnA#wFqB8Gx#2&&zBFYZGs51 zk5>{e5g*BUZH=`~jj$!?Cq1wON{&KESFOx>J$VIn7*x&Xcr$Fps^CE|HC zWasDzMDQ-)cO@VntBRhyv%WZZJZgS|;k|n%^SleHtnFA5|AItm5nFU9GJ8XpEa@@= zF~L_c^sKoZo`F4lM=|)w)AuV<`3CRwsPpHn47&8TI_#o@A84ZJ*AH)WQ{0s@yGs!W z#Q9KVoFB}^-44|eNP|VF(!Ru;vLYsFG~Qis{A7QZ4{0RzYas)~)jT-}zp*emy}$$=U*DbCc+dJ|ivx7F{- z`|-SQBL5pdFRq#t`<1ckb-~brXyI@_?`1X!?N0Wd*2VP|bs*5wMtH^< z?X7p-&?x?19sCvo0$qU>jv%D4%&g}~4)c34jYX8c3W}8A1|qkeg2(Thhd>P9{EV-1 zgZT3V14O1yZ}g?2%0Zkp$YD5gki)D$${#LbHx<>zdw%6>S;CYbl)!J}-m<$J!w)4T z1^<+LB_bl%<;c$de%mAv(ykd!ED+_{G_S`>2C{@kiaf1Y=giyIF6kYY#{6deIs2^R z*uJE`jXz3uTnb&%0W`|Dby1RZR+IDDaxGhN{dm(hweSAeA2FOx9Cs? zG1WiVlxK$gQrIlYy8&N_v)%kDz1{vW*6Y^JvQE!L?hwq$88v3Pl4 zZbC?PoOiO1@NL2J)Tb5TzM}Tnr0iiPVSMuDJvrxqQd6v)kfqXJ;4|!3kuAFd!&4J?W^8 z)BQCIANp?#buiJ1)(wBWC8O)S(GjmbM($dL>#}BiotnJ%_}*m?A8rjp6NmG6M1_Ud zye{|9Ri~^;UzD!rd+`CXe9v6$;)O%4O=T5LtJmyu|1mJCN;Qpr`Xhbav-a%|dra3E zK)UOl0#9L$omUPY$xBclj-MyosSqj_CI!6>ShHr?8OC1L9FDFlr$IxQ^nQiu6O&$2 z?=9zf%aT9be&4%5c)n6qa47Ak0qgJ+J61*i{IWco9`s<_1FT2&O8>|4*%5EwXL|%? zN4YBQIr;hTY$sRET9*I!LOOnF&v)e^Dz`IRC$(o%#RbCzw|7; z;MOg6@YBU%#cI=RzPi4$#O;U6TUJ0~=70<7Z#{E6eEZ{rMXduWkGFVUUGVOmu7RnW zxpX0f4RV-K0EDY0Qx zS}-HhFo3~iv2BdRC43`87Tw0kli-4J3A1DDVmZY}Ft){ScBjP$(@1n9imi@yEEzBe zWkga9V?#sOTym_9(HLJcs4JVzjSR;~B7<#=c7O+>cAN-?A>IschCw^TvZ8TDwmOE^ z5%fT^o4w;F7U0UpXjf!p7}?xBCML!##=?vf!8FH`NF;L%&K!qB0}3=ZjvYyjMYFj} zl`O`2*fY4a2v%4mi^Dcl@}vfEq9SdKj6lEPgnXf4E-s(hv$>zN0Q6xVOARx}nqkaC zL(M0T;6^$`116sY`oj@i_qZ^Ixf_GaiHe{x9HJTQ$fc86&}pB?hebt%jKQJP%o!n! zP(aEBvtqxPQu*lk^9ZF1n5@vSu~9(TUr|?}$ z%Eg6j&!I&r#dEf|F;dP?rgLa4I(fWG3kW1)=oV;fAPJAg<1GWxM9aWHG=YW>z*u5P zmQ)&P5-VpmH;k*9aEyN@~btsg$hffE6LYA`lZuB%m>tN@=K6BAUpsqM=C)S|Falu*8!XwlTt)jgyYGYzd)827&=LMw?jdsMy~~-C3cG zZIM)^HnCP%BA!IT<8VX^5)Oy`jc7X~f(txR$#d)_z*vvcEMx!%D3+@9Q@~)X9bh5b zMKGw5oCtRgC&b3+^Xr4p-7a7`(W#MCduk*DF#Y^O!F}R|0vZEeF??1U*@Z)A1;+hv z)XK$UXgzLnCl(jXA2-%CzM{4N+4OH=@<+hL&A|TmPFi_;{Jc&5zsiSI}S(2W0k(}Z-7Un z(*yB1q9xi2ELk)j$H1bgR16V~v%*?hk+1<)7{)&r9!cr&7y!@e-vN(?C1L_Bu)rHF zsK9!bz=Tw~WdNE%AOr*kGI02Sz<__$dSkoD|KOUIXe{CPtND`!t<9AIZDKiEoBy{3 zJ5Deu0s_Y#Zv&AP1Zwlok@}OzD`Von@c6V*{0nCQtpA$iPwDqBb^WETKc#^`Mf{g{ z{iUuyrGY<1{FitA)6}K&+r2)64N~+Na3>$^?T`(g184+nTyGB^rGd}cvdrV4MLW!C zCl`XumMV)%>?KMxXw-~!c5%?`(9nfQs@l3q?cje%7S8r--D4X>X_Q@awl1vTuPmRd zvwO#l8;f*mmWp=cx1C$8_vYaDKa`_q%*~u}iKr(un(=VS1&6M7-EW=B%hz_id#9&; zV_lB!mKSv&HW-E-z01`S#}9RzmBkbvd?>TkJyuy((mXWOJ)~I1N3GFSU#qK*z4(AW zU$99~kl(4Deu6^IJ-yK!d!gpR5Q<0Jx<6y1dH%tMTdYn8>nplhODOm5-MvC6IbX4U zk&v7deKz69a40cr)%A6L1czJuO+R=%GdXxPQlrTKaaPBTh9mPR#=*^=>LIzCuGdzv z^XB!L)C|q2TJi22=x?vC_xXvwT9dzSfzEcR&v%)2$0X}z20|WOyWlc(q2~JzYl^vF zZC?NRBq+9k&$;vFxwKFmto16YsdtfBy*qKVoV$r}CjO>avp4z8$C9k9o2`EFYEf%g zrj>Y??~eUSPG}(Zhj_pBwQGB5XHfX{i4!_5)ms{#O7y4rNgOIhdReWT8t#Za&X$y3 z+POnSZy9Q%-YHFNBn&V_74cQK6N_6qrE+i2I(r=JX58TN{Rvi4-W_Gxvi-esRsS>B zDtH%-?J1I`y$7iC%(}Td+M|rlr3I#FDqi%24P%4^o7`fxh{`` zei-#m+`g0klf6Fp_V#WK(Q}3Bs@ssKak(3Bu32|YEn*v`N&x!4DF`$Sdh_e7TXVP4 zIu`xyQf}vwQt!N{hkw@XoCS>RKd9w){OpgKi9_XgS*_D*zs{YJIAw)6H;TJEtbJO{ zj14c=-~C0Tmd(Q6(RuUL>TiF{n^{17Iz3;KncEr5Syi_|NOy~TDTUZqs)N*MsjVx$ zghutZRj+0iW^62|cz9hjKYxa?^r9Y1-G?r4Sz4t+jlLV*T?#oT&QGN2Ek8d!OC#&1 x)84z!2CTVR)rCj+SNi)?*Q$-{2QK$dTskm!za3`2@&TN)!)E*3b$|QzzW|1*J<9+9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..553d9e2f64723d236c10d8feeb56c23836529b00 GIT binary patch literal 9782 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 LZBvHT-ot+bfr+RI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..19b5dc75afffdae7d345415572ef0d33fb92b869 GIT binary patch literal 10959 zcmeHNcU)7+_P_LE0TmS$0Z|tO11Xdw0#OkaT|ns~$c7XQEkHtz5WB0QtOc7E8!XUZX*M$>;i6P}liPBOZg2kc4J|Ydk1uP*(xhbWmtVrsgUF z_1B=tPktv>LC{Wc_vO0D%6gk7S|5ef$6&#DB-#*syve9ZIm`JQ3@B=qM7LdHGtemWjyquhzf`Yu_OqE$PXUv$nXzn~Em8FX{)R!(+ zQ`20budS)IdbygKj>)RkNR*+Wp@ufj42w3^#~7l;Oe7Q(6lTttsXA+xDtejPGW4JR zzz?B0@?x2!B(xyOITBKHB;coz29Q%mV)8Qu1>8$YNz2H}$tx(%00cS8Voga&N=wPe zNK1p>NYD>S&yktC47E;n-gcs#R-g)c->D?|-kX4N9>R}z06KSbM_GUg%_F+?RW zv@7K|!bi@8+;~mnp(A|G1p!a*Wl3L8Iitr+x7{vyW$FA7>n+D-T->?*WQB&HXqF5jrS)~G@1EB0(gJPaLj$V#?+ZT?#u45f58-`Gm$I_K)$VAidt3$dl^mRb8V4f&}(9abWx{B!X&o zJlj*(>4Y95-|gM?43m&VO5I>jW5S#C>Q_t|mF;W46{q4uNo>E!WTEzpfqO6{+tp^? zQjv8T=WsgODa9r*Rh{M=!8us45{Be+8wizAmHf+z1Eti){KE36k#@Jkrvg8O^YpvA zdt+QXh7IQW4sd?M09BOQrsf2U2N(C6d>rZ>&YD=Mcs6hj|5z>O1EVFQB6D53K7Y6; z|5C)Sal&gKqXeY`gA=&&z}{}R;Ab5ENnRpoXuyFbPcKxw&r@NSrcNlq5GAW1YO%h4 zI&ZK}4Xd`{eynz`Euzlm@e_f^D`9W!N787h7j8s7w#v;dd`Xmh9e0mIbxj8h&BJ_v zp{L0L9x!{L#CwOd51&XYxlq{H{fUCV^>iyQPIsrCN7aW3DHuX23A|wFj+#T@3fhxY*?9(ROQ{CK!M^a~7al#`KoGn$HQN*uCH2+r8ZjT0!-N3d7_GEG% z<>R<{Lm8ta%+A)-|&HH#^AuFqGhim8q z9^afh#9mXz?e8uoNOkUrWec{7F0fm8LhqiEZLwDCt`DwcWxQ!A?N`3GDAnAl+skKU z)>hGuC_=^UEPc}x9R04gBHivXZoTourI5BFA8otH1m{KN>}!4pQgt1cFZxtF7C+i? zD&yy~?fI$n7mL*;VCei2;T;&N%Q)CiKgelbAkY}6*GE-yL_2(ef8Xae3H9ht9&q0j zRSHfB_%Ni7iWabHQjhy`npX)ldd!g9hp z521HcpLv?_5|HujSb|sFgiEmri&eWRH`_HO-2FqgUv!Iw(iVfuu4bWQ>T$q8&L>D z3UWd`41KT_vvo|+SVBUKsq$~8nWtP+N%Ry_lTK&YxTm|y`T zbq|YXWvV;e;AAh4o3-EJ+N;L8Pv^h}>f=om zvL6yMf2!h-Xm~Xa_&1&$&Ajf&cT^E9a!T#~shQK2r)xhQeUYEUq_}4ZV+)>fVzBE=K`O5cXs#HWBoA> zU$pu6b;_!A8&AYEm~xwZ>tdSA8Hs)Av1WxObt8K&<&uh4Wg{uTx&9#8$>4zw`cOuM z|0!Wos|e%@busV2aJF~-Wo*p8c7v~7N@zN5FX)g ziWBfm%D8>q#i*W0p9@8|1R8OIGQr>kwiqQcG6JdLeM(+?RrLF73zO`Q>D)N+hxu&g zn>WHcuY|2-=Rs5lJAvZr-=%WQngts5BCp;(*?JmJCb#8Gnq90_PzeJcyIlUh)hEwy z>D#w#%(ugJ6Q3O`fFVp2`+#b(nXn_Zj@=;CO}7J?9O9YcvB1{juZw>tv|Vamo?s*I zjQ`t_vUM(;}oWW*!KAz!|TFtJ}tbNHgMJ-W%BNb|REBD@W-jn
@@ -80,11 +68,8 @@ public void SendRadioMessage(EntityUid messageSource, string message, ProtoId /// Entity that spoke the message /// Entity that picked up the message and will send it, e.g. headset - public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, bool escapeMarkup = true) { - if (language == null) - language = _language.GetLanguage(messageSource); - // TODO if radios ever garble / modify messages, feedback-prevention needs to be handled better than this. if (!_messages.Add(message)) return; @@ -99,7 +84,6 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann name = FormattedMessage.EscapeText(name); - // most radios are relayed to chat, so lets parse the chat message beforehand SpeechVerbPrototype speech; if (mask != null && mask.Enabled @@ -115,15 +99,24 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann ? FormattedMessage.EscapeText(message) : message; - var wrappedMessage = WrapRadioMessage(messageSource, channel, name, content); - var msg = new ChatMessage(ChatChannel.Radio, content, wrappedMessage, NetEntity.Invalid, null); - - // ... you guess it - var obfuscated = _language.ObfuscateSpeech(content, language); - var obfuscatedWrapped = WrapRadioMessage(messageSource, channel, name, obfuscated); - var notUdsMsg = new ChatMessage(ChatChannel.Radio, obfuscated, obfuscatedWrapped, NetEntity.Invalid, null); + var wrappedMessage = Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", + ("color", channel.Color), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("channel", $"\\[{channel.LocalizedName}\\]"), + ("name", name), + ("message", content)); - var ev = new RadioReceiveEvent(messageSource, channel, msg, notUdsMsg, language); + // most radios are relayed to chat, so lets parse the chat message beforehand + var chat = new ChatMessage( + ChatChannel.Radio, + message, + wrappedMessage, + NetEntity.Invalid, + null); + var chatMsg = new MsgChatMessage { Message = chat }; + var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg); var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource); RaiseLocalEvent(ref sendAttemptEv); @@ -169,23 +162,10 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann else _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Radio message from {ToPrettyString(messageSource):user} on {channel.LocalizedName}: {message}"); - _replay.RecordServerMessage(msg); + _replay.RecordServerMessage(chat); _messages.Remove(message); } - private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, string name, string message) - { - var speech = _chat.GetSpeechVerb(source, message); - return Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", - ("color", channel.Color), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), - ("channel", $"\\[{channel.LocalizedName}\\]"), - ("name", name), - ("message", FormattedMessage.EscapeText(message))); - } - /// private bool HasActiveServer(MapId mapId, string channelId) { diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs index 35220d1d757..69d764ffe67 100644 --- a/Content.Server/Radio/RadioEvent.cs +++ b/Content.Server/Radio/RadioEvent.cs @@ -1,22 +1,10 @@ using Content.Shared.Chat; -using Content.Shared.Language; using Content.Shared.Radio; namespace Content.Server.Radio; -/// -/// The message to display when the speaker can understand "language" -/// The message to display when the speaker cannot understand "language" -/// [ByRefEvent] -public readonly record struct RadioReceiveEvent( - // Einstein-Engines - languages mechanic - EntityUid MessageSource, - RadioChannelPrototype Channel, - ChatMessage OriginalChatMsg, - ChatMessage LanguageObfuscatedChatMsg, - LanguagePrototype Language -); +public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg); /// /// Use this event to cancel sending message per receiver diff --git a/Content.Server/Speech/EntitySystems/ListeningSystem.cs b/Content.Server/Speech/EntitySystems/ListeningSystem.cs index f2a625600ca..ea3569e055c 100644 --- a/Content.Server/Speech/EntitySystems/ListeningSystem.cs +++ b/Content.Server/Speech/EntitySystems/ListeningSystem.cs @@ -8,7 +8,6 @@ namespace Content.Server.Speech.EntitySystems; /// public sealed class ListeningSystem : EntitySystem { - [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly SharedTransformSystem _xforms = default!; public override void Initialize() @@ -19,10 +18,10 @@ public override void Initialize() private void OnSpeak(EntitySpokeEvent ev) { - PingListeners(ev.Source, ev.Message, ev.IsWhisper); + PingListeners(ev.Source, ev.Message, ev.ObfuscatedMessage); } - public void PingListeners(EntityUid source, string message, bool isWhisper) + public void PingListeners(EntityUid source, string message, string? obfuscatedMessage) { // TODO whispering / audio volume? Microphone sensitivity? // for now, whispering just arbitrarily reduces the listener's max range. @@ -33,7 +32,7 @@ public void PingListeners(EntityUid source, string message, bool isWhisper) var attemptEv = new ListenAttemptEvent(source); var ev = new ListenEvent(message, source); - var obfuscatedEv = !isWhisper ? null : new ListenEvent(_chat.ObfuscateMessageReadability(message), source); + var obfuscatedEv = obfuscatedMessage == null ? null : new ListenEvent(obfuscatedMessage, source); var query = EntityQueryEnumerator(); while(query.MoveNext(out var listenerUid, out var listener, out var xform)) diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index 0b72ac5ee74..ee4a4e9023b 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -25,7 +25,6 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward"; public static readonly BoundKeyFunction EscapeContext = "EscapeContext"; public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu"; - public static readonly BoundKeyFunction OpenLanguageMenu = "OpenLanguageMenu"; public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu"; public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook"; public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu"; diff --git a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs deleted file mode 100644 index 95232ffe6ff..00000000000 --- a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Shared.Language; - -[RegisterComponent, AutoGenerateComponentState] -public sealed partial class LanguageSpeakerComponent : Component -{ - /// - /// The current language the entity may use to speak. - /// Other listeners will hear the entity speak in this language. - /// - [ViewVariables(VVAccess.ReadWrite)] - [AutoNetworkedField] - public string CurrentLanguage = default!; - - /// - /// List of languages this entity can speak. - /// - [ViewVariables] - [DataField("speaks", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] - public List SpokenLanguages = new(); - - /// - /// List of languages this entity can understand. - /// - [ViewVariables] - [DataField("understands", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] - public List UnderstoodLanguages = new(); -} diff --git a/Content.Shared/Language/Components/TranslatorImplanterComponent.cs b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs deleted file mode 100644 index 401e8a8b8aa..00000000000 --- a/Content.Shared/Language/Components/TranslatorImplanterComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Shared.Language.Components; - -/// -/// An item that, when used on a mob, adds an intrinsic translator to it. -/// -[RegisterComponent] -public sealed partial class TranslatorImplanterComponent : Component -{ - [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List SpokenLanguages = new(); - - [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List UnderstoodLanguages = new(); - - /// - /// The list of languages the mob must understand in order for this translator to have effect. - /// Knowing one language is enough. - /// - [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List RequiredLanguages = new(); - - /// - /// If true, only allows to use this implanter on mobs. - /// - [DataField] - public bool MobsOnly = true; - - /// - /// Whether this implant has been used already. - /// - [DataField] - public bool Used = false; -} diff --git a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs deleted file mode 100644 index a66c9be082e..00000000000 --- a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Shared.Language.Components.Translators; - -public abstract partial class BaseTranslatorComponent : Component -{ - // TODO may need to be removed completely, it's a part of legacy code that never ended up being used. - /// - /// The language this translator changes the speaker's language to when they don't specify one. - /// If null, does not modify the default language. - /// - [DataField("defaultLanguage")] - [ViewVariables(VVAccess.ReadWrite)] - public string? DefaultLanguageOverride = null; - - /// - /// The list of additional languages this translator allows the wielder to speak. - /// - [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List SpokenLanguages = new(); - - /// - /// The list of additional languages this translator allows the wielder to understand. - /// - [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List UnderstoodLanguages = new(); - - /// - /// The languages the wielding MUST know in order for this translator to have effect. - /// The field [RequiresAllLanguages] indicates whether all of them are required, or just one. - /// - [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List RequiredLanguages = new(); - - /// - /// If true, the wielder must understand all languages in [RequiredLanguages] to speak [SpokenLanguages], - /// and understand all languages in [RequiredLanguages] to understand [UnderstoodLanguages]. - /// - /// Otherwise, at least one language must be known (or the list must be empty). - /// - [DataField("requiresAll")] - [ViewVariables(VVAccess.ReadWrite)] - public bool RequiresAllLanguages = false; - - [DataField("enabled"), ViewVariables(VVAccess.ReadWrite)] - public bool Enabled = true; -} diff --git a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs deleted file mode 100644 index f900603f01d..00000000000 --- a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Content.Shared.Language.Components.Translators; - -/// -/// A translator that must be held in a hand or a pocket of an entity in order ot have effect. -/// -[RegisterComponent] -public sealed partial class HandheldTranslatorComponent : Translators.BaseTranslatorComponent -{ - /// - /// Whether or not interacting with this translator - /// toggles it on or off. - /// - [DataField("toggleOnInteract")] - public bool ToggleOnInteract = true; -} diff --git a/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs deleted file mode 100644 index caea9b9a948..00000000000 --- a/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Content.Shared.Language.Components.Translators; - -/// -/// Applied internally to the holder of [HandheldTranslatorComponent]. -/// Do not use directly. Use [HandheldTranslatorComponent] instead. -/// -[RegisterComponent] -public sealed partial class HoldsTranslatorComponent : IntrinsicTranslatorComponent -{ - public Component? Issuer = null; -} diff --git a/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs deleted file mode 100644 index d1d72e83ed7..00000000000 --- a/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Shared.Language.Components.Translators; - -/// -/// Applied to entities who were injected with a translator implant. -/// -[RegisterComponent] -public sealed partial class ImplantedTranslatorComponent : IntrinsicTranslatorComponent -{ -} diff --git a/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs deleted file mode 100644 index d8def4ac1de..00000000000 --- a/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Content.Shared.Language.Components.Translators; - -/// -/// A translator attached to an entity that translates its speech. -/// An example is a translator implant that allows the speaker to speak another language. -/// -[RegisterComponent, Virtual] -public partial class IntrinsicTranslatorComponent : Translators.BaseTranslatorComponent -{ -} diff --git a/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs deleted file mode 100644 index 6f5ad1178b8..00000000000 --- a/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Content.Shared.Language.Components; - -// -// Signifies that this entity can speak and understand any language. -// Applies to such entities as ghosts. -// -[RegisterComponent] -public sealed partial class UniversalLanguageSpeakerComponent : Component -{ - -} diff --git a/Content.Shared/Language/Events/LanguagesSetMessage.cs b/Content.Shared/Language/Events/LanguagesSetMessage.cs deleted file mode 100644 index f7a78210aaf..00000000000 --- a/Content.Shared/Language/Events/LanguagesSetMessage.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.Language.Events; - -/// -/// Sent from the client to the server when it needs to want to set his currentLangauge. -/// Yeah im using this instead of ExecuteCommand... Better right? -/// -[Serializable, NetSerializable] -public sealed class LanguagesSetMessage(string currentLanguage) : EntityEventArgs -{ - public string CurrentLanguage = currentLanguage; -} diff --git a/Content.Shared/Language/Events/LanguagesUpdateEvent.cs b/Content.Shared/Language/Events/LanguagesUpdateEvent.cs deleted file mode 100644 index 90ce2f4446b..00000000000 --- a/Content.Shared/Language/Events/LanguagesUpdateEvent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Content.Shared.Language.Events; - -/// -/// Raised on an entity when its list of languages changes. -/// -public sealed class LanguagesUpdateEvent : EntityEventArgs -{ -} diff --git a/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs deleted file mode 100644 index 563f036df6d..00000000000 --- a/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.Language.Events; - -/// -/// Sent to the client when its list of languages changes. -/// The client should in turn update its HUD and relevant systems. -/// -[Serializable, NetSerializable] -public sealed class LanguagesUpdatedMessage(string currentLanguage, List spoken, List understood) : EntityEventArgs -{ - public string CurrentLanguage = currentLanguage; - public List Spoken = spoken; - public List Understood = understood; -} diff --git a/Content.Shared/Language/Events/RequestLanguagesMessage.cs b/Content.Shared/Language/Events/RequestLanguagesMessage.cs deleted file mode 100644 index aead1f4cd1a..00000000000 --- a/Content.Shared/Language/Events/RequestLanguagesMessage.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.Language.Events; - -/// -/// Sent from the client to the server when it needs to learn the list of languages its entity knows. -/// This event should always be followed by a , unless the client doesn't have an entity. -/// -[Serializable, NetSerializable] -public sealed class RequestLanguagesMessage : EntityEventArgs; diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs deleted file mode 100644 index 801ab8a393b..00000000000 --- a/Content.Shared/Language/LanguagePrototype.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Runtime.CompilerServices; -using Robust.Shared.Prototypes; - -namespace Content.Shared.Language; - -[Prototype("language")] -public sealed class LanguagePrototype : IPrototype -{ - [IdDataField] - public string ID { get; private set; } = default!; - - /// - /// If true, obfuscated phrases of creatures speaking this language will have their syllables replaced with "replacement" syllables. - /// Otherwise entire sentences will be replaced. - /// - [DataField(required: true)] - public bool ObfuscateSyllables; - - /// - /// Lists all syllables that are used to obfuscate a message a listener cannot understand if obfuscateSyllables is true. - /// Otherwise uses all possible phrases the creature can make when trying to say anything. - /// - [DataField(required: true)] - public List Replacement = []; - - #region utility - /// - /// The in-world name of this language, localized. - /// - public string Name => Loc.GetString($"language-{ID}-name"); - - /// - /// The in-world description of this language, localized. - /// - public string Description => Loc.GetString($"language-{ID}-description"); - #endregion utility -} diff --git a/Content.Shared/Language/Systems/SharedLanguageSystem.cs b/Content.Shared/Language/Systems/SharedLanguageSystem.cs deleted file mode 100644 index e2eeb8bb493..00000000000 --- a/Content.Shared/Language/Systems/SharedLanguageSystem.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; - -namespace Content.Shared.Language.Systems; - -public abstract class SharedLanguageSystem : EntitySystem -{ - /// - /// The language used as a fallback in cases where an entity suddenly becomes a language speaker (e.g. the usage of make-sentient) - /// - [ValidatePrototypeId] - public static readonly string FallbackLanguagePrototype = "GalacticCommon"; - - /// - /// The language whose speakers are assumed to understand and speak every language. Should never be added directly. - /// - [ValidatePrototypeId] - public static readonly string UniversalPrototype = "Universal"; - - /// - /// A cached instance of - /// - public static LanguagePrototype Universal { get; private set; } = default!; - - [Dependency] protected readonly IPrototypeManager _prototype = default!; - [Dependency] protected readonly IRobustRandom _random = default!; - - public override void Initialize() - { - Universal = _prototype.Index("Universal"); - } - - public LanguagePrototype? GetLanguagePrototype(string id) - { - _prototype.TryIndex(id, out var proto); - return proto; - } -} diff --git a/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs deleted file mode 100644 index a13225378cd..00000000000 --- a/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Content.Shared.Examine; -using Content.Shared.Implants.Components; -using Content.Shared.Language.Components; -using Robust.Shared.Serialization; - -namespace Content.Shared.Language.Systems; - -public abstract class SharedTranslatorImplanterSystem : EntitySystem -{ - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnExamined); - } - - private void OnExamined(EntityUid uid, TranslatorImplanterComponent component, ExaminedEvent args) - { - if (!args.IsInDetailsRange) - return; - - var text = !component.Used - ? Loc.GetString("translator-implanter-ready") - : Loc.GetString("translator-implanter-used"); - - args.PushText(text); - } - - protected void OnAppearanceChange(EntityUid implanter, TranslatorImplanterComponent component) - { - var used = component.Used; - _appearance.SetData(implanter, ImplanterVisuals.Full, !used); - } -} diff --git a/Content.Shared/Language/Systems/SharedTranslatorSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs deleted file mode 100644 index 08a016efa9c..00000000000 --- a/Content.Shared/Language/Systems/SharedTranslatorSystem.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Content.Shared.Examine; -using Content.Shared.Toggleable; -using Content.Shared.Language.Components.Translators; - -namespace Content.Shared.Language.Systems; - -public abstract class SharedTranslatorSystem : EntitySystem -{ - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnExamined); - } - - private void OnExamined(EntityUid uid, HandheldTranslatorComponent component, ExaminedEvent args) - { - var state = Loc.GetString(component.Enabled - ? "translator-enabled" - : "translator-disabled"); - - args.PushMarkup(state); - } - - protected void OnAppearanceChange(EntityUid translator, HandheldTranslatorComponent? comp = null) - { - if (comp == null && !TryComp(translator, out comp)) - return; - - _appearance.SetData(translator, ToggleVisuals.Toggled, comp.Enabled); - } -} diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 89dcd2f5822..6679b141cd8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4142,27 +4142,3 @@ Entries: message: Floors Looks Updated/Resprited. id: 6118 time: '2024-06-03T19:23:51.0000000+00:00' -- author: FoxxoTrystan - changes: - - type: Add - message: All species can now bring their own cultures and languages - id: 6119 - time: '2024-06-10T20:48:48.0000000+00:00' -- author: FoxxoTrystan - changes: - - type: Tweak - message: Rust Walls Sprites. - - type: Tweak - message: Armor, Bulletproof, Riot Suit Resprites. - - type: Tweak - message: New Banners Sprites. - - type: Tweak - message: Stunbaton, Fire Extinguisher New Sprites. - - type: Tweak - message: Rack/WallScreen resprites. - - type: Tweak - message: Stock Parts new sprites! - - type: Tweak - message: Radiation Collector has now a new sprite! - id: 6120 - time: '2024-06-11T00:34:02.0000000+00:00' diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl deleted file mode 100644 index 32fa5415b8c..00000000000 --- a/Resources/Locale/en-US/language/commands.ftl +++ /dev/null @@ -1,8 +0,0 @@ -command-list-langs-desc = List languages your current entity can speak at the current moment. -command-list-langs-help = Usage: {$command} - -command-saylang-desc = Send a message in a specific language. -command-saylang-help = Usage: {$command} . Example: {$command} GalacticCommon "Hello World!" - -command-language-select-desc = Select the currently spoken language of your entity. -command-language-select-help = Usage: {$command} . Example: {$command} GalacticCommon diff --git a/Resources/Locale/en-US/language/language-menu.ftl b/Resources/Locale/en-US/language/language-menu.ftl deleted file mode 100644 index 83687d0f1a6..00000000000 --- a/Resources/Locale/en-US/language/language-menu.ftl +++ /dev/null @@ -1,4 +0,0 @@ -language-menu-window-title = Language Menu -language-menu-current-language = Current Language: {$language} -language-menu-description-header = Description -ui-options-function-open-language-menu = Open language Menu diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl deleted file mode 100644 index 69c5d0a4a76..00000000000 --- a/Resources/Locale/en-US/language/languages.ftl +++ /dev/null @@ -1,71 +0,0 @@ -language-Universal-name = Universal -language-Universal-description = What are you? - -language-GalacticCommon-name = Galactic common -language-GalacticCommon-description = The standard Galatic language, most commonly used for inter-species communications and legal work. - -language-Bubblish-name = Bubblish -language-Bubblish-description = The language of Slimes. Being a mixture of bubbling noises and pops it's very difficult to speak for humans without the use of mechanical aids. - -language-RootSpeak-name = Rootspeak -language-RootSpeak-description = The strange whistling-style language spoken by the Diona. - -language-Nekomimetic-name = Nekomimetic -language-Nekomimetic-description = To the casual observer, this language is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible. - -language-Draconic-name = Draconic -language-Draconic-description = The common language of lizard-people, composed of sibilant hisses and rattles. - -language-SolCommon-name = Sol common -language-SolCommon-description = The language common to species from the Sol System. - -language-Canilunzt-name = Canilunzt -language-Canilunzt-description = The guttural language spoken and utilized by the inhabitants of the Vazzend system, composed of growls, barks, yaps, and heavy utilization of ears and tail movements. Vulpkanin speak this language with ease. - -language-Moffic-name = Moffic -language-Moffic-description = The language of the mothpeople borders on complete unintelligibility. - -language-RobotTalk-name = RobotTalk -language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators. - -language-Cat-name = Cat -language-Cat-description = Meow - -language-Dog-name = Dog -language-Dog-description = Bark! - -language-Fox-name = Fox -language-Fox-description = Yeeps! - -language-Xeno-name = Xeno -language-Xeno-description = Sssss! - -language-Monkey-name = Monkey -language-Monkey-description = oooook! - -language-Mouse-name = Mouse -language-Mouse-description = Squeeek! - -language-Chicken-name = Chicken -language-Chicken-description = Coot! - -language-Duck-name = Duck -language-Duck-description = Quack! - -language-Cow-name = Cow -language-Cow-description = Moooo! - -language-Sheep-name = Sheep -language-Sheep-description = Baaah! - -language-Kangaroo-name = Kangaroo -language-Kangaroo-description = Chuu! - -language-Pig-name = Pig -language-Pig-description = Oink! - -language-Crab-name = Crab -language-Crab-description = Click! - -language-Kobold-name = Kobold -language-Kobold-description = Hiss! diff --git a/Resources/Locale/en-US/language/technologies.ftl b/Resources/Locale/en-US/language/technologies.ftl deleted file mode 100644 index 901a48061c5..00000000000 --- a/Resources/Locale/en-US/language/technologies.ftl +++ /dev/null @@ -1,2 +0,0 @@ -research-technology-basic-translation = Basic Translation -research-technology-advanced-translation = Advanced Translation diff --git a/Resources/Locale/en-US/language/translator.ftl b/Resources/Locale/en-US/language/translator.ftl deleted file mode 100644 index b2a1e9b2b8c..00000000000 --- a/Resources/Locale/en-US/language/translator.ftl +++ /dev/null @@ -1,8 +0,0 @@ -translator-component-shutoff = The {$translator} shuts off. -translator-component-turnon = The {$translator} turns on. -translator-enabled = It appears to be active. -translator-disabled = It appears to be disabled. -translator-implanter-refuse = The {$implanter} has no effect on {$target}. -translator-implanter-success = The {$implanter} successfully injected {$target}. -translator-implanter-ready = This implanter appears to be ready to use. -translator-implanter-used = This implanter seems empty. diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml index e932974a0f4..92615131f05 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml @@ -66,11 +66,6 @@ - type: Tag tags: - VimPilot - - type: LanguageSpeaker - speaks: - - Fox - understands: - - Fox - type: entity name: security dog @@ -159,6 +154,8 @@ spawned: - id: FoodMeat amount: 2 + - type: ReplacementAccent + accent: dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -179,9 +176,3 @@ tags: - DoorBumpOpener - VimPilot - - type: LanguageSpeaker - speaks: - - Dog - understands: - - Dog - - GalacticCommon diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 003c899fc5c..4f255cad211 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -98,11 +98,6 @@ factions: - PsionicInterloper - NanoTrasen - - type: LanguageSpeaker - speaks: - - GalacticCommon - understands: - - GalacticCommon - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml index c2ae33ec0ba..96950317c1f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml @@ -96,12 +96,8 @@ spawned: - id: FoodMeat amount: 1 - - type: LanguageSpeaker - speaks: - - Mouse - understands: - - Mouse - - GalacticCommon + - type: ReplacementAccent + accent: mouse - type: Tag tags: - VimPilot @@ -167,4 +163,4 @@ interactFailureString: petting-failure-nukie-mouse interactSuccessSpawn: EffectHearts interactSuccessSound: - path: /Audio/Animals/mouse_squeak.ogg + path: /Audio/Animals/mouse_squeak.ogg \ No newline at end of file diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index 18437e074dd..a4498299c9a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -122,19 +122,12 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.5 baseSprintSpeed: 5.0 - - type: Inventory + - type: Inventory speciesId: harpy templateId: digitigrade - type: HarpyVisuals - type: UltraVision - - type: LanguageSpeaker - speaks: - - GalacticCommon - - SolCommon - understands: - - GalacticCommon - - SolCommon - + - type: entity save: false name: Urist McHands @@ -145,7 +138,7 @@ components: - type: HumanoidAppearance species: Harpy - - type: Inventory + - type: Inventory speciesId: harpy - type: Sprite scale: 0.9, 0.9 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index 52853d696a2..4a187d51b33 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -97,13 +97,6 @@ Female: FemaleVulpkanin Unsexed: MaleVulpkanin - type: DogVision - - type: LanguageSpeaker - speaks: - - GalacticCommon - - Canilunzt - understands: - - GalacticCommon - - Canilunzt - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 0645e451af2..dec46df0b53 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -213,13 +213,6 @@ visMask: - PsionicInvisibility - Normal - - type: LanguageSpeaker - speaks: - - GalacticCommon - - RobotTalk - understands: - - GalacticCommon - - RobotTalk - type: entity id: BaseBorgChassisNT diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 369544fdc1b..378b3f8a9d8 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -48,11 +48,8 @@ flavorKind: station-event-random-sentience-flavor-organic - type: Bloodstream bloodMaxVolume: 50 - - type: LanguageSpeaker - speaks: - - Mouse - understands: - - Mouse + - type: ReplacementAccent + accent: mouse - type: MeleeWeapon soundHit: path: /Audio/Effects/bite.ogg @@ -232,11 +229,8 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: LanguageSpeaker - speaks: - - Chicken - understands: - - Chicken + - type: ReplacementAccent + accent: chicken - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -510,11 +504,8 @@ prob: 0.5 - type: Extractable grindableSolutionName: food - - type: LanguageSpeaker - speaks: - - Moffic - understands: - - Moffic + - type: ReplacementAccent + accent: mothroach - type: ZombieAccentOverride accent: zombieMoth - type: Vocal @@ -610,11 +601,8 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: LanguageSpeaker - speaks: - - Duck - understands: - - Duck + - type: ReplacementAccent + accent: duck - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -851,11 +839,8 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Voice/Arachnid/arachnid_chitter.ogg - - type: LanguageSpeaker - speaks: - - Crab - understands: - - Crab + - type: ReplacementAccent + accent: crab - type: Bloodstream bloodMaxVolume: 50 bloodReagent: CopperBlood @@ -1091,11 +1076,8 @@ - type: Inventory speciesId: kangaroo templateId: kangaroo - - type: LanguageSpeaker - speaks: - - Kangaroo - understands: - - Kangaroo + - type: ReplacementAccent + accent: kangaroo - type: InventorySlots - type: Strippable - type: Butcherable @@ -1284,12 +1266,7 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: LanguageSpeaker - speaks: - - Monkey - understands: - - Monkey - - Kobold + - type: MonkeyAccent - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-primate - type: AlwaysRevolutionaryConvertible @@ -1323,13 +1300,7 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: LanguageSpeaker - speaks: - - Monkey - understands: - - Monkey - - Kobold - - GalacticCommon + - type: MonkeyAccent - type: NpcFactionMember factions: - Syndicate @@ -1368,12 +1339,8 @@ - type: NameIdentifier group: Kobold - type: LizardAccent - - type: LanguageSpeaker - speaks: - - Kobold - understands: - - Kobold - - Monkey + - type: ReplacementAccent + accent: kobold - type: Speech speechSounds: Lizard speechVerb: Reptilian @@ -1601,11 +1568,8 @@ spawned: - id: FoodMeatRat amount: 1 - - type: LanguageSpeaker - speaks: - - Mouse - understands: - - Mouse + - type: ReplacementAccent + accent: mouse - type: Tag tags: - Trash @@ -1930,11 +1894,6 @@ path: /Audio/Animals/parrot_raught.ogg - type: Bloodstream bloodMaxVolume: 50 - - type: LanguageSpeaker - speaks: - - GalacticCommon - understands: - - GalacticCommon - type: entity name: penguin @@ -2181,11 +2140,8 @@ - type: MeleeChemicalInjector transferAmount: 0.75 solution: melee - - type: LanguageSpeaker - speaks: - - Xeno - understands: - - Xeno + - type: ReplacementAccent + accent: xeno - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-tarantula @@ -2516,11 +2472,6 @@ - type: Tag tags: - VimPilot - - type: LanguageSpeaker - speaks: - - Fox - understands: - - Fox - type: entity name: corgi @@ -2567,11 +2518,8 @@ spawned: - id: FoodMeat amount: 2 - - type: LanguageSpeaker - speaks: - - Dog - understands: - - Dog + - type: ReplacementAccent + accent: dog - type: InteractionPopup interactSuccessString: petting-success-dog interactFailureString: petting-failure-generic @@ -2723,11 +2671,8 @@ spawned: - id: FoodMeat amount: 3 - - type: LanguageSpeaker - speaks: - - Cat - understands: - - Cat + - type: ReplacementAccent + accent: cat - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-cat @@ -2794,12 +2739,6 @@ - type: NpcFactionMember factions: - Syndicate - - type: LanguageSpeaker - speaks: - - Xeno - understands: - - Xeno - - GalacticCommon - type: entity name: space cat @@ -3095,11 +3034,8 @@ spawned: - id: FoodMeat amount: 1 - - type: LanguageSpeaker - speaks: - - Mouse - understands: - - Mouse + - type: ReplacementAccent + accent: mouse - type: Tag tags: - VimPilot @@ -3205,11 +3141,8 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Animals/pig_oink.ogg - - type: LanguageSpeaker - speaks: - - Pig - understands: - - Pig + - type: ReplacementAccent + accent: pig - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -3295,12 +3228,6 @@ reformTime: 10 popupText: diona-reform-attempt reformPrototype: MobDionaReformed - - type: LanguageSpeaker - speaks: - - RootSpeak - understands: - - GalacticCommon - - RootSpeak - type: entity parent: MobDionaNymph diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml index 3bcf8e7a16f..39e68b63a78 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml @@ -15,11 +15,8 @@ - type: Sprite sprite: Mobs/Aliens/Argocyte/argocyte_common.rsi - type: SolutionContainerManager - - type: LanguageSpeaker - speaks: - - Xeno - understands: - - Xeno + - type: ReplacementAccent + accent: xeno - type: Bloodstream bloodReagent: FerrochromicAcid bloodMaxVolume: 75 #we don't want the map to become pools of blood diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 8ca1b2d2f0e..9981bb8bd92 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -36,12 +36,6 @@ - VimPilot - type: StealTarget stealGroup: AnimalIan - - type: LanguageSpeaker - speaks: - - Dog - understands: - - GalacticCommon - - Dog - type: entity name: Old Ian @@ -127,12 +121,6 @@ tags: - CannotSuicide - VimPilot - - type: LanguageSpeaker - speaks: - - Cat - understands: - - GalacticCommon - - Cat - type: entity name: Exception @@ -151,12 +139,6 @@ tags: - CannotSuicide - VimPilot - - type: LanguageSpeaker - speaks: - - Cat - understands: - - GalacticCommon - - Cat - type: entity name: Floppa @@ -306,12 +288,8 @@ spawned: - id: FoodMeat amount: 2 - - type: LanguageSpeaker - speaks: - - Dog - understands: - - GalacticCommon - - Dog + - type: ReplacementAccent + accent: dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -409,12 +387,8 @@ spawned: - id: FoodMeat amount: 3 - - type: LanguageSpeaker - speaks: - - Dog - understands: - - GalacticCommon - - Dog + - type: ReplacementAccent + accent: dog - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-dog @@ -572,12 +546,6 @@ - VimPilot - type: StealTarget stealGroup: AnimalRenault - - type: LanguageSpeaker - speaks: - - Fox - understands: - - GalacticCommon - - Fox - type: entity name: Hamlet @@ -625,12 +593,6 @@ - CannotSuicide - Hamster - VimPilot - - type: LanguageSpeaker - speaks: - - Mouse - understands: - - GalacticCommon - - Mouse - type: entity name: Shiva @@ -803,12 +765,6 @@ attributes: proper: true gender: female - - type: LanguageSpeaker - speaks: - - Bubblish - understands: - - GalacticCommon - - Bubblish - type: entity name: Pun Pun @@ -843,13 +799,6 @@ attributes: proper: true gender: male - - type: LanguageSpeaker - speaks: - - Monkey - understands: - - GalacticCommon - - Monkey - - Kobold - type: entity name: Tropico @@ -877,9 +826,3 @@ # - type: AlwaysRevolutionaryConvertible - type: StealTarget stealGroup: AnimalTropico - - type: LanguageSpeaker - speaks: - - Crab - understands: - - GalacticCommon - - Crab diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 50fe3b6765e..89a6f16e525 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -119,13 +119,6 @@ attributes: gender: male - type: PotentialPsionic # Nyano - - type: LanguageSpeaker - speaks: - - GalacticCommon - - Mouse - understands: - - GalacticCommon - - Mouse - type: entity id: MobRatKingBuff @@ -296,12 +289,6 @@ - type: Food - type: Item size: Tiny # Delta V - Make them eatable and pickable. - - type: LanguageSpeaker - speaks: - - Mouse - understands: - - GalacticCommon - - Mouse - type: weightedRandomEntity id: RatKingLoot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml index 1316aefc50b..ec1ed3a58f6 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml @@ -97,7 +97,6 @@ - RevenantTheme - type: Speech speechVerb: Ghost - - type: UniversalLanguageSpeaker - type: Tag tags: - NoPaint diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml index 9559ae3a0c0..f08fe36544e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml @@ -36,7 +36,7 @@ speedModifierThresholds: 60: 0.7 80: 0.5 - + - type: entity name: shadow cat parent: BaseShadowMob @@ -50,11 +50,8 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: cat - type: Physics - - type: LanguageSpeaker - speaks: - - Cat - understands: - - Cat + - type: ReplacementAccent + accent: cat - type: InteractionPopup successChance: 0.01 # you cant pet shadow cat... almost interactSuccessString: petting-success-cat @@ -67,4 +64,4 @@ gender: epicene - type: Tag tags: - - VimPilot + - VimPilot \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index e3166c15f6e..42b7ff9e211 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -107,13 +107,6 @@ - type: TypingIndicator proto: robot - type: ZombieImmune - - type: LanguageSpeaker - speaks: - - GalacticCommon - - RobotTalk - understands: - - GalacticCommon - - RobotTalk - type: entity parent: MobSiliconBase diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 901bf149cbc..c64479369a6 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -111,11 +111,8 @@ successChance: 0.5 interactSuccessString: petting-success-slimes interactFailureString: petting-failure-generic - - type: LanguageSpeaker - speaks: - - Bubblish - understands: - - Bubblish + - type: ReplacementAccent + accent: slimes - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 9ea2d784dbb..0a294805cfd 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -165,11 +165,8 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepBounce - - type: LanguageSpeaker - speaks: - - Kangaroo - understands: - - Kangaroo + - type: ReplacementAccent + accent: kangaroo - type: InventorySlots - type: Strippable - type: UserInterface @@ -251,11 +248,8 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 4 - - type: LanguageSpeaker - speaks: - - Xeno - understands: - - Xeno + - type: ReplacementAccent + accent: xeno - type: InteractionPopup successChance: 0.20 interactSuccessString: petting-success-tarantula @@ -357,11 +351,8 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 6 - - type: LanguageSpeaker - speaks: - - Xeno - understands: - - Xeno + - type: ReplacementAccent + accent: xeno - type: InteractionPopup successChance: 0.2 interactSuccessString: petting-success-snake @@ -382,4 +373,4 @@ parent: MobCobraSpace suffix: "Salvage Ruleset" components: - - type: SalvageMobRestrictions + - type: SalvageMobRestrictions \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index 26553a2f1f2..d0ac6fc0265 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -125,11 +125,6 @@ chance: -2 - type: Psionic #Nyano - Summary: makes psionic by default. removable: false - - type: LanguageSpeaker - speaks: - - Xeno - understands: - - Xeno - type: entity name: Praetorian @@ -239,13 +234,6 @@ - type: Tag tags: - CannotSuicide - - type: LanguageSpeaker - speaks: - - GalacticCommon - - Xeno - understands: - - GalacticCommon - - Xeno - type: entity name: Ravager diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 0086be81d9a..8f3e6c13466 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -53,7 +53,6 @@ - type: Tag tags: - BypassInteractionRangeChecks - - type: UniversalLanguageSpeaker # Ghosts should understand any language. - type: entity id: ActionGhostBoo diff --git a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml index 07deef857c3..ad9b37f63e1 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml @@ -7,4 +7,3 @@ - type: MovementSpeedModifier baseSprintSpeed: 24 baseWalkSpeed: 16 - - type: UniversalLanguageSpeaker diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 67212d416fe..a610e04d6dd 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -141,7 +141,7 @@ - Pacified - StaminaModifier - PsionicsDisabled #Nyano - Summary: PCs can have psionics disabled. - - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. + - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. - type: Reflect enabled: false reflectProb: 0 @@ -218,12 +218,7 @@ - type: MobPrice price: 1500 # Kidnapping a living person and selling them for cred is a good move. deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - - type: CanEscapeInventory # Carrying system from nyanotrasen. - - type: LanguageSpeaker # This is here so all with no LanguageSpeaker at least spawn with the default languages. - speaks: - - GalacticCommon - understands: - - GalacticCommon + - type: CanEscapeInventory # Carrying system from nyanotrasen. - type: Tag tags: - CanPilot diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 5cb3de6f168..3d405c4dd91 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -102,13 +102,6 @@ actionPrototype: DionaGibAction allowedStates: - Dead - - type: LanguageSpeaker - speaks: - - GalacticCommon - - RootSpeak - understands: - - GalacticCommon - - RootSpeak - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index 7afc5cddd70..fe36754b9b5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -52,13 +52,6 @@ accent: dwarf - type: Speech speechSounds: Bass - - type: LanguageSpeaker - speaks: - - GalacticCommon - - SolCommon - understands: - - GalacticCommon - - SolCommon - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 7c3f857c001..900de77712e 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -16,14 +16,6 @@ spawned: - id: FoodMeatHuman amount: 5 - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - - type: LanguageSpeaker - speaks: - - GalacticCommon - - SolCommon - understands: - - GalacticCommon - - SolCommon - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 39aa0ab8dea..1680dd6cda6 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -23,13 +23,6 @@ accent: zombieMoth - type: Speech speechVerb: Moth - - type: LanguageSpeaker - speaks: - - GalacticCommon - - Moffic - understands: - - GalacticCommon - - Moffic - type: TypingIndicator proto: moth - type: Butcherable diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index bdea4499ed1..09e86b19968 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -59,13 +59,6 @@ types: Heat : 1.5 #per second, scales with temperature & other constants - type: Wagging - - type: LanguageSpeaker - speaks: - - GalacticCommon - - Draconic - understands: - - GalacticCommon - - Draconic - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index a601010ef94..481afd06a3c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -74,13 +74,6 @@ types: Asphyxiation: -1.0 maxSaturation: 15 - - type: LanguageSpeaker - speaks: - - GalacticCommon - - Bubblish - understands: - - GalacticCommon - - Bubblish - type: entity parent: MobHumanDummy diff --git a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml deleted file mode 100644 index fc947efe9a3..00000000000 --- a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml +++ /dev/null @@ -1,132 +0,0 @@ -- type: entity - abstract: true - id: BaseTranslatorImplanter - parent: [ BaseItem ] - name: basic translator implant - description: Translates speech. - components: - - type: Sprite - sprite: Objects/Specific/Medical/implanter.rsi - state: implanter0 - layers: - - state: implanter1 - map: [ "implantFull" ] - visible: true - - state: implanter0 - map: [ "implantBroken" ] - - type: Appearance - - type: GenericVisualizer - visuals: - enum.ImplanterVisuals.Full: - implantFull: - True: {visible: true} - False: {visible: false} - implantBroken: - True: {visible: false} - False: {visible: true} - -- type: entity - id: BasicGalaticCommonTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: basic Galactic Common translator implant - description: An implant giving the ability to understand Galactic Common. - components: - - type: TranslatorImplanter - understood: - - GalacticCommon - -- type: entity - id: AdvancedGalaticCommonTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: advanced Galactic Common translator implant - description: An implant giving the ability to understand and speak Galactic Common. - components: - - type: TranslatorImplanter - spoken: - - GalacticCommon - understood: - - GalacticCommon - -- type: entity - id: BubblishTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Bubblish translator implant - description: An implant giving the ability to understand and speak Bubblish. - components: - - type: TranslatorImplanter - spoken: - - Bubblish - understood: - - Bubblish - -- type: entity - id: NekomimeticTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Nekomimetic translator implant - description: An implant giving the ability to understand and speak Nekomimetic. Nya~! - components: - - type: TranslatorImplanter - spoken: - - Nekomimetic - understood: - - Nekomimetic - -- type: entity - id: DraconicTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Draconic translator implant - description: An implant giving the ability to understand and speak Draconic. - components: - - type: TranslatorImplanter - spoken: - - Draconic - understood: - - Draconic - -- type: entity - id: CanilunztTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Canilunzt translator implant - description: An implant giving the ability to understand and speak Canilunzt. Yeeps! - components: - - type: TranslatorImplanter - spoken: - - Canilunzt - understood: - - Canilunzt - -- type: entity - id: SolCommonTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: SolCommon translator implant - description: An implant giving the ability to understand and speak SolCommon. Raaagh! - components: - - type: TranslatorImplanter - spoken: - - SolCommon - understood: - - SolCommon - -- type: entity - id: RootSpeakTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: RootSpeak translator implant - description: An implant giving the ability to understand and speak RootSpeak. - components: - - type: TranslatorImplanter - spoken: - - RootSpeak - understood: - - RootSpeak - -- type: entity - id: MofficTranslatorImplanter - parent: [ BaseTranslatorImplanter ] - name: Moffic translator implant - description: An implant giving the ability to understand and speak Moffic. - components: - - type: TranslatorImplanter - spoken: - - Moffic - understood: - - Moffic diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml deleted file mode 100644 index e5ad824c5d9..00000000000 --- a/Resources/Prototypes/Entities/Objects/Devices/translators.yml +++ /dev/null @@ -1,205 +0,0 @@ -- type: entity - abstract: true - id: TranslatorUnpowered - parent: [ BaseItem ] - name: translator - description: Translates speech. - components: - - type: Sprite - sprite: Objects/Devices/translator.rsi - state: icon - layers: - - state: icon - - state: translator - shader: unshaded - visible: false - map: [ "enum.ToggleVisuals.Layer", "enum.PowerDeviceVisualLayers.Powered" ] - - type: Appearance - - type: GenericVisualizer - visuals: - enum.ToggleVisuals.Toggled: - enum.ToggleVisuals.Layer: - True: { visible: true } - False: { visible: false } - - type: HandheldTranslator - enabled: false - -- type: entity - abstract: true - id: Translator - parent: [ TranslatorUnpowered, PowerCellSlotMediumItem ] - suffix: Powered - components: - - type: PowerCellDraw - drawRate: 1 - -- type: entity - abstract: true - id: TranslatorEmpty - parent: [ Translator ] - suffix: Empty - components: - - type: ItemSlots - slots: - cell_slot: - name: power-cell-slot-component-slot-name-default - - -- type: entity - id: CanilunztTranslator - parent: [ TranslatorEmpty ] - name: Canilunzt translator - description: Translates speech between Canilunzt and Galactic Common. - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - Canilunzt - understood: - - GalacticCommon - - Canilunzt - requires: - - GalacticCommon - - Canilunzt - -- type: entity - id: BubblishTranslator - parent: [ TranslatorEmpty ] - name: Bubblish translator - description: Translates speech between Bubblish and Galactic Common. - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - Bubblish - understood: - - GalacticCommon - - Bubblish - requires: - - GalacticCommon - - Bubblish - -- type: entity - id: NekomimeticTranslator - parent: [ TranslatorEmpty ] - name: Nekomimetic translator - description: Translates speech between Nekomimetic and Galactic Common. Why would you want that? - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - Nekomimetic - understood: - - GalacticCommon - - Nekomimetic - requires: - - GalacticCommon - - Nekomimetic - -- type: entity - id: DraconicTranslator - parent: [ TranslatorEmpty ] - name: Draconic translator - description: Translates speech between Draconic and Galactic Common. - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - Draconic - understood: - - GalacticCommon - - Draconic - requires: - - GalacticCommon - - Draconic - -- type: entity - id: SolCommonTranslator - parent: [ TranslatorEmpty ] - name: Sol Common translator - description: Translates speech between Sol Common and Galactic Common. Like a true Earthman! - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - SolCommon - understood: - - GalacticCommon - - SolCommon - requires: - - GalacticCommon - - SolCommon - -- type: entity - id: RootSpeakTranslator - parent: [ TranslatorEmpty ] - name: RootSpeak translator - description: Translates speech between RootSpeak and Galactic Common. Like a true plant? - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - RootSpeak - understood: - - GalacticCommon - - RootSpeak - requires: - - GalacticCommon - - RootSpeak - -- type: entity - id: MofficTranslator - parent: [ TranslatorEmpty ] - name: Moffic translator - description: Translates speech between Moffic and Galactic Common. Like a true moth... or bug? - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - Moffic - understood: - - GalacticCommon - - Moffic - requires: - - GalacticCommon - - Moffic - -- type: entity - id: XenoTranslator - parent: [ TranslatorEmpty ] - name: Xeno translator - description: Translates speech between Xeno and Galactic Common. Not sure if that will help. - components: - - type: HandheldTranslator - spoken: - - GalacticCommon - - Xeno - understood: - - GalacticCommon - - Xeno - requires: - - GalacticCommon - -- type: entity - id: AnimalTranslator - parent: [ TranslatorEmpty ] - name: Animal translator - description: Translates all the cutes noises that animals make into a more understandable form! - components: - - type: HandheldTranslator - understood: - - Cat - - Dog - - Fox - - Monkey - - Mouse - - Chicken - - Duck - - Cow - - Sheep - - Kangaroo - - Pig - - Crab - - Kobold - requires: - - GalacticCommon diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 53a32e0f6fa..5fca0819984 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -104,6 +104,7 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight + fixVacuum: true noAirWhenFullyAirBlocked: false - type: RadiationBlocker resistance: 3 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml index 9771f633888..21d485be0c8 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml @@ -57,6 +57,7 @@ denySound: path: /Audio/Machines/airlock_deny.ogg - type: Airtight + fixVacuum: true noAirWhenFullyAirBlocked: false - type: Tag tags: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index e677ef185be..dccc76e96c1 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -93,6 +93,7 @@ - type: Physics canCollide: false - type: Airtight + fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: true - type: RadiationBlocker @@ -157,6 +158,7 @@ sprite: Structures/Doors/edge_door_hazard.rsi snapCardinals: false - type: Airtight + fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: false airBlockedDirection: diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index 8dfe2f62a51..4b6f72de934 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -40,6 +40,7 @@ path: /Audio/Effects/stonedoor_openclose.ogg - type: Appearance - type: Airtight + fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml index d6c087af0a5..2c54d3cd418 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml @@ -38,6 +38,7 @@ - type: Weldable time: 2 - type: Airtight + fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index 1819c9d0ef2..e38ba1fd667 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -59,6 +59,7 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight + fixVacuum: true - type: RadiationBlocker resistance: 2 - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index d03765d4fc9..56167c178e2 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -130,6 +130,7 @@ - type: Appearance - type: WiresVisuals - type: Airtight + fixVacuum: true noAirWhenFullyAirBlocked: false airBlockedDirection: - South diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 7300c0b9ec3..011f2a3b649 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -341,24 +341,6 @@ - FauxTileAstroSnow - OreBagOfHolding - DeviceQuantumSpinInverter - - CanilunztTranslator - - BubblishTranslator - - NekomimeticTranslator - - DraconicTranslator - - SolCommonTranslator - - RootSpeakTranslator - - XenoTranslator - - BasicGalaticCommonTranslatorImplanter - - AdvancedGalaticCommonTranslatorImplanter - - BubblishTranslatorImplanter - - NekomimeticTranslatorImplanter - - DraconicTranslatorImplanter - - CanilunztTranslatorImplanter - - SolCommonTranslatorImplanter - - RootSpeakTranslatorImplanter - - AnimalTranslator - - MofficTranslatorImplanter - - MofficTranslator - type: EmagLatheRecipes emagDynamicRecipes: - ExplosivePayload diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 6efa5a63711..64b6b068c71 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -101,13 +101,6 @@ price: 100 - type: Appearance - type: WiresVisuals - - type: LanguageSpeaker - speaks: - - GalacticCommon - - RobotTalk - understands: - - GalacticCommon - - RobotTalk - type: entity parent: VendingMachine diff --git a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml index bf49eb1be35..8c53daf3b60 100644 --- a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml +++ b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml @@ -83,6 +83,7 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight + fixVacuum: true - type: entity id: PlasticFlapsAirtightOpaque @@ -100,3 +101,4 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight + fixVacuum: true diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml deleted file mode 100644 index 90bce1baed2..00000000000 --- a/Resources/Prototypes/Language/languages.yml +++ /dev/null @@ -1,493 +0,0 @@ -# The universal language, assumed if the entity has a UniversalLanguageSpeakerComponent. -# Do not use otherwise. Try to use the respective component instead of this language. -- type: language - id: Universal - obfuscateSyllables: false - replacement: - - "*incomprehensible*" - -# The common galactic tongue. -- type: language - id: GalacticCommon - obfuscateSyllables: true - replacement: - - Blah - - Blah - - Blah - - dingle-doingle - - dingle - - dangle - - jibber-jabber - - jubber - - bleh - - zippity - - zoop - - wibble - - wobble - - wiggle - - yada - - meh - - neh - - nah - - wah - -# Spoken by slimes. -- type: language - id: Bubblish - obfuscateSyllables: true - replacement: - - blob - - plop - - pop - - bop - - boop - -# Spoken by moths. -- type: language - id: Moffic - obfuscateSyllables: true - replacement: - - år - - i - - går - - sek - - mo - - ff - - ok - - gj - - ø - - gå - - la - - le - - lit - - ygg - - van - - dår - - næ - - møt - - idd - - hvo - - ja - - på - - han - - så - - ån - - det - - att - - nå - - gö - - bra - - int - - tyc - - om - - när - - två - - må - - dag - - sjä - - vii - - vuo - - eil - - tun - - käyt - - teh - - vä - - hei - - huo - - suo - - ää - - ten - - ja - - heu - - stu - - uhr - - kön - - we - - hön - - # Spoken by dionas. -- type: language - id: RootSpeak - obfuscateSyllables: true - replacement: - - hs - - zt - - kr - - st - - sh - -# A mess of broken Japanese, spoken by Felinds and Oni -- type: language - id: Nekomimetic - obfuscateSyllables: true - replacement: - - neko - - nyan - - mimi - - moe - - mofu - - fuwa - - kyaa - - kawaii - - poka - - munya - - puni - - munyu - - ufufu - - icha - - doki - - kyun - - kusu - - nya - - nyaa - - desu - - kis - - ama - - chuu - - baka - - hewo - - boop - - gato - - kit - - sune - - yori - - sou - - baka - - chan - - san - - kun - - mahou - - yatta - - suki - - usagi - - domo - - ori - - uwa - - zaazaa - - shiku - - puru - - ira - - heto - - etto - -# Spoken by the Lizard race. -- type: language - id: Draconic - obfuscateSyllables: true - replacement: - - za - - az - - ze - - ez - - zi - - iz - - zo - - oz - - zu - - uz - - zs - - sz - - ha - - ah - - he - - eh - - hi - - ih - - ho - - oh - - hu - - uh - - hs - - sh - - la - - al - - le - - el - - li - - il - - lo - - ol - - lu - - ul - - ls - - sl - - ka - - ak - - ke - - ek - - ki - - ik - - ko - - ok - - ku - - uk - - ks - - sk - - sa - - as - - se - - es - - si - - is - - so - - os - - su - - us - - ss - - ss - - ra - - ar - - re - - er - - ri - - ir - - ro - - or - - ru - - ur - - rs - - sr - - a - - a - - e - - e - - i - - i - - o - - o - - u - - u - - s - - s - -# Spoken by the Vulpkanin race. -- type: language - id: Canilunzt - obfuscateSyllables: true - replacement: - - rur - - ya - - cen - - rawr - - bar - - kuk - - tek - - qat - - uk - - wu - - vuh - - tah - - tch - - schz - - auch - - ist - - ein - - entch - - zwichs - - tut - - mir - - wo - - bis - - es - - vor - - nic - - gro - - lll - - enem - - zandt - - tzch - - noch - - hel - - ischt - - far - - wa - - baram - - iereng - - tech - - lach - - sam - - mak - - lich - - gen - - or - - ag - - eck - - gec - - stag - - onn - - bin - - ket - - jarl - - vulf - - einech - - cresthz - - azunein - - ghzth - -# The common language of the Sol system. -- type: language - id: SolCommon - obfuscateSyllables: true - replacement: - - tao - - shi - - tzu - - yi - - com - - be - - is - - i - - op - - vi - - ed - - lec - - mo - - cle - - te - - dis - - e - -- type: language - id: RobotTalk - obfuscateSyllables: true - replacement: - - 0 - - 1 - - 01 - - 10 - - 001 - - 100 - - 011 - - 110 - - 101 - - 010 - -# Languages spoken by various critters. -- type: language - id: Cat - obfuscateSyllables: true - replacement: - - murr - - meow - - purr - - mrow - -- type: language - id: Dog - obfuscateSyllables: true - replacement: - - woof - - bark - - ruff - - bork - - raff - - garr - -- type: language - id: Fox - obfuscateSyllables: true - replacement: - - bark - - gecker - - ruff - - raff - - garr - -- type: language - id: Xeno - obfuscateSyllables: true - replacement: - - sss - - sSs - - SSS - -- type: language - id: Monkey - obfuscateSyllables: true - replacement: - - ok - - ook - - oook - - ooook - - oooook - -- type: language - id: Mouse - obfuscateSyllables: true - replacement: - - Squeak - - Piep - - Chuu - - Eeee - - Pip - - Fwiep - - Heep - -- type: language - id: Chicken - obfuscateSyllables: true - replacement: - - Coo - - Coot - - Cooot - -- type: language - id: Duck - obfuscateSyllables: true - replacement: - - Quack - - Quack quack - -- type: language - id: Cow - obfuscateSyllables: true - replacement: - - Moo - - Mooo - -- type: language - id: Sheep - obfuscateSyllables: true - replacement: - - Ba - - Baa - - Baaa - -- type: language - id: Kangaroo - obfuscateSyllables: true - replacement: - - Shreak - - Chuu - -- type: language - id: Pig - obfuscateSyllables: true - replacement: - - Oink - - Oink oink - -- type: language - id: Crab - obfuscateSyllables: true - replacement: - - Click - - Click-clack - - Clack - - Tipi-tap - - Clik-tap - - Cliliick - -- type: language - id: Kobold - obfuscateSyllables: true - replacement: - - Yip - - Grrar. - - Yap - - Bip - - Screet - - Gronk - - Hiss - - Eeee - - Yip diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml index 8a0e750abd6..e11f1c4165f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml @@ -35,13 +35,6 @@ - MobLayer - type: Stamina critThreshold: 115 - - type: LanguageSpeaker - speaks: - - GalacticCommon - - Nekomimetic - understands: - - GalacticCommon - - Nekomimetic - type: entity save: false diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index 2184926b95a..d9b25c5dd1b 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -64,15 +64,6 @@ Unsexed: MaleFelinid - type: Felinid - type: NoShoesSilentFootsteps - - type: LanguageSpeaker - speaks: - - GalacticCommon - - SolCommon - - Nekomimetic - understands: - - GalacticCommon - - SolCommon - - Nekomimetic - type: entity save: false diff --git a/Resources/Prototypes/Recipes/Lathes/language.yml b/Resources/Prototypes/Recipes/Lathes/language.yml deleted file mode 100644 index 6871ed5228d..00000000000 --- a/Resources/Prototypes/Recipes/Lathes/language.yml +++ /dev/null @@ -1,190 +0,0 @@ -- type: latheRecipe - id: CanilunztTranslator - result: CanilunztTranslator - completetime: 2 - materials: - Steel: 500 - Glass: 100 - Plastic: 50 - Gold: 50 - -- type: latheRecipe - id: BubblishTranslator - result: BubblishTranslator - completetime: 2 - materials: - Steel: 500 - Glass: 100 - Plastic: 50 - Gold: 50 - -- type: latheRecipe - id: NekomimeticTranslator - result: NekomimeticTranslator - completetime: 2 - materials: - Steel: 500 - Glass: 100 - Plastic: 50 - Gold: 50 - -- type: latheRecipe - id: DraconicTranslator - result: DraconicTranslator - completetime: 2 - materials: - Steel: 500 - Glass: 100 - Plastic: 50 - Gold: 50 - -- type: latheRecipe - id: SolCommonTranslator - result: SolCommonTranslator - completetime: 2 - materials: - Steel: 500 - Glass: 100 - Plastic: 50 - Gold: 50 - -- type: latheRecipe - id: RootSpeakTranslator - result: RootSpeakTranslator - completetime: 2 - materials: - Steel: 500 - Glass: 100 - Plastic: 50 - Gold: 50 - -- type: latheRecipe - id: MofficTranslator - result: MofficTranslator - completetime: 2 - materials: - Steel: 500 - Glass: 100 - Plastic: 50 - Gold: 50 - -- type: latheRecipe - id: BasicGalaticCommonTranslatorImplanter - result: BasicGalaticCommonTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: XenoTranslator - result: XenoTranslator - completetime: 2 - materials: - Steel: 200 - Plastic: 50 - Gold: 50 - Plasma: 50 - Silver: 50 - -- type: latheRecipe - id: AdvancedGalaticCommonTranslatorImplanter - result: AdvancedGalaticCommonTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: BubblishTranslatorImplanter - result: BubblishTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: NekomimeticTranslatorImplanter - result: NekomimeticTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: DraconicTranslatorImplanter - result: DraconicTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: CanilunztTranslatorImplanter - result: CanilunztTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: SolCommonTranslatorImplanter - result: SolCommonTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: RootSpeakTranslatorImplanter - result: RootSpeakTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: MofficTranslatorImplanter - result: MofficTranslatorImplanter - completetime: 2 - materials: - Steel: 500 - Glass: 500 - Plastic: 100 - Gold: 50 - Silver: 50 - -- type: latheRecipe - id: AnimalTranslator - result: AnimalTranslator - completetime: 2 - materials: - Steel: 200 - Plastic: 50 - Gold: 50 - Plasma: 50 - Silver: 5 diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index acb6a2498d4..61f95894ee6 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -227,43 +227,3 @@ recipeUnlocks: - BluespaceBeaker - SyringeBluespace - -- type: technology - id: BasicTranslation - name: research-technology-basic-translation - icon: - sprite: Objects/Devices/translator.rsi - state: icon - discipline: CivilianServices - tier: 2 - cost: 10000 - recipeUnlocks: - - CanilunztTranslator - - BubblishTranslator - - NekomimeticTranslator - - DraconicTranslator - - SolCommonTranslator - - RootSpeakTranslator - - BasicGalaticCommonTranslatorImplanter - - MofficTranslator - -- type: technology - id: AdvancedTranslation - name: research-technology-advanced-translation - icon: - sprite: Objects/Devices/translator.rsi - state: icon - discipline: CivilianServices - tier: 3 - cost: 15000 - recipeUnlocks: - - XenoTranslator - - AdvancedGalaticCommonTranslatorImplanter - - BubblishTranslatorImplanter - - NekomimeticTranslatorImplanter - - DraconicTranslatorImplanter - - CanilunztTranslatorImplanter - - SolCommonTranslatorImplanter - - RootSpeakTranslatorImplanter - - AnimalTranslator - - MofficTranslatorImplanter diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png index 78f7cd2453efbbe1b9cd75a835227c0d872a0a16..81512185135281cfe088087f850d732431838ab5 100644 GIT binary patch delta 397 zcmV;80doHC1e*hp7=Hu<00013M{Ml?0004VQb$4o*~u(_00009a7bBm000XU000XU z0RWnu7ytkO6;Mo6MF0Q*C?_jTOiwm7IAda7E-f(|8XS3l=hFZH00(qZPE!E?|NsC0 z|D}JX`v3p|3`s;mRCt{2l)-L5$f&^090n8HMo#DAP+%`a2&~PsR)T_U43i r`>O}hgRHI-ZKL3qQraEx&+`q(U?z<0000c0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000FP)t-sAs`|d7#c4wF+xE^00014tKnM!000GaQchF<|Ns90`?d~KkuDd10oO@H zK~z{r?N-~C#2^S$+yDROO^}%af}OLoPkWk&Rt$~tQnj65;t_ZR2rJNLpsy8u$ZK?Y zDNJ%}gAty&LhE3F(JgMUyQg-O7`Ow(E;0Ch-<0E=3Gdx4cN0n1-fy)%gxSzJMW5T18l)qzGUL_f@tjpz+< zvt+?Opb5`=fr(lm;cWm)TB!Qar-C10uf{%<2H1i?qY0la0$NVM`HKmmxu_qo8VF-R zverm>E5HGS%`yMl6>!f*cc^E4TLVRg zb|{yKLP02=pLR!Z4vv9a2oEQ%2@t9ysd9krRBji00VI_I*sVCo)gTBZIfZ~cc!}6J znBCtA$N?+y0=7RJF9f7;EFL9ZAnsWxy7215)G(&67Iy3=9mM1s;*b3=G`DAk4@xYmNj^P&&XT#1%*@E2){8 zT7(1#I61ob`uOYV8tUsAN{CB7y?XB)NN-7yUogXeC@^Q5eFZ2O>*?YcQZXkvK_aRl zu%ppaAkyJRpy$O%22TeU6Wvgj$iRk;H*W3}INIapc+gFRF+DxqJ%y2PK^LD0;{q=J zKUyuly{Z9ow32d^8k7{?J?hgs5YhKYPvJ#If05AXa0qg;gB!3T3OjJd{z`!9OA}=m685kNuK}1D=0xBL50000< KMNUMnLSTZ)D_7_M diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json index 9ae7fc3f93a..3f816376c7e 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", + "copyright": "Taken/modified by Taral from tgstation at commit https://github.com/tgstation/tgstation/commit/dbc2435fa562f4ef130a7112d2a4cc9c80099894", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/riot.rsi/equipped-OUTERCLOTHING.png index 45ba5b9a32f108cb8abc0924565b771e5374220b..fdbed82bd34d13c306f3465bcdd2e638a190db1b 100644 GIT binary patch delta 1556 zcmV+v2J88V1)2qa=n++-=my3V%|mSS-4^T#j5Whpy{x zp->naWT8-SbzS%B%)$t>azHGIU|E&{ux%U5vQSkO!!WQc3q?`Tb)9y*jiM;{>%M>g z{?7h`ARGX&v$I1km*er{$KLnL%S%ktWOH*90Mj%B%f7RcuIuj0moEW0Iyyp86j4qp zm7>$>U>F7fmVag8uWJ~_#0HqP1Ee5IIF3WJ*#w~1>jBVcG$@zLD2n2h0o3btGMP-s zVUFhL=!mNh==FN&x{hU8=(_GXz%fnX! zCr_Tx?RI(h?j4;@heo5}efK*+)C;OZXanT)c`pL`{XX${9Dr0RMXgqwi2?lb{SI&( z2T779azLOpK+tNnMn*unTn;~~F%VPGFbpI~!f_llO(UPrQ>)cN_jjwMR#sNrjg1We z_V)GwSbtqz9T@=!2L}N7+Z-MqP9++2U3bNR0n+I-nx=VcL95jQ2J6LCBfz$8WLaio zV}qTY9d>tjfx!YOBEYgNPq^5NZQBkx#OvJVfJUQ1zuyNyRaNr&yyt+;%}rOdxyu28 zrhskRUWg|W2@;6}s;cth#S1!}4w59%>-DfKi+{bnJ(ic3#~Sb`*`plr{rh(mMe%eS z#{st*;D_~G-){`VU~zHL1t^!xq|<3ytro|}$KLm=Z6@Wa1H>UrAl8I&91u!D@gKl6 zO(f|*+c}PdII5OPrK#=!D=RD4jJdkH>OOt?)T>jk*Eu*ih~3s^6rpwjRaMb64Zz!O z#DDgr>-x}vWLo$K@%;I7S9rcws}YaK>G%7jQYi|Bg4^kIs8lMkFp(F^01r(*pZ9*N zs>=5Ec5G{F%k`I4DwR-uhB83A-KO1c4;?ndQ8|>pjPv3U0E*-%RUN%KRY2C%!kJCrP)H6k12PssX{qI1%GsQyA3AU-cqt(Cpd%4#|Hp&|eV z*W@2ReB$KfWGE@pKX(H67uW!2XMZ;FdG%WP&kzAuIXerUn4RcWIGL3By|DhE5%6c} z>qPwpUa^<*%kJ5kO-4&oC=>uFl}g@vAXa8smf7FmpUFpp*n8*m-$1@orqu1+Et(9Y?Qpp=U3>@WO6z^iJ zP+ePFa{({Z#q$;5UJgPq{1oP@K4F+x*@cA#SJ!o#%_h}q^1W9#eQdEW(i_39Pd+uNaa2)qXPX}8;C zv)OT)&V+0>OS|13tL<0@P*s)F(^FvZCP=*1y-)mdPft(16nR)CjsP(Q?i;_{Ng`mZ zH9$OsT3A^4DQ<=)d6+fPQTWFS{2)dUQ()3vAR^*_&cCjfnMOT}vJF@O0000=wQdEM+D0I@wryK$ zK|hPNp?5(5Qrud|(x6V60i!+`AVDNhE2gkCK9D>001^nOjJbx001^NHcCoL78VvNDk?xgKsY!! zA|fJ1MMW|)G9e)$8X6iVCMFjb7cDI)SE4#n2oYy4)5;v}@i)w`mU&-PE2kdblz~OKU_~GCY zU_@qzgNYXqX08ZVw|N-T(jq07*qoM6N<$f`Z0_Opc7=Hu<0001iRA;s zhy2}>?OaO#^-8(y@(FA)p9eWCz-`QlwR+B1+qV0s( z4If(!J3yarW@v!vn~rr1N|*P(%9#(MgB-}oUNlWEU!Wr|6xcVl2G#YVz^OynFgu%u^ceSs7=k2L=K3{k`*B4{y+8kv*_CeV9)BC6UeGVA!i^5W1tIw zK?j^ASUiBpoQ3Ycer6o_mkLF+OFCcxZF;A3E<_5e;KNEk5PWxgzZ aev=zDtvcEW$;fR00000O>_%)r2R7=#&*=dVZs z8qVhF;usR){&w0~K4wLZ7RPUY=kMgHzrnldpGjs_#-Z{E)dv<|0+zh?_FBMlK*6Eo zjd43?LI0e9v%N0j3(cnOQ50i4^s#G4{xrorIXi_+2exkK11d@J6NP{teNtMA%f%Ap@|Ef)8TT*N;hbL@)zu-Wn#WCA+%U;gEsNPifSaso@?YlqL zsmm|txqkKM_BW5twRY(={M^2!VUB7!lRCRQW3BQVnIGIQ-TC(Hy_}zrZF4pJ!SA!& o59e0N{b~YQ^5Hwv^{-3|(`{D8KYFbO3@8Q;Pgg&ebxsLQ019rRi~s-t diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/icon.png index a92566d30878578d94b05820d81a8d90151f425d..e70741f1ff9e9d7153845eb7c8e05692c367083c 100644 GIT binary patch delta 224 zcmX@e_=j()+*x_<~Rj6z)&xuGThXyT!;%7W6jK_LrI$Y>7XqHrJ zNYUNJpzWf-;K_X=Ktxv|dm^ioBa??;dO%X=h6_*`Bpy@s#~XKV;b%Dk5f};t TA?!hr00000NkvXXu0mjfnGHSE diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json index afdd4120b55..e482264df5f 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/security.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/equipped-OUTERCLOTHING.png index 59d6ea3b487304fc77f4cf2eafd6190208d4dec4..fb4087b662b9e233ad0108c8419361b5871021a9 100644 GIT binary patch delta 372 zcmaFDyoPy#W4&~MPl&6&o}rVYi=u*3NN_+}YNCX=q_UElxtRq61A~^0$ORz9SrX(I z{2vM!g8eImK!ODxk;M!Qe1}1p@p%4<6b1%HR!6cp39*bI#YIya5+2;=Su{mR zL`pbyN$@FMDMz^*d&E-SJWEe=kPELkDSdF8^M-tG#?1mB)F;g6+BE0Dv-^7v{bE_6 zP#0y=q*AeEMG}jJN=7!ndOoYXK$C!hA_t>zQ#^NH^SNzviY^syS-OCAQ(Q@TKzn;) zaBA-4?^$*)PDW|1cx6@jp+|w6{mZdi)2~ce)b%v$Qi5v9i@D){xtkl(SvX~XeR#mV z7Zm6f1oo`xWD8G908>YsI`;45b=s}P=DNk@J3oITnGT2Lh(kV zMu=gJ080j30~CuT004(I!j?guuO&3epshu&6OhgqqYa%?7Ld*^-E)@|$a48>&kEUF$H3f{X;5R<=G-p|n%%8| z+Gs#$yzRKFk$f#M+Zn;^0d1Uq{74Q-z_h(RnmzFBoXKGjkS*9{;Jtk=U{mj9U^k~1 zz*l?Vd75qH5?oxuq=y-uai4h!UYVW*&6=RcME%YsP9}n_j|j7wrSrQSfg_;&THwAP Xj1pUE|AAcn00000NkvXXu0mjf14_G% diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/icon.png index 23bb26f648e97e4678527d50e7f2b4320711dab2..f2b15dd82f3963c97d0c61ca6c2b1c257f997f75 100644 GIT binary patch delta 261 zcmX@iIF)IFL_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rP=HT} ztAx0uzMi3zqf1(9Vn}cRP}tyDaWIf#D+%%o{tp5SoA)o-4;0}n@Q5sCVBk9p!i>lB zSEK+1t2|vCLoEE?P6*^Xs=&cg&RF-p{^@ou`AasJxJwop&gSblTJ=zPQagi9o(!fU*(~tYWo*xpm^e1`L*wa96$4YzXx;%gQu&X%Q~loCIF)) BUr7J} delta 179 zcmbQrbeM61L_G^L0|P^2NcwRgB^2Nj;(Fk~0c9mMeLcgF-~cB_7YT96%$=R)Kv~9; zAirP+hi5m^fShmdKI;Vst09n8=KmY&$ diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json index afdd4120b55..e0d437b8ece 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Interface/language.png b/Resources/Textures/Interface/language.png deleted file mode 100644 index 2b39424d12d3d75421a5f48ab87ec0c4f852129f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 739 zcmV<90v!E`P)4Tx04UFukv&MmP!xqvQ>9WWf_4yb$WWc^q9TqZ6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRR<0iR+(n?#Q;sW z&2&N%bNN*<@QM(ERKpNuW*N!MVirBu*FAiEzl-uL{BI4a1&aYbkvPT-(0(wkHR4&~h^pz7FXTK{ zId5^+s&&@xlfN)j&{r~Cry55BOGqLG5en+4pb8sN+I3Par0HDh;U9DTDRL>~s(_JW z0X1llT|f9A{GP2--aXJgw?FT=^MmvQjVW@mx*a zR9HvtliLo2APhtW#Q*Z7 zxueKOz!l>drAkVi37b}eoEaHck8hT`Y711a{BAiv=MV89^d&Flsg z;w6 zQhU|Z-a6Cv%8BbI{bv4!1BA+Lo2}0W538WU#pihLZ&zz@(>PT+|s@$ z;f&CupQ;C=PPAHcUOTL%$X6+}V=}kyeUH}1?myQVa~Q{oXWeD^{6ysAU#rzwKqoMG My85}Sb4q9e0CGNE+5i9m diff --git a/Resources/Textures/Objects/Devices/translator.rsi/meta.json b/Resources/Textures/Objects/Devices/translator.rsi/meta.json deleted file mode 100644 index 0202c0c39c7..00000000000 --- a/Resources/Textures/Objects/Devices/translator.rsi/meta.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": 2, - "license": "CC-BY-SA-3.0", - "copyright": "baystation12", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "translator" - } - ] -} diff --git a/Resources/Textures/Objects/Devices/translator.rsi/translator.png b/Resources/Textures/Objects/Devices/translator.rsi/translator.png deleted file mode 100644 index 6c54a0b86366cef370ee7e2575979bc054a826dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!V7#Y`V@QPi+bb724=C`kT-dCARMX0%{FPtn zM7@b>Ggy`WPQ1h1>1a^Uq@bh}Rp#`xG0tlB_rgh+7A^Z3Ffrqd#I~w``;=d`)m1S? uB}Iz&N5B8Xx#z0zhx6*&T(($0U_Q1^;pBD8!#jaiF?hQAxvXQIDfH;*!6JzFb@Y%HpJOKr(s$T16b5^Vflsj)C?1O23kZU+GH)x4 z!Khij&_JOZG&U+_{voJ|`1_d{lOAIX+DxxidMD5c=n&X$2!9(48Nu_SD8!VqEQ>TI zfN+%fGT$LhQ=pWd4A&wM$1xii0He`0hchMkSpvTAi|)?z9G1%nwxtJ<#iCB77b*!L z9Kl(Z3D7+uEaAsT)<6#&!V!#hL(_yC!vJ}$BBCsSa16pEcwCmyrxeDk6+G?RPL)s+ zkmD}j9^o>d9Dm-Q%^>8*2Zd*zJqz&dWv(U@04|`C%l{MpF9A6NS`)BsTf0Q1A#far z-ThMky4Jy;vG3&;(K46cZq-R|hVTK5B0LA40zNEavY1L(hp8>j(KiU0rr07*qo IM6N<$f@^xR4*&oF delta 287 zcmV+)0pR|v1Fr&*8Gi!+002a!ipBr{06b7kR7L9a{d;?R<>lqJwzgSWSvEI1QB+ko zH#Z?6CQktzj0Ga;bac7}1*HH0**G}nO-+f1hlPohyTQri=jy`bCkFrk00DGTPE!Ct z=GbNc005y$L_t(IjkVIz4#OY_1yHCWV%4qs|NlDL?QLR{Hh<;yo?J*2;Gsc0iI*AB zcyazDp5&95h`>9$ok9qV4iU$K0>#Ma{o;7IgF*ygX75mY2IK%DNsXxZzhnop=3Gjt zqKZd1NM6@kYZ2p01ut#L*8#;T*eh-WdK!fH2>{rBU^78GKr?}~)_ZTwTp{@Y_6_s5 l_=^2M*tv?7(ikkiG9QYM3CE9d_ALMa002ovPDHLkV1i3Yeu@A9 diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png index 0cf52827fca440fc3ec9a0d956ea5e53e86f2176..7909d14f269cea522d6e0b9033e83d81451f94ca 100644 GIT binary patch delta 405 zcmV;G0c!rc0;B_w8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00CA>L_t(| zob8rDYQjJihF{cf+y`8T>}zo`N{$jCc!!=LQ0OHJo+1~JEF^k?Kp_PUj6i z5!>24lZgoVVF;6feBV4~GSib%!adWwE4>wH1?mpcsM{`2pBFF@Npa~D^Y0?BAl{S@cv{1fqK3%zQGo_ zEI-bk@-!L&D1QM?SOQf3I`cTcV%mC*3!MLOFtqoL3tWOtlqJwzgSWSvEI1H#av? zR8=7%CQktzj0Ga;bac7}1*HH0**G}nO-+f1hlPohyTQri=jt*%SjGSV00DGTPE!Ct z=GbNc006B?L_t(IjkVI<4#OY_1z@Ry#lNlg{oi$Hcd=xm$$y%0d%oZa(U?CCz#`se zK;q51MLfypv2k{?9T5pE04M^z_XN&umWFSj$9*RvXF>K12>RU^<{*Yed^c%;V@f&a z!lGyhQjDdP%;Sy?JY+)}g4S^XTE`opzn}mwC%$q8Jmth!t^m2PjM2fzEWz;xhYD&3 xRRvt@d7iaSIwW*(qoj!TAM{*A2w|50GA|%_3Obz{x$^)3002ovPDHLkV1j(`fVThu diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json index 2e60d4f4041..990bbf93567 100644 --- a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise // Hand Sprites taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f", + "copyright": "Taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_capacitor.png index 2be12b48a6455bc64608c891277fed2825f3e603..039817e37b9cb3f6c43fa5d8481ab2d2a50025d2 100644 GIT binary patch delta 372 zcmV-)0gL|G0;B_wIe%73L_t(|oMT}aU@+={Q3s4VVAKI*J7CK6)&D{CojZ3JR8&;J zVmXr$uxGr_3Kv{wr)QRb_B!$3}A~v0DmM-Dj+)-z$^m=`PS{I z4y36ADoU&wI(jxR`1%H5$Zg)d0W80B+fv#&00g#gZDa8Cu7dMnzV7diXL$LN#%bW# zu`3Mrj^1F)?u4f?sH~g?r(yCmbwG8^G*BM@9~g)k1?$&ufXUO&0U+@Dy)4+W8;gUSI|2xSrhinJfcuO)cOnQiuPjd$-xIbjX$EUdis0BtHFzSE-cK`sve*5+f zj5KqAp1#Tdz=%i&c{xdjgM0VkQubf{_Y($tPbr4yw|+86sEaoJ4#VpJ zkmWwUK4A94N6#7Tot?0%Q&81pSifR9!@7wV7z6}G7#L14Fn@e_|Av7WKyn%YIRqC7 zQWF7(0th_6B@7G+z5j$lf+z<(xP2Y$OMLQApFLr?3iS29*9h?s+X;sP(IEh`1ewML zU?G4=2Mh$$0bU0{HG|UuCzGd?kaGbAu&wvPl6AY9mLS#n(ts$fa3?4mtz(5Kh vDhi143Atcslp=(q4j6U7r~^hFKuZ7sUu$URzcXAb00000NkvXXu0mjf%t3Z? diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/adv_scan_module.png index 0ee37e653daa6931fa8331226de24fee077d6607..1871b477b638f959833e77345b5d89dbd339b170 100644 GIT binary patch delta 918 zcmV;H18Mx#1)m3y7k@wq1^@s6)-goag_de%+_nZL)K@bE%5Pt+AcqnBe++zqbRg{a1 z!9T;9grF|~>jb#L2T%{DB$UGfpkkE(rA#DUH<-nK@D~8or|Sl@eg>js3`xJW4`_`U zrHnyq%-G%{WP70-fN4-j_1%*>1dfd0pm7`=7{`FtLUM8da~;Oh51nZVf9 z9yWdI{H+H3^y3c$0O|Z60KnJGHUMCCtAIC`&K-IXDoNjNu&psOcRP-r`TLl-a0^;% zI(kOuR=`dVw;+~|aw zZpQHDMc?(km_Nyia2XhQ;KgmM7&-PDss0Zbau(UfK$*W|b=Bv0p_P?RqqWB7W&t}p zzmd!3fPd_UKVJh&^tIOL)6cNNq|Y*c7o|+ZIo-wkA{K4reG!W`kn~ArT-xc*hPSGb zcDh--m{7FQgtu$>li)WcD?g@`F-n=3-#bAm6LF&LMk!;8pZ@Q{Xv4l4N7w}C%m*%O@FAIqE z@f1obqyzaD40vP4u{ffx9~2JN0s;1cy!f>gfXj?4^d?U^vsf$i2G)!tJu^A$^UI+> sp)BA&kO{IAS`kR_1wjx5L9pU4$ev$+sSgitw*UYD07*qoM6N<$f)NM21poj5 literal 725 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9F5M?jcysy3fA0|QgL zr;B4q#hkZu?X!goW!m>QWjik93kwuy7iazGD-ygRx;rRlt_(|fp{@l-)9NW=R$Obp zxN5Yfy?hYVl@?g=g1cj9(w4R_pLW~tZGSc|Jwqer*Ux*lmQ|K@^PePfbTK7}Ff3+} zU_GG0;Kpdc)ey+g0}+~$!ua`f|F4y|-@U2XBVcO0_NOP)rVmG#KGks8f3Df!?9ZJ{ z@9tG!*l$*DyYKrxQBM1NcG6bWZ{F2v)+*eZFkkz@*HbZnX2kY2um4^6`PkJbj8@!p zca;A2i}|@zuv>qTN$!dBq93x>n*T`ty>ahWS=STW-s`yRx&6vj^wtFXk32vAyuSbb zb+&v`+OvNvZ_CTRJvMpj^8dE`UuhSZ)W3W>`^T3$=F{iD{eQUmcyhYNWT1UNZ@+tx zZmt(QuXj<(;dSn&U`KrT@Zg91iG+sz(-USs6=^%a_Rx+$XRmIV{w4Bh`tSWat$s=@ zc_v<^T=waU(u`w&R2b{^mQK3g5wi13c68k*$$;;EqN!1z_lmP%4I(U|1{3Nq680O^LGn~`E%P+CrZQshTKb_suGpy=M*nTrUH`rfdpKwX)=jNFC_A2>p zYM(x*ZICbU`}CImz)z4F?^zF`M-0pgq_{#6`pY2ko6+DKbHW?;12^~^RzCgB+?M^M z^XpIb^b>ZGd(Zt*+aS*neEK_kPqgy=E5H6+PFtb8pA({Zqdddoy$UGCK~uy1wAg+R U#Ul5ez;w#s>FVdQ&MBb@0PF}o;Q#;t diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/advanced_matter_bin.png index 7533331b835f14da64cc2356e30d496d6f8282ab..819275417bab0d14b6904c6877cf9435fb74a812 100644 GIT binary patch delta 378 zcmV-=0fqjq1F8d%Ie%P9L_t(|oMT}aU@+={Q3s4VVAKJ_!vRyKul|oqE+;dTk){p+ zS?=v=%P?{Bd<;1i6%~T|Npiscebc}`J?zr}<_q;sWiT|*1hcPSze0NlfPlET3WI?X z7nuEsfpS350Y{Ht`G5Yxb%r~4?%-87V_GkU*w*cbDR%(Oa(_?|`+Hk6XlSW3{8dv1 z%Yi~bN>T)D5l9Vkkb|OzkfVum0CFm}v*HJ*fzP+@g86q8?*J`l09zCq;>)ml&1SG8 zK$e5p*wO{b4gi4%JLUf$+4`K}A;|K)F0dHyq%vR_e}t<6g%k)NTfTGKQoLD^Xa^{` zKLi`(!?g0hu5%VI*mAH#+|$AGAYUVg0!_dfQ3M7OZfj@ zms+rxWm7oA^n&-pa@nq>sKsi zxO(*hLrrrhNsb^p5k7tP1SJ$ed~yKE4*2l?4LlT(Ed_~#z<`jf%%}QKnKvE2S)|WF;sH^3_N`F98AL;f-L^v_H~ByXD=|23MeXwU=9LVjt)Qx zmzab|^^y>l6aE~V$FQ9U^)xApK_Rl`#9N}&(yT7Xun=a*x=3XQfKoUJfJ!}iIZ3Q) zw6zTwmMmI8w0D^#hd`RkKZaRAhk!~(eBjZe2h=MGFI_yt2+Z66LB4x_>nBiz6Q^2G zA|%#wq8$JNP(%M;y$T6tbN~x>QYERLtq#Zz*gAGWo$}GG$QBk~}N!8QEF{EP7+gaA$ zhXW+q;ul&}92V1e)#~cFwocNeu<&D(LeSl#t{?3!eks41U!WZtT_|XM<(1GXKP}OG z=K~983lt}9ZOpp-~+= zhlF|kYwxAsq8CWatf^!?S-)gus{RB&`S8+KCq)hQi3VFAWgq@IkLApo+?&h3Gjs0V z`%lbWON?2EacR)Xg}f8a^}8^5J1qV=FWn)1gLv-6jpyCi>ih2hT*qW)w(acm=i(A= zfyH-DohrJzspg;1rWNPPML&q@EsNNG^<96@g4&`#n~j4xg_7q4>&d(;zx$%9K49*9 ztpk;!y=AO#i#J>;Oy16$yx>okg4k?_g$1ekEga(S>#g+nF0$IcF8jdUhZ8Di)f{?f zSzu6_q#u3aT-15<`^iTp3RxU3wS9g%e8H(dyI6S6-@mPWEA#A(2wC0saDi)c-4C9h z8$S1aCR@z=z2U9(3$vbwKChm|c=4sBaR2uDsr=o=YXTfLMr@I1+FyRp^#4Ogt^1eX zH@x1w_|;T>UB~11KP3MP^V6FDpQq76hv7&fBSx?aw6ivVq#piac=_e5Z}4mBoVePC zlzla|4a+?5&Yylx|9fGrLvulG!)=Cj{6F4*Wo)*Mkyn^}{ww2Gd!9$X8lt{G|NQgW vHTDRT?RF05O@YMoUksYaF(=Tzr-47Z!D(qS-{MSQ>S6G7^>bP0l+XkKQFIuz literal 1283 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!3HG1+{xJmq&N#aB8wRq_>O=u<5X=vX$A(C zt)4E9Ar*7p&fT9a;wW>}T|`jO)RDV>LHcYDrL4@t8>)_;s<&cgCz*tm9kf6Ah--Di z)I&}px~gv8+@h1NNrbo@oxC6;(c*J#zFzU`zqfAQtlYl&J#*sbn~(3k+4tt$y|>@b zz6oUE;$?7VK5&7-z=VMZ#_Z&kklr8he#_glucz-0Io7i5{&vQwA8&p{Y>E5*Y3<$9 zueR}OuBwY?>)0VyxAD)G$FJSo&%2&}zjgiB-rmx5cEyyxF4GkR<>y6q)Wz%n7uMF@ zpOqKCR?kFwBJ0~P+RDopJuUjW(ERU?Z;x)dZHd`yHaEh)P+sBDuLbVBH~wAZwTK9f z>%4W*g5#22{I5mYRY_Hq&$3Eno=Cj0uT89e9k%GZSIU8I+JG*L}t3CdSmK2ZS*S%I+9aehr-G+JDGds`q>-=QwS57jhe?Ps*@x`xL-U-1gZnO8tE!iuo z(^PlfSm9mGpQ!7dhn?M*Fly;8e69YD`QE=9Yqie5U%m8I(dq1Z`?@9H^7dt~OE2XW z`&(c z-5EN(i-L=b)9)S)XO#Wg8X>*s_3>K?tMk8>me_Akj1-y#j3$$R!i)G-etEAfJF!x0 z#~&q~lE3@TGdvEyTfaRu@@<9S7vcD(8k;W~lkDU@n-(%AWH3lbF|@HY;AGC=XLxNa z&u}f>j$uvyRQ?I89#rJ+3E}v?=KOkz)Q`JjUMkCY2wOarJ-L3-`K z{$Z??-+w>seyE*NsJczY|Rk~i4!_=twE8DRX^`^nJ$ z^`oo$^q&nAPPp1Bq!dl&=a_ouDYH{^zsf;W7t}L`MA$ABW!wNN)fhZo{an^LB{Ts5 D=1N37 diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/capacitor.png index 242f217e4afd493c1d23275a445a3abcab026f92..305087c37b634d1fe0fa8962937605c45200cb89 100644 GIT binary patch delta 226 zcmV<803H8_1O5S!B!2;OQb$4nuFf3k0002ENklcGX zbm)ZeEEaninmGVuxxStbgRqz+!@fPc z!D3R95)9jS?_=1!1+qbaw>i%WCD6(Zs*tXWK zA*R`C`_GYUMGJ#rLXn_N9fPkw+#sf3BB4=(|z>UY}3`M-m==KtLx7? zmW}}Hzs$}SJ#rEEpRY?_C?xtb_C3Q!j?G+R@25Rca$#NdX~vCpN!7DNZJk`}!kL^F zCjJ!cU}ZU!T(sxgwvWbauhxf3>WO8n-#cl6(*2DMQES;^&u_0;fB#w3xynkNho4^` zp0z!E`-)TVH6HxSxpHEjO``hu???TX>#g~iV$~G$?$Yv1trSXX_v=IT(9f5K|Q z+jjr`^lpRI4mK4>l%)6~S7Q=VAYaa0v<{y*{jdnN@wZid1L z2Fw6UWQ0gHTo&GG&u~Znz+Xlval!2TU&fSQ%=eBrx-7C>__{+(s&U>I_Kuo^Cl-WO yPkg_}USXbj!PNYjpSRg70F`R3JB?va4Rf!${Fei_UkC%!2ZN`ppUXO@geCx_?EK&W delta 403 zcmV;E0c`%w1fT;UiBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPLe^Nl?3J00EyVc5F;r=}wah5%D! z4#SVFn;8yF+r;3IxaIK*#(i#UXed05SyR+h2V0e_%c+1Q>w$W_S`#JxC5CDyj&Ez=!v57`UJgfB}#X z(b+JI-@kqbrlHY7&=GhYASb8rUnr{q%!Z`{5Y2{W`PHiz7z6}GkS!(}5S0c%mV(j& zC<+b$`R}Gd9EIjPc#eTN0u*`_IRNAq{Q^f(G&;cek xcmgEFa;i9h980P007}5914bP%>VN@v004BWo|uaA($W9`002ovPDHLkV1hvxnTr4b diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/high_micro_laser.png index c23c941e150eda9e282659576a6b1707a9b721bc..2bd8d3837da037939796bf6e9c74730fdc936985 100644 GIT binary patch delta 250 zcmVkAG?v_XW7^K&SyeO0}yFj0@#(0{{$TSpXKfqWW<)N6&}@!TFiA!rud#-!A|X zla^Kiyy_kR7<`Y!_fMGFoMycm-alZmSS)YH1sm*JseF8qNdN!<07*qoM6N<$g7!Le A`v3p{ delta 306 zcmbQnbe3s?N{ zjpG6(3@0ue=Ket_XbQHguQ7s1CId-y7Tz2ThmcCO@E2W|%gE(bg2#wPye( zr=}I_Pmd1(j2g#;X9^jp7E74zwzk>J7{@1oW(3t@Nyva+NCh}uZcJ87>!K+k*PSl6 z=vZ|TtgU+hIDgm=cdVBymEIdTKRszJ@NR4>YTjOIEv+c3B8bPL#ADI68oA!L2o{%? z0XRC0bky`Eg5NBxtOCs=KT92RnaKcPaX3`Z5{{q~sbqq{_D)y5Ju#q@V8&tVpMi8T zp^JoqLfMup6(XS^>10CaH!pk#eg;awpW~KvaB-byD=p`zkjn`#hc4d(vvc!`?*TQ7 eH8eCdWWE94#e$z+?t)eT0000s^-zNcMMmrUSRNabt1_TLoX42c>e|*3V%S*Es5P0$G6@$LAFoQmu7=w|%9+;2pKym;{4mf`J zAcMZ63d6%YH^B~&5EDaj1TygT^7_Ad+cts;k?M&M`N_-%ID*=K4RZBvsVgIEhB{1YbiH<>51%*%b zx&YY`AT}tKg8(e=-@5yjEXzr90FomZ7}l;vX%Fms^eCP_?EwsjPyr0R+HlkXqYj`p Z004NKpP(c3k*oj!002ovPDHLkV1h25y*B^= diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json b/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json index 50a7fd96d53..fac73084019 100644 --- a/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/stock_parts.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0 // Taken from https://github.com/ParadiseSS13/Paradise/", + "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0, micro_mani by EmoGarbage404 (github)", "states": [ { "name": "adv_capacitor" @@ -27,7 +27,6 @@ 0.1, 0.1, 0.1, - 0.1, 0.1 ] ] @@ -54,13 +53,7 @@ "name": "bluespace_matter_bin", "delays": [ [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, + 0.3, 0.1, 0.1, 0.1 @@ -153,7 +146,15 @@ ] }, { - "name": "femto_mani" + "name": "femto_mani", + "delays": [ + [ + 0.3, + 0.1, + 0.1, + 0.1 + ] + ] }, { "name": "hdd1" @@ -183,10 +184,24 @@ "name": "pico_mani" }, { - "name": "quadratic_capacitor" + "name": "quadratic_capacitor", + "delays": [ + [ + 0.3, + 0.1, + 0.1, + 0.1 + ] + ] }, { - "name": "quadultra_micro_laser" + "name": "quadultra_micro_laser", + "delays": [ + [ + 0.1, + 0.1 + ] + ] }, { "name": "rom1" @@ -207,6 +222,7 @@ 0.1, 0.1, 0.1, + 0.1, 0.1 ] ] @@ -244,15 +260,7 @@ "name": "super_matter_bin" }, { - "name": "super_scan_module", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] + "name": "super_scan_module" }, { "name": "treatment_disk" diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/micro_laser.png index 0bf4296e9b398dcd7e5f3ccc352397b37c675e64..c23eea56f8556568887e45b1c071aa5493434681 100644 GIT binary patch delta 235 zcmaFL)Xp?PrT(0!i(^Q|oa6)v*2M`TJxz>kJx?-Don8Cu|EH(M7XOcLU(Yjp+Zwgg zI-3qmUw{2y{m-hm|F^E*{jc4~;E#P-$-DZZvq?(fj~BE1OMn1Z|2fs`9H(RymMa`S z00asO3f2aE4Xp>-`TN2H$~fIy&c(Ha?v4~u5J`BZ)U9rOSFwZG35y#1xyHmj@V h*Hvb)(*q6OFfg>{crW&Cn3l@`1fH&bF6*2UngFhSZ=L`E delta 330 zcmV-Q0k!^z0_6gbB!3BTNLh0L01m_e01m_fl`9S#0003ONkl<_?gPQ}~}@AT+9RRXiOIMFULQIU|#eb_;3|hLFYMwoR!C+~k zhc5h|7)RiB0L=2^hYy1Jfx)3*N1y{KNeQqcKr{@1^bz9-ybk#I;XRz4%OJw=1j>e4 zhHfc2fM67WECGSZ3~v|$k@)EJhc}oZgX{sa9B}E@T~P4-mse3|Fw)m!ICt?9R&@{W z+++Z$K^KGSCqv%>$c_LRhz)%B@s~k>gP8$co*2uCasV-gJz^jq49%i=)B&Ro71pw6o$XF^^(Oy2za&+ zUVoAG5(@ezNl5Si^?nH~ z7K_F5WF~((6vwdwq-i>7$L)M%Lc2^;3E8PhZ(KwE84799aw27Co;$axF-|sn{ zPQAyr>weW?OiWpGe#X&fqiq+yJMmC93d>G(ZD?Xt1jCeFEIXJu+xu1@VA;E^mQRS` lbNg`7K2Ny0#bWu#d;u5pZ+MgdwjBTf002ovPDHLkV1lQ?p4I>W delta 363 zcmV-x0hIpk0)_*SB!3BTNLh0L01m_e01m_fl`9S#0003vNkl-gv5FAPj40johT|`m- zKNyJva-57_C}e|{o<3L(nK0AvX|fJFnua!ddX^8ZlZgTc9rml*H?oN0i8OaOBP z$oHUV`SSfS*x|U$q)AB#as*n`-~@xSC?0jdr~^hFFzNt$0ssbqdC#va9D4u&002ov JPDHLkV1i%anSlTR diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/nano_mani.png index 0c3defdefa4fdf1061e71e468e243ede1394a20c..93b2d06f098388d6a153ab87f3bfb3836c5db4e1 100644 GIT binary patch delta 346 zcmV-g0j2(|1BwHXIe$D!L_t(|oMT}aU@+={Q3s4VVAKJl4j|eAQ>L%}k1m#z8OlgE z2Y`T~fhL@N{=#*J{rjf-*0b*M)`+xie1_li+b%v|KNeBfw z!C=cl4n(H$If7^h+_`gyVe58O{=xmP!Ipl`>tf)YRK{@Z*cFD??`7fg$TZmwc(7Cc z|B-qd@@VdpL;jf;$44 zrpN)vApim(%Tr+h6yzXFkJqhauxtuvAO{c~0`6W{{$Ia-1x0Scwxw_%ZmF3@8wbF^ sP9)2y35HHxFzSF&2aGyk)B&^t0LO8NgsdPP_W%F@07*qoM6N<$f-iuXKL7v# delta 380 zcmV-?0fYXE1FQp(Ie%VBL_t(|oMT}aU@+={Q3s4VVAKJl4jB9n@bnD$kIdh`eFGyt z^;I00003&IrGse`7fUexiQzps z_{jl8hk%Lm`#%3L3vV!70@G*q9*6r7$fk`0kSw6M)T77&v;w0J7uj)Q6PHNlPbQhm&ivn;IWy~pA4>r!00p1`6o3>! zG?q3*eYqHUz6yZmsak^9lOaE}n_#>XLMj4iEW}|t?}K;=fPY4~YZ?W(LWsU`XLffq zG;)u|r2sO8l5yDXtwnIb$?nJ@^l}}$ZUHO^FcXTJi=ESjThrBD5;_@60f>cY@`-$Sbq!^& zsq3d$#@vmh-T{#dWB9>SY(acT|M53e017|>d{P%az@Cv??+F3`00000x$jV0@(#2iBL{Q4GJ0x0000DNk~Le0000$0000$2nGNE0IF$m-jN{}e*%k1 zL_t(|ob8%DNE|^JhTj9Ru~4q@k3a+of-AxJ6BH{&L_`PyC4x;PO^T!ou@Xs@V0RWa zq6mUPAx#QF5v&eYQ4ua+5jZRqL&Bv9*9hS<-^eazmlJ20S;6_9M)w=!nR(CC)qN}A zI2-^RhXa7)Z~$-|4gij$9l-GLfAbQ3EEEbzr_*w_x%nl9gfQjT3V`Hwb+zGj@Hx$s z2*IRZIe@7AIyAQ(f@!~U0Q4<)T^MZU;^Iea-3F%pT5o}lj&_`#ormIJBaMv>*xufO zZA|)=1Mp|w0UzctI5-e)fW!pJ<@(4jY~fE$084A-{j~1i-me^h_kI@sf7f;3#mjIO zr0#!ShBrEn9PHuEFT(#cD_?||UxZKlQ}HVYP}A~69#V!7-JF=yI&%B4h4j;lKp{l^ zVy^1f`WetU_8Jg}jq;#p2!DS6gl(i>9M*(iIe=g1c{H~@l`>+ZWgTNDI zfRpSN{f;d)wRXqW^56D?e|2k^_G`Tbs{dX}8S!!DJMx`-;XDaU`n3Wm7K^B^g1iSm z71Ccymw?g!ixH~=^f2LQ)$K7fD5mlkUvD3}lc0000EanisyaYV-{gOj?^ht}E0}-a z1UJLFTW=VSF44hIdv@1dhP?L*{~tYifYT9VM?v1A?@-ovxR`a!6_U*%$^jr>BlGJv zb2A7Ca-*p6&V9iEixxt`PLcyafAK9XB?IRRiVA`0_pjgK)ApZOM-UYPPoF(OVe9DY zf!SBDUcgYRt!=(flqAWoXIYj>rVP zAY{I%2i)vDQ>$+PP^)ipzkMf}Ml58$xCvfwT>|j1dn*nvBUHX<1I~y0h47Qt(^89A zX1@3Y9KM_Z(0S^J!^;Sj|L=c=<%@2&J&guTr!W}A`wRRl`AR9Jlv1kVz5vGZr4}K? R+4led002ovPDHLkV1n%7sx<%r literal 421 zcmV;W0b2fvP)VQ!Pj5=V{0izC}xdZg{P5y)EOBc^D(%k_d z%ePLJV6cw4f>RAa2f%!Q4KPLKF#KCS1%nL(O}<~jmOpy*0ITl_Isjz(hxc#5Y;A1= z20>9FhWD@EAru_kz;Jx#90tqA22?f_t=?lSI;uoI5>eF zfeaF~85rZXE44DlAPoF&j zM*|4ty;t~;Ei~{(!MkY&f)0Q=0=MJ?>})8= zTcq&+=n`dMR>U6vL^*&G0J79NhT%UxH8d}ZDM|zM0HY2Vb-<_tMjZeErzoaF>8JT< P00000NkvXXu0mjfrRSkd diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/scan_module.png index a05d626eea0e41ee7c45b01db0b5756d1ce45885..b95b803d8f7eb81581855ac7bfb9cd74b846b3f2 100644 GIT binary patch literal 491 zcmV9(urJYCU!XB+l9oP!gNp^V)X-v6LgH2q61b{MU_(PR8RXO&eSrq27HcT* zINk^s zTW3#20kfW;@qMt}Zby=ISuAR`R?}!SQn_6A9`C>AdlejYyW>?K48~tPKaby^o|LIp z|NKWtQ@&TRJ5rSEbdzs+~fOOO8I@hb546N8(L^BtMa;*czzu7_uc^?ZEqjNF^rev`3pU6-m8?oHmf0I{#l=g z&ZNv@zaM=*1n&|!0KdvFx>NNH^OK%G00000000000000;f?038rl3E68q9ioxV2as zv*3^W0mir=U@Yis{rT2{|Ax+bf4;R??g!AH h4*&oF001x(-T?GNg|&x+);0hD002ovPDHLkV1l)(+F$?x literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vm( zPZ!6KiaBp*8G0XfU}&BH;(}pPho7s4g-GsnrKTV0bN+Di`N{s__WLI(=n@m<5+Jgr zSwUlM@M{Ib=~11RTDB?>zYgU5+(}=P&;GUj9JIUioj;Kg*p%f6lZ%(9++w{y;^Cjm_QrNhUvg zu04(qnK)lFAxprX{le~jKfl&hZ&d6QBY*A^WwR7wC{kg-=5>g~3i$--b#)GYSNH?$ u9sV+WWd<=0@V;Vq_}g%40#azr(Z6Mz^JC}EQ;xt0WAJqKb6Mw<&;$TFE6KkA diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_capacitor.png index 054299f6d7ab343ed10b88b8a50f00e59be60e7f..d6d1f9d555a0a98a519049b70c227aaeb774217c 100644 GIT binary patch delta 372 zcmV-)0gL{l0;2uLNYiBPDLoVs6_|C*&)u| z#Koy9s5rT05IVSM2DcVRF^(ySE}=ukAt^#v!OwauN>)--sJZ(i;IVk_$*9Sm?mn3WJ{yt|$34r$=WLNR-5u66@2~Y++1wE^_R!_@? zm{$To_7Z)!4 delta 243 zcmZ3?yqIZ%MLok+PZ!6KiaE)N5(x&c8UopStP-v;F6NUcWr$q!EE%3v$4oo4s3Bm(~C&vX%n=Sma{EkU+&n_ rG%JPufXqRMWP=^vhv05sz|O!B{Mb$VZP9#A1|aZs^>bP0l+XkKONC)E diff --git a/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png b/Resources/Textures/Objects/Misc/stock_parts.rsi/super_matter_bin.png index b56c920f7be3acb4ab4fe2dea88296c6e2575934..54678e59150cbdd9b369d147265e3617e8a065e7 100644 GIT binary patch delta 349 zcmV-j0iynk1dRibIe$M%L_t(|oMT}aU@+={Q3s4VVAKJ_!vQh1>Hl%bEoq*~NOcFm zEPVFhF@uzXEQ6Du8^e-Gb1~F`${*#XF@_?V+1Jn?}N-M&TJ7#QLpav-)-oEO*;Aj?6H!Xr zAAzXi@G$8w?_fE)tHj$MI^gDiu^^NnMdz%(hA6YT&P vsIHktlHpW$04>0%14bP%>VQ!P47dXTHfNF$WMu~G00000NkvXXu0mjfxs!rTNhk;R%ha^Xk6a~nZOH0Y1 z$US}bgyH7;0}Sec4x|`Kej)@}i0%k-0Lc#c@cs>$289I35r1@ZfR&6G14C61I2w>0 zf($^x4@xU{aO4n*8~_7eKt~V)FCV|4z5|Xuc?Agt0$}m(8w{iXf)3C%wE2(B2RQ^8 z+`aw|t3Ek7h5wHpJs_AB2|BYMDT6LL}$_kUqvC2fXg?^U-9wOfTTXb>RQ_e47Y=7^7P z75*ES=rG(`bcO*$e_V8h!PpIzCdG1+8~_3!!)5IrfZ4ccQo-QQ1)~n2H2?rhjjn4? SvY`n800007^$@U!7J}FW1hI&h z)?<;15KL(!R3#G7L2z{;mrZD_Mogg_noMddeI90JXVYw)$;|A&4E=pz88$ofzQ6bT zy?-IXH^K z;1vw(Xn*gVBU~F)$F*%r1D1Yi0M%*jh6B>a^f{n7g31n|iX%E4V4=tP4sI*dHU#K& zK77qf=jVV)`hiX)-%I8@Rln`WH`K<@oe)Z1n>fYq)Z&>G-22h3K8Q!>hmQVXnVwxt~+uQv1 z<7KKVZkatf)KWEgFWU=8-!#p}XP3UaN?VO22u;ECTYoV`uQtw4Pw#1OcAR?p92KHirWzy%r>HlV<5hph1}|;z z0Jtrwvi#7U^gbLu!>|4D{m{uBr>|T=_2f{utdgT~05JD4-27|jq<4B^0)R_*Uuc~7 z%a^F^IQ6vz+Og_e|DUDZ3euwy#ru%p;aJ%s0-$AkTCxN(=;31 z@A~zNRyVv4nb%1yRY^Si5P&=p4FRPxq@RYlMOWW6O)hM{#50ShxxAKS`#!ulN}@JH zs#`(&8~|&fY_RJ;I0Xxnr2N*uHbW{q4qn<%_%)(9LdBT_9_7f96} z95A=ox}34DAGnlX=G7d9%;H%MlO!rh35dK#L`pl+?}3xYG* zYYBoqIscmibUYAjINh+09S?%r`c&9f7(^R`-t;j`-#+#Rv7z&0R+L12vlUFco3Jab zSfl%8P{5WiM1?qC5ClOG1VIo4K@bE%cx;II!?1As13>@d;FzbU$9IFqLD-)V0iic& zl*-X1U+q`B{}U>}HTxLbAOy!CX>U@{(*q28``-%wKK39GZU}PTf$De{YGCAHMSQqoz&y`MTLpdit*A-k$mSQPal! zeBJzi0Gga%Ds!z=rcx?XcYbb_pTBYimCLxF&=$5iKVLWA!$pe>u;F*87miN2`T5_x z&7aSo;85)|mj7tO5M=j&g-I*jd-yQQ(RcFm`}$s^`tz)-Z}))OjCYE-PQ3RA6xhIE z)&6EJ_YS*1x6IFvnl|R=>n6}D2x787;Bi3r{s7(jVTs~lTm-W*mI9hq8o3Or w`bE5ZLAWtfXMVn5Bg2m%2!bF8g0OG?17)@3(3V13H2?qr07*qoM6N<$g1$RElmGw# literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|VnT zPZ!6KiaBp**?T($N*t44xY1GI)Iye*>sTL#T@vAC^Q~)KHf_Ptt1JC4sApv4a!u)2 zmeJeRA*OobXxpKM3*SE5S@k$6>UrGxYTkR#&F>r*{Ay|U{ZHl9biPvy83Xuu8;UX* zrZ_V%m~(?I=Y44H<+%7c>5KkO_)w@B^ICltbv-2;op~bT-k1>u^Non84RQs$fACHB zcoi*qVQ=O`o^Lar?{*2Yzoz!WzFxsf)IHNQzG=5=YfIgm;01r5lvSONvcG7Uu`J@V zinUGMnRRoV>rOjINz`tBJ^Rt|oboAz25hY!mrwjU3l?hUq1j5Eud7UlmulKE9qX}=Do4hR7& zn(zRi-<;#@;2r(ue5GtODVm%ZvpVzU^hx_YW%85fD{6mM`6B9fL5bOZv}ob(xrWiA zl`8V+`zvKlh&n&nsEhkU0KmN6Oyx)AOb&n$u)-jSJGH3&Hn0qX0IK=w9pE^r6Gq|Q za2Wrt)9YoHEi3P;nzx&HIlqcKq0{TFT&-j1CLrgF~4*r^O zrJu)$We0)G0OZ3s`FtWGA|fIpA|fIpA|j$4ApSpD;X0I6et&>8$@TgFf%NE;&M%Am z1B7vZfH3VjVB6N`OIv#q{%w7}NmZ`Tm!`EtMrVD#$q%5)_4(4YcF5?g&o{k8rmFS% z(vO=u<5X=vX$A(S zEuJopAr*7p&auxB4wN~*-%IeNLf96uqcd(!+vY63(5s+8vn$)Yy-Q*14$GhGXU}f- zKIqAE_o!)!pt>U8&Ex>j#W$2zTsT;1Lk{C|-czrW?1pO{e0b7|HoUQf?m?0nqOc3Ua=M7ES*hh$cDP7>Sp);*XuugtNY&Mj?tX1y5CPu-n%-n za9wSKspn7j>ERncr`TSuS=_Mo`To80O?~{&x35lUuBm_hRqEO+57(f&r`JOF7;$>c z%oh>(dHCW)PmZMUu!rYQFR%Uk`0e31uF0QPi|Zx7I``M-^Y=YGznWXFKm2IE{^MzB z8^1latA8_G|H*up<15d#90@DQTgC@c?ebd}%5XIlX)v5x$e_{Av;Z3?vG#z%!!`U2 zubCs{5By@NuiqCslmGUq*``~X-oBdiika{Cd+CXlE}C~^HlEtPihn|YQf;Bz`}qZFe1dF?CaBk$63;`D66&X-M+lNT7iYB|rCww&8aI&~fQ1 zub5+ke*9v%F0#!|L7yvHeu8-GTK*H=3+Kx#{6DK}$`pKh_1(4ExBve9oA%;4dx`xX zb;T938}81(pKnxI=dd9^zIV;P6){}g@$wI5O{G>mvZ?CfI=b9)5laYmjeLY zK0g33d>hH;a)55L^~3zSc)r^J0KMuJ0G9`+vN`O*S1e6n;*L}G#tFH@V;mJOP{gcc#2Ah}c}0Y=A^(YW1i>gcI`b5m z7MGP^uu2mHI|2q4@4kVdKGs!(fx!#n2$&c?#}JhUwoMdZIDfnAD#IrR6O0f5TZjZe zj{1N93qy|HRR&`>WuU&h4ERC>rvqL-e!-x^0Eq&x{13no&}N9Uz*L7TN@}+XGcauZ z0AvXRJ@A7e5r-r2hQQtH?-(TPR8TAfiM=><2h0aWOLg!YhQuBYhWRBwz%%;Ff*EAl*Lm4j6U7r~^hFFd`fP0PP-v2@MvA8~^|S07*qo IM6N<$f+@X@dH?_b diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json index d75e46fbf42..fc15bfadef2 100644 --- a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ // Hands sprites taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d", + "copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_nocell.png index bf08ef9cc769fe4ed6929318ae74f8414ff64212..8c4fbac7fdb19358dfe2c67931a69999e091f0e7 100644 GIT binary patch delta 417 zcmV;S0bc(70j~p)7=H)`0001UdV2H#00DMML_t(|ob8t}PQx$&MPE?|RH;iCI^dyM zkh++m7jUHxC?jWJ=L(#mf|-j{A`2@LUb=KBl9vp4V5r#4Kod2hEhTnRB=}oo$?y5w zi52+IUx<{_B}w8ojU6=sf4+<`#;{4ER)HKoN+FkMOkf@UpnqVL!erQPMqm^CCVoTR zKeZYWh@yyVE5C&UeC@TXt#E*?16AQlDYVvDYtdSNJAbe(r~-#T z4XnenEMqpC?LDt|13qwX0be+HY{5EwKA&TZsWexm213E1LIZ=rz{PRQa=G+|!>WPR zikwnvA?hw)FJVsFJbTaq&S?7CkKZXsQtenxIp&)T8GDe`5F~(Lg;(|Zg%0$JhrhL00000 LNkvXXu0mjfr*p&W delta 237 zcmV>+; zCnq=|BrB%QG0U;P02gG2M00001bW%=J06^y0W&i*Hen~_@R49>S zV4w^zDxe7nE21edatuIKpduE4rXUqn2bux~MsZXH3__)73TD*N93fP|fK!10x`ILs z69mvrV8^hcq7}`GS*y|9u%;W8&vjx0eg(JC6mXy`=mIL>dxs>z4OH*|2;qPasDJ^4 n;NTrY0ID8_cct$hFc1v@&DR diff --git a/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png b/Resources/Textures/Objects/Weapons/Melee/stunbaton.rsi/stunbaton_off.png index 8704ab6bcfc9d1cc1a0e0a9959d1eef636a6de3b..59940f44ca4373ace1a3068261c7b823721077c6 100644 GIT binary patch delta 347 zcmV-h0i^!m0qO#f7=H)`0001UdV2H#00A*cL_t(|ob8uAPQx%5h96J|#2AJScwu4u z7`@`vI+$Fb`L>fF@Y}pwS?^+cAM2Q0)Kt*=er~2%iF~w0!2~q z;vwAMU0$8NJa3kNv6Fc)5yC0c8ob7-vx=O;UYIdDkSKo{OL4Ru|Q zo*Ugj3_MyO77h_d(1jagu-49+HLHPCaG246hto^PxI(^;hXInDq8002ovPDHLkV1m=$n416q delta 208 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 diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner.png index 8db1e80fdd1f32d08fe2e49909db021bc9aa7acd..8daa67ae23ed6f061805be4e6ade14c8dc289260 100644 GIT binary patch delta 1571 zcmV+;2Hg3L1E~y<8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00rAgL_t(| zoTXP=Z&Xzj{`NkXxl}3_ffU*f)dyenK`;dI@??P0tA-HYc+e=+s;G%3CjJ3@k$?j4 z`o^UQRZ?Dz7rdZ8s0kPq+S1YnXi6w;=iK)8TW7c!?Q~|!?te6sIp^%XzO~l3zO{~v zD%R@Nt1T9=Mn^|grDy&Jpq#OZ%u3iO0(fNK{t0yLTm%^Y^gLd&II{0Lw(VX4o5X;2 zu`Iqa=UM*+<<9khY@AT_FvgTF@)*y*kH4p&93M8GfaBExj+mxB{@HK>DpwB`2e3wC z!YqNYDPCCD#eeeX>YNdoGX?TscFl6Dt%7nh=_w|d;kOIRf9>UVDpb^~M{cyNZ_9ekhjE>Enj`AF!0r3`EtQ#19t1v?Uff01{wlE}0j;CeI?*!Z5 zUXIT{xrWvqOW?X$f{GX*0@i{%SJq5<04C-qhFiZB$$#{9dQ^|&A74htD-AHjg_wMx zr$%{jGIcO+fVLMG;mDp5Y8L2hZL_|G`PPY6@+=1?D}1 z3W~g!WsWU@pJDW#o%`*P*}f}1(MK9hlC|JywWo^C=pcq`Bc1=>(vfGvT7B} zOlqDLA>~#AX3_lkCJg^Hz=#Z>uyG4dVOcO8x0iNB0YpC%g3{!OQ#*iQAdc-O} z$A1W9=t+QZCW4>$AapFOZ^ihpr*YxS&ro=33(GEhH+n{tDNa)m&rBj5|FdjQn70|3 zD1=|Plma&m(PJ?#iPls(WerxWZNsHA$1!qt0BfFk{_eg+>`_B9S?Fwe5vmA4Wmx0! zY${6Xwuel#4QJD^Yv#GIu?rWzK7zroj(^_Wm=u|RMvWjXHDbX4q?{}bE3#ZXo(ZOr zXLaC~#ybL#scG5Jj^VSX?rhU_i(zJ_NMdqBn%06NprzH4K$KePIQdNJFe`)<;t4Q< zuwjg5a$@+$FG~BuA{@tKDiTs*X5j#A63|2DQ2CDihq*z z(>;X^9WahGXeuBZTBS*5UI4-6bL!Zq&Gv=&mZi09N$w_=pj3u-Zk3jFN+BjIrE%S} zXs0k@#G!;KI=TN6w(iK^ zI{;}w`HY|T1(}FMo`v~JWI8End|GnpC}z{iNU>BCP9j!&sI)2qkV8A(T7^@GMzDF; zDn>Of@xhi#6H*05_6tr$ED5GaW8mO0Hov@z&rIGsfMD#r(wWC>+pCS}-+woVww(NQQ zQkZ2rvTV8i2gcC#Mhi?h#k}Zhj;;P z#?V)1ye0s$g5lqk-|(=tR66+e=ZPDV}GOuaxLp@ zGCP%)rV4J{xnAq48Nlr|d-3P=6;8yynwQXf0#NDgxZM2(y&YF;v>clC?=#AQ`3GlC Vkp%GIK=l9s002ovPDHLkV1f}G delta 381 zcmV-@0fPRi42=Vj8Gi!+002a!ipBr{06b7kR7I4Olsz^yO-f2Uc`f<@qt8y=R=jP2qBvaNdTSoy@g8oJGIYH>X){PBW$kRW^1? z03R+5{;&eM73HVJ)sc)Y2x16`gc!sSt_BZ;-pbXp9tkcls0p%G5pb9QdQ(u*Uzn?f bp5!6EN-!F3!qZui00000NkvXXu0mjf%S5GH diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_cargo.png index 899c8d6e4cb0aa6d7e4b18368d411d3c34846a18..ff808bbc8bbca4efe6e3184df645be9251be9340 100644 GIT binary patch delta 504 zcmVy&W}GzqMVyB{|CjODk|Tytnx-`iP@d-_U!Ok!Hh;58{7N!^E>DcHbg0PG z0S4-ZNBfLj%p%cK zkPF7t7b7P?zJK}>ZJO-_8OZU$0H#1HOsFXuV0j;lc6wO`8OZUBaXP@$vfgYQTx>>d zpe~Htv=MAVO)Me+)}XJ@07X%d0w+l_ECA>*9<$HiG27j$oNf8>gN_-z6AmR3z}!VO)*kq*kIQ2W&p3;QQD0F00005RUA-;r2yt67B^nbq1cr&G0TGzVcCeZWi;Sc4y@M)01DM8Hu; zCQ*72l2ei#3}O)~bJj3%djxJq!g&CxI}E6$m7zAINTe&#?5 u#-OeQkj5AZR|5ViK&Y!cD(bJe%P*r#9jPSko{sM=qEd(uPOc(bR1XbWvAA}YlSimeqd zf-QQf2l3}%1VNPggV5809wY}Vilj;slyG$=gK4Ke@fLoL3;((O8)`s0;FC+yhAUzoZB#fE`*AC zT>x3V^EYsI$4i^iizfwYsq^6PvGFd7n^1orHBUu>Yrr*FF10QpIlh3JE7aPVE2y002ovPDHLkV1i6$NB#f+ delta 365 zcmV-z0h0dI1^oh$8Gi!+002a!ipBr{083CzR7I4Olsz^yO-f2D#*AQSSYXs;JS z5hCq}P0z%HjP0-sNU5JW`700000 LNkvXXu0mjfoiw9? diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_medical.png index c2dc11d21bf969063699ae9e24e9e1991b61e312..5bbd100773c4f80fca7401fc06b73090a0460cd8 100644 GIT binary patch delta 413 zcmV;O0b>571FQp(8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00CY}L_t(| zob8uAi^4zR^S=w4yUU7w3>JPZ z#LdUftcf7!+vIDq@3T8I3)=>QJkLwPLSY!TOffltGPB-j4u3)jl5rG8aN2(tj-^Aj zivsXR$8n%DoGDY+b%8336(36lb2+RaNs_`9DNF$d`o5o{ImcLskh(y5I!HCpq}~A5 z0K3n@-Sc>Td@ev;dIMAf;3gvbSe8|` delta 405 zcmV;G0c!rN1Ed3x8Gi!+002a!ipBr{06$PnR7I4Olsz^yO-f2E;oDc5}eXC0umnSZwX*CF!%^q`b6##n21 z0l<-ehOM)9u@+zfw>plX@9qPvtGl@tzS0Bm&ilpt7LL^U1K{i~$z9kz)!|+Ecm|e+ z8lMj|UwTE8h?0aFlZme$h$x<}AQZ+kfXGDn69x7Wdmsyd6gE*1A7k!-BxBeB&C>~> z6F>t%9Y6!1^?x%Ucil@5)cQ-=_$qZTCtxc&uY~s827pyPaix+8zzDBUYB~otEp!I_ zyNmrC1e%}2ev;wpBwH_vY;e+x)^DC(S~vS{D-r2vH^sqcBBw-JKPAeeFNFxg<)@ry zHh<7j-6q@u|QLJ=uvSTrj} z`tjQ9KfB3DQ5<{h|2#9c;*k(mmSrtHY`tC=IiD6lO6>gi+J7bfdHfb#D})-w9CTt# z@c!qf`QC1~QdQN?*lM+s@p#;{AEqxYUFg8@Qu1T#T2 z^-ay80bc9JLZ(s=4Y}sOS<4H6mI{4%9pe~#99>1IA-8a=0JhPG$$c+?TwXo7cLU(= z8DBOEGyuCZZxlKKhMt7n3CIHALWeR6;P&ex8rIk;uz!BN37^kC_5lp(5 zD@K6&=ROQ~QUJ1@E1Lg&g8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00NjvL_t(| zob8v-YZE~f$6u0NgDVI{yT*<5;LSh6lh9I38$s%!hoUq#DU{lJ@ZYcv#l#{Af*!O* zYXaiIlYfM_fYQ{s3cUr%uXW!pvz^`S&aa9mAA}5VcK7?)w|{Tuz0p9x^7*_23f6A7 zQ@m@&0C-}CZ9{c`64r13gsy1@zO6SVY%JJ;FX>rPC@t=SxErq?AAA2D_vZ{^e7#}F z*P56ZgO7_y>?a@)u1M&PAU@%Okk2ehfod>>-76jZ(M}R+&9SSdf>g7&>j^1`{|`A3?L&Mg?~V!L0XLKxk)H0%mQH<7XTAY z6@n+u1n@Qv#%3gHtWAgs@UQGYfDnL6B8nuS5CCq+xSnMoh&b8Gl>sn&-@cr39^L&e zRpE$ub>D*7`LE2bh#P^dkq*WpQ3!=TJ>or{4{(324^Lm4uzAN8j)LDeOv2LgUjRTe zvS)%ZD}M^~+YcR#9KV+p0w@>V8vnt9((F-ULeh!%{G$c;X513asDi=(q(4OQdc*CA z=Ij6>PJDaM^u)0QE4AfGhN385e|HHgw|)dZB8*mhe*sqKeLz+TmIj~;6N>K~#|C42O@CA>c&h>cmMzZ0d!JM zQvg8b*k%9#0Rc%wK~y-6os)rbgCGz@;gAv%)}u-P|66-^1b>o>v@_iq&y{^5cFL>q+|q>^2S7Z79k2+#6n2arNaTT0I|Y)AtTcTsauwp$zS%GX;F zS!wll&F)Ru9dl*JwOVC%JAMFp2V}ge@exCp~!WL;cPk<75 zsG#`_*vgbZTYK*e)S{Ukr7i$Xb(S^oXixe741cX*?BX2YmK$-lP0fn|I@A23GQQ-# zVq0MGc?PUi(h6(W5m17Aw*}y1ZbU~ko^l}?!Y!Wjj^t%5pE(%L0Yq8>@~4n0 gt#U)sZ}F+V0m*+FJ_`6b!~g&Q07*qoM6N<$f*>!WQUCw| diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png b/Resources/Textures/Structures/Decoration/banner.rsi/banner_syndicate.png index 6b39694e7a7070144b2e2d2c2ed902a1b6bf1ab0..c8424057d020c4eb817f2fce1561f02e4ec84538 100644 GIT binary patch delta 555 zcmV+`0@VGA1Gxl{8Gi-<0047(dh`GQ00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z00GHKL_t(oN4=LzP69y?h6fA}AHfwnj5l%TF}#8Y@EBgfW4QAsMt1CoQ6ABeZ|EXT z+mEUN{gTcU(3$_|uj(Om>bkBz{)PupGx!!cT)pf7m)FocmtLmlxZtCT7*<8otaWs)+3pT>_?eKIbdez$+(ek$5 z3S;JZ@rjXWJCX)A5!QG8;hymO*V3!`+8TLUEok9k1`vN-d^B~5`{CKnM9Dzc zU9(ukfxX(aRDTKh2KaV4{C%WwlmxhuFU;%M5+2Sk_g?2v831nR_cn&?v0yp{kei2? z!PYI{0m2#fDGg(6__&8WjAA4cfYMQn#qB3h`u3on0SJ36W_Vwg6_WvonFwRIU^W29 zG||cc9Lq%3KJlH zleNxG&d(mz)pvgY^Xy-~m6IJn@F7egv@)y@1Au#rc?;WZ9qyv#vp}_UOXj3Cnn)yt zsoV7j*kVeFBSQ%}rMO)H$q{lZlvIE!RS_K+gaWh(f8TSu0_Tq*;u}zjoJ+|pxdMRT zj7MR~HGm1>{&Rc)@O8;K?^d5dlpkln8p^*l$S&}UQsA^*P)ef{r1SwfiCRPNovh6{ zPD43O8q+7`u!P_r;*txo$uYHdY_}W)khTxR_k19aG46pA1hES`fSUpY@l#%r@Gn;N Y1)&HU!*I$j%K!iX07*qoM6N<$f)*2>QUCw| diff --git a/Resources/Textures/Structures/Decoration/banner.rsi/meta.json b/Resources/Textures/Structures/Decoration/banner.rsi/meta.json index 2df45b016ce..2de33ea0290 100644 --- a/Resources/Textures/Structures/Decoration/banner.rsi/meta.json +++ b/Resources/Textures/Structures/Decoration/banner.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise // banner_revolution, banner-red, banner-blue, banner-yellow, banner-green Taken from https://github.com/tgstation/tgstation/commit/fa9e44d937026d5a2ba72615afccf2f18a87c485", + "copyright": "https://github.com/tgstation/tgstation/commit/fa9e44d937026d5a2ba72615afccf2f18a87c485 | banner_syndicate sprited by mureixlol (Discord)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json b/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json index 5afc1b2b0f1..1f7049dfbe1 100644 --- a/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json +++ b/Resources/Textures/Structures/Furniture/furniture.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d5cb4288ec5f7cb9fb5b6f6e798f4c64cd82cd09, Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/9d7ff729b6b89eee0b3d750327f9fbaff4aeb045, Taken from https://github.com/ParadiseSS13/Paradise", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d5cb4288ec5f7cb9fb5b6f6e798f4c64cd82cd09, Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/9d7ff729b6b89eee0b3d750327f9fbaff4aeb045", "size": { "x": 32, "y": 32 @@ -29,4 +29,4 @@ "name": "dresser" } ] -} +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png b/Resources/Textures/Structures/Furniture/furniture.rsi/rack.png index cb146b54125b44ae7c57278775f21a49b40f9045..b299cc49e140de7eae0de01b3e0b2c6d04584a05 100644 GIT binary patch delta 233 zcmVH;^h=_=p znVD{GZb(Q-P*6}nKtMAyGgVbpi;IgbEiLbAP}=|i00DGTPE!Ct=GbNc004MNL_t(I zjn$Gt4uBvG1i?bFfcXF4iX}=l0ym@6(`Gl!1*JZO9%kLmYGTUQ$p9vwgmdk!v1n1k z8EWtLlW?Bl=!x=^B;kx@0me5J0V5B5QxW1w5r3wjn}Ti%hwh@_EESJb#dGgYMRR~} j4VIMV7Hj#j9n=eK@vIN;nsJPK00000NkvXXu0mjf5`1IE delta 299 zcmV+`0o4Bb0lNZ_8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~008YtL_t(| zob8q|3&JoEg-`G|SgV7(U{Me^2cbXN)yYkiii?YjL#-(e{)5PYf}xl8VvH@Aw-gTg z-Us(W(uSJl0X%>QXdb|PHkB>|*PCri3xMInQ3OHIaS|>>j(;Ed4xs>K=M)xk49Wfg zy|7y_xMWvWknZ2fID*wORpw*|?zbFlM1kr&wI#HL;Hm(Cd%`ui(6a;O09Zhm9jF9A z`40FF{C5XXt~$U5pvv+MQI{Nf3S5bG3Vtmk0GngT2H=L2$;6|1D>&{F2nT&-hA*X0 x#PLx8P9l4~)g+{5ZmLQjas?KF#y+)o-~s27g>AAvL-hav002ovPDHLkV1flUeD?qV diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o0.png index 2cf968a8c32f2cfbd9b8e88a4e2e1ecb31796958..5eefb01db6a9d02c26a92a0504afb413f4dd4dc9 100644 GIT binary patch delta 1460 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 Dquig` delta 121 zcmZqYp2|2uxrl+WILO_JVcj{ImkbOHEa{HEjtmSN`?>!lvI6;>1s;*b3=DinK$vl= zHlH+5P|MTBF(ktM?eT-03<^BV2Oj*hj&Ai^&|mk?gM$+&Z~yIN?tS&u;%zFd3Okwq Ua|%yy1d1|vy85}Sb4q9e06&Z*mH+?% diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o2.png index ef543a5e09e2dbc409b7e40bace45555c2417234..57a1eaa3abf69de8e86ed2770586422210073bd3 100644 GIT binary patch delta 1365 zcmV-b1*-a&0p|*kBYy)edQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U=H2lH@21 zh4-9dj({YD#BunI=o`%O=V3duGOMa*s=I43i!@<_g)HRv0d|;w|5)KK92{c|NzHS~ z8SR)#DqPXr*s7>^K9he_LyqBQtg-Hk;-*uigpD%pT&K6G$eycLotvrPa%oN z)lVPUr%2uQ{zqj6r&-Jp)J1z625gMO% zkbW-yA@Re&a(~Z=pF2vuh59J+TEo|x=iAkkp=iElR17zD_A_v7kX(+(GK%3;wCyMb z#bb>f$Vcq4p>!(5P=5tVG^o;|dDNXcQcOJAP&0Ry!{%aKxPuW%+JzRI6dB?m*Lemo zOTzbD=oq&g<8^Y3JP58#2nOIkFX7)hf2D-A`j&{I-+#42Uc9F$(%9to6B>*A(| zz_)VYj}P+)QxydDklFEqHMTQEQ+k_Qa&Q*-De7|xQLu3ZfJ7Kukqik4U;&BJUPa7C z1RWiKDl%tD+(3X-c_2wnSQ;FRo%h&y#^~^6<;>fRy$K*xvKZJDseqM|V*Xfi%%Q5H zNma9&dVkQOHA_xebIz9cCRa@?nOZh8w_?@BldESpcQ0NG7r`E=B^N7RN~x7Y#XuFY zD*P)fjhnR8wB=^aTWPgp`t;Pb=WgA5>2>gsfo)>sVZ%ombyAqvDQ22F^R(%+%(^hw zmaMdNrPS@llsqWYoy0yVm*@j+_)*_|4!!GG))g7$Wzn;D34A`rJtVDDg?S#(N? zH@VF$mc7d)cXwJ`%-0WQ;0;Tz3oEwq1`#$TzRA=Ni68>Q|ue3bZim zO85s+y0=6m^+8Jj00D++LqkwWLqi~Na&Km7Y-Iodc$|HaJxIe)6opSyMJX)~b`WvM zP{qNbsEDIfu?QAQTcK44lb8NMlZGV4#eY$7EjakISaoo5*44pP5CnffTwRt63 zRCiIH<=yvZg_OL>0G~)a$8^IY-XNaYv~yF6ykH@F@r8h{K$3Lb6 z0XiiRAR+Gn001dTL_t(o!|l+a5dbg@12JFspEuNtMYL XAKwM*NnS>*00000NkvXXu0mjfl>e4G delta 123 zcmaFPHJx#SatQ-tage(c!@6@aFBupZSkfJR9T^xl_H+M9WCij$3p^r=85sDEfH31! zZ9ZwBppK`DV@QPi+v6KK84P%s9Vh;M?)zHc1B>6pXMA!CfeQBAn7Zq$Y~L(eq XSFpZjyZL?#P?*8f)z4*}Q$iB}`=uz< diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-o3.png index 4e1dc10c29ad7d0b38db1cb30eddbb1734ca537e..3522af81e5c10f2a19cf15e3bd4f3d47b42b13e1 100644 GIT binary patch delta 1403 zcmV->1%&#P0gVfgBYy)^dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U-_tlH4c^ z{m&_K1SBCOj)VEA+8gBfd0=->_sr~WCdr>vwJ9SkK$71BK^Wivnc*8Aj+8@E^IUR{ zcv4A)D;gfpr|gcaPvKHNKCHVUMipH{E&6?%P}aDVeb$Fn~8)x&-nx;kzK zWqDrS`eTsL^QotF87kv!T!kIu7Nw0>&+DHGIq|zcX(7J14>=tNSKF^#9jM2 zM%F7*mwwmGr?!fU1qeJ>Bmm^;_ii%AM}VF{zO}-8^zW^A;B&q7@(#;asFLR8Hna*vqTDyqZh=8Mm zpo+*@5+7iIRJkKaP9m9uvGekcIYxUdD`#G6Qmh|Kjx|(OG^uJ< zQx96SW`D^kYtGs7N^;f2lBs1gb1PO|Jh^&ybNAx4a1rD{ExB0nQcA5HDjZeVsu*9P zIrxwx9eU)$4nN9K8ivcj-tIJ$LKgORs~%K&BXJ=*Yu{k231STAMP{ z)S0JEpJmoNYZt2@$`@Fpi#6U%t#Ni|4ccIKGk-xVo#^5WjBz3`Zi|7H!4_xHDJ5Ra zEzV+DSxy;2>f$DJT8x3hG>CQ5ox3;Yeu}rC{!_g1|1lR9b$^1n0O~&S_6ci!opWt7 zcJ9K3X%y@}^bfCry{<#8{;qr(dKr2ddKr2dy2*(okGkOCQ@1%n>2t_jsTcQ52(7Cg zrGMepnfhw?TBf8IcN@aKn7G#b0L{s}8Y_rtAOHXX zhG|1XP)S2WAaHVTW@&6?004NLeUUv#!+%f|g-=sODJ>3m5OK&*#lfPeh@(`o2o_3P zp;ZTym;OPMh9t$sQE)9d__J7baBPxnq3oss#!)V9uu>WTDX2A=hGPn}eEQJ&@9_h*Hayno36 zpGZ8%bi*RvAfDN@bk6(4VOEk9;&b9LgDyz?$aUG}H_ki6e@tQNECMS>e3JS*_Gq>z@3D!MwJT<~pq*#Ib|~k`N)IhB7L!5T#us#YBqE zV;=rN$DbsZOs+B*ITlcb3d!+<|9`>n*_wr^NjE7N1G-;q`(qgB*#(+)+x|Yb?dA#K ze+I6!w!hi{WoO54hX`2A*`ukQ~WRODGh8_cQvY9MFFY1lHWS zwa#(+0Ay%Z%QwKmAuv*;>~)WK_jb;x7OI00v@9M|4C0{{a60 z|De66lK=n!32;bRa{vGi!T^@ zR9M69(4i3kFbo4RUqSZY*qx!Yk@%BO007_{ou<>*>^KLkcL6p29dmxsZXeILO_JVcj{ImkbOHEa{HEjtmSN`?>!lvI6;>1s;*b3=DinK$vl= zHlH+5P}9@JF(ktM?a_^#3{jX)z4*}Q$iB}ND3u; diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca-tank.png index a48466d3b462354bb8d7f28dae9603ddf3c18d08..4d5049f7b4ee366690c43580e5345c5caa549154 100644 GIT binary patch delta 2059 zcmV+m2=w>H0hbVvBYy=bdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U-|cmgFW3 z{bva<{=C3;AA2h_L?p)59P5amp65sFhku z#4p!exuIk6`qgu%n9u$E_@2V^%XoNBFoqJ^bUkXj0_iFRKkr?M|obs)xuB%h3>3dWAZR)rMk16+mp{TdA>s>sD_XAmh(iAL|m{+0{ z&)qJWwEt6Td;Hv)uhEty#egOzy)6MCFQ4~lV|)+L3&@XN_=x_q_W^uv_jvk%Ww|jz z=erXm-v|Fd{C{rY^t6ayC%jxhzI@L8?>^0aU0>I70ixyhs2CpT93?(GAW!GD61U0% zUoo`%s<PaGq>-M z0wLr#Z*l;BTsQsko&Ug9!Jr(N4IkKIzf^RgH{VK!=L9)Hdxa1Mowou>Z06Pyz!8 zpd_@Th*^n%qk*6X%aMJ!g8>rZ2_reDR5&Ob@3rxc(vfB1!h0CG2}DRLNx@A`4P@mk z@E^?vAAf3+B#TH96$?_Ol~i((Qi_(H@zmatkUSYDSSrS|SaQ9;t0Y1B56i2c-yh8;%&N!Ki;A}J#=k4qN&V&~-89Zh{; zr^Ax7V|B*@zL49~QG%TPkPE*mc+2%sR$qv9GAHP!^I^X=$B(UQbj#*)E;-tbc|Mjbuj>yZEPD?R}~pMd+lt7tRtFw#YnD zTNmGV#lC3X+DIyK^TRE#cJ)xd;}I5!=Y&E&0E~?7Fm6nY)dYpIJW;2Kjk``M;1W8?1Ho8yq+Ij>yI^E^iMRbX=(qaF8gRDTHd zxDqt3VAS$~b0eFDJ1T{(WD8WYpSoh7Fl{i0?TZTHq4UXdyeCBg?q2*QJ(fGyfcqBufr@jw;T zPu-CarsDLeD2`BeINnMiw4kCvSAU_HhT0sY8(%&6`o@=fl7$-T&ASjHmwPEW%B*eg zb}t0qD4+7G@akS|z(Q2~f+Mje!Wqr^3R#iWQTriA8cICrYx?<8lu<=%1O2GC9zIi` zVN^tbBgA}%7*N3m5OK&*#lfPeh@(`o z2o_3Pp;ZTym;OPMh9t$sQGakPIQX+zb#QUk)xlK|1b;wWU7QqMq{RD@LW>wLJl@B7 z_Z;544-gs^rkY(7fT~$WDjpNFxmB^}6#<0c!#GAIX6lLbVg{b|bx)mCcTt|@-S=mO zl)T9RpGZ8%bi*RvAfDN@bk6(4VOEk9;&b9LgDyz?$aUG}H_k|nWrS;tqs!_g>by?xO#aXS?SnHnrg~7bGlIA+CA;htS1dga5(r*_wr^NjE7N1G-;q`(qgB*#(+)+x|Yb z?dA#Ke+I6!w!hi{W`93PueY_x5zw~{TwJ#`c@MbU0S2CQ$&eh$PfI8ifcG={rX0|J z3k25OxwX!5`T%5TR?9cQ!67hGr0jK%clUPA?cbi({C)tY_;S3yUE(hQ000JJOGiWi z{{a60|De66lK=n!32;bRa{vGi!TWX z0NzPNK~z}7V_+BsqhJ(_f>AIEM!_f;1tT3W;*v;DPWn$s^US&P5c=bw^diz6z=BOM zJH+At6wU1nSMK0+AA^p{e+G%livNx69gLKO09FU6$ci&C=rAzoFxLo!0rHiV1GJmDTHy8fq{YH6+=CqP^ho0fU_IhJE-G;moHwy*)Lup*rIDN)#9?0 zpabqae#yXa}f2_E5-uaEf?WJ}$ p^!4&0m<=iQ{U{g(3=9km0Md>-4xpEEp8x;=07*qoLzopr0Do3PQ~&?~ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_active.png index 184b880112456783ade0ac30e388a765b3be6d39..134c51bccb01fbcd4dcbb68fd1b7df8a6fafc0e5 100644 GIT binary patch literal 10749 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 diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_deactive.png index 420179558caf0cee76290b04e72a8cd0185b7e96..e40e276e04035dd21310865827ea52c80f704fde 100644 GIT binary patch literal 10791 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 VU&TB4t!V%N002ovPDHLkV1h7j^?CpR diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_off.png index 9da9ba51a1082d003b680705880d16d83503ef75..a3cac04acb3b5f649436c9c04811396ee7ab9eb9 100644 GIT binary patch delta 2748 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 diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/ca_on.png index eb8cbc1f8183f22467a88c49d340e8f864961ac9..b9a49e1ec9892b4a4beb9175fc56754b5d90d413 100644 GIT binary patch delta 3209 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 vby;@ha;G&MjTjCuIsQ#Am(Mx3CcFb4%Rw<Ro z>Dyd(H#ZU!lHesuBmo8Af{GW6B!c=Nf*|-HivARTfQfk$F;6~-zGzS)F&Yg)MNC}6 z8pK34#=T^Brl)AGn)4T~+`IDPxDwC>PG;P7>vCwpShM0B^T{|`HEUoETv{s_=aQ^g zV|5+)5dau{cYor^`(A|GD9C`*V*#A_{I_=a-l@<0h95RIHly~osVG^9Q`JfHbU95i z3d;p&GL%7UQ!ARiak6#i z=CJ@sgeSP)3Vj(!!I)*HG`7@bWf%p|Mc58~Oh2<_X@7LC%f4fmUM4t4kX#0ybT+sv z9+ZVfEi=9Z`uGL@;nA~*+>fG(FlcOS1?h5<>8#LYri%(38J0fk$mZsD6wh^%BFQy= za$A`uj6ga;EAS#`BhB(&mgjM%9GAucAee}q1+6fYzVy%zH`;(LEyl_P?g-qMbdC{v z469*^l7AsFIT1|=FcdvyFlYu?B+o~4!j`C&(?9^q4XXu!(K7^x3XBo*aI)cJ^r}b; ztyNJVn_X%J0>kKJI1zc2okHO`WrxDY(CL1aAyjLJUe;APWhhVb%#whu&j6z%1{fg~ zkGru^=Gx$=L=G5gDT+*np2TU!$WB=pV+up{cYl^SG6wTNAn{AMP>DMP5;JK@4{Agf z?@u$!OE)cr^M&tpq~8i8 zMoss1Wn(}-wzdQu1GH{xS&u^D0!xw?B@z!Qj_k*)6rC4J=|&UHBW+AsPEM_BkeK5WP!(MG+(jThsQEl@{JS{WgtBIKcLUH62hQ1J%l1XA3Ey z-I7rF3JRq9vPeKlJa6P+LPrk}xF1Fgf`5QP1NBp(Ae9PKGY9Q!`VDY8_`?Wkn80hV zzu`)9?42Ws$X1Ejy=w=ED*~3T_8?7j1mZFaQ6#`d92)Hjn4evQJS(8rRiL$YI+R#! zOz^REvKhegLIRn}p%{pkC=Mt;()xppmfYi$I!Z3s+OAPEFQg8BIrxgzTU zko^8^mnvGr)ne6}!6>KAs%M?fz<+MH9>C#4&%k=hk)y|M0Qh}yp*h@(P%qoufnN`u0l3a#&o_@iFdsq(DgZjB|0AGsZbt2`_Hk1V zP_#d`w~bdo=Voc`Pt2WX9v$7-G~PrlfYs?=xjzuE8^K$z2C(Q!`1tu~MDOsSCq~xa zp8fvc0a)#9wFu?8CprHUQ(4M0&+To$V=K&Fy#}A2_+rhSLH++0z`>^c8LEClE=hYVXu>Yy`l#i?>SZ?2iDT_E>Kj0vPn=ddpw576@^5;qw~+0000_rY(eK3#Vpg%+;Dz5C@x+V)u z0`13#wK{jgToTIN9)z%n)})EnqzNG`LI{gM`w3`2K?sY~hV>bB#yPsq3T6ZVK>PTd z3Xy4}sM8BYn1AUNMREMIQN2#*pk9Y?a>BH;CEy00=b7W3PG?F`Rq-7E0stgl{)jI` zfDnQ`>{A&45Q~}mZV^}%OahW5;ZiPO{0eZpFtrz{A_yU_5fIX8BpMAWFGXMxxJ7{H zd0^()jx3XaEWZH&;y4CE07fvigb-@O0!ybyg{7m#fq&P9h!y%(Od}w7dypi_7w0sw z!Po*tQIN@IJaJsB*5>lT_AT%Wa|FJ}W3=w?Hb)@Hah`60D*?dYE%-krnHMk?HA@vF z>%#3#iOL6uNB$ECa-6G;Z4Q*nCHm=oFJK#ieE!t2zX+1a)ba#2dJ!2P39s-zG@piF YF`2?d0uREQRsaA107*qoM6N<$g5fswmH+?% delta 969 zcmV;)12+7w1l|XbBYyx1a7bBm000ie000ie0hKEb8vp(&KMPLMS;Q)PaZu?5?-a_b>NNR5V~-dLu-LBM~7rFeIe3;h2P3 zr#4ED^L$UIFdA!6+dMmxXfxjW{8{pZC;=NgQ18T3^UEMYM{`P#;4Oo{G zf;7i{T0Yu);bk>M*Ihlh$~T}%3F1d3KRd$eLi@70J>>%kR4X8|lOf*y?$eUuw(f)p zS|R~E-yksS&5KUGRhkp(qaTC7t{8^#%`nw(T+FJ4a z(IB2&KZjgy1Y9&!5kqY(iiW0oG__2}VE-V@yoGcs2ita-BUPnCEE++b5rffWAfL%2 zpEr?Vj%C@9j#^$qlsO?T$9iiU+B#bB@#B}m3WN`|6FYJnTrc5B2R8qN`yog!q_*RL z$8s=&Wq;bPxK!di56vy~0?tp4;@ZqnZN*VB)kGAnab_H;@>}4YaH7HamPaIQB20xV zYG5d9agonrAo;;x1<6#^>*Dt&cfLzoV}r@p!zoo8OpGncZ!AuiIeMlhTn0L_jB z8&LSXOZkhBa~GrdGnB4@Z(zsvov0>`9X~m0;D24B2WQW9;&0&JDaUFRCIj*KH1uw` zgIqcbJI6a=gs`S}Hc4U4#esp23J4NF`J5(Sz4k$By-D1A}=Y znc*~Kp0}{gd&?OuvdWx7BJm!5y>EnXz(Z}UW=zlppL$Va7zBc9r_BChHc*){2P40PrUA^Bo|MB`#^7P6YfdVVbD3EZjaVFeE~_vf6U5dDyXiQ^~j|Phb3=fnu>=VMu5gh>V74X`YQQ{azm(|7(gc6iExtP}~00000NkvXXu0mjfsH4qJ diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json index 1c8714a8dbe..1da3a0a7336 100644 --- a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json +++ b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/. Edited by FoxxoTrystan", + "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/commit/cbe076402ed43b1cd861295bbcb95608c453de7a. Edited by chromiumboy", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png b/Resources/Textures/Structures/Power/Generation/Singularity/collector.rsi/static.png index 7d8c7a8c49c0d50a333def578ddb231367e3d74e..6097982ee260134d4413f66b77a391f69a499f97 100644 GIT binary patch delta 640 zcmV-`0)PF;444IwBYy&4NklV&qSXZ|d0;xb7Y}dd?rC2P}P-m>K{a<`E2q8Z>6Q1$HvPqyak_U;^-; z0kxvwcSUKKqks8KF)R!W4qSjI9x5$_f$gwdUZew~$CT7j?MAY8v@n4h1UhuiI@_ko=s zJ8(K(O%<az&f&(GpUTFm0SxuI0WaW1hP-_5MPS34AM280lSdYh<=v(>t!Sven7Sz8a0H7d>D2QT9DyQWTTb<8$h5DPmxw*}? aD#E`ZG) delta 1592 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 Wn)}~#Yr(bv0000(h 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json b/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json index 3b1da2fdae0..af5ebe04cf7 100644 --- a/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json +++ b/Resources/Textures/Structures/Walls/solid_rust.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/ and modified by FoxxoTrystan.", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/67a5373b4649937dd63dd94153e05e8506f40a5d and modified.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-0.png index 81f7b75d7bbb59bfd8b7b305b061c70754bb9787..3af1774039346e9d93c782bdef3367d85e240bdd 100644 GIT binary patch delta 2231 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 MNkvXXt^-0~f*({x+5i9m diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-1.png index 69acb7711555a22675a17c3f695e5230598504d0..57f9a29657b67e7984c906d83ca9b5cc3d218c42 100644 GIT binary patch delta 2241 zcmV;y2tN1V5&sd8R)3U9L_t(YOFdR=bKAxhy^Hr7API`3Y}rZd)OOTK-87GO#+~W( zTmN!Dww-=(CvGNjB-@elQv9GK5(GeC0W84nSt`>zkch|b-n-|Xd+xHoeQ_*_c4A9J zV`_WBD{^{07#LpkF3}+El30r;BAb}SI@}DR35k~Es|O;F2!A&Yk?jrB~5HO1^N zUmWX1@69H$M`d1+ldOt586`w!j|up;d7G0hh+NB?M9x*_wOISI6p7*JTQqg+x2{+2HPsPWYS8I@7tItbtdC@ zyw38&#WY)9<$o$nyjRw8={cAo%NGBM_?C2f_~0JBd8M_TY=?ezz53|hU0(CPts9cq zvQK-C+wIEr6OE`ECT9baFTa1+z(W7k}eexx^TviyY~}cLVs~5efKU z?w_BX90sIg4kjLr!*Lv5W~J{3hJ&?O7$uhDHoXkfv}AreXk<8+Za4;ZWhSa>h;%$>j zwL?L>ihqi1WbH@Fp2{ndH9k;TV=b2o+Po3#6#!dPkTn%Hv=ePvag96>hC(@z++l9Q zYG5{{;2a*MAbU%8<4k%drglSC zpdtCT8>%Xhn#vSOpE{daOBP8i?4`aJ%Do%xq<_MX8iNNG7-X5Aw%e)~ra^{Wt#idH z8IUxJrk*cuMK(i{8^>`;%8_R~I&+L&Qx+xpqNg3DyP9~t1?Mdj+!ffOCMA=oJgOO1 z&Xrrs!z~j-D*!eD;l0^;tEvwU80Sr7n47Lc1|u~BGZ`5%<~}_+{rkWE{ru#N1mFP- zsDBjo`RmiufBf^=)01D4*%97Uo!Xq~y3zu1T26?B!M81YIJmJcMHoA_=FOO~H8T-N zP2F;xeg22z>-FZ#lb7F~oPK-q^4ZCYXD?pAyI%eI)BEeyW_$T|8Uie@v!;s7pu^rU z{YFLfdy8>6IefR-00NG;L*p6#G4t}+?xPREa7n25ZO5yc^Q#T8DG{d%-%H7fG|e%2aes+g z5PN!*;q4NXQ3xo4gBaIoh0d4+&wrI^jOP6W7WsOWlh+s=>E1fG& zHgfEY9A{+PN+4lcRhQ?lS8&6HXn%w(dzE~AKuQqfpvLUVq6py18>xzusyhAo8XAMR^xu4N2NN9Ifm_dpoS|7De#~YjL8K}6Jrw;N zt=ef~c63zMJF53OAt3;sfG&a+O^xeLK$;WzmXnSr@86!+n@m5NE*xvO+J83fFyM0g z#;`188IA+mJ^l9Va+Ud>Wn0F@mQ&Yct4kr;i>vFOF5aSm(sYa%_ZwAKmj!LFZC79C z-E=m)&I)`jtZ3F$4QgYIAp@rYM6-Y`kj3gxKKuCV7w6Ak{&05w`oAx}e|D;_lb1jI z>C?x{t829=!!}vO=wN;e^M9F>u8NM(S!;Z4^#>o`x5IdoWrHY5G}=)6Zji}VCxgjd zS=Fa!Kh4t7?;pK4ACC{Glj$^_Pp4&7y*mFfos1UK2}02sIJeCz8IiF2tBPC{!Z`A; z^OF7X^T)>z9)0ut8&fs1#`0qa;UXk2I2~`Z%Y5hz#h=(R~t&| zOVZ3<3Mi6pJKC=CSwS{JfqTU&NhmnXi9*K((=RmTmgv$bLAl!Ed%%P&6tgsSa6AH5#U7n5i#>-Fi` zc^u$8BMclxkQ=5$%S__>(0<@F>!Rp-8Aqs+9g3(FIDc>X1Bo$lpEhHv4bz9f?M&yc z&!7MJ=6)!pJKFG;efIb`HsvP=)Cg+r5YncRUJ=_!5RSzbC{*8~Y*o`0PF~6A%U3@f zFQ!|GZ8ekW!D_Rlu1WCi>De3A!rZ!=gpWXxTtKBoX}&*8fFmyPwNI P00000NkvXXu0mjft$R&e delta 2210 zcmV;T2wnI85#SM!R)2L#L_t(YOBI&MmL0bdL;)nm8sE^}G)eJDByIU<;hm3n^8bH^ zwJ<66@P-;NCt!F}yQ)GW;zlI>{rA83I(GDlg7ISES3&0?cw}YK>TJ^+6q3iW zWC6HT#Y>c8arvwU+_u6;E&@@Q9LvNOPsk`ZXW4Zu!Iw`DF@Gb$@%`NCuI>>AHjYn* zQ^i!$Z0zQu;mrBWVrFXSYCVzOP=+&~g^9fYqIggUYGA$Onf2=FcrLbfLYEle>C?l5 zeh?tOZ6Su>*t#)!`>~_C?AD~q^%gJ}Twh!O#{(sqtoikx+C;GD*W34SF!3$;ypdoW zEuP=qb6TIeGk?a{6%_pR^sYZm_uI>ZIcgV`ItUrf5c}YQNs%?3r@763 zOKC1*(#Kv--g|=cS=3s9bjgU>X?i4ox%ofj{61rVfBgC(NUh)a*2UpbS6dh{rPzg~ zQqahm>d;Od!B3orflE%nhr)Rr1Bxs&?C3zhclz%I5p<}oTIcn6NEiA9B_uvk+ zuQDw@0t>ijMyE8&TsD4(sQPm^=0deTWhD$?`>511an-?wvh0Z`)Tr(S`bjV0+FY=w zbxD!$$P%N-Z`7`9Wzj|8iM2CAkJ0h2h}@5PwmC#2u62!&HXD|tm*tuFX2^rJnLfQvDTXYZ{&!S(~KKYa~$?D=~%thQFp~Q$J6RFdKI!%Cljj;O-@QEZxl#2 z6@1$mdJwm&F589dwGa?6tdpw5@ogY$L$rV_5ho*pcvG)dj!6z!12JZG6&#ecC;RxO z<9|iucJ*9qU-n8~qM=6+41WH6Y^ZuYh{2GfP$Qv65SzeqD}}~@AqA-T4Wo!bMEioV zUU%w!R*D&=J?DOOr>YDs6B&v~Qja7lPYO!}nW%C*qfd6g)CShRGc{_$sX;^Rik)q? z-EJ$q(n<_957RrJbbYoptg|9HRPIH>lz&6+rk%u|^qRD{iY6KwK=AS7JdzLYvN0D! z>hgMjjUXPO$+Dv8#$xjlH%VzaoX%=i3P9CZU5-uP?m{xcsrbo+bseh#C z(2)RS!xU9gEae9wdhq$s_!tSty%C(+Z_G8{-^1}VoBx)} zQ}>bg^3NaF57Woe8Np_(mrOfB8y>1x>@cxhH4}p6){pi+X$6eI)+*@Jsh!<@Ymm- zy3pfrB-?H3J_#dt{(^LopBrNd*or`n|FMwR|* zUsFh;3ADF_6Kc?L-PyWIM`7E;VQm+~Y@otOXogwvc8_oy3N_!I*$eW?$ba$JGUj;h zVoV#UJgi7nWZokX{T8Y?CrFRc*B&NF>H&k!&w7p)h-52`o*yb;<8Qzt9ourLOne*P*d3X!tX z(B{Z8VH0+pN9T;m^hrZ6y`mB8h?SK2sYh>ZT+k>r)>60dQFFw zvZKq+lZVNs@9^<2AKshpFY%u}GS{X(g69;(+trQx4MOy-&fBs;|0n<%!O*@sOO+oUA znzg-Ri>NqoXaVU-9I_B?v(Skdyh$JRTLaip~prVFXY z`Y>kGg%C{Jh*B$W>3;(!dYHO$fq;oB?{gH-&sQYR6whg>?muqb zzKgjdd3MX6`x<=hYQBqksEDmkVp6+{gBoHftXWpwqSOQnM8s~)ZPE!ZCo#6h~qt-%v=avQu7kyJUMY1w+0UE%X?^BsQq__Z5*Vk>Ez zPrIeGla;B;HKbh^y<_Qx&7~AyquPmeU8vOZwJnH<#NKfqvL>ZjeI*3=dc*OoE3Nlt zLFF}LJl?3ddw=1~Q~O3s-d>WlA2PB-ade5U)RpcsUK?pwcI?N3IY>s$v70z!$d!Of z6OUCnbmcJlJv1Q7tcfbZhPG9FO_4C!Eon<{6?ki%g0kViHl|pWp()Y;ru9ZVY*6D` z?`0wP%`wRlt>@NR)AkqYLd%KFf~z}a?-UJjuR#C(&wqdEmV~vAV#pIU1mbPClNpvu zX4Q0_MfNGT9vC*7`o7Z0q-qJVaWZ76I@2Ip1Koz)#bDQbJSj)h?WWIs-LizQUrv0f zdxKRGdA)jP?y8vU9tg?nHB{pHq< zB3jA?5%sBRBrnKo%&27;XndkpxjC^4Uqmi3ht+s#rHF~f6o2XuqJRi59#I%z&8aj@ z$tiW%=eKrDqW9JZoq+N*BdiZXX z$(yPaq~LN$yhoFWsOP{FSVA3YDLux^IIRS;U1oQPZ3Gl53Ox){Ol-@Q*=)YOeFe&h zg}~6zZ-6fdo;*9~^}54h(qYvSF4VLM)chp$6X0Z$$A2lxm`jGg+3#qTSVQzGMR+i8 z0UvxK02epH!-Ku8h)nFk#&i9+--(ZAc^F2PhqG9mbREwZjf#iEoP||ukmWf}K;5|F z+M8Auc6VSa+qPT7V||B$II;Y|50W`gx9DWxILHp_Ze;1iu&6=+Lj(nhP|aqQ_c?G!q3JTFNRfxIqCD zhGNx{T4HaPmB4I7&LnZl%XRSz)nV12YVmv?SFOu z+kYST4oCtXz<^58)8Fs!e|_)KgS}t6>*p|1)Y>`Q_mzXhsW`zB2Hmb|px{*MAgDU(m(Omk zW8~g<2WJK#BzC;e=@j`fJVWJZW?F^CPG2ff7*ziXTDI~Z3))7um}ZJmy?gEbUbp-C zCp%w%^Gy)C8^Zu}_UQY)&#qq`_By}2`T;Ur5$b(W^P=SZcn*y@@YUuAL-G>C@PBNc z9ibMaR!ez&Hb=_n06O5%Op;+z>$`XU{D&{T`u5$)?2CW>`|p3cty~wL*OJ#73?4BS z*{Wkv;!?-;7-$%OSfF$kIe|spBA5}v>+!bu~dkjH1jBUr(ThODUwv8y$R1AS+>G ztJf^^EK^+Ez5npe?q_%J-&dvZ0-U6{UXl-BvEK#0P7+NyYdByk)1ugac><1s2j+(t z&trq`OG{w+Vq^|WFe}y#p5@^avVe%iX&P+czkd)nZ11TcK7CQ z=dGezl#BW1TL0d6Ka^acfQG|9Y+O02rOY#0oVdO@P3zJ6`pGQAZ002Eq7X>RK9;nc zS^;-~Es(|OyEi|=@bedM4u1|`|L4i`NBhs8{PY?lw{Kh?UjE>c8+YcjSu1mr!f4CTk7lYe$zp1m7v=uJi}hje`u2Mp{r=WyFd7Xv zMx(qao*n)?9P~Cv1DIkmTbsd;7Ou7|-Q zFQ+XVb>fjtoU=M1fXezNp3k16&X~0vlZBO34;;malX)RoX7FbhDP#da_ zTU5@bmSgtgV3sX(!+9rB@$|>t-J@wXFZ13C0xgZul&G%+zl2IuQdGEjXpCeOM!2o$ z!o+Q^T(}4rI9JJBQu=0m>&C}aELQPo%w%J8kn~kK-G4tg>_oWFNDEgH#Dw5`)p&WIjE=xt_jy z3c4duEMM~{xFIms@#*`+BSP1Lf<9VKg)9`Bw1OBt4mqG1xaBDC6%2ULkQ&d{eFh(h zhaz9pi@-7~veB1D-KZ|o6)Z;5?TrPHq)$ delta 2207 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-3.png index ad5094443b9ad586d2b45c2f4f9bce0d5cc7d00e..2e7be27dd052dec7ba25dfe40051b9af101b3176 100644 GIT binary patch delta 2277 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_construct-4.png index 50b465c63be30104ea43b38b3ae3148d5c12b239..48a07386adb8a90c544e656f02f57d18b7d1542a 100644 GIT binary patch delta 2310 zcmV+h3HkQi5yTRZR)5(^L_t(YOD$GQj~z!9KGpBX?c4V~FWckTCSzxW2uX;8WQQnL zVkHug1)wM^wk+APV9O6-0YV}R2p}f`vcN_ll0cLMd;Az@n28+i%srwp zx$=X^A;ODA6O0kP!xn@b*5q3>2`?p3IbSLd=-#c64{2+ zZ(E<-ytRJflqhPl?7`aRV)B3`htygjK`=tYw(L=&dIk}HbPsx@f^+A#cXoH9AZY1C zifKD8Q4Y7Fn16JdmgKr71cl0k@Aqc&V0~>kA5Q{lCg$bfnQ$yfh=}8tD2qv@^IK=> z;T?q+g4fmbX!_LI%`D9-p5`RrvP)T)rY)kb0Z(8F`BYOd!OJ+{Inzz1`@~iqas{~- zrpY6=ZkFMEapA&wC?n<~hKhVc_#9{F&b@B8GZ?ge#($S^p`bNH&2GDP8*x&}%BU4G zlN5Wc=S!8?Lv#=zJy_QeAABMKXI9$WrtXECqcF)TZ; zgf|#O%;mL0nq?Rcbv&L)Z|XA9JAGZ~x?U?5>lx&DZOwLUr@hF6bvo)B2GBvB)i9VU z8gV4hMSoHN1U{ehG6MpFu}Aq=lZ@wcAw4WzJ0xENz)b zVMK0O(UJzsl(IAi<_+Eb;KoOwjkgl}9PV$$?aBICy1c%}WHE5aDK+0hiUs zUVnM^?Aq79IlaFVGU}+*WBHi5>y!r6=45<$b7wr8A4~k``&WS$o7gXZ|HtE*Ucd9o zOE1mG2UOsw#P(OiRB(<8(QPVEpWFKK{!R7lde7^xW%GxgqAdl>c-%2uDC4AORDXW^ z{*~`MKl0#EvA2J)xBu|o{(0CXOmdM zsbzZz87fCIQ6?ttj*3yNqQQIWnv>0d@e=tW#6d8_2own1l z92HRj&{0-I*RKEb2Ujnt3MouGeShkSjg6JfjgeG9G~5_&o;b-A)v`uEy!!H=uYVE~ zi-k4G$OJi9UCZj4rX)xVB}t>*2UDoY$}%rSR3Q+O(qDV=xwqfD(eT_diDMH!nP>ry zpc-Alw6I6SB!2te2XDT5nd}bYYqVRlj8z%JlmlEnm#`rVH{-D%FDAHRW01}m}O{O(;SAi6W?cclsNK>mv-<9|t8GpYP4YfL>J z?1kr_-rlsu&?GR~cobp}KuDZFlSbM5-Szx(R9|M31lu3UcMv2=4X zYE@yhLh&32Wb+W6O^B?@&ad|VH=Zhp3=d^_C_1{586`OtXqp-&Q?muw$N}J%WL~-a zOmq6hW=3|a$D@v@ihoGaD^UU`s%a_9++`t|uoUVgssy3nAk+3N$MY=MP&$+t!Tzx8 z01vu8G-OAh?_GY@rK;)JavbYelHrrc%cKw%s2?-TahV3T*Qw@;V`+sbr7p%q4vIyi zYU$}=hoJ@Wqy4)b9Sv)NPymiFWkBdHp^03G9F1R8g+Z~4D}Pcv#S-NaHla)6H!Car zQ;5eXIVT@Wajh+XP03iYH7Ops2x#-=bWsaHu_PHe3JW@t*$5maCCJ#-;%cDU>a zE-bZd2T)hHH-~+V&!Q}6sxEk5D@&#pR;y$#^-mUQu6te5eT~(50gDU-Bp_p8iJ;P! zR*&l*IelJ~+<)ruN}3GAimK97tvgzuF9P-a&|GnyI7(+V8~WZ*r*T>pB_$Q5U=OOw zyyE#1EfDMq&;Zk(u1_BwWVKm9X_1=>#n@Anptc@zs!=+hX@=VKoOu|d(CAT#mQOEV zx^y@T7irXOLLf(#OG=bif-hZ>^D;-J;{l3WZVR`S27m1$O2Je(pteOBl@vT2UwrNv zO5!FTmD*li>$iI%o!z>(>$h;9DK%V0kQ=6EBy`HunxC=qSr`_T@Y|@8C5S32ao=)l zDtnZ%`h(|?pExOsKDAK&?6duLHYHcMrxSb*V4sMY46gLFMe49SqJtTB3 zDCnW(aG)^9i_@% delta 2206 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 delta 2203 zcmV;M2xRxo64?=uR)20uL_t(YOBI&MjwHtsL}Ooat?KITA!kTPGn6Rspqn5F0?7aW z3{eMC(@Rz57Q2Tlc*$F4hKHFwbNchof9uI9g}8U@95UrL$W`1Vorf5J)z#>W%kR9B zGLE%K4l8O=lai}17d^nfS1}41iH7W1A+82OMkxdH%T~_b&@=hw9)4Bxw*?~q`;Q-^GUi?ET^gPYy2^;H z)vYYo3Rcb3#CGb$!z4r;gc5{@ScOPq1X+iU7zNs(*30yOQps<6fG@>_EBY27P{j*sCs0P!GK;W?2km0LzSmxKp=n$dXT7WY*5edq`e%RhE7%vnw%KdBZL7yt}w&v#u|qw?olH z@Iw=Tw0{C>jlbn!tFnprZ0aA-DZ#(|IMV!qcqbLb(hIr=PrGtzR%Flp#f~xFDH&%y zwkeFNJo0%y;YswRAg`2FQwCK00xZfH?d%F118*I-I}eEjK? z7Wql_4Tu;NA7vu zdVg|^?pIcOe8RTHeS?ZBcD~Ze838$oi2r);F@EatV zqD<};65b9PLeZL8ZGsSC^be>ltrHol%*u=;>p&{Y1eip%Um#>RKyCw@&{<4|2x`F+ zw?XHcZTI`e-zXAybu^2R4Zb*x+pI~6D1U;?kV`Dxbdc1O-jMcIHN@~1ApYsoJd%(8 zx-*|*?#i~jB`%+MlVtJgnVP=mx!EK-3QB6DetrK6k@|Z0 zC5Md+vK?75Lbp+Y$Iyv0zeOs^P5QdBo&*$!5w?om7pa~E~BW-#G2DgH!k4}VTz zMN&=dNaSRPMhzAeNR6c%uPwCbOb)U}hm6C<=v6eg*-qhEma(V2=V+xj zwJKKDn6JGClD2F|R0K0h(535fHh<|h2`t=K762*fac@TZ2wm66C+Iat3g(g?vksXp+rN6r@Ume)C#L>e{*j+ zW|`0*jc`&ACT$1XHsvYbk9gYJ#V{ACw2C9KE8LgF??a{bcW;jhOLmz_M}J8rA*H+% z6mbKp6AJ-2G4Bzb?MhaMi-`MSRxGvf@BaG8Bvis?Go@+LPvuE8u0Tb|eKWG~>Y%R; zf^2U3=Y=;q@G+A^6#8_Td4!~WazS!&(!C9rozPa8COgGXD`WIuzx=zSewf1Ai6)?9w7+U*OIEYg>i)rAVZ-0x?L62ZC|~>Ez?kfk|R?z zNZAr+`Tcl-+Cmd=v{mOWVfH@r?>;|~jtdXOwk);E(%8c!PrlTg1%GW3HHvbgvI8!Z z<1K5=UQJ=fqi%IYAR`sT_Y@f9`lhw?igavSI2lKZNSLVvtqXB1 zwu>>^wh`r4-YP^v%zrR-^?^sCxIGOP&sNC?(DUE~KiSqTA5hKDBuqQIV>zv@eptR# zUYML(8!clSuCeHY?$i#BBRn3}Whp{*;ivc4}#zP#LkyimC00sVjcw*M~Y zj+EK2|2wuAu*0&*c|d^HCn@X0r$G;?R@N-5@5vstjgb2&4S#z9nU1R$S!Z8WV~pb6 zZj{#1_Gm_DLIeAgjQ()m1Sct}Oh|pML1Zo;W0J^J%w~ z53(_h!ti{UY7VHqbfwlBFzJIh-$kTOY;8dVAZ~$UD27ytuo1$=c8Bp|kmAxTsDoil zq&t;MklsGGZ+|rM_KM`=RDhkTr)%;RH+raa6HMONxgRT(s2H{9ZW4@v(2`>-iGr@#E;pQe!zaetIUnW!Z^-48d}VMQ|Qrt>UI z$fXb%cAEPhX<|w@LhOPJg`+7nN=$ekN|&PB%K1Tin(udW5!+rA|KZDnSn+6K)kNKH z!P}+v%I%1Rl dSBn_`4-|G%(+ua+k(dAg002ovPDHLkV1kYxN;3ce diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over0.png index ce5adc65b5d1ef61d0c96091b9af8d7d0de684e4..89314482b3a3b392d3c07d3092e1ec06d182fe21 100644 GIT binary patch delta 3188 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over1.png index dd8b232de2603ce230615aed76d020399506ca91..79fb38bd6ac42893ee9a5f6b8f474289f81b2dbb 100644 GIT binary patch delta 2946 zcmV-|3w`v48Lk(QNq@rt01m?e$8V@)000X^Nkl7RQs>Jht0*Z&h7O zck!KD-A>43%2L_+Jh!U5y4n|#89{8O-#F5da?dV1rRMD7Iq`t_eDgW(9tpaUBkNeJMu+k?Od%pwr5Dic)mDPLS@4>{7uh@CbLn!?uOxr@@lN4g| z#FnMwum8H1iGP5?_?$aDuLqBv57j$Y9fbs&qiOs|K#RO9&X@~RZxf5VufD&E1 zI37o_15Ft@;Q%GuK#AuHx>%g6tIyl59_F9W39ur>kJ2dq!(BlO!3ZNSXM}ElY z(5JcdQPvMfymKc&x*;8=rb9DLgo%Z%0AT+W84P&p=<^=(f$0jPgNQ@erekDB{uZE2 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over3.png index dd8b232de2603ce230615aed76d020399506ca91..79fb38bd6ac42893ee9a5f6b8f474289f81b2dbb 100644 GIT binary patch delta 2946 zcmV-|3w`v48Lk(QNq@rt01m?e$8V@)000X^Nkl7RQs>Jht0*Z&h7O zck!KD-A>43%2L_+Jh!U5y4n|#89{8O-#F5da?dV1rRMD7Iq`t_eDgW(9tpaUBkNeJMu+k?Od%pwr5Dic)mDPLS@4>{7uh@CbLn!?uOxr@@lN4g| z#FnMwum8H1iGP5?_?$aDuLqBv57j$Y9fbs&qiOs|K#RO9&X@~RZxf5VufD&E1 zI37o_15Ft@;Q%GuK#AuHx>%g6tIyl59_F9W39ur>kJ2dq!(BlO!3ZNSXM}ElY z(5JcdQPvMfymKc&x*;8=rb9DLgo%Z%0AT+W84P&p=<^=(f$0jPgNQ@erekDB{uZE2 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 JPDHLkV1k@(WV!$V delta 3149 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over5.png index d0384e6f2b4af36283ac4b470bbd10fee64c74ee..a9d7e7173785fed126e8dd104c6b89171fb666d5 100644 GIT binary patch delta 2864 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over6.png index e6c25bf9542e09ddf61db4f4d36e5c284f327fba..3fd3d1f3a2608362673dbbf1a875b989502fcbdc 100644 GIT binary patch delta 2859 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 JPDHLkV1k@(WV!$V delta 3149 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/reinf_over7.png index 45a43655f63538bf0c87c3d80f63f39cc7b8f211..970ef1f1f5d37be02883f75dac02757445580d97 100644 GIT binary patch delta 2795 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 MNkvXXt^-0~f-km3f&c&j diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid0.png index a82cf0533717421d96cddf6f73b23e8e8b90e690..b6720ad5a32d08322db2a247b5d749d2fd88d04b 100644 GIT binary patch delta 2899 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid2.png index a82cf0533717421d96cddf6f73b23e8e8b90e690..b6720ad5a32d08322db2a247b5d749d2fd88d04b 100644 GIT binary patch delta 2899 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid4.png index ba6ac0281f9fb64913d60d50c23036cabc209da0..f31f3a6bc985a32e1d956f1cb578bd55fb0843a2 100644 GIT binary patch delta 2507 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 Ef_zHf+W-In diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid5.png index d0384e6f2b4af36283ac4b470bbd10fee64c74ee..7c18f9c11a717a893b219d4495d07f6801e43ee2 100644 GIT binary patch delta 2518 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 delta 3086 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 diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid6.png index ba6ac0281f9fb64913d60d50c23036cabc209da0..8737894cbf0f7b8e5edaff7ed5d4fe981dbaf434 100644 GIT binary patch delta 2484 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 Ef@F2y!~g&Q diff --git a/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png b/Resources/Textures/Structures/Walls/solid_rust.rsi/solid7.png index 45a43655f63538bf0c87c3d80f63f39cc7b8f211..15f74bcaeed2dbd44a6a4e062af82cdbbdcdda33 100644 GIT binary patch delta 2448 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 delta 3040 zcmV<63m^2q6N?y-Nq@os01m}g(f6}Yo zG_(>RKr8*J009rZX`uBvs$`NeNBE>0`S=AH4Fo_dBv@HwdeP0zuALi<6gW8k@|XWi zRk~nZX7r`Pb#f58z-(IRFAZ^Su*?B6w#c#@CU=L5fNvT^r+@ML@Bg!F5AyYRSf~Iz zrUy5f;pzp1b-4Ef(B;rqgXBD-?2$so7q_rDA;mMouMuuZuT_2?hbLg<*CoF|^H{%} z#pH9y#$#+Ue10YPyhY%qHBbFH2zZs46aiCbsN?N+8RoN$tSzJC<3g+^i$f@Y=64hH_U$j{^O1l($aF(p*<2}|J-{zI|H6Eat^(Sdu` zVGI+rEZ71Il3wA=fJ_Mt1^Z`b9G(E*Np4dDsv zx>jgdDI(8Nvl{ls;R$eZE9nQs*rSgUZgeOsK86KKR)2`g1XUy$U!w_UjD7*m6?(I< zd)C(~Kaax`AnP8U$FErK8D{u&hFB*EZ;?JNwlkizL~Rll++o)eVp0^v30d_93Ba9- zjseq&kNLwfb(8jg{nQn zl5-~Aqeh2D8$@LhnTS(iu$WI|grU80cmlMYxlx{We&y7Qm_OJMrbCzYSSWyHo1;$! zN833T&0I z^~laRJOL2YfZ`J~)qlQLP)fsC3opJ9C(1rIU)IE4&VTRe2~H8UEucGrROYWmejdlS zfPdBKdkUT)>put7?u*n%80tucn5YFFaz0c1s1a0w#&Fv#Sy5k|{xpv*Yqm487QH1wh|`gf6Gl`{>ELdt((P7?|`J!eOZMETSY$lC@M_dYFuT;}56YZ4x<3@gGRWo(Zp zbwTB1`2i=2;?c1?0g2GE=o(|*A%9f`)YIZg&U`Wr^P+_1odp-(xC|O z9lI0IR}mQ%&a4ks0n2_m!A5R8cues|J2M~^7LMAGh_!xcFbr%LD2`6^T7TuZ*qwle zqpi&p){7$K)Ucz28ghhN;O3vG_Y#E`?14jRct2;7wC!nn+NP2hM zf(k!f;3uxb;iGQMap^GCunhgsNj@=0mH0EVb>Ps!23)Q_WQ3sM>Pw!r_ z*Etz{(nMy*mKc$Hjm~(EM1@7|cXNAVcLG*nK%0(Q6i_8a&@0H2Uj1|?3`H6rkFwyu ze@>_}j?IQGF_uJS8YKM&9MBKc`CmO2@_&_xz>0Hm7_d+e-0F~R)qkM5;Zub!mGJ8c zSIgIo4dk-_y8hnSoq)VrpntP;fBbrGP?S*=1lS+c znWDBRdjBgV(YL)!+!oxk47y6V7>o2I7mP$-@yESBW@h>SKYY5oH+Cl=(tiSbCLuRDQcuF;_kFO4 zgM;B1%tD4|Bqm$IlOGW?gJEsax)pkOgG*xlCVprz&kvqOfrVNdmMLt>xI z_#_z?Oh&OPl*M+BVQl; zJ8al4pS>12Fn@L@V2UM@?QosBu`Gulh{oarbpxChTH;FuxAdsg{C$ChdBPeC%mgT# z-oOl5McnH)K+c^4-b<#+WY{&B3g|H;590(7`qd&$_^D3y`tiW5D_{4ge)?CX;I24#OcUNnb}q?E5|`)WQ>M-LYu9AlT3@l_0jOT{pWXh z0=h24B&Za_f=i!R3G@-P*S4^19r8jO@OV;R9yOvUa1R$a^1~$j_lGTe<9HRSXr{~) zA%EY-ro@<42p3vrCL&H6L9r2LY>&|E7(MJJA6f&+#81{AkG0FrlOC~&|!wGX_UxF z(Ml`}F?$kNI>QN4A+7^Tj!{KlF-;5F;(rZpl!RIFwA-)0aFmiE7Ej@0kIR~r$&*iH zhlL=OmWV-dv`R^x=(fwvsM>Mr-H+9@d)BVAR+|OYQ@xjR{@3sdC5w+zCjDfGdX`PFa>b_ll~stgd-9s4a2G! zdCDclv8uM~i}V6j4@ENkq7N|R8;rp)MyTyW6861*5^paF#yC Date: Sun, 16 Jun 2024 08:39:17 -0700 Subject: [PATCH 44/79] Mirror: Trading Outpost now has half buy-only and half sell-only pallets (#191) ## Mirror of PR #25955: [Trading Outpost now has half buy-only and half sell-only pallets](https://github.com/space-wizards/space-station-14/pull/25955) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `c0bbbc33c19eafcc8defaa7f1ec2df42e485b435` PR opened by wafehling at 2024-03-10 02:47:02 UTC --- PR changed 8 files with 226 additions and 123 deletions. The PR had the following labels: - Changes: Sprites - Status: Needs Review ---

Original Body

> ## About the PR > I added two new entity types, a buy and sell only cargo pallet, and added them to the trading outpost in place of the old pallets. > > ## Why / Balance > Since the day this was added, every single shift, at some point I'll hear someone in cargo yelling about how **"You sold stuff I just bought!"** > > This seemed like the easiest way to fix the problem. > > ## Technical details > Added a variable to the cargo pallet component for labeling which type it is, added two new varieties of the cargo pallet to the yml, and adjusted all the calls for GetCargoPallets() to have boolean variables for buyOnly and sellOnly to tell the function what kind of call you're looking for. > > If you don't give it any specifics it'll still treat any pallet as a two-way one, but this function is only called 2 or 3 times and I've adjusted them all and commented the function itself for anyone looking to change/add it in the future. > > The old pallet is still in the game and is set to "both" by default, so it should work just fine for backwards compatibility. > > ## Media > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/38cdf849-3e05-4f98-957f-65a719c2280d) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/56e471e9-b45e-4332-bd55-7220566542ab) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/a5e8e651-d301-420a-b2d7-cc4cf07a50af) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/fdf2cf4c-fba8-46c9-9a30-7313a2204b5e) > ![image](https://github.com/space-wizards/space-station-14/assets/1471082/3811edd0-bb32-44cf-b884-e0a9f4bf16fa) > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > Shouldn't break anything, I've left the old pallets fully in, and updated them to work with the new GetCargoPallets() function just like they used to. Not sure if/where you'd still need them, but better safe than sorry. > > **Changelog** > :cl: > - tweak: The trading outpost now has dedicated buy-only and sell-only pallets. No more accidentally selling orders you just bought. Cargonians rejoice! >
Co-authored-by: SimpleStation14 --- .../Cargo/Components/CargoPalletComponent.cs | 21 +- .../Cargo/Systems/CargoSystem.Orders.cs | 2 +- .../Cargo/Systems/CargoSystem.Shuttle.cs | 15 +- Resources/Maps/Shuttles/trading_outpost.yml | 263 ++++++++++-------- .../Objects/Specific/Cargo/cargo_pallet.yml | 31 +++ .../cargo_pallets.rsi/cargo_pallet_buy.png | Bin 0 -> 551 bytes .../cargo_pallets.rsi/cargo_pallet_sell.png | Bin 0 -> 535 bytes .../Structures/cargo_pallets.rsi/meta.json | 17 ++ 8 files changed, 226 insertions(+), 123 deletions(-) create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell.png create mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/meta.json diff --git a/Content.Server/Cargo/Components/CargoPalletComponent.cs b/Content.Server/Cargo/Components/CargoPalletComponent.cs index ebf0be93e0c..cdfd0a3874f 100644 --- a/Content.Server/Cargo/Components/CargoPalletComponent.cs +++ b/Content.Server/Cargo/Components/CargoPalletComponent.cs @@ -1,7 +1,26 @@ namespace Content.Server.Cargo.Components; +using Content.Shared.Actions; +using Robust.Shared.Serialization.TypeSerializers.Implementations; /// /// Any entities intersecting when a shuttle is recalled will be sold. /// + +[Flags] +public enum BuySellType : byte +{ + Buy = 1 << 0, + Sell = 1 << 1, + All = Buy | Sell +} + + [RegisterComponent] -public sealed partial class CargoPalletComponent : Component {} +public sealed partial class CargoPalletComponent : Component +{ + /// + /// Whether the pad is a buy pad, a sell pad, or all. + /// + [DataField] + public BuySellType PalletType; +} diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index ebe66ff029e..d8b55a7237f 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -205,7 +205,7 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com // Try to fulfill from any station where possible, if the pad is not occupied. foreach (var trade in _listEnts) { - var tradePads = GetCargoPallets(trade); + var tradePads = GetCargoPallets(trade, BuySellType.Buy); _random.Shuffle(tradePads); var freePads = GetFreeCargoPallets(trade, tradePads); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index 3e39440da56..b8a491f4e89 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -198,13 +198,16 @@ private List GetProjectedOrders( ///
- [DataField] + [DataField, AutoNetworkedField] public bool IgnoreWeightless; + + /// + /// Does this have separate "StepOn" and "StepOff" triggers. + /// + [DataField, AutoNetworkedField] + public bool StepOn = false; } [RegisterComponent] diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index ede39b2aa97..b4ac2cde756 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -11,6 +11,7 @@ public sealed class StepTriggerSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedMapSystem _map = default!; public override void Initialize() { @@ -40,7 +41,9 @@ public override void Update(float frameTime) while (enumerator.MoveNext(out var uid, out var active, out var trigger, out var transform)) { if (!Update(uid, trigger, transform, query)) + { continue; + } RemCompDeferred(uid, active); } @@ -56,7 +59,8 @@ private bool Update(EntityUid uid, StepTriggerComponent component, TransformComp if (component.Blacklist != null && TryComp(transform.GridUid, out var grid)) { - var anch = grid.GetAnchoredEntitiesEnumerator(grid.LocalToTile(transform.Coordinates)); + var positon = _map.LocalToTile(uid, grid, transform.Coordinates); + var anch = _map.GetAnchoredEntitiesEnumerator(uid, grid, positon); while (anch.MoveNext(out var ent)) { @@ -109,8 +113,16 @@ private void UpdateColliding(EntityUid uid, StepTriggerComponent component, Tran return; } - var ev = new StepTriggeredEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref ev, true); + if (component.StepOn) + { + var evStep = new StepTriggeredOnEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } + else + { + var evStep = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } component.CurrentlySteppedOn.Add(otherUid); Dirty(uid, component); @@ -130,7 +142,7 @@ private bool CanTrigger(EntityUid uid, EntityUid otherUid, StepTriggerComponent var msg = new StepTriggerAttemptEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref msg, true); + RaiseLocalEvent(uid, ref msg); return msg.Continue && !msg.Cancelled; } @@ -163,6 +175,12 @@ private void OnEndCollide(EntityUid uid, StepTriggerComponent component, ref End component.CurrentlySteppedOn.Remove(otherUid); Dirty(uid, component); + if (component.StepOn) + { + var evStepOff = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStepOff); + } + if (component.Colliding.Count == 0) { RemCompDeferred(uid); @@ -230,9 +248,14 @@ public struct StepTriggerAttemptEvent public bool Cancelled; } +/// +/// Raised when an entity stands on a steptrigger initially (assuming it has both on and off states). +/// [ByRefEvent] -public struct StepTriggeredEvent -{ - public EntityUid Source; - public EntityUid Tripper; -} +public readonly record struct StepTriggeredOnEvent(EntityUid Source, EntityUid Tripper); + +/// +/// Raised when an entity leaves a steptrigger if it has on and off states OR when an entity intersects a steptrigger. +/// +[ByRefEvent] +public readonly record struct StepTriggeredOffEvent(EntityUid Source, EntityUid Tripper); diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 90445a31d1c..6f18510d17b 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -226,3 +226,8 @@ copyright: TGStation at 3df5d3b42bfb6b3b5adba1067ab41f83816255bb license: CC-BY-SA-3.0 source: https://github.com/tgstation/tgstation/blob/3df5d3b42bfb6b3b5adba1067ab41f83816255bb/sound/misc/server-ready.ogg + +- files: [beep_landmine.ogg] + copyright: '"beep_landmine.ogg" by kaktuscsc of Discord for SS14' + license: "CC-BY-SA-3.0" + source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f diff --git a/Resources/Audio/Effects/beep_landmine.ogg b/Resources/Audio/Effects/beep_landmine.ogg new file mode 100644 index 0000000000000000000000000000000000000000..48bc5e21d962084a1db41c473f30892d914894ae GIT binary patch literal 6034 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 Bu4e!M literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml index 9088edc8159..a3e3485bc65 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml @@ -35,9 +35,13 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: LandMine - - type: TriggerOnStepTrigger + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: StepTrigger requiredTriggeredSpeed: 0 + stepOn: true - type: entity name: kick mine @@ -57,7 +61,6 @@ - type: Construction graph: ModularMineGraph node: emptyCase - - type: LandMine - type: entity name: explosive mine @@ -71,4 +74,3 @@ intensitySlope: 3 totalIntensity: 120 # about a ~4 tile radius canCreateVacuum: false - - type: DeleteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 8d3c83e3e1e..2ddb21b9e6c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -230,6 +230,7 @@ - type: StepTrigger intersectRatio: 0.2 requiredTriggeredSpeed: 0 + stepOn: true - type: CollisionWake enabled: false - type: Physics @@ -251,6 +252,10 @@ mask: - ItemMask - type: LandMine + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: ExplodeOnTrigger - type: Explosive explosionType: HardBomb # normally Default and max 5 total 60 From c03835e47c54da8401a283acc23987b83615a56e Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Mon, 17 Jun 2024 06:25:29 -0700 Subject: [PATCH 52/79] Workflow to Automatically Title Case PRs (#468) # Description Hooray, more JavaScript! I tested this on a personal repo with a new PAT, but it *should* work here first try. --------- Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .github/workflows/prtitlecase.yml | 34 +++++++++++++++++++++++++++++++ Tools/changelogs/package.json | 2 ++ Tools/prtitlecase/index.js | 19 +++++++++++++++++ Tools/prtitlecase/package.json | 12 +++++++++++ 4 files changed, 67 insertions(+) create mode 100644 .github/workflows/prtitlecase.yml create mode 100644 Tools/prtitlecase/index.js create mode 100644 Tools/prtitlecase/package.json diff --git a/.github/workflows/prtitlecase.yml b/.github/workflows/prtitlecase.yml new file mode 100644 index 00000000000..0c5a38a4e8a --- /dev/null +++ b/.github/workflows/prtitlecase.yml @@ -0,0 +1,34 @@ +name: PR Title Case +on: + pull_request_target: + types: [opened, edited, synchronize] + +env: + GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + +jobs: + prtitlecase: + runs-on: ubuntu-latest + steps: + - name: Checkout Master + uses: actions/checkout@v3 + with: + token: ${{ secrets.BOT_TOKEN }} + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18.x + + - name: Install Dependencies + run: | + cd "Tools/prtitlecase" + npm install + shell: bash + + - name: Change Title + run: | + cd "Tools/prtitlecase" + node src/index.js + shell: bash diff --git a/Tools/changelogs/package.json b/Tools/changelogs/package.json index 512a3624c87..1f0899df96c 100644 --- a/Tools/changelogs/package.json +++ b/Tools/changelogs/package.json @@ -1,5 +1,7 @@ { "name": "changelogs", + "author": "DEATHB4DEFEAT", + "license": "MIT", "dependencies": { "axios": "^1.3.4", "js-yaml": "^4.1.0" diff --git a/Tools/prtitlecase/index.js b/Tools/prtitlecase/index.js new file mode 100644 index 00000000000..0d72b711312 --- /dev/null +++ b/Tools/prtitlecase/index.js @@ -0,0 +1,19 @@ +import axios from 'axios'; +import { titleCase } from 'title-case'; + +if (process.env.GITHUB_TOKEN) axios.defaults.headers.common['Authorization'] = `token ${process.env.GITHUB_TOKEN}`; +else throw new Error('BOT_TOKEN was not provided in repository secrets or GITHUB_TOKEN was not set correctly.'); + + +// Get PR title +let prTitle = await axios.get(`https://api.github.com/repos/${process.env.GITHUB_REPOSITORY}/pulls/${process.env.PR_NUMBER}`) + .then(res => res.data.title); + +// Title case PR title +console.log(`Old PR title: ${prTitle}`); +prTitle = titleCase(prTitle); +console.log(`New PR title: ${prTitle}`); + +// Update PR title +await axios.patch(`https://api.github.com/repos/${process.env.GITHUB_REPOSITORY}/pulls/${process.env.PR_NUMBER}`, + { title: prTitle }); diff --git a/Tools/prtitlecase/package.json b/Tools/prtitlecase/package.json new file mode 100644 index 00000000000..ecba01099fe --- /dev/null +++ b/Tools/prtitlecase/package.json @@ -0,0 +1,12 @@ +{ + "name": "prtitlecase", + "description": "Converts PR titles to Title Case using title-case package", + "type": "module", + "exports": "./index.js", + "author": "DEATHB4DEFEAT", + "license": "MIT", + "dependencies": { + "axios": "^1.7.2", + "title-case": "^4.3.1" + } +} From 17cf334c16290489c5a95e47e9eac5cfd2f227c7 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 17 Jun 2024 17:15:13 -0400 Subject: [PATCH 53/79] Revert "Merge branch 'master' of https://github.com/VMSolidus/Einstein-Engines" This reverts commit 15a750005d6c2007017b5a6063d4749aeb3363f7, reversing changes made to ffaa8b6648a5dc334b0eca0cba24342d8b7606ba. --- .github/workflows/changelog.yml | 4 +- .github/workflows/prtitlecase.yml | 34 --- BuildChecker/BuildChecker.csproj | 4 +- BuildChecker/git_helper.py | 110 ++++++++ BuildChecker/hooks/post-checkout | 13 + BuildChecker/hooks/post-merge | 5 + Content.Client/Gameplay/GameplayState.cs | 8 +- ...GameScreen.xaml => DefaultGameScreen.xaml} | 4 +- ...reen.xaml.cs => DefaultGameScreen.xaml.cs} | 4 +- .../UserInterface/Screens/ScreenType.cs | 8 +- .../Systems/Chat/ChatUIController.cs | 16 +- .../Systems/Vote/VoteUIController.cs | 6 +- .../Cargo/Components/CargoPalletComponent.cs | 21 +- .../Cargo/Systems/CargoSystem.Orders.cs | 2 +- .../Cargo/Systems/CargoSystem.Shuttle.cs | 15 +- .../Ensnaring/EnsnareableSystem.Ensnaring.cs | 4 +- .../Explosion/EntitySystems/TriggerSystem.cs | 4 +- Content.Server/LandMines/LandMineComponent.cs | 9 +- Content.Server/LandMines/LandMineSystem.cs | 46 +-- Content.Server/Tiles/LavaSystem.cs | 4 +- Content.Shared/CCVar/CCVars.cs | 6 +- Content.Shared/Chasm/ChasmSystem.cs | 4 +- .../MovementSpeedModifierComponent.cs | 2 +- .../Physics/FrictionRemoverSystem.cs | 25 -- Content.Shared/Slippery/SlipperySystem.cs | 4 +- .../Components/StepTriggerComponent.cs | 8 +- .../StepTrigger/Systems/StepTriggerSystem.cs | 41 +-- LEGAL.md | 4 +- README.md | 27 +- RUN_THIS.py | 13 + Resources/Audio/Effects/attributions.yml | 5 - Resources/Audio/Effects/beep_landmine.ogg | Bin 6034 -> 0 bytes Resources/Changelog/Changelog.yml | 2 +- Resources/Credits/GitHub.txt | 2 +- Resources/Maps/Shuttles/trading_outpost.yml | 263 ++++++++---------- .../Clothing/OuterClothing/wintercoats.yml | 40 +-- .../Prototypes/Entities/Mobs/Species/moth.yml | 4 +- .../Consumable/Drinks/drinks-cartons.yml | 23 +- .../Consumable/Drinks/trash_drinks.yml | 59 ++-- .../Entities/Objects/Misc/land_mine.yml | 8 +- .../Objects/Specific/Cargo/cargo_pallet.yml | 31 --- .../Objects/Specific/Janitorial/janitor.yml | 5 - .../Structures/Decoration/curtains.yml | 4 +- .../Recipes/Construction/furniture.yml | 40 ++- .../equipped-OUTERCLOTHING.png | Bin 0 -> 9460 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 10509 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9875 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10492 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9782 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10959 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9936 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10546 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9675 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10494 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10740 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 8727 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9455 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 8689 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9750 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 8865 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 8433 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9422 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9418 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9578 bytes .../icon.png | Bin .../meta.json | 0 .../cargo_pallets.rsi/cargo_pallet_buy.png | Bin 551 -> 0 bytes .../cargo_pallets.rsi/cargo_pallet_sell.png | Bin 535 -> 0 bytes .../Structures/cargo_pallets.rsi/meta.json | 17 -- Scripts/bat/buildAllDebug.bat | 1 + Scripts/bat/buildAllRelease.bat | 1 + Scripts/bat/buildAllTools.bat | 1 + Scripts/sh/buildAllDebug.sh | 1 + Scripts/sh/buildAllRelease.sh | 1 + Scripts/sh/buildAllTools.sh | 1 + Tools/{changelogs => changelog}/changelog.js | 0 Tools/{changelogs => changelog}/package.json | 2 - Tools/prtitlecase/index.js | 19 -- Tools/prtitlecase/package.json | 12 - shell.nix | 1 + 98 files changed, 456 insertions(+), 542 deletions(-) delete mode 100644 .github/workflows/prtitlecase.yml create mode 100644 BuildChecker/git_helper.py create mode 100755 BuildChecker/hooks/post-checkout create mode 100755 BuildChecker/hooks/post-merge rename Content.Client/UserInterface/Screens/{OverlayChatGameScreen.xaml => DefaultGameScreen.xaml} (96%) rename Content.Client/UserInterface/Screens/{OverlayChatGameScreen.xaml.cs => DefaultGameScreen.xaml.cs} (94%) delete mode 100644 Content.Shared/Physics/FrictionRemoverSystem.cs create mode 100755 RUN_THIS.py delete mode 100644 Resources/Audio/Effects/beep_landmine.ogg create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_bishop_cybernetics.rsi => bc_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_bishop_cybernetics.rsi => bc_corpo_jacket.rsi}/meta.json (100%) delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_cybersun.rsi => cs_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_cybersun.rsi => cs_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_discount_dans.rsi => dd_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_discount_dans.rsi => dd_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_einstein_engines.rsi => ee_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_einstein_engines.rsi => ee_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_five_points_armory.rsi => fa_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_five_points_armory.rsi => fa_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_gilthari_exports.rsi => ge_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_gilthari_exports.rsi => ge_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hephestus_industries.rsi => hi_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hawkmoon_aquisitions.rsi => hi_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hawkmoon_aquisitions.rsi => hm_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hephestus_industries.rsi => hm_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_interdyne.rsi => id_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_interdyne.rsi => id_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_zeng_hu_pharma.rsi => zh_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_zeng_hu_pharma.rsi => zh_corpo_jacket.rsi}/meta.json (100%) delete mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png delete mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell.png delete mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/meta.json rename Tools/{changelogs => changelog}/changelog.js (100%) rename Tools/{changelogs => changelog}/package.json (68%) delete mode 100644 Tools/prtitlecase/index.js delete mode 100644 Tools/prtitlecase/package.json diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 877273d7645..a44cac2cd1a 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -35,14 +35,14 @@ jobs: - name: Install Dependencies run: | - cd "Tools/changelogs" + cd "Tools/changelog" npm install shell: bash continue-on-error: true - name: Generate Changelog run: | - cd "Tools/changelogs" + cd "Tools/changelog" node changelog.js shell: bash continue-on-error: true diff --git a/.github/workflows/prtitlecase.yml b/.github/workflows/prtitlecase.yml deleted file mode 100644 index 0c5a38a4e8a..00000000000 --- a/.github/workflows/prtitlecase.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: PR Title Case -on: - pull_request_target: - types: [opened, edited, synchronize] - -env: - GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} - PR_NUMBER: ${{ github.event.pull_request.number }} - -jobs: - prtitlecase: - runs-on: ubuntu-latest - steps: - - name: Checkout Master - uses: actions/checkout@v3 - with: - token: ${{ secrets.BOT_TOKEN }} - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: 18.x - - - name: Install Dependencies - run: | - cd "Tools/prtitlecase" - npm install - shell: bash - - - name: Change Title - run: | - cd "Tools/prtitlecase" - node src/index.js - shell: bash diff --git a/BuildChecker/BuildChecker.csproj b/BuildChecker/BuildChecker.csproj index d4f9a412549..63d16fa9708 100644 --- a/BuildChecker/BuildChecker.csproj +++ b/BuildChecker/BuildChecker.csproj @@ -14,6 +14,8 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild --> + python3 + py -3 {C899FCA4-7037-4E49-ABC2-44DE72487110} .NETFramework, Version=v4.7.2 false @@ -37,7 +39,7 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild bin\DebugOpt\ - + diff --git a/BuildChecker/git_helper.py b/BuildChecker/git_helper.py new file mode 100644 index 00000000000..becd4506e82 --- /dev/null +++ b/BuildChecker/git_helper.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +# Installs git hooks, updates them, updates submodules, that kind of thing. + +import subprocess +import sys +import os +import shutil +from pathlib import Path +from typing import List + +SOLUTION_PATH = Path("..") / "SpaceStation14.sln" +# If this doesn't match the saved version we overwrite them all. +CURRENT_HOOKS_VERSION = "2" +QUIET = len(sys.argv) == 2 and sys.argv[1] == "--quiet" + + +def run_command(command: List[str], capture: bool = False) -> subprocess.CompletedProcess: + """ + Runs a command with pretty output. + """ + text = ' '.join(command) + if not QUIET: + print("$ {}".format(text)) + + sys.stdout.flush() + + completed = None + + if capture: + completed = subprocess.run(command, cwd="..", stdout=subprocess.PIPE) + else: + completed = subprocess.run(command, cwd="..") + + if completed.returncode != 0: + print("Error: command exited with code {}!".format(completed.returncode)) + + return completed + + +def update_submodules(): + """ + Updates all submodules. + """ + + if ('GITHUB_ACTIONS' in os.environ): + return + + if os.path.isfile("DISABLE_SUBMODULE_AUTOUPDATE"): + return + + if shutil.which("git") is None: + raise FileNotFoundError("git not found in PATH") + + # If the status doesn't match, force VS to reload the solution. + # status = run_command(["git", "submodule", "status"], capture=True) + run_command(["git", "submodule", "update", "--init", "--recursive"]) + # status2 = run_command(["git", "submodule", "status"], capture=True) + + # Something changed. + # if status.stdout != status2.stdout: + # print("Git submodules changed. Reloading solution.") + # reset_solution() + + +def install_hooks(): + """ + Installs the necessary git hooks into .git/hooks. + """ + + # Read version file. + if os.path.isfile("INSTALLED_HOOKS_VERSION"): + with open("INSTALLED_HOOKS_VERSION", "r") as f: + if f.read() == CURRENT_HOOKS_VERSION: + if not QUIET: + print("No hooks change detected.") + return + + with open("INSTALLED_HOOKS_VERSION", "w") as f: + f.write(CURRENT_HOOKS_VERSION) + + print("Hooks need updating.") + + hooks_target_dir = Path("..")/".git"/"hooks" + hooks_source_dir = Path("hooks") + + # Clear entire tree since we need to kill deleted files too. + for filename in os.listdir(str(hooks_target_dir)): + os.remove(str(hooks_target_dir/filename)) + + for filename in os.listdir(str(hooks_source_dir)): + print("Copying hook {}".format(filename)) + shutil.copy2(str(hooks_source_dir/filename), + str(hooks_target_dir/filename)) + + +def reset_solution(): + """ + Force VS to think the solution has been changed to prompt the user to reload it, thus fixing any load errors. + """ + + with SOLUTION_PATH.open("r") as f: + content = f.read() + + with SOLUTION_PATH.open("w") as f: + f.write(content) + + +if __name__ == '__main__': + install_hooks() + update_submodules() diff --git a/BuildChecker/hooks/post-checkout b/BuildChecker/hooks/post-checkout new file mode 100755 index 00000000000..c5662445c27 --- /dev/null +++ b/BuildChecker/hooks/post-checkout @@ -0,0 +1,13 @@ +#!/bin/bash + +gitroot=`git rev-parse --show-toplevel` + +cd "$gitroot/BuildChecker" + +if [[ `uname` == MINGW* || `uname` == CYGWIN* ]]; then + # Windows + py -3 git_helper.py --quiet +else + # Not Windows, so probably some other Unix thing. + python3 git_helper.py --quiet +fi diff --git a/BuildChecker/hooks/post-merge b/BuildChecker/hooks/post-merge new file mode 100755 index 00000000000..85fe61d966c --- /dev/null +++ b/BuildChecker/hooks/post-merge @@ -0,0 +1,5 @@ +#!/bin/bash + +# Just call post-checkout since it does the same thing. +gitroot=`git rev-parse --show-toplevel` +bash "$gitroot/.git/hooks/post-checkout" diff --git a/Content.Client/Gameplay/GameplayState.cs b/Content.Client/Gameplay/GameplayState.cs index 2ea16521e8f..1efee978f39 100644 --- a/Content.Client/Gameplay/GameplayState.cs +++ b/Content.Client/Gameplay/GameplayState.cs @@ -93,17 +93,17 @@ private void LoadMainScreen() var screenTypeString = _configurationManager.GetCVar(CCVars.UILayout); if (!Enum.TryParse(screenTypeString, out ScreenType screenType)) { - screenType = ScreenType.Separated; + screenType = default; } switch (screenType) { + case ScreenType.Default: + _uiManager.LoadScreen(); + break; case ScreenType.Separated: _uiManager.LoadScreen(); break; - case ScreenType.Overlay: - _uiManager.LoadScreen(); - break; } _loadController.LoadScreen(); diff --git a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml similarity index 96% rename from Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml rename to Content.Client/UserInterface/Screens/DefaultGameScreen.xaml index 4ba820b3392..54aeffe72c9 100644 --- a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml +++ b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml @@ -1,4 +1,4 @@ - - + diff --git a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml.cs b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs similarity index 94% rename from Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml.cs rename to Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs index c45ec9d4a02..0fb1b7d507f 100644 --- a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml.cs +++ b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs @@ -6,9 +6,9 @@ namespace Content.Client.UserInterface.Screens; [GenerateTypedNameReferences] -public sealed partial class OverlayChatGameScreen : InGameScreen +public sealed partial class DefaultGameScreen : InGameScreen { - public OverlayChatGameScreen() + public DefaultGameScreen() { RobustXamlLoader.Load(this); diff --git a/Content.Client/UserInterface/Screens/ScreenType.cs b/Content.Client/UserInterface/Screens/ScreenType.cs index 039cd7b1287..595dc79556d 100644 --- a/Content.Client/UserInterface/Screens/ScreenType.cs +++ b/Content.Client/UserInterface/Screens/ScreenType.cs @@ -3,11 +3,11 @@ namespace Content.Client.UserInterface.Screens; public enum ScreenType { /// - /// The classic SS13 user interface. + /// The modern SS14 user interface. /// - Separated, + Default, /// - /// The temporary SS14 user interface. + /// The classic SS13 user interface. /// - Overlay, + Separated } diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index ecc57561cd8..79c1909ebaf 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -263,16 +263,16 @@ public void SetMainChat(bool setting) switch (UIManager.ActiveScreen) { + case DefaultGameScreen defaultScreen: + chatBox = defaultScreen.ChatBox; + chatSizeRaw = _config.GetCVar(CCVars.DefaultScreenChatSize); + SetChatSizing(chatSizeRaw, defaultScreen, setting); + break; case SeparatedChatGameScreen separatedScreen: chatBox = separatedScreen.ChatBox; chatSizeRaw = _config.GetCVar(CCVars.SeparatedScreenChatSize); SetChatSizing(chatSizeRaw, separatedScreen, setting); break; - case OverlayChatGameScreen overlayScreen: - chatBox = overlayScreen.ChatBox; - chatSizeRaw = _config.GetCVar(CCVars.OverlayScreenChatSize); - SetChatSizing(chatSizeRaw, overlayScreen, setting); - break; default: // this could be better? var maybeChat = UIManager.ActiveScreen.GetWidget(); @@ -321,12 +321,12 @@ private void StoreChatSize(Vector2 size) $"{size.X.ToString(CultureInfo.InvariantCulture)},{size.Y.ToString(CultureInfo.InvariantCulture)}"; switch (UIManager.ActiveScreen) { + case DefaultGameScreen _: + _config.SetCVar(CCVars.DefaultScreenChatSize, stringSize); + break; case SeparatedChatGameScreen _: _config.SetCVar(CCVars.SeparatedScreenChatSize, stringSize); break; - case OverlayChatGameScreen _: - _config.SetCVar(CCVars.OverlayScreenChatSize, stringSize); - break; default: // do nothing return; diff --git a/Content.Client/UserInterface/Systems/Vote/VoteUIController.cs b/Content.Client/UserInterface/Systems/Vote/VoteUIController.cs index ac37cebfa99..52d0348b798 100644 --- a/Content.Client/UserInterface/Systems/Vote/VoteUIController.cs +++ b/Content.Client/UserInterface/Systems/Vote/VoteUIController.cs @@ -23,12 +23,12 @@ private void OnScreenLoad() { switch (UIManager.ActiveScreen) { + case DefaultGameScreen game: + _votes.SetPopupContainer(game.VoteMenu); + break; case SeparatedChatGameScreen separated: _votes.SetPopupContainer(separated.VoteMenu); break; - case OverlayChatGameScreen overlay: - _votes.SetPopupContainer(overlay.VoteMenu); - break; } } diff --git a/Content.Server/Cargo/Components/CargoPalletComponent.cs b/Content.Server/Cargo/Components/CargoPalletComponent.cs index cdfd0a3874f..ebf0be93e0c 100644 --- a/Content.Server/Cargo/Components/CargoPalletComponent.cs +++ b/Content.Server/Cargo/Components/CargoPalletComponent.cs @@ -1,26 +1,7 @@ namespace Content.Server.Cargo.Components; -using Content.Shared.Actions; -using Robust.Shared.Serialization.TypeSerializers.Implementations; /// /// Any entities intersecting when a shuttle is recalled will be sold. /// - -[Flags] -public enum BuySellType : byte -{ - Buy = 1 << 0, - Sell = 1 << 1, - All = Buy | Sell -} - - [RegisterComponent] -public sealed partial class CargoPalletComponent : Component -{ - /// - /// Whether the pad is a buy pad, a sell pad, or all. - /// - [DataField] - public BuySellType PalletType; -} +public sealed partial class CargoPalletComponent : Component {} diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index d8b55a7237f..ebe66ff029e 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -205,7 +205,7 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com // Try to fulfill from any station where possible, if the pad is not occupied. foreach (var trade in _listEnts) { - var tradePads = GetCargoPallets(trade, BuySellType.Buy); + var tradePads = GetCargoPallets(trade); _random.Shuffle(tradePads); var freePads = GetFreeCargoPallets(trade, tradePads); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index b8a491f4e89..3e39440da56 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -198,16 +198,13 @@ private List GetProjectedOrders( ///
private int GetCargoSpace(EntityUid gridUid) { - var space = GetCargoPallets(gridUid, BuySellType.Buy).Count; + var space = GetCargoPallets(gridUid).Count; return space; } - /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads - /// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy pads - private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid, BuySellType requestType = BuySellType.All) + private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid) { _pads.Clear(); - var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var comp, out var compXform)) @@ -218,13 +215,7 @@ private int GetCargoSpace(EntityUid gridUid) continue; } - if ((requestType & comp.PalletType) == 0) - { - continue; - } - _pads.Add((uid, comp, compXform)); - } return _pads; @@ -284,7 +275,7 @@ private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, ou amount = 0; toSell = new HashSet(); - foreach (var (palletUid, _, _) in GetCargoPallets(gridUid, BuySellType.Sell)) + foreach (var (palletUid, _, _) in GetCargoPallets(gridUid)) { // Containers should already get the sell price of their children so can skip those. _setEnts.Clear(); diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 202d03bcda9..169daca07ac 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -25,7 +25,7 @@ public void InitializeEnsnaring() { SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(AttemptStepTrigger); - SubscribeLocalEvent(OnStepTrigger); + SubscribeLocalEvent(OnStepTrigger); SubscribeLocalEvent(OnThrowHit); SubscribeLocalEvent(OnAttemptPacifiedThrow); } @@ -49,7 +49,7 @@ private void AttemptStepTrigger(EntityUid uid, EnsnaringComponent component, ref args.Continue = true; } - private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredOffEvent args) + private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredEvent args) { TryEnsnare(args.Tripper, uid, component); } diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index e24de5a2f66..9b9a042641f 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -88,7 +88,7 @@ public override void Initialize() SubscribeLocalEvent(OnTriggerCollide); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnImplantTrigger); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnSlipTriggered); SubscribeLocalEvent(OnEmptyTriggered); @@ -228,7 +228,7 @@ private void OnImplantTrigger(EntityUid uid, TriggerImplantActionComponent compo args.Handled = Trigger(uid); } - private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredOffEvent args) + private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredEvent args) { Trigger(uid, args.Tripper); } diff --git a/Content.Server/LandMines/LandMineComponent.cs b/Content.Server/LandMines/LandMineComponent.cs index 1c4ba06691a..63e1e4b99f0 100644 --- a/Content.Server/LandMines/LandMineComponent.cs +++ b/Content.Server/LandMines/LandMineComponent.cs @@ -1,13 +1,6 @@ -using Robust.Shared.Audio; - -namespace Content.Server.LandMines; +namespace Content.Server.LandMines; [RegisterComponent] public sealed partial class LandMineComponent : Component { - /// - /// Trigger sound effect when stepping onto landmine - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public SoundSpecifier? Sound; } diff --git a/Content.Server/LandMines/LandMineSystem.cs b/Content.Server/LandMines/LandMineSystem.cs index 22dedb93375..78c48ef99ec 100644 --- a/Content.Server/LandMines/LandMineSystem.cs +++ b/Content.Server/LandMines/LandMineSystem.cs @@ -1,43 +1,43 @@ -using Content.Server.Explosion.EntitySystems; +using Content.Server.Explosion.EntitySystems; using Content.Shared.Popups; +using Content.Shared.StepTrigger; using Content.Shared.StepTrigger.Systems; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; namespace Content.Server.LandMines; public sealed class LandMineSystem : EntitySystem { - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly TriggerSystem _trigger = default!; + public override void Initialize() { - SubscribeLocalEvent(HandleStepOnTriggered); - SubscribeLocalEvent(HandleStepOffTriggered); - - SubscribeLocalEvent(HandleStepTriggerAttempt); + SubscribeLocalEvent(HandleTriggered); + SubscribeLocalEvent(HandleTriggerAttempt); } - private void HandleStepOnTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOnEvent args) + private static void HandleTriggerAttempt( + EntityUid uid, + LandMineComponent component, + ref StepTriggerAttemptEvent args) { - _popupSystem.PopupCoordinates( - Loc.GetString("land-mine-triggered", ("mine", uid)), - Transform(uid).Coordinates, - args.Tripper, - PopupType.LargeCaution); - - _audioSystem.PlayPvs(component.Sound, uid); - } - - private void HandleStepOffTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOffEvent args) - { - _trigger.Trigger(uid, args.Tripper); + args.Continue = true; } - private static void HandleStepTriggerAttempt(EntityUid uid, LandMineComponent component, ref StepTriggerAttemptEvent args) + private void HandleTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredEvent args) { - args.Continue = true; + // This doesn't use TriggerOnStepTrigger since we don't want to display the popup if nothing happens + // and I didn't feel like making an `AfterTrigger` event + if (_trigger.Trigger(uid, args.Tripper)) + { + _popupSystem.PopupCoordinates( + Loc.GetString("land-mine-triggered", ("mine", uid)), + Transform(uid).Coordinates, + args.Tripper, + PopupType.LargeCaution); + } } } + diff --git a/Content.Server/Tiles/LavaSystem.cs b/Content.Server/Tiles/LavaSystem.cs index 51bd6f8475f..7aee0b65010 100644 --- a/Content.Server/Tiles/LavaSystem.cs +++ b/Content.Server/Tiles/LavaSystem.cs @@ -11,7 +11,7 @@ public sealed class LavaSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnLavaStepTriggered); + SubscribeLocalEvent(OnLavaStepTriggered); SubscribeLocalEvent(OnLavaStepTriggerAttempt); } @@ -23,7 +23,7 @@ private void OnLavaStepTriggerAttempt(EntityUid uid, LavaComponent component, re args.Continue = true; } - private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredOffEvent args) + private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredEvent args) { var otherUid = args.Tripper; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 891c790d52c..f8943a9bf90 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1596,10 +1596,10 @@ public static readonly CVarDef */ public static readonly CVarDef UILayout = - CVarDef.Create("ui.layout", "Separated", CVar.CLIENTONLY | CVar.ARCHIVE); + CVarDef.Create("ui.layout", "Default", CVar.CLIENTONLY | CVar.ARCHIVE); - public static readonly CVarDef OverlayScreenChatSize = - CVarDef.Create("ui.overlay_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef DefaultScreenChatSize = + CVarDef.Create("ui.default_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); public static readonly CVarDef SeparatedScreenChatSize = CVarDef.Create("ui.separated_chat_size", "0.6,0", CVar.CLIENTONLY | CVar.ARCHIVE); diff --git a/Content.Shared/Chasm/ChasmSystem.cs b/Content.Shared/Chasm/ChasmSystem.cs index 86b8d4fc4d7..51299557dbd 100644 --- a/Content.Shared/Chasm/ChasmSystem.cs +++ b/Content.Shared/Chasm/ChasmSystem.cs @@ -24,7 +24,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnStepTriggerAttempt); SubscribeLocalEvent(OnUpdateCanMove); } @@ -47,7 +47,7 @@ public override void Update(float frameTime) } } - private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredOffEvent args) + private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredEvent args) { // already doomed if (HasComp(args.Tripper)) diff --git a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs index 813a18f974c..a0feab7052c 100644 --- a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs +++ b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs @@ -14,7 +14,7 @@ public sealed partial class MovementSpeedModifierComponent : Component // Weightless public const float DefaultMinimumFrictionSpeed = 0.005f; public const float DefaultWeightlessFriction = 1f; - public const float DefaultWeightlessFrictionNoInput = 0f; + public const float DefaultWeightlessFrictionNoInput = 0.2f; public const float DefaultWeightlessModifier = 0.7f; public const float DefaultWeightlessAcceleration = 1f; diff --git a/Content.Shared/Physics/FrictionRemoverSystem.cs b/Content.Shared/Physics/FrictionRemoverSystem.cs deleted file mode 100644 index 65bbe9e4d23..00000000000 --- a/Content.Shared/Physics/FrictionRemoverSystem.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; - -namespace Content.Shared.Physics; - -public sealed class FrictionRemoverSystem : EntitySystem -{ - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(RemoveDampening); - } - - - private void RemoveDampening(EntityUid uid, PhysicsComponent component, PhysicsSleepEvent args) - { - _physics.SetAngularDamping(uid, component, 0f, false); - _physics.SetLinearDamping(uid, component, 0f); - } -} diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index ff8b597a0d5..d20495cfa6c 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -31,14 +31,14 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(HandleAttemptCollide); - SubscribeLocalEvent(HandleStepTrigger); + SubscribeLocalEvent(HandleStepTrigger); SubscribeLocalEvent(OnNoSlipAttempt); SubscribeLocalEvent(OnThrownSlipAttempt); // as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer). SubscribeLocalEvent>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args)); } - private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredOffEvent args) + private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredEvent args) { TrySlip(uid, component, args.Tripper); } diff --git a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs index b8483d021a4..f4731bf46ab 100644 --- a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs +++ b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs @@ -49,14 +49,8 @@ public sealed partial class StepTriggerComponent : Component /// If this is true, steptrigger will still occur on entities that are in air / weightless. They do not /// by default. ///
- [DataField, AutoNetworkedField] + [DataField] public bool IgnoreWeightless; - - /// - /// Does this have separate "StepOn" and "StepOff" triggers. - /// - [DataField, AutoNetworkedField] - public bool StepOn = false; } [RegisterComponent] diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index b4ac2cde756..ede39b2aa97 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -11,7 +11,6 @@ public sealed class StepTriggerSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; - [Dependency] private readonly SharedMapSystem _map = default!; public override void Initialize() { @@ -41,9 +40,7 @@ public override void Update(float frameTime) while (enumerator.MoveNext(out var uid, out var active, out var trigger, out var transform)) { if (!Update(uid, trigger, transform, query)) - { continue; - } RemCompDeferred(uid, active); } @@ -59,8 +56,7 @@ private bool Update(EntityUid uid, StepTriggerComponent component, TransformComp if (component.Blacklist != null && TryComp(transform.GridUid, out var grid)) { - var positon = _map.LocalToTile(uid, grid, transform.Coordinates); - var anch = _map.GetAnchoredEntitiesEnumerator(uid, grid, positon); + var anch = grid.GetAnchoredEntitiesEnumerator(grid.LocalToTile(transform.Coordinates)); while (anch.MoveNext(out var ent)) { @@ -113,16 +109,8 @@ private void UpdateColliding(EntityUid uid, StepTriggerComponent component, Tran return; } - if (component.StepOn) - { - var evStep = new StepTriggeredOnEvent(uid, otherUid); - RaiseLocalEvent(uid, ref evStep); - } - else - { - var evStep = new StepTriggeredOffEvent(uid, otherUid); - RaiseLocalEvent(uid, ref evStep); - } + var ev = new StepTriggeredEvent { Source = uid, Tripper = otherUid }; + RaiseLocalEvent(uid, ref ev, true); component.CurrentlySteppedOn.Add(otherUid); Dirty(uid, component); @@ -142,7 +130,7 @@ private bool CanTrigger(EntityUid uid, EntityUid otherUid, StepTriggerComponent var msg = new StepTriggerAttemptEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref msg); + RaiseLocalEvent(uid, ref msg, true); return msg.Continue && !msg.Cancelled; } @@ -175,12 +163,6 @@ private void OnEndCollide(EntityUid uid, StepTriggerComponent component, ref End component.CurrentlySteppedOn.Remove(otherUid); Dirty(uid, component); - if (component.StepOn) - { - var evStepOff = new StepTriggeredOffEvent(uid, otherUid); - RaiseLocalEvent(uid, ref evStepOff); - } - if (component.Colliding.Count == 0) { RemCompDeferred(uid); @@ -248,14 +230,9 @@ public struct StepTriggerAttemptEvent public bool Cancelled; } -/// -/// Raised when an entity stands on a steptrigger initially (assuming it has both on and off states). -/// -[ByRefEvent] -public readonly record struct StepTriggeredOnEvent(EntityUid Source, EntityUid Tripper); - -/// -/// Raised when an entity leaves a steptrigger if it has on and off states OR when an entity intersects a steptrigger. -/// [ByRefEvent] -public readonly record struct StepTriggeredOffEvent(EntityUid Source, EntityUid Tripper); +public struct StepTriggeredEvent +{ + public EntityUid Source; + public EntityUid Tripper; +} diff --git a/LEGAL.md b/LEGAL.md index 34cd4009d53..2df3c39add1 100644 --- a/LEGAL.md +++ b/LEGAL.md @@ -6,9 +6,9 @@ The Authors retain all copyright to their respective work submitted here. ## Code license -Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). +Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). -Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](./LICENSE-MIT.txt). +Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). [87c70a89a67d0521a56388e6b1c3f2cb947943e4](https://github.com/Simple-Station/Einstein-Engines/commit/87c70a89a67d0521a56388e6b1c3f2cb947943e4) was pushed on February 17th 2024 at 21:48 UTC diff --git a/README.md b/README.md index f102318611f..3dbe1910e29 100644 --- a/README.md +++ b/README.md @@ -41,24 +41,27 @@ We provide some scripts shown below to make the job easier. ### Build dependencies > - Git -> - .NET SDK 8.0.100 +> - DOTNET SDK 7.0 or higher +> - python 3.7 or higher ### Windows > 1. Clone this repository -> 2. Run `git submodule update --init --recursive` in a terminal to download the engine -> 3. Run `Scripts/bat/buildAllDebug.bat` after making any changes to the source -> 4. Run `Scripts/bat/runQuickAll.bat` to launch the client and the server -> 5. Connect to localhost in the client and play +> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal +> 3. Run the `Scripts/bat/run1buildDebug.bat` +> 4. Run the `Scripts/bat/run2configDev.bat` if you need other configurations run other config scripts +> 5. Run both the `Scripts/bat/run3server.bat` and `Scripts/bat/run4client.bat` +> 6. Connect to localhost and play ### Linux > 1. Clone this repository -> 2. Run `git submodule update --init --recursive` in a terminal to download the engine -> 3. Run `Scripts/bat/buildAllDebug.sh` after making any changes to the source -> 4. Run `Scripts/bat/runQuickAll.sh` to launch the client and the server -> 5. Connect to localhost in the client and play +> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal +> 3. Run the `Scripts/sh/run1buildDebug.sh` +> 4. Run the `Scripts/sh/run2configDev.sh` if you need other configurations run other config scripts +> 5. Run both the `Scripts/sh/run3server.bat` and `scripts/sh/run4client.sh` +> 6. Connect to localhost and play ### MacOS @@ -67,12 +70,12 @@ We provide some scripts shown below to make the job easier. ## License Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. -See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). +See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the MIT license unless otherwise stated. -See [LICENSE-MIT](./LICENSE-MIT.txt). +See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). Most assets are licensed under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) unless stated otherwise. Assets have their license and the copyright in the metadata file. -[Example](./Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). +[Example](https://github.com/Simple-Station/Einstein-Engines/blob/master/Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). Note that some assets are licensed under the non-commercial [CC-BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) or similar non-commercial licenses and will need to be removed if you wish to use this project commercially. diff --git a/RUN_THIS.py b/RUN_THIS.py new file mode 100755 index 00000000000..6ea9f8e707d --- /dev/null +++ b/RUN_THIS.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +# Import future so people on py2 still get the clear error that they need to upgrade. +from __future__ import print_function +import sys +import subprocess + +version = sys.version_info +if version.major < 3 or (version.major == 3 and version.minor < 5): + print("ERROR: You need at least Python 3.5 to build SS14.") + sys.exit(1) + +subprocess.run([sys.executable, "git_helper.py"], cwd="BuildChecker") diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 6f18510d17b..90445a31d1c 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -226,8 +226,3 @@ copyright: TGStation at 3df5d3b42bfb6b3b5adba1067ab41f83816255bb license: CC-BY-SA-3.0 source: https://github.com/tgstation/tgstation/blob/3df5d3b42bfb6b3b5adba1067ab41f83816255bb/sound/misc/server-ready.ogg - -- files: [beep_landmine.ogg] - copyright: '"beep_landmine.ogg" by kaktuscsc of Discord for SS14' - license: "CC-BY-SA-3.0" - source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f diff --git a/Resources/Audio/Effects/beep_landmine.ogg b/Resources/Audio/Effects/beep_landmine.ogg deleted file mode 100644 index 48bc5e21d962084a1db41c473f30892d914894ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6034 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 Bu4e!M diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6679b141cd8..743c0add322 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4051,7 +4051,7 @@ Entries: - type: Add message: >- Glass/Crystal shards and floor tiles now deal damage and embed in - victims when colliding with them. + victims when colliding with them. id: 6107 time: '2024-05-11T01:23:00.0000000+00:00' - author: FoxxoTrystan diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 03d5059e95b..8c54ecb084d 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index f040d58253d..a10f070bd25 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -3,20 +3,20 @@ meta: postmapinit: false tilemap: 0: Space - 31: FloorDark - 36: FloorDarkMono - 39: FloorDarkPavementVertical - 51: FloorGrassJungle - 66: FloorMetalDiamond - 79: FloorReinforced - 93: FloorSteel - 104: FloorSteelMono - 108: FloorTechMaint - 109: FloorTechMaint2 - 122: FloorWood - 124: FloorWoodTile - 125: Lattice - 126: Plating + 29: FloorDark + 34: FloorDarkMono + 37: FloorDarkPavementVertical + 49: FloorGrassJungle + 64: FloorMetalDiamond + 77: FloorReinforced + 89: FloorSteel + 100: FloorSteelMono + 104: FloorTechMaint + 105: FloorTechMaint2 + 118: FloorWood + 119: FloorWoodTile + 120: Lattice + 121: Plating entities: - proto: "" entities: @@ -31,27 +31,27 @@ entities: chunks: 0,0: ind: 0,0 - tiles: XQAAAAABXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAAAXQAAAAADXQAAAAAAXQAAAAABXQAAAAADXQAAAAAAJAAAAAABJwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAJAAAAAAAJAAAAAABJAAAAAAAJAAAAAAAJAAAAAACJAAAAAABJAAAAAAAJAAAAAAAJAAAAAABJAAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAfAAAAAABfAAAAAADfAAAAAACMwAAAAAAMwAAAAAAMwAAAAAAfAAAAAADfAAAAAABfAAAAAABegAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAADfAAAAAABfAAAAAADfAAAAAADegAAAAADegAAAAACegAAAAADfAAAAAAAfAAAAAABfAAAAAAAegAAAAACJAAAAAADJwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAegAAAAABegAAAAACegAAAAABegAAAAAAegAAAAACegAAAAAAegAAAAAAegAAAAABegAAAAADegAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: fgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAJAAAAAAAfgAAAAAAfgAAAAAAJAAAAAABJAAAAAABHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAABJAAAAAACJAAAAAAAJAAAAAAAJAAAAAABJAAAAAABJAAAAAACJAAAAAAAJAAAAAACfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAAAXQAAAAACXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAACXQAAAAABXQAAAAABfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAADXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAACaAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAABbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAAAaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAADXQAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAABaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAADTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAACTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADaAAAAAADfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA + tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAACJAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAADJAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA version: 6 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAJAAAAAABJAAAAAACHwAAAAACHwAAAAADHwAAAAABHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAHwAAAAABHwAAAAACHwAAAAABJAAAAAADJAAAAAADHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAIgAAAAABIgAAAAACHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAHQAAAAABHQAAAAACHQAAAAABIgAAAAADIgAAAAADHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-2: ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -1889,303 +1889,276 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-17.5 parent: 2 -- proto: CargoPalletBuy +- proto: CargoPallet entities: + - uid: 20 + components: + - type: Transform + pos: 7.5,0.5 + parent: 2 - uid: 21 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-9.5 + pos: 8.5,0.5 parent: 2 - uid: 24 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-9.5 + pos: 8.5,-0.5 parent: 2 - uid: 25 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-8.5 + pos: 7.5,-0.5 parent: 2 - uid: 26 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-8.5 + pos: 7.5,-1.5 parent: 2 - uid: 27 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-7.5 + pos: 8.5,-1.5 parent: 2 - uid: 30 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-7.5 + pos: 6.5,0.5 parent: 2 - uid: 32 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 2 + - uid: 34 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-9.5 + pos: 7.5,-7.5 parent: 2 - uid: 35 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-0.5 + rot: -1.5707963267948966 rad + pos: 8.5,-7.5 parent: 2 - uid: 36 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-0.5 + rot: -1.5707963267948966 rad + pos: 6.5,-1.5 parent: 2 - uid: 37 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-7.5 + pos: 8.5,-9.5 parent: 2 - uid: 39 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-2.5 + rot: -1.5707963267948966 rad + pos: 8.5,-8.5 parent: 2 - uid: 41 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-1.5 + rot: -1.5707963267948966 rad + pos: 7.5,-8.5 parent: 2 - uid: 42 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-1.5 + rot: -1.5707963267948966 rad + pos: 6.5,-8.5 parent: 2 - uid: 43 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-2.5 + rot: -1.5707963267948966 rad + pos: 6.5,-9.5 parent: 2 - uid: 44 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-1.5 + rot: -1.5707963267948966 rad + pos: 4.5,-0.5 parent: 2 - - uid: 47 + - uid: 45 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,0.5 + rot: -1.5707963267948966 rad + pos: 4.5,-8.5 parent: 2 - - uid: 49 + - uid: 46 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-0.5 + rot: -1.5707963267948966 rad + pos: 6.5,-6.5 parent: 2 - - uid: 50 + - uid: 47 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-2.5 + rot: -1.5707963267948966 rad + pos: 4.5,-9.5 parent: 2 - - uid: 56 + - uid: 48 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-6.5 + pos: 6.5,-7.5 parent: 2 - - uid: 61 + - uid: 49 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-8.5 + pos: 7.5,-9.5 parent: 2 - - uid: 67 + - uid: 50 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-6.5 + pos: 3.5,-7.5 parent: 2 - - uid: 71 + - uid: 51 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-6.5 + pos: 3.5,-9.5 parent: 2 - - uid: 183 + - uid: 52 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,0.5 + pos: 3.5,-8.5 parent: 2 - - uid: 900 + - uid: 54 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,0.5 + rot: -1.5707963267948966 rad + pos: 4.5,-7.5 parent: 2 -- proto: CargoPalletSell - entities: - - uid: 34 + - uid: 55 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-0.5 + pos: 6.5,-2.5 parent: 2 - - uid: 45 + - uid: 56 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-7.5 + pos: 3.5,-1.5 parent: 2 - - uid: 46 + - uid: 57 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-2.5 + pos: 2.5,-8.5 parent: 2 - - uid: 48 + - uid: 58 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-2.5 + pos: 3.5,-0.5 parent: 2 - - uid: 51 + - uid: 59 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-1.5 + pos: 3.5,0.5 parent: 2 - - uid: 52 + - uid: 60 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-2.5 + pos: 6.5,-0.5 parent: 2 - - uid: 54 + - uid: 61 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-9.5 + pos: 2.5,-9.5 parent: 2 - - uid: 55 + - uid: 66 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-1.5 - parent: 2 - - uid: 57 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-9.5 + pos: 7.5,-2.5 parent: 2 - - uid: 58 + - uid: 67 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,0.5 + pos: 2.5,-2.5 parent: 2 - - uid: 59 + - uid: 68 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-6.5 + pos: 2.5,-1.5 parent: 2 - - uid: 60 + - uid: 69 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-7.5 + rot: -1.5707963267948966 rad + pos: 3.5,-2.5 parent: 2 - - uid: 66 + - uid: 70 components: - type: Transform rot: -1.5707963267948966 rad - pos: 3.5,0.5 + pos: 8.5,-2.5 parent: 2 - - uid: 68 + - uid: 71 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-8.5 + pos: 2.5,-0.5 parent: 2 - - uid: 69 + - uid: 72 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-8.5 + pos: 2.5,0.5 parent: 2 - - uid: 70 + - uid: 73 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-9.5 + rot: -1.5707963267948966 rad + pos: 8.5,-6.5 parent: 2 - - uid: 72 + - uid: 183 components: - type: Transform - rot: 1.5707963267948966 rad + rot: -1.5707963267948966 rad pos: 7.5,-6.5 parent: 2 - - uid: 73 + - uid: 900 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-6.5 + rot: -1.5707963267948966 rad + pos: 3.5,-6.5 parent: 2 - uid: 901 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-0.5 + pos: 2.5,-6.5 parent: 2 - uid: 903 components: - type: Transform rot: -1.5707963267948966 rad - pos: 3.5,-0.5 + pos: 4.5,0.5 parent: 2 - uid: 907 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-7.5 + rot: -1.5707963267948966 rad + pos: 4.5,-6.5 parent: 2 - uid: 908 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-1.5 + pos: 4.5,-2.5 parent: 2 - uid: 909 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-8.5 - parent: 2 - - uid: 960 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-7.5 - parent: 2 - - uid: 961 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,0.5 + pos: 4.5,-1.5 parent: 2 - proto: CarpetBlack entities: diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index aa4a7b50e65..f3610178b9e 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -549,9 +549,9 @@ description: A cozy jacket with the Cybersun logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi + sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi + sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -560,9 +560,9 @@ description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi + sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi + sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -571,9 +571,9 @@ description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi + sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi + sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -582,9 +582,9 @@ description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi + sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi + sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -593,9 +593,9 @@ description: A cozy jacket with the Interdyne logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi + sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi + sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -604,9 +604,9 @@ description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi + sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi + sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -615,9 +615,9 @@ description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi + sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi + sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -626,9 +626,9 @@ description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi + sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi + sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -637,9 +637,9 @@ description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi + sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi + sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -648,6 +648,6 @@ description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi + sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi + sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index df7fad06dd2..1680dd6cda6 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -44,7 +44,9 @@ Female: UnisexMoth Unsexed: UnisexMoth - type: MovementSpeedModifier - weightlessAcceleration: 2.5 # Move around more easily in space. + weightlessAcceleration: 1.5 # Move around more easily in space. + weightlessFriction: 1 + weightlessModifier: 1 - type: Flammable damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml index 67d79540382..f232bf1d34d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml @@ -17,7 +17,7 @@ - type: Sprite state: icon - type: Item - size: Small + size: Normal - type: MeleeWeapon soundNoDamage: path: "/Audio/Effects/Fluids/splat.ogg" @@ -39,18 +39,6 @@ - type: TrashOnSolutionEmpty solution: drink -- type: entity - parent: DrinkCartonBaseFull - id: DrinkCartonBaseLargeFull - abstract: true - components: - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 - - type: Item - size: Normal - - type: entity id: DrinkCartonVisualsOpenable abstract: true @@ -128,7 +116,7 @@ sprite: Objects/Consumable/Drinks/cream.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkMilkCarton name: milk description: An opaque white liquid produced by the mammary glands of mammals. @@ -136,6 +124,7 @@ - type: SolutionContainerManager solutions: drink: + maxVol: 100 reagents: - ReagentId: Milk Quantity: 100 @@ -143,7 +132,7 @@ sprite: Objects/Consumable/Drinks/milk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkSoyMilkCarton name: soy milk description: White and nutritious soy goodness! @@ -151,6 +140,7 @@ - type: SolutionContainerManager solutions: drink: + maxVol: 100 reagents: - ReagentId: MilkSoy Quantity: 100 @@ -158,7 +148,7 @@ sprite: Objects/Consumable/Drinks/soymilk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkOatMilkCarton name: oat milk description: It's oat milk. Tan and nutritious goodness! @@ -166,6 +156,7 @@ - type: SolutionContainerManager solutions: drink: + maxVol: 100 reagents: - ReagentId: MilkOat Quantity: 100 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml index 86bc34f3c8b..f6dd7222611 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml @@ -8,8 +8,6 @@ components: - type: Sprite state: icon - - type: Item - size: Normal - type: SolutionContainerManager solutions: drink: @@ -74,19 +72,6 @@ Glass: 100 - type: SpaceGarbage -- type: entity - name: base empty bottle - id: DrinkBottleBaseSmallEmpty - parent: DrinkBottleBaseEmpty - abstract: true - components: - - type: Item - size: Small - - type: SolutionContainerManager - solutions: - drink: - maxVol: 50 - - type: entity name: base empty carton id: DrinkCartonBaseEmpty @@ -137,19 +122,6 @@ Cardboard: 20 - type: SpaceGarbage -- type: entity - name: base empty bottle - id: DrinkCartonBaseLargeEmpty - parent: DrinkCartonBaseEmpty - abstract: true - components: - - type: Item - size: Normal - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 - # Containers - type: entity name: Jailbreaker Verte bottle @@ -171,20 +143,28 @@ - type: entity name: ale bottle - parent: DrinkBottleBaseSmallEmpty + parent: DrinkBottleBaseEmpty id: DrinkBottleAle components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/alebottle_empty.rsi + - type: SolutionContainerManager + solutions: + drink: + maxVol: 50 - type: entity name: beer bottle - parent: DrinkBottleBaseSmallEmpty + parent: DrinkBottleBaseEmpty id: DrinkBottleBeer components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/beer_empty.rsi + - type: SolutionContainerManager + solutions: + drink: + maxVol: 50 - type: entity @@ -342,24 +322,37 @@ - type: entity name: milk carton - parent: DrinkCartonBaseLargeEmpty + parent: DrinkCartonBaseEmpty id: DrinkCartonMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/milk.rsi + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 + - type: entity name: soy milk carton - parent: DrinkCartonBaseLargeEmpty + parent: DrinkCartonBaseEmpty id: DrinkCartonSoyMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/soymilk.rsi + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 - type: entity name: oat milk carton - parent: DrinkCartonBaseLargeEmpty + parent: DrinkCartonBaseEmpty id: DrinkCartonOatMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/oatmilk.rsi + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 diff --git a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml index a3e3485bc65..9088edc8159 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml @@ -35,13 +35,9 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: LandMine - sound: - path: /Audio/Effects/beep_landmine.ogg - params: - maxDistance: 10 + - type: TriggerOnStepTrigger - type: StepTrigger requiredTriggeredSpeed: 0 - stepOn: true - type: entity name: kick mine @@ -61,6 +57,7 @@ - type: Construction graph: ModularMineGraph node: emptyCase + - type: LandMine - type: entity name: explosive mine @@ -74,3 +71,4 @@ intensitySlope: 3 totalIntensity: 120 # about a ~4 tile radius canCreateVacuum: false + - type: DeleteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index c628d199a90..925e036e09e 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -21,7 +21,6 @@ mask: - MachineMask - type: CargoPallet - palletType: All - type: StaticPrice price: 100 - type: Sprite @@ -54,33 +53,3 @@ - type: GuideHelp guides: - Cargo - -- type: entity - id: CargoPalletSell - name: cargo selling pallet - description: Designates valid items to sell with a selling computer, or to CentCom when a shuttle is recalled. - parent: CargoPallet - components: - - type: CargoPallet - palletType: sell - - type: Sprite - drawdepth: FloorTiles - layers: - - sprite: Structures/cargo_pallets.rsi - state: cargo_pallet_sell - - -- type: entity - id: CargoPalletBuy - name: cargo buying pallet - description: Designates where orders will appear when purchased. - parent: CargoPallet - components: - - type: CargoPallet - palletType: buy - - type: Sprite - drawdepth: FloorTiles - layers: - - sprite: Structures/cargo_pallets.rsi - state: cargo_pallet_buy - diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 2ddb21b9e6c..8d3c83e3e1e 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -230,7 +230,6 @@ - type: StepTrigger intersectRatio: 0.2 requiredTriggeredSpeed: 0 - stepOn: true - type: CollisionWake enabled: false - type: Physics @@ -252,10 +251,6 @@ mask: - ItemMask - type: LandMine - sound: - path: /Audio/Effects/beep_landmine.ogg - params: - maxDistance: 10 - type: ExplodeOnTrigger - type: Explosive explosionType: HardBomb # normally Default and max 5 total 60 diff --git a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml index 77b03d36f5d..85c9bdae3df 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml @@ -50,8 +50,6 @@ MaterialCloth1: min: 1 max: 2 - - type: WallMount - arc: 360 - type: entity id: HospitalCurtains @@ -352,4 +350,4 @@ graph: Curtains node: CurtainsWhiteOpen - type: Physics - canCollide: false + canCollide: false \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index 25978771872..1a17b2f856d 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -731,7 +731,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsBlack @@ -746,7 +748,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsBlue @@ -761,7 +765,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsCyan @@ -776,7 +782,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsGreen @@ -791,7 +799,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsOrange @@ -806,7 +816,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsPink @@ -821,7 +833,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsPurple @@ -836,7 +850,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsRed @@ -851,7 +867,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: CurtainsWhite @@ -866,7 +884,9 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: true + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked - type: construction id: Bookshelf diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..5eadcdc1c1ab3fbd2bf67c5055286b407e2e4a60 GIT binary patch literal 9460 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 35003686d555624fcac17b387f726605cd147bd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10509 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index fe470b0074272a504eac30798883e5e2c6c5e027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9875 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 06932fff6fa7370f5410813dea7991e4cf15cae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10492 zcmeHNc~}$4wr>{M+)zOow;<}EU?2$zBoTaIK%&6Cuab*U< zxTCTSA|e7t+)xoSin5A`2*H66*05yhR{?Qw-hA)fdGFr)-9M(2N>^8%I(2^MoT_uW zJNvh6UO!!Dz77OI)195{-N1Q`vS?|5-)pS!w-7WZjj_Wy(An7p(gJOOQbiq7QPO~- zGO4brq6Vpfw!NUt26ZKkvdmYRGIl-$>I**APk{Q0Pc+IgSQS-hIyk3;f&+CuaJ~i# zYv1@>cR>9YP_)KAvXv0z4X!56>z!S;7~;&Z7&8kZ7>~i>$rwvAmSBj(kO@{~3=Yh% za`rcgz)(mVQb6Opl`>9XQVKeONm-x3v<}qOKFO=pjK-w8{v;eKs^dJJlw&{D-DWE% zn2;T*L*7BU8yuY-!9+?0fghw1vV*iVG&D7)XlZI{YHMrhOw*e_ZR*r%U(KE~Q*Y6H z)Z#_+7cMkhW@cYAQyM>MRwtSt`f_2nFPvqB3@jLjl*SYU)!oG_|yKrUHUOU8Sbf zRMpj{Oi@<{y-A=SQlB+t_7dz`jX7JXnnvMzxZOw3X)RrsU#{==qGy>!K*YD&I&X zyYKJ&4;(vw;^e8+AAd?af8pY#%b8cMUb|j!qwr?Yt>WAF?mu|=sN(UHr!T8ty{@UP zt8Zv|-}<4gUD)yQ*WSMVfkDa8@W`kVmlEg1F^=qaxMl%ds_N=$>Y7SiDylI`;Iq`H zEWv8bUb|J38a~Gew_8hZ-O+RT<=RUv+_rNa`r&vEM{jt@TaWTWTuLl;jOGn^)E&(5ixT zVROU2<@#0VeFnw09>vd^cgRyJ~)+g+fUqf zJ(>vVZ&*UkNO5mlO9!^t(d)#v??)&L0s->QzoYb~1 z1Uj|zIae%le&WF0NWD^QyQ4b*4uGpG6eI+yy&#>VI78_bD9R$ey7$O;OW*+><$05A zL3Hb4VNJfQnNyQ%UEuSg?kC6aXoi26>u4+jRZvC;eq)j4$0_Rc-6u0d4bDNJ$0+&9 zO+p=bj)~qi*B0wL2MS_X5?`LJs9tm+XU(@?7}oS$4}T8=wJekRk232Of&#@(fIsF| zMbp(2Cp_x69z1@Xa3jN5YW`e~K&RV771M7$N)qI-hu3jTMLaWZ0blys?A+NAKmXCq zT;99Ugc|0aTm)(re^3bFp{%{Qh)he_kr4;Si?bWIU926LDH0SQ(8ZC(o5dr{5>myj zfjr!;BE^fw{*h$A1SZhOpl3ntyjBDn*#|ee%1_<6_c}(x3BbB<^LxRjcic9YEwhD3 z*VoGq^UL|sUD895c@AkDQ%+^N^i^SD)^MY(t860zl_3!N4zKIghKs?JEKW{a4f&_~$rq~Oah-bvw%{l`MHn2)mNYRHgkqGr>*R7d3}oC<7#^TfN6HC&WiKjj1^JhN*IB( z#0>}(B}t($dqWzFV)6xE@3YoM*%Zs4!|(j%K?`ZiS<^RcjX5HWxf08->O-Jk!Ve)( zrGKWBP!;Rg-^B}&zm+$xZZ&AyiN4xh(H)LJstDA%z3BT8MXf~eHl(rOCO6}?z$<-; zOWz{Bpv_V9R@$2ep@aUxjxir40G`RUy#BbRnmxFp}SM7=fyr6?TAC zE#ZBWl@x3!W&KuSul6xuln7|XYjpbzcgR7#@?G-_6Rf#~3k1S-c zYfuS**DSX|pbr#9ncFKo$`tfDKj+F&uJJ-k=G2y)ZBi?de{sKc74P98n(f=cH^8TY z5oikn$$$WLwW;23l6WysN}^Z4&q1JIxO%1x=q$&t;KBy4CqZ#0g-%%xCv!!%l?B44 z5}SOFYY7KaZiJ3liUf(T^e+?+SO87`Fy^w+cl7uO^nHv7zAatPD;T~R+E`L2%nA26 zd;82Ag^%$;{_P`h2k{ZymRBuLYcE|ICvm-*EKU|>^d4eo zpL#V!8zLgmZg?=u`<^8nEMY}UOzGUEWjn0zoJgD?}OCQ2^?DGIlj)YuBUZQvAu*~@>D zOM=3 zp?Tmw0-=CyJ+nJrp1SUJWwf7*FYHnJQo9%Zk1mE z_T%@86@{p6{#C=8wUmRjE{ z_<6yn^=tSm9)M+%BI6=Z-g=3#+!}7>$>Yl;{$R`A@amV+)$&3~%0Qm+lSYs%0WTR^ zeBwi^{xgZ*(v^31bVqpBP-tMsjN>Q6`wSjY9$oW{%Gt&5Nr^*!MD6Myf;Fm2!n?UO z#Zx;``6F;?GoNz*5DnGpmUgWD$o&&Os8vNKTOIVEKPnz23s5)Xc%}6PsQVy-wKyD3 zX|x8rZGB3MG9={k9bUjKOZpM$rLEutNGYU6%r~@4)34;RLS`L2-F8H1CEt%guBc%l z0{NwUPIv}i1m9VtcqpZedS(dOAgKbuEP>}$DK(eEm)w2m#i#D2Gc+sF&w{@c*~4Vg z#;3>o;TItDH!IE`fF_D5=Y9<@Na`vmV!y2ycsQ0k2-I{bSXt_)!o!+@W}MI z_Se^z-DC!u%nB=MTAVuVEnA#wFqB8Gx#2&&zBFYZGs51 zk5>{e5g*BUZH=`~jj$!?Cq1wON{&KESFOx>J$VIn7*x&Xcr$Fps^CE|HC zWasDzMDQ-)cO@VntBRhyv%WZZJZgS|;k|n%^SleHtnFA5|AItm5nFU9GJ8XpEa@@= zF~L_c^sKoZo`F4lM=|)w)AuV<`3CRwsPpHn47&8TI_#o@A84ZJ*AH)WQ{0s@yGs!W z#Q9KVoFB}^-44|eNP|VF(!Ru;vLYsFG~Qis{A7QZ4{0RzYas)~)jT-}zp*emy}$$=U*DbCc+dJ|ivx7F{- z`|-SQBL5pdFRq#t`<1ckb-~brXyI@_?`1X!?N0Wd*2VP|bs*5wMtH^< z?X7p-&?x?19sCvo0$qU>jv%D4%&g}~4)c34jYX8c3W}8A1|qkeg2(Thhd>P9{EV-1 zgZT3V14O1yZ}g?2%0Zkp$YD5gki)D$${#LbHx<>zdw%6>S;CYbl)!J}-m<$J!w)4T z1^<+LB_bl%<;c$de%mAv(ykd!ED+_{G_S`>2C{@kiaf1Y=giyIF6kYY#{6deIs2^R z*uJE`jXz3uTnb&%0W`|Dby1RZR+IDDaxGhN{dm(hweSAeA2FOx9Cs? zG1WiVlxK$gQrIlYy8&N_v)%kDz1{vW*6Y^JvQE!L?hwq$88v3Pl4 zZbC?PoOiO1@NL2J)Tb5TzM}Tnr0iiPVSMuDJvrxqQd6v)kfqXJ;4|!3kuAFd!&4J?W^8 z)BQCIANp?#buiJ1)(wBWC8O)S(GjmbM($dL>#}BiotnJ%_}*m?A8rjp6NmG6M1_Ud zye{|9Ri~^;UzD!rd+`CXe9v6$;)O%4O=T5LtJmyu|1mJCN;Qpr`Xhbav-a%|dra3E zK)UOl0#9L$omUPY$xBclj-MyosSqj_CI!6>ShHr?8OC1L9FDFlr$IxQ^nQiu6O&$2 z?=9zf%aT9be&4%5c)n6qa47Ak0qgJ+J61*i{IWco9`s<_1FT2&O8>|4*%5EwXL|%? zN4YBQIr;hTY$sRET9*I!LOOnF&v)e^Dz`IRC$(o%#RbCzw|7; z;MOg6@YBU%#cI=RzPi4$#O;U6TUJ0~=70<7Z#{E6eEZ{rMXduWkGFVUUGVOmu7RnW zxpX0f4RV-K0EDY0Qx zS}-HhFo3~iv2BdRC43`87Tw0kli-4J3A1DDVmZY}Ft){ScBjP$(@1n9imi@yEEzBe zWkga9V?#sOTym_9(HLJcs4JVzjSR;~B7<#=c7O+>cAN-?A>IschCw^TvZ8TDwmOE^ z5%fT^o4w;F7U0UpXjf!p7}?xBCML!##=?vf!8FH`NF;L%&K!qB0}3=ZjvYyjMYFj} zl`O`2*fY4a2v%4mi^Dcl@}vfEq9SdKj6lEPgnXf4E-s(hv$>zN0Q6xVOARx}nqkaC zL(M0T;6^$`116sY`oj@i_qZ^Ixf_GaiHe{x9HJTQ$fc86&}pB?hebt%jKQJP%o!n! zP(aEBvtqxPQu*lk^9ZF1n5@vSu~9(TUr|?}$ z%Eg6j&!I&r#dEf|F;dP?rgLa4I(fWG3kW1)=oV;fAPJAg<1GWxM9aWHG=YW>z*u5P zmQ)&P5-VpmH;k*9aEyN@~btsg$hffE6LYA`lZuB%m>tN@=K6BAUpsqM=C)S|Falu*8!XwlTt)jgyYGYzd)827&=LMw?jdsMy~~-C3cG zZIM)^HnCP%BA!IT<8VX^5)Oy`jc7X~f(txR$#d)_z*vvcEMx!%D3+@9Q@~)X9bh5b zMKGw5oCtRgC&b3+^Xr4p-7a7`(W#MCduk*DF#Y^O!F}R|0vZEeF??1U*@Z)A1;+hv z)XK$UXgzLnCl(jXA2-%CzM{4N+4OH=@<+hL&A|TmPFi_;{Jc&5zsiSI}S(2W0k(}Z-7Un z(*yB1q9xi2ELk)j$H1bgR16V~v%*?hk+1<)7{)&r9!cr&7y!@e-vN(?C1L_Bu)rHF zsK9!bz=Tw~WdNE%AOr*kGI02Sz<__$dSkoD|KOUIXe{CPtND`!t<9AIZDKiEoBy{3 zJ5Deu0s_Y#Zv&AP1Zwlok@}OzD`Von@c6V*{0nCQtpA$iPwDqBb^WETKc#^`Mf{g{ z{iUuyrGY<1{FitA)6}K&+r2)64N~+Na3>$^?T`(g184+nTyGB^rGd}cvdrV4MLW!C zCl`XumMV)%>?KMxXw-~!c5%?`(9nfQs@l3q?cje%7S8r--D4X>X_Q@awl1vTuPmRd zvwO#l8;f*mmWp=cx1C$8_vYaDKa`_q%*~u}iKr(un(=VS1&6M7-EW=B%hz_id#9&; zV_lB!mKSv&HW-E-z01`S#}9RzmBkbvd?>TkJyuy((mXWOJ)~I1N3GFSU#qK*z4(AW zU$99~kl(4Deu6^IJ-yK!d!gpR5Q<0Jx<6y1dH%tMTdYn8>nplhODOm5-MvC6IbX4U zk&v7deKz69a40cr)%A6L1czJuO+R=%GdXxPQlrTKaaPBTh9mPR#=*^=>LIzCuGdzv z^XB!L)C|q2TJi22=x?vC_xXvwT9dzSfzEcR&v%)2$0X}z20|WOyWlc(q2~JzYl^vF zZC?NRBq+9k&$;vFxwKFmto16YsdtfBy*qKVoV$r}CjO>avp4z8$C9k9o2`EFYEf%g zrj>Y??~eUSPG}(Zhj_pBwQGB5XHfX{i4!_5)ms{#O7y4rNgOIhdReWT8t#Za&X$y3 z+POnSZy9Q%-YHFNBn&V_74cQK6N_6qrE+i2I(r=JX58TN{Rvi4-W_Gxvi-esRsS>B zDtH%-?J1I`y$7iC%(}Td+M|rlr3I#FDqi%24P%4^o7`fxh{`` zei-#m+`g0klf6Fp_V#WK(Q}3Bs@ssKak(3Bu32|YEn*v`N&x!4DF`$Sdh_e7TXVP4 zIu`xyQf}vwQt!N{hkw@XoCS>RKd9w){OpgKi9_XgS*_D*zs{YJIAw)6H;TJEtbJO{ zj14c=-~C0Tmd(Q6(RuUL>TiF{n^{17Iz3;KncEr5Syi_|NOy~TDTUZqs)N*MsjVx$ zghutZRj+0iW^62|cz9hjKYxa?^r9Y1-G?r4Sz4t+jlLV*T?#oT&QGN2Ek8d!OC#&1 x)84z!2CTVR)rCj+SNi)?*Q$-{2QK$dTskm!za3`2@&TN)!)E*3b$|QzzW|1*J<9+9 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 553d9e2f64723d236c10d8feeb56c23836529b00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9782 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 LZBvHT-ot+bfr+RI diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 19b5dc75afffdae7d345415572ef0d33fb92b869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10959 zcmeHNcU)7+_P_LE0TmS$0Z|tO11Xdw0#OkaT|ns~$c7XQEkHtz5WB0QtOc7E8!XUZX*M$>;i6P}liPBOZg2kc4J|Ydk1uP*(xhbWmtVrsgUF z_1B=tPktv>LC{Wc_vO0D%6gk7S|5ef$6&#DB-#*syve9ZIm`JQ3@B=qM7LdHGtemWjyquhzf`Yu_OqE$PXUv$nXzn~Em8FX{)R!(+ zQ`20budS)IdbygKj>)RkNR*+Wp@ufj42w3^#~7l;Oe7Q(6lTttsXA+xDtejPGW4JR zzz?B0@?x2!B(xyOITBKHB;coz29Q%mV)8Qu1>8$YNz2H}$tx(%00cS8Voga&N=wPe zNK1p>NYD>S&yktC47E;n-gcs#R-g)c->D?|-kX4N9>R}z06KSbM_GUg%_F+?RW zv@7K|!bi@8+;~mnp(A|G1p!a*Wl3L8Iitr+x7{vyW$FA7>n+D-T->?*WQB&HXqF5jrS)~G@1EB0(gJPaLj$V#?+ZT?#u45f58-`Gm$I_K)$VAidt3$dl^mRb8V4f&}(9abWx{B!X&o zJlj*(>4Y95-|gM?43m&VO5I>jW5S#C>Q_t|mF;W46{q4uNo>E!WTEzpfqO6{+tp^? zQjv8T=WsgODa9r*Rh{M=!8us45{Be+8wizAmHf+z1Eti){KE36k#@Jkrvg8O^YpvA zdt+QXh7IQW4sd?M09BOQrsf2U2N(C6d>rZ>&YD=Mcs6hj|5z>O1EVFQB6D53K7Y6; z|5C)Sal&gKqXeY`gA=&&z}{}R;Ab5ENnRpoXuyFbPcKxw&r@NSrcNlq5GAW1YO%h4 zI&ZK}4Xd`{eynz`Euzlm@e_f^D`9W!N787h7j8s7w#v;dd`Xmh9e0mIbxj8h&BJ_v zp{L0L9x!{L#CwOd51&XYxlq{H{fUCV^>iyQPIsrCN7aW3DHuX23A|wFj+#T@3fhxY*?9(ROQ{CK!M^a~7al#`KoGn$HQN*uCH2+r8ZjT0!-N3d7_GEG% z<>R<{Lm8ta%+A)-|&HH#^AuFqGhim8q z9^afh#9mXz?e8uoNOkUrWec{7F0fm8LhqiEZLwDCt`DwcWxQ!A?N`3GDAnAl+skKU z)>hGuC_=^UEPc}x9R04gBHivXZoTourI5BFA8otH1m{KN>}!4pQgt1cFZxtF7C+i? zD&yy~?fI$n7mL*;VCei2;T;&N%Q)CiKgelbAkY}6*GE-yL_2(ef8Xae3H9ht9&q0j zRSHfB_%Ni7iWabHQjhy`npX)ldd!g9hp z521HcpLv?_5|HujSb|sFgiEmri&eWRH`_HO-2FqgUv!Iw(iVfuu4bWQ>T$q8&L>D z3UWd`41KT_vvo|+SVBUKsq$~8nWtP+N%Ry_lTK&YxTm|y`T zbq|YXWvV;e;AAh4o3-EJ+N;L8Pv^h}>f=om zvL6yMf2!h-Xm~Xa_&1&$&Ajf&cT^E9a!T#~shQK2r)xhQeUYEUq_}4ZV+)>fVzBE=K`O5cXs#HWBoA> zU$pu6b;_!A8&AYEm~xwZ>tdSA8Hs)Av1WxObt8K&<&uh4Wg{uTx&9#8$>4zw`cOuM z|0!Wos|e%@busV2aJF~-Wo*p8c7v~7N@zN5FX)g ziWBfm%D8>q#i*W0p9@8|1R8OIGQr>kwiqQcG6JdLeM(+?RrLF73zO`Q>D)N+hxu&g zn>WHcuY|2-=Rs5lJAvZr-=%WQngts5BCp;(*?JmJCb#8Gnq90_PzeJcyIlUh)hEwy z>D#w#%(ugJ6Q3O`fFVp2`+#b(nXn_Zj@=;CO}7J?9O9YcvB1{juZw>tv|Vamo?s*I zjQ`t_vUM(;}oWW*!KAz!|TFtJ}tbNHgMJ-W%BNb|REBD@W-jn
private int GetCargoSpace(EntityUid gridUid) { - var space = GetCargoPallets(gridUid).Count; + var space = GetCargoPallets(gridUid, BuySellType.Buy).Count; return space; } - private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid) + /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads + /// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy pads + private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid, BuySellType requestType = BuySellType.All) { _pads.Clear(); + var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var comp, out var compXform)) @@ -215,7 +218,13 @@ private int GetCargoSpace(EntityUid gridUid) continue; } + if ((requestType & comp.PalletType) == 0) + { + continue; + } + _pads.Add((uid, comp, compXform)); + } return _pads; @@ -275,7 +284,7 @@ private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, ou amount = 0; toSell = new HashSet(); - foreach (var (palletUid, _, _) in GetCargoPallets(gridUid)) + foreach (var (palletUid, _, _) in GetCargoPallets(gridUid, BuySellType.Sell)) { // Containers should already get the sell price of their children so can skip those. _setEnts.Clear(); diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 169daca07ac..202d03bcda9 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -25,7 +25,7 @@ public void InitializeEnsnaring() { SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(AttemptStepTrigger); - SubscribeLocalEvent(OnStepTrigger); + SubscribeLocalEvent(OnStepTrigger); SubscribeLocalEvent(OnThrowHit); SubscribeLocalEvent(OnAttemptPacifiedThrow); } @@ -49,7 +49,7 @@ private void AttemptStepTrigger(EntityUid uid, EnsnaringComponent component, ref args.Continue = true; } - private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredEvent args) + private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredOffEvent args) { TryEnsnare(args.Tripper, uid, component); } diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 9b9a042641f..e24de5a2f66 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -88,7 +88,7 @@ public override void Initialize() SubscribeLocalEvent(OnTriggerCollide); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnImplantTrigger); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnSlipTriggered); SubscribeLocalEvent(OnEmptyTriggered); @@ -228,7 +228,7 @@ private void OnImplantTrigger(EntityUid uid, TriggerImplantActionComponent compo args.Handled = Trigger(uid); } - private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredEvent args) + private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredOffEvent args) { Trigger(uid, args.Tripper); } diff --git a/Content.Server/LandMines/LandMineComponent.cs b/Content.Server/LandMines/LandMineComponent.cs index 63e1e4b99f0..1c4ba06691a 100644 --- a/Content.Server/LandMines/LandMineComponent.cs +++ b/Content.Server/LandMines/LandMineComponent.cs @@ -1,6 +1,13 @@ -namespace Content.Server.LandMines; +using Robust.Shared.Audio; + +namespace Content.Server.LandMines; [RegisterComponent] public sealed partial class LandMineComponent : Component { + /// + /// Trigger sound effect when stepping onto landmine + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier? Sound; } diff --git a/Content.Server/LandMines/LandMineSystem.cs b/Content.Server/LandMines/LandMineSystem.cs index 78c48ef99ec..22dedb93375 100644 --- a/Content.Server/LandMines/LandMineSystem.cs +++ b/Content.Server/LandMines/LandMineSystem.cs @@ -1,43 +1,43 @@ -using Content.Server.Explosion.EntitySystems; +using Content.Server.Explosion.EntitySystems; using Content.Shared.Popups; -using Content.Shared.StepTrigger; using Content.Shared.StepTrigger.Systems; -using Robust.Shared.Player; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; namespace Content.Server.LandMines; public sealed class LandMineSystem : EntitySystem { + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly TriggerSystem _trigger = default!; - public override void Initialize() { - SubscribeLocalEvent(HandleTriggered); - SubscribeLocalEvent(HandleTriggerAttempt); + SubscribeLocalEvent(HandleStepOnTriggered); + SubscribeLocalEvent(HandleStepOffTriggered); + + SubscribeLocalEvent(HandleStepTriggerAttempt); } - private static void HandleTriggerAttempt( - EntityUid uid, - LandMineComponent component, - ref StepTriggerAttemptEvent args) + private void HandleStepOnTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOnEvent args) { - args.Continue = true; + _popupSystem.PopupCoordinates( + Loc.GetString("land-mine-triggered", ("mine", uid)), + Transform(uid).Coordinates, + args.Tripper, + PopupType.LargeCaution); + + _audioSystem.PlayPvs(component.Sound, uid); } - private void HandleTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredEvent args) + private void HandleStepOffTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOffEvent args) { - // This doesn't use TriggerOnStepTrigger since we don't want to display the popup if nothing happens - // and I didn't feel like making an `AfterTrigger` event - if (_trigger.Trigger(uid, args.Tripper)) - { - _popupSystem.PopupCoordinates( - Loc.GetString("land-mine-triggered", ("mine", uid)), - Transform(uid).Coordinates, - args.Tripper, - PopupType.LargeCaution); - } + _trigger.Trigger(uid, args.Tripper); } -} + private static void HandleStepTriggerAttempt(EntityUid uid, LandMineComponent component, ref StepTriggerAttemptEvent args) + { + args.Continue = true; + } +} diff --git a/Content.Server/Tiles/LavaSystem.cs b/Content.Server/Tiles/LavaSystem.cs index 7aee0b65010..51bd6f8475f 100644 --- a/Content.Server/Tiles/LavaSystem.cs +++ b/Content.Server/Tiles/LavaSystem.cs @@ -11,7 +11,7 @@ public sealed class LavaSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnLavaStepTriggered); + SubscribeLocalEvent(OnLavaStepTriggered); SubscribeLocalEvent(OnLavaStepTriggerAttempt); } @@ -23,7 +23,7 @@ private void OnLavaStepTriggerAttempt(EntityUid uid, LavaComponent component, re args.Continue = true; } - private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredEvent args) + private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredOffEvent args) { var otherUid = args.Tripper; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index f8943a9bf90..891c790d52c 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1596,10 +1596,10 @@ public static readonly CVarDef */ public static readonly CVarDef UILayout = - CVarDef.Create("ui.layout", "Default", CVar.CLIENTONLY | CVar.ARCHIVE); + CVarDef.Create("ui.layout", "Separated", CVar.CLIENTONLY | CVar.ARCHIVE); - public static readonly CVarDef DefaultScreenChatSize = - CVarDef.Create("ui.default_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef OverlayScreenChatSize = + CVarDef.Create("ui.overlay_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); public static readonly CVarDef SeparatedScreenChatSize = CVarDef.Create("ui.separated_chat_size", "0.6,0", CVar.CLIENTONLY | CVar.ARCHIVE); diff --git a/Content.Shared/Chasm/ChasmSystem.cs b/Content.Shared/Chasm/ChasmSystem.cs index 51299557dbd..86b8d4fc4d7 100644 --- a/Content.Shared/Chasm/ChasmSystem.cs +++ b/Content.Shared/Chasm/ChasmSystem.cs @@ -24,7 +24,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnStepTriggerAttempt); SubscribeLocalEvent(OnUpdateCanMove); } @@ -47,7 +47,7 @@ public override void Update(float frameTime) } } - private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredEvent args) + private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredOffEvent args) { // already doomed if (HasComp(args.Tripper)) diff --git a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs index a0feab7052c..813a18f974c 100644 --- a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs +++ b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs @@ -14,7 +14,7 @@ public sealed partial class MovementSpeedModifierComponent : Component // Weightless public const float DefaultMinimumFrictionSpeed = 0.005f; public const float DefaultWeightlessFriction = 1f; - public const float DefaultWeightlessFrictionNoInput = 0.2f; + public const float DefaultWeightlessFrictionNoInput = 0f; public const float DefaultWeightlessModifier = 0.7f; public const float DefaultWeightlessAcceleration = 1f; diff --git a/Content.Shared/Physics/FrictionRemoverSystem.cs b/Content.Shared/Physics/FrictionRemoverSystem.cs new file mode 100644 index 00000000000..65bbe9e4d23 --- /dev/null +++ b/Content.Shared/Physics/FrictionRemoverSystem.cs @@ -0,0 +1,25 @@ +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; + +namespace Content.Shared.Physics; + +public sealed class FrictionRemoverSystem : EntitySystem +{ + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(RemoveDampening); + } + + + private void RemoveDampening(EntityUid uid, PhysicsComponent component, PhysicsSleepEvent args) + { + _physics.SetAngularDamping(uid, component, 0f, false); + _physics.SetLinearDamping(uid, component, 0f); + } +} diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index d20495cfa6c..ff8b597a0d5 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -31,14 +31,14 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(HandleAttemptCollide); - SubscribeLocalEvent(HandleStepTrigger); + SubscribeLocalEvent(HandleStepTrigger); SubscribeLocalEvent(OnNoSlipAttempt); SubscribeLocalEvent(OnThrownSlipAttempt); // as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer). SubscribeLocalEvent>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args)); } - private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredEvent args) + private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredOffEvent args) { TrySlip(uid, component, args.Tripper); } diff --git a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs index f4731bf46ab..b8483d021a4 100644 --- a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs +++ b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs @@ -49,8 +49,14 @@ public sealed partial class StepTriggerComponent : Component /// If this is true, steptrigger will still occur on entities that are in air / weightless. They do not /// by default. ///
- [DataField] + [DataField, AutoNetworkedField] public bool IgnoreWeightless; + + /// + /// Does this have separate "StepOn" and "StepOff" triggers. + /// + [DataField, AutoNetworkedField] + public bool StepOn = false; } [RegisterComponent] diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index ede39b2aa97..b4ac2cde756 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -11,6 +11,7 @@ public sealed class StepTriggerSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedMapSystem _map = default!; public override void Initialize() { @@ -40,7 +41,9 @@ public override void Update(float frameTime) while (enumerator.MoveNext(out var uid, out var active, out var trigger, out var transform)) { if (!Update(uid, trigger, transform, query)) + { continue; + } RemCompDeferred(uid, active); } @@ -56,7 +59,8 @@ private bool Update(EntityUid uid, StepTriggerComponent component, TransformComp if (component.Blacklist != null && TryComp(transform.GridUid, out var grid)) { - var anch = grid.GetAnchoredEntitiesEnumerator(grid.LocalToTile(transform.Coordinates)); + var positon = _map.LocalToTile(uid, grid, transform.Coordinates); + var anch = _map.GetAnchoredEntitiesEnumerator(uid, grid, positon); while (anch.MoveNext(out var ent)) { @@ -109,8 +113,16 @@ private void UpdateColliding(EntityUid uid, StepTriggerComponent component, Tran return; } - var ev = new StepTriggeredEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref ev, true); + if (component.StepOn) + { + var evStep = new StepTriggeredOnEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } + else + { + var evStep = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStep); + } component.CurrentlySteppedOn.Add(otherUid); Dirty(uid, component); @@ -130,7 +142,7 @@ private bool CanTrigger(EntityUid uid, EntityUid otherUid, StepTriggerComponent var msg = new StepTriggerAttemptEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref msg, true); + RaiseLocalEvent(uid, ref msg); return msg.Continue && !msg.Cancelled; } @@ -163,6 +175,12 @@ private void OnEndCollide(EntityUid uid, StepTriggerComponent component, ref End component.CurrentlySteppedOn.Remove(otherUid); Dirty(uid, component); + if (component.StepOn) + { + var evStepOff = new StepTriggeredOffEvent(uid, otherUid); + RaiseLocalEvent(uid, ref evStepOff); + } + if (component.Colliding.Count == 0) { RemCompDeferred(uid); @@ -230,9 +248,14 @@ public struct StepTriggerAttemptEvent public bool Cancelled; } +/// +/// Raised when an entity stands on a steptrigger initially (assuming it has both on and off states). +/// [ByRefEvent] -public struct StepTriggeredEvent -{ - public EntityUid Source; - public EntityUid Tripper; -} +public readonly record struct StepTriggeredOnEvent(EntityUid Source, EntityUid Tripper); + +/// +/// Raised when an entity leaves a steptrigger if it has on and off states OR when an entity intersects a steptrigger. +/// +[ByRefEvent] +public readonly record struct StepTriggeredOffEvent(EntityUid Source, EntityUid Tripper); diff --git a/LEGAL.md b/LEGAL.md index 2df3c39add1..34cd4009d53 100644 --- a/LEGAL.md +++ b/LEGAL.md @@ -6,9 +6,9 @@ The Authors retain all copyright to their respective work submitted here. ## Code license -Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). +Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). -Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). +Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](./LICENSE-MIT.txt). [87c70a89a67d0521a56388e6b1c3f2cb947943e4](https://github.com/Simple-Station/Einstein-Engines/commit/87c70a89a67d0521a56388e6b1c3f2cb947943e4) was pushed on February 17th 2024 at 21:48 UTC diff --git a/README.md b/README.md index 3dbe1910e29..f102318611f 100644 --- a/README.md +++ b/README.md @@ -41,27 +41,24 @@ We provide some scripts shown below to make the job easier. ### Build dependencies > - Git -> - DOTNET SDK 7.0 or higher -> - python 3.7 or higher +> - .NET SDK 8.0.100 ### Windows > 1. Clone this repository -> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal -> 3. Run the `Scripts/bat/run1buildDebug.bat` -> 4. Run the `Scripts/bat/run2configDev.bat` if you need other configurations run other config scripts -> 5. Run both the `Scripts/bat/run3server.bat` and `Scripts/bat/run4client.bat` -> 6. Connect to localhost and play +> 2. Run `git submodule update --init --recursive` in a terminal to download the engine +> 3. Run `Scripts/bat/buildAllDebug.bat` after making any changes to the source +> 4. Run `Scripts/bat/runQuickAll.bat` to launch the client and the server +> 5. Connect to localhost in the client and play ### Linux > 1. Clone this repository -> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal -> 3. Run the `Scripts/sh/run1buildDebug.sh` -> 4. Run the `Scripts/sh/run2configDev.sh` if you need other configurations run other config scripts -> 5. Run both the `Scripts/sh/run3server.bat` and `scripts/sh/run4client.sh` -> 6. Connect to localhost and play +> 2. Run `git submodule update --init --recursive` in a terminal to download the engine +> 3. Run `Scripts/bat/buildAllDebug.sh` after making any changes to the source +> 4. Run `Scripts/bat/runQuickAll.sh` to launch the client and the server +> 5. Connect to localhost in the client and play ### MacOS @@ -70,12 +67,12 @@ We provide some scripts shown below to make the job easier. ## License Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. -See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). +See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the MIT license unless otherwise stated. -See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). +See [LICENSE-MIT](./LICENSE-MIT.txt). Most assets are licensed under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) unless stated otherwise. Assets have their license and the copyright in the metadata file. -[Example](https://github.com/Simple-Station/Einstein-Engines/blob/master/Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). +[Example](./Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). Note that some assets are licensed under the non-commercial [CC-BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) or similar non-commercial licenses and will need to be removed if you wish to use this project commercially. diff --git a/RUN_THIS.py b/RUN_THIS.py deleted file mode 100755 index 6ea9f8e707d..00000000000 --- a/RUN_THIS.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python3 - -# Import future so people on py2 still get the clear error that they need to upgrade. -from __future__ import print_function -import sys -import subprocess - -version = sys.version_info -if version.major < 3 or (version.major == 3 and version.minor < 5): - print("ERROR: You need at least Python 3.5 to build SS14.") - sys.exit(1) - -subprocess.run([sys.executable, "git_helper.py"], cwd="BuildChecker") diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 90445a31d1c..6f18510d17b 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -226,3 +226,8 @@ copyright: TGStation at 3df5d3b42bfb6b3b5adba1067ab41f83816255bb license: CC-BY-SA-3.0 source: https://github.com/tgstation/tgstation/blob/3df5d3b42bfb6b3b5adba1067ab41f83816255bb/sound/misc/server-ready.ogg + +- files: [beep_landmine.ogg] + copyright: '"beep_landmine.ogg" by kaktuscsc of Discord for SS14' + license: "CC-BY-SA-3.0" + source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f diff --git a/Resources/Audio/Effects/beep_landmine.ogg b/Resources/Audio/Effects/beep_landmine.ogg new file mode 100644 index 0000000000000000000000000000000000000000..48bc5e21d962084a1db41c473f30892d914894ae GIT binary patch literal 6034 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 Bu4e!M literal 0 HcmV?d00001 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 743c0add322..7fcb7aac227 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4051,7 +4051,7 @@ Entries: - type: Add message: >- Glass/Crystal shards and floor tiles now deal damage and embed in - victims when colliding with them. + victims when colliding with them. id: 6107 time: '2024-05-11T01:23:00.0000000+00:00' - author: FoxxoTrystan @@ -4142,3 +4142,45 @@ Entries: message: Floors Looks Updated/Resprited. id: 6118 time: '2024-06-03T19:23:51.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Add + message: All species can now bring their own cultures and languages + id: 6119 + time: '2024-06-10T20:48:48.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Tweak + message: Rust Walls Sprites. + - type: Tweak + message: Armor, Bulletproof, Riot Suit Resprites. + - type: Tweak + message: New Banners Sprites. + - type: Tweak + message: Stunbaton, Fire Extinguisher New Sprites. + - type: Tweak + message: Rack/WallScreen resprites. + - type: Tweak + message: Stock Parts new sprites! + - type: Tweak + message: Radiation Collector has now a new sprite! + id: 6120 + time: '2024-06-11T00:34:02.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: >- + UI layout now defaults to separated, the old one is still available in + settings + id: 6121 + time: '2024-06-16T22:38:10.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: Space has suddenly become less dense (objects don't slow down in space) + - type: Remove + message: Moths are unable to move in space + - type: Tweak + message: Moths have way better control in zero gravity environments + id: 6122 + time: '2024-06-17T07:58:34.0000000+00:00' diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 8c54ecb084d..03d5059e95b 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index a10f070bd25..f040d58253d 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -3,20 +3,20 @@ meta: postmapinit: false tilemap: 0: Space - 29: FloorDark - 34: FloorDarkMono - 37: FloorDarkPavementVertical - 49: FloorGrassJungle - 64: FloorMetalDiamond - 77: FloorReinforced - 89: FloorSteel - 100: FloorSteelMono - 104: FloorTechMaint - 105: FloorTechMaint2 - 118: FloorWood - 119: FloorWoodTile - 120: Lattice - 121: Plating + 31: FloorDark + 36: FloorDarkMono + 39: FloorDarkPavementVertical + 51: FloorGrassJungle + 66: FloorMetalDiamond + 79: FloorReinforced + 93: FloorSteel + 104: FloorSteelMono + 108: FloorTechMaint + 109: FloorTechMaint2 + 122: FloorWood + 124: FloorWoodTile + 125: Lattice + 126: Plating entities: - proto: "" entities: @@ -31,27 +31,27 @@ entities: chunks: 0,0: ind: 0,0 - tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: XQAAAAABXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAAAXQAAAAADXQAAAAAAXQAAAAABXQAAAAADXQAAAAAAJAAAAAABJwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAJAAAAAAAJAAAAAABJAAAAAAAJAAAAAAAJAAAAAACJAAAAAABJAAAAAAAJAAAAAAAJAAAAAABJAAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAfAAAAAABfAAAAAADfAAAAAACMwAAAAAAMwAAAAAAMwAAAAAAfAAAAAADfAAAAAABfAAAAAABegAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAADfAAAAAABfAAAAAADfAAAAAADegAAAAADegAAAAACegAAAAADfAAAAAAAfAAAAAABfAAAAAAAegAAAAACJAAAAAADJwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAegAAAAABegAAAAACegAAAAABegAAAAAAegAAAAACegAAAAAAegAAAAAAegAAAAABegAAAAADegAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: fgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAJAAAAAAAfgAAAAAAfgAAAAAAJAAAAAABJAAAAAABHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAABJAAAAAACJAAAAAAAJAAAAAAAJAAAAAABJAAAAAABJAAAAAACJAAAAAAAJAAAAAACfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAAAXQAAAAACXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAACXQAAAAABXQAAAAABfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAADXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAACaAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAABbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAAAaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAADXQAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAABaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAADTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAACTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADaAAAAAADfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAACJAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAADJAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAA version: 6 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAIgAAAAABIgAAAAACHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAHQAAAAABHQAAAAACHQAAAAABIgAAAAADIgAAAAADHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAJAAAAAABJAAAAAACHwAAAAACHwAAAAADHwAAAAABHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAHwAAAAABHwAAAAACHwAAAAABJAAAAAADJAAAAAADHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-2: ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAA version: 6 - type: Broadphase - type: Physics @@ -1889,276 +1889,303 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-17.5 parent: 2 -- proto: CargoPallet +- proto: CargoPalletBuy entities: - - uid: 20 - components: - - type: Transform - pos: 7.5,0.5 - parent: 2 - uid: 21 components: - type: Transform - pos: 8.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-9.5 parent: 2 - uid: 24 components: - type: Transform - pos: 8.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-9.5 parent: 2 - uid: 25 components: - type: Transform - pos: 7.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-8.5 parent: 2 - uid: 26 components: - type: Transform - pos: 7.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-8.5 parent: 2 - uid: 27 components: - type: Transform - pos: 8.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-7.5 parent: 2 - uid: 30 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,0.5 - parent: 2 - - uid: 32 - components: - - type: Transform pos: 2.5,-7.5 parent: 2 - - uid: 34 + - uid: 32 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-7.5 + pos: 4.5,-9.5 parent: 2 - uid: 35 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,-0.5 parent: 2 - uid: 36 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-1.5 + rot: 1.5707963267948966 rad + pos: 6.5,-0.5 parent: 2 - uid: 37 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-9.5 + pos: 4.5,-7.5 parent: 2 - uid: 39 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-2.5 parent: 2 - uid: 41 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 7.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-1.5 parent: 2 - uid: 42 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-8.5 + rot: 1.5707963267948966 rad + pos: 7.5,-1.5 parent: 2 - uid: 43 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-9.5 + rot: 1.5707963267948966 rad + pos: 8.5,-2.5 parent: 2 - uid: 44 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-1.5 parent: 2 - - uid: 45 + - uid: 47 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-8.5 + rot: 1.5707963267948966 rad + pos: 8.5,0.5 parent: 2 - - uid: 46 + - uid: 49 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-6.5 + rot: 1.5707963267948966 rad + pos: 8.5,-0.5 parent: 2 - - uid: 47 + - uid: 50 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-9.5 + rot: 1.5707963267948966 rad + pos: 7.5,-2.5 parent: 2 - - uid: 48 + - uid: 56 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-7.5 + pos: 4.5,-6.5 parent: 2 - - uid: 49 + - uid: 61 components: - type: Transform - pos: 7.5,-9.5 + rot: -1.5707963267948966 rad + pos: 4.5,-8.5 parent: 2 - - uid: 50 + - uid: 67 components: - type: Transform - pos: 3.5,-7.5 + rot: -1.5707963267948966 rad + pos: 3.5,-6.5 parent: 2 - - uid: 51 + - uid: 71 components: - type: Transform - pos: 3.5,-9.5 + rot: -1.5707963267948966 rad + pos: 2.5,-6.5 parent: 2 - - uid: 52 + - uid: 183 components: - type: Transform - pos: 3.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,0.5 parent: 2 - - uid: 54 + - uid: 900 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,0.5 parent: 2 - - uid: 55 +- proto: CargoPalletSell + entities: + - uid: 34 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-2.5 + pos: 4.5,-0.5 parent: 2 - - uid: 56 + - uid: 45 components: - type: Transform - pos: 3.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-7.5 parent: 2 - - uid: 57 + - uid: 46 components: - type: Transform - pos: 2.5,-8.5 + rot: -1.5707963267948966 rad + pos: 4.5,-2.5 parent: 2 - - uid: 58 + - uid: 48 components: - type: Transform - pos: 3.5,-0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-2.5 parent: 2 - - uid: 59 + - uid: 51 components: - type: Transform - pos: 3.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-1.5 parent: 2 - - uid: 60 + - uid: 52 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-0.5 + pos: 2.5,-2.5 parent: 2 - - uid: 61 + - uid: 54 components: - type: Transform - pos: 2.5,-9.5 + rot: 1.5707963267948966 rad + pos: 6.5,-9.5 parent: 2 - - uid: 66 + - uid: 55 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-2.5 + pos: 2.5,-1.5 parent: 2 - - uid: 67 + - uid: 57 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,-9.5 + parent: 2 + - uid: 58 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-2.5 + pos: 4.5,0.5 parent: 2 - - uid: 68 + - uid: 59 components: - type: Transform - pos: 2.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-6.5 parent: 2 - - uid: 69 + - uid: 60 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-2.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - - uid: 70 + - uid: 66 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-2.5 + pos: 3.5,0.5 parent: 2 - - uid: 71 + - uid: 68 components: - type: Transform - pos: 2.5,-0.5 + rot: 1.5707963267948966 rad + pos: 7.5,-8.5 parent: 2 - - uid: 72 + - uid: 69 components: - type: Transform - pos: 2.5,0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-8.5 parent: 2 - - uid: 73 + - uid: 70 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-9.5 parent: 2 - - uid: 183 + - uid: 72 components: - type: Transform - rot: -1.5707963267948966 rad + rot: 1.5707963267948966 rad pos: 7.5,-6.5 parent: 2 - - uid: 900 + - uid: 73 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-6.5 + rot: 1.5707963267948966 rad + pos: 6.5,-6.5 parent: 2 - uid: 901 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-6.5 + pos: 2.5,-0.5 parent: 2 - uid: 903 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,0.5 + pos: 3.5,-0.5 parent: 2 - uid: 907 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - uid: 908 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-2.5 + pos: 4.5,-1.5 parent: 2 - uid: 909 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-8.5 + parent: 2 + - uid: 960 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-7.5 + parent: 2 + - uid: 961 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-1.5 + pos: 2.5,0.5 parent: 2 - proto: CarpetBlack entities: diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index f3610178b9e..aa4a7b50e65 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -549,9 +549,9 @@ description: A cozy jacket with the Cybersun logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi - type: entity parent: ClothingOuterWinterCoat @@ -560,9 +560,9 @@ description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi - type: entity parent: ClothingOuterWinterCoat @@ -571,9 +571,9 @@ description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi - type: entity parent: ClothingOuterWinterCoat @@ -582,9 +582,9 @@ description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi - type: entity parent: ClothingOuterWinterCoat @@ -593,9 +593,9 @@ description: A cozy jacket with the Interdyne logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi - type: entity parent: ClothingOuterWinterCoat @@ -604,9 +604,9 @@ description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi - type: entity parent: ClothingOuterWinterCoat @@ -615,9 +615,9 @@ description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi - type: entity parent: ClothingOuterWinterCoat @@ -626,9 +626,9 @@ description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi - type: entity parent: ClothingOuterWinterCoat @@ -637,9 +637,9 @@ description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi - type: entity parent: ClothingOuterWinterCoat @@ -648,6 +648,6 @@ description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi + sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 1680dd6cda6..df7fad06dd2 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -44,9 +44,7 @@ Female: UnisexMoth Unsexed: UnisexMoth - type: MovementSpeedModifier - weightlessAcceleration: 1.5 # Move around more easily in space. - weightlessFriction: 1 - weightlessModifier: 1 + weightlessAcceleration: 2.5 # Move around more easily in space. - type: Flammable damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml index f232bf1d34d..67d79540382 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml @@ -17,7 +17,7 @@ - type: Sprite state: icon - type: Item - size: Normal + size: Small - type: MeleeWeapon soundNoDamage: path: "/Audio/Effects/Fluids/splat.ogg" @@ -39,6 +39,18 @@ - type: TrashOnSolutionEmpty solution: drink +- type: entity + parent: DrinkCartonBaseFull + id: DrinkCartonBaseLargeFull + abstract: true + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 + - type: Item + size: Normal + - type: entity id: DrinkCartonVisualsOpenable abstract: true @@ -116,7 +128,7 @@ sprite: Objects/Consumable/Drinks/cream.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkMilkCarton name: milk description: An opaque white liquid produced by the mammary glands of mammals. @@ -124,7 +136,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: Milk Quantity: 100 @@ -132,7 +143,7 @@ sprite: Objects/Consumable/Drinks/milk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkSoyMilkCarton name: soy milk description: White and nutritious soy goodness! @@ -140,7 +151,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: MilkSoy Quantity: 100 @@ -148,7 +158,7 @@ sprite: Objects/Consumable/Drinks/soymilk.rsi - type: entity - parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseLargeFull] id: DrinkOatMilkCarton name: oat milk description: It's oat milk. Tan and nutritious goodness! @@ -156,7 +166,6 @@ - type: SolutionContainerManager solutions: drink: - maxVol: 100 reagents: - ReagentId: MilkOat Quantity: 100 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml index f6dd7222611..86bc34f3c8b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml @@ -8,6 +8,8 @@ components: - type: Sprite state: icon + - type: Item + size: Normal - type: SolutionContainerManager solutions: drink: @@ -72,6 +74,19 @@ Glass: 100 - type: SpaceGarbage +- type: entity + name: base empty bottle + id: DrinkBottleBaseSmallEmpty + parent: DrinkBottleBaseEmpty + abstract: true + components: + - type: Item + size: Small + - type: SolutionContainerManager + solutions: + drink: + maxVol: 50 + - type: entity name: base empty carton id: DrinkCartonBaseEmpty @@ -122,6 +137,19 @@ Cardboard: 20 - type: SpaceGarbage +- type: entity + name: base empty bottle + id: DrinkCartonBaseLargeEmpty + parent: DrinkCartonBaseEmpty + abstract: true + components: + - type: Item + size: Normal + - type: SolutionContainerManager + solutions: + drink: + maxVol: 100 + # Containers - type: entity name: Jailbreaker Verte bottle @@ -143,28 +171,20 @@ - type: entity name: ale bottle - parent: DrinkBottleBaseEmpty + parent: DrinkBottleBaseSmallEmpty id: DrinkBottleAle components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/alebottle_empty.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 50 - type: entity name: beer bottle - parent: DrinkBottleBaseEmpty + parent: DrinkBottleBaseSmallEmpty id: DrinkBottleBeer components: - type: Sprite sprite: Objects/Consumable/TrashDrinks/beer_empty.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 50 - type: entity @@ -322,37 +342,24 @@ - type: entity name: milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/milk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 - - type: entity name: soy milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonSoyMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/soymilk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 - type: entity name: oat milk carton - parent: DrinkCartonBaseEmpty + parent: DrinkCartonBaseLargeEmpty id: DrinkCartonOatMilk components: - type: Sprite sprite: Objects/Consumable/Drinks/oatmilk.rsi - - type: SolutionContainerManager - solutions: - drink: - maxVol: 100 diff --git a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml index 9088edc8159..a3e3485bc65 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml @@ -35,9 +35,13 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: LandMine - - type: TriggerOnStepTrigger + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: StepTrigger requiredTriggeredSpeed: 0 + stepOn: true - type: entity name: kick mine @@ -57,7 +61,6 @@ - type: Construction graph: ModularMineGraph node: emptyCase - - type: LandMine - type: entity name: explosive mine @@ -71,4 +74,3 @@ intensitySlope: 3 totalIntensity: 120 # about a ~4 tile radius canCreateVacuum: false - - type: DeleteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index 925e036e09e..c628d199a90 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -21,6 +21,7 @@ mask: - MachineMask - type: CargoPallet + palletType: All - type: StaticPrice price: 100 - type: Sprite @@ -53,3 +54,33 @@ - type: GuideHelp guides: - Cargo + +- type: entity + id: CargoPalletSell + name: cargo selling pallet + description: Designates valid items to sell with a selling computer, or to CentCom when a shuttle is recalled. + parent: CargoPallet + components: + - type: CargoPallet + palletType: sell + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_sell + + +- type: entity + id: CargoPalletBuy + name: cargo buying pallet + description: Designates where orders will appear when purchased. + parent: CargoPallet + components: + - type: CargoPallet + palletType: buy + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_buy + diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 8d3c83e3e1e..2ddb21b9e6c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -230,6 +230,7 @@ - type: StepTrigger intersectRatio: 0.2 requiredTriggeredSpeed: 0 + stepOn: true - type: CollisionWake enabled: false - type: Physics @@ -251,6 +252,10 @@ mask: - ItemMask - type: LandMine + sound: + path: /Audio/Effects/beep_landmine.ogg + params: + maxDistance: 10 - type: ExplodeOnTrigger - type: Explosive explosionType: HardBomb # normally Default and max 5 total 60 diff --git a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml index 85c9bdae3df..77b03d36f5d 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/curtains.yml @@ -50,6 +50,8 @@ MaterialCloth1: min: 1 max: 2 + - type: WallMount + arc: 360 - type: entity id: HospitalCurtains @@ -350,4 +352,4 @@ graph: Curtains node: CurtainsWhiteOpen - type: Physics - canCollide: false \ No newline at end of file + canCollide: false diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index 1a17b2f856d..25978771872 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -731,9 +731,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsBlack @@ -748,9 +746,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsBlue @@ -765,9 +761,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsCyan @@ -782,9 +776,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsGreen @@ -799,9 +791,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsOrange @@ -816,9 +806,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsPink @@ -833,9 +821,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsPurple @@ -850,9 +836,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsRed @@ -867,9 +851,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: CurtainsWhite @@ -884,9 +866,7 @@ state: closed objectType: Structure placementMode: SnapgridCenter - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked + canBuildInImpassable: true - type: construction id: Bookshelf diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 5eadcdc1c1ab3fbd2bf67c5055286b407e2e4a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9460 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..35003686d555624fcac17b387f726605cd147bd7 GIT binary patch literal 10509 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..fe470b0074272a504eac30798883e5e2c6c5e027 GIT binary patch literal 9875 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..06932fff6fa7370f5410813dea7991e4cf15cae8 GIT binary patch literal 10492 zcmeHNc~}$4wr>{M+)zOow;<}EU?2$zBoTaIK%&6Cuab*U< zxTCTSA|e7t+)xoSin5A`2*H66*05yhR{?Qw-hA)fdGFr)-9M(2N>^8%I(2^MoT_uW zJNvh6UO!!Dz77OI)195{-N1Q`vS?|5-)pS!w-7WZjj_Wy(An7p(gJOOQbiq7QPO~- zGO4brq6Vpfw!NUt26ZKkvdmYRGIl-$>I**APk{Q0Pc+IgSQS-hIyk3;f&+CuaJ~i# zYv1@>cR>9YP_)KAvXv0z4X!56>z!S;7~;&Z7&8kZ7>~i>$rwvAmSBj(kO@{~3=Yh% za`rcgz)(mVQb6Opl`>9XQVKeONm-x3v<}qOKFO=pjK-w8{v;eKs^dJJlw&{D-DWE% zn2;T*L*7BU8yuY-!9+?0fghw1vV*iVG&D7)XlZI{YHMrhOw*e_ZR*r%U(KE~Q*Y6H z)Z#_+7cMkhW@cYAQyM>MRwtSt`f_2nFPvqB3@jLjl*SYU)!oG_|yKrUHUOU8Sbf zRMpj{Oi@<{y-A=SQlB+t_7dz`jX7JXnnvMzxZOw3X)RrsU#{==qGy>!K*YD&I&X zyYKJ&4;(vw;^e8+AAd?af8pY#%b8cMUb|j!qwr?Yt>WAF?mu|=sN(UHr!T8ty{@UP zt8Zv|-}<4gUD)yQ*WSMVfkDa8@W`kVmlEg1F^=qaxMl%ds_N=$>Y7SiDylI`;Iq`H zEWv8bUb|J38a~Gew_8hZ-O+RT<=RUv+_rNa`r&vEM{jt@TaWTWTuLl;jOGn^)E&(5ixT zVROU2<@#0VeFnw09>vd^cgRyJ~)+g+fUqf zJ(>vVZ&*UkNO5mlO9!^t(d)#v??)&L0s->QzoYb~1 z1Uj|zIae%le&WF0NWD^QyQ4b*4uGpG6eI+yy&#>VI78_bD9R$ey7$O;OW*+><$05A zL3Hb4VNJfQnNyQ%UEuSg?kC6aXoi26>u4+jRZvC;eq)j4$0_Rc-6u0d4bDNJ$0+&9 zO+p=bj)~qi*B0wL2MS_X5?`LJs9tm+XU(@?7}oS$4}T8=wJekRk232Of&#@(fIsF| zMbp(2Cp_x69z1@Xa3jN5YW`e~K&RV771M7$N)qI-hu3jTMLaWZ0blys?A+NAKmXCq zT;99Ugc|0aTm)(re^3bFp{%{Qh)he_kr4;Si?bWIU926LDH0SQ(8ZC(o5dr{5>myj zfjr!;BE^fw{*h$A1SZhOpl3ntyjBDn*#|ee%1_<6_c}(x3BbB<^LxRjcic9YEwhD3 z*VoGq^UL|sUD895c@AkDQ%+^N^i^SD)^MY(t860zl_3!N4zKIghKs?JEKW{a4f&_~$rq~Oah-bvw%{l`MHn2)mNYRHgkqGr>*R7d3}oC<7#^TfN6HC&WiKjj1^JhN*IB( z#0>}(B}t($dqWzFV)6xE@3YoM*%Zs4!|(j%K?`ZiS<^RcjX5HWxf08->O-Jk!Ve)( zrGKWBP!;Rg-^B}&zm+$xZZ&AyiN4xh(H)LJstDA%z3BT8MXf~eHl(rOCO6}?z$<-; zOWz{Bpv_V9R@$2ep@aUxjxir40G`RUy#BbRnmxFp}SM7=fyr6?TAC zE#ZBWl@x3!W&KuSul6xuln7|XYjpbzcgR7#@?G-_6Rf#~3k1S-c zYfuS**DSX|pbr#9ncFKo$`tfDKj+F&uJJ-k=G2y)ZBi?de{sKc74P98n(f=cH^8TY z5oikn$$$WLwW;23l6WysN}^Z4&q1JIxO%1x=q$&t;KBy4CqZ#0g-%%xCv!!%l?B44 z5}SOFYY7KaZiJ3liUf(T^e+?+SO87`Fy^w+cl7uO^nHv7zAatPD;T~R+E`L2%nA26 zd;82Ag^%$;{_P`h2k{ZymRBuLYcE|ICvm-*EKU|>^d4eo zpL#V!8zLgmZg?=u`<^8nEMY}UOzGUEWjn0zoJgD?}OCQ2^?DGIlj)YuBUZQvAu*~@>D zOM=3 zp?Tmw0-=CyJ+nJrp1SUJWwf7*FYHnJQo9%Zk1mE z_T%@86@{p6{#C=8wUmRjE{ z_<6yn^=tSm9)M+%BI6=Z-g=3#+!}7>$>Yl;{$R`A@amV+)$&3~%0Qm+lSYs%0WTR^ zeBwi^{xgZ*(v^31bVqpBP-tMsjN>Q6`wSjY9$oW{%Gt&5Nr^*!MD6Myf;Fm2!n?UO z#Zx;``6F;?GoNz*5DnGpmUgWD$o&&Os8vNKTOIVEKPnz23s5)Xc%}6PsQVy-wKyD3 zX|x8rZGB3MG9={k9bUjKOZpM$rLEutNGYU6%r~@4)34;RLS`L2-F8H1CEt%guBc%l z0{NwUPIv}i1m9VtcqpZedS(dOAgKbuEP>}$DK(eEm)w2m#i#D2Gc+sF&w{@c*~4Vg z#;3>o;TItDH!IE`fF_D5=Y9<@Na`vmV!y2ycsQ0k2-I{bSXt_)!o!+@W}MI z_Se^z-DC!u%nB=MTAVuVEnA#wFqB8Gx#2&&zBFYZGs51 zk5>{e5g*BUZH=`~jj$!?Cq1wON{&KESFOx>J$VIn7*x&Xcr$Fps^CE|HC zWasDzMDQ-)cO@VntBRhyv%WZZJZgS|;k|n%^SleHtnFA5|AItm5nFU9GJ8XpEa@@= zF~L_c^sKoZo`F4lM=|)w)AuV<`3CRwsPpHn47&8TI_#o@A84ZJ*AH)WQ{0s@yGs!W z#Q9KVoFB}^-44|eNP|VF(!Ru;vLYsFG~Qis{A7QZ4{0RzYas)~)jT-}zp*emy}$$=U*DbCc+dJ|ivx7F{- z`|-SQBL5pdFRq#t`<1ckb-~brXyI@_?`1X!?N0Wd*2VP|bs*5wMtH^< z?X7p-&?x?19sCvo0$qU>jv%D4%&g}~4)c34jYX8c3W}8A1|qkeg2(Thhd>P9{EV-1 zgZT3V14O1yZ}g?2%0Zkp$YD5gki)D$${#LbHx<>zdw%6>S;CYbl)!J}-m<$J!w)4T z1^<+LB_bl%<;c$de%mAv(ykd!ED+_{G_S`>2C{@kiaf1Y=giyIF6kYY#{6deIs2^R z*uJE`jXz3uTnb&%0W`|Dby1RZR+IDDaxGhN{dm(hweSAeA2FOx9Cs? zG1WiVlxK$gQrIlYy8&N_v)%kDz1{vW*6Y^JvQE!L?hwq$88v3Pl4 zZbC?PoOiO1@NL2J)Tb5TzM}Tnr0iiPVSMuDJvrxqQd6v)kfqXJ;4|!3kuAFd!&4J?W^8 z)BQCIANp?#buiJ1)(wBWC8O)S(GjmbM($dL>#}BiotnJ%_}*m?A8rjp6NmG6M1_Ud zye{|9Ri~^;UzD!rd+`CXe9v6$;)O%4O=T5LtJmyu|1mJCN;Qpr`Xhbav-a%|dra3E zK)UOl0#9L$omUPY$xBclj-MyosSqj_CI!6>ShHr?8OC1L9FDFlr$IxQ^nQiu6O&$2 z?=9zf%aT9be&4%5c)n6qa47Ak0qgJ+J61*i{IWco9`s<_1FT2&O8>|4*%5EwXL|%? zN4YBQIr;hTY$sRET9*I!LOOnF&v)e^Dz`IRC$(o%#RbCzw|7; z;MOg6@YBU%#cI=RzPi4$#O;U6TUJ0~=70<7Z#{E6eEZ{rMXduWkGFVUUGVOmu7RnW zxpX0f4RV-K0EDY0Qx zS}-HhFo3~iv2BdRC43`87Tw0kli-4J3A1DDVmZY}Ft){ScBjP$(@1n9imi@yEEzBe zWkga9V?#sOTym_9(HLJcs4JVzjSR;~B7<#=c7O+>cAN-?A>IschCw^TvZ8TDwmOE^ z5%fT^o4w;F7U0UpXjf!p7}?xBCML!##=?vf!8FH`NF;L%&K!qB0}3=ZjvYyjMYFj} zl`O`2*fY4a2v%4mi^Dcl@}vfEq9SdKj6lEPgnXf4E-s(hv$>zN0Q6xVOARx}nqkaC zL(M0T;6^$`116sY`oj@i_qZ^Ixf_GaiHe{x9HJTQ$fc86&}pB?hebt%jKQJP%o!n! zP(aEBvtqxPQu*lk^9ZF1n5@vSu~9(TUr|?}$ z%Eg6j&!I&r#dEf|F;dP?rgLa4I(fWG3kW1)=oV;fAPJAg<1GWxM9aWHG=YW>z*u5P zmQ)&P5-VpmH;k*9aEyN@~btsg$hffE6LYA`lZuB%m>tN@=K6BAUpsqM=C)S|Falu*8!XwlTt)jgyYGYzd)827&=LMw?jdsMy~~-C3cG zZIM)^HnCP%BA!IT<8VX^5)Oy`jc7X~f(txR$#d)_z*vvcEMx!%D3+@9Q@~)X9bh5b zMKGw5oCtRgC&b3+^Xr4p-7a7`(W#MCduk*DF#Y^O!F}R|0vZEeF??1U*@Z)A1;+hv z)XK$UXgzLnCl(jXA2-%CzM{4N+4OH=@<+hL&A|TmPFi_;{Jc&5zsiSI}S(2W0k(}Z-7Un z(*yB1q9xi2ELk)j$H1bgR16V~v%*?hk+1<)7{)&r9!cr&7y!@e-vN(?C1L_Bu)rHF zsK9!bz=Tw~WdNE%AOr*kGI02Sz<__$dSkoD|KOUIXe{CPtND`!t<9AIZDKiEoBy{3 zJ5Deu0s_Y#Zv&AP1Zwlok@}OzD`Von@c6V*{0nCQtpA$iPwDqBb^WETKc#^`Mf{g{ z{iUuyrGY<1{FitA)6}K&+r2)64N~+Na3>$^?T`(g184+nTyGB^rGd}cvdrV4MLW!C zCl`XumMV)%>?KMxXw-~!c5%?`(9nfQs@l3q?cje%7S8r--D4X>X_Q@awl1vTuPmRd zvwO#l8;f*mmWp=cx1C$8_vYaDKa`_q%*~u}iKr(un(=VS1&6M7-EW=B%hz_id#9&; zV_lB!mKSv&HW-E-z01`S#}9RzmBkbvd?>TkJyuy((mXWOJ)~I1N3GFSU#qK*z4(AW zU$99~kl(4Deu6^IJ-yK!d!gpR5Q<0Jx<6y1dH%tMTdYn8>nplhODOm5-MvC6IbX4U zk&v7deKz69a40cr)%A6L1czJuO+R=%GdXxPQlrTKaaPBTh9mPR#=*^=>LIzCuGdzv z^XB!L)C|q2TJi22=x?vC_xXvwT9dzSfzEcR&v%)2$0X}z20|WOyWlc(q2~JzYl^vF zZC?NRBq+9k&$;vFxwKFmto16YsdtfBy*qKVoV$r}CjO>avp4z8$C9k9o2`EFYEf%g zrj>Y??~eUSPG}(Zhj_pBwQGB5XHfX{i4!_5)ms{#O7y4rNgOIhdReWT8t#Za&X$y3 z+POnSZy9Q%-YHFNBn&V_74cQK6N_6qrE+i2I(r=JX58TN{Rvi4-W_Gxvi-esRsS>B zDtH%-?J1I`y$7iC%(}Td+M|rlr3I#FDqi%24P%4^o7`fxh{`` zei-#m+`g0klf6Fp_V#WK(Q}3Bs@ssKak(3Bu32|YEn*v`N&x!4DF`$Sdh_e7TXVP4 zIu`xyQf}vwQt!N{hkw@XoCS>RKd9w){OpgKi9_XgS*_D*zs{YJIAw)6H;TJEtbJO{ zj14c=-~C0Tmd(Q6(RuUL>TiF{n^{17Iz3;KncEr5Syi_|NOy~TDTUZqs)N*MsjVx$ zghutZRj+0iW^62|cz9hjKYxa?^r9Y1-G?r4Sz4t+jlLV*T?#oT&QGN2Ek8d!OC#&1 x)84z!2CTVR)rCj+SNi)?*Q$-{2QK$dTskm!za3`2@&TN)!)E*3b$|QzzW|1*J<9+9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..553d9e2f64723d236c10d8feeb56c23836529b00 GIT binary patch literal 9782 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 LZBvHT-ot+bfr+RI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..19b5dc75afffdae7d345415572ef0d33fb92b869 GIT binary patch literal 10959 zcmeHNcU)7+_P_LE0TmS$0Z|tO11Xdw0#OkaT|ns~$c7XQEkHtz5WB0QtOc7E8!XUZX*M$>;i6P}liPBOZg2kc4J|Ydk1uP*(xhbWmtVrsgUF z_1B=tPktv>LC{Wc_vO0D%6gk7S|5ef$6&#DB-#*syve9ZIm`JQ3@B=qM7LdHGtemWjyquhzf`Yu_OqE$PXUv$nXzn~Em8FX{)R!(+ zQ`20budS)IdbygKj>)RkNR*+Wp@ufj42w3^#~7l;Oe7Q(6lTttsXA+xDtejPGW4JR zzz?B0@?x2!B(xyOITBKHB;coz29Q%mV)8Qu1>8$YNz2H}$tx(%00cS8Voga&N=wPe zNK1p>NYD>S&yktC47E;n-gcs#R-g)c->D?|-kX4N9>R}z06KSbM_GUg%_F+?RW zv@7K|!bi@8+;~mnp(A|G1p!a*Wl3L8Iitr+x7{vyW$FA7>n+D-T->?*WQB&HXqF5jrS)~G@1EB0(gJPaLj$V#?+ZT?#u45f58-`Gm$I_K)$VAidt3$dl^mRb8V4f&}(9abWx{B!X&o zJlj*(>4Y95-|gM?43m&VO5I>jW5S#C>Q_t|mF;W46{q4uNo>E!WTEzpfqO6{+tp^? zQjv8T=WsgODa9r*Rh{M=!8us45{Be+8wizAmHf+z1Eti){KE36k#@Jkrvg8O^YpvA zdt+QXh7IQW4sd?M09BOQrsf2U2N(C6d>rZ>&YD=Mcs6hj|5z>O1EVFQB6D53K7Y6; z|5C)Sal&gKqXeY`gA=&&z}{}R;Ab5ENnRpoXuyFbPcKxw&r@NSrcNlq5GAW1YO%h4 zI&ZK}4Xd`{eynz`Euzlm@e_f^D`9W!N787h7j8s7w#v;dd`Xmh9e0mIbxj8h&BJ_v zp{L0L9x!{L#CwOd51&XYxlq{H{fUCV^>iyQPIsrCN7aW3DHuX23A|wFj+#T@3fhxY*?9(ROQ{CK!M^a~7al#`KoGn$HQN*uCH2+r8ZjT0!-N3d7_GEG% z<>R<{Lm8ta%+A)-|&HH#^AuFqGhim8q z9^afh#9mXz?e8uoNOkUrWec{7F0fm8LhqiEZLwDCt`DwcWxQ!A?N`3GDAnAl+skKU z)>hGuC_=^UEPc}x9R04gBHivXZoTourI5BFA8otH1m{KN>}!4pQgt1cFZxtF7C+i? zD&yy~?fI$n7mL*;VCei2;T;&N%Q)CiKgelbAkY}6*GE-yL_2(ef8Xae3H9ht9&q0j zRSHfB_%Ni7iWabHQjhy`npX)ldd!g9hp z521HcpLv?_5|HujSb|sFgiEmri&eWRH`_HO-2FqgUv!Iw(iVfuu4bWQ>T$q8&L>D z3UWd`41KT_vvo|+SVBUKsq$~8nWtP+N%Ry_lTK&YxTm|y`T zbq|YXWvV;e;AAh4o3-EJ+N;L8Pv^h}>f=om zvL6yMf2!h-Xm~Xa_&1&$&Ajf&cT^E9a!T#~shQK2r)xhQeUYEUq_}4ZV+)>fVzBE=K`O5cXs#HWBoA> zU$pu6b;_!A8&AYEm~xwZ>tdSA8Hs)Av1WxObt8K&<&uh4Wg{uTx&9#8$>4zw`cOuM z|0!Wos|e%@busV2aJF~-Wo*p8c7v~7N@zN5FX)g ziWBfm%D8>q#i*W0p9@8|1R8OIGQr>kwiqQcG6JdLeM(+?RrLF73zO`Q>D)N+hxu&g zn>WHcuY|2-=Rs5lJAvZr-=%WQngts5BCp;(*?JmJCb#8Gnq90_PzeJcyIlUh)hEwy z>D#w#%(ugJ6Q3O`fFVp2`+#b(nXn_Zj@=;CO}7J?9O9YcvB1{juZw>tv|Vamo?s*I zjQ`t_vUM(;}oWW*!KAz!|TFtJ}tbNHgMJ-W%BNb|REBD@W-jn
public static readonly CVarDef PsionicRollsEnabled = CVarDef.Create("psionics.rolls_enabled", true, CVar.SERVERONLY); + + /// + /// Enables station goals + /// + public static readonly CVarDef StationGoalsEnabled = + CVarDef.Create("game.station_goals", true, CVar.SERVERONLY); + + /// + /// Chance for a station goal to be sent + /// + public static readonly CVarDef StationGoalsChance = + CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); } } diff --git a/Resources/Locale/en-US/station-goal/station-goal-command.ftl b/Resources/Locale/en-US/station-goal/station-goal-command.ftl new file mode 100644 index 00000000000..82ed4d5c8a7 --- /dev/null +++ b/Resources/Locale/en-US/station-goal/station-goal-command.ftl @@ -0,0 +1,6 @@ +send-station-goal-command-description = Sends the selected station target to all faxes that can receive it +send-station-goal-command-help-text = Usage: { $command } +send-station-goal-command-arg-id = Goal Prototype ID + +send-station-goal-command-error-no-goal-proto = No station goal found with ID {$id} +send-station-goal-command-error-couldnt-fax = Couldn't send station goal, probably due to a lack of fax machines that are able to recieve it diff --git a/Resources/Locale/en-US/station-goal/station-goals.ftl b/Resources/Locale/en-US/station-goal/station-goals.ftl new file mode 100644 index 00000000000..f98190fa3c4 --- /dev/null +++ b/Resources/Locale/en-US/station-goal/station-goals.ftl @@ -0,0 +1,224 @@ +station-goal-fax-paper-name = Station Goal + +station-goal-fax-paper-header = + ███╗░░██╗████████╗ + ████╗░██║╚══██╔══╝ Form NT-No.{$station}-CC + ██╔██╗██║░░░██║░░░ Target Order + ██║╚████║░░░██║░░░ Date: {$date} + ██║░╚███║░░░██║░░░ Signed: CCO-{$name} + ╚═╝░░╚══╝░░░╚═╝░░░ + ════════════════════════════════════════ + {$content} + ════════════════════════════════════════ + + +station-goal-xeno= + Dear Station Command, the purpose of your shift is to build a Xenobiology Lab and then study exotic life forms. + Two containment chambers must be constructed according to the following requirements: + 1. Must be well reinforced; + 2. At least one of the chambers must be equipped with a gas supply system; + 3. The entrance should be a cycling airlock system to prevent contamination. + + Get the Salvage Team to capture at least 2 representatives of life forms (e.g. space carp) and transport them to the above-described chambers. + + Capture requirements: + 1. Exotic fauna should not have critical injuries at the time of placement in the research department; + 2. When captured fauna dies, you are required to catch another, cloning is strictly prohibited. + + Once you collect the required fauna, you must study them and write a report on their properties. + The report must be stamped by the head of the department and faxed to Central Command. + + Experience Requirements: + 1. Experience should be documented in detail; + 2. Test activities may include: working with gases, smoke, foam, or injecting experimental reagents (e.g. Cognizine) into captured fauna. + +station-goal-museum= + Dear Command of the station, the purpose of your shift is to build a museum, the exhibits for which will be unique objects collected from the station. + + Below are the requirements for the design of the museum: + 1. The museum must be structurally connected to the station by a space-protected corridor, or be located within it; + 2. The premises must be of a size that allows them to easily receive a large number of visitors; + 3. The premises must be provided with a standard atmosphere, ventilation and stable power supply; + 4. Room decoration should be visually pleasing; + 5. Exhibits must be reinforced accordingly to what is contained in them. + + Exhibit requirements: + 1. Exhibits must be unique in their kind; + 2. Each department must provide at least 2 exhibits for the museum fund; + 3. The total number of exhibits must be at least 20. + + Exhibits may include: + 1. Exotic drinks and dishes that require an extraordinary method of production and/or non-standard ingredients; + 2. Exotic matter/substance; + 3. Works of art (e.g. statues, paintings); + 4. Fully studied and documented artifacts (optionally provide a copy of the document); + 5. High-tech devices or tools; + 6. High-tech or high-power weapons; + 7. Robotic entities (e.g. Mechs, Cyborgs, Drones); + 8. Mutated biological organisms; + 9. Domesticated wild animals or intelligent non-humanoid life forms; + 10. Found treasures or items not available on the market. + + Upon completion of the museum, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the museum. + +station-goal-area= + Dear Station Command, the goal of your shift is to increase the effective use of space at the station. + + It is required to bring the abandoned premises into proper form and find a use for them. + Each department must equip and effectively use the area of adjacent maintenance tunnels. + Sufficiently spacious maintenance tunnels need to be converted into residential areas. + The remaining tunnels should be provided with floor coverings and adequate lighting. + In addition, it is necessary to provide a public, well-lit corridor connecting all the restored compartments and new bedrooms. + +station-goal-bureaucraticerror = + ACCESS TO THIS DOCUMENT IS PROHIBITED FOR PERSONS WHO DO NOT HAVE LEGAL IMMUNITY + + Dear Station Command, we inform you that the purpose of your shift was lost as a result of a bureaucratic error. + With this news, Central Command gives you the opportunity to independently assign a new goal for the station. + + New goal requirements: + 1. Relevance: The goal must be relevant and relevant to the current situation; + 2. Engagement: The goal should require the cooperation of as many departments as possible in the plans; + 3. Scope: The goal should involve sufficient, but not excessive, amounts of work to ensure the effective completion of the task. + + Please note that distribution of the contents of this document to persons who do not have legal immunity is strictly prohibited due to the possibility of discrediting the management of the Corporation. + Therefore, in order to present a new goal to the crew, the command staff must contact Central Command for approval of your ideas. + +station-goal-anomalies= + Dear Station Command, the purpose of your shift is to provide new information about anomalies to NanoTrasen. + + It is necessary to conduct experimental studies aimed at testing the consequences of the collapse of at least 4 unique anomalies. + During or after the experiments, it is necessary to isolate and document the aforementioned anomalies. + + Document requirements: + 1. The official name of the anomaly; + 2. Physical description; + 3. Passive properties; + 4. Reaction of the anomaly to different particles; + 5. Consequences of the collapse; + 6. Location of the anomaly. + + The document must be certified by the stamp of the supervisor and faxed to Central Command. + +station-goal-combat= + Dear station Command, due to the increase in attacks of pirate ships in this sector, the purpose of your shift is to raise the overall combat readiness of the station. + + Required: + 1. Organize an inspection of every sentient being and cargo arriving at or leaving the station. + 2. Build or modify an existing security checkpoint at arrivals and departures. The checkpoint must be able to completely block the ports from the main part of the station. + Each of the above checkpoints must have at least one cell for the temporary detention of detainees. + 3. Organize a spare weapons storage in the opposite part of the station from the brig. + The vault arsenal should have enough weapons and equipment to fully equip all security personnel. + 4. Organize the recruitment of a new combat subdepartment of security. + Squad members must be recruited from the station's crew. + Recruitment should be carried out on a voluntary-compulsory basis. + Composition of the squad: + 1 Field Medic; + 1 Field Engineer; + 3 Combat Operatives. + All members of the squad must be trained in all the necessary skills to conduct combat and fulfill their role. + 5. Open a public shooting range. + The shooting range should present all available types of weapons or their training counterparts. + Avoid providing lethal weaponry to unauthorized personnel. + 6. Encourage the use of the station boxing ring. + If there is no boxing ring, you must create one. + +station-goal-shuttle= + Dear Station Command, the purpose of your shift is to build a space shuttle capable of being piloted. + + Shuttle requirements: + 1. The shuttle must have a locked bridge; + a medical room with the necessary medical supplies and chemical equipment; + a supply store surrounded by reinforced material; + a crew room with at least 12 seats. + 2. There must be an intermediate room between the docking airlock and the main rooms to prevent possible depressurization. + 3. The shuttle must have a standard atmosphere, and also have several air gas containers to maintain it. + 4. The shuttle must be able to move in all directions (forward, backward, sideways) and turn reasonably well. + + Upon completion, the shuttle crew must be recruited from the station personnel. + The shuttle crew must include: + 1 pilot; + 2 engineers; + 1 medic/chemist; + 1 security officer. + + The shuttle should take on board all the station Command representatives as passengers and, in parallel with the evacuation shuttle, go to the Central Command station. + +station-goal-singularity= + Dear station Command, the goal of your shift is to build a generator based on the gravitational singularity. + + The design requirements are: + 1. The structure must be located at a significant distance from the station. + 2. The structure must be protected from meteorites and space debris. + 3. The containment field must be able to prevent the loss of a class 3 singularity. + +station-goal-solarpanels= + Dear station Command, the purpose of your shift is to organize a backup power system. + + The following work is required: + 1. Build two new branches of solar panels. + 2. Allocate an area for a compartment with spare batteries. + This compartment should accommodate at least 3 fully charged SMES', which should not be connected to the main power system of the station unless needed. + +station-goal-artifacts= + Dear station Command, the purpose of your shift is to provide new information about alien artifacts to NanoTrasen. + + It is required to organize the work of salvagers to search for and deliver artifacts from the wreckage around the station or expeditions. + After the delivery of the artifacts, they must be transferred to a special container to the research department. + It is necessary to deliver at least 2 fully studied and documented artifacts on the evacuation shuttle in special containment units. + + Recommended information for the document: + 1. Name of the artifact. + 2. Physical description. + 3. Properties of the object. + 4. Location of where the artifact was found. + 5. Additional notes. + + The document must be certified by the stamp of the supervisor. + +station-goal-storage= + Dear station Command, the purpose of your shift is to build an orbital storage facility with supplies and technology. + + The storage should be placed in space separately from the main station, make sure its design is strong, a random meteorite should not damage it. + + 4 boxes must be placed in the storage containing the following respectively: + - Advanced medicines; + - Stocks of the best seeds; + - Refrigerator box of food with a high nutritional value; + - Valuable, but not unique boards. + + Monitor the safety of the contents in the storage until the end of the shift, a cleanup crew will come retrieve the contents as they prepare the station. + +station-goal-zoo= + Dear station Command, the purpose of your shift is to improve the recreational value of the personnel at the station. + + It is necessary to build a zoo with at least 5 enclosures containing different types of animals ordered from the supply department. + Provide animals with food, at least one cleaning robot in each enclosure, and everything necessary for life, depending on the type of animal. + It is also necessary to build a bathhouse for the animals, water vapor must be supplied by Atmospheric Technicians. + + Upon completion of the zoo, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the new zoo. + +station-goal-labor= + Dear station Command, the purpose of your shift is to increase the motivation of the personnel for the growth of labor productivity. + + This requires that each of the heads during the shift closely monitors the performance of the duties of their employees and evaluates them. + After the time set by Command for evaluation, in each of the departments, the best, in the opinion of the head, employee should be selected, who will be invited to a dinner, where the Command staff will be obliged to award them a medal and a prize. + The heads must provide a report indicating the employee's position and merits for the shift. + Drinks and meals should be prepared for the dinner, as well as, if possible, several entertainment events that allow the presence of actors and musicians. + For the duration of the celebration, the dining room or other place chosen for the event must be inaccessible to the rest of the crew. + + The duration of the shift for a more accurate assessment of the work of the personnel should be set by the Command staff. + After the dinner someone must announce the end of the shift and call the evacuation shuttle. + +station-goal-lectures= + Dear station Command, the purpose of your shift is to carry out a number of events within the framework of the Corporation's plan to increase the knowledge of its employees. + + The Command staff are instructed to organize a platform for public lectures, if none exists, create one nearby the bridge entry. + The venue should be equipped with a large enough stage for speakers in the middle, a podium for the presenter to one side of it, plenty of seating for guests, and a special counter/table for brochures at the entrance. + A host/organizer of the event must also be selected. + Each department is required to present a group of employees consisting of at least 2 people. + Selected employees, under the supervision of the head of the department, should prepare a short lecture/presentation on a specific topic within their specialization (e.g. the harm of drugs and their reason for their criminalization, the effect of smoking on the body, acting, product pricing, cooking etc.), preferably with demonstration materials, and at least 10 brochures, on which the abstracts of the lecture should be indicated. + At the time indicated by the Command staff, the crew must be assembled on the site for the event, where lectures will be read. + There may be breaks between lectures to allow guests to read brochures and catch their breath. + + After the end of the event someone must announce the end of the shift and call the evacuation shuttle. diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml index 9118692a082..4f65046ce9c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml @@ -117,7 +117,7 @@ - !type:SimpleColoring sprites: - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi - state: finch_tail + state: finch_tail - type: marking id: HarpyWing2ToneClassic diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 58457ebb7fa..c1a5d9a1bfd 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -255,6 +255,19 @@ components: - type: NukeCodePaper +- type: entity + parent: Paper + id: StationGoalPaper + name: station goal + description: It looks like you have a lot of work to do. + components: + - type: Paper + stampState: paper_stamp-centcom + stampedBy: + - stampedName: stamp-component-stamped-name-centcom + stampedColor: "#bb3232" + + - type: entity name: pen parent: BaseItem diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml index af15034257b..cd4a22b7909 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml @@ -108,5 +108,7 @@ - type: FaxMachine name: "Captain's Office" receiveNukeCodes: true + receiveStationGoal: true - type: StealTarget stealGroup: FaxMachineCaptain + diff --git a/Resources/Prototypes/Objectives/goals.yml b/Resources/Prototypes/Objectives/goals.yml new file mode 100644 index 00000000000..59e35ea8a51 --- /dev/null +++ b/Resources/Prototypes/Objectives/goals.yml @@ -0,0 +1,87 @@ +- type: stationGoal + id: Area + +- type: stationGoal + id: Anomalies + +- type: stationGoal + id: Artifacts + +- type: stationGoal + id: BureaucraticError + +- type: stationGoal + id: Combat + +- type: stationGoal + id: Labor + +- type: stationGoal + id: Lectures + +- type: stationGoal + id: Museum + +- type: stationGoal + id: Shuttle + +- type: stationGoal + id: Singularity + +- type: stationGoal + id: SolarPanels + +- type: stationGoal + id: Storage + +- type: stationGoal + id: Xeno + +- type: stationGoal + id: Zoo + + +- type: weightedRandom + id: StationGoals + weights: + StationGoalDepartment: 1 + StationGoalPower: 1 + StationGoalStation: 1 + + +- type: weightedRandom + id: StationGoalDepartment + weights: + StationGoalScience: 1 + StationGoalSecurity: 1 + + +- type: weightedRandom + id: StationGoalPower + weights: + Singularity: 1 + SolarPanels: 1 + +- type: weightedRandom + id: StationGoalScience + weights: + Anomalies: 1 + Artifacts: 1 + Xeno: 1 + +- type: weightedRandom + id: StationGoalSecurity + weights: + Combat: 1 + +- type: weightedRandom + id: StationGoalStation + weights: + Area: 1 + BureaucraticError: 1 + Labor: 1 + Lectures: 1 + Museum: 1 + Shuttle: 1 + Storage: 1 + Zoo: 1 From 70badaafe1c3d70c995b06f3983d8b780919b6ee Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 17 Jun 2024 21:42:34 +0000 Subject: [PATCH 57/79] Automatic Changelog Update (#465) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7fcb7aac227..c98ba4bf4ca 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4184,3 +4184,11 @@ Entries: message: Moths have way better control in zero gravity environments id: 6122 time: '2024-06-17T07:58:34.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Added station goals that get sent to the Command fax machine at the + start of every shift + id: 6123 + time: '2024-06-17T21:42:13.0000000+00:00' From d1cae9a4394ce0f4281c8c86feea21561c6d44d1 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 20 Jun 2024 18:07:28 -0400 Subject: [PATCH 58/79] Harpy Peacock Tail (#428) Courtesy of @StillIcarus This adds a new Peacock tail marking to Harpies. I'm also taking this time to update them to the recent DeltaV changes to the birbs. ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/4f776006-700e-4d92-802c-03e6dd201491) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/5fd143ab-069f-4d1c-b5e0-ee982a95b4b6) The backside is semi cursed, but that's something I can't do within the scope of this PR due to sprite system limitations that Death has planned improvements for. Just ignore them. :) Have a birb as consolation. ![faridaiscute](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/09373a57-f32f-48eb-b52b-6d12143f62ff) :cl: VMSolidus - add: Peacock Tails have been added for Harpies --------- Signed-off-by: VMSolidus Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Locale/en-US/deltav/markings/harpy.ftl | 4 ++ .../Mobs/Customization/Markings/harpy.yml | 64 +++++++++++------- .../DeltaV/Entities/Mobs/Species/harpy.yml | 22 ++++-- .../digitigrade_inventory_template.yml | 7 -- .../Harpy/harpy_chest.rsi/lower.png | Bin .../Harpy/harpy_chest.rsi/meta.json | 0 .../Harpy/harpy_chest.rsi/upper.png | Bin .../harpy_ears.rsi/harpy_ears_default.png | Bin .../Harpy/harpy_ears.rsi/meta.json | 0 .../Harpy/harpy_legs.rsi/feet.png | Bin .../Harpy/harpy_legs.rsi/meta.json | 0 .../Harpy/harpy_legs.rsi/talons.png | Bin .../Harpy/harpy_legs.rsi/thighs.png | Bin .../Harpy/harpy_tails.rsi/meta.json | 0 .../Harpy/harpy_tails.rsi/phoenix_tail.png | Bin .../Harpy/harpy_tails.rsi/rooster_tail.png | Bin .../harpy_tails36x36.rsi}/finch_tail.png | Bin .../Harpy/harpy_tails36x36.rsi}/meta.json | 0 .../Harpy/harpy_tails48x48.rsi/meta.json | 19 ++++++ .../peacock_tail_eyes.png | Bin 0 -> 772 bytes .../peacock_tail_feathers.png | Bin 0 -> 1669 bytes .../Customization/Harpy/harpy_wingcover.png | Bin .../Harpy/harpy_wings.rsi/classicharpy.png | Bin .../Harpy/harpy_wings.rsi/harpy.png | Bin .../Harpy/harpy_wings.rsi/harpy2tone1.png | Bin .../Harpy/harpy_wings.rsi/harpy2tone2.png | Bin .../Harpy/harpy_wings.rsi/harpy3tone1.png | Bin .../Harpy/harpy_wings.rsi/harpy3tone2.png | Bin .../Harpy/harpy_wings.rsi/harpy3tone3.png | Bin .../Harpy/harpy_wings.rsi/harpyfolded.png | Bin .../Harpy/harpy_wings.rsi/harpyspeckled1.png | Bin .../Harpy/harpy_wings.rsi/harpyspeckled2.png | Bin .../Harpy/harpy_wings.rsi/harpyundertone1.png | Bin .../Harpy/harpy_wings.rsi/harpyundertone2.png | Bin .../Harpy/harpy_wings.rsi/harpywingtip1.png | Bin .../Harpy/harpy_wings.rsi/harpywingtip2.png | Bin .../Harpy/harpy_wings.rsi/meta.json | 0 37 files changed, 81 insertions(+), 35 deletions(-) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png (100%) rename Resources/Textures/{DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi => Mobs/Customization/Harpy/harpy_tails36x36.rsi}/finch_tail.png (100%) rename Resources/Textures/{DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi => Mobs/Customization/Harpy/harpy_tails36x36.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wingcover.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png (100%) rename Resources/Textures/{DeltaV => }/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json (100%) diff --git a/Resources/Locale/en-US/deltav/markings/harpy.ftl b/Resources/Locale/en-US/deltav/markings/harpy.ftl index 3c1a2e3b9b2..871f2f17290 100644 --- a/Resources/Locale/en-US/deltav/markings/harpy.ftl +++ b/Resources/Locale/en-US/deltav/markings/harpy.ftl @@ -40,6 +40,10 @@ marking-HarpyTailRooster-rooster_tail = Tail marking-HarpyTailFinch = Finch Tail marking-HarpyTailFinch-finch_tail = Tail +marking-HarpyTailPeacock = Peacock Tail +marking-HarpyTailPeacock-peacock_tail_feathers = Feathers +marking-HarpyTailPeacock-peacock_tail_eyes = Eyes + marking-HarpyChestDefault = Wing & Groin Under-Clothes marking-HarpyChestDefault-upper = Wing Under-Clothes marking-HarpyChestDefault-lower = Groin Under-Clothes diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml index 4f65046ce9c..bd1ad12a326 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml @@ -15,7 +15,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy - type: marking @@ -32,7 +32,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: classicharpy - type: marking @@ -49,7 +49,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyfolded - type: marking @@ -66,7 +66,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi + - sprite: Mobs/Customization/Harpy/harpy_ears.rsi state: harpy_ears_default - type: marking @@ -83,7 +83,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi state: phoenix_tail - type: marking @@ -99,7 +99,7 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi state: rooster_tail @@ -116,18 +116,36 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi + - sprite: Mobs/Customization/Harpy/harpy_tails36x36.rsi state: finch_tail +- type: marking + id: HarpyTailPeacock + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi + state: peacock_tail_feathers + - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi + state: peacock_tail_eyes + - type: marking id: HarpyWing2ToneClassic bodyPart: RArm markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone2 - type: marking @@ -136,11 +154,11 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone2 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone3 - type: marking @@ -149,9 +167,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled2 - type: marking @@ -160,9 +178,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone2 - type: marking @@ -171,9 +189,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip1 - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip2 - type: marking @@ -190,9 +208,9 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: Mobs/Customization/Harpy/harpy_chest.rsi state: upper - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: Mobs/Customization/Harpy/harpy_chest.rsi state: lower - type: marking @@ -209,7 +227,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: thighs - type: marking @@ -223,7 +241,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: feet - - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: Mobs/Customization/Harpy/harpy_legs.rsi state: talons diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index a4498299c9a..0ddce8b0e65 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -54,7 +54,6 @@ visible: false - map: [ "id" ] - map: [ "gloves" ] - - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] @@ -122,12 +121,25 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.5 baseSprintSpeed: 5.0 - - type: Inventory + - type: Inventory speciesId: harpy templateId: digitigrade - type: HarpyVisuals - type: UltraVision - + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - ShoesRequiredStepTriggerImmune + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon + - type: entity save: false name: Urist McHands @@ -138,8 +150,9 @@ components: - type: HumanoidAppearance species: Harpy - - type: Inventory + - type: Inventory speciesId: harpy + templateId: digitigrade - type: Sprite scale: 0.9, 0.9 layers: @@ -160,7 +173,6 @@ - map: ["enum.HumanoidVisualLayers.RHand"] - map: [ "id" ] - map: [ "gloves" ] - - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] diff --git a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml index 158541571aa..fc7dbda9321 100644 --- a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml +++ b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml @@ -1,13 +1,6 @@ - type: inventoryTemplate id: digitigrade slots: - - name: shoes - slotTexture: shoes - slotFlags: FEET - stripTime: 3 - uiWindowPos: 1,0 - strippingWindowPos: 1,3 - displayName: Shoes - name: jumpsuit slotTexture: uniform slotFlags: INNERCLOTHING diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json new file mode 100644 index 00000000000..2961db3707d --- /dev/null +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Peacock by stillxicarus (Discord)", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "peacock_tail_feathers", + "directions": 4 + }, + { + "name": "peacock_tail_eyes", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..71af693afd78b3c3a6c81ca03fc2f9db5913e590 GIT binary patch literal 772 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!Wi-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gjyW_=LDtRW-hRc_J~f)7Q5xIl1%y|NjRL)R&hxZQ4}w>eVTrswZhYEkKI9 zB*-rqC<_G)UjB@qfWn*w9+AZi419+`m{C;2tAT-mDb&-&F(kwJ?aYg1hZQ*5k~e10 z{$Brpago!NU2e0xW%tk3W#hDWniRY{_rH<%g404TKGm}><1}Z=edpY|?DrC%?a|r+ ziTh6)CY;Y=;b(Y|{LP=f6PN*cE&-(I*n^FCEgYD{zpYy*y3!b(03e(!E zKL`01i1hql(XgD6?f9(?EOWQBzM3eNHgmzM_EX0vel@o(`2AOc=Uq`{@2{S%a=%h`o2b+9s8C>H zpx0*yEwdB-39}Z23B0Y`x5Z?^jjt+SxTNGfYPsrC93*qJxYysE%nl!b?@pzv*U&iA`jFQoxf?#_u}_@Wt{T0h^_`Kmq5-Qe-3bVZ$zPv?|c7GX8cfPYi| zF5rmun;0aqnJMW_X<*)qO$>Wd3>w3)UDTFXBJC*Z#k%g2a+7tPH~ z8~6Kli1^Msdz2|;NuW<-AJbu7wHyIefqy3r9y)gaUz_lS%i`Mur58n?E#mK{Sn_>b rcXDyRWMReq*qBB78xS7c@P5B*c|60ulNK9*sgA+Z)z4*}Q$iB}zuHxD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png new file mode 100644 index 0000000000000000000000000000000000000000..d56b093d6ca8a5584adf01c6e4e1d6aeca3c48ec GIT binary patch literal 1669 zcmV;027394P)Px#1ZP1_K>z@;j|==^1poj5Fi=cXMd|6tqoZ=bz<>Y$|LW?>va)pD-K~$0cTG)( zVPT1SdV#O6bBBj|V`GVTcY*)_02e%JDgXcg5Oh*bQ~&?}|NsC0|NsC0|NsC00N^8C z82|tP32;bRa{vGi!vFvd!vV){sAK>D1;R;0K~!i%?U;>{<0uS-L0}Aw9p3+K?-R!V z-t&wzTUT|J-kk(+TaAQJY)tvf_z2wMKNI*h;XfI&?fbj<V&TN zX92Zr#EV|h_8lr`n$Q*hBp{uBIBwy)yZ52;=Luc#j{?DkQhHCz_pSG@m>BbfF8Esk zbx;DIQOOb+3EH}Fykg-m6T0AU1ausF7fP!AR6@rs?aCP|f1c14erbGk6Vlyuz{Dr)qluDwijhP!vLFZkDj*VZtyaYi zETM=pm9iZwUwuFUvzigu*ZJ@Hi+~Nd8S^n;B*!Er9CejXVAMsXp14iOC=C|Lz2mR3 z#Z$?uyw`A3GX(`b!ZQTYXaB>P#@ z((^})b*SSjf3avpLhdhO-7}+85-ofiT_&UYgo4Q~l2;<+dSlH3*yX>bLG5lqk}xZ4GI|5E(?9K<)WWz!{6v zNvCx{bP0#;p`gxu?2@H*UZc}I<|@1 zH;mPvG`&7hL@i}ii!lAH#ut7QAh9Lt*y}ZUP_M`F_0l#~V86zVAG??GaXRIsU+`ZY z;~V}gkO^DrUJ_%j9#oYv$0)BZ5%9eOdp_J4_2Y^^3zR&J8j^fi18!k_INJX{e-UV? zQ(3U@UE!906!>*~1a9#WxWz}{79W9I{LcjTPY#c2{jSyu)K>e0tSWlK=&Th%D{73 z>&^l`pdfa71%C^J73>E+A5lyKJa4lwA?EV~){l`hFHwdUh}rb?Ik3cm_uH^$@Dn&a z^val$VJ{FmO(LXS8+iz$5>eBr(_F113h8(n7Q7>g53d?O0`DbGt+2wO9T2wpnqa!2 zZiTn@v+m&_QHBnK(@^`8&J@#SJx!~}e9thQMD@8EYx8UZ#dz{6>w#Es7q5cfLUej0 z7=%>xele^cI_2J*RK#*wPv4$FkM4q%l8l~lPWd%^ohQ>P{h;AsgL}M#} zLa#?*lv+o%eT*0!B_H#BKmVjH0@ZG>#pIn*p`}c#M4TO%1=Kk%^nG7Mo+?CcttLvp z26`6Y>Okn&Z{F7-nYH*8|ok5T^=iMCu={%a5Dy4XTnavu>e%1H$aYHq;)Fx9{dG-1a9#WxWz}{2BrK1WWU*nv@q8v P00000NkvXXu0mjfjI1Qj literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json similarity index 100% rename from Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json rename to Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json From 90bca5a1ab63e8e3597d882a66fc376ce7fad521 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 20 Jun 2024 22:07:52 +0000 Subject: [PATCH 59/79] Automatic Changelog Update (#428) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c98ba4bf4ca..ee5a9acb87a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4192,3 +4192,9 @@ Entries: start of every shift id: 6123 time: '2024-06-17T21:42:13.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Peacock Tails have been added for Harpies + id: 6124 + time: '2024-06-20T22:07:29.0000000+00:00' From af3a9633d9279128bb0409169ade8e83c4129a19 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 20 Jun 2024 18:17:02 -0400 Subject: [PATCH 60/79] Port Randomly Fire Dropped Weapons (#471) # Description Ports https://github.com/Simple-Station/Parkstation-Friendly-Chainsaw/pull/19 I have added a new stat for firearms, the "Reliability" stat, which is a number between 0 and 1. It's used as a percentage chance for the weapon to fire itself when violently thrown into anyone. This PR differs from the original one slightly in that to get it to actually work without crashing, I set the system to listen to an event that triggers whenever the gun collides with another entity, not necessarily just the floor. This is the same event responsible for the clown's cream pie system, or for glass shards embedding in an entity. # Changelog :cl: - add: NanoTrasen has disabled the unneeded safeties on your guns- Make sure you're careful with them! - tweak: All Firearms now have a reliability stat, some are more reliable than others. The more reliable a weapon is, the less likely it is to accidentally discharge when yeeted. --- .../Ranged/Systems/FireOnDropSystem.cs | 27 +++++++++++++++++++ .../Weapons/Ranged/Components/GunComponent.cs | 6 +++++ .../Objects/Weapons/Guns/Basic/base_pka.yml | 1 + .../Weapons/Guns/Battery/battery_guns.yml | 1 + .../Objects/Weapons/Guns/Pistols/pistols.yml | 14 +++++++++- .../Weapons/Guns/Revolvers/revolvers.yml | 3 +++ .../Objects/Weapons/Guns/Rifles/rifles.yml | 2 ++ .../Objects/Weapons/Guns/SMGs/smgs.yml | 5 ++++ .../Weapons/Guns/Shotguns/shotguns.yml | 7 +++++ .../Objects/Weapons/Guns/Snipers/snipers.yml | 10 +++++++ 10 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs diff --git a/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs b/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs new file mode 100644 index 00000000000..a6112ad49cf --- /dev/null +++ b/Content.Server/Weapons/Ranged/Systems/FireOnDropSystem.cs @@ -0,0 +1,27 @@ +using Content.Shared.Throwing; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Random; + +namespace Content.Server.Weapons.Ranged.Systems; + +public sealed class FireOnDropSystem : EntitySystem +{ + [Dependency] private readonly SharedGunSystem _gun = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleLand); + } + + + private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args) + { + if (_random.Prob(component.FireOnDropChance)) + _gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec())); + } +} diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 0183a30a73b..a18aac80abe 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -229,6 +229,12 @@ public sealed partial class GunComponent : Component ///
[DataField] public bool ClumsyProof = false; + + /// + /// The percentage chance of a given gun to accidentally discharge if violently thrown into a wall or person + /// + [DataField] + public float FireOnDropChance = 0.1f; } [Flags] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml index f85e93b893f..93621bc3a28 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml @@ -22,6 +22,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg + fireOnDropChance: 1 - type: AmmoCounter - type: Appearance - type: GenericVisualizer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 202604b8bf0..bf0c51849a3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -18,6 +18,7 @@ selectedMode: SemiAuto availableModes: - SemiAuto + fireOnDropChance: 0.15 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg - type: Battery diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 16cacb79dfa..410664e46e4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -99,6 +99,15 @@ containers: gun_magazine: !type:ContainerSlot gun_chamber: !type:ContainerSlot + - type: Gun + fireRate: 6 + selectedMode: SemiAuto + availableModes: + - SemiAuto + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/pistol.ogg + fireOnDropChance: 0.3 - type: entity name: cobra @@ -125,6 +134,7 @@ volume: -14 availableModes: - SemiAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -169,6 +179,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg + fireOnDropChance: 0.5 - type: entity id: WeaponPistolMk58Nonlethal @@ -198,7 +209,7 @@ name: N1984 parent: BaseWeaponPistol id: WeaponPistolN1984 # the spaces in description are for formatting. - description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. + description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/N1984.rsi @@ -219,6 +230,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg + fireOnDropChance: 0.6 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml index bd043c997da..c5237cdad9a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml @@ -29,6 +29,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/revolver.ogg + fireOnDropChance: 0.5 - type: UseDelay delay: 0.66 - type: ContainerContainer @@ -127,6 +128,7 @@ path: /Audio/Weapons/Guns/Gunshots/revolver.ogg params: volume: 2.25 + fireOnDropChance: 0.3 - type: entity name: Python @@ -155,6 +157,7 @@ sprite: Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi - type: Gun fireRate: 1 + fireOnDropChance: 1 - type: ContainerContainer containers: revolver-ammo: !type:Container diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index 5bc8125ebaa..c55b2b6b091 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -67,6 +67,7 @@ fireRate: 5 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/rifle2.ogg + fireOnDropChance: 0.5 - type: ChamberMagazineAmmoProvider soundRack: path: /Audio/Weapons/Guns/Cock/ltrifle_cock.ogg @@ -159,6 +160,7 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/ltrifle.ogg + fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index b693bdba370..2dfc833badf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -72,6 +72,7 @@ fireRate: 10 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/atreides.ogg + fireOnDropChance: 0.3 - type: MagazineVisuals magState: mag steps: 1 @@ -96,6 +97,7 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/c-20r.ogg + fireOnDropChance: 0.3 - type: ChamberMagazineAmmoProvider autoEject: true - type: MagazineVisuals @@ -126,6 +128,7 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto + fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: @@ -173,6 +176,7 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -225,6 +229,7 @@ selectedMode: FullAuto availableModes: - FullAuto + fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index a8d9f539917..52b05b6d60b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -28,6 +28,7 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg + fireOnDropChance: 0.2 - type: BallisticAmmoProvider whitelist: tags: @@ -75,6 +76,7 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg + fireOnDropChance: 0.3 - type: ItemSlots slots: gun_magazine: @@ -115,6 +117,7 @@ heldPrefix: db - type: Gun fireRate: 2 + fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -190,6 +193,7 @@ heldPrefix: sawn - type: Gun fireRate: 4 + fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -226,6 +230,7 @@ sprite: Objects/Weapons/Guns/Shotguns/hm_pistol.rsi - type: Gun fireRate: 4 + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: Construction @@ -250,6 +255,7 @@ sprite: Objects/Weapons/Guns/Shotguns/blunderbuss.rsi - type: Gun fireRate: 2 + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: StaticPrice @@ -273,6 +279,7 @@ heldPrefix: improvised - type: Gun fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways. + fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 proto: null diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index c97459629cf..adb8e323f4a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -46,6 +46,14 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi + - type: Gun + fireRate: 0.75 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/sniper.ogg + fireOnDropChance: 1 - type: entity name: Hristov @@ -82,6 +90,7 @@ selectedMode: SemiAuto availableModes: - SemiAuto + fireOnDropChance: 1 - type: UseDelayOnShoot - type: UseDelay delay: 8 #it's a musket @@ -111,6 +120,7 @@ - type: Gun minAngle: 0 maxAngle: 30 #miss him entirely because the barrel is smoothbore + fireOnDropChance: 1 - type: Item size: Small storedRotation: 90 From 97f1960778c1289bcd2e6de0c9fd148d1c4b95ba Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 20 Jun 2024 22:17:23 +0000 Subject: [PATCH 61/79] Automatic Changelog Update (#471) --- Resources/Changelog/Changelog.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ee5a9acb87a..28f26a5cb00 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4198,3 +4198,16 @@ Entries: message: Peacock Tails have been added for Harpies id: 6124 time: '2024-06-20T22:07:29.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + NanoTrasen has disabled the unneeded safeties on your guns- Make sure + you're careful with them! + - type: Tweak + message: >- + All Firearms now have a reliability stat, some are more reliable than + others. The more reliable a weapon is, the less likely it is to + accidentally discharge when yeeted. + id: 6125 + time: '2024-06-20T22:17:03.0000000+00:00' From 21771608f47ee59cef7d6ae0cdb060ecec22e90b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 20 Jun 2024 18:24:30 -0400 Subject: [PATCH 62/79] Port Random Bark System (#466) # Description https://github.com/Simple-Station/Parkstation-Friendly-Chainsaw/pull/11 Later, I would like to have this system not just for animals, but for implementations of humanoid NPCs, since it can just as easily be used for human NPCs. I could make space bandits that CHEEKI BREEKI at people. # Changelog :cl: DEATHB4DEFEAT - add: Animals will no longer be a silent, soulless shell --------- Signed-off-by: VMSolidus Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Speech/Components/RandomBarkComponent.cs | 63 ++++++++++++++++++ .../Speech/Systems/RandomBarkSystem.cs | 47 ++++++++++++++ .../Prototypes/Entities/Mobs/NPCs/animals.yml | 65 +++++++++++++++++++ .../Prototypes/Entities/Mobs/NPCs/pets.yml | 4 ++ .../Entities/Mobs/NPCs/simplemob.yml | 1 + 5 files changed, 180 insertions(+) create mode 100644 Content.Server/Speech/Components/RandomBarkComponent.cs create mode 100644 Content.Server/Speech/Systems/RandomBarkSystem.cs diff --git a/Content.Server/Speech/Components/RandomBarkComponent.cs b/Content.Server/Speech/Components/RandomBarkComponent.cs new file mode 100644 index 00000000000..7229428f538 --- /dev/null +++ b/Content.Server/Speech/Components/RandomBarkComponent.cs @@ -0,0 +1,63 @@ +namespace Content.Server.Speech.Components; + +/// +/// Sends a random message from a list with a provided min/max time. +/// +[RegisterComponent] +public sealed partial class RandomBarkComponent : Component +{ + /// + /// Should the message be sent to the chat log? + /// + [DataField] + public bool ChatLog = false; + + /// + /// Minimum time an animal will go without speaking + /// + [DataField] + public int MinTime = 45; + + /// + /// Maximum time an animal will go without speaking + /// + [DataField] + public int MaxTime = 350; + + /// + /// Accumulator for counting time since the last bark + /// + [DataField] + public float BarkAccumulator = 8f; + + /// + /// Multiplier applied to the random time. Good for changing the frequency without having to specify exact values + /// + [DataField] + public float BarkMultiplier = 1f; + + /// + /// List of things to be said. Filled with garbage to be modified by an accent, but can be specified in the .yml + /// + [DataField] + public IReadOnlyList Barks = new[] + { + "Bark", + "Boof", + "Woofums", + "Rawrl", + "Eeeeeee", + "Barkums", + "Awooooooooooooooooooo awoo awoooo", + "Grrrrrrrrrrrrrrrrrr", + "Rarrwrarrwr", + "Goddamn I love gold fish crackers", + "Bork bork boof boof bork bork boof boof boof bork", + "Bark", + "Boof", + "Woofums", + "Rawrl", + "Eeeeeee", + "Barkums", + }; +} diff --git a/Content.Server/Speech/Systems/RandomBarkSystem.cs b/Content.Server/Speech/Systems/RandomBarkSystem.cs new file mode 100644 index 00000000000..4fc9dd420d2 --- /dev/null +++ b/Content.Server/Speech/Systems/RandomBarkSystem.cs @@ -0,0 +1,47 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Mind.Components; +using Robust.Shared.Random; +using Content.Server.Speech.Components; + +namespace Content.Server.Speech.Systems; + +public sealed class RandomBarkSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly EntityManager _entity = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + } + + + private void OnInit(EntityUid uid, RandomBarkComponent barker, ComponentInit args) + { + barker.BarkAccumulator = _random.NextFloat(barker.MinTime, barker.MaxTime) * barker.BarkMultiplier; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var barker)) + { + barker.BarkAccumulator -= frameTime; + if (barker.BarkAccumulator > 0) + continue; + + barker.BarkAccumulator = _random.NextFloat(barker.MinTime, barker.MaxTime) * barker.BarkMultiplier; + if (_entity.TryGetComponent(uid, out var actComp) && + actComp.HasMind) + continue; + + _chat.TrySendInGameICMessage(uid, _random.Pick(barker.Barks), InGameICChatType.Speak, barker.ChatLog ? ChatTransmitRange.Normal : ChatTransmitRange.HideChat); + } + } +} diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 378b3f8a9d8..93e19a829da 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -61,6 +61,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: bee @@ -129,6 +130,13 @@ - ReagentId: GroundBee Quantity: 5 - type: ZombieImmune + - type: RandomBark + barks: + - Bzzzzz + - Bzzz bzzz + - Bzzzzzzzzzzzz + - Bzz + barkMultiplier: 1.5 - type: entity name: bee @@ -236,6 +244,7 @@ - type: NpcFactionMember factions: - Passive + - type: RandomBark - type: entity parent: MobChicken @@ -608,6 +617,8 @@ - type: NpcFactionMember factions: - Passive + - type: RandomBark + barkMultiplier: 0.7 - type: entity name: white duck #Quack @@ -787,6 +798,16 @@ - type: GuideHelp guides: - Chef + - type: RandomBark + barks: + - Mooooooo + - Moo + - Huff + - Mooooooooooo + - Moooooo + - Moooo + barkMultiplier: 3 + - type: entity name: crab @@ -852,6 +873,12 @@ task: RuminantCompound - type: Body prototype: AnimalHemocyanin + - type: RandomBark + barks: + - click clack + - clack + - clickity clack + - clack clack - type: entity name: goat @@ -1446,6 +1473,8 @@ makeSentient: true name: ghost-role-information-kobold-name description: ghost-role-information-kobold-description + - type: RandomBark + barkMultiplier: 0.65 - type: entity name: guidebook monkey @@ -1605,6 +1634,8 @@ - type: BadFood - type: NonSpreaderZombie - type: PreventSpiller + - type: RandomBark + barkMultiplier: 0.3 - type: entity parent: MobMouse @@ -1840,6 +1871,18 @@ - type: Tag tags: - VimPilot + - type: RandomBark + barkMultiplier: 1.3 + barks: + - Croooaaaakkk + - Ribbit + - Ribbit + - Ribbit + - Crooaak + - Ribbit + - Ribbit + - Ribbit + - Bibbit # Would be cool to have some functionality for the parrot to be able to sit on stuff - type: entity @@ -1953,6 +1996,10 @@ heatDamage: types: Heat : 0.2 #per second, scales with temperature & other constants + - type: RandomBark + barks: + - Wank + barkMultiplier: 0.6 - type: entity name: grenade penguin @@ -2068,6 +2115,14 @@ - type: Damageable damageContainer: Biological damageModifierSet: Scale + - type: RandomBark + barkMultiplier: 1.5 + barks: + - Hsssssss + - Hss + - Hsssss + - Hisss + - Hshsss # Code unique spider prototypes or combine them all into one spider and get a # random sprite state when you spawn it. @@ -2192,6 +2247,7 @@ groups: Brute: -0.07 Burn: -0.07 + - type: RandomBark - type: entity name: tarantula @@ -2536,6 +2592,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: corrupted corgi @@ -2692,6 +2749,7 @@ - type: Tag tags: - VimPilot + - type: RandomBark - type: entity name: calico cat @@ -2880,6 +2938,10 @@ - type: Tag tags: - VimPilot + - type: RandomBark + barkMultiplier: 10 + barks: + - Sloth - type: entity name: ferret @@ -3076,6 +3138,8 @@ - type: MobPrice price: 60 - type: NonSpreaderZombie + - type: RandomBark + barkMultiplier: 0.45 - type: entity name: pig @@ -3236,3 +3300,4 @@ components: - type: ReplacementAccent accent: nymph + - type: RandomBark diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 9981bb8bd92..274765a1931 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -307,6 +307,8 @@ - VimPilot - type: StealTarget stealGroup: AnimalMcGriff + - type: RandomBark + barkMultiplier: 1.3 - type: entity name: Paperwork @@ -406,6 +408,8 @@ - VimPilot - type: StealTarget stealGroup: AnimalWalter + - type: RandomBark + barkMultiplier: 1.1 - type: entity name: Morty diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 12ea40b1e3c..8e84f46a693 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -104,3 +104,4 @@ - type: MobPrice price: 150 - type: FloatingVisuals + - type: Speech From a17fb083518d1c14dc0d985791a65013804521c9 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 20 Jun 2024 22:24:53 +0000 Subject: [PATCH 63/79] Automatic Changelog Update (#466) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 28f26a5cb00..d5adef7372a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4211,3 +4211,9 @@ Entries: accidentally discharge when yeeted. id: 6125 time: '2024-06-20T22:17:03.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Add + message: Animals will no longer be a silent, soulless shell + id: 6126 + time: '2024-06-20T22:24:30.0000000+00:00' From 80217d6bf495d026e17a4544f481b6559e199956 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:25:18 -0700 Subject: [PATCH 64/79] Mirror 26250: Make all implants unable to be implanted more than once (#445) ## Mirror of PR #26250: [Make all implants unable to be implanted more than once](https://github.com/space-wizards/space-station-14/pull/26250) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `771390bb6741074935e5f24c0aa9c87bc7b5ad09` PR opened by Simyon264 at 2024-03-19 00:44:21 UTC - merged at 2024-03-26 00:16:19 UTC --- PR changed 3 files with 28 additions and 0 deletions. The PR had the following labels: - Status: Needs Review ---

Original Body

> > > > ## About the PR > This PR makes mind shields unable to be implanted more than once. > ## Why / Balance > > PJB complained and people waste implants by injecting already injected people. > > ## Technical details > > Adds a new datafield to the Implanter component which is checked in implanter system. > > ## Media > > ![image](https://github.com/space-wizards/space-station-14/assets/63975668/4907ddb2-de2f-490c-a35d-07c4f3b6c79b) > > - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > N/A > > **Changelog** > > > :cl: Simyon > - tweak: All implants are now unable to be implanted more than once. >
Co-authored-by: SimpleStation14 --- Content.Server/Implants/ImplanterSystem.cs | 21 +++++++++++++++++++ .../Implants/Components/ImplanterComponent.cs | 6 ++++++ Resources/Locale/en-US/implant/implant.ftl | 1 + 3 files changed, 28 insertions(+) diff --git a/Content.Server/Implants/ImplanterSystem.cs b/Content.Server/Implants/ImplanterSystem.cs index 0d46241f414..3cfa3a9f5f8 100644 --- a/Content.Server/Implants/ImplanterSystem.cs +++ b/Content.Server/Implants/ImplanterSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Popups; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; @@ -57,6 +58,17 @@ private void OnImplanterAfterInteract(EntityUid uid, ImplanterComponent componen return; } + // Check if we are trying to implant a implant which is already implanted + if (implant.HasValue && !component.AllowMultipleImplants && CheckSameImplant(target, implant.Value)) + { + var name = Identity.Name(target, EntityManager, args.User); + var msg = Loc.GetString("implanter-component-implant-already", ("implant", implant), ("target", name)); + _popup.PopupEntity(msg, target, args.User); + args.Handled = true; + return; + } + + //Implant self instantly, otherwise try to inject the target. if (args.User == target) Implant(target, target, uid, component); @@ -67,6 +79,15 @@ private void OnImplanterAfterInteract(EntityUid uid, ImplanterComponent componen args.Handled = true; } + public bool CheckSameImplant(EntityUid target, EntityUid implant) + { + if (!TryComp(target, out var implanted)) + return false; + + var implantPrototype = Prototype(implant); + return implanted.ImplantContainer.ContainedEntities.Any(entity => Prototype(entity) == implantPrototype); + } + /// /// Attempt to implant someone else. /// diff --git a/Content.Shared/Implants/Components/ImplanterComponent.cs b/Content.Shared/Implants/Components/ImplanterComponent.cs index 32a36361633..80330aa7e66 100644 --- a/Content.Shared/Implants/Components/ImplanterComponent.cs +++ b/Content.Shared/Implants/Components/ImplanterComponent.cs @@ -70,6 +70,12 @@ public sealed partial class ImplanterComponent : Component [DataField] public (string, string) ImplantData; + /// + /// Determines if the same type of implant can be implanted into an entity multiple times. + /// + [DataField] + public bool AllowMultipleImplants = false; + /// /// The for this implanter /// diff --git a/Resources/Locale/en-US/implant/implant.ftl b/Resources/Locale/en-US/implant/implant.ftl index 22db4460aff..2f6ab9e4e2f 100644 --- a/Resources/Locale/en-US/implant/implant.ftl +++ b/Resources/Locale/en-US/implant/implant.ftl @@ -4,6 +4,7 @@ implanter-component-implanting-target = {$user} is trying to implant you with so implanter-component-implant-failed = The {$implant} cannot be given to {$target}! implanter-draw-failed-permanent = The {$implant} in {$target} is fused with them and cannot be removed! implanter-draw-failed = You tried to remove an implant but found nothing. +implanter-component-implant-already = {$target} already has the {$implant}! ## UI implanter-draw-text = Draw From 87084f898a101d22f9ae4d8260d257ef3870bb42 Mon Sep 17 00:00:00 2001 From: SimpleStation14 <130339894+SimpleStation14@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:26:05 -0700 Subject: [PATCH 65/79] Mirror: Bumps LoneOps minimum required players to 20 (#263) ## Mirror of PR #26244: [Bumps LoneOps minimum required players to 20](https://github.com/space-wizards/space-station-14/pull/26244) from space-wizards [space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14) ###### `61e31f4062b568591448ff5be83ba8be851269e9` PR opened by Boaz1111 at 2024-03-18 20:52:10 UTC --- PR changed 1 files with 1 additions and 1 deletions. The PR had the following labels: - No C# ---

Original Body

> > > > ## About the PR > > I bumped LoneOps minimum required players to 20 > ## Why / Balance > > It was at 10, and loneops are extremely dangerous especially if there's no sec. > ## Technical details > > > ## Media > > > - [X] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase > > ## Breaking changes > > > **Changelog** > > > > :cl: Boaz1111 > - tweak: Lone operatives now require a minimum of 20 players to spawn
Co-authored-by: SimpleStation14 --- Resources/Prototypes/GameRules/events.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 6812ca14f70..00ad5f54ea9 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -418,9 +418,9 @@ noSpawn: true components: - type: StationEvent - earliestStart: 60 # DeltaV - was 45 - weight: 3 # DeltaV - was 5 - minimumPlayers: 10 + earliestStart: 60 + weight: 3 + minimumPlayers: 20 reoccurrenceDelay: 30 duration: 1 - type: LoneOpsSpawnRule From ff9fe083dc4c5ad1518a08e19510d9278e78e3b9 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:39:30 -0700 Subject: [PATCH 66/79] Trait Points (#434) Some improvements to loadouts too. --- - [x] Points logic - [x] Server-side validation - [x] Categorize traits - [x] Assign points to traits - [x] Header costs - [x] Sort entries - [x] Max traits - [x] Communicate max traits - [x] Point bar - [x] Group exclusivity - Black outline on text - [x] Fix existing component whitelists ---

Media

![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/c0ab2fbf-3bce-4e54-81d5-8e546d6b3c0b) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/09a3948e-0c9f-4f57-b297-f62063b11845) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/35d76095-0714-4613-a17b-73df25a9a832) ![image](https://github.com/Simple-Station/Einstein-Engines/assets/77995199/87149e5c-0af2-4ac0-bbde-52f317a008a0)

--- :cl: - add: Added trait points - add: Added categories for traits --------- Co-authored-by: VMSolidus --- .../Preferences/UI/HumanoidProfileEditor.xaml | 21 +- .../UI/HumanoidProfileEditor.xaml.cs | 555 ++++++++++++++---- Content.Client/Traits/ParacusiaSystem.cs | 3 +- Content.Server/Flash/FlashSystem.cs | 2 +- .../Events/MassHallucinationsRule.cs | 2 +- .../Traits/Assorted/ParacusiaSystem.cs | 2 + Content.Server/Traits/TraitSystem.cs | 40 +- .../Zombies/ZombieSystem.Transform.cs | 2 +- Content.Shared/CCVar/CCVars.cs | 24 +- .../Prototypes/LoadoutCategoryPrototype.cs | 1 + .../Loadouts/Prototypes/LoadoutPrototype.cs | 6 +- .../Loadouts/Systems/LoadoutRequirements.cs | 376 ------------ .../Loadouts/Systems/LoadoutSystem.cs | 40 +- .../Systems/CharacterRequirements.cs | 529 +++++++++++++++++ .../Systems/CharacterRequirementsSystem.cs | 43 ++ Content.Shared/Drunk/DrunkSystem.cs | 2 +- .../Preferences/HumanoidCharacterProfile.cs | 53 +- .../{ => Components}/AccentlessComponent.cs | 2 +- .../LegsParalyzedComponent.cs | 5 +- .../LightweightDrunkComponent.cs | 4 +- .../{ => Components}/ParacusiaComponent.cs | 3 +- .../PermanentBlindnessComponent.cs | 2 +- .../Traits/Assorted/LegsParalyzedSystem.cs | 58 -- .../{ => Systems}/AccentlessSystem.cs | 8 +- .../Assorted/Systems/LegsParalyzedSystem.cs | 58 ++ .../{ => Systems}/PermanentBlindnessSystem.cs | 20 +- .../{ => Systems}/SharedParacusiaSystem.cs | 2 +- .../Prototypes/TraitCategoryPrototype.cs | 14 + .../Traits/Prototypes/TraitPrototype.cs | 39 ++ Content.Shared/Traits/TraitPrototype.cs | 55 -- .../customization/character-requirements.ftl | 39 ++ .../Locale/en-US/deltav/traits/traits.ftl | 16 +- .../Locale/en-US/loadouts/categories.ftl | 4 +- .../en-US/loadouts/loadout-requirements.ftl | 13 - .../ui/humanoid-profile-editor.ftl | 26 +- .../simplestation14/Traits/disabilities.ftl | 5 +- Resources/Locale/en-US/traits/categories.ftl | 8 + Resources/Locale/en-US/traits/traits.ftl | 43 +- .../Prototypes/DeltaV/Traits/altvision.yml | 8 +- .../Prototypes/DeltaV/Traits/neutral.yml | 7 +- .../Loadouts/Jobs/Heads/captain.yml | 26 +- .../Loadouts/Jobs/Heads/chiefEngineer.yml | 8 +- .../Jobs/Heads/chiefMedicalOfficer.yml | 12 +- .../Loadouts/Jobs/Heads/headOfPersonnel.yml | 18 +- .../Loadouts/Jobs/Heads/headOfSecurity.yml | 30 +- .../Loadouts/Jobs/Heads/quarterMaster.yml | 12 +- .../Loadouts/Jobs/Heads/researchDirector.yml | 10 +- Resources/Prototypes/Loadouts/Jobs/cargo.yml | 4 +- .../Prototypes/Loadouts/Jobs/engineering.yml | 36 +- .../Prototypes/Loadouts/Jobs/medical.yml | 46 +- .../Prototypes/Loadouts/Jobs/science.yml | 18 +- .../Prototypes/Loadouts/Jobs/security.yml | 26 +- .../Prototypes/Loadouts/Jobs/service.yml | 30 +- Resources/Prototypes/Loadouts/categories.yml | 6 +- Resources/Prototypes/Loadouts/uniform.yml | 2 +- .../SimpleStation14/Traits/disabilities.yml | 15 +- Resources/Prototypes/Traits/categories.yml | 19 + Resources/Prototypes/Traits/disabilities.yml | 76 ++- .../Prototypes/Traits/inconveniences.yml | 18 +- Resources/Prototypes/Traits/neutral.yml | 25 +- 60 files changed, 1627 insertions(+), 950 deletions(-) delete mode 100644 Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs create mode 100644 Content.Shared/Customization/Systems/CharacterRequirements.cs create mode 100644 Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs rename Content.Shared/Traits/Assorted/{ => Components}/AccentlessComponent.cs (89%) rename Content.Shared/Traits/Assorted/{ => Components}/LegsParalyzedComponent.cs (65%) rename Content.Shared/Traits/Assorted/{ => Components}/LightweightDrunkComponent.cs (90%) rename Content.Shared/Traits/Assorted/{ => Components}/ParacusiaComponent.cs (93%) rename Content.Shared/Traits/Assorted/{ => Components}/PermanentBlindnessComponent.cs (81%) delete mode 100644 Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs rename Content.Shared/Traits/Assorted/{ => Systems}/AccentlessSystem.cs (62%) create mode 100644 Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs rename Content.Shared/Traits/Assorted/{ => Systems}/PermanentBlindnessSystem.cs (59%) rename Content.Shared/Traits/Assorted/{ => Systems}/SharedParacusiaSystem.cs (56%) create mode 100644 Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs create mode 100644 Content.Shared/Traits/Prototypes/TraitPrototype.cs delete mode 100644 Content.Shared/Traits/TraitPrototype.cs create mode 100644 Resources/Locale/en-US/customization/character-requirements.ftl delete mode 100644 Resources/Locale/en-US/loadouts/loadout-requirements.ftl create mode 100644 Resources/Locale/en-US/traits/categories.ftl create mode 100644 Resources/Prototypes/Traits/categories.yml diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml index 9a70d678310..38d4a411ff3 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml @@ -142,18 +142,29 @@ - + - - - +
public static readonly CVarDef PsionicRollsEnabled = CVarDef.Create("psionics.rolls_enabled", true, CVar.SERVERONLY); - - /// - /// Enables station goals - /// - public static readonly CVarDef StationGoalsEnabled = - CVarDef.Create("game.station_goals", true, CVar.SERVERONLY); - - /// - /// Chance for a station goal to be sent - /// - public static readonly CVarDef StationGoalsChance = - CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); } } diff --git a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs index 445cbc10e6d..5dd880d3f1b 100644 --- a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs +++ b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutCategoryPrototype.cs @@ -2,7 +2,6 @@ namespace Content.Shared.Clothing.Loadouts.Prototypes; - /// /// A prototype defining a valid category for s to go into. /// diff --git a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs index 9ca575fa72e..bc31fc15701 100644 --- a/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs +++ b/Content.Shared/Clothing/Loadouts/Prototypes/LoadoutPrototype.cs @@ -1,12 +1,10 @@ using Content.Shared.Clothing.Loadouts.Systems; -using Content.Shared.Customization.Systems; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Clothing.Loadouts.Prototypes; - [Prototype("loadout")] public sealed class LoadoutPrototype : IPrototype { @@ -19,7 +17,7 @@ public sealed class LoadoutPrototype : IPrototype /// /// Which tab category to put this under /// - [DataField, ValidatePrototypeId] + [DataField(customTypeSerializer:typeof(PrototypeIdSerializer))] public string Category = "Uncategorized"; /// @@ -43,5 +41,5 @@ public sealed class LoadoutPrototype : IPrototype [DataField] - public List Requirements = new(); + public List Requirements = new(); } diff --git a/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs b/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs new file mode 100644 index 00000000000..422a5b15a46 --- /dev/null +++ b/Content.Shared/Clothing/Loadouts/Systems/LoadoutRequirements.cs @@ -0,0 +1,376 @@ +using System.Linq; +using Content.Shared.CCVar; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Players.PlayTimeTracking; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Roles.Jobs; +using Content.Shared.Traits; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Clothing.Loadouts.Systems; + +[ImplicitDataDefinitionForInheritors, MeansImplicitUse] +[Serializable, NetSerializable] +public abstract partial class LoadoutRequirement +{ + /// + /// If true valid requirements will be treated as invalid and vice versa + /// + [DataField] + public bool Inverted = false; + + /// + /// Checks if this loadout requirement is valid for the given parameters + /// + /// Description for the requirement, shown when not null + public abstract bool IsValid( + JobPrototype job, + HumanoidCharacterProfile profile, + Dictionary playTimes, + IEntityManager entityManager, + IPrototypeManager prototypeManager, + IConfigurationManager configManager, + out FormattedMessage? reason + ); +} + + +#region HumanoidCharacterProfile + +/// +/// Requires the profile to be within an age range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutAgeRequirement : LoadoutRequirement +{ + [DataField(required: true)] + public int Min; + + [DataField(required: true)] + public int Max; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-age-requirement", + ("min", Min), ("max", Max))); + return profile.Age >= Min && profile.Age <= Max; + } +} + +/// +/// Requires the profile to use either a Backpack, Satchel, or Duffelbag +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutBackpackTypeRequirement : LoadoutRequirement +{ + [DataField(required: true)] + public BackpackPreference Preference; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-backpack-type-requirement", + ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Backpack == Preference; + } +} + +/// +/// Requires the profile to use either Jumpsuits or Jumpskirts +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutClothingPreferenceRequirement : LoadoutRequirement +{ + [DataField(required: true)] + public ClothingPreference Preference; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-clothing-preference-requirement", + ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Clothing == Preference; + } +} + +/// +/// Requires the profile to be a certain species +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutSpeciesRequirement : LoadoutRequirement +{ + [DataField(required: true)] + public List> Species; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + var speciesString = string.Join(", ", Species.Select(j => Loc.GetString(prototypeManager.Index(j).Name))); + speciesString = Loc.GetString("loadout-species-requirement", ("species", speciesString)); + reason = FormattedMessage.FromMarkup(speciesString); + return Species.Contains(profile.Species); + } +} + +/// +/// Requires the profile to have a certain trait +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutTraitRequirement : LoadoutRequirement +{ + [DataField(required: true)] + public ProtoId Trait; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("loadout-trait-requirement", + ("trait", Loc.GetString($"trait-{Trait.ToString().ToLower()}-name")))); + return profile.TraitPreferences.Contains(Trait.ToString()); + } +} + +#endregion + +#region Jobs + +/// +/// Requires the selected job to be a certain one +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutJobRequirement : LoadoutRequirement +{ + [DataField(required: true)] + public List> Jobs; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + // Join localized job names with a comma + var jobsString = string.Join(", ", Jobs.Select(j => Loc.GetString(prototypeManager.Index(j).Name))); + // Form the reason message + jobsString = Loc.GetString("loadout-job-requirement", ("job", jobsString)); + + reason = FormattedMessage.FromMarkup(jobsString); + return Jobs.Contains(job.ID); + } +} + +/// +/// Requires the playtime for a department to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutDepartmentTimeRequirement : LoadoutRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Department; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + var department = prototypeManager.Index(Department); + + // Combine all of this department's job playtimes + var playtime = TimeSpan.Zero; + foreach (var other in department.Roles) + { + var proto = prototypeManager.Index(other).PlayTimeTracker; + + playTimes.TryGetValue(proto, out var otherTime); + playtime += otherTime; + } + + if (playtime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-department-too-high", + ("time", playtime.Minutes - Max.Minutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + if (playtime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-department-insufficient", + ("time", Min.Minutes - playtime.Minutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the player to have a certain amount of overall job time +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutOverallTimeRequirement : LoadoutRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get the overall time + var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); + + if (overallTime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-overall-too-high", + ("time", overallTime.Minutes - Max.Minutes))); + return false; + } + + if (overallTime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-overall-insufficient", + ("time", Min.Minutes - overallTime.Minutes))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the playtime for a tracker to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class LoadoutPlaytimeRequirement : LoadoutRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Tracker; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, + IConfigurationManager configManager, out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get SharedJobSystem + if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) + { + DebugTools.Assert("LoadoutRequirements: SharedJobSystem not found"); + reason = null; + return false; + } + + // Get the JobPrototype of the Tracker + var trackerJob = jobSystem.GetJobPrototype(Tracker); + + // Get the primary department of the Tracker + if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && + !jobSystem.TryGetDepartment(trackerJob, out department)) + { + DebugTools.Assert($"LoadoutRequirements: Department not found for job {trackerJob}"); + reason = null; + return false; + } + + // Get the time for the tracker + playTimes.TryGetValue(Tracker, out var time); + reason = null; + + if (time > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-role-too-high", + ("time", time.Minutes - Max.Minutes), + ("job", trackerJob), + ("departmentColor", department.Color))); + return false; + } + + if (time < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("loadout-timer-role-insufficient", + ("time", Min.Minutes - time.Minutes), + ("job", trackerJob), + ("departmentColor", department.Color))); + return false; + } + + return true; + } +} + +#endregion diff --git a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs index 09e3db3793f..eb9a5dcbc8c 100644 --- a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs +++ b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs @@ -1,6 +1,5 @@ using Content.Shared.Clothing.Components; using Content.Shared.Clothing.Loadouts.Prototypes; -using Content.Shared.Customization.Systems; using Content.Shared.Inventory; using Content.Shared.Preferences; using Content.Shared.Roles; @@ -18,8 +17,7 @@ public sealed class LoadoutSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly IConfigurationManager _configuration = default!; - [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; public override void Initialize() { @@ -68,9 +66,8 @@ public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, Hu continue; - if (!_characterRequirements.CheckRequirementsValid(loadoutProto, loadoutProto.Requirements, job, profile, - playTimes ?? new Dictionary(), - EntityManager, _prototype, _configuration, + if (!CheckRequirementsValid(loadoutProto.Requirements, job, profile, + playTimes ?? new Dictionary(), EntityManager, _prototype, _configurationManager, out _)) continue; @@ -118,4 +115,35 @@ public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, Hu // The server has more information about the inventory system than the client does and the client doesn't need to put loadouts in backpacks return failedLoadouts; } + + + public bool CheckRequirementsValid(List requirements, JobPrototype job, + HumanoidCharacterProfile profile, Dictionary playTimes, IEntityManager entityManager, + IPrototypeManager prototypeManager, IConfigurationManager configManager, out List reasons) + { + reasons = new List(); + var valid = true; + + foreach (var requirement in requirements) + { + // Set valid to false if the requirement is invalid and not inverted, if it's inverted set it to true when it's valid + if (!requirement.IsValid(job, profile, playTimes, entityManager, prototypeManager, configManager, out var reason)) + { + if (valid) + valid = requirement.Inverted; + } + else + { + if (valid) + valid = !requirement.Inverted; + } + + if (reason != null) + { + reasons.Add(reason); + } + } + + return valid; + } } diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.cs b/Content.Shared/Customization/Systems/CharacterRequirements.cs deleted file mode 100644 index b7200c60e85..00000000000 --- a/Content.Shared/Customization/Systems/CharacterRequirements.cs +++ /dev/null @@ -1,529 +0,0 @@ -using System.Linq; -using Content.Shared.CCVar; -using Content.Shared.Clothing.Loadouts.Prototypes; -using Content.Shared.Humanoid.Prototypes; -using Content.Shared.Players.PlayTimeTracking; -using Content.Shared.Preferences; -using Content.Shared.Roles; -using Content.Shared.Roles.Jobs; -using Content.Shared.Traits; -using JetBrains.Annotations; -using Robust.Shared.Configuration; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; - -namespace Content.Shared.Customization.Systems; - - -[ImplicitDataDefinitionForInheritors, MeansImplicitUse] -[Serializable, NetSerializable] -public abstract partial class CharacterRequirement -{ - /// - /// If true valid requirements will be treated as invalid and vice versa - /// - [DataField] - public bool Inverted; - - /// - /// Checks if this character requirement is valid for the given parameters - /// - /// Description for the requirement, shown when not null - public abstract bool IsValid( - IPrototype prototype, - JobPrototype job, - HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, - IPrototypeManager prototypeManager, - IConfigurationManager configManager, - out FormattedMessage? reason - ); -} - - -#region HumanoidCharacterProfile - -/// -/// Requires the profile to be within an age range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterAgeRequirement : CharacterRequirement -{ - [DataField(required: true)] - public int Min; - - [DataField(required: true)] - public int Max; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-age-requirement", - ("inverted", Inverted), ("min", Min), ("max", Max))); - return profile.Age >= Min && profile.Age <= Max; - } -} - -/// -/// Requires the profile to use either a Backpack, Satchel, or Duffelbag -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterBackpackTypeRequirement : CharacterRequirement -{ - [DataField(required: true)] - public BackpackPreference Preference; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-backpack-type-requirement", - ("inverted", Inverted), - ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Backpack == Preference; - } -} - -/// -/// Requires the profile to use either Jumpsuits or Jumpskirts -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterClothingPreferenceRequirement : CharacterRequirement -{ - [DataField(required: true)] - public ClothingPreference Preference; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-clothing-preference-requirement", - ("inverted", Inverted), - ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Clothing == Preference; - } -} - -/// -/// Requires the profile to be a certain species -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterSpeciesRequirement : CharacterRequirement -{ - [DataField(required: true)] - public ProtoId Species; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-species-requirement", - ("inverted", Inverted), - ("species", Loc.GetString($"species-name-{Species.ToString().ToLower()}")))); - return profile.Species == Species; - } -} - -/// -/// Requires the profile to have one of the specified traits -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterTraitRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Traits; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", ("inverted", Inverted), - ("traits", string.Join(", ", Traits.Select(t => Loc.GetString($"trait-name-{t}")))))); - - return Traits.Any(t => profile.TraitPreferences.Contains(t.ToString())); - } -} - -/// -/// Requires the profile to have one of the specified loadouts -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterLoadoutRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Loadouts; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", ("inverted", Inverted), - ("loadouts", string.Join(", ", Loadouts.Select(l => Loc.GetString($"loadout-{l}")))))); - - return Loadouts.Any(l => profile.LoadoutPreferences.Contains(l.ToString())); - } -} - -#endregion - -#region Jobs - -/// -/// Requires the selected job to be one of the specified jobs -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterJobRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Jobs; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var jobs = new List(); - - // Get the job names and department colors - foreach (var j in Jobs) - { - var jobProto = prototypeManager.Index(j); - var color = Color.LightBlue; - - foreach (var dept in prototypeManager.EnumeratePrototypes() - .OrderBy(d => Loc.GetString($"department-{d.ID}"))) - { - if (!dept.Roles.Contains(j)) - continue; - - color = dept.Color; - break; - } - - jobs.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString(jobProto.Name)}[/color]")); - } - - // Join the job names - var jobsList = string.Join(", ", jobs.Select(j => j.ToMarkup())); - var jobsString = Loc.GetString("character-job-requirement", - ("inverted", Inverted), ("jobs", jobsList)); - - reason = FormattedMessage.FromMarkup(jobsString); - return Jobs.Contains(job.ID); - } -} - -/// -/// Requires the selected job to be in one of the specified departments -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterDepartmentRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Departments; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var departments = new List(); - - // Get the department names and colors - foreach (var d in Departments) - { - var deptProto = prototypeManager.Index(d); - var color = deptProto.Color; - - departments.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString($"department-{deptProto.ID}")}[/color]")); - } - - // Join the department names - var departmentsList = string.Join(", ", departments.Select(d => d.ToMarkup())); - var departmentsString = Loc.GetString("character-department-requirement", - ("inverted", Inverted), ("departments", departmentsList)); - - reason = FormattedMessage.FromMarkup(departmentsString); - return Departments.Any(d => prototypeManager.Index(d).Roles.Contains(job.ID)); - } -} - -/// -/// Requires the playtime for a department to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterDepartmentTimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Department; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - var department = prototypeManager.Index(Department); - - // Combine all of this department's job playtimes - var playtime = TimeSpan.Zero; - foreach (var other in department.Roles) - { - var proto = prototypeManager.Index(other).PlayTimeTracker; - - playTimes.TryGetValue(proto, out var otherTime); - playtime += otherTime; - } - - if (playtime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-too-high", - ("time", playtime.Minutes - Max.Minutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - if (playtime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-insufficient", - ("time", Min.Minutes - playtime.Minutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the player to have a certain amount of overall job time -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterOverallTimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get the overall time - var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); - - if (overallTime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-too-high", - ("time", overallTime.Minutes - Max.Minutes))); - return false; - } - - if (overallTime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-insufficient", - ("time", Min.Minutes - overallTime.Minutes))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the playtime for a tracker to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterPlaytimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Tracker; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get SharedJobSystem - if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) - { - DebugTools.Assert("CharacterRequirements: SharedJobSystem not found"); - reason = null; - return false; - } - - // Get the JobPrototype of the Tracker - var trackerJob = jobSystem.GetJobPrototype(Tracker); - - // Get the primary department of the Tracker - if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && - !jobSystem.TryGetDepartment(trackerJob, out department)) - { - DebugTools.Assert($"CharacterRequirements: Department not found for job {trackerJob}"); - reason = null; - return false; - } - - // Get the time for the tracker - var time = playTimes.GetValueOrDefault(Tracker); - reason = null; - - if (time > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-too-high", - ("time", time.Minutes - Max.Minutes), - ("job", trackerJob), - ("departmentColor", department.Color))); - return false; - } - - if (time < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-insufficient", - ("time", Min.Minutes - time.Minutes), - ("job", trackerJob), - ("departmentColor", department.Color))); - return false; - } - - return true; - } -} - -#endregion - -#region Prototype Groups - -/// -/// Requires the profile to not have any of the specified traits -/// -/// -/// Only works if you put this prototype in the denied prototypes' requirements too. -/// Can't be inverted, use -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class TraitGroupExclusionRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Prototypes; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var invalid = profile.TraitPreferences.Any(t => Prototypes.Contains(t)); - - reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-group-exclusion-requirement", - ("traits", string.Join(", ", Prototypes.Select(t => Loc.GetString($"trait-name-{t}")))))); - - return Inverted ? invalid : !invalid; - } -} - -/// -/// Requires the profile to not have any of the specified loadouts -/// -/// -/// Only works if you put this prototype in the denied prototypes' requirements too. -/// Can't be inverted, use -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class LoadoutGroupExclusionRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Prototypes; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var invalid = profile.LoadoutPreferences.Any(l => Prototypes.Contains(l)); - - reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-group-exclusion-requirement", - ("loadouts", string.Join(", ", Prototypes.Select(l => Loc.GetString($"loadout-{l}")))))); - - return Inverted ? invalid : !invalid; - } -} - -#endregion diff --git a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs deleted file mode 100644 index e93c933a6aa..00000000000 --- a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Content.Shared.Preferences; -using Content.Shared.Roles; -using Robust.Shared.Configuration; -using Robust.Shared.Prototypes; -using Robust.Shared.Utility; - -namespace Content.Shared.Customization.Systems; - - -public sealed class CharacterRequirementsSystem : EntitySystem -{ - public bool CheckRequirementsValid(IPrototype prototype, List requirements, JobPrototype job, - HumanoidCharacterProfile profile, Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out List reasons) - { - reasons = new List(); - var valid = true; - - foreach (var requirement in requirements) - { - // Set valid to false if the requirement is invalid and not inverted - // If it's inverted set valid to false when it's valid - if (!requirement.IsValid(prototype, job, profile, playTimes, - entityManager, prototypeManager, configManager, - out var reason)) - { - if (valid) - valid = requirement.Inverted; - } - else - { - if (valid) - valid = !requirement.Inverted; - } - - if (reason != null) // To appease the compiler - reasons.Add(reason); - } - - return valid; - } -} diff --git a/Content.Shared/Drunk/DrunkSystem.cs b/Content.Shared/Drunk/DrunkSystem.cs index 161d4729ede..4f9429b6a6b 100644 --- a/Content.Shared/Drunk/DrunkSystem.cs +++ b/Content.Shared/Drunk/DrunkSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Speech.EntitySystems; using Content.Shared.StatusEffect; -using Content.Shared.Traits.Assorted.Components; +using Content.Shared.Traits.Assorted; namespace Content.Shared.Drunk; diff --git a/Content.Shared/Implants/Components/ImplanterComponent.cs b/Content.Shared/Implants/Components/ImplanterComponent.cs index 80330aa7e66..32a36361633 100644 --- a/Content.Shared/Implants/Components/ImplanterComponent.cs +++ b/Content.Shared/Implants/Components/ImplanterComponent.cs @@ -70,12 +70,6 @@ public sealed partial class ImplanterComponent : Component [DataField] public (string, string) ImplantData; - /// - /// Determines if the same type of implant can be implanted into an entity multiple times. - /// - [DataField] - public bool AllowMultipleImplants = false; - /// /// The for this implanter /// diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 8cf504582d4..ece9a82bb24 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -393,19 +393,19 @@ public HumanoidCharacterProfile WithLoadoutPreference(string loadoutId, bool pre public bool MemberwiseEquals(ICharacterProfile maybeOther) { - if (maybeOther is not HumanoidCharacterProfile other - || Name != other.Name - || Age != other.Age - || Sex != other.Sex - || Gender != other.Gender - || PreferenceUnavailable != other.PreferenceUnavailable - || Clothing != other.Clothing - || Backpack != other.Backpack - || SpawnPriority != other.SpawnPriority - || !_jobPriorities.SequenceEqual(other._jobPriorities) - || !_antagPreferences.SequenceEqual(other._antagPreferences) - || !_traitPreferences.SequenceEqual(other._traitPreferences) - || !_loadoutPreferences.SequenceEqual(other._loadoutPreferences)) + if (maybeOther is not HumanoidCharacterProfile other || + Name != other.Name || + Age != other.Age || + Sex != other.Sex || + Gender != other.Gender || + PreferenceUnavailable != other.PreferenceUnavailable || + Clothing != other.Clothing || + Backpack != other.Backpack || + SpawnPriority != other.SpawnPriority || + !_jobPriorities.SequenceEqual(other._jobPriorities) || + !_antagPreferences.SequenceEqual(other._antagPreferences) || + !_traitPreferences.SequenceEqual(other._traitPreferences) || + !_loadoutPreferences.SequenceEqual(other._loadoutPreferences)) return false; return Appearance.MemberwiseEquals(other.Appearance); @@ -545,42 +545,23 @@ public void EnsureValid(IConfigurationManager configManager, IPrototypeManager p .Where(prototypeManager.HasIndex) .ToList(); - var maxTraits = configManager.GetCVar(CCVars.GameTraitsMax); - var currentTraits = 0; - var traitPoints = configManager.GetCVar(CCVars.GameTraitsDefaultPoints); - - foreach (var trait in traits.OrderBy(t => -prototypeManager.Index(t).Points).ToList()) - { - var proto = prototypeManager.Index(trait); - - if (traitPoints + proto.Points < 0 || currentTraits + 1 > maxTraits) - traits.Remove(trait); - else - { - traitPoints += proto.Points; - currentTraits++; - } - } - - var loadouts = LoadoutPreferences .Where(prototypeManager.HasIndex) .ToList(); - var loadoutPoints = configManager.GetCVar(CCVars.GameLoadoutsPoints); - var currentPoints = 0; + var maxLoadouts = configManager.GetCVar(CCVars.GameLoadoutsPoints); + var currentLoadouts = 0; foreach (var loadout in loadouts.ToList()) { var proto = prototypeManager.Index(loadout); - if (currentPoints + proto.Cost > loadoutPoints) + if (currentLoadouts + proto.Cost > maxLoadouts) loadouts.Remove(loadout); else - currentPoints += proto.Cost; + currentLoadouts += proto.Cost; } - Name = name; FlavorText = flavortext; Age = age; diff --git a/Content.Shared/Traits/Assorted/Components/AccentlessComponent.cs b/Content.Shared/Traits/Assorted/AccentlessComponent.cs similarity index 89% rename from Content.Shared/Traits/Assorted/Components/AccentlessComponent.cs rename to Content.Shared/Traits/Assorted/AccentlessComponent.cs index 084a1e1d925..96ebf4d83f6 100644 --- a/Content.Shared/Traits/Assorted/Components/AccentlessComponent.cs +++ b/Content.Shared/Traits/Assorted/AccentlessComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.GameStates; using Robust.Shared.Prototypes; -namespace Content.Shared.Traits.Assorted.Components; +namespace Content.Shared.Traits.Assorted; /// /// This is used for the accentless trait diff --git a/Content.Shared/Traits/Assorted/Systems/AccentlessSystem.cs b/Content.Shared/Traits/Assorted/AccentlessSystem.cs similarity index 62% rename from Content.Shared/Traits/Assorted/Systems/AccentlessSystem.cs rename to Content.Shared/Traits/Assorted/AccentlessSystem.cs index f4e077bc1af..2242bc6e52b 100644 --- a/Content.Shared/Traits/Assorted/Systems/AccentlessSystem.cs +++ b/Content.Shared/Traits/Assorted/AccentlessSystem.cs @@ -1,4 +1,6 @@ -namespace Content.Shared.Traits.Assorted.Systems; +using Robust.Shared.Serialization.Manager; + +namespace Content.Shared.Traits.Assorted; /// /// This handles removing accents when using the accentless trait. @@ -10,10 +12,10 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(RemoveAccents); + SubscribeLocalEvent(RemoveAccents); } - private void RemoveAccents(EntityUid uid, Components.AccentlessComponent component, ComponentStartup args) + private void RemoveAccents(EntityUid uid, AccentlessComponent component, ComponentStartup args) { foreach (var accent in component.RemovedAccents.Values) { diff --git a/Content.Shared/Traits/Assorted/Components/LegsParalyzedComponent.cs b/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs similarity index 65% rename from Content.Shared/Traits/Assorted/Components/LegsParalyzedComponent.cs rename to Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs index d0639e59339..59f9ca758bc 100644 --- a/Content.Shared/Traits/Assorted/Components/LegsParalyzedComponent.cs +++ b/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs @@ -1,7 +1,6 @@ -using Content.Shared.Traits.Assorted.Systems; -using Robust.Shared.GameStates; +using Robust.Shared.GameStates; -namespace Content.Shared.Traits.Assorted.Components; +namespace Content.Shared.Traits.Assorted; /// /// Set player speed to zero and standing state to down, simulating leg paralysis. diff --git a/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs b/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs new file mode 100644 index 00000000000..7c91366937c --- /dev/null +++ b/Content.Shared/Traits/Assorted/LegsParalyzedSystem.cs @@ -0,0 +1,58 @@ +using Content.Shared.Body.Systems; +using Content.Shared.Buckle.Components; +using Content.Shared.Movement.Events; +using Content.Shared.Movement.Systems; +using Content.Shared.Standing; +using Content.Shared.Throwing; + +namespace Content.Shared.Traits.Assorted; + +public sealed class LegsParalyzedSystem : EntitySystem +{ + [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; + [Dependency] private readonly StandingStateSystem _standingSystem = default!; + [Dependency] private readonly SharedBodySystem _bodySystem = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnBuckleChange); + SubscribeLocalEvent(OnThrowPushbackAttempt); + SubscribeLocalEvent(OnUpdateCanMoveEvent); + } + + private void OnStartup(EntityUid uid, LegsParalyzedComponent component, ComponentStartup args) + { + // TODO: In future probably must be surgery related wound + _movementSpeedModifierSystem.ChangeBaseSpeed(uid, 0, 0, 20); + } + + private void OnShutdown(EntityUid uid, LegsParalyzedComponent component, ComponentShutdown args) + { + _standingSystem.Stand(uid); + _bodySystem.UpdateMovementSpeed(uid); + } + + private void OnBuckleChange(EntityUid uid, LegsParalyzedComponent component, ref BuckleChangeEvent args) + { + if (args.Buckling) + { + _standingSystem.Stand(args.BuckledEntity); + } + else + { + _standingSystem.Down(args.BuckledEntity); + } + } + + private void OnUpdateCanMoveEvent(EntityUid uid, LegsParalyzedComponent component, UpdateCanMoveEvent args) + { + args.Cancel(); + } + + private void OnThrowPushbackAttempt(EntityUid uid, LegsParalyzedComponent component, ThrowPushbackAttemptEvent args) + { + args.Cancel(); + } +} diff --git a/Content.Shared/Traits/Assorted/Components/LightweightDrunkComponent.cs b/Content.Shared/Traits/Assorted/LightweightDrunkComponent.cs similarity index 90% rename from Content.Shared/Traits/Assorted/Components/LightweightDrunkComponent.cs rename to Content.Shared/Traits/Assorted/LightweightDrunkComponent.cs index 62d2f5899a4..5d353ac9637 100644 --- a/Content.Shared/Traits/Assorted/Components/LightweightDrunkComponent.cs +++ b/Content.Shared/Traits/Assorted/LightweightDrunkComponent.cs @@ -1,7 +1,7 @@ -using Content.Shared.Drunk; using Robust.Shared.GameStates; +using Content.Shared.Drunk; -namespace Content.Shared.Traits.Assorted.Components; +namespace Content.Shared.Traits.Assorted; /// /// Used for the lightweight trait. DrunkSystem will check for this component and modify the boozePower accordingly if it finds it. diff --git a/Content.Shared/Traits/Assorted/Components/ParacusiaComponent.cs b/Content.Shared/Traits/Assorted/ParacusiaComponent.cs similarity index 93% rename from Content.Shared/Traits/Assorted/Components/ParacusiaComponent.cs rename to Content.Shared/Traits/Assorted/ParacusiaComponent.cs index ff62e55c2aa..1db698359bd 100644 --- a/Content.Shared/Traits/Assorted/Components/ParacusiaComponent.cs +++ b/Content.Shared/Traits/Assorted/ParacusiaComponent.cs @@ -1,9 +1,8 @@ -using Content.Shared.Traits.Assorted.Systems; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -namespace Content.Shared.Traits.Assorted.Components; +namespace Content.Shared.Traits.Assorted; /// /// This component is used for paracusia, which causes auditory hallucinations. diff --git a/Content.Shared/Traits/Assorted/Components/PermanentBlindnessComponent.cs b/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs similarity index 81% rename from Content.Shared/Traits/Assorted/Components/PermanentBlindnessComponent.cs rename to Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs index c1bf7e1639e..76ff3e1005e 100644 --- a/Content.Shared/Traits/Assorted/Components/PermanentBlindnessComponent.cs +++ b/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Traits.Assorted.Components; +namespace Content.Shared.Traits.Assorted; /// /// This is used for making something blind forever. diff --git a/Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs b/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs similarity index 59% rename from Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs rename to Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs index 113939f66b7..9fd5db84972 100644 --- a/Content.Shared/Traits/Assorted/Systems/PermanentBlindnessSystem.cs +++ b/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs @@ -4,7 +4,7 @@ using Content.Shared.IdentityManagement; using Robust.Shared.Network; -namespace Content.Shared.Traits.Assorted.Systems; +namespace Content.Shared.Traits.Assorted; /// /// This handles permanent blindness, both the examine and the actual effect. @@ -18,26 +18,26 @@ public sealed class PermanentBlindnessSystem : EntitySystem /// public override void Initialize() { - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnDamageChanged); - SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnExamined); } - private void OnExamined(Entity blindness, ref ExaminedEvent args) + private void OnExamined(Entity blindness, ref ExaminedEvent args) { if (args.IsInDetailsRange && !_net.IsClient) { - args.PushMarkup(Loc.GetString("trait-examined-Blindness", ("target", Identity.Entity(blindness, EntityManager)))); + args.PushMarkup(Loc.GetString("permanent-blindness-trait-examined", ("target", Identity.Entity(blindness, EntityManager)))); } } - private void OnShutdown(Entity blindness, ref ComponentShutdown args) + private void OnShutdown(Entity blindness, ref ComponentShutdown args) { _blinding.UpdateIsBlind(blindness.Owner); } - private void OnStartup(Entity blindness, ref ComponentStartup args) + private void OnStartup(Entity blindness, ref ComponentStartup args) { if (!_entityManager.TryGetComponent(blindness, out var blindable)) return; @@ -50,7 +50,7 @@ private void OnStartup(Entity blindness, _blinding.AdjustEyeDamage(blindness.Owner, damageToDeal); } - private void OnDamageChanged(Entity blindness, ref EyeDamageChangedEvent args) + private void OnDamageChanged(Entity blindness, ref EyeDamageChangedEvent args) { if (args.Damage >= BlurryVisionComponent.MaxMagnitude) return; diff --git a/Content.Shared/Traits/Assorted/Systems/SharedParacusiaSystem.cs b/Content.Shared/Traits/Assorted/SharedParacusiaSystem.cs similarity index 56% rename from Content.Shared/Traits/Assorted/Systems/SharedParacusiaSystem.cs rename to Content.Shared/Traits/Assorted/SharedParacusiaSystem.cs index 151e748445f..2bfb0da1f54 100644 --- a/Content.Shared/Traits/Assorted/Systems/SharedParacusiaSystem.cs +++ b/Content.Shared/Traits/Assorted/SharedParacusiaSystem.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Traits.Assorted.Systems; +namespace Content.Shared.Traits.Assorted; public abstract class SharedParacusiaSystem : EntitySystem { diff --git a/Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs b/Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs deleted file mode 100644 index 8ae0f251b86..00000000000 --- a/Content.Shared/Traits/Assorted/Systems/LegsParalyzedSystem.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Content.Shared.Body.Systems; -using Content.Shared.Buckle.Components; -using Content.Shared.Movement.Events; -using Content.Shared.Movement.Systems; -using Content.Shared.Standing; -using Content.Shared.Throwing; - -namespace Content.Shared.Traits.Assorted.Systems; - -public sealed class LegsParalyzedSystem : EntitySystem -{ - [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; - [Dependency] private readonly StandingStateSystem _standingSystem = default!; - [Dependency] private readonly SharedBodySystem _bodySystem = default!; - - public override void Initialize() - { - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnBuckleChange); - SubscribeLocalEvent(OnThrowPushbackAttempt); - SubscribeLocalEvent(OnUpdateCanMoveEvent); - } - - private void OnStartup(EntityUid uid, Components.LegsParalyzedComponent component, ComponentStartup args) - { - // TODO: In future probably must be surgery related wound - _movementSpeedModifierSystem.ChangeBaseSpeed(uid, 0, 0, 20); - } - - private void OnShutdown(EntityUid uid, Components.LegsParalyzedComponent component, ComponentShutdown args) - { - _standingSystem.Stand(uid); - _bodySystem.UpdateMovementSpeed(uid); - } - - private void OnBuckleChange(EntityUid uid, Components.LegsParalyzedComponent component, ref BuckleChangeEvent args) - { - if (args.Buckling) - { - _standingSystem.Stand(args.BuckledEntity); - } - else - { - _standingSystem.Down(args.BuckledEntity); - } - } - - private void OnUpdateCanMoveEvent(EntityUid uid, Components.LegsParalyzedComponent component, UpdateCanMoveEvent args) - { - args.Cancel(); - } - - private void OnThrowPushbackAttempt(EntityUid uid, Components.LegsParalyzedComponent component, ThrowPushbackAttemptEvent args) - { - args.Cancel(); - } -} diff --git a/Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs b/Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs deleted file mode 100644 index efbac1ca7d0..00000000000 --- a/Content.Shared/Traits/Prototypes/TraitCategoryPrototype.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Robust.Shared.Prototypes; - -namespace Content.Shared.Traits; - - -/// -/// A prototype defining a valid category for s to go into. -/// -[Prototype("traitCategory")] -public sealed partial class TraitCategoryPrototype : IPrototype -{ - [IdDataField] - public string ID { get; } = default!; -} diff --git a/Content.Shared/Traits/Prototypes/TraitPrototype.cs b/Content.Shared/Traits/Prototypes/TraitPrototype.cs deleted file mode 100644 index 2e6b7cc0666..00000000000 --- a/Content.Shared/Traits/Prototypes/TraitPrototype.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Content.Shared.Customization.Systems; -using Content.Shared.Whitelist; -using Robust.Shared.Prototypes; - -namespace Content.Shared.Traits; - - -/// -/// Describes a trait. -/// -[Prototype("trait")] -public sealed partial class TraitPrototype : IPrototype -{ - [ViewVariables] - [IdDataField] - public string ID { get; private set; } = default!; - - /// - /// Which customization tab to place this entry in - /// - [DataField(required: true), ValidatePrototypeId] - public string Category = "Uncategorized"; - - /// - /// How many points this will give the character - /// - [DataField] - public int Points = 0; - - - [DataField] - public List Requirements = new(); - - /// - /// The components that get added to the player when they pick this trait. - /// - [DataField(required: true)] - public ComponentRegistry Components { get; private set; } = default!; -} diff --git a/Content.Shared/Traits/TraitPrototype.cs b/Content.Shared/Traits/TraitPrototype.cs new file mode 100644 index 00000000000..34feb8da22c --- /dev/null +++ b/Content.Shared/Traits/TraitPrototype.cs @@ -0,0 +1,55 @@ +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +// don't worry about it + +namespace Content.Shared.Traits +{ + /// + /// Describes a trait. + /// + [Prototype("trait")] + public sealed partial class TraitPrototype : IPrototype + { + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// The name of this trait. + /// + [DataField("name")] + public string Name { get; private set; } = ""; + + /// + /// The description of this trait. + /// + [DataField("description")] + public string? Description { get; private set; } + + /// + /// Don't apply this trait to entities this whitelist IS NOT valid for. + /// + [DataField("whitelist")] + public EntityWhitelist? Whitelist; + + /// + /// Don't apply this trait to entities this whitelist IS valid for. (hence, a blacklist) + /// + [DataField("blacklist")] + public EntityWhitelist? Blacklist; + + /// + /// The components that get added to the player, when they pick this trait. + /// + [DataField("components")] + public ComponentRegistry Components { get; private set; } = default!; + + /// + /// Gear that is given to the player, when they pick this trait. + /// + [DataField("traitGear", required: false, customTypeSerializer:typeof(PrototypeIdSerializer))] + public string? TraitGear; + } +} diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index a18aac80abe..0183a30a73b 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -229,12 +229,6 @@ public sealed partial class GunComponent : Component /// [DataField] public bool ClumsyProof = false; - - /// - /// The percentage chance of a given gun to accidentally discharge if violently thrown into a wall or person - /// - [DataField] - public float FireOnDropChance = 0.1f; } [Flags] diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 49b2d5358d4..7fcb7aac227 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4184,44 +4184,3 @@ Entries: message: Moths have way better control in zero gravity environments id: 6122 time: '2024-06-17T07:58:34.0000000+00:00' -- author: VMSolidus - changes: - - type: Add - message: >- - Added station goals that get sent to the Command fax machine at the - start of every shift - id: 6123 - time: '2024-06-17T21:42:13.0000000+00:00' -- author: VMSolidus - changes: - - type: Add - message: Peacock Tails have been added for Harpies - id: 6124 - time: '2024-06-20T22:07:29.0000000+00:00' -- author: VMSolidus - changes: - - type: Add - message: >- - NanoTrasen has disabled the unneeded safeties on your guns- Make sure - you're careful with them! - - type: Tweak - message: >- - All Firearms now have a reliability stat, some are more reliable than - others. The more reliable a weapon is, the less likely it is to - accidentally discharge when yeeted. - id: 6125 - time: '2024-06-20T22:17:03.0000000+00:00' -- author: DEATHB4DEFEAT - changes: - - type: Add - message: Animals will no longer be a silent, soulless shell - id: 6126 - time: '2024-06-20T22:24:30.0000000+00:00' -- author: DEATHB4DEFEAT - changes: - - type: Add - message: Added trait points - - type: Add - message: Added categories for traits - id: 6127 - time: '2024-06-20T23:39:31.0000000+00:00' diff --git a/Resources/Locale/en-US/customization/character-requirements.ftl b/Resources/Locale/en-US/customization/character-requirements.ftl deleted file mode 100644 index b073bdb773f..00000000000 --- a/Resources/Locale/en-US/customization/character-requirements.ftl +++ /dev/null @@ -1,39 +0,0 @@ -character-age-requirement = You must {$inverted -> - [true] not be - *[other] be -} be within [color=yellow]{$min}[/color] and [color=yellow]{$max}[/color] years old -character-species-requirement = You must {$inverted -> - [true] not be - *[other] be -} a [color=green]{$species}[/color] -character-trait-requirement = You must {$inverted -> - [true] not have - *[other] have -} the trait [color=lightblue]{$trait}[/color] -character-backpack-type-requirement = You must {$inverted -> - [true] not use - *[other] use -} a [color=lightblue]{$type}[/color] as your bag -character-clothing-preference-requirement = You must {$inverted -> - [true] not wear - *[other] wear -} a [color=lightblue]{$type}[/color] - -character-job-requirement = You must {$inverted -> - [true] not be - *[other] be -} one of these jobs: {$jobs} -character-department-requirement = You must {$inverted -> - [true] not be - *[other] be -} in one of these departments: {$departments} - -character-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime -character-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department -character-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime -character-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime -character-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] -character-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] - -character-trait-group-exclusion-requirement = You cannot have one of the following traits if you select this: {$traits} -character-loadout-group-exclusion-requirement = You cannot have one of the following loadouts if you select this: {$loadouts} diff --git a/Resources/Locale/en-US/deltav/markings/harpy.ftl b/Resources/Locale/en-US/deltav/markings/harpy.ftl index 871f2f17290..3c1a2e3b9b2 100644 --- a/Resources/Locale/en-US/deltav/markings/harpy.ftl +++ b/Resources/Locale/en-US/deltav/markings/harpy.ftl @@ -40,10 +40,6 @@ marking-HarpyTailRooster-rooster_tail = Tail marking-HarpyTailFinch = Finch Tail marking-HarpyTailFinch-finch_tail = Tail -marking-HarpyTailPeacock = Peacock Tail -marking-HarpyTailPeacock-peacock_tail_feathers = Feathers -marking-HarpyTailPeacock-peacock_tail_eyes = Eyes - marking-HarpyChestDefault = Wing & Groin Under-Clothes marking-HarpyChestDefault-upper = Wing Under-Clothes marking-HarpyChestDefault-lower = Groin Under-Clothes diff --git a/Resources/Locale/en-US/deltav/traits/traits.ftl b/Resources/Locale/en-US/deltav/traits/traits.ftl index 914a5c9f1bc..e00cec47077 100644 --- a/Resources/Locale/en-US/deltav/traits/traits.ftl +++ b/Resources/Locale/en-US/deltav/traits/traits.ftl @@ -1,13 +1,13 @@ -trait-name-ScottishAccent = Scottish Accent -trait-description-ScottishAccent = Fer tha folk who come frae Hielan clan. +trait-scottish-accent-name = Scottish Accent +trait-scottish-accent-desc = Fer tha folk who come frae Hielan clan. -trait-name-UltraVision = Ultraviolet Vision -trait-description-UltraVision = Whether through custom bionic eyes, random mutation, +trait-ultravision-name = Ultraviolet Vision +trait-ultravision-desc = Whether through custom bionic eyes, random mutation, or being a Harpy, you perceive the world with ultraviolet light. -trait-name-DogVision = Deuteranopia -trait-description-DogVision = Whether through custom bionic eyes, random mutation, +trait-deuteranopia-name = Deuteranopia +trait-deuteranopia-desc = Whether through custom bionic eyes, random mutation, or being a Vulpkanin, you have red–green colour blindness. -trait-name-Uncloneable = Uncloneable -trait-description-Uncloneable = Cannot be cloned +trait-uncloneable-name = Uncloneable +trait-uncloneable-desc = Cannot be cloned diff --git a/Resources/Locale/en-US/implant/implant.ftl b/Resources/Locale/en-US/implant/implant.ftl index 2f6ab9e4e2f..22db4460aff 100644 --- a/Resources/Locale/en-US/implant/implant.ftl +++ b/Resources/Locale/en-US/implant/implant.ftl @@ -4,7 +4,6 @@ implanter-component-implanting-target = {$user} is trying to implant you with so implanter-component-implant-failed = The {$implant} cannot be given to {$target}! implanter-draw-failed-permanent = The {$implant} in {$target} is fused with them and cannot be removed! implanter-draw-failed = You tried to remove an implant but found nothing. -implanter-component-implant-already = {$target} already has the {$implant}! ## UI implanter-draw-text = Draw diff --git a/Resources/Locale/en-US/loadouts/categories.ftl b/Resources/Locale/en-US/loadouts/categories.ftl index 55dbab656ff..207b72d3add 100644 --- a/Resources/Locale/en-US/loadouts/categories.ftl +++ b/Resources/Locale/en-US/loadouts/categories.ftl @@ -1,6 +1,4 @@ -# Alphabetically ordered, except for Uncategorized since it is always first - -loadout-category-Uncategorized = Uncategorized +# Alphabetically ordered loadout-category-Accessories = Accessories loadout-category-Eyes = Eyes loadout-category-Hands = Hands diff --git a/Resources/Locale/en-US/loadouts/loadout-requirements.ftl b/Resources/Locale/en-US/loadouts/loadout-requirements.ftl new file mode 100644 index 00000000000..d72557f1e8d --- /dev/null +++ b/Resources/Locale/en-US/loadouts/loadout-requirements.ftl @@ -0,0 +1,13 @@ +loadout-age-requirement = You must be within {$min} and {$max} years old +loadout-species-requirement = You must be one of these species: {$species} +loadout-trait-requirement = You must have the trait {$trait} +loadout-backpack-type-requirement = You must use a {$type} as your bag +loadout-clothing-preference-requirement = You must wear a {$type} + +loadout-job-requirement = You must be one of these jobs: {$job} +loadout-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime +loadout-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department +loadout-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime +loadout-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime +loadout-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] +loadout-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] diff --git a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl index 9b8eb74d969..b929da96554 100644 --- a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl +++ b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl @@ -44,40 +44,20 @@ humanoid-profile-editor-department-jobs-label = {$departmentName} jobs humanoid-profile-editor-antags-tab = Antags humanoid-profile-editor-antag-preference-yes-button = Yes humanoid-profile-editor-antag-preference-no-button = No - humanoid-profile-editor-traits-tab = Traits -humanoid-profile-editor-traits-header = You have {$points -> - [1] 1 point - *[other] {$points} points -} and {$maxTraits -> - [2147483648] {$traits -> - [1] {$traits} trait - *[other] {$traits} traits - } - *[other] {$traits}/{$maxTraits} traits -} -humanoid-profile-editor-traits-show-unusable-button = Show Unusable -humanoid-profile-editor-traits-show-unusable-button-tooltip = - When enabled, traits that your current character setup cannot use will be shown highlighted in red. - You will still not be able to use the invalid traits unless your character setup changes to fit the requirements. - This is most likely useful only if there's a bug hiding traits you actually can use or if you want to see other species' traits or something. -humanoid-profile-editor-traits-no-traits = No traits found - humanoid-profile-editor-job-priority-high-button = High humanoid-profile-editor-job-priority-medium-button = Medium humanoid-profile-editor-job-priority-low-button = Low humanoid-profile-editor-job-priority-never-button = Never - humanoid-profile-editor-naming-rules-warning = Warning: Offensive or LRP IC names and descriptions will lead to admin intervention on this server. Read our \[Rules\] for more. - humanoid-profile-editor-loadouts-tab = Loadout +humanoid-profile-editor-loadouts-uncategorized-tab = Uncategorized +humanoid-profile-editor-loadouts-no-loadouts = No loadouts found humanoid-profile-editor-loadouts-points-label = You have {$points}/{$max} points humanoid-profile-editor-loadouts-show-unusable-button = Show Unusable humanoid-profile-editor-loadouts-show-unusable-button-tooltip = When enabled, loadouts that your current character setup cannot use will be shown highlighted in red. You will still not be able to use the invalid loadouts unless your character setup changes to fit the requirements. - This may be useful if you like switching between multiple jobs and don't want to have to reselect your loadout every -humanoid-profile-editor-loadouts-no-loadouts = No loadouts foundtime. - + This may be useful if you like switching between multiple jobs and don't want to have to reselect your loadout every time. humanoid-profile-editor-markings-tab = Markings humanoid-profile-editor-flavortext-tab = Description diff --git a/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl b/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl index 8360aaeb9df..3d8af061392 100644 --- a/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl +++ b/Resources/Locale/en-US/simplestation14/Traits/disabilities.ftl @@ -1,2 +1,3 @@ -trait-name-Nearsighted = Nearsighted -trait-description-Nearsighted = You require glasses to see properly. +trait-nearsighted-name = Nearsighted +trait-nearsighted-desc = You require glasses to see properly. +trait-nearsighted-examined = [color=lightblue]{CAPITALIZE(POSS-ADJ($target))} eyes are pretty unfocused. It doesn't seem like {SUBJECT($target)} can see things that well.[/color] diff --git a/Resources/Locale/en-US/station-goal/station-goal-command.ftl b/Resources/Locale/en-US/station-goal/station-goal-command.ftl deleted file mode 100644 index 82ed4d5c8a7..00000000000 --- a/Resources/Locale/en-US/station-goal/station-goal-command.ftl +++ /dev/null @@ -1,6 +0,0 @@ -send-station-goal-command-description = Sends the selected station target to all faxes that can receive it -send-station-goal-command-help-text = Usage: { $command } -send-station-goal-command-arg-id = Goal Prototype ID - -send-station-goal-command-error-no-goal-proto = No station goal found with ID {$id} -send-station-goal-command-error-couldnt-fax = Couldn't send station goal, probably due to a lack of fax machines that are able to recieve it diff --git a/Resources/Locale/en-US/station-goal/station-goals.ftl b/Resources/Locale/en-US/station-goal/station-goals.ftl deleted file mode 100644 index f98190fa3c4..00000000000 --- a/Resources/Locale/en-US/station-goal/station-goals.ftl +++ /dev/null @@ -1,224 +0,0 @@ -station-goal-fax-paper-name = Station Goal - -station-goal-fax-paper-header = - ███╗░░██╗████████╗ - ████╗░██║╚══██╔══╝ Form NT-No.{$station}-CC - ██╔██╗██║░░░██║░░░ Target Order - ██║╚████║░░░██║░░░ Date: {$date} - ██║░╚███║░░░██║░░░ Signed: CCO-{$name} - ╚═╝░░╚══╝░░░╚═╝░░░ - ════════════════════════════════════════ - {$content} - ════════════════════════════════════════ - - -station-goal-xeno= - Dear Station Command, the purpose of your shift is to build a Xenobiology Lab and then study exotic life forms. - Two containment chambers must be constructed according to the following requirements: - 1. Must be well reinforced; - 2. At least one of the chambers must be equipped with a gas supply system; - 3. The entrance should be a cycling airlock system to prevent contamination. - - Get the Salvage Team to capture at least 2 representatives of life forms (e.g. space carp) and transport them to the above-described chambers. - - Capture requirements: - 1. Exotic fauna should not have critical injuries at the time of placement in the research department; - 2. When captured fauna dies, you are required to catch another, cloning is strictly prohibited. - - Once you collect the required fauna, you must study them and write a report on their properties. - The report must be stamped by the head of the department and faxed to Central Command. - - Experience Requirements: - 1. Experience should be documented in detail; - 2. Test activities may include: working with gases, smoke, foam, or injecting experimental reagents (e.g. Cognizine) into captured fauna. - -station-goal-museum= - Dear Command of the station, the purpose of your shift is to build a museum, the exhibits for which will be unique objects collected from the station. - - Below are the requirements for the design of the museum: - 1. The museum must be structurally connected to the station by a space-protected corridor, or be located within it; - 2. The premises must be of a size that allows them to easily receive a large number of visitors; - 3. The premises must be provided with a standard atmosphere, ventilation and stable power supply; - 4. Room decoration should be visually pleasing; - 5. Exhibits must be reinforced accordingly to what is contained in them. - - Exhibit requirements: - 1. Exhibits must be unique in their kind; - 2. Each department must provide at least 2 exhibits for the museum fund; - 3. The total number of exhibits must be at least 20. - - Exhibits may include: - 1. Exotic drinks and dishes that require an extraordinary method of production and/or non-standard ingredients; - 2. Exotic matter/substance; - 3. Works of art (e.g. statues, paintings); - 4. Fully studied and documented artifacts (optionally provide a copy of the document); - 5. High-tech devices or tools; - 6. High-tech or high-power weapons; - 7. Robotic entities (e.g. Mechs, Cyborgs, Drones); - 8. Mutated biological organisms; - 9. Domesticated wild animals or intelligent non-humanoid life forms; - 10. Found treasures or items not available on the market. - - Upon completion of the museum, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the museum. - -station-goal-area= - Dear Station Command, the goal of your shift is to increase the effective use of space at the station. - - It is required to bring the abandoned premises into proper form and find a use for them. - Each department must equip and effectively use the area of adjacent maintenance tunnels. - Sufficiently spacious maintenance tunnels need to be converted into residential areas. - The remaining tunnels should be provided with floor coverings and adequate lighting. - In addition, it is necessary to provide a public, well-lit corridor connecting all the restored compartments and new bedrooms. - -station-goal-bureaucraticerror = - ACCESS TO THIS DOCUMENT IS PROHIBITED FOR PERSONS WHO DO NOT HAVE LEGAL IMMUNITY - - Dear Station Command, we inform you that the purpose of your shift was lost as a result of a bureaucratic error. - With this news, Central Command gives you the opportunity to independently assign a new goal for the station. - - New goal requirements: - 1. Relevance: The goal must be relevant and relevant to the current situation; - 2. Engagement: The goal should require the cooperation of as many departments as possible in the plans; - 3. Scope: The goal should involve sufficient, but not excessive, amounts of work to ensure the effective completion of the task. - - Please note that distribution of the contents of this document to persons who do not have legal immunity is strictly prohibited due to the possibility of discrediting the management of the Corporation. - Therefore, in order to present a new goal to the crew, the command staff must contact Central Command for approval of your ideas. - -station-goal-anomalies= - Dear Station Command, the purpose of your shift is to provide new information about anomalies to NanoTrasen. - - It is necessary to conduct experimental studies aimed at testing the consequences of the collapse of at least 4 unique anomalies. - During or after the experiments, it is necessary to isolate and document the aforementioned anomalies. - - Document requirements: - 1. The official name of the anomaly; - 2. Physical description; - 3. Passive properties; - 4. Reaction of the anomaly to different particles; - 5. Consequences of the collapse; - 6. Location of the anomaly. - - The document must be certified by the stamp of the supervisor and faxed to Central Command. - -station-goal-combat= - Dear station Command, due to the increase in attacks of pirate ships in this sector, the purpose of your shift is to raise the overall combat readiness of the station. - - Required: - 1. Organize an inspection of every sentient being and cargo arriving at or leaving the station. - 2. Build or modify an existing security checkpoint at arrivals and departures. The checkpoint must be able to completely block the ports from the main part of the station. - Each of the above checkpoints must have at least one cell for the temporary detention of detainees. - 3. Organize a spare weapons storage in the opposite part of the station from the brig. - The vault arsenal should have enough weapons and equipment to fully equip all security personnel. - 4. Organize the recruitment of a new combat subdepartment of security. - Squad members must be recruited from the station's crew. - Recruitment should be carried out on a voluntary-compulsory basis. - Composition of the squad: - 1 Field Medic; - 1 Field Engineer; - 3 Combat Operatives. - All members of the squad must be trained in all the necessary skills to conduct combat and fulfill their role. - 5. Open a public shooting range. - The shooting range should present all available types of weapons or their training counterparts. - Avoid providing lethal weaponry to unauthorized personnel. - 6. Encourage the use of the station boxing ring. - If there is no boxing ring, you must create one. - -station-goal-shuttle= - Dear Station Command, the purpose of your shift is to build a space shuttle capable of being piloted. - - Shuttle requirements: - 1. The shuttle must have a locked bridge; - a medical room with the necessary medical supplies and chemical equipment; - a supply store surrounded by reinforced material; - a crew room with at least 12 seats. - 2. There must be an intermediate room between the docking airlock and the main rooms to prevent possible depressurization. - 3. The shuttle must have a standard atmosphere, and also have several air gas containers to maintain it. - 4. The shuttle must be able to move in all directions (forward, backward, sideways) and turn reasonably well. - - Upon completion, the shuttle crew must be recruited from the station personnel. - The shuttle crew must include: - 1 pilot; - 2 engineers; - 1 medic/chemist; - 1 security officer. - - The shuttle should take on board all the station Command representatives as passengers and, in parallel with the evacuation shuttle, go to the Central Command station. - -station-goal-singularity= - Dear station Command, the goal of your shift is to build a generator based on the gravitational singularity. - - The design requirements are: - 1. The structure must be located at a significant distance from the station. - 2. The structure must be protected from meteorites and space debris. - 3. The containment field must be able to prevent the loss of a class 3 singularity. - -station-goal-solarpanels= - Dear station Command, the purpose of your shift is to organize a backup power system. - - The following work is required: - 1. Build two new branches of solar panels. - 2. Allocate an area for a compartment with spare batteries. - This compartment should accommodate at least 3 fully charged SMES', which should not be connected to the main power system of the station unless needed. - -station-goal-artifacts= - Dear station Command, the purpose of your shift is to provide new information about alien artifacts to NanoTrasen. - - It is required to organize the work of salvagers to search for and deliver artifacts from the wreckage around the station or expeditions. - After the delivery of the artifacts, they must be transferred to a special container to the research department. - It is necessary to deliver at least 2 fully studied and documented artifacts on the evacuation shuttle in special containment units. - - Recommended information for the document: - 1. Name of the artifact. - 2. Physical description. - 3. Properties of the object. - 4. Location of where the artifact was found. - 5. Additional notes. - - The document must be certified by the stamp of the supervisor. - -station-goal-storage= - Dear station Command, the purpose of your shift is to build an orbital storage facility with supplies and technology. - - The storage should be placed in space separately from the main station, make sure its design is strong, a random meteorite should not damage it. - - 4 boxes must be placed in the storage containing the following respectively: - - Advanced medicines; - - Stocks of the best seeds; - - Refrigerator box of food with a high nutritional value; - - Valuable, but not unique boards. - - Monitor the safety of the contents in the storage until the end of the shift, a cleanup crew will come retrieve the contents as they prepare the station. - -station-goal-zoo= - Dear station Command, the purpose of your shift is to improve the recreational value of the personnel at the station. - - It is necessary to build a zoo with at least 5 enclosures containing different types of animals ordered from the supply department. - Provide animals with food, at least one cleaning robot in each enclosure, and everything necessary for life, depending on the type of animal. - It is also necessary to build a bathhouse for the animals, water vapor must be supplied by Atmospheric Technicians. - - Upon completion of the zoo, it is required to provide the crew with at least 20 minutes of free time from work so that they can visit the new zoo. - -station-goal-labor= - Dear station Command, the purpose of your shift is to increase the motivation of the personnel for the growth of labor productivity. - - This requires that each of the heads during the shift closely monitors the performance of the duties of their employees and evaluates them. - After the time set by Command for evaluation, in each of the departments, the best, in the opinion of the head, employee should be selected, who will be invited to a dinner, where the Command staff will be obliged to award them a medal and a prize. - The heads must provide a report indicating the employee's position and merits for the shift. - Drinks and meals should be prepared for the dinner, as well as, if possible, several entertainment events that allow the presence of actors and musicians. - For the duration of the celebration, the dining room or other place chosen for the event must be inaccessible to the rest of the crew. - - The duration of the shift for a more accurate assessment of the work of the personnel should be set by the Command staff. - After the dinner someone must announce the end of the shift and call the evacuation shuttle. - -station-goal-lectures= - Dear station Command, the purpose of your shift is to carry out a number of events within the framework of the Corporation's plan to increase the knowledge of its employees. - - The Command staff are instructed to organize a platform for public lectures, if none exists, create one nearby the bridge entry. - The venue should be equipped with a large enough stage for speakers in the middle, a podium for the presenter to one side of it, plenty of seating for guests, and a special counter/table for brochures at the entrance. - A host/organizer of the event must also be selected. - Each department is required to present a group of employees consisting of at least 2 people. - Selected employees, under the supervision of the head of the department, should prepare a short lecture/presentation on a specific topic within their specialization (e.g. the harm of drugs and their reason for their criminalization, the effect of smoking on the body, acting, product pricing, cooking etc.), preferably with demonstration materials, and at least 10 brochures, on which the abstracts of the lecture should be indicated. - At the time indicated by the Command staff, the crew must be assembled on the site for the event, where lectures will be read. - There may be breaks between lectures to allow guests to read brochures and catch their breath. - - After the end of the event someone must announce the end of the shift and call the evacuation shuttle. diff --git a/Resources/Locale/en-US/traits/categories.ftl b/Resources/Locale/en-US/traits/categories.ftl deleted file mode 100644 index 56f0adeb479..00000000000 --- a/Resources/Locale/en-US/traits/categories.ftl +++ /dev/null @@ -1,8 +0,0 @@ -# Alphabetically ordered, except for Uncategorized since it is always first - -trait-category-Uncategorized = Uncategorized -trait-category-Auditory = Auditory -trait-category-Mental = Mental -trait-category-Physical = Physical -trait-category-Speech = Speech -trait-category-Visual = Visual diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index e3eb6ebb823..c097a689dd8 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -1,36 +1,31 @@ -trait-name-Blindness = Blindness -trait-description-Blindness = You are legally blind, and can't see clearly past a few meters in front of you. -trait-examined-Blindness = [color=lightblue]{CAPITALIZE(POSS-ADJ($target))} eyes are glassy and unfocused. It doesn't seem like {SUBJECT($target)} can see you well, if at all.[/color] +trait-blindness-name = Blindness +trait-blindness-desc = You are legally blind, and can't see clearly past a few meters in front of you. -trait-name-Narcolepsy = Narcolepsy -trait-description-Narcolepsy = You fall asleep randomly +trait-narcolepsy-name = Narcolepsy +trait-narcolepsy-desc = You fall asleep randomly -trait-name-Pacifist = Pacifist -trait-description-Pacifist = You cannot attack or hurt any living beings. +trait-pacifist-name = Pacifist +trait-pacifist-desc = You cannot attack or hurt any living beings. -trait-name-LightweightDrunk = Lightweight Drunk -trait-description-LightweightDrunk = Alcohol has a stronger effect on you +permanent-blindness-trait-examined = [color=lightblue]{CAPITALIZE(POSS-ADJ($target))} eyes are glassy and unfocused. It doesn't seem like {SUBJECT($target)} can see you well, if at all.[/color] -trait-name-Muted = Muted -trait-description-Muted = You can't speak +trait-lightweight-name = Lightweight Drunk +trait-lightweight-desc = Alcohol has a stronger effect on you -trait-name-Paracusia = Paracusia -trait-description-Paracusia = You hear sounds that aren't really there +trait-muted-name = Muted +trait-muted-desc = You can't speak -trait-name-PirateAccent = Pirate Accent -trait-description-PirateAccent = You can't stop speaking like a pirate! +trait-paracusia-name = Paracusia +trait-paracusia-desc = You hear sounds that aren't really there -trait-name-Accentless = Accentless -trait-description-Accentless = You don't have the accent that your species would usually have +trait-pirate-accent-name = Pirate Accent +trait-pirate-accent-desc = You can't stop speaking like a pirate! -trait-name-FrontalLisp = Frontal Lisp -trait-description-FrontalLisp = You thpeak with a lithp +trait-accentless-name = Accentless +trait-accentless-desc = You don't have the accent that your species would usually have -trait-name-SocialAnxiety = Social Anxiety -trait-description-SocialAnxiety = You are anxious when you speak and stutter. +trait-frontal-lisp-name = Frontal Lisp +trait-frontal-lisp-desc = You thpeak with a lithp trait-socialanxiety-name = Social Anxiety trait-socialanxiety-desc = You are anxious when you speak and stutter. - -trait-name-Snoring = Snoring -trait-description-Snoring = You will snore while sleeping. diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml index bd1ad12a326..9118692a082 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml @@ -15,7 +15,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpy - type: marking @@ -32,7 +32,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: classicharpy - type: marking @@ -49,7 +49,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpyfolded - type: marking @@ -66,7 +66,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_ears.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi state: harpy_ears_default - type: marking @@ -83,7 +83,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi state: phoenix_tail - type: marking @@ -99,7 +99,7 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi state: rooster_tail @@ -116,26 +116,8 @@ fallbackTypes: - !type:SimpleColoring sprites: - - sprite: Mobs/Customization/Harpy/harpy_tails36x36.rsi - state: finch_tail - -- type: marking - id: HarpyTailPeacock - bodyPart: Tail - markingCategory: Tail - speciesRestriction: [Harpy] - coloring: - default: - type: - !type:CategoryColoring - category: Hair - fallbackTypes: - - !type:SimpleColoring - sprites: - - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi - state: peacock_tail_feathers - - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi - state: peacock_tail_eyes + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi + state: finch_tail - type: marking id: HarpyWing2ToneClassic @@ -143,9 +125,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone1 - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpy2tone2 - type: marking @@ -154,11 +136,11 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone1 - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone2 - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpy3tone3 - type: marking @@ -167,9 +149,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled1 - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpyspeckled2 - type: marking @@ -178,9 +160,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone1 - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpyundertone2 - type: marking @@ -189,9 +171,9 @@ markingCategory: Arms speciesRestriction: [Harpy] sprites: - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip1 - - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip2 - type: marking @@ -208,9 +190,9 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi state: upper - - sprite: Mobs/Customization/Harpy/harpy_chest.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi state: lower - type: marking @@ -227,7 +209,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi state: thighs - type: marking @@ -241,7 +223,7 @@ - !type:SimpleColoring color: "#964b00" sprites: - - sprite: Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi state: feet - - sprite: Mobs/Customization/Harpy/harpy_legs.rsi + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi state: talons diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index 0ddce8b0e65..a4498299c9a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -54,6 +54,7 @@ visible: false - map: [ "id" ] - map: [ "gloves" ] + - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] @@ -121,25 +122,12 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.5 baseSprintSpeed: 5.0 - - type: Inventory + - type: Inventory speciesId: harpy templateId: digitigrade - type: HarpyVisuals - type: UltraVision - - type: Tag - tags: - - CanPilot - - FootstepSound - - DoorBumpOpener - - ShoesRequiredStepTriggerImmune - - type: LanguageSpeaker - speaks: - - GalacticCommon - - SolCommon - understands: - - GalacticCommon - - SolCommon - + - type: entity save: false name: Urist McHands @@ -150,9 +138,8 @@ components: - type: HumanoidAppearance species: Harpy - - type: Inventory + - type: Inventory speciesId: harpy - templateId: digitigrade - type: Sprite scale: 0.9, 0.9 layers: @@ -173,6 +160,7 @@ - map: ["enum.HumanoidVisualLayers.RHand"] - map: [ "id" ] - map: [ "gloves" ] + - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] diff --git a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml index fc7dbda9321..158541571aa 100644 --- a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml +++ b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml @@ -1,6 +1,13 @@ - type: inventoryTemplate id: digitigrade slots: + - name: shoes + slotTexture: shoes + slotFlags: FEET + stripTime: 3 + uiWindowPos: 1,0 + strippingWindowPos: 1,3 + displayName: Shoes - name: jumpsuit slotTexture: uniform slotFlags: INNERCLOTHING diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml index d1980bc23ad..c361d1b51d8 100644 --- a/Resources/Prototypes/DeltaV/Traits/altvision.yml +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -1,13 +1,13 @@ - type: trait id: UltraVision - category: Visual - points: -1 + name: trait-ultravision-name + description: trait-ultravision-desc components: - type: UltraVision - type: trait id: DogVision - category: Visual - points: -1 + name: trait-deuteranopia-name + description: trait-deuteranopia-desc components: - type: DogVision diff --git a/Resources/Prototypes/DeltaV/Traits/neutral.yml b/Resources/Prototypes/DeltaV/Traits/neutral.yml index 6168d7045a9..79a6771a362 100644 --- a/Resources/Prototypes/DeltaV/Traits/neutral.yml +++ b/Resources/Prototypes/DeltaV/Traits/neutral.yml @@ -1,6 +1,7 @@ - type: trait id: ScottishAccent - category: Speech - points: 0 + name: trait-scottish-accent-name + description: trait-scottish-accent-desc + traitGear: BagpipeInstrument components: - - type: ScottishAccent + - type: ScottishAccent \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 93e19a829da..378b3f8a9d8 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -61,7 +61,6 @@ - type: Tag tags: - VimPilot - - type: RandomBark - type: entity name: bee @@ -130,13 +129,6 @@ - ReagentId: GroundBee Quantity: 5 - type: ZombieImmune - - type: RandomBark - barks: - - Bzzzzz - - Bzzz bzzz - - Bzzzzzzzzzzzz - - Bzz - barkMultiplier: 1.5 - type: entity name: bee @@ -244,7 +236,6 @@ - type: NpcFactionMember factions: - Passive - - type: RandomBark - type: entity parent: MobChicken @@ -617,8 +608,6 @@ - type: NpcFactionMember factions: - Passive - - type: RandomBark - barkMultiplier: 0.7 - type: entity name: white duck #Quack @@ -798,16 +787,6 @@ - type: GuideHelp guides: - Chef - - type: RandomBark - barks: - - Mooooooo - - Moo - - Huff - - Mooooooooooo - - Moooooo - - Moooo - barkMultiplier: 3 - - type: entity name: crab @@ -873,12 +852,6 @@ task: RuminantCompound - type: Body prototype: AnimalHemocyanin - - type: RandomBark - barks: - - click clack - - clack - - clickity clack - - clack clack - type: entity name: goat @@ -1473,8 +1446,6 @@ makeSentient: true name: ghost-role-information-kobold-name description: ghost-role-information-kobold-description - - type: RandomBark - barkMultiplier: 0.65 - type: entity name: guidebook monkey @@ -1634,8 +1605,6 @@ - type: BadFood - type: NonSpreaderZombie - type: PreventSpiller - - type: RandomBark - barkMultiplier: 0.3 - type: entity parent: MobMouse @@ -1871,18 +1840,6 @@ - type: Tag tags: - VimPilot - - type: RandomBark - barkMultiplier: 1.3 - barks: - - Croooaaaakkk - - Ribbit - - Ribbit - - Ribbit - - Crooaak - - Ribbit - - Ribbit - - Ribbit - - Bibbit # Would be cool to have some functionality for the parrot to be able to sit on stuff - type: entity @@ -1996,10 +1953,6 @@ heatDamage: types: Heat : 0.2 #per second, scales with temperature & other constants - - type: RandomBark - barks: - - Wank - barkMultiplier: 0.6 - type: entity name: grenade penguin @@ -2115,14 +2068,6 @@ - type: Damageable damageContainer: Biological damageModifierSet: Scale - - type: RandomBark - barkMultiplier: 1.5 - barks: - - Hsssssss - - Hss - - Hsssss - - Hisss - - Hshsss # Code unique spider prototypes or combine them all into one spider and get a # random sprite state when you spawn it. @@ -2247,7 +2192,6 @@ groups: Brute: -0.07 Burn: -0.07 - - type: RandomBark - type: entity name: tarantula @@ -2592,7 +2536,6 @@ - type: Tag tags: - VimPilot - - type: RandomBark - type: entity name: corrupted corgi @@ -2749,7 +2692,6 @@ - type: Tag tags: - VimPilot - - type: RandomBark - type: entity name: calico cat @@ -2938,10 +2880,6 @@ - type: Tag tags: - VimPilot - - type: RandomBark - barkMultiplier: 10 - barks: - - Sloth - type: entity name: ferret @@ -3138,8 +3076,6 @@ - type: MobPrice price: 60 - type: NonSpreaderZombie - - type: RandomBark - barkMultiplier: 0.45 - type: entity name: pig @@ -3300,4 +3236,3 @@ components: - type: ReplacementAccent accent: nymph - - type: RandomBark diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 274765a1931..9981bb8bd92 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -307,8 +307,6 @@ - VimPilot - type: StealTarget stealGroup: AnimalMcGriff - - type: RandomBark - barkMultiplier: 1.3 - type: entity name: Paperwork @@ -408,8 +406,6 @@ - VimPilot - type: StealTarget stealGroup: AnimalWalter - - type: RandomBark - barkMultiplier: 1.1 - type: entity name: Morty diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 8e84f46a693..12ea40b1e3c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -104,4 +104,3 @@ - type: MobPrice price: 150 - type: FloatingVisuals - - type: Speech diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index c1a5d9a1bfd..58457ebb7fa 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -255,19 +255,6 @@ components: - type: NukeCodePaper -- type: entity - parent: Paper - id: StationGoalPaper - name: station goal - description: It looks like you have a lot of work to do. - components: - - type: Paper - stampState: paper_stamp-centcom - stampedBy: - - stampedName: stamp-component-stamped-name-centcom - stampedColor: "#bb3232" - - - type: entity name: pen parent: BaseItem diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml index 93621bc3a28..f85e93b893f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml @@ -22,7 +22,6 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg - fireOnDropChance: 1 - type: AmmoCounter - type: Appearance - type: GenericVisualizer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index bf0c51849a3..202604b8bf0 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -18,7 +18,6 @@ selectedMode: SemiAuto availableModes: - SemiAuto - fireOnDropChance: 0.15 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg - type: Battery diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 410664e46e4..16cacb79dfa 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -99,15 +99,6 @@ containers: gun_magazine: !type:ContainerSlot gun_chamber: !type:ContainerSlot - - type: Gun - fireRate: 6 - selectedMode: SemiAuto - availableModes: - - SemiAuto - - FullAuto - soundGunshot: - path: /Audio/Weapons/Guns/Gunshots/pistol.ogg - fireOnDropChance: 0.3 - type: entity name: cobra @@ -134,7 +125,6 @@ volume: -14 availableModes: - SemiAuto - fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -179,7 +169,6 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg - fireOnDropChance: 0.5 - type: entity id: WeaponPistolMk58Nonlethal @@ -209,7 +198,7 @@ name: N1984 parent: BaseWeaponPistol id: WeaponPistolN1984 # the spaces in description are for formatting. - description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. + description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/N1984.rsi @@ -230,7 +219,6 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg - fireOnDropChance: 0.6 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml index c5237cdad9a..bd043c997da 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml @@ -29,7 +29,6 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/revolver.ogg - fireOnDropChance: 0.5 - type: UseDelay delay: 0.66 - type: ContainerContainer @@ -128,7 +127,6 @@ path: /Audio/Weapons/Guns/Gunshots/revolver.ogg params: volume: 2.25 - fireOnDropChance: 0.3 - type: entity name: Python @@ -157,7 +155,6 @@ sprite: Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi - type: Gun fireRate: 1 - fireOnDropChance: 1 - type: ContainerContainer containers: revolver-ammo: !type:Container diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index c55b2b6b091..5bc8125ebaa 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -67,7 +67,6 @@ fireRate: 5 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/rifle2.ogg - fireOnDropChance: 0.5 - type: ChamberMagazineAmmoProvider soundRack: path: /Audio/Weapons/Guns/Cock/ltrifle_cock.ogg @@ -160,7 +159,6 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/ltrifle.ogg - fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 2dfc833badf..b693bdba370 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -72,7 +72,6 @@ fireRate: 10 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/atreides.ogg - fireOnDropChance: 0.3 - type: MagazineVisuals magState: mag steps: 1 @@ -97,7 +96,6 @@ - type: Gun soundGunshot: path: /Audio/Weapons/Guns/Gunshots/c-20r.ogg - fireOnDropChance: 0.3 - type: ChamberMagazineAmmoProvider autoEject: true - type: MagazineVisuals @@ -128,7 +126,6 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto - fireOnDropChance: 0.2 - type: ItemSlots slots: gun_magazine: @@ -176,7 +173,6 @@ path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - FullAuto - fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: @@ -229,7 +225,6 @@ selectedMode: FullAuto availableModes: - FullAuto - fireOnDropChance: 0.1 - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 52b05b6d60b..a8d9f539917 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -28,7 +28,6 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg - fireOnDropChance: 0.2 - type: BallisticAmmoProvider whitelist: tags: @@ -76,7 +75,6 @@ path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg - fireOnDropChance: 0.3 - type: ItemSlots slots: gun_magazine: @@ -117,7 +115,6 @@ heldPrefix: db - type: Gun fireRate: 2 - fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -193,7 +190,6 @@ heldPrefix: sawn - type: Gun fireRate: 4 - fireOnDropChance: 0.5 - type: BallisticAmmoProvider capacity: 2 - type: Construction @@ -230,7 +226,6 @@ sprite: Objects/Weapons/Guns/Shotguns/hm_pistol.rsi - type: Gun fireRate: 4 - fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: Construction @@ -255,7 +250,6 @@ sprite: Objects/Weapons/Guns/Shotguns/blunderbuss.rsi - type: Gun fireRate: 2 - fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 - type: StaticPrice @@ -279,7 +273,6 @@ heldPrefix: improvised - type: Gun fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways. - fireOnDropChance: 1 - type: BallisticAmmoProvider capacity: 1 proto: null diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index adb8e323f4a..c97459629cf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -46,14 +46,6 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi - - type: Gun - fireRate: 0.75 - selectedMode: SemiAuto - availableModes: - - SemiAuto - soundGunshot: - path: /Audio/Weapons/Guns/Gunshots/sniper.ogg - fireOnDropChance: 1 - type: entity name: Hristov @@ -90,7 +82,6 @@ selectedMode: SemiAuto availableModes: - SemiAuto - fireOnDropChance: 1 - type: UseDelayOnShoot - type: UseDelay delay: 8 #it's a musket @@ -120,7 +111,6 @@ - type: Gun minAngle: 0 maxAngle: 30 #miss him entirely because the barrel is smoothbore - fireOnDropChance: 1 - type: Item size: Small storedRotation: 90 diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml index cd4a22b7909..af15034257b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml @@ -108,7 +108,5 @@ - type: FaxMachine name: "Captain's Office" receiveNukeCodes: true - receiveStationGoal: true - type: StealTarget stealGroup: FaxMachineCaptain - diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 00ad5f54ea9..6812ca14f70 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -418,9 +418,9 @@ noSpawn: true components: - type: StationEvent - earliestStart: 60 - weight: 3 - minimumPlayers: 20 + earliestStart: 60 # DeltaV - was 45 + weight: 3 # DeltaV - was 5 + minimumPlayers: 10 reoccurrenceDelay: 30 duration: 1 - type: LoneOpsSpawnRule diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml index d8849472ff4..05f51baf1c5 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -28,7 +28,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -40,7 +40,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -52,7 +52,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -63,7 +63,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -74,7 +74,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -85,7 +85,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -96,7 +96,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -107,7 +107,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -118,7 +118,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -130,7 +130,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: @@ -141,7 +141,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Captain items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml index c4905591124..e184e0a60a6 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefEngineer items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefEngineer items: @@ -27,7 +27,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefEngineer items: @@ -39,7 +39,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefEngineer items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml index c75c871b011..32e1a6e43eb 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefMedicalOfficer items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefMedicalOfficer items: @@ -27,7 +27,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefMedicalOfficer items: @@ -38,7 +38,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefMedicalOfficer items: @@ -49,7 +49,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefMedicalOfficer items: @@ -61,7 +61,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ChiefMedicalOfficer items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml index 3d3799c0adf..f4a583e39a4 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -28,7 +28,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -40,7 +40,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -52,7 +52,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -63,7 +63,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -74,7 +74,7 @@ category: Jobs cost: 4 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -85,7 +85,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: @@ -97,7 +97,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfPersonnel items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml index 4f0d785b14d..60c6bbdb00c 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -28,7 +28,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -40,7 +40,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -52,7 +52,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -64,7 +64,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -76,7 +76,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -88,7 +88,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -100,7 +100,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -112,7 +112,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -123,7 +123,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -134,7 +134,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -145,7 +145,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -156,7 +156,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: @@ -168,7 +168,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - HeadOfSecurity items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml index 3359d8f5d74..802bc65de59 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml @@ -5,7 +5,7 @@ # cost: 2 # exclusive: true # requirements: -# - !type:CharacterJobRequirement +# - !type:LoadoutJobRequirement # jobs: # - Quartermaster # items: @@ -17,7 +17,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Quartermaster items: @@ -29,7 +29,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Quartermaster items: @@ -41,7 +41,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Quartermaster items: @@ -52,7 +52,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Quartermaster items: @@ -64,7 +64,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Quartermaster items: diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml index 87cb0db1790..cf24ffd8525 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ResearchDirector items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ResearchDirector items: @@ -27,7 +27,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ResearchDirector items: @@ -38,7 +38,7 @@ category: Jobs cost: 2 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ResearchDirector items: @@ -50,7 +50,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - ResearchDirector items: diff --git a/Resources/Prototypes/Loadouts/Jobs/cargo.yml b/Resources/Prototypes/Loadouts/Jobs/cargo.yml index 87463862010..fe835d6823c 100644 --- a/Resources/Prototypes/Loadouts/Jobs/cargo.yml +++ b/Resources/Prototypes/Loadouts/Jobs/cargo.yml @@ -4,10 +4,10 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - SalvageSpecialist - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobSalvageSpecialist min: 36000 # 10 hours items: diff --git a/Resources/Prototypes/Loadouts/Jobs/engineering.yml b/Resources/Prototypes/Loadouts/Jobs/engineering.yml index 44ef2262bc5..820825e236e 100644 --- a/Resources/Prototypes/Loadouts/Jobs/engineering.yml +++ b/Resources/Prototypes/Loadouts/Jobs/engineering.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer items: @@ -16,7 +16,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer items: @@ -28,16 +28,16 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobAtmosphericTechnician min: 21600 # 6 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobStationEngineer min: 21600 # 6 hours - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Engineering min: 216000 # 60 hours items: @@ -49,16 +49,16 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobAtmosphericTechnician min: 21600 # 6 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobStationEngineer min: 21600 # 6 hours - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Engineering min: 216000 # 60 hours items: @@ -70,7 +70,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - AtmosphericTechnician items: @@ -83,7 +83,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -96,7 +96,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -110,7 +110,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -123,7 +123,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -136,7 +136,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -149,7 +149,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - AtmosphericTechnician @@ -162,7 +162,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - StationEngineer - AtmosphericTechnician diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index 0a010a52f87..429732cf1e4 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -4,7 +4,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Paramedic @@ -20,7 +20,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Chemist @@ -33,7 +33,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - ChiefMedicalOfficer @@ -47,7 +47,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Chemist @@ -62,7 +62,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Chemist @@ -77,7 +77,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Chemist @@ -180,7 +180,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Chemist items: @@ -191,7 +191,7 @@ category: Jobs exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Chemist items: @@ -203,7 +203,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Paramedic items: @@ -215,7 +215,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Paramedic items: @@ -227,19 +227,19 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Chemist - Paramedic - ChiefMedicalOfficer - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobMedicalDoctor min: 21600 # 6 hours - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Medical min: 216000 # 60 hours items: @@ -251,19 +251,19 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Chemist - Paramedic - ChiefMedicalOfficer - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobMedicalDoctor min: 21600 # 6 hours - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Medical min: 216000 # 60 hours items: @@ -275,7 +275,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor items: @@ -287,19 +287,19 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - MedicalDoctor - Chemist - Paramedic - ChiefMedicalOfficer - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobChemist min: 21600 # 6 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobMedicalDoctor min: 21600 # 6 hours - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Medical min: 216000 # 60 hours items: diff --git a/Resources/Prototypes/Loadouts/Jobs/science.yml b/Resources/Prototypes/Loadouts/Jobs/science.yml index 406c3dd1166..c4e1755f8b8 100644 --- a/Resources/Prototypes/Loadouts/Jobs/science.yml +++ b/Resources/Prototypes/Loadouts/Jobs/science.yml @@ -4,10 +4,10 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Scientist - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Epistemics min: 216000 # 60 hours items: @@ -19,10 +19,10 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Scientist - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Epistemics min: 216000 # 60 hours items: @@ -34,7 +34,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Scientist - ResearchAssistant @@ -48,7 +48,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Scientist - ResearchAssistant @@ -62,10 +62,10 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Scientist - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Epistemics min: 216000 # 60 hours items: @@ -77,7 +77,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Scientist - ResearchAssistant diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index ca6fe6499d9..67c75d1f74e 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -19,7 +19,7 @@ cost: 1 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - SecurityOfficer - SecurityCadet @@ -61,19 +61,19 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - SecurityOfficer - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobWarden min: 21600 # 6 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobDetective min: 7200 # 2 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobSecurityOfficer min: 21600 # 6 hours - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Security min: 216000 # 60 hours items: @@ -85,19 +85,19 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - SecurityOfficer - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobWarden min: 21600 # 6 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobDetective min: 7200 # 2 hours - - !type:CharacterPlaytimeRequirement + - !type:LoadoutPlaytimeRequirement tracker: JobSecurityOfficer min: 21600 # 6 hours - - !type:CharacterDepartmentTimeRequirement + - !type:LoadoutDepartmentTimeRequirement department: Security min: 216000 # 60 hours items: @@ -211,7 +211,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Warden - HeadOfSecurity @@ -224,7 +224,7 @@ category: Jobs cost: 1 requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Detective - SecurityOfficer diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 31cabcd302e..1eecebec534 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -5,7 +5,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Clown items: @@ -19,7 +19,7 @@ cost: 3 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Clown items: @@ -34,7 +34,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Bartender items: @@ -47,7 +47,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Botanist items: @@ -60,7 +60,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -72,7 +72,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -84,7 +84,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -96,7 +96,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -108,7 +108,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -120,7 +120,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -132,7 +132,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -144,7 +144,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Lawyer items: @@ -156,7 +156,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Reporter items: @@ -169,7 +169,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Reporter items: @@ -181,7 +181,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Reporter items: diff --git a/Resources/Prototypes/Loadouts/categories.yml b/Resources/Prototypes/Loadouts/categories.yml index 7942b4bdf90..f1e8c342948 100644 --- a/Resources/Prototypes/Loadouts/categories.yml +++ b/Resources/Prototypes/Loadouts/categories.yml @@ -1,8 +1,4 @@ -# Alphabetically ordered, except for Uncategorized since it is always first - -- type: loadoutCategory - id: Uncategorized - +# Alphabetically ordered - type: loadoutCategory id: Accessories diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index 1b8e7ab1c34..26e50802fe7 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -4,7 +4,7 @@ cost: 2 exclusive: true requirements: - - !type:CharacterJobRequirement + - !type:LoadoutJobRequirement jobs: - Passenger items: diff --git a/Resources/Prototypes/Objectives/goals.yml b/Resources/Prototypes/Objectives/goals.yml deleted file mode 100644 index 59e35ea8a51..00000000000 --- a/Resources/Prototypes/Objectives/goals.yml +++ /dev/null @@ -1,87 +0,0 @@ -- type: stationGoal - id: Area - -- type: stationGoal - id: Anomalies - -- type: stationGoal - id: Artifacts - -- type: stationGoal - id: BureaucraticError - -- type: stationGoal - id: Combat - -- type: stationGoal - id: Labor - -- type: stationGoal - id: Lectures - -- type: stationGoal - id: Museum - -- type: stationGoal - id: Shuttle - -- type: stationGoal - id: Singularity - -- type: stationGoal - id: SolarPanels - -- type: stationGoal - id: Storage - -- type: stationGoal - id: Xeno - -- type: stationGoal - id: Zoo - - -- type: weightedRandom - id: StationGoals - weights: - StationGoalDepartment: 1 - StationGoalPower: 1 - StationGoalStation: 1 - - -- type: weightedRandom - id: StationGoalDepartment - weights: - StationGoalScience: 1 - StationGoalSecurity: 1 - - -- type: weightedRandom - id: StationGoalPower - weights: - Singularity: 1 - SolarPanels: 1 - -- type: weightedRandom - id: StationGoalScience - weights: - Anomalies: 1 - Artifacts: 1 - Xeno: 1 - -- type: weightedRandom - id: StationGoalSecurity - weights: - Combat: 1 - -- type: weightedRandom - id: StationGoalStation - weights: - Area: 1 - BureaucraticError: 1 - Labor: 1 - Lectures: 1 - Museum: 1 - Shuttle: 1 - Storage: 1 - Zoo: 1 diff --git a/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml b/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml index b7aa00353c8..25aa23a5afc 100644 --- a/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml +++ b/Resources/Prototypes/SimpleStation14/Traits/disabilities.yml @@ -1,12 +1,11 @@ - type: trait id: Nearsighted - category: Visual - points: 1 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-nearsighted-name + description: You require glasses to see properly. + traitGear: ClothingEyesGlasses components: - type: Nearsighted + whitelist: # Delta V fix to borgs spawning with it. + components: + - Blindable + diff --git a/Resources/Prototypes/Traits/categories.yml b/Resources/Prototypes/Traits/categories.yml deleted file mode 100644 index ba3fd7b3456..00000000000 --- a/Resources/Prototypes/Traits/categories.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Alphabetically ordered, except for Uncategorized since it is always first - -- type: traitCategory - id: Uncategorized - -- type: traitCategory - id: Auditory - -- type: traitCategory - id: Mental - -- type: traitCategory - id: Physical - -- type: traitCategory - id: Speech - -- type: traitCategory - id: Visual diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index eb96d37e01a..064b34adbaf 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -1,26 +1,18 @@ - type: trait id: Blindness - category: Visual - points: 2 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-blindness-name + description: trait-blindness-desc + traitGear: WhiteCane + whitelist: + components: + - Blindable components: - type: PermanentBlindness - type: trait id: Narcolepsy - category: Mental - points: 1 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-narcolepsy-name + description: trait-narcolepsy-desc components: - type: Narcolepsy timeBetweenIncidents: 300, 600 @@ -28,15 +20,15 @@ - type: trait id: Pacifist - category: Mental - points: 3 + name: trait-pacifist-name + description: trait-pacifist-desc components: - type: Pacified - type: trait id: Paracusia - category: Auditory - points: 1 + name: trait-paracusia-name + description: trait-paracusia-desc components: - type: Paracusia minTimeBetweenIncidents: 0.1 @@ -47,50 +39,24 @@ - type: trait id: Muted - category: Speech - points: 1 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-muted-name + description: trait-muted-desc + blacklist: + components: + - BorgChassis components: - type: Muted - type: trait id: Uncloneable - category: Physical - points: 2 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-uncloneable-name + description: trait-uncloneable-desc components: - type: Uncloneable - type: trait id: FrontalLisp - category: Speech - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-frontal-lisp-name + description: trait-frontal-lisp-desc components: - type: FrontalLisp - -- type: trait - id: Snoring - category: Auditory - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg - components: - - type: Snoring diff --git a/Resources/Prototypes/Traits/inconveniences.yml b/Resources/Prototypes/Traits/inconveniences.yml index dcf53d9ab7f..657781d1b59 100644 --- a/Resources/Prototypes/Traits/inconveniences.yml +++ b/Resources/Prototypes/Traits/inconveniences.yml @@ -1,25 +1,15 @@ - type: trait id: LightweightDrunk - category: Physical - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-lightweight-name + description: trait-lightweight-desc components: - type: LightweightDrunk boozeStrengthMultiplier: 2 - type: trait id: SocialAnxiety - category: Mental - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-socialanxiety-name + description: trait-socialanxiety-desc components: - type: StutteringAccent matchRandomProb: 0.1 diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index 3a3dc943cd7..9e7f7655076 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -1,23 +1,18 @@ - type: trait id: PirateAccent - category: Speech + name: trait-pirate-accent-name + description: trait-pirate-accent-desc components: - type: PirateAccent - type: trait id: Accentless - category: Speech - points: -1 - requirements: - - !type:CharacterJobRequirement - inverted: true - jobs: - - Borg - - MedicalBorg + name: trait-accentless-name + description: trait-accentless-desc components: - - type: Accentless - removes: - - type: LizardAccent - - type: MothAccent - - type: ReplacementAccent - accent: dwarf + - type: Accentless + removes: + - type: LizardAccent + - type: MothAccent + - type: ReplacementAccent + accent: dwarf diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/finch_tail.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_tails36x36.rsi/meta.json rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wingcover.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json rename to Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json deleted file mode 100644 index 2961db3707d..00000000000 --- a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/meta.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Peacock by stillxicarus (Discord)", - "size": { - "x": 48, - "y": 48 - }, - "states": [ - { - "name": "peacock_tail_feathers", - "directions": 4 - }, - { - "name": "peacock_tail_eyes", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_eyes.png deleted file mode 100644 index 71af693afd78b3c3a6c81ca03fc2f9db5913e590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 772 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!Wi-X*q7}lMWc?smOq&xaLGB9lH z=l+w(3gjyW_=LDtRW-hRc_J~f)7Q5xIl1%y|NjRL)R&hxZQ4}w>eVTrswZhYEkKI9 zB*-rqC<_G)UjB@qfWn*w9+AZi419+`m{C;2tAT-mDb&-&F(kwJ?aYg1hZQ*5k~e10 z{$Brpago!NU2e0xW%tk3W#hDWniRY{_rH<%g404TKGm}><1}Z=edpY|?DrC%?a|r+ ziTh6)CY;Y=;b(Y|{LP=f6PN*cE&-(I*n^FCEgYD{zpYy*y3!b(03e(!E zKL`01i1hql(XgD6?f9(?EOWQBzM3eNHgmzM_EX0vel@o(`2AOc=Uq`{@2{S%a=%h`o2b+9s8C>H zpx0*yEwdB-39}Z23B0Y`x5Z?^jjt+SxTNGfYPsrC93*qJxYysE%nl!b?@pzv*U&iA`jFQoxf?#_u}_@Wt{T0h^_`Kmq5-Qe-3bVZ$zPv?|c7GX8cfPYi| zF5rmun;0aqnJMW_X<*)qO$>Wd3>w3)UDTFXBJC*Z#k%g2a+7tPH~ z8~6Kli1^Msdz2|;NuW<-AJbu7wHyIefqy3r9y)gaUz_lS%i`Mur58n?E#mK{Sn_>b rcXDyRWMReq*qBB78xS7c@P5B*c|60ulNK9*sgA+Z)z4*}Q$iB}zuHxD diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails48x48.rsi/peacock_tail_feathers.png deleted file mode 100644 index d56b093d6ca8a5584adf01c6e4e1d6aeca3c48ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1669 zcmV;027394P)Px#1ZP1_K>z@;j|==^1poj5Fi=cXMd|6tqoZ=bz<>Y$|LW?>va)pD-K~$0cTG)( zVPT1SdV#O6bBBj|V`GVTcY*)_02e%JDgXcg5Oh*bQ~&?}|NsC0|NsC0|NsC00N^8C z82|tP32;bRa{vGi!vFvd!vV){sAK>D1;R;0K~!i%?U;>{<0uS-L0}Aw9p3+K?-R!V z-t&wzTUT|J-kk(+TaAQJY)tvf_z2wMKNI*h;XfI&?fbj<V&TN zX92Zr#EV|h_8lr`n$Q*hBp{uBIBwy)yZ52;=Luc#j{?DkQhHCz_pSG@m>BbfF8Esk zbx;DIQOOb+3EH}Fykg-m6T0AU1ausF7fP!AR6@rs?aCP|f1c14erbGk6Vlyuz{Dr)qluDwijhP!vLFZkDj*VZtyaYi zETM=pm9iZwUwuFUvzigu*ZJ@Hi+~Nd8S^n;B*!Er9CejXVAMsXp14iOC=C|Lz2mR3 z#Z$?uyw`A3GX(`b!ZQTYXaB>P#@ z((^})b*SSjf3avpLhdhO-7}+85-ofiT_&UYgo4Q~l2;<+dSlH3*yX>bLG5lqk}xZ4GI|5E(?9K<)WWz!{6v zNvCx{bP0#;p`gxu?2@H*UZc}I<|@1 zH;mPvG`&7hL@i}ii!lAH#ut7QAh9Lt*y}ZUP_M`F_0l#~V86zVAG??GaXRIsU+`ZY z;~V}gkO^DrUJ_%j9#oYv$0)BZ5%9eOdp_J4_2Y^^3zR&J8j^fi18!k_INJX{e-UV? zQ(3U@UE!906!>*~1a9#WxWz}{79W9I{LcjTPY#c2{jSyu)K>e0tSWlK=&Th%D{73 z>&^l`pdfa71%C^J73>E+A5lyKJa4lwA?EV~){l`hFHwdUh}rb?Ik3cm_uH^$@Dn&a z^val$VJ{FmO(LXS8+iz$5>eBr(_F113h8(n7Q7>g53d?O0`DbGt+2wO9T2wpnqa!2 zZiTn@v+m&_QHBnK(@^`8&J@#SJx!~}e9thQMD@8EYx8UZ#dz{6>w#Es7q5cfLUej0 z7=%>xele^cI_2J*RK#*wPv4$FkM4q%l8l~lPWd%^ohQ>P{h;AsgL}M#} zLa#?*lv+o%eT*0!B_H#BKmVjH0@ZG>#pIn*p`}c#M4TO%1=Kk%^nG7Mo+?CcttLvp z26`6Y>Okn&Z{F7-nYH*8|ok5T^=iMCu={%a5Dy4XTnavu>e%1H$aYHq;)Fx9{dG-1a9#WxWz}{2BrK1WWU*nv@q8v P00000NkvXXu0mjfjI1Qj From e6e1e46c1976cfeb53c01cb3c02bf4d6902b6541 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 20 Jun 2024 20:09:43 -0400 Subject: [PATCH 69/79] Revert "Merge branch 'master' into Additional-Loadout-Items" This reverts commit 04774ed25f95352d3a171d774a7a6c9d6e15f52b, reversing changes made to ce097f56d46e0d36934addc76d6b86d8b4b3a13a. --- .github/workflows/changelog.yml | 4 +- .github/workflows/prtitlecase.yml | 34 -- .vscode/extensions.json | 8 +- BuildChecker/BuildChecker.csproj | 4 +- BuildChecker/git_helper.py | 110 ++++ BuildChecker/hooks/post-checkout | 13 + BuildChecker/hooks/post-merge | 5 + .../CardboardBox/CardboardBoxSystem.cs | 5 +- .../Cargo/UI/CargoConsoleMenu.xaml.cs | 4 +- .../Construction/ConstructionSystem.cs | 3 +- .../ContextMenu/UI/EntityMenuUIController.cs | 2 +- Content.Client/Gameplay/GameplayState.cs | 8 +- Content.Client/Gameplay/GameplayStateBase.cs | 2 +- Content.Client/Input/ContentContexts.cs | 1 + .../Language/LanguageMenuWindow.xaml | 18 + .../Language/LanguageMenuWindow.xaml.cs | 134 +++++ .../Language/Systems/LanguageSystem.cs | 76 +++ .../Systems/TranslatorImplanterSystem.cs | 8 + Content.Client/NPC/PathfindingSystem.cs | 10 +- .../Cartridges}/GlimmerMonitorUi.cs | 3 +- .../Cartridges}/GlimmerMonitorUiFragment.xaml | 2 +- .../GlimmerMonitorUiFragment.xaml.cs | 4 +- .../Chat}/PsionicChatUpdateSystem.cs | 4 +- .../Glimmer/GlimmerReactiveVisuals.cs | 0 .../Psionics/UI}/AcceptPsionicsEUI.cs | 0 .../Psionics/UI}/AcceptPsionicsWindow.cs | 0 .../UserInterface/GlimmerGraph.cs | 2 +- .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 1 + Content.Client/Popups/PopupOverlay.cs | 11 +- Content.Client/Popups/PopupSystem.cs | 5 + .../Overlays/RadiationPulseOverlay.cs | 5 +- Content.Client/Sandbox/SandboxSystem.cs | 3 +- ...GameScreen.xaml => DefaultGameScreen.xaml} | 4 +- ...reen.xaml.cs => DefaultGameScreen.xaml.cs} | 4 +- .../UserInterface/Screens/ScreenType.cs | 8 +- .../Systems/Chat/ChatUIController.cs | 27 +- .../Systems/Chat/Controls/ChatInputBox.cs | 1 + .../Language/LanguageMenuUIController.cs | 89 ++++ .../MenuBar/GameTopMenuBarUIController.cs | 4 + .../MenuBar/Widgets/GameTopMenuBar.xaml | 10 + .../Systems/Vote/VoteUIController.cs | 6 +- Content.Client/Verbs/VerbSystem.cs | 8 +- .../Tests/Wires/WireLayoutTest.cs | 103 ++++ .../Abilities/Mime/MimePowersSystem.cs | 2 +- .../Administration/Managers/AdminManager.cs | 2 +- .../Systems/AdminVerbSystem.Tools.cs | 16 +- .../Administration/Systems/AdminVerbSystem.cs | 3 +- .../Anomaly/AnomalySystem.Psionics.cs | 4 +- .../Atmos/Components/AirtightComponent.cs | 32 +- .../Components/IgniteOnCollideComponent.cs | 4 +- .../Atmos/EntitySystems/AirtightSystem.cs | 2 - .../AtmosphereSystem.GridAtmosphere.cs | 8 +- .../AtmosphereSystem.HighPressureDelta.cs | 2 +- .../AtmosphereSystem.Monstermos.cs | 2 +- .../AtmosphereSystem.Processing.cs | 2 +- .../EntitySystems/AtmosphereSystem.Utils.cs | 3 +- Content.Server/Atmos/GasMixture.cs | 7 +- Content.Server/Atmos/TileAtmosphere.cs | 3 + .../Bed/Components/SnoringComponent.cs | 10 + Content.Server/Bed/Sleep/SleepingSystem.cs | 5 +- .../Cargo/Components/CargoPalletComponent.cs | 21 +- .../Cargo/Systems/CargoSystem.Orders.cs | 2 +- .../Cargo/Systems/CargoSystem.Shuttle.cs | 15 +- Content.Server/Chat/Systems/ChatSystem.cs | 155 ++++-- .../TypingIndicator/TypingIndicatorSystem.cs | 2 +- .../Chemistry/EntitySystems/VaporSystem.cs | 4 +- .../Chemistry/ReagentEffects/MakeSentient.cs | 20 +- .../Conditions/ComponentInTile.cs | 3 +- .../ConstructionSystem.Initial.cs | 7 +- .../Events/GlimmerMobSpawnRule.cs | 2 +- .../Systems/DeviceNetworkJammerSystem.cs | 38 ++ .../Systems/DeviceNetworkSystem.cs | 11 +- .../Systems/SingletonDeviceNetServerSystem.cs | 5 +- Content.Server/Dragon/DragonSystem.cs | 3 +- .../Ensnaring/EnsnareableSystem.Ensnaring.cs | 4 +- .../EntitySystems/ExplosionSystem.cs | 2 +- .../Explosion/EntitySystems/TriggerSystem.cs | 4 +- .../GameTicking/GameTicker.Spawning.cs | 2 +- .../GameTicking/Rules/PiratesRuleSystem.cs | 4 +- Content.Server/Guardian/GuardianSystem.cs | 3 +- Content.Server/Hands/Systems/HandsSystem.cs | 3 +- .../Implants/SubdermalImplantSystem.cs | 2 +- Content.Server/LandMines/LandMineComponent.cs | 9 +- Content.Server/LandMines/LandMineSystem.cs | 46 +- .../Language/Commands/ListLanguagesCommand.cs | 39 ++ .../Language/Commands/SayLanguageCommand.cs | 53 ++ .../Commands/SelectLanguageCommand.cs | 48 ++ .../Language/DetermineEntityLanguagesEvent.cs | 29 ++ .../Language/LanguageSystem.Networking.cs | 59 +++ Content.Server/Language/LanguageSystem.cs | 289 ++++++++++ .../Language/TranslatorImplanterSystem.cs | 72 +++ Content.Server/Language/TranslatorSystem.cs | 225 ++++++++ Content.Server/Magic/MagicSystem.cs | 2 +- .../Mind/Commands/MakeSentientCommand.cs | 10 + .../CoordinatesInRangePrecondition.cs | 2 +- .../CoordinatesNotInRangePrecondition.cs | 2 +- .../TargetInRangePrecondition.cs | 2 +- .../NPC/Pathfinding/PathfindingSystem.cs | 2 +- .../NPC/Systems/NPCSteeringSystem.Context.cs | 25 +- .../NPC/Systems/NPCUtilitySystem.cs | 5 +- .../Psionics/Abilities/DispelPowerSystem.cs | 31 +- .../Abilities/MetapsionicPowerSystem.cs | 74 +++ .../Psionics/Abilities/MindSwapPowerSystem.cs | 62 +-- .../Abilities/MindSwappedComponent.cs | 5 +- .../Abilities/NoosphericZapPowerSystem.cs | 44 +- .../PsionicInvisibilityPowerSystem.cs | 94 +--- .../PsionicRegenerationPowerSystem.cs | 129 +++++ .../Abilities/PyrokinesisPowerSystem.cs | 66 +++ .../Abilities/TelegnosisPowerSystem.cs | 67 +++ .../Psionics}/PsionicAbilitiesSystem.cs | 89 ++-- .../Audio/GlimmerSoundComponent.cs | 6 +- .../Chat/NyanoChatSystem.cs} | 18 +- .../Chat}/TSayCommand.cs | 3 +- .../Chat}/TelepathicRepeaterComponent.cs | 2 +- .../Chemistry/Effects/ChemRemovePsionic.cs | 2 +- .../BecomePsionicConditionComponent.cs | 11 + .../Systems/BecomePsionicConditionSystem.cs | 32 ++ .../Psionics/AcceptPsionicsEui.cs | 2 +- .../Psionics/AntiPsychicWeaponComponent.cs | 0 .../Psionics/Dreams/DreamSystem.cs | 3 + .../Psionics/Glimmer/GlimmerCommands.cs | 0 .../Psionics/Glimmer/GlimmerReactiveSystem.cs | 5 +- .../Glimmer/PassiveGlimmerReductionSystem.cs | 2 + .../Structures/GlimmerSourceComponent.cs | 0 .../Structures/GlimmerStructuresSystem.cs | 0 .../Invisibility/PsionicInvisibilitySystem.cs | 25 +- .../PsionicInvisibleContactsComponent.cs | 1 + .../PsionicInvisibleContactsSystem.cs | 2 + .../PsionicallyInvisibleComponent.cs | 0 .../Psionics/PotentialPsionicComponent.cs | 14 + .../PsionicAwaitingPlayerComponent.cs | 0 .../Psionics/PsionicBonusChanceComponent.cs | 0 .../Psionics/PsionicsCommands.cs | 6 +- .../Psionics/PsionicsSystem.cs | 23 +- .../Research/Oracle/OracleSystem.cs | 2 +- .../SophicScribe/SophicScribeSystem.cs | 2 +- .../Events/GlimmerWispSpawnRule.cs | 2 +- .../StationEvents/Events/MassMindSwapRule.cs | 5 +- .../StationEvents/Events/NoosphericFryRule.cs | 2 +- .../Events/NoosphericStormRule.cs | 4 +- .../StationEvents/Events/NoosphericZapRule.cs | 2 +- .../Events/PsionicCatGotYourTongueRule.cs | 2 +- .../Pointing/EntitySystems/PointingSystem.cs | 10 +- .../EntitySystems/PowerReceiverSystem.cs | 17 +- .../Abilities/MetapsionicPowerSystem.cs | 188 ------- .../PsionicRegenerationPowerSystem.cs | 179 ------- .../Abilities/PyrokinesisPowerSystem.cs | 93 ---- .../RegenerativeStasisPowerSystem.cs | 76 --- .../Abilities/TelegnosisPowerSystem.cs | 106 ---- .../Psionics/PotentialPsionicComponent.cs | 21 - .../Radio/EntitySystems/HeadsetSystem.cs | 16 +- .../Radio/EntitySystems/JammerSystem.cs | 17 + .../Radio/EntitySystems/RadioDeviceSystem.cs | 5 +- .../Radio/EntitySystems/RadioSystem.cs | 66 ++- Content.Server/Radio/RadioEvent.cs | 14 +- Content.Server/Remotes/DoorRemoteSystem.cs | 3 +- .../Respawn/SpecialRespawnSystem.cs | 5 +- .../EntitySystems/EventHorizonSystem.cs | 4 +- .../EntitySystems/GravityWellSystem.cs | 8 +- .../SingularityAttractorSystem.cs | 11 +- .../Speech/EntitySystems/ListeningSystem.cs | 7 +- .../EntitySystems/BluespaceLockerSystem.cs | 3 +- .../Store/Systems/StoreSystem.Ui.cs | 9 +- .../Tabletop/TabletopSystem.Session.cs | 2 +- Content.Server/Tiles/LavaSystem.cs | 4 +- Content.Server/Wires/WireLayout.cs | 2 + .../Systems/Carvers/NoiseRangeCarverSystem.cs | 3 +- .../Zombies/ZombieSystem.Transform.cs | 4 +- Content.Shared.Database/LogType.cs | 1 + Content.Shared/Anomaly/SharedAnomalySystem.cs | 2 +- .../Audio/SharedAmbientSoundSystem.cs | 11 +- Content.Shared/CCVar/CCVars.cs | 6 +- Content.Shared/Chasm/ChasmSystem.cs | 4 +- .../Chemistry/Components/InjectorComponent.cs | 14 +- .../Conditions/WallmountCondition.cs | 3 +- .../DeviceNetworkJammerComponent.cs | 24 + Content.Shared/Examine/ExamineSystemShared.cs | 12 +- .../EntitySystems/SharedHandsSystem.Pickup.cs | 2 +- Content.Shared/Input/ContentKeyFunctions.cs | 1 + .../Interaction/SharedInteractionSystem.cs | 6 +- .../Components/LanguageSpeakerComponent.cs | 29 ++ .../TranslatorImplanterComponent.cs | 35 ++ .../Translators/BaseTranslatorComponent.cs | 47 ++ .../HandheldTranslatorComponent.cs | 15 + .../Translators/HoldsTranslatorComponent.cs | 11 + .../ImplantedTranslatorComponent.cs | 9 + .../IntrinsicTranslatorComponent.cs | 10 + .../UniversalLanguageSpeakerComponent.cs | 11 + .../Language/Events/LanguagesSetMessage.cs | 13 + .../Language/Events/LanguagesUpdateEvent.cs | 8 + .../Events/LanguagesUpdatedMessage.cs | 15 + .../Events/RequestLanguagesMessage.cs | 10 + Content.Shared/Language/LanguagePrototype.cs | 37 ++ .../Language/Systems/SharedLanguageSystem.cs | 39 ++ .../SharedTranslatorImplanterSystem.cs | 36 ++ .../Systems/SharedTranslatorSystem.cs | 34 ++ .../MovementSpeedModifierComponent.cs | 2 +- .../Abilities/AcceptPsionicsEuiMessage.cs | 0 .../Dispel/DamageOnDispelComponent.cs | 4 +- .../Abilities/Dispel/DispelPowerComponent.cs | 8 +- .../Abilities/Dispel/DispellableComponent.cs | 2 +- .../MassSleep/MassSleepPowerComponent.cs | 18 + .../MassSleep/MassSleepPowerSystem.cs | 59 +++ .../Metapsionics/MetapsionicPowerComponent.cs | 21 + .../MindSwap/MindSwapPowerComponent.cs | 5 +- .../NoosphericZapPowerComponent.cs | 5 +- .../PsionicInvisibilityPowerComponent.cs | 8 +- .../PsionicInvisibilityUsedComponent.cs | 3 +- .../PsionicRegenerationPowerComponent.cs | 10 +- .../Pyrokinesis/PyrokinesisPowerComponent.cs | 5 +- .../Telegnosis/TelegnosisPowerComponent.cs | 10 +- .../TelegnosticProjectionComponent.cs | 6 + .../ClothingGrantPsionicPowerComponent.cs | 2 +- .../Psionics/Items/HeadCageComponent.cs | 2 +- .../Psionics/Items/HeadCagedComponent.cs | 2 +- .../Psionics/Items/PsionicItemsSystem.cs | 2 +- .../Psionics/Items/TinfoilHatComponent.cs | 2 +- .../Abilities}/Psionics/PsionicComponent.cs | 16 +- .../Psionics/PsionicInsulationComponent.cs | 2 +- .../Psionics/PsionicsDisabledComponent.cs | 2 +- .../Psionics/SharedPsionicAbilitiesSystem.cs | 4 +- .../Events/MassSleepPowerActionEvent.cs | 2 + .../Events/MetapsionicPowerActionEvent.cs | 3 +- .../Events/PyrokinesisPowerActionEvent.cs | 4 +- .../RegenerativeStasisPowerActionEvent.cs | 2 - Content.Shared/Nyanotrasen/Psionics/Events.cs | 28 + .../Psionics/Glimmer/GlimmerSystem.cs | 2 +- .../Glimmer/SharedGlimmerReactiveComponent.cs | 0 .../Glimmer/SharedGlimmerReactiveVisuals.cs | 0 .../Physics/FrictionRemoverSystem.cs | 25 - .../Metapsionics/MetapsionicPowerComponent.cs | 38 -- .../RegenerativeStasisPowerComponent.cs | 20 - .../TelegnosticProjectionComponent.cs | 8 - Content.Shared/Psionics/Events.cs | 64 --- .../Psionics/SharedPsionicSystem.Insulated.cs | 4 - Content.Shared/Slippery/SlipperySystem.cs | 4 +- .../Spawning/EntitySystemExtensions.cs | 2 +- .../Components/StepTriggerComponent.cs | 8 +- .../StepTrigger/Systems/StepTriggerSystem.cs | 41 +- Content.Shared/Store/ListingPrototype.cs | 5 +- .../Systems/SharedGunSystem.Ballistic.cs | 2 +- LEGAL.md | 4 +- README.md | 27 +- RUN_THIS.py | 13 + Resources/Audio/Effects/attributions.yml | 5 - Resources/Audio/Effects/beep_landmine.ogg | Bin 6034 -> 0 bytes .../Audio/Nyanotrasen/heartbeat_fast.ogg | Bin 39983 -> 0 bytes Resources/Changelog/Changelog.yml | 20 +- Resources/Credits/GitHub.txt | 2 +- Resources/Locale/en-US/language/commands.ftl | 8 + .../Locale/en-US/language/language-menu.ftl | 4 + Resources/Locale/en-US/language/languages.ftl | 71 +++ .../Locale/en-US/language/technologies.ftl | 2 + .../Locale/en-US/language/translator.ftl | 8 + .../en-US/nyanotrasen/abilities/psionic.ftl | 18 +- .../nyanotrasen/psionics/psychic-feedback.ftl | 21 - .../Locale/en-US/paper/book-authorbooks.ftl | 8 + .../catalog/cargo/cargoproduct-categories.ftl | 16 + .../Locale/en-US/speech/speech-chatsan.ftl | 3 + Resources/Locale/en-US/traits/traits.ftl | 3 + Resources/Maps/Shuttles/trading_outpost.yml | 263 +++++----- .../Prototypes/Accents/word_replacements.yml | 17 +- Resources/Prototypes/Actions/types.yml | 2 +- .../Prototypes/Catalog/Cargo/cargo_armory.yml | 12 +- .../Catalog/Cargo/cargo_atmospherics.yml | 22 +- .../Prototypes/Catalog/Cargo/cargo_botany.yml | 10 +- .../Prototypes/Catalog/Cargo/cargo_cargo.yml | 4 +- .../Catalog/Cargo/cargo_circuitboards.yml | 2 +- .../Catalog/Cargo/cargo_emergency.yml | 16 +- .../Catalog/Cargo/cargo_engineering.yml | 28 +- .../Catalog/Cargo/cargo_engines.yml | 36 +- .../Prototypes/Catalog/Cargo/cargo_food.yml | 16 +- .../Prototypes/Catalog/Cargo/cargo_fun.yml | 58 +-- .../Catalog/Cargo/cargo_livestock.yml | 46 +- .../Catalog/Cargo/cargo_materials.yml | 22 +- .../Catalog/Cargo/cargo_medical.yml | 30 +- .../Catalog/Cargo/cargo_science.yml | 6 +- .../Catalog/Cargo/cargo_security.yml | 18 +- .../Catalog/Cargo/cargo_service.yml | 38 +- .../Catalog/Cargo/cargo_shuttle.yml | 6 +- .../Catalog/Cargo/cargo_vending.yml | 50 +- .../VendingMachines/Inventories/theater.yml | 1 + .../Prototypes/Catalog/uplink_catalog.yml | 12 +- .../DeltaV/Entities/Mobs/NPCs/animals.yml | 13 +- .../DeltaV/Entities/Mobs/NPCs/familiars.yml | 12 +- .../DeltaV/Entities/Mobs/NPCs/nukiemouse.yml | 10 +- .../DeltaV/Entities/Mobs/Player/harpy.yml | 1 + .../DeltaV/Entities/Mobs/Player/vulpkanin.yml | 1 + .../DeltaV/Entities/Mobs/Species/harpy.yml | 13 +- .../Entities/Mobs/Species/vulpkanin.yml | 7 + .../Entities/Clothing/Head/hats.yml | 5 +- .../Entities/Clothing/Masks/masks.yml | 10 + .../Clothing/OuterClothing/wintercoats.yml | 40 +- .../Entities/Clothing/Shoes/misc.yml | 3 + .../Mobs/Cyborgs/base_borg_chassis.yml | 7 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 129 ++++- .../Entities/Mobs/NPCs/argocyte.yml | 7 +- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 65 ++- .../Entities/Mobs/NPCs/regalrat.yml | 13 + .../Entities/Mobs/NPCs/revenant.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/shadows.yml | 11 +- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 7 + .../Prototypes/Entities/Mobs/NPCs/slimes.yml | 7 +- .../Prototypes/Entities/Mobs/NPCs/space.yml | 23 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 12 + .../Entities/Mobs/Player/arachnid.yml | 1 + .../Prototypes/Entities/Mobs/Player/diona.yml | 1 + .../Prototypes/Entities/Mobs/Player/dwarf.yml | 2 + .../Prototypes/Entities/Mobs/Player/human.yml | 2 + .../Prototypes/Entities/Mobs/Player/moth.yml | 2 + .../Entities/Mobs/Player/observer.yml | 1 + .../Entities/Mobs/Player/replay_observer.yml | 1 + .../Entities/Mobs/Player/reptilian.yml | 2 + .../Prototypes/Entities/Mobs/Player/slime.yml | 2 + .../Prototypes/Entities/Mobs/Species/base.yml | 9 +- .../Entities/Mobs/Species/diona.yml | 7 + .../Entities/Mobs/Species/dwarf.yml | 7 + .../Entities/Mobs/Species/human.yml | 8 + .../Prototypes/Entities/Mobs/Species/moth.yml | 11 +- .../Entities/Mobs/Species/reptilian.yml | 7 + .../Entities/Mobs/Species/slime.yml | 7 + .../Prototypes/Entities/Mobs/Species/vox.yml | 2 + .../reinforcement_teleporter.yml | 2 +- .../Objects/Devices/translator_implants.yml | 132 +++++ .../Entities/Objects/Devices/translators.yml | 205 ++++++++ .../Fun/Instruments/instruments_misc.yml | 3 + .../Instruments/instruments_percussion.yml | 2 + .../Fun/Instruments/instruments_wind.yml | 5 +- .../Prototypes/Entities/Objects/Fun/toys.yml | 3 + .../Entities/Objects/Misc/authorbooks.yml | 14 + .../Entities/Objects/Misc/land_mine.yml | 8 +- .../Objects/Specific/Cargo/cargo_pallet.yml | 31 -- .../Objects/Specific/Janitorial/janitor.yml | 5 - .../Objects/Specific/Medical/healing.yml | 28 +- .../Entities/Objects/Specific/chemistry.yml | 7 + .../Entities/Objects/Specific/syndicate.yml | 4 +- .../Structures/Doors/Airlocks/access.yml | 189 ++++++- .../Doors/Airlocks/base_structureairlocks.yml | 4 - .../Structures/Doors/Airlocks/shuttle.yml | 1 - .../Structures/Doors/Firelocks/firelock.yml | 2 - .../Doors/MaterialDoors/material_doors.yml | 4 - .../Doors/SecretDoor/secret_door.yml | 1 - .../Structures/Doors/Shutter/shutters.yml | 4 - .../Doors/Windoors/base_structurewindoors.yml | 1 - .../Entities/Structures/Furniture/chairs.yml | 14 +- .../Entities/Structures/Machines/lathe.yml | 18 + .../Structures/Machines/vending_machines.yml | 7 + .../Entities/Structures/Windows/window.yml | 4 +- .../Entities/Structures/plastic_flaps.yml | 2 - Resources/Prototypes/Language/languages.yml | 493 ++++++++++++++++++ .../Prototypes/Nyanotrasen/Actions/types.yml | 34 +- .../Markers/Spawners/Random/books.yml | 1 + .../Markers/Spawners/Random/boxes.yml | 8 + .../Markers/Spawners/Random/devices.yml | 34 +- .../Entities/Markers/Spawners/Random/hats.yml | 20 + .../Markers/Spawners/Random/machineparts.yml | 2 +- .../Markers/Spawners/Random/seeds.yml | 3 + .../Nyanotrasen/Entities/Mobs/Player/Oni.yml | 1 + .../Entities/Mobs/Player/felinid.yml | 2 + .../Nyanotrasen/Entities/Mobs/Species/Oni.yml | 7 + .../Entities/Mobs/Species/felinid.yml | 9 + .../Machines/metempsychoticMachine.yml | 3 - .../Entities/Structures/Research/oracle.yml | 3 - .../Structures/Research/sophicscribe.yml | 2 - .../Nyanotrasen/Objectives/traitor.yml | 23 + .../Roles/Jobs/Epistemics/forensicmantis.yml | 15 +- .../Nyanotrasen/Traits/psionics.yml | 6 - .../Prototypes/Nyanotrasen/psionicPowers.yml | 6 +- .../Prototypes/Objectives/objectiveGroups.yml | 1 + .../Graphs/clothing/ducky_slippers.yml | 22 + .../Recipes/Construction/clothing.yml | 11 + .../Prototypes/Recipes/Lathes/language.yml | 190 +++++++ .../Prototypes/Recipes/Reactions/drinks.yml | 6 +- .../Prototypes/Research/civilianservices.yml | 40 ++ .../Roles/Jobs/Science/research_director.yml | 28 +- Resources/Prototypes/Traits/disabilities.yml | 7 + Resources/Prototypes/Wires/layouts.yml | 20 + Resources/Prototypes/tags.yml | 3 + .../ServerInfo/Guidebook/Engineering/TEG.xml | 179 ++++++- .../Guidebook/Science/ArtifactReports.xml | 2 +- .../Clothing/Ears/Headsets/base.rsi/icon.png | Bin 309 -> 387 bytes .../Clothing/Ears/Headsets/base.rsi/meta.json | 2 +- .../Ears/Headsets/base_syndicate.rsi/icon.png | Bin 288 -> 332 bytes .../Headsets/base_syndicate.rsi/meta.json | 2 +- .../Clothing/Ears/Headsets/cargo.rsi/icon.png | Bin 326 -> 402 bytes .../Ears/Headsets/cargo.rsi/icon_alt.png | Bin 516 -> 366 bytes .../Ears/Headsets/cargo.rsi/meta.json | 2 +- .../Ears/Headsets/centcom.rsi/icon.png | Bin 315 -> 307 bytes .../Ears/Headsets/centcom.rsi/icon_alt.png | Bin 469 -> 371 bytes .../Ears/Headsets/centcom.rsi/meta.json | 2 +- .../Ears/Headsets/command.rsi/icon.png | Bin 325 -> 396 bytes .../Ears/Headsets/command.rsi/icon_alt.png | Bin 504 -> 576 bytes .../Ears/Headsets/command.rsi/meta.json | 2 +- .../Ears/Headsets/engineering.rsi/icon.png | Bin 282 -> 405 bytes .../Headsets/engineering.rsi/icon_alt.png | Bin 490 -> 366 bytes .../Ears/Headsets/engineering.rsi/meta.json | 2 +- .../Ears/Headsets/freelance.rsi/icon.png | Bin 799 -> 402 bytes .../Ears/Headsets/freelance.rsi/icon_alt.png | Bin 991 -> 366 bytes .../Ears/Headsets/freelance.rsi/meta.json | 2 +- .../Ears/Headsets/medical.rsi/icon.png | Bin 287 -> 392 bytes .../Ears/Headsets/medical.rsi/icon_alt.png | Bin 469 -> 453 bytes .../Ears/Headsets/medical.rsi/meta.json | 2 +- .../Ears/Headsets/medicalscience.rsi/icon.png | Bin 316 -> 418 bytes .../Headsets/medicalscience.rsi/meta.json | 2 +- .../Ears/Headsets/mining.rsi/icon.png | Bin 396 -> 469 bytes .../Ears/Headsets/mining.rsi/meta.json | 2 +- .../Ears/Headsets/robotics.rsi/icon.png | Bin 296 -> 324 bytes .../Ears/Headsets/robotics.rsi/meta.json | 2 +- .../Ears/Headsets/science.rsi/icon.png | Bin 311 -> 396 bytes .../Ears/Headsets/science.rsi/icon_alt.png | Bin 498 -> 361 bytes .../Ears/Headsets/science.rsi/meta.json | 2 +- .../Ears/Headsets/security.rsi/icon.png | Bin 283 -> 408 bytes .../Ears/Headsets/security.rsi/icon_alt.png | Bin 455 -> 570 bytes .../Ears/Headsets/security.rsi/meta.json | 2 +- .../Ears/Headsets/service.rsi/icon.png | Bin 311 -> 418 bytes .../Ears/Headsets/service.rsi/meta.json | 2 +- .../Headsets/servicesecurity.rsi/icon.png | Bin 294 -> 418 bytes .../Headsets/servicesecurity.rsi/meta.json | 2 +- .../Ears/Headsets/syndicate.rsi/icon_alt.png | Bin 485 -> 515 bytes .../Ears/Headsets/syndicate.rsi/meta.json | 2 +- .../equipped-MASK-reptilian.png | Bin 0 -> 442 bytes .../Mask/neckgaiterred.rsi/equipped-MASK.png | Bin 0 -> 409 bytes .../Clothing/Mask/neckgaiterred.rsi/icon.png | Bin 0 -> 307 bytes .../Mask/neckgaiterred.rsi/inhand-left.png | Bin 0 -> 332 bytes .../Mask/neckgaiterred.rsi/inhand-right.png | Bin 0 -> 349 bytes .../Clothing/Mask/neckgaiterred.rsi/meta.json | 30 ++ .../equipped-OUTERCLOTHING.png | Bin 411 -> 622 bytes .../Armor/bulletproof.rsi/icon.png | Bin 244 -> 236 bytes .../Armor/bulletproof.rsi/meta.json | 2 +- .../Armor/riot.rsi/equipped-OUTERCLOTHING.png | Bin 1562 -> 648 bytes .../OuterClothing/Armor/riot.rsi/icon.png | Bin 293 -> 231 bytes .../OuterClothing/Armor/riot.rsi/meta.json | 4 +- .../security.rsi/equipped-OUTERCLOTHING.png | Bin 343 -> 413 bytes .../OuterClothing/Armor/security.rsi/icon.png | Bin 252 -> 193 bytes .../Armor/security.rsi/meta.json | 2 +- .../equipped-OUTERCLOTHING.png | Bin 428 -> 484 bytes .../Armor/security_slim.rsi/icon.png | Bin 277 -> 195 bytes .../Armor/security_slim.rsi/meta.json | 2 +- .../equipped-OUTERCLOTHING.png | Bin 0 -> 9460 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 10509 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9875 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10492 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9782 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10959 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9936 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10546 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 9675 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10494 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 10740 -> 0 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 8727 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9455 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 8689 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9750 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 8865 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 8433 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9422 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9418 bytes .../icon.png | Bin .../meta.json | 0 .../equipped-OUTERCLOTHING.png | Bin 0 -> 9578 bytes .../icon.png | Bin .../meta.json | 0 .../Ears/Headsets/prisoner.rsi/icon.png | Bin 390 -> 317 bytes .../Ears/Headsets/prisoner.rsi/meta.json | 2 +- .../Headsets/securitymedical.rsi/icon.png | Bin 371 -> 408 bytes .../Headsets/securitymedical.rsi/meta.json | 2 +- .../Ears/Headsets/service.rsi/icon_alt.png | Bin 915 -> 576 bytes .../Ears/Headsets/service.rsi/meta.json | 2 +- .../syndicate_listening.rsi/icon_alt.png | Bin 531 -> 515 bytes .../syndicate_listening.rsi/meta.json | 2 +- Resources/Textures/Interface/language.png | Bin 0 -> 739 bytes .../Devices/communication.rsi/beacon.png | Bin 317 -> 447 bytes .../Devices/communication.rsi/beacon_dead.png | Bin 253 -> 274 bytes .../Devices/communication.rsi/meta.json | 36 +- .../old-radio-inhand-left.png | Bin 215 -> 0 bytes .../old-radio-inhand-right.png | Bin 243 -> 0 bytes .../Devices/communication.rsi/old-radio.png | Bin 401 -> 0 bytes .../communication.rsi/radio-inhand-left.png | Bin 311 -> 215 bytes .../communication.rsi/radio-inhand-right.png | Bin 263 -> 243 bytes .../Devices/communication.rsi/radio.png | Bin 536 -> 1365 bytes .../Devices/communication.rsi/signaller.png | Bin 369 -> 456 bytes .../communication.rsi/walkietalkie-off.png | Bin 290 -> 348 bytes .../communication.rsi/walkietalkie-on.png | Bin 116 -> 207 bytes .../communication.rsi/walkietalkie.png | Bin 299 -> 509 bytes .../Objects/Devices/jammer.rsi/jammer-on.png | Bin 0 -> 537 bytes .../Objects/Devices/jammer.rsi/jammer.png | Bin 495 -> 329 bytes .../Objects/Devices/jammer.rsi/meta.json | 16 +- .../Objects/Devices/signaller.rsi/meta.json | 4 +- .../Devices/signaller.rsi/signaller.png | Bin 280 -> 456 bytes .../Devices/station_beacon.rsi/blink.png | Bin 373 -> 447 bytes .../Devices/station_beacon.rsi/icon.png | Bin 302 -> 274 bytes .../Devices/station_beacon.rsi/meta.json | 2 +- .../Objects/Devices/translator.rsi/icon.png | Bin 0 -> 278 bytes .../Objects/Devices/translator.rsi/meta.json | 17 + .../Devices/translator.rsi/translator.png | Bin 0 -> 202 bytes .../fire_extinguisher_closed.png | Bin 429 -> 303 bytes .../fire_extinguisher_open.png | Bin 420 -> 315 bytes .../Misc/fire_extinguisher.rsi/meta.json | 2 +- .../Misc/stock_parts.rsi/adv_capacitor.png | Bin 420 -> 345 bytes .../Misc/stock_parts.rsi/adv_scan_module.png | Bin 927 -> 725 bytes .../stock_parts.rsi/advanced_matter_bin.png | Bin 426 -> 430 bytes .../stock_parts.rsi/bluespace_matter_bin.png | Bin 627 -> 1283 bytes .../Misc/stock_parts.rsi/capacitor.png | Bin 254 -> 391 bytes .../Misc/stock_parts.rsi/femto_mani.png | Bin 589 -> 416 bytes .../Misc/stock_parts.rsi/high_micro_laser.png | Bin 278 -> 333 bytes .../Misc/stock_parts.rsi/matter_bin.png | Bin 462 -> 457 bytes .../Objects/Misc/stock_parts.rsi/meta.json | 50 +- .../Misc/stock_parts.rsi/micro_laser.png | Bin 263 -> 357 bytes .../Misc/stock_parts.rsi/micro_mani.png | Bin 366 -> 390 bytes .../Misc/stock_parts.rsi/nano_mani.png | Bin 394 -> 428 bytes .../Misc/stock_parts.rsi/pico_mani.png | Bin 373 -> 404 bytes .../stock_parts.rsi/quadratic_capacitor.png | Bin 729 -> 367 bytes .../stock_parts.rsi/quadultra_micro_laser.png | Bin 371 -> 421 bytes .../Misc/stock_parts.rsi/scan_module.png | Bin 491 -> 478 bytes .../Misc/stock_parts.rsi/super_capacitor.png | Bin 419 -> 291 bytes .../Misc/stock_parts.rsi/super_matter_bin.png | Bin 397 -> 523 bytes .../stock_parts.rsi/super_scan_module.png | Bin 1182 -> 564 bytes .../stock_parts.rsi/triphasic_scan_module.png | Bin 631 -> 770 bytes .../ultra_high_micro_laser.png | Bin 304 -> 389 bytes .../Objects/Tools/crowbar.rsi/icon.png | Bin 174 -> 371 bytes .../Objects/Tools/crowbar.rsi/meta.json | 2 +- .../Objects/Tools/crowbar.rsi/red-icon.png | Bin 200 -> 446 bytes .../Objects/Tools/drill.rsi/drill_bolt.png | Bin 886 -> 702 bytes .../Objects/Tools/drill.rsi/drill_screw.png | Bin 887 -> 691 bytes .../Objects/Tools/drill.rsi/meta.json | 2 +- .../Objects/Tools/geiger.rsi/geiger_base.png | Bin 427 -> 467 bytes .../Tools/geiger.rsi/geiger_on_ext.png | Bin 228 -> 260 bytes .../Tools/geiger.rsi/geiger_on_high.png | Bin 176 -> 218 bytes .../Tools/geiger.rsi/geiger_on_idle.png | Bin 173 -> 218 bytes .../Tools/geiger.rsi/geiger_on_low.png | Bin 176 -> 218 bytes .../Tools/geiger.rsi/geiger_on_med.png | Bin 176 -> 218 bytes .../Objects/Tools/geiger.rsi/meta.json | 2 +- .../Tools/hand_labeler.rsi/hand_labeler.png | Bin 273 -> 479 bytes .../Objects/Tools/hand_labeler.rsi/meta.json | 2 +- .../Tools/multitool.rsi/green-unlit.png | Bin 123 -> 176 bytes .../Objects/Tools/multitool.rsi/icon.png | Bin 359 -> 540 bytes .../Objects/Tools/multitool.rsi/meta.json | 2 +- .../Objects/Tools/multitool.rsi/red-unlit.png | Bin 117 -> 175 bytes .../Tools/multitool.rsi/yellow-unlit.png | Bin 121 -> 174 bytes .../Textures/Objects/Tools/rcd.rsi/icon.png | Bin 638 -> 857 bytes .../Objects/Tools/screwdriver.rsi/meta.json | 2 +- .../Tools/screwdriver.rsi/screwdriver-map.png | Bin 262 -> 310 bytes .../screwdriver-screwybits.png | Bin 152 -> 225 bytes .../Tools/screwdriver.rsi/screwdriver.png | Bin 227 -> 223 bytes .../Objects/Tools/seclite.rsi/meta.json | 2 +- .../Objects/Tools/seclite.rsi/seclite-on.png | Bin 287 -> 260 bytes .../Tools/seclite.rsi/seclite-overlay.png | Bin 121 -> 279 bytes .../Objects/Tools/seclite.rsi/seclite.png | Bin 286 -> 321 bytes .../Objects/Tools/spray_painter.rsi/meta.json | 2 +- .../Tools/spray_painter.rsi/spray_painter.png | Bin 518 -> 772 bytes .../Objects/Tools/welder.rsi/icon.png | Bin 290 -> 568 bytes .../Objects/Tools/welder.rsi/meta.json | 2 +- .../Objects/Tools/welder.rsi/welder_flame.png | Bin 181 -> 255 bytes .../Tools/welder_experimental.rsi/icon.png | Bin 564 -> 907 bytes .../Tools/welder_experimental.rsi/meta.json | 2 +- .../welder_experimental.rsi/welder_flame.png | Bin 295 -> 247 bytes .../Tools/welder_industrial.rsi/icon.png | Bin 345 -> 462 bytes .../Tools/welder_industrial.rsi/meta.json | 2 +- .../welder_industrial.rsi/welder_flame.png | Bin 296 -> 247 bytes .../Tools/welder_industrialadv.rsi/icon.png | Bin 396 -> 548 bytes .../Tools/welder_industrialadv.rsi/meta.json | 2 +- .../welder_industrialadv.rsi/welder_flame.png | Bin 297 -> 247 bytes .../wirecutters.rsi/cutters-cutty-thingy.png | Bin 217 -> 239 bytes .../Tools/wirecutters.rsi/cutters-map.png | Bin 331 -> 411 bytes .../Objects/Tools/wirecutters.rsi/cutters.png | Bin 228 -> 231 bytes .../Objects/Tools/wirecutters.rsi/meta.json | 2 +- .../Objects/Tools/wrench.rsi/icon.png | Bin 230 -> 484 bytes .../Objects/Tools/wrench.rsi/meta.json | 2 +- .../Weapons/Melee/stunbaton.rsi/meta.json | 2 +- .../Melee/stunbaton.rsi/stunbaton_nocell.png | Bin 431 -> 253 bytes .../Melee/stunbaton.rsi/stunbaton_off.png | Bin 362 -> 224 bytes .../Melee/stunbaton.rsi/stunbaton_on.png | Bin 1091 -> 1753 bytes .../Decoration/banner.rsi/banner.png | Bin 1577 -> 397 bytes .../Decoration/banner.rsi/banner_cargo.png | Bin 519 -> 415 bytes .../banner.rsi/banner_engineering.png | Bin 724 -> 381 bytes .../Decoration/banner.rsi/banner_medical.png | Bin 428 -> 420 bytes .../Decoration/banner.rsi/banner_science.png | Bin 537 -> 417 bytes .../Decoration/banner.rsi/banner_security.png | Bin 742 -> 402 bytes .../banner.rsi/banner_syndicate.png | Bin 569 -> 394 bytes .../Decoration/banner.rsi/meta.json | 2 +- .../Doors/secret_door.rsi/assembly.png | Bin 305 -> 178 bytes .../Doors/secret_door.rsi/closed.png | Bin 171 -> 117 bytes .../Doors/secret_door.rsi/closing.png | Bin 516 -> 563 bytes .../Doors/secret_door.rsi/meta.json | 24 +- .../Structures/Doors/secret_door.rsi/open.png | Bin 219 -> 170 bytes .../Doors/secret_door.rsi/opening.png | Bin 530 -> 582 bytes .../Furniture/furniture.rsi/meta.json | 4 +- .../Furniture/furniture.rsi/rack.png | Bin 250 -> 315 bytes .../Singularity/collector.rsi/ca-o0.png | Bin 1477 -> 152 bytes .../Singularity/collector.rsi/ca-o1.png | Bin 1415 -> 149 bytes .../Singularity/collector.rsi/ca-o2.png | Bin 1383 -> 151 bytes .../Singularity/collector.rsi/ca-o3.png | Bin 1421 -> 148 bytes .../Singularity/collector.rsi/ca-tank.png | Bin 2071 -> 198 bytes .../Singularity/collector.rsi/ca_active.png | Bin 10749 -> 3159 bytes .../Singularity/collector.rsi/ca_deactive.png | Bin 10791 -> 3131 bytes .../Singularity/collector.rsi/ca_off.png | Bin 2755 -> 990 bytes .../Singularity/collector.rsi/ca_on.png | Bin 3212 -> 1521 bytes .../Singularity/collector.rsi/cu.png | Bin 558 -> 990 bytes .../Singularity/collector.rsi/meta.json | 2 +- .../Singularity/collector.rsi/static.png | Bin 664 -> 1608 bytes .../Wallmounts/screen.rsi/meta.json | 2 +- .../Wallmounts/screen.rsi/screen.png | Bin 266 -> 398 bytes .../Walls/reinforced_diagonal.rsi/meta.json | 2 +- .../Walls/reinforced_diagonal.rsi/state0.png | Bin 666 -> 5943 bytes .../Walls/reinforced_diagonal.rsi/state1.png | Bin 639 -> 5829 bytes .../Structures/Walls/shuttle.rsi/meta.json | 20 +- .../Walls/shuttle.rsi/shuttle_construct-0.png | Bin 0 -> 632 bytes .../Walls/shuttle.rsi/shuttle_construct-1.png | Bin 0 -> 652 bytes .../Walls/shuttle.rsi/shuttle_construct-2.png | Bin 0 -> 689 bytes .../Walls/shuttle.rsi/shuttle_construct-3.png | Bin 0 -> 690 bytes .../Walls/shuttle.rsi/shuttle_construct-4.png | Bin 0 -> 675 bytes .../Walls/shuttle.rsi/shuttle_construct-5.png | Bin 0 -> 671 bytes .../Structures/Walls/solid.rsi/full.png | Bin 547 -> 168 bytes .../Structures/Walls/solid.rsi/meta.json | 2 +- .../Walls/solid.rsi/reinf_construct-0.png | Bin 891 -> 225 bytes .../Walls/solid.rsi/reinf_construct-1.png | Bin 863 -> 266 bytes .../Walls/solid.rsi/reinf_construct-2.png | Bin 956 -> 264 bytes .../Walls/solid.rsi/reinf_construct-3.png | Bin 956 -> 262 bytes .../Walls/solid.rsi/reinf_construct-4.png | Bin 963 -> 265 bytes .../Walls/solid.rsi/reinf_construct-5.png | Bin 1016 -> 258 bytes .../Walls/solid.rsi/reinf_over0.png | Bin 1128 -> 481 bytes .../Walls/solid.rsi/reinf_over1.png | Bin 994 -> 395 bytes .../Walls/solid.rsi/reinf_over2.png | Bin 1128 -> 481 bytes .../Walls/solid.rsi/reinf_over3.png | Bin 994 -> 395 bytes .../Walls/solid.rsi/reinf_over4.png | Bin 991 -> 393 bytes .../Walls/solid.rsi/reinf_over5.png | Bin 880 -> 352 bytes .../Walls/solid.rsi/reinf_over6.png | Bin 991 -> 393 bytes .../Walls/solid.rsi/reinf_over7.png | Bin 763 -> 204 bytes .../Structures/Walls/solid.rsi/rgeneric.png | Bin 864 -> 225 bytes .../Structures/Walls/solid.rsi/solid0.png | Bin 782 -> 391 bytes .../Structures/Walls/solid.rsi/solid1.png | Bin 415 -> 274 bytes .../Structures/Walls/solid.rsi/solid2.png | Bin 782 -> 391 bytes .../Structures/Walls/solid.rsi/solid3.png | Bin 415 -> 274 bytes .../Structures/Walls/solid.rsi/solid4.png | Bin 423 -> 280 bytes .../Structures/Walls/solid.rsi/solid5.png | Bin 448 -> 352 bytes .../Structures/Walls/solid.rsi/solid6.png | Bin 423 -> 280 bytes .../Structures/Walls/solid.rsi/solid7.png | Bin 261 -> 204 bytes .../Walls/solid_diagonal.rsi/state0.png | Bin 316 -> 316 bytes .../Walls/solid_diagonal.rsi/state1.png | Bin 297 -> 292 bytes .../Structures/Walls/solid_rust.rsi/full.png | Bin 2155 -> 2228 bytes .../Structures/Walls/solid_rust.rsi/meta.json | 2 +- .../solid_rust.rsi/reinf_construct-0.png | Bin 2293 -> 2248 bytes .../solid_rust.rsi/reinf_construct-1.png | Bin 2303 -> 2272 bytes .../solid_rust.rsi/reinf_construct-2.png | Bin 2340 -> 2269 bytes .../solid_rust.rsi/reinf_construct-3.png | Bin 2339 -> 2272 bytes .../solid_rust.rsi/reinf_construct-4.png | Bin 2372 -> 2268 bytes .../solid_rust.rsi/reinf_construct-5.png | Bin 2381 -> 2265 bytes .../Walls/solid_rust.rsi/reinf_over0.png | Bin 3230 -> 3233 bytes .../Walls/solid_rust.rsi/reinf_over1.png | Bin 2990 -> 3206 bytes .../Walls/solid_rust.rsi/reinf_over2.png | Bin 3230 -> 3233 bytes .../Walls/solid_rust.rsi/reinf_over3.png | Bin 2990 -> 3206 bytes .../Walls/solid_rust.rsi/reinf_over4.png | Bin 2903 -> 3191 bytes .../Walls/solid_rust.rsi/reinf_over5.png | Bin 2908 -> 3128 bytes .../Walls/solid_rust.rsi/reinf_over6.png | Bin 2903 -> 3191 bytes .../Walls/solid_rust.rsi/reinf_over7.png | Bin 2840 -> 3083 bytes .../Walls/solid_rust.rsi/rgeneric.png | Bin 2332 -> 2248 bytes .../Walls/solid_rust.rsi/solid0.png | Bin 2943 -> 3281 bytes .../Walls/solid_rust.rsi/solid1.png | Bin 2638 -> 3147 bytes .../Walls/solid_rust.rsi/solid2.png | Bin 2943 -> 3281 bytes .../Walls/solid_rust.rsi/solid3.png | Bin 2638 -> 3147 bytes .../Walls/solid_rust.rsi/solid4.png | Bin 2554 -> 3156 bytes .../Walls/solid_rust.rsi/solid5.png | Bin 2565 -> 3128 bytes .../Walls/solid_rust.rsi/solid6.png | Bin 2531 -> 3156 bytes .../Walls/solid_rust.rsi/solid7.png | Bin 2495 -> 3083 bytes .../Windows/plasma_diagonal.rsi/state0.png | Bin 15748 -> 729 bytes .../Windows/plasma_diagonal.rsi/state1.png | Bin 15665 -> 704 bytes .../Windows/plasma_window.rsi/full.png | Bin 1597 -> 430 bytes .../Windows/plasma_window.rsi/meta.json | 2 +- .../Windows/plasma_window.rsi/pwindow0.png | Bin 2063 -> 762 bytes .../Windows/plasma_window.rsi/pwindow1.png | Bin 1099 -> 735 bytes .../Windows/plasma_window.rsi/pwindow2.png | Bin 2063 -> 762 bytes .../Windows/plasma_window.rsi/pwindow3.png | Bin 1099 -> 735 bytes .../Windows/plasma_window.rsi/pwindow4.png | Bin 1161 -> 734 bytes .../Windows/plasma_window.rsi/pwindow5.png | Bin 1064 -> 680 bytes .../Windows/plasma_window.rsi/pwindow6.png | Bin 1161 -> 734 bytes .../Windows/plasma_window.rsi/pwindow7.png | Bin 247 -> 270 bytes .../reinforced_plasma_diagonal.rsi/state0.png | Bin 15911 -> 764 bytes .../reinforced_plasma_diagonal.rsi/state1.png | Bin 15885 -> 737 bytes .../reinforced_plasma_window.rsi/full.png | Bin 2495 -> 443 bytes .../reinforced_plasma_window.rsi/meta.json | 2 +- .../rpwindow0.png | Bin 2930 -> 776 bytes .../rpwindow1.png | Bin 1696 -> 877 bytes .../rpwindow2.png | Bin 2930 -> 776 bytes .../rpwindow3.png | Bin 1696 -> 877 bytes .../rpwindow4.png | Bin 1745 -> 874 bytes .../rpwindow5.png | Bin 1695 -> 721 bytes .../rpwindow6.png | Bin 1745 -> 874 bytes .../rpwindow7.png | Bin 910 -> 270 bytes .../state0.png | Bin 15734 -> 765 bytes .../state1.png | Bin 15695 -> 739 bytes .../reinforced_uranium_window.rsi/full.png | Bin 2067 -> 452 bytes .../reinforced_uranium_window.rsi/meta.json | 90 ++-- .../ruwindow0.png | Bin 2366 -> 750 bytes .../ruwindow1.png | Bin 1169 -> 872 bytes .../ruwindow2.png | Bin 2342 -> 750 bytes .../ruwindow3.png | Bin 1138 -> 872 bytes .../ruwindow4.png | Bin 1133 -> 874 bytes .../ruwindow5.png | Bin 1088 -> 704 bytes .../ruwindow6.png | Bin 1129 -> 874 bytes .../ruwindow7.png | Bin 267 -> 270 bytes .../Windows/reinforced_window.rsi/full.png | Bin 2063 -> 437 bytes .../Windows/reinforced_window.rsi/meta.json | 2 +- .../reinforced_window.rsi/rwindow0.png | Bin 2229 -> 758 bytes .../reinforced_window.rsi/rwindow1.png | Bin 1148 -> 620 bytes .../reinforced_window.rsi/rwindow2.png | Bin 2229 -> 758 bytes .../reinforced_window.rsi/rwindow3.png | Bin 1148 -> 620 bytes .../reinforced_window.rsi/rwindow4.png | Bin 1130 -> 615 bytes .../reinforced_window.rsi/rwindow5.png | Bin 1025 -> 706 bytes .../reinforced_window.rsi/rwindow6.png | Bin 1130 -> 615 bytes .../reinforced_window.rsi/rwindow7.png | Bin 272 -> 268 bytes .../reinforced_window_diagonal.rsi/state0.png | Bin 16179 -> 768 bytes .../reinforced_window_diagonal.rsi/state1.png | Bin 16152 -> 741 bytes .../Windows/tinted_window.rsi/full.png | Bin 9436 -> 387 bytes .../Windows/tinted_window.rsi/meta.json | 2 +- .../Windows/tinted_window.rsi/twindow0.png | Bin 10814 -> 2397 bytes .../Windows/tinted_window.rsi/twindow1.png | Bin 8214 -> 2230 bytes .../Windows/tinted_window.rsi/twindow2.png | Bin 10815 -> 2397 bytes .../Windows/tinted_window.rsi/twindow3.png | Bin 8477 -> 2230 bytes .../Windows/tinted_window.rsi/twindow4.png | Bin 8217 -> 2236 bytes .../Windows/tinted_window.rsi/twindow5.png | Bin 6896 -> 2336 bytes .../Windows/tinted_window.rsi/twindow6.png | Bin 8464 -> 2236 bytes .../Windows/tinted_window.rsi/twindow7.png | Bin 4882 -> 1915 bytes .../Windows/uranium_window.rsi/full.png | Bin 1321 -> 432 bytes .../Windows/uranium_window.rsi/meta.json | 90 ++-- .../Windows/uranium_window.rsi/uwindow0.png | Bin 1688 -> 773 bytes .../Windows/uranium_window.rsi/uwindow1.png | Bin 1225 -> 739 bytes .../Windows/uranium_window.rsi/uwindow2.png | Bin 1688 -> 773 bytes .../Windows/uranium_window.rsi/uwindow3.png | Bin 1225 -> 739 bytes .../Windows/uranium_window.rsi/uwindow4.png | Bin 1216 -> 739 bytes .../Windows/uranium_window.rsi/uwindow5.png | Bin 795 -> 664 bytes .../Windows/uranium_window.rsi/uwindow6.png | Bin 1229 -> 739 bytes .../Windows/uranium_window.rsi/uwindow7.png | Bin 297 -> 270 bytes .../uranium_window_diagonal.rsi/state0.png | Bin 15629 -> 729 bytes .../uranium_window_diagonal.rsi/state1.png | Bin 15604 -> 703 bytes .../Structures/Windows/window.rsi/full.png | Bin 1224 -> 427 bytes .../Structures/Windows/window.rsi/meta.json | 2 +- .../Structures/Windows/window.rsi/window0.png | Bin 1632 -> 714 bytes .../Structures/Windows/window.rsi/window1.png | Bin 1183 -> 518 bytes .../Structures/Windows/window.rsi/window2.png | Bin 1632 -> 714 bytes .../Structures/Windows/window.rsi/window3.png | Bin 1183 -> 518 bytes .../Structures/Windows/window.rsi/window4.png | Bin 1187 -> 523 bytes .../Structures/Windows/window.rsi/window5.png | Bin 800 -> 666 bytes .../Structures/Windows/window.rsi/window6.png | Bin 1187 -> 523 bytes .../Structures/Windows/window.rsi/window7.png | Bin 301 -> 268 bytes .../Windows/window_diagonal.rsi/state0.png | Bin 15988 -> 735 bytes .../Windows/window_diagonal.rsi/state1.png | Bin 15966 -> 702 bytes .../cargo_pallets.rsi/cargo_pallet_buy.png | Bin 551 -> 0 bytes .../cargo_pallets.rsi/cargo_pallet_sell.png | Bin 535 -> 0 bytes .../Structures/cargo_pallets.rsi/meta.json | 17 - Resources/engineCommandPerms.yml | 1 + Resources/keybinds.yml | 3 + Scripts/bat/buildAllDebug.bat | 1 + Scripts/bat/buildAllRelease.bat | 1 + Scripts/bat/buildAllTools.bat | 1 + Scripts/sh/buildAllDebug.sh | 1 + Scripts/sh/buildAllRelease.sh | 1 + Scripts/sh/buildAllTools.sh | 1 + Tools/{changelogs => changelog}/changelog.js | 0 Tools/{changelogs => changelog}/package.json | 2 - Tools/prtitlecase/index.js | 19 - Tools/prtitlecase/package.json | 12 - shell.nix | 3 +- 778 files changed, 6065 insertions(+), 2493 deletions(-) delete mode 100644 .github/workflows/prtitlecase.yml create mode 100644 BuildChecker/git_helper.py create mode 100755 BuildChecker/hooks/post-checkout create mode 100755 BuildChecker/hooks/post-merge create mode 100644 Content.Client/Language/LanguageMenuWindow.xaml create mode 100644 Content.Client/Language/LanguageMenuWindow.xaml.cs create mode 100644 Content.Client/Language/Systems/LanguageSystem.cs create mode 100644 Content.Client/Language/Systems/TranslatorImplanterSystem.cs rename Content.Client/{Psionics/GlimmerMonitor => Nyanotrasen/CartridgeLoader/Cartridges}/GlimmerMonitorUi.cs (92%) rename Content.Client/{Psionics/GlimmerMonitor => Nyanotrasen/CartridgeLoader/Cartridges}/GlimmerMonitorUiFragment.xaml (93%) rename Content.Client/{Psionics/GlimmerMonitor => Nyanotrasen/CartridgeLoader/Cartridges}/GlimmerMonitorUiFragment.xaml.cs (96%) rename Content.Client/{Psionics/Telepathy => Nyanotrasen/Chat}/PsionicChatUpdateSystem.cs (92%) rename Content.Client/{ => Nyanotrasen}/Psionics/Glimmer/GlimmerReactiveVisuals.cs (100%) rename Content.Client/{Psionics/UserInterface => Nyanotrasen/Psionics/UI}/AcceptPsionicsEUI.cs (100%) rename Content.Client/{Psionics/UserInterface => Nyanotrasen/Psionics/UI}/AcceptPsionicsWindow.cs (100%) rename Content.Client/{Psionics => Nyanotrasen}/UserInterface/GlimmerGraph.cs (97%) rename Content.Client/UserInterface/Screens/{OverlayChatGameScreen.xaml => DefaultGameScreen.xaml} (96%) rename Content.Client/UserInterface/Screens/{OverlayChatGameScreen.xaml.cs => DefaultGameScreen.xaml.cs} (94%) create mode 100644 Content.Client/UserInterface/Systems/Language/LanguageMenuUIController.cs create mode 100644 Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs create mode 100644 Content.Server/Bed/Components/SnoringComponent.cs create mode 100644 Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs create mode 100644 Content.Server/Language/Commands/ListLanguagesCommand.cs create mode 100644 Content.Server/Language/Commands/SayLanguageCommand.cs create mode 100644 Content.Server/Language/Commands/SelectLanguageCommand.cs create mode 100644 Content.Server/Language/DetermineEntityLanguagesEvent.cs create mode 100644 Content.Server/Language/LanguageSystem.Networking.cs create mode 100644 Content.Server/Language/LanguageSystem.cs create mode 100644 Content.Server/Language/TranslatorImplanterSystem.cs create mode 100644 Content.Server/Language/TranslatorSystem.cs rename Content.Server/{ => Nyanotrasen/Abilities}/Psionics/Abilities/DispelPowerSystem.cs (83%) create mode 100644 Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs rename Content.Server/{ => Nyanotrasen/Abilities}/Psionics/Abilities/MindSwapPowerSystem.cs (78%) rename Content.Server/{ => Nyanotrasen/Abilities}/Psionics/Abilities/MindSwappedComponent.cs (79%) rename Content.Server/{ => Nyanotrasen/Abilities}/Psionics/Abilities/NoosphericZapPowerSystem.cs (54%) rename Content.Server/{ => Nyanotrasen/Abilities}/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs (57%) create mode 100644 Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs create mode 100644 Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs create mode 100644 Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs rename Content.Server/{Psionics/Abilities => Nyanotrasen/Abilities/Psionics}/PsionicAbilitiesSystem.cs (54%) rename Content.Server/{Psionics => Nyanotrasen}/Audio/GlimmerSoundComponent.cs (80%) rename Content.Server/{Psionics/Telepathy/TelepathyChatSystem.cs => Nyanotrasen/Chat/NyanoChatSystem.cs} (85%) rename Content.Server/{Psionics/Telepathy => Nyanotrasen/Chat}/TSayCommand.cs (95%) rename Content.Server/{Psionics/Telepathy => Nyanotrasen/Chat}/TelepathicRepeaterComponent.cs (82%) create mode 100644 Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs create mode 100644 Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs rename Content.Server/{ => Nyanotrasen}/Psionics/AcceptPsionicsEui.cs (95%) rename Content.Server/{ => Nyanotrasen}/Psionics/AntiPsychicWeaponComponent.cs (100%) rename Content.Server/{ => Nyanotrasen}/Psionics/Dreams/DreamSystem.cs (93%) rename Content.Server/{ => Nyanotrasen}/Psionics/Glimmer/GlimmerCommands.cs (100%) rename Content.Server/{ => Nyanotrasen}/Psionics/Glimmer/GlimmerReactiveSystem.cs (99%) rename Content.Server/{ => Nyanotrasen}/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs (94%) rename Content.Server/{ => Nyanotrasen}/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs (100%) rename Content.Server/{ => Nyanotrasen}/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs (100%) rename Content.Server/{ => Nyanotrasen}/Psionics/Invisibility/PsionicInvisibilitySystem.cs (88%) rename Content.Server/{ => Nyanotrasen}/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs (95%) rename Content.Server/{ => Nyanotrasen}/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs (95%) rename Content.Server/{ => Nyanotrasen}/Psionics/Invisibility/PsionicallyInvisibleComponent.cs (100%) create mode 100644 Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs rename Content.Server/{ => Nyanotrasen}/Psionics/PsionicAwaitingPlayerComponent.cs (100%) rename Content.Server/{ => Nyanotrasen}/Psionics/PsionicBonusChanceComponent.cs (100%) rename Content.Server/{ => Nyanotrasen}/Psionics/PsionicsCommands.cs (84%) rename Content.Server/{ => Nyanotrasen}/Psionics/PsionicsSystem.cs (91%) delete mode 100644 Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs delete mode 100644 Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs delete mode 100644 Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs delete mode 100644 Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs delete mode 100644 Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs delete mode 100644 Content.Server/Psionics/PotentialPsionicComponent.cs create mode 100644 Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs create mode 100644 Content.Shared/Language/Components/LanguageSpeakerComponent.cs create mode 100644 Content.Shared/Language/Components/TranslatorImplanterComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs create mode 100644 Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs create mode 100644 Content.Shared/Language/Events/LanguagesSetMessage.cs create mode 100644 Content.Shared/Language/Events/LanguagesUpdateEvent.cs create mode 100644 Content.Shared/Language/Events/LanguagesUpdatedMessage.cs create mode 100644 Content.Shared/Language/Events/RequestLanguagesMessage.cs create mode 100644 Content.Shared/Language/LanguagePrototype.cs create mode 100644 Content.Shared/Language/Systems/SharedLanguageSystem.cs create mode 100644 Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs create mode 100644 Content.Shared/Language/Systems/SharedTranslatorSystem.cs rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/AcceptPsionicsEuiMessage.cs (100%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs (77%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/Dispel/DispelPowerComponent.cs (79%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/Dispel/DispellableComponent.cs (69%) create mode 100644 Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs create mode 100644 Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs create mode 100644 Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs (76%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs (77%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs (71%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs (94%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs (76%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs (79%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs (73%) create mode 100644 Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Items/ClothingGrantPsionicPowerComponent.cs (84%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Items/HeadCageComponent.cs (96%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Items/HeadCagedComponent.cs (81%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Items/PsionicItemsSystem.cs (98%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/Items/TinfoilHatComponent.cs (90%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/PsionicComponent.cs (51%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/PsionicInsulationComponent.cs (82%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/PsionicsDisabledComponent.cs (84%) rename Content.Shared/{ => Nyanotrasen/Abilities}/Psionics/SharedPsionicAbilitiesSystem.cs (97%) create mode 100644 Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs delete mode 100644 Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs create mode 100644 Content.Shared/Nyanotrasen/Psionics/Events.cs rename Content.Shared/{ => Nyanotrasen}/Psionics/Glimmer/GlimmerSystem.cs (98%) rename Content.Shared/{ => Nyanotrasen}/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs (100%) rename Content.Shared/{ => Nyanotrasen}/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs (100%) delete mode 100644 Content.Shared/Physics/FrictionRemoverSystem.cs delete mode 100644 Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs delete mode 100644 Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs delete mode 100644 Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs delete mode 100644 Content.Shared/Psionics/Events.cs delete mode 100644 Content.Shared/Psionics/SharedPsionicSystem.Insulated.cs create mode 100755 RUN_THIS.py delete mode 100644 Resources/Audio/Effects/beep_landmine.ogg delete mode 100644 Resources/Audio/Nyanotrasen/heartbeat_fast.ogg create mode 100644 Resources/Locale/en-US/language/commands.ftl create mode 100644 Resources/Locale/en-US/language/language-menu.ftl create mode 100644 Resources/Locale/en-US/language/languages.ftl create mode 100644 Resources/Locale/en-US/language/technologies.ftl create mode 100644 Resources/Locale/en-US/language/translator.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl create mode 100644 Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml create mode 100644 Resources/Prototypes/Entities/Objects/Devices/translators.yml create mode 100644 Resources/Prototypes/Language/languages.yml delete mode 100644 Resources/Prototypes/Nyanotrasen/Traits/psionics.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml create mode 100644 Resources/Prototypes/Recipes/Lathes/language.yml create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_bishop_cybernetics.rsi => bc_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_bishop_cybernetics.rsi => bc_corpo_jacket.rsi}/meta.json (100%) delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi/equipped-OUTERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_cybersun.rsi => cs_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_cybersun.rsi => cs_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_discount_dans.rsi => dd_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_discount_dans.rsi => dd_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_einstein_engines.rsi => ee_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_einstein_engines.rsi => ee_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_five_points_armory.rsi => fa_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_five_points_armory.rsi => fa_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_gilthari_exports.rsi => ge_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_gilthari_exports.rsi => ge_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hephestus_industries.rsi => hi_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hawkmoon_aquisitions.rsi => hi_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hawkmoon_aquisitions.rsi => hm_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_hephestus_industries.rsi => hm_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_interdyne.rsi => id_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_interdyne.rsi => id_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi/equipped-OUTERCLOTHING.png rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_zeng_hu_pharma.rsi => zh_corpo_jacket.rsi}/icon.png (100%) rename Resources/Textures/Clothing/OuterClothing/WinterCoats/{corpo_jacket_zeng_hu_pharma.rsi => zh_corpo_jacket.rsi}/meta.json (100%) create mode 100644 Resources/Textures/Interface/language.png delete mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-left.png delete mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio-inhand-right.png delete mode 100644 Resources/Textures/Objects/Devices/communication.rsi/old-radio.png create mode 100644 Resources/Textures/Objects/Devices/jammer.rsi/jammer-on.png create mode 100644 Resources/Textures/Objects/Devices/translator.rsi/icon.png create mode 100644 Resources/Textures/Objects/Devices/translator.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/translator.rsi/translator.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-0.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-1.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-2.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-3.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-4.png create mode 100644 Resources/Textures/Structures/Walls/shuttle.rsi/shuttle_construct-5.png delete mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png delete mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell.png delete mode 100644 Resources/Textures/Structures/cargo_pallets.rsi/meta.json rename Tools/{changelogs => changelog}/changelog.js (100%) rename Tools/{changelogs => changelog}/package.json (68%) delete mode 100644 Tools/prtitlecase/index.js delete mode 100644 Tools/prtitlecase/package.json diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 877273d7645..a44cac2cd1a 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -35,14 +35,14 @@ jobs: - name: Install Dependencies run: | - cd "Tools/changelogs" + cd "Tools/changelog" npm install shell: bash continue-on-error: true - name: Generate Changelog run: | - cd "Tools/changelogs" + cd "Tools/changelog" node changelog.js shell: bash continue-on-error: true diff --git a/.github/workflows/prtitlecase.yml b/.github/workflows/prtitlecase.yml deleted file mode 100644 index 0c5a38a4e8a..00000000000 --- a/.github/workflows/prtitlecase.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: PR Title Case -on: - pull_request_target: - types: [opened, edited, synchronize] - -env: - GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} - PR_NUMBER: ${{ github.event.pull_request.number }} - -jobs: - prtitlecase: - runs-on: ubuntu-latest - steps: - - name: Checkout Master - uses: actions/checkout@v3 - with: - token: ${{ secrets.BOT_TOKEN }} - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: 18.x - - - name: Install Dependencies - run: | - cd "Tools/prtitlecase" - npm install - shell: bash - - - name: Change Title - run: | - cd "Tools/prtitlecase" - node src/index.js - shell: bash diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 83bca6f97bc..737b90563e8 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,12 @@ { "recommendations": [ "ms-dotnettools.csharp", - "editorconfig.editorconfig" + "editorconfig.editorconfig", + "aaron-bond.better-comments", + "tamasfe.even-better-toml", + "slava0135.robust-yaml", + "slevesque.shader", + "macabeus.vscode-fluent", + "redhat.vscode-yaml" ] } diff --git a/BuildChecker/BuildChecker.csproj b/BuildChecker/BuildChecker.csproj index d4f9a412549..63d16fa9708 100644 --- a/BuildChecker/BuildChecker.csproj +++ b/BuildChecker/BuildChecker.csproj @@ -14,6 +14,8 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild --> + python3 + py -3 {C899FCA4-7037-4E49-ABC2-44DE72487110} .NETFramework, Version=v4.7.2 false @@ -37,7 +39,7 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild bin\DebugOpt\ - + diff --git a/BuildChecker/git_helper.py b/BuildChecker/git_helper.py new file mode 100644 index 00000000000..becd4506e82 --- /dev/null +++ b/BuildChecker/git_helper.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +# Installs git hooks, updates them, updates submodules, that kind of thing. + +import subprocess +import sys +import os +import shutil +from pathlib import Path +from typing import List + +SOLUTION_PATH = Path("..") / "SpaceStation14.sln" +# If this doesn't match the saved version we overwrite them all. +CURRENT_HOOKS_VERSION = "2" +QUIET = len(sys.argv) == 2 and sys.argv[1] == "--quiet" + + +def run_command(command: List[str], capture: bool = False) -> subprocess.CompletedProcess: + """ + Runs a command with pretty output. + """ + text = ' '.join(command) + if not QUIET: + print("$ {}".format(text)) + + sys.stdout.flush() + + completed = None + + if capture: + completed = subprocess.run(command, cwd="..", stdout=subprocess.PIPE) + else: + completed = subprocess.run(command, cwd="..") + + if completed.returncode != 0: + print("Error: command exited with code {}!".format(completed.returncode)) + + return completed + + +def update_submodules(): + """ + Updates all submodules. + """ + + if ('GITHUB_ACTIONS' in os.environ): + return + + if os.path.isfile("DISABLE_SUBMODULE_AUTOUPDATE"): + return + + if shutil.which("git") is None: + raise FileNotFoundError("git not found in PATH") + + # If the status doesn't match, force VS to reload the solution. + # status = run_command(["git", "submodule", "status"], capture=True) + run_command(["git", "submodule", "update", "--init", "--recursive"]) + # status2 = run_command(["git", "submodule", "status"], capture=True) + + # Something changed. + # if status.stdout != status2.stdout: + # print("Git submodules changed. Reloading solution.") + # reset_solution() + + +def install_hooks(): + """ + Installs the necessary git hooks into .git/hooks. + """ + + # Read version file. + if os.path.isfile("INSTALLED_HOOKS_VERSION"): + with open("INSTALLED_HOOKS_VERSION", "r") as f: + if f.read() == CURRENT_HOOKS_VERSION: + if not QUIET: + print("No hooks change detected.") + return + + with open("INSTALLED_HOOKS_VERSION", "w") as f: + f.write(CURRENT_HOOKS_VERSION) + + print("Hooks need updating.") + + hooks_target_dir = Path("..")/".git"/"hooks" + hooks_source_dir = Path("hooks") + + # Clear entire tree since we need to kill deleted files too. + for filename in os.listdir(str(hooks_target_dir)): + os.remove(str(hooks_target_dir/filename)) + + for filename in os.listdir(str(hooks_source_dir)): + print("Copying hook {}".format(filename)) + shutil.copy2(str(hooks_source_dir/filename), + str(hooks_target_dir/filename)) + + +def reset_solution(): + """ + Force VS to think the solution has been changed to prompt the user to reload it, thus fixing any load errors. + """ + + with SOLUTION_PATH.open("r") as f: + content = f.read() + + with SOLUTION_PATH.open("w") as f: + f.write(content) + + +if __name__ == '__main__': + install_hooks() + update_submodules() diff --git a/BuildChecker/hooks/post-checkout b/BuildChecker/hooks/post-checkout new file mode 100755 index 00000000000..c5662445c27 --- /dev/null +++ b/BuildChecker/hooks/post-checkout @@ -0,0 +1,13 @@ +#!/bin/bash + +gitroot=`git rev-parse --show-toplevel` + +cd "$gitroot/BuildChecker" + +if [[ `uname` == MINGW* || `uname` == CYGWIN* ]]; then + # Windows + py -3 git_helper.py --quiet +else + # Not Windows, so probably some other Unix thing. + python3 git_helper.py --quiet +fi diff --git a/BuildChecker/hooks/post-merge b/BuildChecker/hooks/post-merge new file mode 100755 index 00000000000..85fe61d966c --- /dev/null +++ b/BuildChecker/hooks/post-merge @@ -0,0 +1,5 @@ +#!/bin/bash + +# Just call post-checkout since it does the same thing. +gitroot=`git rev-parse --show-toplevel` +bash "$gitroot/.git/hooks/post-checkout" diff --git a/Content.Client/CardboardBox/CardboardBoxSystem.cs b/Content.Client/CardboardBox/CardboardBoxSystem.cs index 50f9de239d5..90a21d8e41b 100644 --- a/Content.Client/CardboardBox/CardboardBoxSystem.cs +++ b/Content.Client/CardboardBox/CardboardBoxSystem.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.CardboardBox; using Content.Shared.CardboardBox.Components; using Content.Shared.Examine; @@ -11,6 +11,7 @@ public sealed class CardboardBoxSystem : SharedCardboardBoxSystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { @@ -55,7 +56,7 @@ private void OnBoxEffect(PlayBoxEffectMessage msg) foreach (var mob in mobMoverEntities) { var mapPos = _transform.GetMapCoordinates(mob); - if (!ExamineSystemShared.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) + if (!_examine.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) continue; var ent = Spawn(box.Effect, mapPos); diff --git a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs index baf0d31f1f1..e60335bc45c 100644 --- a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs +++ b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs @@ -93,7 +93,7 @@ public void PopulateProducts() if (search.Length == 0 && _category == null || search.Length != 0 && prototype.Name.ToLowerInvariant().Contains(search) || search.Length != 0 && prototype.Description.ToLowerInvariant().Contains(search) || - search.Length == 0 && _category != null && prototype.Category.Equals(_category)) + search.Length == 0 && _category != null && Loc.GetString(prototype.Category).Equals(_category)) { var button = new CargoProductRow { @@ -122,7 +122,7 @@ public void PopulateCategories() foreach (var prototype in ProductPrototypes) { - if (!_categoryStrings.Contains(prototype.Category)) + if (!_categoryStrings.Contains(Loc.GetString(prototype.Category))) { _categoryStrings.Add(Loc.GetString(prototype.Category)); } diff --git a/Content.Client/Construction/ConstructionSystem.cs b/Content.Client/Construction/ConstructionSystem.cs index ae1724c3bf6..66000a8457d 100644 --- a/Content.Client/Construction/ConstructionSystem.cs +++ b/Content.Client/Construction/ConstructionSystem.cs @@ -27,6 +27,7 @@ public sealed class ConstructionSystem : SharedConstructionSystem [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; private readonly Dictionary _ghosts = new(); @@ -195,7 +196,7 @@ public bool TrySpawnGhost( return false; // This InRangeUnobstructed should probably be replaced with "is there something blocking us in that tile?" - var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager)); + var predicate = GetPredicate(prototype.CanBuildInImpassable, loc.ToMap(EntityManager, _transformSystem)); if (!_interactionSystem.InRangeUnobstructed(user, loc, 20f, predicate: predicate)) return false; diff --git a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs index ae1b3ec3bf0..a60619baa35 100644 --- a/Content.Client/ContextMenu/UI/EntityMenuUIController.cs +++ b/Content.Client/ContextMenu/UI/EntityMenuUIController.cs @@ -170,7 +170,7 @@ private bool HandleOpenEntityMenu(in PointerInputCmdHandler.PointerInputCmdArgs if (_combatMode.IsInCombatMode(args.Session?.AttachedEntity)) return false; - var coords = args.Coordinates.ToMap(_entityManager); + var coords = args.Coordinates.ToMap(_entityManager, _xform); if (_verbSystem.TryGetEntityMenuEntities(coords, out var entities)) OpenRootMenu(entities); diff --git a/Content.Client/Gameplay/GameplayState.cs b/Content.Client/Gameplay/GameplayState.cs index 2ea16521e8f..1efee978f39 100644 --- a/Content.Client/Gameplay/GameplayState.cs +++ b/Content.Client/Gameplay/GameplayState.cs @@ -93,17 +93,17 @@ private void LoadMainScreen() var screenTypeString = _configurationManager.GetCVar(CCVars.UILayout); if (!Enum.TryParse(screenTypeString, out ScreenType screenType)) { - screenType = ScreenType.Separated; + screenType = default; } switch (screenType) { + case ScreenType.Default: + _uiManager.LoadScreen(); + break; case ScreenType.Separated: _uiManager.LoadScreen(); break; - case ScreenType.Overlay: - _uiManager.LoadScreen(); - break; } _loadController.LoadScreen(); diff --git a/Content.Client/Gameplay/GameplayStateBase.cs b/Content.Client/Gameplay/GameplayStateBase.cs index bdbd69d1086..6236cd8e958 100644 --- a/Content.Client/Gameplay/GameplayStateBase.cs +++ b/Content.Client/Gameplay/GameplayStateBase.cs @@ -104,7 +104,7 @@ private bool HandleInspect(ICommonSession? session, EntityCoordinates coords, En public IEnumerable GetClickableEntities(EntityCoordinates coordinates) { - return GetClickableEntities(coordinates.ToMap(_entityManager)); + return GetClickableEntities(coordinates.ToMap(_entityManager, _entitySystemManager.GetEntitySystem())); } public IEnumerable GetClickableEntities(MapCoordinates coordinates) diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 03f4f3f38b7..fa631938100 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -55,6 +55,7 @@ public static void SetupContexts(IInputContextContainer contexts) human.AddFunction(ContentKeyFunctions.UseItemInHand); human.AddFunction(ContentKeyFunctions.AltUseItemInHand); human.AddFunction(ContentKeyFunctions.OpenCharacterMenu); + human.AddFunction(ContentKeyFunctions.OpenLanguageMenu); human.AddFunction(ContentKeyFunctions.ActivateItemInWorld); human.AddFunction(ContentKeyFunctions.ThrowItemInHand); human.AddFunction(ContentKeyFunctions.AltActivateItemInWorld); diff --git a/Content.Client/Language/LanguageMenuWindow.xaml b/Content.Client/Language/LanguageMenuWindow.xaml new file mode 100644 index 00000000000..ff33a6ddf56 --- /dev/null +++ b/Content.Client/Language/LanguageMenuWindow.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/Content.Client/Language/LanguageMenuWindow.xaml.cs b/Content.Client/Language/LanguageMenuWindow.xaml.cs new file mode 100644 index 00000000000..312814aca35 --- /dev/null +++ b/Content.Client/Language/LanguageMenuWindow.xaml.cs @@ -0,0 +1,134 @@ +using Content.Client.Language.Systems; +using Content.Shared.Language; +using Content.Shared.Language.Systems; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Console; +using Robust.Shared.Utility; +using Serilog; +using static Content.Shared.Language.Systems.SharedLanguageSystem; + +namespace Content.Client.Language; + +[GenerateTypedNameReferences] +public sealed partial class LanguageMenuWindow : DefaultWindow +{ + private readonly LanguageSystem _clientLanguageSystem; + private readonly List _entries = new(); + + + public LanguageMenuWindow() + { + RobustXamlLoader.Load(this); + _clientLanguageSystem = IoCManager.Resolve().GetEntitySystem(); + } + + protected override void Opened() + { + // Refresh the window when it gets opened. + // This actually causes two refreshes: one immediately, and one after the server sends a state message. + UpdateState(_clientLanguageSystem.CurrentLanguage, _clientLanguageSystem.SpokenLanguages); + _clientLanguageSystem.RequestStateUpdate(); + } + + + public void UpdateState(string currentLanguage, List spokenLanguages) + { + var langName = Loc.GetString($"language-{currentLanguage}-name"); + CurrentLanguageLabel.Text = Loc.GetString("language-menu-current-language", ("language", langName)); + + OptionsList.RemoveAllChildren(); + _entries.Clear(); + + foreach (var language in spokenLanguages) + { + AddLanguageEntry(language); + } + + // Disable the button for the currently chosen language + foreach (var entry in _entries) + { + if (entry.button != null) + entry.button.Disabled = entry.language == currentLanguage; + } + } + + private void AddLanguageEntry(string language) + { + var proto = _clientLanguageSystem.GetLanguagePrototype(language); + var state = new EntryState { language = language }; + + var container = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Vertical }; + + #region Header + var header = new BoxContainer + { + Orientation = BoxContainer.LayoutOrientation.Horizontal, + HorizontalExpand = true, + SeparationOverride = 2 + }; + + var name = new Label + { + Text = proto?.Name ?? Loc.GetString("generic-error"), + MinWidth = 50, + HorizontalExpand = true + }; + + var button = new Button { Text = "Choose" }; + button.OnPressed += _ => OnLanguageChosen(language); + state.button = button; + + header.AddChild(name); + header.AddChild(button); + + container.AddChild(header); + #endregion + + #region Collapsible description + var body = new CollapsibleBody + { + HorizontalExpand = true, + Margin = new Thickness(4f, 4f) + }; + + var description = new RichTextLabel { HorizontalExpand = true }; + description.SetMessage(proto?.Description ?? Loc.GetString("generic-error")); + body.AddChild(description); + + var collapser = new Collapsible(Loc.GetString("language-menu-description-header"), body) + { + Orientation = BoxContainer.LayoutOrientation.Vertical, + HorizontalExpand = true + }; + + container.AddChild(collapser); + #endregion + + // Before adding, wrap the new container in a PanelContainer to give it a distinct look + var wrapper = new PanelContainer(); + wrapper.StyleClasses.Add("PdaBorderRect"); + + wrapper.AddChild(container); + OptionsList.AddChild(wrapper); + + _entries.Add(state); + } + + + private void OnLanguageChosen(string id) + { + var proto = _clientLanguageSystem.GetLanguagePrototype(id); + if (proto != null) + _clientLanguageSystem.RequestSetLanguage(proto); + } + + + private struct EntryState + { + public string language; + public Button? button; + } +} diff --git a/Content.Client/Language/Systems/LanguageSystem.cs b/Content.Client/Language/Systems/LanguageSystem.cs new file mode 100644 index 00000000000..9714078b2c5 --- /dev/null +++ b/Content.Client/Language/Systems/LanguageSystem.cs @@ -0,0 +1,76 @@ +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Robust.Client; +using Robust.Shared.Console; + +namespace Content.Client.Language.Systems; + +/// +/// Client-side language system. +/// +/// +/// Unlike the server, the client is not aware of other entities' languages; it's only notified about the entity that it posesses. +/// Due to that, this system stores such information in a static manner. +/// +public sealed class LanguageSystem : SharedLanguageSystem +{ + [Dependency] private readonly IBaseClient _client = default!; + + /// + /// The current language of the entity currently possessed by the player. + /// + public string CurrentLanguage { get; private set; } = default!; + /// + /// The list of languages the currently possessed entity can speak. + /// + public List SpokenLanguages { get; private set; } = new(); + /// + /// The list of languages the currently possessed entity can understand. + /// + public List UnderstoodLanguages { get; private set; } = new(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeNetworkEvent(OnLanguagesUpdated); + _client.RunLevelChanged += OnRunLevelChanged; + } + + private void OnLanguagesUpdated(LanguagesUpdatedMessage message) + { + CurrentLanguage = message.CurrentLanguage; + SpokenLanguages = message.Spoken; + UnderstoodLanguages = message.Understood; + } + + private void OnRunLevelChanged(object? sender, RunLevelChangedEventArgs args) + { + // Request an update when entering a game + if (args.NewLevel == ClientRunLevel.InGame) + RequestStateUpdate(); + } + + /// + /// Sends a network request to the server to update this system's state. + /// The server may ignore the said request if the player is not possessing an entity. + /// + public void RequestStateUpdate() + { + RaiseNetworkEvent(new RequestLanguagesMessage()); + } + + public void RequestSetLanguage(LanguagePrototype language) + { + if (language.ID == CurrentLanguage) + return; + + RaiseNetworkEvent(new LanguagesSetMessage(language.ID)); + + // May cause some minor desync... + // So to reduce the probability of desync, we replicate the change locally too + if (SpokenLanguages.Contains(language.ID)) + CurrentLanguage = language.ID; + } +} diff --git a/Content.Client/Language/Systems/TranslatorImplanterSystem.cs b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs new file mode 100644 index 00000000000..da19b3decf9 --- /dev/null +++ b/Content.Client/Language/Systems/TranslatorImplanterSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Language.Systems; + +namespace Content.Client.Language.Systems; + +public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem +{ + +} diff --git a/Content.Client/NPC/PathfindingSystem.cs b/Content.Client/NPC/PathfindingSystem.cs index 548edd601ce..7bf3df1f0b9 100644 --- a/Content.Client/NPC/PathfindingSystem.cs +++ b/Content.Client/NPC/PathfindingSystem.cs @@ -23,6 +23,7 @@ public sealed class PathfindingSystem : SharedPathfindingSystem [Dependency] private readonly IResourceCache _cache = default!; [Dependency] private readonly NPCSteeringSystem _steering = default!; [Dependency] private readonly MapSystem _mapSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; public PathfindingDebugMode Modes { @@ -39,7 +40,7 @@ public PathfindingDebugMode Modes } else if (!overlayManager.HasOverlay()) { - overlayManager.AddOverlay(new PathfindingOverlay(EntityManager, _eyeManager, _inputManager, _mapManager, _cache, this, _mapSystem)); + overlayManager.AddOverlay(new PathfindingOverlay(EntityManager, _eyeManager, _inputManager, _mapManager, _cache, this, _mapSystem, _transformSystem)); } if ((value & PathfindingDebugMode.Steering) != 0x0) @@ -140,6 +141,7 @@ public sealed class PathfindingOverlay : Overlay private readonly IMapManager _mapManager; private readonly PathfindingSystem _system; private readonly MapSystem _mapSystem; + private readonly SharedTransformSystem _transformSystem; public override OverlaySpace Space => OverlaySpace.ScreenSpace | OverlaySpace.WorldSpace; @@ -153,7 +155,8 @@ public PathfindingOverlay( IMapManager mapManager, IResourceCache cache, PathfindingSystem system, - MapSystem mapSystem) + MapSystem mapSystem, + SharedTransformSystem transformSystem) { _entManager = entManager; _eyeManager = eyeManager; @@ -161,6 +164,7 @@ public PathfindingOverlay( _mapManager = mapManager; _system = system; _mapSystem = mapSystem; + _transformSystem = transformSystem; _font = new VectorFont(cache.GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10); } @@ -480,7 +484,7 @@ private void DrawWorld(OverlayDrawArgs args, DrawingHandleWorld worldHandle) if (neighborPoly.NetEntity != poly.GraphUid) { color = Color.Green; - var neighborMap = _entManager.GetCoordinates(neighborPoly).ToMap(_entManager); + var neighborMap = _entManager.GetCoordinates(neighborPoly).ToMap(_entManager, _transformSystem); if (neighborMap.MapId != args.MapId) continue; diff --git a/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUi.cs b/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs similarity index 92% rename from Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUi.cs rename to Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs index 0d8accb9f86..0b5fc7ad38c 100644 --- a/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUi.cs +++ b/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs @@ -1,11 +1,10 @@ using Robust.Client.GameObjects; using Robust.Client.UserInterface; -using Content.Client.Psionics.UI; using Content.Client.UserInterface.Fragments; using Content.Shared.CartridgeLoader.Cartridges; using Content.Shared.CartridgeLoader; -namespace Content.Client.Psionics.GlimmerMonitor; +namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; public sealed partial class GlimmerMonitorUi : UIFragment { diff --git a/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml b/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml similarity index 93% rename from Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml rename to Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml index 3044680e27b..119a1831e6e 100644 --- a/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml +++ b/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml @@ -1,4 +1,4 @@ - diff --git a/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml.cs b/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs similarity index 96% rename from Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml.cs rename to Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs index 58bbee38a2f..43d9202aa45 100644 --- a/Content.Client/Psionics/GlimmerMonitor/GlimmerMonitorUiFragment.xaml.cs +++ b/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs @@ -1,12 +1,12 @@ using System.Linq; using System.Numerics; -using Content.Client.Psionics.UI; +using Content.Client.Nyanotrasen.UserInterface; using Robust.Client.AutoGenerated; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -namespace Content.Client.Psionics.GlimmerMonitor; +namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; [GenerateTypedNameReferences] public sealed partial class GlimmerMonitorUiFragment : BoxContainer diff --git a/Content.Client/Psionics/Telepathy/PsionicChatUpdateSystem.cs b/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs similarity index 92% rename from Content.Client/Psionics/Telepathy/PsionicChatUpdateSystem.cs rename to Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs index 7bb88764a1f..84602052fe7 100644 --- a/Content.Client/Psionics/Telepathy/PsionicChatUpdateSystem.cs +++ b/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs @@ -1,8 +1,8 @@ -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Client.Chat.Managers; using Robust.Client.Player; -namespace Content.Client.Psionics.Chat +namespace Content.Client.Nyanotrasen.Chat { public sealed class PsionicChatUpdateSystem : EntitySystem { diff --git a/Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs b/Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs similarity index 100% rename from Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs rename to Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs diff --git a/Content.Client/Psionics/UserInterface/AcceptPsionicsEUI.cs b/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs similarity index 100% rename from Content.Client/Psionics/UserInterface/AcceptPsionicsEUI.cs rename to Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs diff --git a/Content.Client/Psionics/UserInterface/AcceptPsionicsWindow.cs b/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs similarity index 100% rename from Content.Client/Psionics/UserInterface/AcceptPsionicsWindow.cs rename to Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs diff --git a/Content.Client/Psionics/UserInterface/GlimmerGraph.cs b/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs similarity index 97% rename from Content.Client/Psionics/UserInterface/GlimmerGraph.cs rename to Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs index 111c810acb1..c4a9109dcd8 100644 --- a/Content.Client/Psionics/UserInterface/GlimmerGraph.cs +++ b/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs @@ -4,7 +4,7 @@ using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; -namespace Content.Client.Psionics.UI; +namespace Content.Client.Nyanotrasen.UserInterface; public sealed class GlimmerGraph : Control { diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index f0537079b97..49e8099e0fb 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -212,6 +212,7 @@ void AddCheckBox(string checkBoxName, bool currentState, Action OverlaySpace.ScreenSpace; @@ -33,12 +34,16 @@ public PopupOverlay( IPrototypeManager protoManager, IUserInterfaceManager uiManager, PopupUIController controller, + ExamineSystemShared examine, + SharedTransformSystem transform, PopupSystem popup) { _configManager = configManager; _entManager = entManager; _playerMgr = playerMgr; _uiManager = uiManager; + _examine = examine; + _transform = transform; _popup = popup; _controller = controller; @@ -73,7 +78,7 @@ private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, fl foreach (var popup in _popup.WorldLabels) { - var mapPos = popup.InitialPos.ToMap(_entManager); + var mapPos = popup.InitialPos.ToMap(_entManager, _transform); if (mapPos.MapId != args.MapId) continue; @@ -81,7 +86,7 @@ private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, fl var distance = (mapPos.Position - args.WorldBounds.Center).Length(); // Should handle fade here too wyci. - if (!args.WorldBounds.Contains(mapPos.Position) || !ExamineSystemShared.InRangeUnOccluded(viewPos, mapPos, distance, + if (!args.WorldBounds.Contains(mapPos.Position) || !_examine.InRangeUnOccluded(viewPos, mapPos, distance, e => e == popup.InitialPos.EntityId || e == ourEntity, entMan: _entManager)) continue; diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index cf96c41241a..479fb02906c 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Shared.Examine; using Content.Shared.GameTicking; using Content.Shared.Popups; using Robust.Client.Graphics; @@ -26,6 +27,8 @@ public sealed class PopupSystem : SharedPopupSystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; [Dependency] private readonly IReplayRecordingManager _replayRecording = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public IReadOnlyList WorldLabels => _aliveWorldLabels; public IReadOnlyList CursorLabels => _aliveCursorLabels; @@ -51,6 +54,8 @@ public override void Initialize() _prototype, _uiManager, _uiManager.GetUIController(), + _examine, + _transform, this)); } diff --git a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs index adc535b2684..9012767ef3f 100644 --- a/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs +++ b/Content.Client/Radiation/Overlays/RadiationPulseOverlay.cs @@ -121,7 +121,10 @@ private void RadiationQuery(IEye? currentEye) private bool PulseQualifies(EntityUid pulseEntity, MapCoordinates currentEyeLoc) { - return _entityManager.GetComponent(pulseEntity).MapID == currentEyeLoc.MapId && _entityManager.GetComponent(pulseEntity).Coordinates.InRange(_entityManager, EntityCoordinates.FromMap(_entityManager, _entityManager.GetComponent(pulseEntity).ParentUid, currentEyeLoc), MaxDist); + var transformComponent = _entityManager.GetComponent(pulseEntity); + var transformSystem = _entityManager.System(); + return transformComponent.MapID == currentEyeLoc.MapId + && transformComponent.Coordinates.InRange(_entityManager, transformSystem, EntityCoordinates.FromMap(transformComponent.ParentUid, currentEyeLoc, transformSystem, _entityManager), MaxDist); } private sealed record RadiationShaderInstance(MapCoordinates CurrentMapCoords, float Range, TimeSpan Start, float Duration) diff --git a/Content.Client/Sandbox/SandboxSystem.cs b/Content.Client/Sandbox/SandboxSystem.cs index d16751e3715..6a1129bb75d 100644 --- a/Content.Client/Sandbox/SandboxSystem.cs +++ b/Content.Client/Sandbox/SandboxSystem.cs @@ -16,6 +16,7 @@ public sealed class SandboxSystem : SharedSandboxSystem [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IPlacementManager _placement = default!; [Dependency] private readonly ContentEyeSystem _contentEye = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; private bool _sandboxEnabled; public bool SandboxAllowed { get; private set; } @@ -108,7 +109,7 @@ public bool Copy(ICommonSession? session, EntityCoordinates coords, EntityUid ui } // Try copy tile. - if (!_map.TryFindGridAt(coords.ToMap(EntityManager), out _, out var grid) || !grid.TryGetTileRef(coords, out var tileRef)) + if (!_map.TryFindGridAt(coords.ToMap(EntityManager, _transform), out _, out var grid) || !grid.TryGetTileRef(coords, out var tileRef)) return false; if (_placement.Eraser) diff --git a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml similarity index 96% rename from Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml rename to Content.Client/UserInterface/Screens/DefaultGameScreen.xaml index 4ba820b3392..54aeffe72c9 100644 --- a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml +++ b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml @@ -1,4 +1,4 @@ - - + diff --git a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml.cs b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs similarity index 94% rename from Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml.cs rename to Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs index c45ec9d4a02..0fb1b7d507f 100644 --- a/Content.Client/UserInterface/Screens/OverlayChatGameScreen.xaml.cs +++ b/Content.Client/UserInterface/Screens/DefaultGameScreen.xaml.cs @@ -6,9 +6,9 @@ namespace Content.Client.UserInterface.Screens; [GenerateTypedNameReferences] -public sealed partial class OverlayChatGameScreen : InGameScreen +public sealed partial class DefaultGameScreen : InGameScreen { - public OverlayChatGameScreen() + public DefaultGameScreen() { RobustXamlLoader.Load(this); diff --git a/Content.Client/UserInterface/Screens/ScreenType.cs b/Content.Client/UserInterface/Screens/ScreenType.cs index 039cd7b1287..595dc79556d 100644 --- a/Content.Client/UserInterface/Screens/ScreenType.cs +++ b/Content.Client/UserInterface/Screens/ScreenType.cs @@ -3,11 +3,11 @@ namespace Content.Client.UserInterface.Screens; public enum ScreenType { /// - /// The classic SS13 user interface. + /// The modern SS14 user interface. /// - Separated, + Default, /// - /// The temporary SS14 user interface. + /// The classic SS13 user interface. /// - Overlay, + Separated } diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index ecc57561cd8..0ad78f974e5 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -20,6 +20,7 @@ using Content.Shared.Examine; using Content.Shared.Input; using Content.Shared.Radio; +using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Input; using Robust.Client.Player; @@ -36,7 +37,7 @@ using Robust.Shared.Replays; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Client.Psionics.Chat; +using Content.Client.Nyanotrasen.Chat; //Nyano - Summary: chat namespace. namespace Content.Client.UserInterface.Systems.Chat; @@ -60,7 +61,7 @@ public sealed class ChatUIController : UIController [UISystemDependency] private readonly GhostSystem? _ghost = default; [UISystemDependency] private readonly TypingIndicatorSystem? _typingIndicator = default; [UISystemDependency] private readonly ChatSystem? _chatSys = default; - [UISystemDependency] private readonly PsionicChatUpdateSystem? _psionic = default!; //EE - Summary: makes the psionic chat available. + [UISystemDependency] private readonly PsionicChatUpdateSystem? _psionic = default!; //Nyano - Summary: makes the psionic chat available. [ValidatePrototypeId] private const string ChatNamePalette = "ChatNames"; @@ -81,7 +82,7 @@ public sealed class ChatUIController : UIController {SharedChatSystem.AdminPrefix, ChatSelectChannel.Admin}, {SharedChatSystem.RadioCommonPrefix, ChatSelectChannel.Radio}, {SharedChatSystem.DeadPrefix, ChatSelectChannel.Dead}, - {SharedChatSystem.TelepathicPrefix, ChatSelectChannel.Telepathic} //EE - Summary: adds the telepathic prefix =. + {SharedChatSystem.TelepathicPrefix, ChatSelectChannel.Telepathic} //Nyano - Summary: adds the telepathic prefix =. }; public static readonly Dictionary ChannelPrefixes = new() @@ -95,7 +96,7 @@ public sealed class ChatUIController : UIController {ChatSelectChannel.Admin, SharedChatSystem.AdminPrefix}, {ChatSelectChannel.Radio, SharedChatSystem.RadioCommonPrefix}, {ChatSelectChannel.Dead, SharedChatSystem.DeadPrefix}, - {ChatSelectChannel.Telepathic, SharedChatSystem.TelepathicPrefix } //EE - Summary: associates telepathic with =. + {ChatSelectChannel.Telepathic, SharedChatSystem.TelepathicPrefix } //Nyano - Summary: associates telepathic with =. }; /// @@ -263,16 +264,16 @@ public void SetMainChat(bool setting) switch (UIManager.ActiveScreen) { + case DefaultGameScreen defaultScreen: + chatBox = defaultScreen.ChatBox; + chatSizeRaw = _config.GetCVar(CCVars.DefaultScreenChatSize); + SetChatSizing(chatSizeRaw, defaultScreen, setting); + break; case SeparatedChatGameScreen separatedScreen: chatBox = separatedScreen.ChatBox; chatSizeRaw = _config.GetCVar(CCVars.SeparatedScreenChatSize); SetChatSizing(chatSizeRaw, separatedScreen, setting); break; - case OverlayChatGameScreen overlayScreen: - chatBox = overlayScreen.ChatBox; - chatSizeRaw = _config.GetCVar(CCVars.OverlayScreenChatSize); - SetChatSizing(chatSizeRaw, overlayScreen, setting); - break; default: // this could be better? var maybeChat = UIManager.ActiveScreen.GetWidget(); @@ -321,12 +322,12 @@ private void StoreChatSize(Vector2 size) $"{size.X.ToString(CultureInfo.InvariantCulture)},{size.Y.ToString(CultureInfo.InvariantCulture)}"; switch (UIManager.ActiveScreen) { + case DefaultGameScreen _: + _config.SetCVar(CCVars.DefaultScreenChatSize, stringSize); + break; case SeparatedChatGameScreen _: _config.SetCVar(CCVars.SeparatedScreenChatSize, stringSize); break; - case OverlayChatGameScreen _: - _config.SetCVar(CCVars.OverlayScreenChatSize, stringSize); - break; default: // do nothing return; @@ -626,7 +627,7 @@ private void UpdateQueuedSpeechBubbles(FrameEventArgs delta) var otherPos = EntityManager.GetComponent(ent).MapPosition; - if (occluded && !ExamineSystemShared.InRangeUnOccluded( + if (occluded && !_examine.InRangeUnOccluded( playerPos, otherPos, 0f, (ent, player), predicate)) diff --git a/Content.Client/UserInterface/Systems/Chat/Controls/ChatInputBox.cs b/Content.Client/UserInterface/Systems/Chat/Controls/ChatInputBox.cs index 843fd46c1a0..31a3f11b199 100644 --- a/Content.Client/UserInterface/Systems/Chat/Controls/ChatInputBox.cs +++ b/Content.Client/UserInterface/Systems/Chat/Controls/ChatInputBox.cs @@ -1,5 +1,6 @@ using Content.Shared.Chat; using Content.Shared.Input; +using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; namespace Content.Client.UserInterface.Systems.Chat.Controls; diff --git a/Content.Client/UserInterface/Systems/Language/LanguageMenuUIController.cs b/Content.Client/UserInterface/Systems/Language/LanguageMenuUIController.cs new file mode 100644 index 00000000000..f36521ce819 --- /dev/null +++ b/Content.Client/UserInterface/Systems/Language/LanguageMenuUIController.cs @@ -0,0 +1,89 @@ +using Content.Client.Language; +using Content.Client.Gameplay; +using Content.Client.UserInterface.Controls; +using Content.Shared.Input; +using Content.Shared.Language.Events; +using Robust.Client.UserInterface.Controllers; +using Robust.Client.UserInterface.Controls; +using Robust.Shared.Input.Binding; +using Robust.Shared.Utility; +using static Robust.Client.UserInterface.Controls.BaseButton; +using JetBrains.Annotations; + +namespace Content.Client.UserInterface.Systems.Language; + +[UsedImplicitly] +public sealed class LanguageMenuUIController : UIController, IOnStateEntered, IOnStateExited +{ + public LanguageMenuWindow? LanguageWindow; + private MenuButton? LanguageButton => UIManager.GetActiveUIWidgetOrNull()?.LanguageButton; + + public override void Initialize() + { + SubscribeNetworkEvent((LanguagesUpdatedMessage message, EntitySessionEventArgs _) => + LanguageWindow?.UpdateState(message.CurrentLanguage, message.Spoken)); + } + + public void OnStateEntered(GameplayState state) + { + DebugTools.Assert(LanguageWindow == null); + + LanguageWindow = UIManager.CreateWindow(); + LayoutContainer.SetAnchorPreset(LanguageWindow, LayoutContainer.LayoutPreset.CenterTop); + + CommandBinds.Builder.Bind(ContentKeyFunctions.OpenLanguageMenu, + InputCmdHandler.FromDelegate(_ => ToggleWindow())).Register(); + } + + public void OnStateExited(GameplayState state) + { + if (LanguageWindow != null) + { + LanguageWindow.Dispose(); + LanguageWindow = null; + } + + CommandBinds.Unregister(); + } + + public void UnloadButton() + { + if (LanguageButton == null) + return; + + LanguageButton.OnPressed -= LanguageButtonPressed; + } + + public void LoadButton() + { + if (LanguageButton == null) + return; + + LanguageButton.OnPressed += LanguageButtonPressed; + + if (LanguageWindow == null) + return; + + LanguageWindow.OnClose += () => LanguageButton.Pressed = false; + LanguageWindow.OnOpen += () => LanguageButton.Pressed = true; + } + + private void LanguageButtonPressed(ButtonEventArgs args) + { + ToggleWindow(); + } + + private void ToggleWindow() + { + if (LanguageWindow == null) + return; + + if (LanguageButton != null) + LanguageButton.SetClickPressed(!LanguageWindow.IsOpen); + + if (LanguageWindow.IsOpen) + LanguageWindow.Close(); + else + LanguageWindow.Open(); + } +} diff --git a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs index 1505db48a79..156fa63884e 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs +++ b/Content.Client/UserInterface/Systems/MenuBar/GameTopMenuBarUIController.cs @@ -9,6 +9,7 @@ using Content.Client.UserInterface.Systems.MenuBar.Widgets; using Content.Client.UserInterface.Systems.Sandbox; using Robust.Client.UserInterface.Controllers; +using Content.Client.UserInterface.Systems.Language; namespace Content.Client.UserInterface.Systems.MenuBar; @@ -22,6 +23,7 @@ public sealed class GameTopMenuBarUIController : UIController [Dependency] private readonly ActionUIController _action = default!; [Dependency] private readonly SandboxUIController _sandbox = default!; [Dependency] private readonly GuidebookUIController _guidebook = default!; + [Dependency] private readonly LanguageMenuUIController _language = default!; private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull(); @@ -44,6 +46,7 @@ public void UnloadButtons() _ahelp.UnloadButton(); _action.UnloadButton(); _sandbox.UnloadButton(); + _language.UnloadButton(); } public void LoadButtons() @@ -56,5 +59,6 @@ public void LoadButtons() _ahelp.LoadButton(); _action.LoadButton(); _sandbox.LoadButton(); + _language.LoadButton(); } } diff --git a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml index 3c8cd1d164f..a76943ace85 100644 --- a/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml +++ b/Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml @@ -63,6 +63,16 @@ HorizontalExpand="True" AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}" /> + e == player || entitiesUnderMouse.Contains(e); // first check the general location. - if (!_examineSystem.CanExamine(player.Value, targetPos, Predicate)) + if (!_examine.CanExamine(player.Value, targetPos, Predicate)) return false; TryComp(player.Value, out ExaminerComponent? examiner); @@ -86,7 +86,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true entities = new(); foreach (var ent in _entityLookup.GetEntitiesInRange(targetPos, EntityMenuLookupSize)) { - if (_examineSystem.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) + if (_examine.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) entities.Add(ent); } } @@ -147,7 +147,7 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true { var entity = entities[i]; - if (!ExamineSystemShared.InRangeUnOccluded( + if (!_examine.InRangeUnOccluded( playerPos, xformQuery.GetComponent(entity).MapPosition, ExamineSystemShared.ExamineRange, diff --git a/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs b/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs new file mode 100644 index 00000000000..920dc088186 --- /dev/null +++ b/Content.IntegrationTests/Tests/Wires/WireLayoutTest.cs @@ -0,0 +1,103 @@ +using Content.Server.Doors; +using Content.Server.Power; +using Content.Server.Wires; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Map; + +namespace Content.IntegrationTests.Tests.Wires; + +[TestFixture] +[Parallelizable(ParallelScope.All)] +[TestOf(typeof(WiresSystem))] +public sealed class WireLayoutTest +{ + [TestPrototypes] + public const string Prototypes = """ + - type: wireLayout + id: WireLayoutTest + dummyWires: 2 + wires: + - !type:PowerWireAction + - !type:DoorBoltWireAction + + - type: wireLayout + id: WireLayoutTest2 + parent: WireLayoutTest + wires: + - !type:PowerWireAction + + - type: wireLayout + id: WireLayoutTest3 + parent: WireLayoutTest + + - type: entity + id: WireLayoutTest + components: + - type: Wires + layoutId: WireLayoutTest + + - type: entity + id: WireLayoutTest2 + components: + - type: Wires + layoutId: WireLayoutTest2 + + - type: entity + id: WireLayoutTest3 + components: + - type: Wires + layoutId: WireLayoutTest3 + """; + + [Test] + public async Task TestLayoutInheritance() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + var testMap = await pair.CreateTestMap(); + + await server.WaitAssertion(() => + { + var wires = IoCManager.Resolve().GetEntitySystem(); + + // Need to spawn these entities to make sure the wire layouts are initialized. + var ent1 = SpawnWithComp(server.EntMan, "WireLayoutTest", testMap.MapCoords); + var ent2 = SpawnWithComp(server.EntMan, "WireLayoutTest2", testMap.MapCoords); + var ent3 = SpawnWithComp(server.EntMan, "WireLayoutTest3", testMap.MapCoords); + + // Assert.That(wires.TryGetLayout("WireLayoutTest", out var layout1)); + // Assert.That(wires.TryGetLayout("WireLayoutTest2", out var layout2)); + // Assert.That(wires.TryGetLayout("WireLayoutTest3", out var layout3)); + + Assert.Multiple(() => + { + // Entity 1. + Assert.That(ent1.Comp.WiresList, Has.Count.EqualTo(4)); + Assert.That(ent1.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); + Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire"); + Assert.That(ent1.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); + + Assert.That(ent2.Comp.WiresList, Has.Count.EqualTo(5)); + Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); + Assert.That(ent2.Comp.WiresList, Has.Exactly(2).With.Property("Action").InstanceOf(), "2 power wire"); + Assert.That(ent2.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); + + Assert.That(ent3.Comp.WiresList, Has.Count.EqualTo(4)); + Assert.That(ent3.Comp.WiresList, Has.Exactly(2).With.Property("Action").Null, "2 dummy wires"); + Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 power wire"); + Assert.That(ent3.Comp.WiresList, Has.One.With.Property("Action").InstanceOf(), "1 door bolt wire"); + }); + }); + + await pair.CleanReturnAsync(); + } + + private static Entity SpawnWithComp(IEntityManager entityManager, string prototype, MapCoordinates coords) + where T : IComponent, new() + { + var ent = entityManager.Spawn(prototype, coords); + var comp = entityManager.EnsureComponent(ent); + return new Entity(ent, comp); + } +} diff --git a/Content.Server/Abilities/Mime/MimePowersSystem.cs b/Content.Server/Abilities/Mime/MimePowersSystem.cs index b3bd3392434..c1d2643d6fa 100644 --- a/Content.Server/Abilities/Mime/MimePowersSystem.cs +++ b/Content.Server/Abilities/Mime/MimePowersSystem.cs @@ -10,7 +10,7 @@ using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Timing; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; //Nyano - Summary: Makes Mime psionic. using Content.Shared.Speech.Muting; namespace Content.Server.Abilities.Mime diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs index b1cca46e63f..57d6e089bd4 100644 --- a/Content.Server/Administration/Managers/AdminManager.cs +++ b/Content.Server/Administration/Managers/AdminManager.cs @@ -315,7 +315,7 @@ private async void LoginAdminMaybe(ICommonSession session) _admins.Add(session, reg); - if (!session.ContentData()!.ExplicitlyDeadminned) + if (!session.ContentData()?.ExplicitlyDeadminned ?? false) { reg.Data.Active = true; diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index c68336deab8..9d66338c8bf 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -718,9 +718,21 @@ private void AddTricksVerbs(GetVerbsEvent args) Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Fun/caps.rsi"), "mag-6"), Act = () => { - _quickDialog.OpenDialog(player, "Set Bullet Amount", $"Amount (max {ballisticAmmo.Capacity}):", (int amount) => + _quickDialog.OpenDialog(player, "Set Bullet Amount", $"Amount (standard {ballisticAmmo.Capacity}):", (string amount) => { - ballisticAmmo.UnspawnedCount = amount; + if (!int.TryParse(amount, out var result)) + return; + + if (result > 0) + { + ballisticAmmo.UnspawnedCount = result; + } + else + { + ballisticAmmo.UnspawnedCount = 0; + } + + _gun.UpdateBallisticAppearance(args.Target, ballisticAmmo); }); }, Impact = LogImpact.Medium, diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index c4754af9340..f5b237b4492 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -66,6 +66,7 @@ public sealed partial class AdminVerbSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly StationSystem _stations = default!; [Dependency] private readonly StationSpawningSystem _spawning = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private readonly Dictionary> _openSolutionUis = new(); @@ -416,7 +417,7 @@ private void AddDebugVerbs(GetVerbsEvent args) Act = () => { - var message = ExamineSystemShared.InRangeUnOccluded(args.User, args.Target) + var message = _examine.InRangeUnOccluded(args.User, args.Target) ? Loc.GetString("in-range-unoccluded-verb-on-activate-not-occluded") : Loc.GetString("in-range-unoccluded-verb-on-activate-occluded"); diff --git a/Content.Server/Anomaly/AnomalySystem.Psionics.cs b/Content.Server/Anomaly/AnomalySystem.Psionics.cs index 84f200f47ba..95fda1d5035 100644 --- a/Content.Server/Anomaly/AnomalySystem.Psionics.cs +++ b/Content.Server/Anomaly/AnomalySystem.Psionics.cs @@ -1,4 +1,4 @@ -using Content.Server.Psionics.Abilities; +using Content.Server.Abilities.Psionics; //Nyano - Summary: the psniocs bin where dispel is located. using Content.Shared.Anomaly; using Content.Shared.Anomaly.Components; using Robust.Shared.Random; @@ -14,6 +14,8 @@ private void InitializePsionics() { SubscribeLocalEvent(OnDispelled); } + + //Nyano - Summary: gives dispellable behavior to Anomalies. private void OnDispelled(EntityUid uid, AnomalyComponent component, DispelledEvent args) { _dispel.DealDispelDamage(uid); diff --git a/Content.Server/Atmos/Components/AirtightComponent.cs b/Content.Server/Atmos/Components/AirtightComponent.cs index ca107eafbe8..69488a71307 100644 --- a/Content.Server/Atmos/Components/AirtightComponent.cs +++ b/Content.Server/Atmos/Components/AirtightComponent.cs @@ -9,27 +9,53 @@ public sealed partial class AirtightComponent : Component { public (EntityUid Grid, Vector2i Tile) LastPosition { get; set; } + /// + /// The directions in which this entity should block airflow, relative to its own reference frame. + /// [DataField("airBlockedDirection", customTypeSerializer: typeof(FlagSerializer))] public int InitialAirBlockedDirection { get; set; } = (int) AtmosDirection.All; + /// + /// The directions in which the entity is currently blocking airflow, relative to the grid that the entity is on. + /// I.e., this is a variant of that takes into account the entity's + /// current rotation. + /// [ViewVariables] public int CurrentAirBlockedDirection; - [DataField("airBlocked")] + /// + /// Whether the airtight entity is currently blocking airflow. + /// + [DataField] public bool AirBlocked { get; set; } = true; - [DataField("fixVacuum")] + /// + /// If true, entities on this tile will attempt to draw air from surrounding tiles when they become unblocked + /// and currently have no air. This is generally only required when is + /// true, or if the entity is likely to occupy the same tile as another no-air airtight entity. + /// + [DataField] public bool FixVacuum { get; set; } = true; + // I think fixvacuum exists to ensure that repeatedly closing/opening air-blocking doors doesn't end up + // depressurizing a room. However it can also effectively be used as a means of generating gasses for free + // TODO ATMOS Mass conservation. Make it actually push/pull air from adjacent tiles instead of destroying & creating, + + // TODO ATMOS Do we need these two fields? [DataField("rotateAirBlocked")] public bool RotateAirBlocked { get; set; } = true; + // TODO ATMOS remove this? What is this even for?? [DataField("fixAirBlockedDirectionInitialize")] public bool FixAirBlockedDirectionInitialize { get; set; } = true; - [DataField("noAirWhenFullyAirBlocked")] + /// + /// If true, then the tile that this entity is on will have no air at all if all directions are blocked. + /// + [DataField] public bool NoAirWhenFullyAirBlocked { get; set; } = true; + /// [Access(Other = AccessPermissions.ReadWriteExecute)] public AtmosDirection AirBlockedDirection => (AtmosDirection)CurrentAirBlockedDirection; } diff --git a/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs b/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs index 710c37b62fe..a58d3a3c122 100644 --- a/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs +++ b/Content.Server/Atmos/Components/IgniteOnCollideComponent.cs @@ -1,6 +1,8 @@ +using Content.Server.Atmos.EntitySystems; + namespace Content.Server.Atmos.Components; -[RegisterComponent] +[RegisterComponent, Access(typeof(FlammableSystem))] public sealed partial class IgniteOnCollideComponent : Component { /// diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 548d6a36926..152fba8fc4d 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -85,8 +85,6 @@ private void OnAirtightMoved(Entity airtight, ref MoveEvent e private bool AirtightMove(Entity ent, ref MoveEvent ev) { var (owner, airtight) = ent; - if (!airtight.RotateAirBlocked || airtight.InitialAirBlockedDirection == (int)AtmosDirection.Invalid) - return false; airtight.CurrentAirBlockedDirection = (int) Rotate((AtmosDirection)airtight.InitialAirBlockedDirection, ev.NewRotation); var pos = airtight.LastPosition; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs index d43cc81b0f8..beddef4be7e 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.GridAtmosphere.cs @@ -399,10 +399,7 @@ private void GridIsHotspotActive(EntityUid uid, GridAtmosphereComponent componen args.Handled = true; } - private void GridFixTileVacuum( - Entity ent, - TileAtmosphere tile, - float volume) + private void GridFixTileVacuum(TileAtmosphere tile) { DebugTools.AssertNotNull(tile.Air); DebugTools.Assert(tile.Air?.Immutable == false ); @@ -416,6 +413,9 @@ private void GridFixTileVacuum( count++; } + if (count == 0) + return; + var ratio = 1f / count; var totalTemperature = 0f; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index 77b5bf18af2..cb50ff114e0 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -236,7 +236,7 @@ public void ExperiencePressureDifference( // TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs. if (throwTarget != EntityCoordinates.Invalid) { - var pos = ((throwTarget.ToMap(EntityManager).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); + var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); _physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics); } else diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index f156125b0ff..dcbc1e86ee2 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -661,7 +661,7 @@ private void AdjustEqMovement(TileAtmosphere tile, AtmosDirection direction, flo // Turns out: no they don't. Temporary debug checks to figure out which caller is causing problems: if (tile == null) { - Logger.Error($"Encountered null-tile in {nameof(AdjustEqMovement)}. Trace: {Environment.StackTrace}"); + Log.Error($"Encountered null-tile in {nameof(AdjustEqMovement)}. Trace: {Environment.StackTrace}"); return; } var adj = tile.AdjacentTiles[direction.ToIndex()]; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index 1f3ca2145b9..eba398c1821 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -272,7 +272,7 @@ private void UpdateTileAir( tile.Air = new GasMixture(volume){Temperature = Atmospherics.T20C}; if (data.FixVacuum) - GridFixTileVacuum(ent, tile, volume); + GridFixTileVacuum(tile); } private void QueueRunTiles( diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index 9b0d0d9670d..67c6d5998dd 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -78,12 +78,13 @@ private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vecto if (!_airtightQuery.TryGetComponent(ent, out var airtight)) continue; + fixVacuum |= airtight.FixVacuum; + if(!airtight.AirBlocked) continue; blockedDirs |= airtight.AirBlockedDirection; noAirWhenBlocked |= airtight.NoAirWhenFullyAirBlocked; - fixVacuum |= airtight.FixVacuum; if (blockedDirs == AtmosDirection.All && noAirWhenBlocked && fixVacuum) break; diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs index 77fd7018333..3d73a4d0b16 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -62,9 +62,9 @@ public float Temperature get => _temperature; set { - DebugTools.Assert(!float.IsNaN(_temperature)); - if (Immutable) return; - _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); + DebugTools.Assert(!float.IsNaN(value)); + if (!Immutable) + _temperature = MathF.Min(MathF.Max(value, Atmospherics.TCMB), Atmospherics.Tmax); } } @@ -91,6 +91,7 @@ public GasMixture(float[] moles, float temp, float volume = Atmospherics.CellVol if (volume < 0) volume = 0; + DebugTools.Assert(!float.IsNaN(temp)); _temperature = temp; Moles = moles; Volume = volume; diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index 0dd35a29e76..0026dbbf4f0 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -28,6 +28,9 @@ public sealed class TileAtmosphere : IGasMixtureHolder [ViewVariables] public TileAtmosphere? PressureSpecificTarget { get; set; } + /// + /// This is either the pressure difference, or the quantity of moles transferred if monstermos is enabled. + /// [ViewVariables] public float PressureDifference { get; set; } diff --git a/Content.Server/Bed/Components/SnoringComponent.cs b/Content.Server/Bed/Components/SnoringComponent.cs new file mode 100644 index 00000000000..09f80327ba7 --- /dev/null +++ b/Content.Server/Bed/Components/SnoringComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Server.Bed.Sleep; + +/// +/// This is used for the snoring trait. +/// +[RegisterComponent] +public sealed partial class SnoringComponent : Component +{ + +} diff --git a/Content.Server/Bed/Sleep/SleepingSystem.cs b/Content.Server/Bed/Sleep/SleepingSystem.cs index 685b1087d70..b4972544338 100644 --- a/Content.Server/Bed/Sleep/SleepingSystem.cs +++ b/Content.Server/Bed/Sleep/SleepingSystem.cs @@ -67,7 +67,10 @@ private void OnSleepStateChanged(EntityUid uid, MobStateComponent component, Sle if (TryComp(uid, out var sleepSound)) { var emitSound = EnsureComp(uid); - emitSound.Sound = sleepSound.Snore; + if (HasComp(uid)) + { + emitSound.Sound = sleepSound.Snore; + } emitSound.PlayChance = sleepSound.Chance; emitSound.RollInterval = sleepSound.Interval; emitSound.PopUp = sleepSound.PopUp; diff --git a/Content.Server/Cargo/Components/CargoPalletComponent.cs b/Content.Server/Cargo/Components/CargoPalletComponent.cs index cdfd0a3874f..ebf0be93e0c 100644 --- a/Content.Server/Cargo/Components/CargoPalletComponent.cs +++ b/Content.Server/Cargo/Components/CargoPalletComponent.cs @@ -1,26 +1,7 @@ namespace Content.Server.Cargo.Components; -using Content.Shared.Actions; -using Robust.Shared.Serialization.TypeSerializers.Implementations; /// /// Any entities intersecting when a shuttle is recalled will be sold. /// - -[Flags] -public enum BuySellType : byte -{ - Buy = 1 << 0, - Sell = 1 << 1, - All = Buy | Sell -} - - [RegisterComponent] -public sealed partial class CargoPalletComponent : Component -{ - /// - /// Whether the pad is a buy pad, a sell pad, or all. - /// - [DataField] - public BuySellType PalletType; -} +public sealed partial class CargoPalletComponent : Component {} diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index d8b55a7237f..ebe66ff029e 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -205,7 +205,7 @@ private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent com // Try to fulfill from any station where possible, if the pad is not occupied. foreach (var trade in _listEnts) { - var tradePads = GetCargoPallets(trade, BuySellType.Buy); + var tradePads = GetCargoPallets(trade); _random.Shuffle(tradePads); var freePads = GetFreeCargoPallets(trade, tradePads); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index b8a491f4e89..3e39440da56 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -198,16 +198,13 @@ private List GetProjectedOrders( /// private int GetCargoSpace(EntityUid gridUid) { - var space = GetCargoPallets(gridUid, BuySellType.Buy).Count; + var space = GetCargoPallets(gridUid).Count; return space; } - /// GetCargoPallets(gridUid, BuySellType.Sell) to return only Sell pads - /// GetCargoPallets(gridUid, BuySellType.Buy) to return only Buy pads - private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid, BuySellType requestType = BuySellType.All) + private List<(EntityUid Entity, CargoPalletComponent Component, TransformComponent PalletXform)> GetCargoPallets(EntityUid gridUid) { _pads.Clear(); - var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var comp, out var compXform)) @@ -218,13 +215,7 @@ private int GetCargoSpace(EntityUid gridUid) continue; } - if ((requestType & comp.PalletType) == 0) - { - continue; - } - _pads.Add((uid, comp, compXform)); - } return _pads; @@ -284,7 +275,7 @@ private void GetPalletGoods(EntityUid gridUid, out HashSet toSell, ou amount = 0; toSell = new HashSet(); - foreach (var (palletUid, _, _) in GetCargoPallets(gridUid, BuySellType.Sell)) + foreach (var (palletUid, _, _) in GetCargoPallets(gridUid)) { // Containers should already get the sell price of their children so can skip those. _setEnts.Clear(); diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 6cdb088dbb0..7eecaa32b43 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -5,9 +5,11 @@ using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.GameTicking; +using Content.Server.Language; +using Content.Server.Speech; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; -using Content.Server.Psionics.Telepathy; +using Content.Server.Nyanotrasen.Chat; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; using Content.Server.Station.Components; @@ -17,6 +19,7 @@ using Content.Shared.Chat; using Content.Shared.Database; using Content.Shared.Ghost; +using Content.Shared.Language; using Content.Shared.Humanoid; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; @@ -60,6 +63,7 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ReplacementAccentSystem _wordreplacement = default!; + [Dependency] private readonly LanguageSystem _language = default!; //Nyano - Summary: pulls in the nyano chat system for psionics. [Dependency] private readonly NyanoChatSystem _nyanoChatSystem = default!; @@ -68,6 +72,7 @@ public sealed partial class ChatSystem : SharedChatSystem public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units public const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg"; + public const float DefaultObfuscationFactor = 0.2f; // Percentage of symbols in a whispered message that can be seen even by "far" listeners private bool _loocEnabled = true; private bool _deadLoocEnabled; @@ -173,7 +178,8 @@ public void TrySendInGameICMessage( ICommonSession? player = null, string? nameOverride = null, bool checkRadioPrefix = true, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (HasComp(source)) @@ -249,10 +255,10 @@ public void TrySendInGameICMessage( switch (desiredType) { case InGameICChatType.Speak: - SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker); + SendEntitySpeak(source, message, range, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); break; case InGameICChatType.Whisper: - SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker); + SendEntityWhisper(source, message, range, null, nameOverride, hideLog, ignoreActionBlocker, languageOverride: languageOverride); break; case InGameICChatType.Emote: SendEntityEmote(source, message, range, nameOverride, hideLog: hideLog, ignoreActionBlocker: ignoreActionBlocker); @@ -382,12 +388,14 @@ private void SendEntitySpeak( ChatTransmitRange range, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) return; + // The original message var message = TransformSpeech(source, FormattedMessage.RemoveMarkup(originalMessage)); if (message.Length == 0) @@ -411,18 +419,19 @@ private void SendEntitySpeak( speech = proto; } - name = FormattedMessage.EscapeText(name); + var language = languageOverride ?? _language.GetLanguage(source); - var wrappedMessage = Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", - ("entityName", name), - ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("message", FormattedMessage.EscapeText(message))); + name = FormattedMessage.EscapeText(name); + // The chat message wrapped in a "x says y" string + var wrappedMessage = WrapPublicMessage(source, name, message); + // The chat message obfuscated via language obfuscation + var obfuscated = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); + // The language-obfuscated message wrapped in a "x says y" string + var wrappedObfuscated = WrapPublicMessage(source, name, obfuscated); - SendInVoiceRange(ChatChannel.Local, message, wrappedMessage, source, range); + SendInVoiceRange(ChatChannel.Local, name, message, wrappedMessage, obfuscated, wrappedObfuscated, source, range, languageOverride: language); - var ev = new EntitySpokeEvent(source, message, null, null); + var ev = new EntitySpokeEvent(source, message, null, false, language); RaiseLocalEvent(source, ev, true); // To avoid logging any messages sent by entities that are not players, like vendors, cloning, etc. @@ -455,7 +464,8 @@ private void SendEntityWhisper( RadioChannelPrototype? channel, string? nameOverride, bool hideLog = false, - bool ignoreActionBlocker = false + bool ignoreActionBlocker = false, + LanguagePrototype? languageOverride = null ) { if (!_actionBlocker.CanSpeak(source) && !ignoreActionBlocker) @@ -465,8 +475,6 @@ private void SendEntityWhisper( if (message.Length == 0) return; - var obfuscatedMessage = ObfuscateMessageReadability(message, 0.2f); - // get the entity's name by visual identity (if no override provided). string nameIdentity = FormattedMessage.EscapeText(nameOverride ?? Identity.Name(source, EntityManager)); // get the entity's name by voice (if no override provided). @@ -483,41 +491,57 @@ private void SendEntityWhisper( } name = FormattedMessage.EscapeText(name); - var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", name), ("message", FormattedMessage.EscapeText(message))); - - var wrappedobfuscatedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(obfuscatedMessage))); - - var wrappedUnknownMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", - ("message", FormattedMessage.EscapeText(obfuscatedMessage))); - + var language = languageOverride ?? _language.GetLanguage(source); + var languageObfuscatedMessage = SanitizeInGameICMessage(source, _language.ObfuscateSpeech(message, language), out var emoteStr, true, _configurationManager.GetCVar(CCVars.ChatPunctuation), (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en")); foreach (var (session, data) in GetRecipients(source, WhisperMuffledRange)) { - EntityUid listener; - - if (session.AttachedEntity is not { Valid: true } playerEntity) + if (session.AttachedEntity is not { Valid: true } listener) continue; - listener = session.AttachedEntity.Value; if (MessageRangeCheck(session, data, range) != MessageRangeCheckResult.Full) continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them. + var canUnderstandLanguage = _language.CanUnderstand(listener, language); + // How the entity perceives the message depends on whether it can understand its language + var perceivedMessage = canUnderstandLanguage ? message : languageObfuscatedMessage; + + // Result is the intermediate message derived from the perceived one via obfuscation + // Wrapped message is the result wrapped in an "x says y" string + string result, wrappedMessage; if (data.Range <= WhisperClearRange) - _chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, false, session.Channel); - //If listener is too far, they only hear fragments of the message - //Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind - else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) //Shared.Physics.CollisionGroup.Opaque - _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedobfuscatedMessage, source, false, session.Channel); - //If listener is too far and has no line of sight, they can't identify the whisperer's identity + { + // Scenario 1: the listener can clearly understand the message + result = perceivedMessage; + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", name), + ("message", FormattedMessage.EscapeText(result))); + } + else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) + { + // Scenerio 2: if the listener is too far, they only hear fragments of the message + // Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind + result = ObfuscateMessageReadability(perceivedMessage); + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", nameIdentity), ("message", FormattedMessage.EscapeText(result))); + } else - _chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedUnknownMessage, source, false, session.Channel); + { + // Scenario 3: If listener is too far and has no line of sight, they can't identify the whisperer's identity + result = ObfuscateMessageReadability(perceivedMessage); + wrappedMessage = Loc.GetString("chat-manager-entity-whisper-unknown-wrap-message", + ("message", FormattedMessage.EscapeText(result))); + } + + _chatManager.ChatMessageToOne(ChatChannel.Whisper, result, wrappedMessage, source, false, session.Channel); } - _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); + var replayWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message", + ("entityName", name), + ("message", FormattedMessage.EscapeText(message))); + _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, replayWrap, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); - var ev = new EntitySpokeEvent(source, message, channel, obfuscatedMessage); + var ev = new EntitySpokeEvent(source, message, channel, true, language); RaiseLocalEvent(source, ev, true); if (!hideLog) if (originalMessage == message) @@ -564,7 +588,7 @@ private void SendEntityEmote( if (checkEmote) TryEmoteChatInput(source, action); - SendInVoiceRange(ChatChannel.Emotes, action, wrappedMessage, source, range, author); + SendInVoiceRange(ChatChannel.Emotes, name, action, wrappedMessage, obfuscated: "", obfuscatedWrappedMessage: "", source, range, author); if (!hideLog) if (name != Name(source)) _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Emote from {ToPrettyString(source):user} as {name}: {action}"); @@ -591,7 +615,13 @@ private void SendLOOC(EntityUid source, ICommonSession player, string message, b ("entityName", name), ("message", FormattedMessage.EscapeText(message))); - SendInVoiceRange(ChatChannel.LOOC, message, wrappedMessage, source, hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, player.UserId); + SendInVoiceRange(ChatChannel.LOOC, name, message, wrappedMessage, + obfuscated: string.Empty, + obfuscatedWrappedMessage: string.Empty, // will be skipped anyway + source, + hideChat ? ChatTransmitRange.HideChat : ChatTransmitRange.Normal, + player.UserId, + languageOverride: LanguageSystem.Universal); _adminLogger.Add(LogType.Chat, LogImpact.Low, $"LOOC from {player:Player}: {message}"); } @@ -672,15 +702,29 @@ private MessageRangeCheckResult MessageRangeCheck(ICommonSession session, ICChat /// /// Sends a chat message to the given players in range of the source entity. /// - private void SendInVoiceRange(ChatChannel channel, string message, string wrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null) + private void SendInVoiceRange(ChatChannel channel, string name, string message, string wrappedMessage, string obfuscated, string obfuscatedWrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null, LanguagePrototype? languageOverride = null) { + var language = languageOverride ?? _language.GetLanguage(source); foreach (var (session, data) in GetRecipients(source, VoiceRange)) { var entRange = MessageRangeCheck(session, data, range); if (entRange == MessageRangeCheckResult.Disallowed) continue; var entHideChat = entRange == MessageRangeCheckResult.HideChat; - _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); + if (session.AttachedEntity is not { Valid: true } playerEntity) + continue; + EntityUid listener = session.AttachedEntity.Value; + + + // If the channel does not support languages, or the entity can understand the message, send the original message, otherwise send the obfuscated version + if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language)) + { + _chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author); + } + else + { + _chatManager.ChatMessageToOne(channel, obfuscated, obfuscatedWrappedMessage, source, entHideChat, session.Channel, author: author); + } } _replay.RecordServerMessage(new ChatMessage(channel, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); @@ -790,6 +834,21 @@ public string SanitizeMessageReplaceWords(string message) return msg; } + /// + /// Wraps a message sent by the specified entity into an "x says y" string. + /// + public string WrapPublicMessage(EntityUid source, string name, string message) + { + var speech = GetSpeechVerb(source, message); + var verbName = Loc.GetString(_random.Pick(speech.SpeechVerbStrings)); + return Loc.GetString(speech.Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message", + ("entityName", name), + ("verb", verbName), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("message", FormattedMessage.EscapeText(message))); + } + /// /// Returns list of players and ranges for all players withing some range. Also returns observers with a range of -1. /// @@ -836,7 +895,7 @@ public readonly record struct ICChatRecipientData(float Range, bool Observer, bo { } - private string ObfuscateMessageReadability(string message, float chance) + public string ObfuscateMessageReadability(string message, float chance = DefaultObfuscationFactor) { var modifiedMessage = new StringBuilder(message); @@ -925,7 +984,8 @@ public sealed class EntitySpokeEvent : EntityEventArgs { public readonly EntityUid Source; public readonly string Message; - public readonly string? ObfuscatedMessage; // not null if this was a whisper + public readonly bool IsWhisper; + public readonly LanguagePrototype Language; /// /// If the entity was trying to speak into a radio, this was the channel they were trying to access. If a radio @@ -933,12 +993,13 @@ public sealed class EntitySpokeEvent : EntityEventArgs /// public RadioChannelPrototype? Channel; - public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, string? obfuscatedMessage) + public EntitySpokeEvent(EntityUid source, string message, RadioChannelPrototype? channel, bool isWhisper, LanguagePrototype language) { Source = source; Message = message; Channel = channel; - ObfuscatedMessage = obfuscatedMessage; + IsWhisper = isWhisper; + Language = language; } } diff --git a/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs b/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs index 761e9456bcd..c923738930a 100644 --- a/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs +++ b/Content.Server/Chat/TypingIndicator/TypingIndicatorSystem.cs @@ -39,7 +39,7 @@ private void OnClientTypingChanged(TypingChangedEvent ev, EntitySessionEventArgs var uid = args.SenderSession.AttachedEntity; if (!Exists(uid)) { - Logger.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity."); + Log.Warning($"Client {args.SenderSession} sent TypingChangedEvent without an attached entity."); return; } diff --git a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs index 7d3f70bc0d8..1415b6cad3c 100644 --- a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs @@ -22,8 +22,8 @@ namespace Content.Server.Chemistry.EntitySystems [UsedImplicitly] internal sealed class VaporSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; @@ -115,7 +115,7 @@ private void Update(float frameTime, Entity ent, Entity(uid); entityManager.RemoveComponent(uid); + var speaker = entityManager.EnsureComponent(uid); + var fallback = SharedLanguageSystem.FallbackLanguagePrototype; + + if (!speaker.UnderstoodLanguages.Contains(fallback)) + speaker.UnderstoodLanguages.Add(fallback); + + if (!speaker.SpokenLanguages.Contains(fallback)) + { + speaker.CurrentLanguage = fallback; + speaker.SpokenLanguages.Add(fallback); + } + + args.EntityManager.EventBus.RaiseLocalEvent(uid, new LanguagesUpdateEvent(), true); + // Stops from adding a ghost role to things like people who already have a mind if (entityManager.TryGetComponent(uid, out var mindContainer) && mindContainer.HasMind) { @@ -47,7 +65,7 @@ public override void Effect(ReagentEffectArgs args) ghostRole = entityManager.AddComponent(uid); entityManager.EnsureComponent(uid); - entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. + entityManager.EnsureComponent(uid); //Nyano - Summary:. Makes the animated body able to get psionics. var entityData = entityManager.GetComponent(uid); ghostRole.RoleName = entityData.EntityName; diff --git a/Content.Server/Construction/Conditions/ComponentInTile.cs b/Content.Server/Construction/Conditions/ComponentInTile.cs index 36705e4c0ee..429c4fdabfc 100644 --- a/Content.Server/Construction/Conditions/ComponentInTile.cs +++ b/Content.Server/Construction/Conditions/ComponentInTile.cs @@ -47,7 +47,8 @@ public bool Condition(EntityUid uid, IEntityManager entityManager) if (transform.GridUid == null) return false; - var indices = transform.Coordinates.ToVector2i(entityManager, IoCManager.Resolve()); + var transformSys = entityManager.System(); + var indices = transform.Coordinates.ToVector2i(entityManager, IoCManager.Resolve(), transformSys); var lookup = entityManager.EntitySysManager.GetEntitySystem(); diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index e0bdf096296..39705fc1974 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Threading.Tasks; using Content.Server.Construction.Components; -using Content.Server.Storage.EntitySystems; using Content.Shared.ActionBlocker; using Content.Shared.Construction; using Content.Shared.Construction.Prototypes; @@ -15,7 +14,6 @@ using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Storage; -using Content.Shared.Tag; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -30,8 +28,7 @@ public sealed partial class ConstructionSystem [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly EntityLookupSystem _lookupSystem = default!; - [Dependency] private readonly StorageSystem _storageSystem = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; // --- WARNING! LEGACY CODE AHEAD! --- // This entire file contains the legacy code for initial construction. @@ -466,7 +463,7 @@ void Cleanup() return; } - var mapPos = location.ToMap(EntityManager); + var mapPos = location.ToMap(EntityManager, _transformSystem); var predicate = GetPredicate(constructionPrototype.CanBuildInImpassable, mapPos); if (!_interactionSystem.InRangeUnobstructed(user, mapPos, predicate: predicate)) diff --git a/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs b/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs index 22d96a54146..ec9ec770313 100644 --- a/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs +++ b/Content.Server/DeltaV/StationEvents/Events/GlimmerMobSpawnRule.cs @@ -5,7 +5,7 @@ using Content.Server.Psionics.Glimmer; using Content.Server.StationEvents.Components; using Content.Shared.Psionics.Glimmer; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; namespace Content.Server.StationEvents.Events; diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs new file mode 100644 index 00000000000..3d3820562d6 --- /dev/null +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs @@ -0,0 +1,38 @@ +using Content.Server.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Components; +using Robust.Server.GameObjects; + +namespace Content.Server.DeviceNetwork.Systems; + +public sealed class DeviceNetworkJammerSystem : EntitySystem +{ + [Dependency] private TransformSystem _transform = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(BeforePacketSent); + } + + private void BeforePacketSent(EntityUid uid, TransformComponent xform, BeforePacketSentEvent ev) + { + if (ev.Cancelled) + return; + + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out _, out var jammerComp, out var jammerXform)) + { + if (!jammerComp.JammableNetworks.Contains(ev.NetworkId)) + continue; + + if (jammerXform.Coordinates.InRange(EntityManager, _transform, ev.SenderTransform.Coordinates, jammerComp.Range) + || jammerXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, jammerComp.Range)) + { + ev.Cancel(); + return; + } + } + } + +} diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs index 83967c9bbd4..20ee7a5dd1b 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs @@ -351,13 +351,14 @@ private void SendToConnections(ReadOnlySpan connections, var xform = Transform(packet.Sender); - BeforePacketSentEvent beforeEv = new(packet.Sender, xform, _transformSystem.GetWorldPosition(xform)); + var senderPos = _transformSystem.GetWorldPosition(xform); foreach (var connection in connections) { if (connection.Owner == packet.Sender) continue; + BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString()); RaiseLocalEvent(connection.Owner, beforeEv, false); if (!beforeEv.Cancelled) @@ -386,11 +387,17 @@ public sealed class BeforePacketSentEvent : CancellableEntityEventArgs /// public readonly Vector2 SenderPosition; - public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition) + /// + /// The network the packet will be sent to. + /// + public readonly string NetworkId; + + public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId) { Sender = sender; SenderTransform = xform; SenderPosition = senderPosition; + NetworkId = networkId; } } diff --git a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs index fd62514d006..cdc083feacd 100644 --- a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs @@ -1,4 +1,5 @@ -using Content.Server.DeviceNetwork.Components; +using System.Diagnostics.CodeAnalysis; +using Content.Server.DeviceNetwork.Components; using Content.Server.Medical.CrewMonitoring; using Content.Server.Power.Components; using Content.Server.Station.Systems; @@ -38,7 +39,7 @@ public bool IsActiveServer(EntityUid serverId, SingletonDeviceNetServerComponent /// The address of the active server if it exists /// The component type that determines what type of server you're getting the address of /// True if there is an active serve. False otherwise - public bool TryGetActiveServerAddress(EntityUid stationId, out string? address) where TComp : IComponent + public bool TryGetActiveServerAddress(EntityUid stationId, [NotNullWhen(true)] out string? address) where TComp : IComponent { var servers = EntityQueryEnumerator< SingletonDeviceNetServerComponent, diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 93d6bc8db0b..6400472d036 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -28,6 +28,7 @@ public sealed partial class DragonSystem : EntitySystem [Dependency] private readonly RoleSystem _role = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; private EntityQuery _objQuery; @@ -146,7 +147,7 @@ private void OnSpawnRift(EntityUid uid, DragonComponent component, DragonSpawnRi // cant stack rifts near eachother foreach (var (_, riftXform) in EntityQuery(true)) { - if (riftXform.Coordinates.InRange(EntityManager, xform.Coordinates, RiftRange)) + if (riftXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, RiftRange)) { _popup.PopupEntity(Loc.GetString("carp-rift-proximity", ("proximity", RiftRange)), uid, uid); return; diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 202d03bcda9..169daca07ac 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -25,7 +25,7 @@ public void InitializeEnsnaring() { SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(AttemptStepTrigger); - SubscribeLocalEvent(OnStepTrigger); + SubscribeLocalEvent(OnStepTrigger); SubscribeLocalEvent(OnThrowHit); SubscribeLocalEvent(OnAttemptPacifiedThrow); } @@ -49,7 +49,7 @@ private void AttemptStepTrigger(EntityUid uid, EnsnaringComponent component, ref args.Continue = true; } - private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredOffEvent args) + private void OnStepTrigger(EntityUid uid, EnsnaringComponent component, ref StepTriggeredEvent args) { TryEnsnare(args.Tripper, uid, component); } diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 1a5a5c40118..6351d999a98 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -331,7 +331,7 @@ public void QueueExplosion(MapCoordinates epicenter, CameraShake(iterationIntensity.Count * 4f, epicenter, totalIntensity); //For whatever bloody reason, sound system requires ENTITY coordinates. - var mapEntityCoords = EntityCoordinates.FromMap(EntityManager, _mapManager.GetMapEntityId(epicenter.MapId), epicenter); + var mapEntityCoords = EntityCoordinates.FromMap(_mapManager.GetMapEntityId(epicenter.MapId), epicenter, _transformSystem, EntityManager); // play sound. // for the normal audio, we want everyone in pvs range diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index e24de5a2f66..9b9a042641f 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -88,7 +88,7 @@ public override void Initialize() SubscribeLocalEvent(OnTriggerCollide); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnImplantTrigger); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnSlipTriggered); SubscribeLocalEvent(OnEmptyTriggered); @@ -228,7 +228,7 @@ private void OnImplantTrigger(EntityUid uid, TriggerImplantActionComponent compo args.Handled = Trigger(uid); } - private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredOffEvent args) + private void OnStepTriggered(EntityUid uid, TriggerOnStepTriggerComponent component, ref StepTriggeredEvent args) { Trigger(uid, args.Tripper); } diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 54587e95be3..bf69b4b9094 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -394,7 +394,7 @@ public EntityCoordinates GetObserverSpawnPoint() // Ideally engine would just spawn them on grid directly I guess? Right now grid traversal is handling it during // update which means we need to add a hack somewhere around it. var spawn = _robustRandom.Pick(_possiblePositions); - var toMap = spawn.ToMap(EntityManager); + var toMap = spawn.ToMap(EntityManager, _transform); if (_mapManager.TryFindGridAt(toMap, out var gridUid, out _)) { diff --git a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs index f83d719c219..98926536b9d 100644 --- a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs @@ -201,7 +201,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (!gridId.HasValue) { - Logger.ErrorS("pirates", $"Gridid was null when loading \"{map}\", aborting."); + Log.Error($"Gridid was null when loading \"{map}\", aborting."); foreach (var session in ops) { ev.PlayerPool.Add(session); @@ -230,7 +230,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (spawns.Count == 0) { spawns.Add(Transform(pirates.PirateShip).Coordinates); - Logger.WarningS("pirates", $"Fell back to default spawn for pirates!"); + Log.Warning($"Fell back to default spawn for pirates!"); } for (var i = 0; i < ops.Length; i++) diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 627c336a36b..d3a717c74af 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -34,6 +34,7 @@ public sealed class GuardianSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly BodySystem _bodySystem = default!; [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -328,7 +329,7 @@ private void CheckGuardianMove( if (!guardianComponent.GuardianLoose) return; - if (!guardianXform.Coordinates.InRange(EntityManager, hostXform.Coordinates, guardianComponent.DistanceAllowed)) + if (!guardianXform.Coordinates.InRange(EntityManager, _transform, hostXform.Coordinates, guardianComponent.DistanceAllowed)) RetractGuardian(hostUid, hostComponent, guardianUid, guardianComponent); } diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index a783a9e0968..a0e872dbeb1 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -31,6 +31,7 @@ public sealed class HandsSystem : SharedHandsSystem [Dependency] private readonly VirtualItemSystem _virtualItemSystem = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly PullingSystem _pullingSystem = default!; [Dependency] private readonly ThrowingSystem _throwingSystem = default!; @@ -191,7 +192,7 @@ hands.ActiveHandEntity is not { } throwEnt || throwEnt = splitStack.Value; } - var direction = coordinates.ToMapPos(EntityManager) - Transform(player).WorldPosition; + var direction = coordinates.ToMapPos(EntityManager, _transformSystem) - Transform(player).WorldPosition; if (direction == Vector2.Zero) return true; diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index ac415a04342..8eb27414481 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -99,7 +99,7 @@ private void OnScramImplant(EntityUid uid, SubdermalImplantComponent component, return; var xform = Transform(ent); - var entityCoords = xform.Coordinates.ToMap(EntityManager); + var entityCoords = xform.Coordinates.ToMap(EntityManager, _xform); // try to find a valid position to teleport to, teleport to whatever works if we can't var targetCoords = new MapCoordinates(); diff --git a/Content.Server/LandMines/LandMineComponent.cs b/Content.Server/LandMines/LandMineComponent.cs index 1c4ba06691a..63e1e4b99f0 100644 --- a/Content.Server/LandMines/LandMineComponent.cs +++ b/Content.Server/LandMines/LandMineComponent.cs @@ -1,13 +1,6 @@ -using Robust.Shared.Audio; - -namespace Content.Server.LandMines; +namespace Content.Server.LandMines; [RegisterComponent] public sealed partial class LandMineComponent : Component { - /// - /// Trigger sound effect when stepping onto landmine - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public SoundSpecifier? Sound; } diff --git a/Content.Server/LandMines/LandMineSystem.cs b/Content.Server/LandMines/LandMineSystem.cs index 22dedb93375..78c48ef99ec 100644 --- a/Content.Server/LandMines/LandMineSystem.cs +++ b/Content.Server/LandMines/LandMineSystem.cs @@ -1,43 +1,43 @@ -using Content.Server.Explosion.EntitySystems; +using Content.Server.Explosion.EntitySystems; using Content.Shared.Popups; +using Content.Shared.StepTrigger; using Content.Shared.StepTrigger.Systems; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; namespace Content.Server.LandMines; public sealed class LandMineSystem : EntitySystem { - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly TriggerSystem _trigger = default!; + public override void Initialize() { - SubscribeLocalEvent(HandleStepOnTriggered); - SubscribeLocalEvent(HandleStepOffTriggered); - - SubscribeLocalEvent(HandleStepTriggerAttempt); + SubscribeLocalEvent(HandleTriggered); + SubscribeLocalEvent(HandleTriggerAttempt); } - private void HandleStepOnTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOnEvent args) + private static void HandleTriggerAttempt( + EntityUid uid, + LandMineComponent component, + ref StepTriggerAttemptEvent args) { - _popupSystem.PopupCoordinates( - Loc.GetString("land-mine-triggered", ("mine", uid)), - Transform(uid).Coordinates, - args.Tripper, - PopupType.LargeCaution); - - _audioSystem.PlayPvs(component.Sound, uid); - } - - private void HandleStepOffTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredOffEvent args) - { - _trigger.Trigger(uid, args.Tripper); + args.Continue = true; } - private static void HandleStepTriggerAttempt(EntityUid uid, LandMineComponent component, ref StepTriggerAttemptEvent args) + private void HandleTriggered(EntityUid uid, LandMineComponent component, ref StepTriggeredEvent args) { - args.Continue = true; + // This doesn't use TriggerOnStepTrigger since we don't want to display the popup if nothing happens + // and I didn't feel like making an `AfterTrigger` event + if (_trigger.Trigger(uid, args.Tripper)) + { + _popupSystem.PopupCoordinates( + Loc.GetString("land-mine-triggered", ("mine", uid)), + Transform(uid).Coordinates, + args.Tripper, + PopupType.LargeCaution); + } } } + diff --git a/Content.Server/Language/Commands/ListLanguagesCommand.cs b/Content.Server/Language/Commands/ListLanguagesCommand.cs new file mode 100644 index 00000000000..6698e1b6453 --- /dev/null +++ b/Content.Server/Language/Commands/ListLanguagesCommand.cs @@ -0,0 +1,39 @@ +using System.Linq; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class ListLanguagesCommand : IConsoleCommand +{ + public string Command => "languagelist"; + public string Description => Loc.GetString("command-list-langs-desc"); + public string Help => Loc.GetString("command-list-langs-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not {} playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + var languages = IoCManager.Resolve().GetEntitySystem(); + + var (spokenLangs, knownLangs) = languages.GetAllLanguages(playerEntity); + + shell.WriteLine("Spoken:\n" + string.Join("\n", spokenLangs)); + shell.WriteLine("Understood:\n" + string.Join("\n", knownLangs)); + } +} diff --git a/Content.Server/Language/Commands/SayLanguageCommand.cs b/Content.Server/Language/Commands/SayLanguageCommand.cs new file mode 100644 index 00000000000..2e4a27b1dcc --- /dev/null +++ b/Content.Server/Language/Commands/SayLanguageCommand.cs @@ -0,0 +1,53 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class SayLanguageCommand : IConsoleCommand +{ + public string Command => "saylang"; + public string Description => Loc.GetString("command-saylang-desc"); + public string Help => Loc.GetString("command-saylang-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not {} playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + if (args.Length < 2) + return; + + var languageId = args[0]; + var message = string.Join(" ", args, startIndex: 1, count: args.Length - 1).Trim(); + + if (string.IsNullOrEmpty(message)) + return; + + var languages = IoCManager.Resolve().GetEntitySystem(); + var chats = IoCManager.Resolve().GetEntitySystem(); + + var language = languages.GetLanguagePrototype(languageId); + if (language == null || !languages.CanSpeak(playerEntity, language.ID)) + { + shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); + return; + } + + chats.TrySendInGameICMessage(playerEntity, message, InGameICChatType.Speak, ChatTransmitRange.Normal, false, shell, player, languageOverride: language); + } +} diff --git a/Content.Server/Language/Commands/SelectLanguageCommand.cs b/Content.Server/Language/Commands/SelectLanguageCommand.cs new file mode 100644 index 00000000000..e3363846539 --- /dev/null +++ b/Content.Server/Language/Commands/SelectLanguageCommand.cs @@ -0,0 +1,48 @@ +using System.Linq; +using Content.Shared.Administration; +using Robust.Shared.Console; +using Robust.Shared.Enums; + +namespace Content.Server.Language.Commands; + +[AnyCommand] +public sealed class SelectLanguageCommand : IConsoleCommand +{ + public string Command => "languageselect"; + public string Description => Loc.GetString("command-language-select-desc"); + public string Help => Loc.GetString("command-language-select-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (shell.Player is not { } player) + { + shell.WriteError(Loc.GetString("shell-cannot-run-command-from-server")); + return; + } + + if (player.Status != SessionStatus.InGame) + return; + + if (player.AttachedEntity is not { } playerEntity) + { + shell.WriteError(Loc.GetString("shell-must-be-attached-to-entity")); + return; + } + + if (args.Length < 1) + return; + + var languageId = args[0]; + + var languages = IoCManager.Resolve().GetEntitySystem(); + + var language = languages.GetLanguagePrototype(languageId); + if (language == null || !languages.CanSpeak(playerEntity, language.ID)) + { + shell.WriteError($"Language {languageId} is invalid or you cannot speak it!"); + return; + } + + languages.SetLanguage(playerEntity, language.ID); + } +} diff --git a/Content.Server/Language/DetermineEntityLanguagesEvent.cs b/Content.Server/Language/DetermineEntityLanguagesEvent.cs new file mode 100644 index 00000000000..13ab2cac279 --- /dev/null +++ b/Content.Server/Language/DetermineEntityLanguagesEvent.cs @@ -0,0 +1,29 @@ +namespace Content.Server.Language; + +/// +/// Raised in order to determine the language an entity speaks at the current moment, +/// as well as the list of all languages the entity may speak and understand. +/// +public sealed class DetermineEntityLanguagesEvent : EntityEventArgs +{ + /// + /// The default language of this entity. If empty, remain unchanged. + /// This field has no effect if the entity decides to speak in a concrete language. + /// + public string CurrentLanguage; + /// + /// The list of all languages the entity may speak. Must NOT be held as a reference! + /// + public List SpokenLanguages; + /// + /// The list of all languages the entity may understand. Must NOT be held as a reference! + /// + public List UnderstoodLanguages; + + public DetermineEntityLanguagesEvent(string currentLanguage, List spokenLanguages, List understoodLanguages) + { + CurrentLanguage = currentLanguage; + SpokenLanguages = spokenLanguages; + UnderstoodLanguages = understoodLanguages; + } +} diff --git a/Content.Server/Language/LanguageSystem.Networking.cs b/Content.Server/Language/LanguageSystem.Networking.cs new file mode 100644 index 00000000000..7517b4185e3 --- /dev/null +++ b/Content.Server/Language/LanguageSystem.Networking.cs @@ -0,0 +1,59 @@ +using Content.Server.Mind; +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Robust.Shared.Player; + +namespace Content.Server.Language; + +/// +/// LanguageSystem Networking +/// This is used to update client state when mind change entity. +/// + +public sealed partial class LanguageSystem +{ + [Dependency] private readonly MindSystem _mind = default!; + + + public void InitializeNet() + { + // Refresh the client's state when its mind hops to a different entity + SubscribeLocalEvent((uid, _, _) => SendLanguageStateToClient(uid)); + SubscribeLocalEvent((_, _, args) => + { + if (args.Mind.Comp.Session != null) + SendLanguageStateToClient(args.Mind.Comp.Session); + }); + + SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp)); + SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession)); + } + + + private void SendLanguageStateToClient(EntityUid uid, LanguageSpeakerComponent? comp = null) + { + // Try to find a mind inside the entity and notify its session + if (!_mind.TryGetMind(uid, out _, out var mindComp) || mindComp.Session == null) + return; + + SendLanguageStateToClient(uid, mindComp.Session, comp); + } + + private void SendLanguageStateToClient(ICommonSession session, LanguageSpeakerComponent? comp = null) + { + // Try to find an entity associated with the session and resolve the languages from it + if (session.AttachedEntity is not { Valid: true } entity) + return; + + SendLanguageStateToClient(entity, session, comp); + } + + private void SendLanguageStateToClient(EntityUid uid, ICommonSession session, LanguageSpeakerComponent? component = null) + { + var langs = GetLanguages(uid, component); + var message = new LanguagesUpdatedMessage(langs.CurrentLanguage, langs.SpokenLanguages, langs.UnderstoodLanguages); + RaiseNetworkEvent(message, session); + } +} diff --git a/Content.Server/Language/LanguageSystem.cs b/Content.Server/Language/LanguageSystem.cs new file mode 100644 index 00000000000..f1bf44c1f4f --- /dev/null +++ b/Content.Server/Language/LanguageSystem.cs @@ -0,0 +1,289 @@ +using System.Linq; +using System.Text; +using Content.Server.GameTicking.Events; +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Robust.Shared.Random; +using UniversalLanguageSpeakerComponent = Content.Shared.Language.Components.UniversalLanguageSpeakerComponent; + +namespace Content.Server.Language; + +public sealed partial class LanguageSystem : SharedLanguageSystem +{ + // Static and re-used event instances used to minimize memory allocations during language processing, which can happen many times per tick. + // These are used in the method GetLanguages and returned from it. They should never be mutated outside of that method or returned outside this system. + private readonly DetermineEntityLanguagesEvent + _determineLanguagesEvent = new(string.Empty, new(), new()), + _universalLanguagesEvent = new(UniversalPrototype, [UniversalPrototype], [UniversalPrototype]); // Returned for universal speakers only + + /// + /// A random number added to each pseudo-random number's seed. Changes every round. + /// + public int RandomRoundSeed { get; private set; } + + + public override void Initialize() + { + base.Initialize(); + + SubscribeNetworkEvent(OnClientSetLanguage); + SubscribeLocalEvent(OnInitLanguageSpeaker); + SubscribeLocalEvent(_ => RandomRoundSeed = _random.Next()); + + InitializeNet(); + } + + + #region public api + /// + /// Obfuscate a message using an entity's default language. + /// + public string ObfuscateSpeech(EntityUid source, string message) + { + var language = GetLanguage(source) ?? Universal; + return ObfuscateSpeech(message, language); + } + + /// + /// Obfuscate a message using the given language. + /// + public string ObfuscateSpeech(string message, LanguagePrototype language) + { + var builder = new StringBuilder(); + if (language.ObfuscateSyllables) + ObfuscateSyllables(builder, message, language); + else + ObfuscatePhrases(builder, message, language); + + return builder.ToString(); + } + + public bool CanUnderstand(EntityUid listener, LanguagePrototype language, LanguageSpeakerComponent? listenerLanguageComp = null) + { + if (language.ID == UniversalPrototype || HasComp(listener)) + return true; + + var listenerLanguages = GetLanguages(listener, listenerLanguageComp)?.UnderstoodLanguages; + + return listenerLanguages?.Contains(language.ID, StringComparer.Ordinal) ?? false; + } + + public bool CanSpeak(EntityUid speaker, string language, LanguageSpeakerComponent? speakerComp = null) + { + if (HasComp(speaker)) + return true; + + var langs = GetLanguages(speaker, speakerComp)?.UnderstoodLanguages; + return langs?.Contains(language, StringComparer.Ordinal) ?? false; + } + + /// + /// Returns the current language of the given entity. + /// Assumes Universal if not specified. + /// + public LanguagePrototype GetLanguage(EntityUid speaker, LanguageSpeakerComponent? languageComp = null) + { + var id = GetLanguages(speaker, languageComp)?.CurrentLanguage; + if (id == null) + return Universal; // Fallback + + _prototype.TryIndex(id, out LanguagePrototype? proto); + + return proto ?? Universal; + } + + public void SetLanguage(EntityUid speaker, string language, LanguageSpeakerComponent? languageComp = null) + { + if (!CanSpeak(speaker, language) || HasComp(speaker)) + return; + + if (languageComp == null && !TryComp(speaker, out languageComp)) + return; + + if (languageComp.CurrentLanguage == language) + return; + + languageComp.CurrentLanguage = language; + + RaiseLocalEvent(speaker, new LanguagesUpdateEvent(), true); + } + + /// + /// Adds a new language to the lists of understood and/or spoken languages of the given component. + /// + public void AddLanguage(LanguageSpeakerComponent comp, string language, bool addSpoken = true, bool addUnderstood = true) + { + if (addSpoken && !comp.SpokenLanguages.Contains(language)) + comp.SpokenLanguages.Add(language); + + if (addUnderstood && !comp.UnderstoodLanguages.Contains(language)) + comp.UnderstoodLanguages.Add(language); + + RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); + } + + public (List spoken, List understood) GetAllLanguages(EntityUid speaker) + { + var languages = GetLanguages(speaker); + // The lists need to be copied because the internal ones are re-used for performance reasons. + return (new List(languages.SpokenLanguages), new List(languages.UnderstoodLanguages)); + } + + /// + /// Ensures the given entity has a valid language as its current language. + /// If not, sets it to the first entry of its SpokenLanguages list, or universal if it's empty. + /// + public void EnsureValidLanguage(EntityUid entity, LanguageSpeakerComponent? comp = null) + { + if (comp == null && !TryComp(entity, out comp)) + return; + + var langs = GetLanguages(entity, comp); + if (!langs.SpokenLanguages.Contains(comp!.CurrentLanguage, StringComparer.Ordinal)) + { + comp.CurrentLanguage = langs.SpokenLanguages.FirstOrDefault(UniversalPrototype); + RaiseLocalEvent(comp.Owner, new LanguagesUpdateEvent(), true); + } + } + #endregion + + #region event handling + private void OnInitLanguageSpeaker(EntityUid uid, LanguageSpeakerComponent component, ComponentInit args) + { + if (string.IsNullOrEmpty(component.CurrentLanguage)) + component.CurrentLanguage = component.SpokenLanguages.FirstOrDefault(UniversalPrototype); + } + #endregion + + #region internal api - obfuscation + private void ObfuscateSyllables(StringBuilder builder, string message, LanguagePrototype language) + { + // Go through each word. Calculate its hash sum and count the number of letters. + // Replicate it with pseudo-random syllables of pseudo-random (but similar) length. Use the hash code as the seed. + // This means that identical words will be obfuscated identically. Simple words like "hello" or "yes" in different langs can be memorized. + var wordBeginIndex = 0; + var hashCode = 0; + for (var i = 0; i < message.Length; i++) + { + var ch = char.ToLower(message[i]); + // A word ends when one of the following is found: a space, a sentence end, or EOM + if (char.IsWhiteSpace(ch) || IsSentenceEnd(ch) || i == message.Length - 1) + { + var wordLength = i - wordBeginIndex; + if (wordLength > 0) + { + var newWordLength = PseudoRandomNumber(hashCode, 1, 4); + + for (var j = 0; j < newWordLength; j++) + { + var index = PseudoRandomNumber(hashCode + j, 0, language.Replacement.Count); + builder.Append(language.Replacement[index]); + } + } + + builder.Append(ch); + hashCode = 0; + wordBeginIndex = i + 1; + } + else + hashCode = hashCode * 31 + ch; + } + } + + private void ObfuscatePhrases(StringBuilder builder, string message, LanguagePrototype language) + { + // In a similar manner, each phrase is obfuscated with a random number of conjoined obfuscation phrases. + // However, the number of phrases depends on the number of characters in the original phrase. + var sentenceBeginIndex = 0; + for (var i = 0; i < message.Length; i++) + { + var ch = char.ToLower(message[i]); + if (IsSentenceEnd(ch) || i == message.Length - 1) + { + var length = i - sentenceBeginIndex; + if (length > 0) + { + var newLength = (int) Math.Clamp(Math.Cbrt(length) - 1, 1, 4); // 27+ chars for 2 phrases, 64+ for 3, 125+ for 4. + + for (var j = 0; j < newLength; j++) + { + var phrase = _random.Pick(language.Replacement); + builder.Append(phrase); + } + } + sentenceBeginIndex = i + 1; + + if (IsSentenceEnd(ch)) + builder.Append(ch).Append(" "); + } + } + } + + private static bool IsSentenceEnd(char ch) + { + return ch is '.' or '!' or '?'; + } + #endregion + + #region internal api - misc + /// + /// Dynamically resolves the current language of the entity and the list of all languages it speaks. + /// + /// If the entity is not a language speaker, or is a universal language speaker, then it's assumed to speak Universal, + /// aka all languages at once and none at the same time. + /// + /// + /// The returned event is reused and thus must not be held as a reference anywhere but inside the caller function. + /// + private DetermineEntityLanguagesEvent GetLanguages(EntityUid speaker, LanguageSpeakerComponent? comp = null) + { + // This is a shortcut for ghosts and entities that should not speak normally (admemes) + if (HasComp(speaker) || !TryComp(speaker, out comp)) + return _universalLanguagesEvent; + + var ev = _determineLanguagesEvent; + ev.SpokenLanguages.Clear(); + ev.UnderstoodLanguages.Clear(); + + ev.CurrentLanguage = comp.CurrentLanguage; + ev.SpokenLanguages.AddRange(comp.SpokenLanguages); + ev.UnderstoodLanguages.AddRange(comp.UnderstoodLanguages); + + RaiseLocalEvent(speaker, ev, true); + + if (ev.CurrentLanguage.Length == 0) + ev.CurrentLanguage = !string.IsNullOrEmpty(comp.CurrentLanguage) ? comp.CurrentLanguage : UniversalPrototype; // Fall back to account for admemes like admins possessing a bread + return ev; + } + + /// + /// Generates a stable pseudo-random number in the range (min, max) for the given seed. + /// Each input seed corresponds to exactly one random number. + /// + private int PseudoRandomNumber(int seed, int min, int max) + { + // This is not a uniform distribution, but it shouldn't matter given there's 2^31 possible random numbers, + // the bias of this function should be so tiny it will never be noticed. + seed += RandomRoundSeed; + var random = ((seed * 1103515245) + 12345) & 0x7fffffff; // Source: http://cs.uccs.edu/~cs591/bufferOverflow/glibc-2.2.4/stdlib/random_r.c + return random % (max - min) + min; + } + + /// + /// Set CurrentLanguage of the client, the client must be able to Understand the language requested. + /// + private void OnClientSetLanguage(LanguagesSetMessage message, EntitySessionEventArgs args) + { + if (args.SenderSession.AttachedEntity is not {Valid: true} speaker) + return; + + var language = GetLanguagePrototype(message.CurrentLanguage); + + if (language == null || !CanSpeak(speaker, language.ID)) + return; + + SetLanguage(speaker, language.ID); + } + #endregion +} diff --git a/Content.Server/Language/TranslatorImplanterSystem.cs b/Content.Server/Language/TranslatorImplanterSystem.cs new file mode 100644 index 00000000000..1e0c13375e4 --- /dev/null +++ b/Content.Server/Language/TranslatorImplanterSystem.cs @@ -0,0 +1,72 @@ +using System.Linq; +using Content.Server.Administration.Logs; +using Content.Server.Popups; +using Content.Shared.Database; +using Content.Shared.Interaction; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Content.Shared.Mobs.Components; +using Content.Shared.Language.Components.Translators; + +namespace Content.Server.Language; + +public sealed class TranslatorImplanterSystem : SharedTranslatorImplanterSystem +{ + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly LanguageSystem _language = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnImplant); + } + + + private void OnImplant(EntityUid implanter, TranslatorImplanterComponent component, AfterInteractEvent args) + { + if (component.Used || !args.CanReach || args.Target is not { Valid: true } target) + return; + + if (!TryComp(target, out var speaker)) + return; + + if (component.MobsOnly && !HasComp(target)) + { + _popup.PopupEntity("translator-implanter-refuse", component.Owner); + return; + } + + var understood = _language.GetAllLanguages(target).understood; + if (component.RequiredLanguages.Count > 0 && !component.RequiredLanguages.Any(lang => understood.Contains(lang))) + { + _popup.PopupEntity(Loc.GetString("translator-implanter-refuse", + ("implanter", implanter), ("target", target)), implanter); + return; + } + + var intrinsic = EnsureComp(target); + intrinsic.Enabled = true; + + foreach (var lang in component.SpokenLanguages.Where(lang => !intrinsic.SpokenLanguages.Contains(lang))) + intrinsic.SpokenLanguages.Add(lang); + + foreach (var lang in component.UnderstoodLanguages.Where(lang => !intrinsic.UnderstoodLanguages.Contains(lang))) + intrinsic.UnderstoodLanguages.Add(lang); + + component.Used = true; + _popup.PopupEntity(Loc.GetString("translator-implanter-success", + ("implanter", implanter), ("target", target)), implanter); + + _adminLogger.Add(LogType.Action, LogImpact.Medium, + $"{ToPrettyString(args.User):player} used {ToPrettyString(implanter):implanter} to give {ToPrettyString(target):target} the following languages:" + + $"\nSpoken: {string.Join(", ", component.SpokenLanguages)}; Understood: {string.Join(", ", component.UnderstoodLanguages)}"); + + OnAppearanceChange(implanter, component); + RaiseLocalEvent(target, new LanguagesUpdateEvent(), true); + } +} diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs new file mode 100644 index 00000000000..3b7704b9a71 --- /dev/null +++ b/Content.Server/Language/TranslatorSystem.cs @@ -0,0 +1,225 @@ +using System.Linq; +using Content.Server.Popups; +using Content.Server.PowerCell; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Language; +using Content.Shared.Language.Events; +using Content.Shared.Language.Systems; +using Content.Shared.PowerCell; +using Content.Shared.Language.Components.Translators; + +namespace Content.Server.Language; + +// This does not support holding multiple translators at once. +// That shouldn't be an issue for now, but it needs to be fixed later. +public sealed class TranslatorSystem : SharedTranslatorSystem +{ + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly LanguageSystem _language = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + + public override void Initialize() + { + base.Initialize(); + + // I wanna die. But my death won't help us discover polymorphism. + SubscribeLocalEvent(OnDetermineLanguages); + SubscribeLocalEvent(OnDetermineLanguages); + SubscribeLocalEvent(OnDetermineLanguages); + + SubscribeLocalEvent(OnTranslatorToggle); + SubscribeLocalEvent(OnPowerCellSlotEmpty); + + // TODO: why does this use InteractHandEvent?? + SubscribeLocalEvent(OnTranslatorInteract); + SubscribeLocalEvent(OnTranslatorDropped); + } + + private void OnDetermineLanguages(EntityUid uid, IntrinsicTranslatorComponent component, + DetermineEntityLanguagesEvent ev) + { + if (!component.Enabled) + return; + + if (!_powerCell.HasActivatableCharge(uid)) + return; + + var addUnderstood = true; + var addSpoken = true; + if (component.RequiredLanguages.Count > 0) + { + if (component.RequiresAllLanguages) + { + // Add langs when the wielder has all of the required languages + foreach (var language in component.RequiredLanguages) + { + if (!ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) + addSpoken = false; + + if (!ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) + addUnderstood = false; + } + } + else + { + // Add langs when the wielder has at least one of the required languages + addUnderstood = false; + addSpoken = false; + foreach (var language in component.RequiredLanguages) + { + if (ev.SpokenLanguages.Contains(language, StringComparer.Ordinal)) + addSpoken = true; + + if (ev.UnderstoodLanguages.Contains(language, StringComparer.Ordinal)) + addUnderstood = true; + } + } + } + + if (addSpoken) + { + foreach (var language in component.SpokenLanguages) + AddIfNotExists(ev.SpokenLanguages, language); + + if (component.DefaultLanguageOverride != null && ev.CurrentLanguage.Length == 0) + ev.CurrentLanguage = component.DefaultLanguageOverride; + } + + if (addUnderstood) + foreach (var language in component.UnderstoodLanguages) + AddIfNotExists(ev.UnderstoodLanguages, language); + } + + private void OnTranslatorInteract( EntityUid translator, HandheldTranslatorComponent component, InteractHandEvent args) + { + var holder = args.User; + if (!EntityManager.HasComponent(holder)) + return; + + var intrinsic = EnsureComp(holder); + UpdateBoundIntrinsicComp(component, intrinsic, component.Enabled); + + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + + private void OnTranslatorDropped(EntityUid translator, HandheldTranslatorComponent component, DroppedEvent args) + { + var holder = args.User; + if (!EntityManager.TryGetComponent(holder, out var intrinsic)) + return; + + if (intrinsic.Issuer == component) + { + intrinsic.Enabled = false; + RemCompDeferred(holder, intrinsic); + } + + _language.EnsureValidLanguage(holder); + + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + + private void OnTranslatorToggle(EntityUid translator, HandheldTranslatorComponent component, ActivateInWorldEvent args) + { + if (!component.ToggleOnInteract) + return; + + var hasPower = _powerCell.HasDrawCharge(translator); + + if (Transform(args.Target).ParentUid is { Valid: true } holder + && EntityManager.HasComponent(holder)) + { + // This translator is held by a language speaker and thus has an intrinsic counterpart bound to it. + // Make sure it's up-to-date. + var intrinsic = EnsureComp(holder); + var isEnabled = !component.Enabled; + if (intrinsic.Issuer != component) + { + // The intrinsic comp wasn't owned by this handheld component, so this comp wasn't the active translator. + // Thus it needs to be turned on regardless of its previous state. + intrinsic.Issuer = component; + isEnabled = true; + } + + isEnabled &= hasPower; + UpdateBoundIntrinsicComp(component, intrinsic, isEnabled); + component.Enabled = isEnabled; + _powerCell.SetPowerCellDrawEnabled(translator, isEnabled); + + _language.EnsureValidLanguage(holder); + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + else + { + // This is a standalone translator (e.g. lying on the ground), toggle its state. + component.Enabled = !component.Enabled && hasPower; + _powerCell.SetPowerCellDrawEnabled(translator, !component.Enabled && hasPower); + } + + OnAppearanceChange(translator, component); + + // HasPower shows a popup when there's no power, so we do not proceed in that case + if (hasPower) + { + var message = Loc.GetString( + component.Enabled + ? "translator-component-turnon" + : "translator-component-shutoff", + ("translator", component.Owner)); + _popup.PopupEntity(message, component.Owner, args.User); + } + } + + private void OnPowerCellSlotEmpty(EntityUid translator, HandheldTranslatorComponent component, PowerCellSlotEmptyEvent args) + { + component.Enabled = false; + _powerCell.SetPowerCellDrawEnabled(translator, false); + OnAppearanceChange(translator, component); + + if (Transform(translator).ParentUid is { Valid: true } holder + && EntityManager.HasComponent(holder)) + { + if (!EntityManager.TryGetComponent(holder, out var intrinsic)) + return; + + if (intrinsic.Issuer == component) + { + intrinsic.Enabled = false; + EntityManager.RemoveComponent(holder, intrinsic); + } + + _language.EnsureValidLanguage(holder); + RaiseLocalEvent(holder, new LanguagesUpdateEvent(), true); + } + } + + /// + /// Copies the state from the handheld to the intrinsic component + /// + private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTranslatorComponent intrinsic, bool isEnabled) + { + if (isEnabled) + { + intrinsic.SpokenLanguages = new List(comp.SpokenLanguages); + intrinsic.UnderstoodLanguages = new List(comp.UnderstoodLanguages); + intrinsic.DefaultLanguageOverride = comp.DefaultLanguageOverride; + } + else + { + intrinsic.SpokenLanguages.Clear(); + intrinsic.UnderstoodLanguages.Clear(); + intrinsic.DefaultLanguageOverride = null; + } + + intrinsic.Enabled = isEnabled; + intrinsic.Issuer = comp; + } + + private static void AddIfNotExists(List list, string item) + { + if (list.Contains(item)) + return; + list.Add(item); + } +} diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs index 2c9b11dbd3d..92cd794ce2c 100644 --- a/Content.Server/Magic/MagicSystem.cs +++ b/Content.Server/Magic/MagicSystem.cs @@ -168,7 +168,7 @@ private void OnProjectileSpell(ProjectileSpellEvent ev) foreach (var pos in GetSpawnPositions(xform, ev.Pos)) { // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map. - var mapPos = pos.ToMap(EntityManager); + var mapPos = pos.ToMap(EntityManager, _transformSystem); var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _) ? pos.WithEntityId(gridUid, EntityManager) : new(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position); diff --git a/Content.Server/Mind/Commands/MakeSentientCommand.cs b/Content.Server/Mind/Commands/MakeSentientCommand.cs index 5e19d135b6f..cacd499ab8d 100644 --- a/Content.Server/Mind/Commands/MakeSentientCommand.cs +++ b/Content.Server/Mind/Commands/MakeSentientCommand.cs @@ -1,7 +1,10 @@ using Content.Server.Administration; +using Content.Server.Language; using Content.Shared.Administration; using Content.Shared.Emoting; using Content.Shared.Examine; +using Content.Shared.Language; +using Content.Shared.Language.Systems; using Content.Shared.Mind.Components; using Content.Shared.Movement.Components; using Content.Shared.Speech; @@ -55,6 +58,13 @@ public static void MakeSentient(EntityUid uid, IEntityManager entityManager, boo { entityManager.EnsureComponent(uid); entityManager.EnsureComponent(uid); + + var language = IoCManager.Resolve().GetEntitySystem(); + var speaker = entityManager.EnsureComponent(uid); + // If the speaker knows any language (like monkey or robot), they keep those + // Otherwise, we give them the fallback + if (speaker.SpokenLanguages.Count == 0) + language.AddLanguage(speaker, SharedLanguageSystem.FallbackLanguagePrototype); } entityManager.EnsureComponent(uid); diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs index 3e030aa8197..3485bd2a18c 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesInRangePrecondition.cs @@ -22,6 +22,6 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs index 6d8977bb7a7..9d000ca2eb8 100644 --- a/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/CoordinatesNotInRangePrecondition.cs @@ -22,7 +22,7 @@ public override bool IsMet(NPCBlackboard blackboard) if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) return false; - return !coordinates.InRange(_entManager, target, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return !coordinates.InRange(_entManager, _entManager.System(), target, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs index 5d616ba630e..aaccb426d71 100644 --- a/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/TargetInRangePrecondition.cs @@ -23,6 +23,6 @@ public override bool IsMet(NPCBlackboard blackboard) !_entManager.TryGetComponent(target, out var targetXform)) return false; - return coordinates.InRange(_entManager, targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); + return coordinates.InRange(_entManager, _entManager.System(), targetXform.Coordinates, blackboard.GetValueOrDefault(RangeKey, _entManager)); } } diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs index 95f931cdd6a..a59af88ff58 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs @@ -405,7 +405,7 @@ public async void GetPathEvent( return null; } - var localPos = xform.InvWorldMatrix.Transform(coordinates.ToMapPos(EntityManager)); + var localPos = xform.InvWorldMatrix.Transform(coordinates.ToMapPos(EntityManager, _transform)); var origin = GetOrigin(localPos); if (!TryGetChunk(origin, comp, out var chunk)) diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs index 7ac6768e359..e7af2c91073 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs @@ -56,7 +56,30 @@ private bool IsFreeSpace( return true; } - return false; + // TODO: Ideally for "FreeSpace" we check all entities on the tile and build flags dynamically (pathfinder refactor in future). + var ents = _entSetPool.Get(); + _lookup.GetLocalEntitiesIntersecting(node.GraphUid, node.ChunkOrigin, ents, flags: LookupFlags.Static); + var result = true; + + if (ents.Count > 0) + { + var fixtures = _fixturesQuery.GetComponent(uid); + var physics = _physicsQuery.GetComponent(uid); + + foreach (var intersecting in ents) + { + if (!_physics.IsCurrentlyHardCollidable((uid, fixtures, physics), intersecting)) + { + continue; + } + + result = false; + break; + } + } + + _entSetPool.Return(ents); + return result; } /// diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index fc483f68c3b..33941be9292 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -43,6 +43,7 @@ public sealed class NPCUtilitySystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SolutionContainerSystem _solutions = default!; [Dependency] private readonly WeldableSystem _weldable = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private EntityQuery _puddleQuery; private EntityQuery _xformQuery; @@ -296,7 +297,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon { var radius = blackboard.GetValueOrDefault(NPCBlackboard.VisionRadius, EntityManager); - return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; + return _examine.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; } case TargetInLOSOrCurrentCon: { @@ -313,7 +314,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon return 1f; } - return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; + return _examine.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; } case TargetIsAliveCon: { diff --git a/Content.Server/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs similarity index 83% rename from Content.Server/Psionics/Abilities/DispelPowerSystem.cs rename to Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs index cb7ef8313cd..d338a5a5bcb 100644 --- a/Content.Server/Psionics/Abilities/DispelPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs @@ -1,20 +1,24 @@ using Content.Shared.Actions; using Content.Shared.StatusEffect; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; using Content.Shared.Revenant.Components; using Content.Server.Guardian; using Content.Server.Bible.Components; using Content.Server.Popups; +using Robust.Shared.Prototypes; using Robust.Shared.Player; using Robust.Shared.Random; +using Robust.Shared.Timing; +using Content.Shared.Mind; using Content.Shared.Actions.Events; using Robust.Shared.Audio.Systems; -namespace Content.Server.Psionics.Abilities +namespace Content.Server.Abilities.Psionics { public sealed class DispelPowerSystem : EntitySystem { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; @@ -23,6 +27,8 @@ public sealed class DispelPowerSystem : EntitySystem [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; public override void Initialize() @@ -46,13 +52,10 @@ private void OnInit(EntityUid uid, DispelPowerComponent component, ComponentInit _actions.TryGetActionData( component.DispelActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.DispelActionEntity); - if (TryComp(uid, out var psionic)) + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) { + psionic.PsionicAbility = component.DispelActionEntity; psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.DispelFeedback); - //It's fully intended that Dispel doesn't increase Amplification, and instead heavily spikes Dampening - //Antimage archetype. - psionic.Dampening += 1f; } } @@ -63,16 +66,12 @@ private void OnShutdown(EntityUid uid, DispelPowerComponent component, Component if (TryComp(uid, out var psionic)) { psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.DispelFeedback); - psionic.Dampening -= 1f; } } private void OnPowerUsed(DispelPowerActionEvent args) { - if (HasComp(args.Target) || HasComp(args.Performer)) - return; - if (!TryComp(args.Performer, out var psionic) || !HasComp(args.Target)) + if (HasComp(args.Target)) return; var ev = new DispelledEvent(); @@ -81,9 +80,7 @@ private void OnPowerUsed(DispelPowerActionEvent args) if (ev.Handled) { args.Handled = true; - _psionics.LogPowerUsed(args.Performer, "dispel", - (int) MathF.Round(-2 * psionic.Dampening + psionic.Amplification), - (int) MathF.Round(-4 * psionic.Dampening + psionic.Amplification)); + _psionics.LogPowerUsed(args.Performer, "dispel"); } } @@ -99,7 +96,7 @@ private void OnDispelled(EntityUid uid, DispellableComponent component, Dispelle private void OnDmgDispelled(EntityUid uid, DamageOnDispelComponent component, DispelledEvent args) { var damage = component.Damage; - var modifier = 1 + component.Variance - _random.NextFloat(0, component.Variance * 2); + var modifier = (1 + component.Variance) - (_random.NextFloat(0, component.Variance * 2)); damage *= modifier; DealDispelDamage(uid, damage); @@ -148,3 +145,5 @@ public void DealDispelDamage(EntityUid uid, DamageSpecifier? damage = null) } public sealed class DispelledEvent : HandledEntityEventArgs {} } + + diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs new file mode 100644 index 00000000000..b775117b716 --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs @@ -0,0 +1,74 @@ +using Content.Shared.Actions; +using Content.Shared.Abilities.Psionics; +using Content.Shared.StatusEffect; +using Content.Shared.Popups; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Content.Shared.Mind; +using Content.Shared.Actions.Events; + +namespace Content.Server.Abilities.Psionics +{ + public sealed class MetapsionicPowerSystem : EntitySystem + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly SharedPopupSystem _popups = default!; + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; + + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnPowerUsed); + } + + private void OnInit(EntityUid uid, MetapsionicPowerComponent component, ComponentInit args) + { + _actions.AddAction(uid, ref component.MetapsionicActionEntity, component.MetapsionicActionId ); + _actions.TryGetActionData( component.MetapsionicActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.MetapsionicActionEntity); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + { + psionic.PsionicAbility = component.MetapsionicActionEntity; + psionic.ActivePowers.Add(component); + } + + } + + private void OnShutdown(EntityUid uid, MetapsionicPowerComponent component, ComponentShutdown args) + { + _actions.RemoveAction(uid, component.MetapsionicActionEntity); + + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + } + } + + private void OnPowerUsed(EntityUid uid, MetapsionicPowerComponent component, MetapsionicPowerActionEvent args) + { + foreach (var entity in _lookup.GetEntitiesInRange(uid, component.Range)) + { + if (HasComp(entity) && entity != uid && !HasComp(entity) && + !(HasComp(entity) && Transform(entity).ParentUid == uid)) + { + _popups.PopupEntity(Loc.GetString("metapsionic-pulse-success"), uid, uid, PopupType.LargeCaution); + args.Handled = true; + return; + } + } + _popups.PopupEntity(Loc.GetString("metapsionic-pulse-failure"), uid, uid, PopupType.Large); + _psionics.LogPowerUsed(uid, "metapsionic pulse", 2, 4); + + args.Handled = true; + } + } +} diff --git a/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs similarity index 78% rename from Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs rename to Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index 1e50a586b4f..b23224cab48 100644 --- a/Content.Server/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -1,6 +1,5 @@ using Content.Shared.Actions; -using Content.Shared.Psionics.Abilities; -using Content.Shared.Psionics; +using Content.Shared.Abilities.Psionics; using Content.Shared.Speech; using Content.Shared.Stealth.Components; using Content.Shared.Mobs.Components; @@ -11,15 +10,19 @@ using Content.Server.Popups; using Content.Server.Psionics; using Content.Server.GameTicking; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; using Content.Shared.Mind; using Content.Shared.Actions.Events; -namespace Content.Server.Psionics.Abilities +namespace Content.Server.Abilities.Psionics { public sealed class MindSwapPowerSystem : EntitySystem { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; @@ -35,22 +38,20 @@ public override void Initialize() SubscribeLocalEvent(OnDispelled); SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnGhostAttempt); + // SubscribeLocalEvent(OnSwapInit); - SubscribeLocalEvent(OnSwapShutdown); - SubscribeLocalEvent(OnInsulated); } private void OnInit(EntityUid uid, MindSwapPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.MindSwapActionEntity, component.MindSwapActionId); - _actions.TryGetActionData( component.MindSwapActionEntity, out var actionData); + _actions.AddAction(uid, ref component.MindSwapActionEntity, component.MindSwapActionId ); + _actions.TryGetActionData( component.MindSwapActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.MindSwapActionEntity); - if (TryComp(uid, out var psionic)) + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) { + psionic.PsionicAbility = component.MindSwapActionEntity; psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.MindSwapFeedback); - psionic.Amplification += 1f; } } @@ -60,26 +61,20 @@ private void OnShutdown(EntityUid uid, MindSwapPowerComponent component, Compone if (TryComp(uid, out var psionic)) { psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.MindSwapFeedback); - psionic.Amplification -= 1f; } } private void OnPowerUsed(MindSwapPowerActionEvent args) { - if (!(TryComp(args.Target, out var damageable) && damageable.DamageContainerID == "Biological")) return; if (HasComp(args.Target)) return; - if (!TryComp(args.Performer, out var psionic)) - return; - Swap(args.Performer, args.Target); - _psionics.LogPowerUsed(args.Performer, "mind swap", (int) MathF.Round(psionic.Amplification / psionic.Dampening * 8), (int) MathF.Round(psionic.Amplification / psionic.Dampening * 12)); + _psionics.LogPowerUsed(args.Performer, "mind swap"); args.Handled = true; } @@ -130,8 +125,8 @@ private void OnDispelled(EntityUid uid, MindSwappedComponent component, Dispelle private void OnMobStateChanged(EntityUid uid, MindSwappedComponent component, MobStateChangedEvent args) { - if (args.NewMobState == MobState.Dead || args.NewMobState == MobState.Critical) - Swap(uid, component.OriginalEntity, true); + if (args.NewMobState == MobState.Dead) + RemComp(uid); } private void OnGhostAttempt(GhostAttemptHandleEvent args) @@ -156,21 +151,8 @@ private void OnSwapInit(EntityUid uid, MindSwappedComponent component, Component _actions.TryGetActionData( component.MindSwapReturnActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.MindSwapReturnActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.MindSwappedFeedback); - } - } - - private void OnSwapShutdown(EntityUid uid, MindSwappedComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.MindSwapReturnActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.MindSwappedFeedback); - } + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + psionic.PsionicAbility = component.MindSwapReturnActionEntity; } public void Swap(EntityUid performer, EntityUid target, bool end = false) @@ -183,13 +165,11 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) MindComponent? targetMind = null; // This is here to prevent missing MindContainerComponent Resolve errors. - if (!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)) - { + if(!_mindSystem.TryGetMind(performer, out var performerMindId, out performerMind)){ performerMind = null; }; - if (!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)) - { + if(!_mindSystem.TryGetMind(target, out var targetMindId, out targetMind)){ targetMind = null; }; //This is a terrible way to 'unattach' minds. I wanted to use UnVisit but in TransferTo's code they say @@ -222,7 +202,7 @@ public void Swap(EntityUid performer, EntityUid target, bool end = false) perfComp.OriginalEntity = target; targetComp.OriginalEntity = performer; } - //It shouldn't actually be possible anymore to get trapped under most circumstances, but for niche edge cases, I am leaving this here + public void GetTrapped(EntityUid uid) { @@ -240,9 +220,5 @@ public void GetTrapped(EntityUid uid) _metaDataSystem.SetEntityDescription(uid, Loc.GetString("telegnostic-trapped-entity-desc")); } } - public void OnInsulated(EntityUid uid, MindSwappedComponent component, PsionicInsulationEvent args) - { - Swap(uid, component.OriginalEntity, true); - } } } diff --git a/Content.Server/Psionics/Abilities/MindSwappedComponent.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs similarity index 79% rename from Content.Server/Psionics/Abilities/MindSwappedComponent.cs rename to Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs index 82c0313bca6..72cd6a66ef9 100644 --- a/Content.Server/Psionics/Abilities/MindSwappedComponent.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Psionics.Abilities +namespace Content.Server.Abilities.Psionics { [RegisterComponent] public sealed partial class MindSwappedComponent : Component @@ -14,8 +14,5 @@ public sealed partial class MindSwappedComponent : Component [DataField("mindSwapReturnActionEntity")] public EntityUid? MindSwapReturnActionEntity; - - [DataField("mindSwappedFeedback")] - public string MindSwappedFeedback = "mindswapped-feedback"; } } diff --git a/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs similarity index 54% rename from Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs rename to Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs index c935bc0123d..0fd261ef12f 100644 --- a/Content.Server/Psionics/Abilities/NoosphericZapPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs @@ -1,21 +1,26 @@ using Content.Shared.Actions; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; +using Content.Server.Psionics; using Content.Shared.StatusEffect; -using Content.Server.Electrocution; using Content.Server.Stunnable; using Content.Server.Beam; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Content.Server.Mind; using Content.Shared.Actions.Events; -namespace Content.Server.Psionics.Abilities +namespace Content.Server.Abilities.Psionics { public sealed class NoosphericZapPowerSystem : EntitySystem { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly StunSystem _stunSystem = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly BeamSystem _beam = default!; - [Dependency] private readonly ElectrocutionSystem _electrocution = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() @@ -32,11 +37,10 @@ private void OnInit(EntityUid uid, NoosphericZapPowerComponent component, Compon _actions.TryGetActionData( component.NoosphericZapActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.NoosphericZapActionEntity); - if (TryComp(uid, out var psionic)) + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) { + psionic.PsionicAbility = component.NoosphericZapActionEntity; psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.NoosphericZapFeedback); - psionic.Amplification += 1f; } } @@ -46,34 +50,24 @@ private void OnShutdown(EntityUid uid, NoosphericZapPowerComponent component, Co if (TryComp(uid, out var psionic)) { psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.NoosphericZapFeedback); - psionic.Amplification -= 1f; } } private void OnPowerUsed(NoosphericZapPowerActionEvent args) { - if (!TryComp(args.Performer, out var psionic)) + if (!HasComp(args.Target)) return; - if (!HasComp(args.Target) && !HasComp(args.Performer)) - { - _beam.TryCreateBeam(args.Performer, args.Target, "LightningNoospheric"); - _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(1 * psionic.Amplification), false); + if (HasComp(args.Target)) + return; - _electrocution.TryDoElectrocution(args.Target, null, - (int) MathF.Round(5f * psionic.Amplification), - new TimeSpan((long) MathF.Round(1f * psionic.Amplification)), - true, - ignoreInsulation: true); + _beam.TryCreateBeam(args.Performer, args.Target, "LightningNoospheric"); - _statusEffectsSystem.TryAddStatusEffect(args.Target, "Stutter", TimeSpan.FromSeconds(2 * psionic.Amplification), false, "StutteringAccent"); + _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(5), false); + _statusEffectsSystem.TryAddStatusEffect(args.Target, "Stutter", TimeSpan.FromSeconds(10), false, "StutteringAccent"); - _psionics.LogPowerUsed(args.Performer, "noopsheric zap", - (int) MathF.Round(6 * psionic.Amplification - psionic.Dampening), - (int) MathF.Round(8 * psionic.Amplification - psionic.Dampening)); - args.Handled = true; - } + _psionics.LogPowerUsed(args.Performer, "noospheric zap"); + args.Handled = true; } } } diff --git a/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs similarity index 57% rename from Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs rename to Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs index 0c50efb5cf3..5ca1dc7a6dc 100644 --- a/Content.Server/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs @@ -1,31 +1,31 @@ -using Content.Server.DoAfter; using Content.Shared.Actions; -using Content.Shared.Psionics.Abilities; +using Content.Shared.CombatMode.Pacification; +using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; -using Content.Shared.DoAfter; using Content.Shared.Stunnable; using Content.Shared.Stealth; using Content.Shared.Stealth.Components; -using Content.Shared.Psionics.Events; +using Content.Server.Psionics; +using Robust.Shared.Prototypes; +using Robust.Shared.Player; +using Robust.Shared.Audio; +using Robust.Shared.Timing; +using Content.Server.Mind; using Content.Shared.Actions.Events; using Robust.Shared.Audio.Systems; -using Content.Shared.Interaction.Events; -using Content.Shared.Weapons.Ranged.Events; -using Content.Shared.Throwing; -using Robust.Shared.Timing; -using Content.Shared.Psionics; -namespace Content.Server.Psionics.Abilities +namespace Content.Server.Abilities.Psionics { public sealed class PsionicInvisibilityPowerSystem : EntitySystem { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!; [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; [Dependency] private readonly SharedStealthSystem _stealth = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; public override void Initialize() { @@ -37,61 +37,43 @@ public override void Initialize() SubscribeLocalEvent(OnStart); SubscribeLocalEvent(OnEnd); SubscribeLocalEvent(OnDamageChanged); - SubscribeLocalEvent(OnAttackAttempt); - SubscribeLocalEvent(OnShootAttempt); - SubscribeLocalEvent(OnThrowAttempt); - SubscribeLocalEvent(OnInsulated); } private void OnInit(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentInit args) { - _actions.AddAction(uid, ref component.PsionicInvisibilityActionEntity, component.PsionicInvisibilityActionId); - _actions.TryGetActionData( component.PsionicInvisibilityActionEntity, out var actionData); + _actions.AddAction(uid, ref component.PsionicInvisibilityActionEntity, component.PsionicInvisibilityActionId ); + _actions.TryGetActionData( component.PsionicInvisibilityActionEntity, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(component.PsionicInvisibilityActionEntity); - if (TryComp(uid, out var psionic)) + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) { + psionic.PsionicAbility = component.PsionicInvisibilityActionEntity; psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.InvisibilityFeedback); - psionic.Amplification += 0.5f; } } private void OnShutdown(EntityUid uid, PsionicInvisibilityPowerComponent component, ComponentShutdown args) { - RemComp(uid); - RemComp(uid); _actions.RemoveAction(uid, component.PsionicInvisibilityActionEntity); if (TryComp(uid, out var psionic)) { psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.InvisibilityFeedback); - psionic.Amplification -= 0.5f; } } private void OnPowerUsed(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityPowerActionEvent args) { - if (!TryComp(uid, out var psionic)) - return; - - if (HasComp(uid)) + if (HasComp(uid)) return; - var ev = new PsionicInvisibilityTimerEvent(_gameTiming.CurTime); - var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseTimer, ev, uid) { Hidden = true }; - _doAfterSystem.TryStartDoAfter(doAfterArgs); - ToggleInvisibility(args.Performer); var action = Spawn(PsionicInvisibilityUsedComponent.PsionicInvisibilityUsedActionPrototype); _actions.AddAction(uid, action, action); - _actions.TryGetActionData(action, out var actionData); + _actions.TryGetActionData( action, out var actionData ); if (actionData is { UseDelay: not null }) _actions.StartUseDelay(action); - _psionics.LogPowerUsed(uid, "psionic invisibility", - (int) MathF.Round(8 * psionic.Amplification - 2 * psionic.Dampening), - (int) MathF.Round(12 * psionic.Amplification - 2 * psionic.Dampening)); + _psionics.LogPowerUsed(uid, "psionic invisibility"); args.Handled = true; } @@ -107,6 +89,7 @@ private void OnPowerOff(RemovePsionicInvisibilityOffPowerActionEvent args) private void OnStart(EntityUid uid, PsionicInvisibilityUsedComponent component, ComponentInit args) { EnsureComp(uid); + EnsureComp(uid); var stealth = EnsureComp(uid); _stealth.SetVisibility(uid, 0.66f, stealth); _audio.PlayPvs("/Audio/Effects/toss.ogg", uid); @@ -119,37 +102,24 @@ private void OnEnd(EntityUid uid, PsionicInvisibilityUsedComponent component, Co return; RemComp(uid); + RemComp(uid); RemComp(uid); _audio.PlayPvs("/Audio/Effects/toss.ogg", uid); + //Pretty sure this DOESN'T work as intended. _actions.RemoveAction(uid, component.PsionicInvisibilityUsedActionEntity); - DirtyEntity(uid); - } - private void OnAttackAttempt(EntityUid uid, PsionicInvisibilityUsedComponent component, AttackAttemptEvent args) - { - RemComp(uid); - } - - private void OnShootAttempt(EntityUid uid, PsionicInvisibilityUsedComponent component, ShotAttemptedEvent args) - { - RemComp(uid); + _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(8), false); + DirtyEntity(uid); } - private void OnThrowAttempt(EntityUid uid, PsionicInvisibilityUsedComponent component, ThrowAttemptEvent args) - { - RemComp(uid); - } private void OnDamageChanged(EntityUid uid, PsionicInvisibilityUsedComponent component, DamageChangedEvent args) { - if (!TryComp(uid, out var psionic)) - return; - if (!args.DamageIncreased) return; ToggleInvisibility(uid); - _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(4f / psionic.Dampening + psionic.Amplification), false); } + public void ToggleInvisibility(EntityUid uid) { if (!HasComp(uid)) @@ -160,19 +130,5 @@ public void ToggleInvisibility(EntityUid uid) RemComp(uid); } } - - public void OnDoAfter(EntityUid uid, PsionicInvisibilityPowerComponent component, PsionicInvisibilityTimerEvent args) - { - RemComp(uid); - } - - private void OnInsulated(EntityUid uid, PsionicInvisibilityUsedComponent component, PsionicInsulationEvent args) - { - if (!TryComp(uid, out var psionic)) - return; - - RemComp(uid); - _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(4f / psionic.Dampening + psionic.Amplification), false); - } } } diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs new file mode 100644 index 00000000000..097a0cb750b --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs @@ -0,0 +1,129 @@ +using Robust.Shared.Audio; +using Robust.Server.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Server.Chemistry.Containers.EntitySystems; +using Content.Server.Chemistry.EntitySystems; +using Content.Server.DoAfter; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Actions; +using Content.Shared.Chemistry.Components; +using Content.Shared.DoAfter; +using Content.Shared.FixedPoint; +using Content.Shared.Popups; +using Content.Shared.Psionics.Events; +using Content.Shared.Tag; +using Content.Shared.Examine; +using static Content.Shared.Examine.ExamineSystemShared; +using Robust.Shared.Timing; +using Content.Server.Mind; +using Content.Shared.Actions.Events; +using Content.Shared.Chemistry.EntitySystems; +using Robust.Server.Audio; + +namespace Content.Server.Abilities.Psionics +{ + public sealed class PsionicRegenerationPowerSystem : EntitySystem + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly AudioSystem _audioSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; + + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnPowerUsed); + + SubscribeLocalEvent(OnDispelled); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnInit(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentInit args) + { + _actions.AddAction(uid, ref component.PsionicRegenerationActionEntity, component.PsionicRegenerationActionId ); + _actions.TryGetActionData( component.PsionicRegenerationActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.PsionicRegenerationActionEntity); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + { + psionic.PsionicAbility = component.PsionicRegenerationActionEntity; + psionic.ActivePowers.Add(component); + } + } + + private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationPowerActionEvent args) + { + var ev = new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime); + var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseDelay, ev, uid); + + _doAfterSystem.TryStartDoAfter(doAfterArgs, out var doAfterId); + + component.DoAfter = doAfterId; + + _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-begin", ("entity", uid)), + uid, + // TODO: Use LoS-based Filter when one is available. + Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !_examine.InRangeUnOccluded(uid, entity, ExamineRange, null)), + true, + PopupType.Medium); + + _audioSystem.PlayPvs(component.SoundUse, component.Owner, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); + _psionics.LogPowerUsed(uid, "psionic regeneration"); + args.Handled = true; + } + + private void OnShutdown(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentShutdown args) + { + _actions.RemoveAction(uid, component.PsionicRegenerationActionEntity); + + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + } + } + + private void OnDispelled(EntityUid uid, PsionicRegenerationPowerComponent component, DispelledEvent args) + { + if (component.DoAfter == null) + return; + + _doAfterSystem.Cancel(component.DoAfter); + component.DoAfter = null; + + args.Handled = true; + } + + private void OnDoAfter(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationDoAfterEvent args) + { + component.DoAfter = null; + + if (!TryComp(uid, out var stream)) + return; + + // DoAfter has no way to run a callback during the process to give + // small doses of the reagent, so we wait until either the action + // is cancelled (by being dispelled) or complete to give the + // appropriate dose. A timestamp delta is used to accomplish this. + var percentageComplete = Math.Min(1f, (_gameTiming.CurTime - args.StartedAt).TotalSeconds / component.UseDelay); + + var solution = new Solution(); + solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(component.EssenceAmount * percentageComplete)); + _bloodstreamSystem.TryAddToChemicals(uid, solution, stream); + } + } +} + diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs new file mode 100644 index 00000000000..407b72c6b58 --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs @@ -0,0 +1,66 @@ +using Content.Shared.Actions; +using Content.Shared.Abilities.Psionics; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Popups; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Content.Server.Mind; +using Content.Shared.Actions.Events; + +namespace Content.Server.Abilities.Psionics +{ + public sealed class PyrokinesisPowerSystem : EntitySystem + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly FlammableSystem _flammableSystem = default!; + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnPowerUsed); + } + + private void OnInit(EntityUid uid, PyrokinesisPowerComponent component, ComponentInit args) + { + _actions.AddAction(uid, ref component.PyrokinesisActionEntity, component.PyrokinesisActionId ); + _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.PyrokinesisActionEntity); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + { + psionic.PsionicAbility = component.PyrokinesisActionEntity; + psionic.ActivePowers.Add(component); + } + } + + private void OnShutdown(EntityUid uid, PyrokinesisPowerComponent component, ComponentShutdown args) + { + _actions.RemoveAction(uid, component.PyrokinesisActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + } + } + + private void OnPowerUsed(PyrokinesisPowerActionEvent args) + { + if (!TryComp(args.Target, out var flammableComponent)) + return; + + flammableComponent.FireStacks += 5; + _flammableSystem.Ignite(args.Target, args.Target); + _popupSystem.PopupEntity(Loc.GetString("pyrokinesis-power-used", ("target", args.Target)), args.Target, Shared.Popups.PopupType.LargeCaution); + + _psionics.LogPowerUsed(args.Performer, "pyrokinesis"); + args.Handled = true; + } + } +} diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs new file mode 100644 index 00000000000..f7ae04b61ea --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -0,0 +1,67 @@ +using Content.Shared.Actions; +using Content.Shared.StatusEffect; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Mind.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Content.Server.Mind; +using Content.Shared.Actions.Events; + +namespace Content.Server.Abilities.Psionics +{ + public sealed class TelegnosisPowerSystem : EntitySystem + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly MindSwapPowerSystem _mindSwap = default!; + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnPowerUsed); + SubscribeLocalEvent(OnMindRemoved); + } + + private void OnInit(EntityUid uid, TelegnosisPowerComponent component, ComponentInit args) + { + _actions.AddAction(uid, ref component.TelegnosisActionEntity, component.TelegnosisActionId ); + _actions.TryGetActionData( component.TelegnosisActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.TelegnosisActionEntity); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + { + psionic.PsionicAbility = component.TelegnosisActionEntity; + psionic.ActivePowers.Add(component); + } + } + + private void OnShutdown(EntityUid uid, TelegnosisPowerComponent component, ComponentShutdown args) + { + _actions.RemoveAction(uid, component.TelegnosisActionEntity); + if (TryComp(uid, out var psionic)) + { + psionic.ActivePowers.Remove(component); + } + } + + private void OnPowerUsed(EntityUid uid, TelegnosisPowerComponent component, TelegnosisPowerActionEvent args) + { + var projection = Spawn(component.Prototype, Transform(uid).Coordinates); + Transform(projection).AttachToGridOrMap(); + _mindSwap.Swap(uid, projection); + + _psionics.LogPowerUsed(uid, "telegnosis"); + args.Handled = true; + } + private void OnMindRemoved(EntityUid uid, TelegnosticProjectionComponent component, MindRemovedMessage args) + { + QueueDel(uid); + } + } +} diff --git a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs similarity index 54% rename from Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs rename to Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs index 915abd12224..ee16aaccfb6 100644 --- a/Content.Server/Psionics/Abilities/PsionicAbilitiesSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -1,41 +1,77 @@ -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Actions; using Content.Shared.Psionics.Glimmer; using Content.Shared.Random; using Content.Shared.Random.Helpers; +using Content.Server.EUI; +using Content.Server.Psionics; +using Content.Server.Mind; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; +using Robust.Server.GameObjects; +using Robust.Server.Player; using Robust.Shared.Player; -using Content.Shared.Examine; -using Content.Shared.Popups; -using static Content.Shared.Examine.ExamineSystemShared; -namespace Content.Server.Psionics.Abilities +namespace Content.Server.Abilities.Psionics { public sealed class PsionicAbilitiesSystem : EntitySystem { [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly EuiManager _euiManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly SharedPopupSystem _popups = default!; + [Dependency] private readonly MindSystem _mindSystem = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnPlayerAttached); } - /// - /// Adds a psychic power once a character rolls one. This used to be a system you have to select for. However the opt-in is no longer the text window, but is now done at character creation. - /// TODO: This is going to get removed when I reach Part 3 of my reworks, when I touch upon the GlimmerSystem itself and overhaul how players get powers. - /// - /// - /// - /// - public void AddPsionics(EntityUid uid) + private void OnPlayerAttached(EntityUid uid, PsionicAwaitingPlayerComponent component, PlayerAttachedEvent args) + { + if (TryComp(uid, out var bonus) && bonus.Warn == true) + _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), args.Player); + else + AddRandomPsionicPower(uid); + RemCompDeferred(uid); + } + + public void AddPsionics(EntityUid uid, bool warn = true) + { + if (Deleted(uid)) + return; + + if (HasComp(uid)) + return; + + //Don't know if this will work. New mind state vs old. + if (!TryComp(uid, out var mindContainer) || + !_mindSystem.TryGetMind(uid, out _, out var mind )) + //|| + //!_mindSystem.TryGetMind(uid, out var mind, mindContainer)) + { + EnsureComp(uid); + return; + } + + if (!_mindSystem.TryGetSession(mind, out var client)) + return; + + if (warn && TryComp(uid, out var actor)) + _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), client); + else + AddRandomPsionicPower(uid); + } + + public void AddPsionics(EntityUid uid, string powerComp) { if (Deleted(uid)) return; @@ -43,11 +79,17 @@ public void AddPsionics(EntityUid uid) if (HasComp(uid)) return; - AddRandomPsionicPower(uid); + AddComp(uid); + + var newComponent = (Component) _componentFactory.GetComponent(powerComp); + newComponent.Owner = uid; + + EntityManager.AddComponent(uid, newComponent); } + public void AddRandomPsionicPower(EntityUid uid) { - EnsureComp(uid, out var psionic); + AddComp(uid); if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) { @@ -61,21 +103,11 @@ public void AddRandomPsionicPower(EntityUid uid) EntityManager.AddComponent(uid, newComponent); - _glimmerSystem.Glimmer += _random.Next((int) MathF.Round(psionic.Amplification * psionic.Dampening * 1), (int) MathF.Round(psionic.Amplification * psionic.Dampening * 5)); + _glimmerSystem.Glimmer += _random.Next(1, 5); } public void RemovePsionics(EntityUid uid) { - if (RemComp(uid)) - { - _popups.PopupEntity(Loc.GetString("mindbreaking-feedback", ("entity", uid)), - uid, - // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(uid).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(uid, entity, ExamineRange, null)), - true, - PopupType.Medium); - } - if (!TryComp(uid, out var psionic)) return; @@ -98,15 +130,14 @@ public void RemovePsionics(EntityUid uid) if (psionic.PsionicAbility != null){ _actionsSystem.TryGetActionData( psionic.PsionicAbility, out var psiAbility ); if (psiAbility != null){ + var owner = psiAbility.Owner; _actionsSystem.RemoveAction(uid, psiAbility.Owner); } } _statusEffectsSystem.TryAddStatusEffect(uid, "Stutter", TimeSpan.FromMinutes(5), false, "StutteringAccent"); - _glimmerSystem.Glimmer += _random.Next((int) MathF.Round(psionic.Amplification * psionic.Dampening * -10), (int) MathF.Round(psionic.Amplification * psionic.Dampening * -5)); RemComp(uid); - RemComp(uid); } } } diff --git a/Content.Server/Psionics/Audio/GlimmerSoundComponent.cs b/Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs similarity index 80% rename from Content.Server/Psionics/Audio/GlimmerSoundComponent.cs rename to Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs index 9a6c62381be..850be3e831c 100644 --- a/Content.Server/Psionics/Audio/GlimmerSoundComponent.cs +++ b/Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs @@ -2,8 +2,12 @@ using Content.Shared.Audio; using Content.Shared.Psionics.Glimmer; using Robust.Shared.Audio; +using Robust.Shared.ComponentTrees; +using Robust.Shared.GameStates; +using Robust.Shared.Physics; +using Robust.Shared.Serialization; -namespace Content.Server.Psionics.Audio +namespace Content.Server.Audio { [RegisterComponent] [Access(typeof(SharedAmbientSoundSystem), typeof(GlimmerReactiveSystem))] diff --git a/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs b/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs similarity index 85% rename from Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs rename to Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs index ad49075e65a..58ed1782741 100644 --- a/Content.Server/Psionics/Telepathy/TelepathyChatSystem.cs +++ b/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs @@ -2,7 +2,7 @@ using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Bed.Sleep; using Content.Shared.Chat; using Content.Shared.Database; @@ -16,10 +16,10 @@ using System.Linq; using System.Text; -namespace Content.Server.Psionics.Telepathy +namespace Content.Server.Nyanotrasen.Chat { /// - /// Extensions for Telepathic Chat + /// Extensions for nyano's chat stuff /// public sealed class NyanoChatSystem : EntitySystem @@ -47,9 +47,7 @@ private IEnumerable GetAdminClients() private List GetDreamers(IEnumerable removeList) { var filtered = Filter.Empty() - .AddWhereAttachedEntity(entity => HasComp(entity) - || HasComp(entity) && !HasComp(entity) && !HasComp(entity) - || HasComp(entity) && !HasComp(entity) && !HasComp(entity)) + .AddWhereAttachedEntity(entity => HasComp(entity) || HasComp(entity) && !HasComp(entity) && !HasComp(entity)) .Recipients .Select(p => p.ConnectedClient); @@ -63,7 +61,7 @@ private List GetDreamers(IEnumerable removeList) private bool IsEligibleForTelepathy(EntityUid entity) { - return TryComp(entity, out var psionic) && psionic.Telepath + return HasComp(entity) && !HasComp(entity) && !HasComp(entity) && (!TryComp(entity, out var mobstate) || mobstate.CurrentState == MobState.Alive); @@ -94,9 +92,9 @@ public void SendTelepathicChat(EntityUid source, string message, bool hideChat) if (_random.Prob(0.1f)) _glimmerSystem.Glimmer++; - if (_random.Prob(Math.Min(0.33f + (float) _glimmerSystem.Glimmer / 1500, 1))) + if (_random.Prob(Math.Min(0.33f + ((float) _glimmerSystem.Glimmer / 1500), 1))) { - float obfuscation = 0.25f + (float) _glimmerSystem.Glimmer / 2000; + float obfuscation = (0.25f + (float) _glimmerSystem.Glimmer / 2000); var obfuscated = ObfuscateMessageReadability(message, obfuscation); _chatManager.ChatMessageToMany(ChatChannel.Telepathic, obfuscated, messageWrap, source, hideChat, false, GetDreamers(clients), Color.PaleVioletRed); } @@ -113,7 +111,7 @@ private string ObfuscateMessageReadability(string message, float chance) for (var i = 0; i < message.Length; i++) { - if (char.IsWhiteSpace(modifiedMessage[i])) + if (char.IsWhiteSpace((modifiedMessage[i]))) { continue; } diff --git a/Content.Server/Psionics/Telepathy/TSayCommand.cs b/Content.Server/Nyanotrasen/Chat/TSayCommand.cs similarity index 95% rename from Content.Server/Psionics/Telepathy/TSayCommand.cs rename to Content.Server/Nyanotrasen/Chat/TSayCommand.cs index 8fbaa5e17b2..9ba27b65d71 100644 --- a/Content.Server/Psionics/Telepathy/TSayCommand.cs +++ b/Content.Server/Nyanotrasen/Chat/TSayCommand.cs @@ -1,10 +1,11 @@ using Content.Server.Chat.Systems; using Content.Shared.Administration; +using Robust.Server.Player; using Robust.Shared.Console; using Robust.Shared.Enums; using Robust.Shared.Player; -namespace Content.Server.Psionics.Telepathy +namespace Content.Server.Chat.Commands { [AnyCommand] internal sealed class TSayCommand : IConsoleCommand diff --git a/Content.Server/Psionics/Telepathy/TelepathicRepeaterComponent.cs b/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs similarity index 82% rename from Content.Server/Psionics/Telepathy/TelepathicRepeaterComponent.cs rename to Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs index 6e194f76c8f..fc199f4332a 100644 --- a/Content.Server/Psionics/Telepathy/TelepathicRepeaterComponent.cs +++ b/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Psionics.Telepathy +namespace Content.Server.Nyanotrasen.Chat { /// /// Repeats whatever is happening in telepathic chat. diff --git a/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs b/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs index 0ce3f9d7c64..a23a5b3d77d 100644 --- a/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs +++ b/Content.Server/Nyanotrasen/Chemistry/Effects/ChemRemovePsionic.cs @@ -1,5 +1,5 @@ using Content.Shared.Chemistry.Reagent; -using Content.Server.Psionics.Abilities; +using Content.Server.Abilities.Psionics; using JetBrains.Annotations; using Robust.Shared.Prototypes; diff --git a/Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs b/Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs new file mode 100644 index 00000000000..3b677bab2d4 --- /dev/null +++ b/Content.Server/Nyanotrasen/Objectives/Components/BecomePsionicConditionComponent.cs @@ -0,0 +1,11 @@ +using Content.Server.Objectives.Systems; + +namespace Content.Server.Objectives.Components; + +/// +/// Requires that the player dies to be complete. +/// +[RegisterComponent, Access(typeof(BecomePsionicConditionSystem))] +public sealed partial class BecomePsionicConditionComponent : Component +{ +} \ No newline at end of file diff --git a/Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs b/Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs new file mode 100644 index 00000000000..d090c320a41 --- /dev/null +++ b/Content.Server/Nyanotrasen/Objectives/Systems/BecomePsionicConditionSystem.cs @@ -0,0 +1,32 @@ +using Content.Shared.Abilities.Psionics; +using Content.Server.Objectives.Components; +using Content.Shared.Mind; +using Content.Shared.Objectives.Components; + +namespace Content.Server.Objectives.Systems +{ + public sealed class BecomePsionicConditionSystem : EntitySystem + { + private EntityQuery _metaQuery; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetProgress); + } + + private void OnGetProgress(EntityUid uid, BecomePsionicConditionComponent comp, ref ObjectiveGetProgressEvent args) + { + args.Progress = GetProgress(args.Mind); + } + + private float GetProgress(MindComponent mind) + { + var entMan = IoCManager.Resolve(); + if (HasComp(mind.CurrentEntity)) + return 1; + return 0; + } + } +} diff --git a/Content.Server/Psionics/AcceptPsionicsEui.cs b/Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs similarity index 95% rename from Content.Server/Psionics/AcceptPsionicsEui.cs rename to Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs index 7c652664c64..80fd8946f28 100644 --- a/Content.Server/Psionics/AcceptPsionicsEui.cs +++ b/Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs @@ -1,7 +1,7 @@ using Content.Shared.Psionics; using Content.Shared.Eui; using Content.Server.EUI; -using Content.Server.Psionics.Abilities; +using Content.Server.Abilities.Psionics; namespace Content.Server.Psionics { diff --git a/Content.Server/Psionics/AntiPsychicWeaponComponent.cs b/Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs similarity index 100% rename from Content.Server/Psionics/AntiPsychicWeaponComponent.cs rename to Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs diff --git a/Content.Server/Psionics/Dreams/DreamSystem.cs b/Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs similarity index 93% rename from Content.Server/Psionics/Dreams/DreamSystem.cs rename to Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs index 1731c7a9bf5..d6067717c94 100644 --- a/Content.Server/Psionics/Dreams/DreamSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs @@ -1,14 +1,17 @@ using Content.Shared.Dataset; using Content.Shared.Bed.Sleep; +using Content.Server.Chat.Systems; using Content.Server.Chat.Managers; using Robust.Shared.Random; using Robust.Shared.Prototypes; +using Robust.Server.GameObjects; using Robust.Shared.Player; namespace Content.Server.Psionics.Dreams { public sealed class DreamsSystem : EntitySystem { + [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; diff --git a/Content.Server/Psionics/Glimmer/GlimmerCommands.cs b/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs similarity index 100% rename from Content.Server/Psionics/Glimmer/GlimmerCommands.cs rename to Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs diff --git a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs similarity index 99% rename from Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs rename to Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs index c0802c8b670..da3b07d6dab 100644 --- a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs @@ -1,12 +1,14 @@ -using Content.Server.Psionics.Audio; +using Content.Server.Audio; using Content.Server.Power.Components; using Content.Server.Electrocution; using Content.Server.Lightning; using Content.Server.Explosion.EntitySystems; +using Content.Server.Construction; using Content.Server.Ghost; using Content.Server.Revenant.EntitySystems; using Content.Shared.Audio; using Content.Shared.Construction.EntitySystems; +using Content.Shared.Coordinates.Helpers; using Content.Shared.GameTicking; using Content.Shared.Psionics.Glimmer; using Content.Shared.Verbs; @@ -14,6 +16,7 @@ using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Construction.Components; +using Content.Shared.Mind; using Content.Shared.Mind.Components; using Content.Shared.Weapons.Melee.Components; using Robust.Shared.Audio; diff --git a/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs b/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs similarity index 94% rename from Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs rename to Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs index 57c74398b08..f0da85ce453 100644 --- a/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.CCVar; using Content.Shared.Psionics.Glimmer; using Content.Shared.GameTicking; +using Content.Server.CartridgeLoader.Cartridges; namespace Content.Server.Psionics.Glimmer { @@ -16,6 +17,7 @@ public sealed class PassiveGlimmerReductionSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly GlimmerMonitorCartridgeSystem _cartridgeSys = default!; /// List of glimmer values spaced by minute. public List GlimmerValues = new(); diff --git a/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs b/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs similarity index 100% rename from Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs rename to Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs diff --git a/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs similarity index 100% rename from Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs rename to Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs diff --git a/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs similarity index 88% rename from Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs rename to Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs index 9583f45fdc9..31e6b89f13d 100644 --- a/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs @@ -1,6 +1,5 @@ -using Content.Shared.Psionics.Abilities; -using Content.Shared.Psionics; -using Content.Server.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; +using Content.Server.Abilities.Psionics; using Content.Shared.Eye; using Content.Server.NPC.Systems; using Robust.Shared.Containers; @@ -21,6 +20,7 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnInsulInit); SubscribeLocalEvent(OnInsulShutdown); + SubscribeLocalEvent(OnEyeInit); /// Layer SubscribeLocalEvent(OnInvisInit); @@ -36,16 +36,10 @@ private void OnInit(EntityUid uid, PotentialPsionicComponent component, Componen SetCanSeePsionicInvisiblity(uid, false); } - /// - /// Being able to see invisible by default is no longer tracked by "Not having Potential Psionic". - /// Anything intended to be immune to invisibility(and mind magic in general) should instead have PsionicInsulation as a built-in component - /// - /// - /// - /// private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, ComponentInit args) { - RaiseLocalEvent(uid, new PsionicInsulationEvent()); + if (!HasComp(uid)) + return; if (HasComp(uid)) _invisSystem.ToggleInvisibility(uid); @@ -67,6 +61,9 @@ private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, Co private void OnInsulShutdown(EntityUid uid, PsionicInsulationComponent component, ComponentShutdown args) { + if (!HasComp(uid)) + return; + SetCanSeePsionicInvisiblity(uid, false); if (!HasComp(uid)) @@ -102,6 +99,10 @@ private void OnInvisShutdown(EntityUid uid, PsionicallyInvisibleComponent compon } } + private void OnEyeInit(EntityUid uid, EyeComponent component, ComponentInit args) + { + //SetCanSeePsionicInvisiblity(uid, true); //JJ Comment - Not allowed to modifies .yml on spawn any longer. See UninitializedSaveTest. + } private void OnEntInserted(EntityUid uid, PsionicallyInvisibleComponent component, EntInsertedIntoContainerMessage args) { DirtyEntity(args.Entity); @@ -124,7 +125,7 @@ public void SetCanSeePsionicInvisiblity(EntityUid uid, bool set) { if (EntityManager.TryGetComponent(uid, out EyeComponent? eye)) { - _eye.SetVisibilityMask(uid, eye.VisibilityMask & ~(int) VisibilityFlags.PsionicInvisibility, eye); + _eye.SetVisibilityMask(uid, eye.VisibilityMask & ~ (int) VisibilityFlags.PsionicInvisibility, eye); } } } diff --git a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs similarity index 95% rename from Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs rename to Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs index 268deddf6d9..859ceb7b83a 100644 --- a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs +++ b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Whitelist; +using Robust.Shared.Timing; namespace Content.Server.Psionics { diff --git a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs similarity index 95% rename from Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs rename to Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs index 403e0592617..cec755e3260 100644 --- a/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Stealth.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; namespace Content.Server.Psionics { @@ -11,6 +12,7 @@ namespace Content.Server.Psionics public sealed class PsionicInvisibleContactsSystem : EntitySystem { [Dependency] private readonly SharedStealthSystem _stealth = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; public override void Initialize() { diff --git a/Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs similarity index 100% rename from Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs rename to Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs b/Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs new file mode 100644 index 00000000000..9499497cd1d --- /dev/null +++ b/Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Psionics +{ + [RegisterComponent] + public sealed partial class PotentialPsionicComponent : Component + { + [DataField("chance")] + public float Chance = 0.04f; + + /// + /// YORO (you only reroll once) + /// + public bool Rerolled = false; + } +} diff --git a/Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs b/Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs similarity index 100% rename from Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs rename to Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs diff --git a/Content.Server/Psionics/PsionicBonusChanceComponent.cs b/Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs similarity index 100% rename from Content.Server/Psionics/PsionicBonusChanceComponent.cs rename to Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs diff --git a/Content.Server/Psionics/PsionicsCommands.cs b/Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs similarity index 84% rename from Content.Server/Psionics/PsionicsCommands.cs rename to Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs index 3f9ee794b38..959251d1fb7 100644 --- a/Content.Server/Psionics/PsionicsCommands.cs +++ b/Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs @@ -1,8 +1,9 @@ using Content.Server.Administration; using Content.Shared.Administration; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Mobs.Components; using Robust.Shared.Console; +using Robust.Server.GameObjects; using Content.Shared.Actions; using Robust.Shared.Player; @@ -18,8 +19,7 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args) { SharedActionsSystem actions = default!; var entMan = IoCManager.Resolve(); - foreach (var (actor, psionic, meta) in entMan.EntityQuery()) - { + foreach (var (actor, mob, psionic, meta) in entMan.EntityQuery()){ // filter out xenos, etc, with innate telepathy actions.TryGetActionData( psionic.PsionicAbility, out var actionData ); if (actionData == null || actionData.ToString() == null) diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs similarity index 91% rename from Content.Server/Psionics/PsionicsSystem.cs rename to Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs index bf829477609..5a96af2e96b 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs @@ -1,14 +1,19 @@ -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.StatusEffect; +using Content.Shared.Mobs; using Content.Shared.Psionics.Glimmer; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Damage.Events; +using Content.Shared.IdentityManagement; using Content.Shared.CCVar; -using Content.Server.Psionics.Abilities; +using Content.Server.Abilities.Psionics; +using Content.Server.Chat.Systems; using Content.Server.Electrocution; using Content.Server.NPC.Components; using Content.Server.NPC.Systems; +using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; using Robust.Shared.Configuration; using Robust.Shared.Random; @@ -22,6 +27,7 @@ public sealed class PsionicsSystem : EntitySystem [Dependency] private readonly ElectrocutionSystem _electrocutionSystem = default!; [Dependency] private readonly MindSwapPowerSystem _mindSwapPowerSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; + [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly NpcFactionSystem _npcFactonSystem = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; @@ -48,7 +54,6 @@ public override void Initialize() SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnRemove); } @@ -82,11 +87,7 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel _electrocutionSystem.TryDoElectrocution(args.User, null, 20, TimeSpan.FromSeconds(5), false); } } - private void OnStartup(EntityUid uid, PsionicComponent component, MapInitEvent args) - { - component.Amplification = _random.NextFloat(0.3f, 1.1f); - component.Dampening = _random.NextFloat(0.3f, 1.1f); - } + private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) { if (!component.Removable) @@ -103,7 +104,7 @@ private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit arg private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove args) { - if (!HasComp(uid)) + if (!TryComp(uid, out var factions)) return; _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); @@ -143,14 +144,14 @@ public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, boo } if (applyGlimmer) - chance += (float) _glimmerSystem.Glimmer / 1000; + chance += ((float) _glimmerSystem.Glimmer / 1000); chance *= multiplier; chance = Math.Clamp(chance, 0, 1); if (_random.Prob(chance)) - _psionicAbilitiesSystem.AddPsionics(uid); + _psionicAbilitiesSystem.AddPsionics(uid, warn); } public void RerollPsionics(EntityUid uid, PotentialPsionicComponent? psionic = null, float bonusMuliplier = 1f) diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs index 24459d29e22..148598fe2c3 100644 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs +++ b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs @@ -5,7 +5,7 @@ using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Fluids.EntitySystems; using Content.Server.Psionics; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Chat; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.EntitySystems; diff --git a/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs b/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs index b8cdcb56d47..bc3c22cc350 100644 --- a/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs +++ b/Content.Server/Nyanotrasen/Research/SophicScribe/SophicScribeSystem.cs @@ -1,4 +1,4 @@ -using Content.Server.Psionics.Abilities; +using Content.Server.Abilities.Psionics; using Content.Server.Chat.Systems; using Content.Server.Radio.Components; using Content.Server.Radio.EntitySystems; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs index 89b5a176f24..66eea988aeb 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs @@ -5,7 +5,7 @@ using Content.Server.Psionics.Glimmer; using Content.Server.StationEvents.Components; using Content.Shared.Psionics.Glimmer; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; namespace Content.Server.StationEvents.Events; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs index 89f3bc97501..63944563269 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs @@ -1,9 +1,10 @@ +using Robust.Server.GameObjects; using Robust.Shared.Random; -using Content.Server.Psionics.Abilities; +using Content.Server.Abilities.Psionics; using Content.Server.GameTicking.Rules.Components; using Content.Server.Psionics; using Content.Server.StationEvents.Components; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Robust.Shared.Player; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs index 6a2c1c3ba7d..c04543d2195 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs @@ -10,7 +10,7 @@ using Content.Server.Power.EntitySystems; using Content.Server.Psionics.Glimmer; using Content.Server.StationEvents.Components; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Damage; using Content.Shared.Inventory; using Content.Shared.Mobs.Components; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs index 8812ed1fe37..175318e15bd 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs @@ -1,9 +1,9 @@ using Robust.Shared.Random; -using Content.Server.Psionics.Abilities; +using Content.Server.Abilities.Psionics; using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Content.Server.Psionics; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Mobs.Systems; using Content.Shared.Psionics.Glimmer; using Content.Shared.Zombies; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs index 3672d317d9e..82c3d72b139 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs @@ -3,7 +3,7 @@ using Content.Server.Psionics; using Content.Server.StationEvents.Components; using Content.Server.Stunnable; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.StatusEffect; diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs index 753b2e25729..63e0a435cb0 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs @@ -4,7 +4,7 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; using Content.Shared.Mobs.Components; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.StatusEffect; using Content.Shared.Mobs.Systems; using Robust.Shared.Audio.Systems; diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index a7c455e6a5d..9b2e14eff8b 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -36,7 +36,9 @@ internal sealed class PointingSystem : SharedPointingSystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly SharedMindSystem _minds = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private static readonly TimeSpan PointDelay = TimeSpan.FromSeconds(0.5f); @@ -96,11 +98,11 @@ public bool InRange(EntityUid pointer, EntityCoordinates coordinates) { if (HasComp(pointer)) { - return Transform(pointer).Coordinates.InRange(EntityManager, coordinates, 15); + return Transform(pointer).Coordinates.InRange(EntityManager, _transform, coordinates, 15); } else { - return ExamineSystemShared.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); + return _examine.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); } } @@ -141,7 +143,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E return false; } - var mapCoordsPointed = coordsPointed.ToMap(EntityManager); + var mapCoordsPointed = coordsPointed.ToMap(EntityManager, _transform); _rotateToFaceSystem.TryFaceCoordinates(player, mapCoordsPointed.Position); var arrow = EntityManager.SpawnEntity("PointingArrow", coordsPointed); @@ -149,7 +151,7 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, E if (TryComp(arrow, out var pointing)) { if (TryComp(player, out TransformComponent? xformPlayer)) - pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager)).Position; + pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager, _transform), _transform).Position; pointing.EndTime = _gameTiming.CurTime + PointDuration; diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 5ed39d51787..048fda23553 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -20,6 +20,8 @@ public sealed class PowerReceiverSystem : EntitySystem [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; [Dependency] private readonly AudioSystem _audio = default!; + private EntityQuery _recQuery; + private EntityQuery _provQuery; public override void Initialize() { @@ -35,6 +37,9 @@ public override void Initialize() SubscribeLocalEvent>(OnGetVerbs); SubscribeLocalEvent>(AddSwitchPowerVerb); + + _recQuery = GetEntityQuery(); + _provQuery = GetEntityQuery(); } private void OnGetVerbs(EntityUid uid, ApcPowerReceiverComponent component, GetVerbsEvent args) @@ -77,7 +82,7 @@ private void OnProviderShutdown(EntityUid uid, ApcPowerProviderComponent compone private void OnProviderConnected(Entity receiver, ref ExtensionCableSystem.ProviderConnectedEvent args) { var providerUid = args.Provider.Owner; - if (!EntityManager.TryGetComponent(providerUid, out var provider)) + if (!_provQuery.TryGetComponent(providerUid, out var provider)) return; receiver.Comp.Provider = provider; @@ -94,7 +99,7 @@ private void OnProviderDisconnected(Entity receiver, private void OnReceiverConnected(Entity provider, ref ExtensionCableSystem.ReceiverConnectedEvent args) { - if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver)) + if (_recQuery.TryGetComponent(args.Receiver, out var receiver)) { provider.Comp.AddReceiver(receiver); } @@ -102,7 +107,7 @@ private void OnReceiverConnected(Entity provider, ref private void OnReceiverDisconnected(EntityUid uid, ApcPowerProviderComponent provider, ExtensionCableSystem.ReceiverDisconnectedEvent args) { - if (EntityManager.TryGetComponent(args.Receiver, out ApcPowerReceiverComponent? receiver)) + if (_recQuery.TryGetComponent(args.Receiver, out var receiver)) { provider.RemoveReceiver(receiver); } @@ -116,7 +121,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G if (!HasComp(args.User)) return; - if (!TryComp(uid, out var receiver)) + if (!_recQuery.TryGetComponent(uid, out var receiver)) return; if (!receiver.NeedsPower) @@ -152,7 +157,7 @@ private void ProviderChanged(Entity receiver) /// public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null) { - if (!Resolve(uid, ref receiver, false)) + if (!_recQuery.Resolve(uid, ref receiver, false)) return true; return receiver.Powered; @@ -164,7 +169,7 @@ public bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? receiver = null) /// public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null) { - if (!Resolve(uid, ref receiver, false)) + if (!_recQuery.Resolve(uid, ref receiver, false)) return true; // it'll save a lot of confusion if 'always powered' means 'always powered' diff --git a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs deleted file mode 100644 index 7b3a417c53f..00000000000 --- a/Content.Server/Psionics/Abilities/MetapsionicPowerSystem.cs +++ /dev/null @@ -1,188 +0,0 @@ -using Content.Shared.Actions; -using Content.Shared.Actions.Events; -using Content.Shared.Psionics.Abilities; -using Content.Shared.DoAfter; -using Content.Shared.Examine; -using static Content.Shared.Examine.ExamineSystemShared; -using Content.Shared.Popups; -using Robust.Server.Audio; -using Robust.Shared.Audio; -using Robust.Shared.Timing; -using Robust.Shared.Player; -using Content.Server.DoAfter; -using Content.Shared.Psionics.Events; -using Content.Server.Psionics; - -namespace Content.Server.Psionics.Abilities -{ - public sealed class MetapsionicPowerSystem : EntitySystem - { - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly SharedPopupSystem _popups = default!; - [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly AudioSystem _audioSystem = default!; - - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnWidePowerUsed); - SubscribeLocalEvent(OnFocusedPowerUsed); - SubscribeLocalEvent(OnDoAfter); - } - - private void OnInit(EntityUid uid, MetapsionicPowerComponent component, ComponentInit args) - { - if (!TryComp(uid, out ActionsComponent? comp)) - return; - _actions.AddAction(uid, ref component.ActionWideMetapsionicEntity, component.ActionWideMetapsionic, component: comp); - _actions.AddAction(uid, ref component.ActionFocusedMetapsionicEntity, component.ActionFocusedMetapsionic, component: comp); - _actions.TryGetActionData(component.ActionWideMetapsionicEntity, out var actionData); - if (actionData is { UseDelay: not null }) - { - _actions.StartUseDelay(component.ActionWideMetapsionicEntity); - _actions.StartUseDelay(component.ActionFocusedMetapsionicEntity); - } - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.MetapsionicFeedback); - psionic.Amplification += 0.1f; - psionic.Dampening += 0.5f; - } - - } - - private void UpdateActions(EntityUid uid, MetapsionicPowerComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - _actions.StartUseDelay(component.ActionWideMetapsionicEntity); - _actions.StartUseDelay(component.ActionFocusedMetapsionicEntity); - } - - private void OnShutdown(EntityUid uid, MetapsionicPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.ActionWideMetapsionicEntity); - _actions.RemoveAction(uid, component.ActionFocusedMetapsionicEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.MetapsionicFeedback); - psionic.Amplification -= 0.1f; - psionic.Dampening -= 0.5f; - } - } - - private void OnWidePowerUsed(EntityUid uid, MetapsionicPowerComponent component, WideMetapsionicPowerActionEvent args) - { - if (HasComp(uid)) - return; - - if (!TryComp(uid, out var psionic)) - return; - - foreach (var entity in _lookup.GetEntitiesInRange(uid, component.Range)) - { - if (HasComp(entity) && entity != uid && !HasComp(entity) && - !(HasComp(entity) && Transform(entity).ParentUid == uid)) - { - _popups.PopupEntity(Loc.GetString("metapsionic-pulse-success"), uid, uid, PopupType.LargeCaution); - args.Handled = true; - return; - } - } - _popups.PopupEntity(Loc.GetString("metapsionic-pulse-failure"), uid, uid, PopupType.Large); - _psionics.LogPowerUsed(uid, "metapsionic pulse", - (int) MathF.Round(2 * psionic.Amplification - psionic.Dampening), - (int) MathF.Round(4 * psionic.Amplification - psionic.Dampening)); - UpdateActions(uid, component); - args.Handled = true; - } - - private void OnFocusedPowerUsed(FocusedMetapsionicPowerActionEvent args) - { - if (!TryComp(args.Performer, out var psionic)) - return; - - if (HasComp(args.Target)) - return; - - if (!TryComp(args.Performer, out var component)) - return; - - var ev = new FocusedMetapsionicDoAfterEvent(_gameTiming.CurTime); - - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, component.UseDelay - psionic.Amplification, ev, args.Performer, args.Target, args.Performer) - { - BlockDuplicate = true, - BreakOnUserMove = true, - BreakOnTargetMove = true, - BreakOnDamage = true, - }, out var doAfterId); - - component.DoAfter = doAfterId; - - _popups.PopupEntity(Loc.GetString("focused-metapsionic-pulse-begin", ("entity", args.Target)), - args.Performer, - // TODO: Use LoS-based Filter when one is available. - Filter.Pvs(args.Performer).RemoveWhereAttachedEntity(entity => !ExamineSystemShared.InRangeUnOccluded(args.Performer, entity, ExamineRange, null)), - true, - PopupType.Medium); - - _audioSystem.PlayPvs(component.SoundUse, args.Performer, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); - _psionics.LogPowerUsed(args.Performer, "focused metapsionic pulse", - (int) MathF.Round(3 * psionic.Amplification - psionic.Dampening), - (int) MathF.Round(6 * psionic.Amplification - psionic.Dampening)); - args.Handled = true; - - UpdateActions(args.Performer, component); - } - - private void OnDoAfter(EntityUid uid, MetapsionicPowerComponent component, FocusedMetapsionicDoAfterEvent args) - { - if (!TryComp(args.Target, out var psychic)) - return; - - component.DoAfter = null; - - if (args.Target == null) return; - - if (TryComp(args.Target, out var swapped)) - { - _popups.PopupEntity(Loc.GetString(swapped.MindSwappedFeedback, ("entity", args.Target)), uid, uid, PopupType.LargeCaution); - return; - } - - if (args.Target == uid) - { - _popups.PopupEntity(Loc.GetString("metapulse-self", ("entity", args.Target)), uid, uid, PopupType.LargeCaution); - return; - } - - if (!HasComp(args.Target)) - { - _popups.PopupEntity(Loc.GetString("no-powers", ("entity", args.Target)), uid, uid, PopupType.LargeCaution); - return; - } - - if (HasComp(args.Target) & !HasComp(args.Target)) - { - _popups.PopupEntity(Loc.GetString("psychic-potential", ("entity", args.Target)), uid, uid, PopupType.LargeCaution); - return; - } - - foreach (var psychicFeedback in psychic.PsychicFeedback) - { - _popups.PopupEntity(Loc.GetString(psychicFeedback, ("entity", args.Target)), uid, uid, PopupType.LargeCaution); - } - - } - } -} diff --git a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs deleted file mode 100644 index 6958170a5c2..00000000000 --- a/Content.Server/Psionics/Abilities/PsionicRegenerationPowerSystem.cs +++ /dev/null @@ -1,179 +0,0 @@ -using Robust.Shared.Audio; -using Robust.Shared.Player; -using Content.Server.Body.Components; -using Content.Server.Body.Systems; -using Content.Server.DoAfter; -using Content.Shared.Psionics.Abilities; -using Content.Shared.Actions; -using Content.Shared.Chemistry.Components; -using Content.Shared.DoAfter; -using Content.Shared.FixedPoint; -using Content.Shared.Mobs; -using Content.Shared.Popups; -using Content.Shared.Psionics.Events; -using Content.Shared.Examine; -using Robust.Shared.Timing; -using Content.Shared.Actions.Events; -using Robust.Server.Audio; - -namespace Content.Server.Psionics.Abilities -{ - public sealed class PsionicRegenerationPowerSystem : EntitySystem - { - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; - [Dependency] private readonly AudioSystem _audioSystem = default!; - [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly SharedPopupSystem _popupSystem = default!; - [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly ExamineSystemShared _examine = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnPowerUsed); - SubscribeLocalEvent(OnMobStateChangedEvent); - SubscribeLocalEvent(OnDispelled); - SubscribeLocalEvent(OnDoAfter); - } - - private void OnInit(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.PsionicRegenerationActionEntity, component.PsionicRegenerationActionId ); - _actions.TryGetActionData( component.PsionicRegenerationActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PsionicRegenerationActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.RegenerationFeedback); - psionic.Amplification += 0.5f; - psionic.Dampening += 0.5f; - } - } - - private void OnPowerUsed(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationPowerActionEvent args) - { - if (!TryComp(uid, out var psionic)) - return; - - var ev = new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime); - var doAfterArgs = new DoAfterArgs(EntityManager, uid, component.UseDelay, ev, uid); - - //Prevent the power from ignoring its own cooldown - _actions.TryGetActionData(component.PsionicRegenerationActionEntity, out var actionData); - var curTime = _gameTiming.CurTime; - if (actionData != null && actionData.Cooldown.HasValue && actionData.Cooldown.Value.End > curTime) - return; - - _doAfterSystem.TryStartDoAfter(doAfterArgs, out var doAfterId); - - component.DoAfter = doAfterId; - - _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-begin", ("entity", uid)), uid, PopupType.Medium); - _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); - - _psionics.LogPowerUsed(uid, "psionic regeneration", - (int) Math.Round(6 * psionic.Amplification - psionic.Dampening), - (int) Math.Round(8 * psionic.Amplification - psionic.Dampening)); - - args.Handled = true; - } - - /// - /// Regenerators automatically activate upon crit, provided the power was off cooldown at that exact point in time. - /// Self-rescusitation is also far more costly, and extremely obvious - /// - /// - /// - /// - private void OnMobStateChangedEvent(EntityUid uid, PsionicRegenerationPowerComponent component, MobStateChangedEvent args) - { - if (!TryComp(uid, out var psionic)) - return; - - if (HasComp(uid)) - return; - - if (args.NewMobState is MobState.Critical) - { - _actions.TryGetActionData(component.PsionicRegenerationActionEntity, out var actionData); - var curTime = _gameTiming.CurTime; - if (actionData != null && actionData.Cooldown.HasValue && actionData.Cooldown.Value.End > curTime) - return; - - if (actionData is { UseDelay: not null }) - { - component.SelfRevive = true; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.UseDelay, new PsionicRegenerationDoAfterEvent(_gameTiming.CurTime), uid, args.Target, uid) - { - BreakOnUserMove = false, - BreakOnTargetMove = false, - BreakOnWeightlessMove = false, - BreakOnDamage = false, - RequireCanInteract = false, - }); - _popupSystem.PopupEntity(Loc.GetString("psionic-regeneration-self-revive", ("entity", uid)), uid, PopupType.MediumCaution); - _audioSystem.PlayPvs(component.SoundUse, uid, AudioParams.Default.WithVolume(8f).WithMaxDistance(1.5f).WithRolloffFactor(3.5f)); - - _psionics.LogPowerUsed(uid, "psionic regeneration", - (int) Math.Round(10 * psionic.Amplification - 2 * psionic.Dampening), - (int) Math.Round(20 * psionic.Amplification - 2 * psionic.Dampening)); - - _actions.StartUseDelay(component.PsionicRegenerationActionEntity); - } - } - } - - private void OnShutdown(EntityUid uid, PsionicRegenerationPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.PsionicRegenerationActionEntity); - - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.RegenerationFeedback); - psionic.Amplification -= 0.5f; - psionic.Dampening -= 0.5f; - } - } - - private void OnDispelled(EntityUid uid, PsionicRegenerationPowerComponent component, DispelledEvent args) - { - if (component.DoAfter == null) - return; - - _doAfterSystem.Cancel(component.DoAfter); - component.DoAfter = null; - - args.Handled = true; - } - - private void OnDoAfter(EntityUid uid, PsionicRegenerationPowerComponent component, PsionicRegenerationDoAfterEvent args) - { - component.DoAfter = null; - - if (!TryComp(uid, out var psionic)) - return; - - if (!TryComp(uid, out var stream)) - return; - - var percentageComplete = Math.Min(1f, (_gameTiming.CurTime - args.StartedAt).TotalSeconds / component.UseDelay); - - var solution = new Solution(); - solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(Math.Min(component.EssenceAmount * percentageComplete + 10f * psionic.Dampening, 15f))); - _bloodstreamSystem.TryAddToChemicals(uid, solution, stream); - if (component.SelfRevive == true) - { - var critSolution = new Solution(); - critSolution.AddReagent("Epinephrine", MathF.Min(5 + 5 * psionic.Dampening, 15)); - _bloodstreamSystem.TryAddToChemicals(uid, critSolution, stream); - component.SelfRevive = false; - } - } - } -} diff --git a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs deleted file mode 100644 index 77075dab206..00000000000 --- a/Content.Server/Psionics/Abilities/PyrokinesisPowerSystem.cs +++ /dev/null @@ -1,93 +0,0 @@ -using Content.Shared.Actions; -using Content.Shared.Psionics.Abilities; -using Content.Server.Atmos.Components; -using Content.Server.Weapons.Ranged.Systems; -using Robust.Server.GameObjects; -using Content.Shared.Actions.Events; -using Content.Server.Explosion.Components; -using Content.Shared.Mobs.Components; -using Robust.Shared.Map; - -namespace Content.Server.Psionics.Abilities -{ - public sealed class PyrokinesisPowerSystem : EntitySystem - { - [Dependency] private readonly TransformSystem _xform = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly GunSystem _gunSystem = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; - [Dependency] private readonly PhysicsSystem _physics = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnPowerUsed); - } - - private void OnInit(EntityUid uid, PyrokinesisPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.PyrokinesisActionEntity, component.PyrokinesisActionId); - _actions.TryGetActionData( component.PyrokinesisActionEntity, out var actionData); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.PyrokinesisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.PyrokinesisFeedback); - psionic.Amplification += 1f; - } - } - - private void OnShutdown(EntityUid uid, PyrokinesisPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.PyrokinesisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.PyrokinesisFeedback); - psionic.Amplification -= 1f; - } - } - - private void OnPowerUsed(PyrokinesisPowerActionEvent args) - { - if (!TryComp(args.Performer, out var psionic)) - return; - - if (!HasComp(args.Performer)) - { - var xformQuery = GetEntityQuery(); - var xform = xformQuery.GetComponent(args.Performer); - - var mapPos = xform.Coordinates.ToMap(EntityManager, _xform); - var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _) - ? xform.Coordinates.WithEntityId(gridUid, EntityManager) - : new(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position); - - var ent = Spawn("ProjectileAnomalyFireball", spawnCoords); - - if (TryComp(ent, out var fireball)) - { - fireball.MaxIntensity = (int) MathF.Round(20 * psionic.Amplification - 10 * psionic.Dampening); - - if (psionic.Amplification > 5 && EnsureComp(ent, out var ignite)) - { - ignite.FireStacks = 0.2f * psionic.Amplification - 0.1f * psionic.Dampening; - } - } - - var direction = args.Target.Position; - - _gunSystem.ShootProjectile(ent, direction, new System.Numerics.Vector2(0, 0), args.Performer, args.Performer, 20f); - - _psionics.LogPowerUsed(args.Performer, "pyrokinesis", - (int) MathF.Round(6f * psionic.Amplification - psionic.Dampening), - (int) MathF.Round(8f * psionic.Amplification - psionic.Dampening)); - args.Handled = true; - } - } - } -} diff --git a/Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs b/Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs deleted file mode 100644 index e184b19396b..00000000000 --- a/Content.Server/Psionics/Abilities/RegenerativeStasisPowerSystem.cs +++ /dev/null @@ -1,76 +0,0 @@ -using Content.Server.Body.Systems; -using Content.Server.Body.Components; -using Content.Shared.Actions; -using Content.Shared.Chemistry.Components; -using Content.Shared.Bed.Sleep; -using Content.Shared.Psionics.Abilities; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Content.Shared.Mind; -using Content.Shared.Actions.Events; -using Content.Shared.FixedPoint; - -namespace Content.Server.Psionics.Abilities -{ - public sealed class MassSleepPowerSystem : EntitySystem - { - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnPowerUsed); - } - - private void OnInit(EntityUid uid, RegenerativeStasisPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.RegenerativeStasisActionEntity, component.RegenerativeStasisActionId); - _actions.TryGetActionData(component.RegenerativeStasisActionEntity, out var actionData); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.RegenerativeStasisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.RegenerativeStasisFeedback); - psionic.Amplification += 0.5f; - psionic.Dampening += 0.5f; - } - } - - private void OnShutdown(EntityUid uid, RegenerativeStasisPowerComponent component, ComponentShutdown args) - { - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.RegenerativeStasisFeedback); - psionic.Amplification -= 0.5f; - psionic.Dampening -= 0.5f; - } - _actions.RemoveAction(uid, component.RegenerativeStasisActionEntity); - } - - private void OnPowerUsed(EntityUid uid, RegenerativeStasisPowerComponent component, RegenerativeStasisPowerActionEvent args) - { - if (TryComp(uid, out var psionic) - && !HasComp(uid) - && !HasComp(args.Target) - && TryComp(args.Target, out var stream)) - { - var solution = new Solution(); - solution.AddReagent("PsionicRegenerationEssence", FixedPoint2.New(MathF.Min(2.5f * psionic.Amplification + psionic.Dampening, 15f))); - solution.AddReagent("Epinephrine", FixedPoint2.New(MathF.Min(2.5f * psionic.Dampening + psionic.Amplification, 15f))); - _bloodstreamSystem.TryAddToChemicals(args.Target, solution, stream); - EnsureComp(args.Target); - - _psionics.LogPowerUsed(uid, "regenerative stasis", - (int) Math.Round(4 * psionic.Amplification - psionic.Dampening), - (int) Math.Round(6 * psionic.Amplification - psionic.Dampening)); - args.Handled = true; - } - } - } -} diff --git a/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs deleted file mode 100644 index f03b001fc70..00000000000 --- a/Content.Server/Psionics/Abilities/TelegnosisPowerSystem.cs +++ /dev/null @@ -1,106 +0,0 @@ -using Content.Shared.Actions; -using Content.Shared.Psionics.Abilities; -using Content.Shared.Mind.Components; -using Content.Shared.Actions.Events; -using Content.Shared.Mobs; -using Content.Shared.Storage.Components; - -namespace Content.Server.Psionics.Abilities -{ - public sealed class TelegnosisPowerSystem : EntitySystem - { - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly MindSwapPowerSystem _mindSwap = default!; - [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnPowerUsed); - SubscribeLocalEvent(OnMindRemoved); - SubscribeLocalEvent(OnDispelled); - SubscribeLocalEvent(OnMobstateChanged); - SubscribeLocalEvent(OnStorageInsertAttempt); - } - - private void OnInit(EntityUid uid, TelegnosisPowerComponent component, ComponentInit args) - { - _actions.AddAction(uid, ref component.TelegnosisActionEntity, component.TelegnosisActionId ); - _actions.TryGetActionData( component.TelegnosisActionEntity, out var actionData ); - if (actionData is { UseDelay: not null }) - _actions.StartUseDelay(component.TelegnosisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Add(component); - psionic.PsychicFeedback.Add(component.TelegnosisFeedback); - psionic.Amplification += 0.3f; - psionic.Dampening += 0.3f; - } - } - - private void OnShutdown(EntityUid uid, TelegnosisPowerComponent component, ComponentShutdown args) - { - _actions.RemoveAction(uid, component.TelegnosisActionEntity); - if (TryComp(uid, out var psionic)) - { - psionic.ActivePowers.Remove(component); - psionic.PsychicFeedback.Remove(component.TelegnosisFeedback); - psionic.Amplification -= 0.3f; - psionic.Dampening -= 0.3f; - } - } - - private void OnPowerUsed(EntityUid uid, TelegnosisPowerComponent component, TelegnosisPowerActionEvent args) - { - if (!TryComp(uid, out var psionic)) - return; - - if (HasComp(uid)) - return; - - var projection = Spawn(component.Prototype, Transform(uid).Coordinates); - Transform(projection).AttachToGridOrMap(); - component.OriginalEntity = uid; - component.IsProjecting = true; - component.ProjectionUid = projection; - _mindSwap.Swap(uid, projection); - - if (EnsureComp(projection, out var projectionComponent)) - projectionComponent.OriginalEntity = uid; - - _psionics.LogPowerUsed(uid, "telegnosis", - (int) Math.Round(8f * psionic.Amplification - psionic.Dampening), - (int) Math.Round(12f * psionic.Amplification - psionic.Dampening)); - - args.Handled = true; - } - private void OnMindRemoved(EntityUid uid, TelegnosticProjectionComponent component, MindRemovedMessage args) - { - if (TryComp(component.OriginalEntity, out var originalEntity)) - originalEntity.IsProjecting = false; - - QueueDel(uid); - } - - private void OnDispelled(EntityUid uid, TelegnosisPowerComponent component, DispelledEvent args) - { - if (component.IsProjecting) - _mindSwap.Swap(uid, component.ProjectionUid); - } - - private void OnMobstateChanged(EntityUid uid, TelegnosisPowerComponent component, MobStateChangedEvent args) - { - if (component.IsProjecting && args.NewMobState is MobState.Critical - || component.IsProjecting && args.NewMobState is MobState.Dead) - _mindSwap.Swap(uid, component.ProjectionUid); - } - - private void OnStorageInsertAttempt(EntityUid uid, TelegnosisPowerComponent component, InsertIntoEntityStorageAttemptEvent args) - { - if (component.IsProjecting) - _mindSwap.Swap(uid, component.ProjectionUid); - } - } -} diff --git a/Content.Server/Psionics/PotentialPsionicComponent.cs b/Content.Server/Psionics/PotentialPsionicComponent.cs deleted file mode 100644 index e874296a4c3..00000000000 --- a/Content.Server/Psionics/PotentialPsionicComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Content.Server.Psionics -{ - [RegisterComponent] - public sealed partial class PotentialPsionicComponent : Component - { - /// - /// The base chance of an entity rolling psychic powers, which is increased by other modifiers such as glimmer. - /// - /// - /// I have increased this to 10% up from its original value of 2%, because I estimate that most people won't take the Latent Psychic trait - /// Simply because they might not even know it exists - /// - [DataField("chance")] - public float Chance = 0.10f; - - /// - /// YORO (you only reroll once) - /// - public bool Rerolled = false; - } -} diff --git a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs index d18b044205c..53517da6cb4 100644 --- a/Content.Server/Radio/EntitySystems/HeadsetSystem.cs +++ b/Content.Server/Radio/EntitySystems/HeadsetSystem.cs @@ -1,6 +1,9 @@ using Content.Server.Chat.Systems; using Content.Server.Emp; +using Content.Server.Language; using Content.Server.Radio.Components; +using Content.Server.Speech; +using Content.Shared.Chat; using Content.Shared.Inventory.Events; using Content.Shared.Radio; using Content.Shared.Radio.Components; @@ -14,6 +17,7 @@ public sealed class HeadsetSystem : SharedHeadsetSystem { [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly RadioSystem _radio = default!; + [Dependency] private readonly LanguageSystem _language = default!; public override void Initialize() { @@ -99,8 +103,16 @@ public void SetEnabled(EntityUid uid, bool value, HeadsetComponent? component = private void OnHeadsetReceive(EntityUid uid, HeadsetComponent component, ref RadioReceiveEvent args) { - if (TryComp(Transform(uid).ParentUid, out ActorComponent? actor)) - _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); + var parent = Transform(uid).ParentUid; + if (TryComp(parent, out ActorComponent? actor)) + { + var canUnderstand = _language.CanUnderstand(parent, args.Language); + var msg = new MsgChatMessage + { + Message = canUnderstand ? args.OriginalChatMsg : args.LanguageObfuscatedChatMsg + }; + _netMan.ServerSendMessage(msg, actor.PlayerSession.Channel); + } } private void OnEmpPulse(EntityUid uid, HeadsetComponent component, ref EmpPulseEvent args) diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index fdf02f94df5..53e0409af06 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -1,8 +1,13 @@ +using Content.Server.DeviceNetwork.Components; +using Content.Server.DeviceNetwork.Systems; +using Content.Server.Medical.CrewMonitoring; using Content.Server.Medical.SuitSensors; using Content.Server.Popups; using Content.Server.Power.EntitySystems; using Content.Server.PowerCell; using Content.Server.Radio.Components; +using Content.Server.Station.Systems; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.PowerCell.Components; @@ -15,6 +20,8 @@ public sealed class JammerSystem : EntitySystem [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly StationSystem _stationSystem = default!; + [Dependency] private readonly SingletonDeviceNetServerSystem _singletonServerSystem = default!; public override void Initialize() { @@ -36,6 +43,7 @@ public override void Update(float frameTime) !_battery.TryUseCharge(batteryUid.Value, jam.Wattage * frameTime, battery)) { RemComp(uid); + RemComp(uid); } } } @@ -48,10 +56,19 @@ private void OnActivate(EntityUid uid, RadioJammerComponent comp, ActivateInWorl if (activated) { EnsureComp(uid); + var stationId = _stationSystem.GetOwningStation(uid); + if (stationId != null && _singletonServerSystem.TryGetActiveServerAddress(stationId.Value, out var netId)) + { + EnsureComp(uid, out var jammingComp); + jammingComp.Range = comp.Range; + jammingComp.JammableNetworks.Add(netId); + Dirty(uid, jammingComp); + } } else { RemComp(uid); + RemComp(uid); } var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state"); var message = Loc.GetString("radio-jammer-component-on-use", ("state", state)); diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index ace7d8ae31a..fc3f69a3ba2 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Chat.Systems; using Content.Server.Interaction; +using Content.Server.Language; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; @@ -29,6 +30,7 @@ public sealed class RadioDeviceSystem : EntitySystem [Dependency] private readonly InteractionSystem _interaction = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly LanguageSystem _language = default!; // Used to prevent a shitter from using a bunch of radios to spam chat. private HashSet<(string, EntityUid)> _recentlySent = new(); @@ -208,7 +210,8 @@ private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref ("originalName", nameEv.Name)); // log to chat so people can identity the speaker/source, but avoid clogging ghost chat if there are many radios - _chat.TrySendInGameICMessage(uid, args.Message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false); + var message = args.OriginalChatMsg.Message; // The chat system will handle the rest and re-obfuscate if needed. + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Whisper, ChatTransmitRange.GhostRangeLimit, nameOverride: name, checkRadioPrefix: false, languageOverride: args.Language); } private void OnBeforeIntercomUiOpen(EntityUid uid, IntercomComponent component, BeforeActivatableUIOpenEvent args) diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index e2a61b5022b..60aa7c2f4fb 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -1,10 +1,13 @@ using Content.Server.Administration.Logs; using Content.Server.Chat.Systems; +using Content.Server.Language; using Content.Server.Power.Components; using Content.Server.Radio.Components; +using Content.Server.Speech; using Content.Server.VoiceMask; using Content.Shared.Chat; using Content.Shared.Database; +using Content.Shared.Language; using Content.Shared.Radio; using Content.Shared.Radio.Components; using Content.Shared.Speech; @@ -29,6 +32,7 @@ public sealed class RadioSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly LanguageSystem _language = default!; // set used to prevent radio feedback loops. private readonly HashSet _messages = new(); @@ -44,7 +48,7 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent { if (args.Channel != null && component.Channels.Contains(args.Channel.ID)) { - SendRadioMessage(uid, args.Message, args.Channel, uid); + SendRadioMessage(uid, args.Message, args.Channel, uid, args.Language); args.Channel = null; // prevent duplicate messages from other listeners. } } @@ -52,15 +56,23 @@ private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent private void OnIntrinsicReceive(EntityUid uid, IntrinsicRadioReceiverComponent component, ref RadioReceiveEvent args) { if (TryComp(uid, out ActorComponent? actor)) - _netMan.ServerSendMessage(args.ChatMsg, actor.PlayerSession.Channel); + { + // Einstein-Engines - languages mechanic + var listener = component.Owner; + var msg = args.OriginalChatMsg; + if (listener != null && !_language.CanUnderstand(listener, args.Language)) + msg = args.LanguageObfuscatedChatMsg; + + _netMan.ServerSendMessage(new MsgChatMessage { Message = msg}, actor.PlayerSession.Channel); + } } /// /// Send radio message to all active radio listeners /// - public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, ProtoId channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) { - SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup); + SendRadioMessage(messageSource, message, _prototype.Index(channel), radioSource, escapeMarkup: escapeMarkup, language: language); } /// @@ -68,8 +80,11 @@ public void SendRadioMessage(EntityUid messageSource, string message, ProtoId /// Entity that spoke the message /// Entity that picked up the message and will send it, e.g. headset - public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, bool escapeMarkup = true) + public void SendRadioMessage(EntityUid messageSource, string message, RadioChannelPrototype channel, EntityUid radioSource, LanguagePrototype? language = null, bool escapeMarkup = true) { + if (language == null) + language = _language.GetLanguage(messageSource); + // TODO if radios ever garble / modify messages, feedback-prevention needs to be handled better than this. if (!_messages.Add(message)) return; @@ -84,6 +99,7 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann name = FormattedMessage.EscapeText(name); + // most radios are relayed to chat, so lets parse the chat message beforehand SpeechVerbPrototype speech; if (mask != null && mask.Enabled @@ -99,24 +115,15 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann ? FormattedMessage.EscapeText(message) : message; - var wrappedMessage = Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", - ("color", channel.Color), - ("fontType", speech.FontId), - ("fontSize", speech.FontSize), - ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), - ("channel", $"\\[{channel.LocalizedName}\\]"), - ("name", name), - ("message", content)); + var wrappedMessage = WrapRadioMessage(messageSource, channel, name, content); + var msg = new ChatMessage(ChatChannel.Radio, content, wrappedMessage, NetEntity.Invalid, null); - // most radios are relayed to chat, so lets parse the chat message beforehand - var chat = new ChatMessage( - ChatChannel.Radio, - message, - wrappedMessage, - NetEntity.Invalid, - null); - var chatMsg = new MsgChatMessage { Message = chat }; - var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg); + // ... you guess it + var obfuscated = _language.ObfuscateSpeech(content, language); + var obfuscatedWrapped = WrapRadioMessage(messageSource, channel, name, obfuscated); + var notUdsMsg = new ChatMessage(ChatChannel.Radio, obfuscated, obfuscatedWrapped, NetEntity.Invalid, null); + + var ev = new RadioReceiveEvent(messageSource, channel, msg, notUdsMsg, language); var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource); RaiseLocalEvent(ref sendAttemptEv); @@ -162,10 +169,23 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann else _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Radio message from {ToPrettyString(messageSource):user} on {channel.LocalizedName}: {message}"); - _replay.RecordServerMessage(chat); + _replay.RecordServerMessage(msg); _messages.Remove(message); } + private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, string name, string message) + { + var speech = _chat.GetSpeechVerb(source, message); + return Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", + ("color", channel.Color), + ("fontType", speech.FontId), + ("fontSize", speech.FontSize), + ("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))), + ("channel", $"\\[{channel.LocalizedName}\\]"), + ("name", name), + ("message", FormattedMessage.EscapeText(message))); + } + /// private bool HasActiveServer(MapId mapId, string channelId) { diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs index 69d764ffe67..35220d1d757 100644 --- a/Content.Server/Radio/RadioEvent.cs +++ b/Content.Server/Radio/RadioEvent.cs @@ -1,10 +1,22 @@ using Content.Shared.Chat; +using Content.Shared.Language; using Content.Shared.Radio; namespace Content.Server.Radio; +/// +/// The message to display when the speaker can understand "language" +/// The message to display when the speaker cannot understand "language" +/// [ByRefEvent] -public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg); +public readonly record struct RadioReceiveEvent( + // Einstein-Engines - languages mechanic + EntityUid MessageSource, + RadioChannelPrototype Channel, + ChatMessage OriginalChatMsg, + ChatMessage LanguageObfuscatedChatMsg, + LanguagePrototype Language +); /// /// Use this event to cancel sending message per receiver diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index 6403c41addf..d335911901a 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -22,6 +22,7 @@ public sealed class DoorRemoteSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly DoorSystem _doorSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; // I'm so sorry [Dependency] private readonly SharedAirlockSystem _sharedAirlockSystem = default!; public override void Initialize() @@ -67,7 +68,7 @@ private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, Befo || !TryComp(args.Target, out var doorComp) // If it isn't a door we don't use it // Only able to control doors if they are within your vision and within your max range. // Not affected by mobs or machines anymore. - || !ExamineSystemShared.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) + || !_examine.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) { return; } diff --git a/Content.Server/Respawn/SpecialRespawnSystem.cs b/Content.Server/Respawn/SpecialRespawnSystem.cs index 51c092be18b..2822c94093f 100644 --- a/Content.Server/Respawn/SpecialRespawnSystem.cs +++ b/Content.Server/Respawn/SpecialRespawnSystem.cs @@ -20,6 +20,7 @@ public sealed class SpecialRespawnSystem : SharedSpecialRespawnSystem [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TurfSystem _turf = default!; [Dependency] private readonly IChatManager _chat = default!; @@ -129,11 +130,11 @@ private void OnTermination(EntityUid uid, SpecialRespawnComponent component, ref private void Respawn(EntityUid oldEntity, string prototype, EntityCoordinates coords) { var entity = Spawn(prototype, coords); - _adminLog.Add(LogType.Respawn, LogImpact.High, $"{ToPrettyString(oldEntity)} was deleted and was respawned at {coords.ToMap(EntityManager)} as {ToPrettyString(entity)}"); + _adminLog.Add(LogType.Respawn, LogImpact.High, $"{ToPrettyString(oldEntity)} was deleted and was respawned at {coords.ToMap(EntityManager, _transform)} as {ToPrettyString(entity)}"); _chat.SendAdminAlert($"{MetaData(oldEntity).EntityName} was deleted and was respawned as {ToPrettyString(entity)}"); } - /// + /// /// Try to find a random safe tile on the supplied grid /// /// The grid that you're looking for a safe tile on diff --git a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs index ba07375699b..7784db015d3 100644 --- a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs +++ b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs @@ -13,7 +13,7 @@ using Robust.Shared.Map.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; -using Content.Shared.Psionics.Abilities; //EE - Summary: for the telegnostic projection. +using Content.Shared.Abilities.Psionics; //Nyano - Summary: for the telegnostic projection. namespace Content.Server.Singularity.EntitySystems; @@ -39,7 +39,7 @@ public override void Initialize() SubscribeLocalEvent(PreventConsume); SubscribeLocalEvent(PreventConsume); - SubscribeLocalEvent(PreventConsume); ///EE - Summary: the telegnositic projection has the same trait as ghosts. + SubscribeLocalEvent(PreventConsume); ///Nyano - Summary: the telegnositic projection has the same trait as ghosts. SubscribeLocalEvent(PreventConsume); SubscribeLocalEvent(OnHorizonMapInit); SubscribeLocalEvent(OnStartCollide); diff --git a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs index ce4334391db..f1d0af6f905 100644 --- a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs +++ b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs @@ -18,13 +18,13 @@ namespace Content.Server.Singularity.EntitySystems; /// public sealed class GravityWellSystem : SharedGravityWellSystem { -#region Dependencies + #region Dependencies [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IViewVariablesManager _vvManager = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; -#endregion Dependencies + #endregion Dependencies /// /// The minimum range at which gravpulses will act. @@ -155,7 +155,7 @@ public void GravPulse(EntityUid uid, float maxRange, float minRange, float baseR /// The minimum distance at which entities can be affected by the gravity pulse. /// The base velocity added to any entities within affected by the gravity pulse scaled by the displacement of those entities from the epicenter. public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRange, in Matrix3 baseMatrixDeltaV) - => GravPulse(entityPos.ToMap(EntityManager), maxRange, minRange, in baseMatrixDeltaV); + => GravPulse(entityPos.ToMap(EntityManager, _transform), maxRange, minRange, in baseMatrixDeltaV); /// /// Greates a gravitational pulse, shoving around all entities within some distance of an epicenter. @@ -166,7 +166,7 @@ public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRang /// The base radial velocity that will be added to entities within range towards the center of the gravitational pulse. /// The base tangential velocity that will be added to entities within countrclockwise around the center of the gravitational pulse. public void GravPulse(EntityCoordinates entityPos, float maxRange, float minRange, float baseRadialDeltaV = 0.0f, float baseTangentialDeltaV = 0.0f) - => GravPulse(entityPos.ToMap(EntityManager), maxRange, minRange, baseRadialDeltaV, baseTangentialDeltaV); + => GravPulse(entityPos.ToMap(EntityManager, _transform), maxRange, minRange, baseRadialDeltaV, baseTangentialDeltaV); /// /// Causes a gravitational pulse, shoving around all entities within some distance of an epicenter. diff --git a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs index 3c44a7fc7af..bc0de7c8c64 100644 --- a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs @@ -2,12 +2,7 @@ using Content.Server.Power.EntitySystems; using Content.Server.Singularity.Components; using Content.Shared.Singularity.Components; -using Content.Shared.Singularity.EntitySystems; using Robust.Shared.Map; -using Robust.Shared.Map.Components; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using System.Numerics; @@ -18,8 +13,8 @@ namespace Content.Server.Singularity.EntitySystems; /// public sealed class SingularityAttractorSystem : EntitySystem { - [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; /// /// The minimum range at which the attraction will act. @@ -69,7 +64,7 @@ private void Update(EntityUid uid, SingularityAttractorComponent? attractor = nu attractor.LastPulseTime = _timing.CurTime; - var mapPos = xform.Coordinates.ToMap(EntityManager); + var mapPos = xform.Coordinates.ToMap(EntityManager, _transform); if (mapPos == MapCoordinates.Nullspace) return; @@ -77,7 +72,7 @@ private void Update(EntityUid uid, SingularityAttractorComponent? attractor = nu var query = EntityQuery(); foreach (var (singulo, walk, singuloXform) in query) { - var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager); + var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager, _transform); if (singuloMapPos.MapId != mapPos.MapId) continue; diff --git a/Content.Server/Speech/EntitySystems/ListeningSystem.cs b/Content.Server/Speech/EntitySystems/ListeningSystem.cs index ea3569e055c..f2a625600ca 100644 --- a/Content.Server/Speech/EntitySystems/ListeningSystem.cs +++ b/Content.Server/Speech/EntitySystems/ListeningSystem.cs @@ -8,6 +8,7 @@ namespace Content.Server.Speech.EntitySystems; /// public sealed class ListeningSystem : EntitySystem { + [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly SharedTransformSystem _xforms = default!; public override void Initialize() @@ -18,10 +19,10 @@ public override void Initialize() private void OnSpeak(EntitySpokeEvent ev) { - PingListeners(ev.Source, ev.Message, ev.ObfuscatedMessage); + PingListeners(ev.Source, ev.Message, ev.IsWhisper); } - public void PingListeners(EntityUid source, string message, string? obfuscatedMessage) + public void PingListeners(EntityUid source, string message, bool isWhisper) { // TODO whispering / audio volume? Microphone sensitivity? // for now, whispering just arbitrarily reduces the listener's max range. @@ -32,7 +33,7 @@ public void PingListeners(EntityUid source, string message, string? obfuscatedMe var attemptEv = new ListenAttemptEvent(source); var ev = new ListenEvent(message, source); - var obfuscatedEv = obfuscatedMessage == null ? null : new ListenEvent(obfuscatedMessage, source); + var obfuscatedEv = !isWhisper ? null : new ListenEvent(_chat.ObfuscateMessageReadability(message), source); var query = EntityQueryEnumerator(); while(query.MoveNext(out var listenerUid, out var listener, out var xform)) diff --git a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs index 9995ed40c12..356768769bb 100644 --- a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs +++ b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs @@ -26,6 +26,7 @@ public sealed class BluespaceLockerSystem : EntitySystem [Dependency] private readonly WeldableSystem _weldableSystem = default!; [Dependency] private readonly LockSystem _lockSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly ExplosionSystem _explosionSystem = default!; public override void Initialize() @@ -386,7 +387,7 @@ private void DestroyAfterLimit(EntityUid uid, BluespaceLockerComponent component switch (component.BehaviorProperties.DestroyType) { case BluespaceLockerDestroyType.Explode: - _explosionSystem.QueueExplosion(uid.ToCoordinates().ToMap(EntityManager), + _explosionSystem.QueueExplosion(uid.ToCoordinates().ToMap(EntityManager, _transformSystem), ExplosionSystem.DefaultExplosionPrototypeId, 4, 1, 2, maxTileBreak: 0); goto case BluespaceLockerDestroyType.Delete; case BluespaceLockerDestroyType.Delete: diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 281d8f57267..49db980451e 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -5,6 +5,7 @@ using Content.Server.Stack; using Content.Server.Store.Components; using Content.Shared.Actions; +using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Hands.EntitySystems; @@ -248,10 +249,12 @@ private void OnBuyRequest(EntityUid uid, StoreComponent component, StoreBuyListi HandleRefundComp(uid, component, upgradeActionId.Value); } - //broadcast event if (listing.ProductEvent != null) { - RaiseLocalEvent(listing.ProductEvent); + if (!listing.RaiseProductEventOnUser) + RaiseLocalEvent(listing.ProductEvent); + else + RaiseLocalEvent(buyer, listing.ProductEvent); } //log dat shit. @@ -321,6 +324,8 @@ private void OnRequestRefund(EntityUid uid, StoreComponent component, StoreReque if (!component.RefundAllowed || component.BoughtEntities.Count == 0) return; + _admin.Add(LogType.StoreRefund, LogImpact.Low, $"{ToPrettyString(buyer):player} has refunded their purchases from {ToPrettyString(uid):store}"); + for (var i = component.BoughtEntities.Count - 1; i >= 0; i--) { var purchase = component.BoughtEntities[i]; diff --git a/Content.Server/Tabletop/TabletopSystem.Session.cs b/Content.Server/Tabletop/TabletopSystem.Session.cs index f16f3f01e98..c2bb8426fc2 100644 --- a/Content.Server/Tabletop/TabletopSystem.Session.cs +++ b/Content.Server/Tabletop/TabletopSystem.Session.cs @@ -31,7 +31,7 @@ public TabletopSession EnsureSession(TabletopGameComponent tabletop) // Since this is the first time opening this session, set up the game tabletop.Setup.SetupTabletop(session, EntityManager); - Logger.Info($"Created tabletop session number {tabletop} at position {session.Position}."); + Log.Info($"Created tabletop session number {tabletop} at position {session.Position}."); return session; } diff --git a/Content.Server/Tiles/LavaSystem.cs b/Content.Server/Tiles/LavaSystem.cs index 51bd6f8475f..7aee0b65010 100644 --- a/Content.Server/Tiles/LavaSystem.cs +++ b/Content.Server/Tiles/LavaSystem.cs @@ -11,7 +11,7 @@ public sealed class LavaSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnLavaStepTriggered); + SubscribeLocalEvent(OnLavaStepTriggered); SubscribeLocalEvent(OnLavaStepTriggerAttempt); } @@ -23,7 +23,7 @@ private void OnLavaStepTriggerAttempt(EntityUid uid, LavaComponent component, re args.Continue = true; } - private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredOffEvent args) + private void OnLavaStepTriggered(EntityUid uid, LavaComponent component, ref StepTriggeredEvent args) { var otherUid = args.Tripper; diff --git a/Content.Server/Wires/WireLayout.cs b/Content.Server/Wires/WireLayout.cs index ecafba013e0..621992c915a 100644 --- a/Content.Server/Wires/WireLayout.cs +++ b/Content.Server/Wires/WireLayout.cs @@ -28,11 +28,13 @@ public sealed partial class WireLayoutPrototype : IPrototype, IInheritingPrototy /// initialization) /// [DataField("dummyWires")] + [NeverPushInheritance] public int DummyWires { get; private set; } = default!; /// /// All the valid IWireActions currently in this layout. /// [DataField("wires")] + [NeverPushInheritance] public List? Wires { get; private set; } } diff --git a/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs b/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs index aed32bc89c3..f2e051669a2 100644 --- a/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs +++ b/Content.Server/Worldgen/Systems/Carvers/NoiseRangeCarverSystem.cs @@ -9,6 +9,7 @@ namespace Content.Server.Worldgen.Systems.Carvers; public sealed class NoiseRangeCarverSystem : EntitySystem { [Dependency] private readonly NoiseIndexSystem _index = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; /// public override void Initialize() @@ -19,7 +20,7 @@ public override void Initialize() private void OnPrePlaceDebris(EntityUid uid, NoiseRangeCarverComponent component, ref PrePlaceDebrisFeatureEvent args) { - var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager)); + var coords = WorldGen.WorldToChunkCoords(args.Coords.ToMapPos(EntityManager, _transform)); var val = _index.Evaluate(uid, component.NoiseChannel, coords); foreach (var (low, high) in component.Ranges) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 53128aade31..daadd4b518b 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -16,7 +16,7 @@ using Content.Server.Roles; using Content.Server.Speech.Components; using Content.Server.Temperature.Components; -using Content.Shared.Psionics.Abilities; +using Content.Shared.Abilities.Psionics; using Content.Shared.CombatMode; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage; @@ -59,7 +59,9 @@ public sealed partial class ZombieSystem [Dependency] private readonly IChatManager _chatMan = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly ActionsSystem _actions = default!; // DeltaV - No psionic zombies /// /// Handles an entity turning into a zombie when they die or go into crit diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs index 70a6119130e..ba94b0f3738 100644 --- a/Content.Shared.Database/LogType.cs +++ b/Content.Shared.Database/LogType.cs @@ -98,4 +98,5 @@ public enum LogType ChatRateLimited = 87, AtmosTemperatureChanged = 88, DeviceNetwork = 89, + StoreRefund = 90 } diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index a3bb1e14679..c335cd7b858 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -129,7 +129,7 @@ public void StartSupercriticalEvent(EntityUid uid) if (HasComp(uid)) return; - AdminLog.Add(LogType.Anomaly, LogImpact.High, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); + AdminLog.Add(LogType.Anomaly, LogImpact.Extreme, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); if (_net.IsServer) Log.Info($"Anomaly is going supercritical. Entity: {ToPrettyString(uid)}"); diff --git a/Content.Shared/Audio/SharedAmbientSoundSystem.cs b/Content.Shared/Audio/SharedAmbientSoundSystem.cs index 6318ba25573..5f17261825c 100644 --- a/Content.Shared/Audio/SharedAmbientSoundSystem.cs +++ b/Content.Shared/Audio/SharedAmbientSoundSystem.cs @@ -5,16 +5,19 @@ namespace Content.Shared.Audio; public abstract class SharedAmbientSoundSystem : EntitySystem { + private EntityQuery _query; + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(GetCompState); SubscribeLocalEvent(HandleCompState); + _query = GetEntityQuery(); } public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || ambience.Enabled == value) + if (!_query.Resolve(uid, ref ambience, false) || ambience.Enabled == value) return; ambience.Enabled = value; @@ -24,7 +27,7 @@ public virtual void SetAmbience(EntityUid uid, bool value, AmbientSoundComponent public virtual void SetRange(EntityUid uid, float value, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value)) + if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Range, value)) return; ambience.Range = value; @@ -39,7 +42,7 @@ protected virtual void QueueUpdate(EntityUid uid, AmbientSoundComponent ambience public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value)) + if (!_query.Resolve(uid, ref ambience, false) || MathHelper.CloseToPercent(ambience.Volume, value)) return; ambience.Volume = value; @@ -48,7 +51,7 @@ public virtual void SetVolume(EntityUid uid, float value, AmbientSoundComponent? public virtual void SetSound(EntityUid uid, SoundSpecifier sound, AmbientSoundComponent? ambience = null) { - if (!Resolve(uid, ref ambience, false) || ambience.Sound == sound) + if (!_query.Resolve(uid, ref ambience, false) || ambience.Sound == sound) return; ambience.Sound = sound; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 891c790d52c..f8943a9bf90 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1596,10 +1596,10 @@ public static readonly CVarDef */ public static readonly CVarDef UILayout = - CVarDef.Create("ui.layout", "Separated", CVar.CLIENTONLY | CVar.ARCHIVE); + CVarDef.Create("ui.layout", "Default", CVar.CLIENTONLY | CVar.ARCHIVE); - public static readonly CVarDef OverlayScreenChatSize = - CVarDef.Create("ui.overlay_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef DefaultScreenChatSize = + CVarDef.Create("ui.default_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE); public static readonly CVarDef SeparatedScreenChatSize = CVarDef.Create("ui.separated_chat_size", "0.6,0", CVar.CLIENTONLY | CVar.ARCHIVE); diff --git a/Content.Shared/Chasm/ChasmSystem.cs b/Content.Shared/Chasm/ChasmSystem.cs index 86b8d4fc4d7..51299557dbd 100644 --- a/Content.Shared/Chasm/ChasmSystem.cs +++ b/Content.Shared/Chasm/ChasmSystem.cs @@ -24,7 +24,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnStepTriggered); + SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnStepTriggerAttempt); SubscribeLocalEvent(OnUpdateCanMove); } @@ -47,7 +47,7 @@ public override void Update(float frameTime) } } - private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredOffEvent args) + private void OnStepTriggered(EntityUid uid, ChasmComponent component, ref StepTriggeredEvent args) { // already doomed if (HasComp(args.Tripper)) diff --git a/Content.Shared/Chemistry/Components/InjectorComponent.cs b/Content.Shared/Chemistry/Components/InjectorComponent.cs index 188028c8f8f..437c5e327d2 100644 --- a/Content.Shared/Chemistry/Components/InjectorComponent.cs +++ b/Content.Shared/Chemistry/Components/InjectorComponent.cs @@ -30,7 +30,7 @@ public sealed partial class InjectorComponent : Component /// Whether or not the injector is able to draw from containers or if it's a single use /// device that can only inject. /// - [DataField("injectOnly")] + [DataField] public bool InjectOnly; /// @@ -39,28 +39,26 @@ public sealed partial class InjectorComponent : Component /// /// for example: droppers would ignore mobs /// - [DataField("ignoreMobs")] + [DataField] public bool IgnoreMobs; /// /// The minimum amount of solution that can be transferred at once from this solution. /// [DataField("minTransferAmount")] - [ViewVariables(VVAccess.ReadWrite)] public FixedPoint2 MinimumTransferAmount = FixedPoint2.New(5); /// /// The maximum amount of solution that can be transferred at once from this solution. /// [DataField("maxTransferAmount")] - public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(15); + public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(50); /// /// Amount to inject or draw on each usage. If the injector is inject only, it will /// attempt to inject it's entire contents upon use. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("transferAmount")] + [DataField] [AutoNetworkedField] public FixedPoint2 TransferAmount = FixedPoint2.New(5); @@ -71,8 +69,7 @@ public sealed partial class InjectorComponent : Component /// The base delay has a minimum of 1 second, but this will still be modified if the target is incapacitated or /// in combat mode. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("delay")] + [DataField] public TimeSpan Delay = TimeSpan.FromSeconds(5); /// @@ -80,7 +77,6 @@ public sealed partial class InjectorComponent : Component /// right SolutionCaps to support injection/drawing. For InjectOnly injectors this should /// only ever be set to Inject /// - [ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] [DataField] public InjectorToggleMode ToggleState = InjectorToggleMode.Draw; diff --git a/Content.Shared/Construction/Conditions/WallmountCondition.cs b/Content.Shared/Construction/Conditions/WallmountCondition.cs index bf3016d4974..fe4336e6fc7 100644 --- a/Content.Shared/Construction/Conditions/WallmountCondition.cs +++ b/Content.Shared/Construction/Conditions/WallmountCondition.cs @@ -19,8 +19,9 @@ public bool Condition(EntityUid user, EntityCoordinates location, Direction dire var entManager = IoCManager.Resolve(); // get blueprint and user position + var transformSystem = entManager.System(); var userWorldPosition = entManager.GetComponent(user).WorldPosition; - var objWorldPosition = location.ToMap(entManager).Position; + var objWorldPosition = location.ToMap(entManager, transformSystem).Position; // find direction from user to blueprint var userToObject = (objWorldPosition - userWorldPosition); diff --git a/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs new file mode 100644 index 00000000000..75de0cb8a25 --- /dev/null +++ b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.DeviceNetwork.Components; + +/// +/// Allow entities to jam DeviceNetwork packets. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class DeviceNetworkJammerComponent : Component +{ + /// + /// Range where packets will be jammed. This is checked both against the sender and receiver. + /// + [DataField, AutoNetworkedField] + public float Range = 5.0f; + + /// + /// Device networks that can be jammed. For a list of default NetworkIds see DeviceNetIdDefaults on Content.Server. + /// Network ids are not guaranteed to be limited to DeviceNetIdDefaults. + /// + [DataField, AutoNetworkedField] + public HashSet JammableNetworks = []; + +} diff --git a/Content.Shared/Examine/ExamineSystemShared.cs b/Content.Shared/Examine/ExamineSystemShared.cs index 5a3fb872293..f792862be14 100644 --- a/Content.Shared/Examine/ExamineSystemShared.cs +++ b/Content.Shared/Examine/ExamineSystemShared.cs @@ -144,7 +144,7 @@ public bool IsOccluded(EntityUid uid) return TryComp(uid, out var eye) && eye.DrawFov; } - public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) + public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { // No, rider. This is better. // ReSharper disable once ConvertToLocalFunction @@ -154,7 +154,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other return InRangeUnOccluded(origin, other, range, predicate, wrapped, ignoreInsideBlocker, entMan); } - public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, + public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, TState state, Func predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { if (other.MapId != origin.MapId || @@ -171,7 +171,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinat if (length > MaxRaycastRange) { - Logger.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); + Log.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); length = MaxRaycastRange; } @@ -207,7 +207,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinat return true; } - public static bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -216,7 +216,7 @@ public static bool InRangeUnOccluded(EntityUid origin, EntityUid other, float ra return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public static bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -225,7 +225,7 @@ public static bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public static bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs index bbae03e45b3..20e08b2767d 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs @@ -114,7 +114,7 @@ public bool TryPickup( && (itemPos.Position - xform.MapPosition.Position).Length() <= MaxAnimationRange && MetaData(entity).VisibilityMask == MetaData(uid).VisibilityMask) // Don't animate aghost pickups. { - var initialPosition = EntityCoordinates.FromMap(coordinateEntity, itemPos, EntityManager); + var initialPosition = EntityCoordinates.FromMap(coordinateEntity, itemPos, TransformSystem, EntityManager); _storage.PlayPickupAnimation(entity, initialPosition, xform.Coordinates, itemXform.LocalRotation, uid); } } diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index ee4a4e9023b..0b72ac5ee74 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -25,6 +25,7 @@ public static class ContentKeyFunctions public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward"; public static readonly BoundKeyFunction EscapeContext = "EscapeContext"; public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu"; + public static readonly BoundKeyFunction OpenLanguageMenu = "OpenLanguageMenu"; public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu"; public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook"; public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu"; diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 7d5e390b6f0..0e390ecea45 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -459,7 +459,7 @@ protected bool ValidateInteractAndFace(EntityUid user, EntityCoordinates coordin return false; if (!HasComp(user)) - _rotateToFaceSystem.TryFaceCoordinates(user, coordinates.ToMapPos(EntityManager)); + _rotateToFaceSystem.TryFaceCoordinates(user, coordinates.ToMapPos(EntityManager, _transform)); return true; } @@ -612,7 +612,7 @@ public bool InRangeUnobstructed( Ignored combinedPredicate = e => e == origin || (predicate?.Invoke(e) ?? false); var inRange = true; MapCoordinates originPos = default; - var targetPos = otherCoordinates.ToMap(EntityManager); + var targetPos = otherCoordinates.ToMap(EntityManager, _transform); Angle targetRot = default; // So essentially: @@ -785,7 +785,7 @@ public bool InRangeUnobstructed( Ignored? predicate = null, bool popup = false) { - return InRangeUnobstructed(origin, other.ToMap(EntityManager), range, collisionMask, predicate, popup); + return InRangeUnobstructed(origin, other.ToMap(EntityManager, _transform), range, collisionMask, predicate, popup); } /// diff --git a/Content.Shared/Language/Components/LanguageSpeakerComponent.cs b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs new file mode 100644 index 00000000000..95232ffe6ff --- /dev/null +++ b/Content.Shared/Language/Components/LanguageSpeakerComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language; + +[RegisterComponent, AutoGenerateComponentState] +public sealed partial class LanguageSpeakerComponent : Component +{ + /// + /// The current language the entity may use to speak. + /// Other listeners will hear the entity speak in this language. + /// + [ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public string CurrentLanguage = default!; + + /// + /// List of languages this entity can speak. + /// + [ViewVariables] + [DataField("speaks", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List SpokenLanguages = new(); + + /// + /// List of languages this entity can understand. + /// + [ViewVariables] + [DataField("understands", customTypeSerializer: typeof(PrototypeIdListSerializer), required: true)] + public List UnderstoodLanguages = new(); +} diff --git a/Content.Shared/Language/Components/TranslatorImplanterComponent.cs b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs new file mode 100644 index 00000000000..401e8a8b8aa --- /dev/null +++ b/Content.Shared/Language/Components/TranslatorImplanterComponent.cs @@ -0,0 +1,35 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components; + +/// +/// An item that, when used on a mob, adds an intrinsic translator to it. +/// +[RegisterComponent] +public sealed partial class TranslatorImplanterComponent : Component +{ + [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List SpokenLanguages = new(); + + [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List UnderstoodLanguages = new(); + + /// + /// The list of languages the mob must understand in order for this translator to have effect. + /// Knowing one language is enough. + /// + [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List RequiredLanguages = new(); + + /// + /// If true, only allows to use this implanter on mobs. + /// + [DataField] + public bool MobsOnly = true; + + /// + /// Whether this implant has been used already. + /// + [DataField] + public bool Used = false; +} diff --git a/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs new file mode 100644 index 00000000000..a66c9be082e --- /dev/null +++ b/Content.Shared/Language/Components/Translators/BaseTranslatorComponent.cs @@ -0,0 +1,47 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Shared.Language.Components.Translators; + +public abstract partial class BaseTranslatorComponent : Component +{ + // TODO may need to be removed completely, it's a part of legacy code that never ended up being used. + /// + /// The language this translator changes the speaker's language to when they don't specify one. + /// If null, does not modify the default language. + /// + [DataField("defaultLanguage")] + [ViewVariables(VVAccess.ReadWrite)] + public string? DefaultLanguageOverride = null; + + /// + /// The list of additional languages this translator allows the wielder to speak. + /// + [DataField("spoken", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List SpokenLanguages = new(); + + /// + /// The list of additional languages this translator allows the wielder to understand. + /// + [DataField("understood", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List UnderstoodLanguages = new(); + + /// + /// The languages the wielding MUST know in order for this translator to have effect. + /// The field [RequiresAllLanguages] indicates whether all of them are required, or just one. + /// + [DataField("requires", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List RequiredLanguages = new(); + + /// + /// If true, the wielder must understand all languages in [RequiredLanguages] to speak [SpokenLanguages], + /// and understand all languages in [RequiredLanguages] to understand [UnderstoodLanguages]. + /// + /// Otherwise, at least one language must be known (or the list must be empty). + /// + [DataField("requiresAll")] + [ViewVariables(VVAccess.ReadWrite)] + public bool RequiresAllLanguages = false; + + [DataField("enabled"), ViewVariables(VVAccess.ReadWrite)] + public bool Enabled = true; +} diff --git a/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs new file mode 100644 index 00000000000..f900603f01d --- /dev/null +++ b/Content.Shared/Language/Components/Translators/HandheldTranslatorComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// A translator that must be held in a hand or a pocket of an entity in order ot have effect. +/// +[RegisterComponent] +public sealed partial class HandheldTranslatorComponent : Translators.BaseTranslatorComponent +{ + /// + /// Whether or not interacting with this translator + /// toggles it on or off. + /// + [DataField("toggleOnInteract")] + public bool ToggleOnInteract = true; +} diff --git a/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs new file mode 100644 index 00000000000..caea9b9a948 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/HoldsTranslatorComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// Applied internally to the holder of [HandheldTranslatorComponent]. +/// Do not use directly. Use [HandheldTranslatorComponent] instead. +/// +[RegisterComponent] +public sealed partial class HoldsTranslatorComponent : IntrinsicTranslatorComponent +{ + public Component? Issuer = null; +} diff --git a/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs new file mode 100644 index 00000000000..d1d72e83ed7 --- /dev/null +++ b/Content.Shared/Language/Components/Translators/ImplantedTranslatorComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// Applied to entities who were injected with a translator implant. +/// +[RegisterComponent] +public sealed partial class ImplantedTranslatorComponent : IntrinsicTranslatorComponent +{ +} diff --git a/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs new file mode 100644 index 00000000000..d8def4ac1de --- /dev/null +++ b/Content.Shared/Language/Components/Translators/IntrinsicTranslatorComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Language.Components.Translators; + +/// +/// A translator attached to an entity that translates its speech. +/// An example is a translator implant that allows the speaker to speak another language. +/// +[RegisterComponent, Virtual] +public partial class IntrinsicTranslatorComponent : Translators.BaseTranslatorComponent +{ +} diff --git a/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs new file mode 100644 index 00000000000..6f5ad1178b8 --- /dev/null +++ b/Content.Shared/Language/Components/UniversalLanguageSpeakerComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Language.Components; + +// +// Signifies that this entity can speak and understand any language. +// Applies to such entities as ghosts. +// +[RegisterComponent] +public sealed partial class UniversalLanguageSpeakerComponent : Component +{ + +} diff --git a/Content.Shared/Language/Events/LanguagesSetMessage.cs b/Content.Shared/Language/Events/LanguagesSetMessage.cs new file mode 100644 index 00000000000..f7a78210aaf --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesSetMessage.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent from the client to the server when it needs to want to set his currentLangauge. +/// Yeah im using this instead of ExecuteCommand... Better right? +/// +[Serializable, NetSerializable] +public sealed class LanguagesSetMessage(string currentLanguage) : EntityEventArgs +{ + public string CurrentLanguage = currentLanguage; +} diff --git a/Content.Shared/Language/Events/LanguagesUpdateEvent.cs b/Content.Shared/Language/Events/LanguagesUpdateEvent.cs new file mode 100644 index 00000000000..90ce2f4446b --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesUpdateEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Language.Events; + +/// +/// Raised on an entity when its list of languages changes. +/// +public sealed class LanguagesUpdateEvent : EntityEventArgs +{ +} diff --git a/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs new file mode 100644 index 00000000000..563f036df6d --- /dev/null +++ b/Content.Shared/Language/Events/LanguagesUpdatedMessage.cs @@ -0,0 +1,15 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent to the client when its list of languages changes. +/// The client should in turn update its HUD and relevant systems. +/// +[Serializable, NetSerializable] +public sealed class LanguagesUpdatedMessage(string currentLanguage, List spoken, List understood) : EntityEventArgs +{ + public string CurrentLanguage = currentLanguage; + public List Spoken = spoken; + public List Understood = understood; +} diff --git a/Content.Shared/Language/Events/RequestLanguagesMessage.cs b/Content.Shared/Language/Events/RequestLanguagesMessage.cs new file mode 100644 index 00000000000..aead1f4cd1a --- /dev/null +++ b/Content.Shared/Language/Events/RequestLanguagesMessage.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Events; + +/// +/// Sent from the client to the server when it needs to learn the list of languages its entity knows. +/// This event should always be followed by a , unless the client doesn't have an entity. +/// +[Serializable, NetSerializable] +public sealed class RequestLanguagesMessage : EntityEventArgs; diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs new file mode 100644 index 00000000000..801ab8a393b --- /dev/null +++ b/Content.Shared/Language/LanguagePrototype.cs @@ -0,0 +1,37 @@ +using System.Runtime.CompilerServices; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Language; + +[Prototype("language")] +public sealed class LanguagePrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// If true, obfuscated phrases of creatures speaking this language will have their syllables replaced with "replacement" syllables. + /// Otherwise entire sentences will be replaced. + /// + [DataField(required: true)] + public bool ObfuscateSyllables; + + /// + /// Lists all syllables that are used to obfuscate a message a listener cannot understand if obfuscateSyllables is true. + /// Otherwise uses all possible phrases the creature can make when trying to say anything. + /// + [DataField(required: true)] + public List Replacement = []; + + #region utility + /// + /// The in-world name of this language, localized. + /// + public string Name => Loc.GetString($"language-{ID}-name"); + + /// + /// The in-world description of this language, localized. + /// + public string Description => Loc.GetString($"language-{ID}-description"); + #endregion utility +} diff --git a/Content.Shared/Language/Systems/SharedLanguageSystem.cs b/Content.Shared/Language/Systems/SharedLanguageSystem.cs new file mode 100644 index 00000000000..e2eeb8bb493 --- /dev/null +++ b/Content.Shared/Language/Systems/SharedLanguageSystem.cs @@ -0,0 +1,39 @@ +using Content.Shared.Actions; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedLanguageSystem : EntitySystem +{ + /// + /// The language used as a fallback in cases where an entity suddenly becomes a language speaker (e.g. the usage of make-sentient) + /// + [ValidatePrototypeId] + public static readonly string FallbackLanguagePrototype = "GalacticCommon"; + + /// + /// The language whose speakers are assumed to understand and speak every language. Should never be added directly. + /// + [ValidatePrototypeId] + public static readonly string UniversalPrototype = "Universal"; + + /// + /// A cached instance of + /// + public static LanguagePrototype Universal { get; private set; } = default!; + + [Dependency] protected readonly IPrototypeManager _prototype = default!; + [Dependency] protected readonly IRobustRandom _random = default!; + + public override void Initialize() + { + Universal = _prototype.Index("Universal"); + } + + public LanguagePrototype? GetLanguagePrototype(string id) + { + _prototype.TryIndex(id, out var proto); + return proto; + } +} diff --git a/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs new file mode 100644 index 00000000000..a13225378cd --- /dev/null +++ b/Content.Shared/Language/Systems/SharedTranslatorImplanterSystem.cs @@ -0,0 +1,36 @@ +using Content.Shared.Examine; +using Content.Shared.Implants.Components; +using Content.Shared.Language.Components; +using Robust.Shared.Serialization; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedTranslatorImplanterSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(EntityUid uid, TranslatorImplanterComponent component, ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + var text = !component.Used + ? Loc.GetString("translator-implanter-ready") + : Loc.GetString("translator-implanter-used"); + + args.PushText(text); + } + + protected void OnAppearanceChange(EntityUid implanter, TranslatorImplanterComponent component) + { + var used = component.Used; + _appearance.SetData(implanter, ImplanterVisuals.Full, !used); + } +} diff --git a/Content.Shared/Language/Systems/SharedTranslatorSystem.cs b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs new file mode 100644 index 00000000000..08a016efa9c --- /dev/null +++ b/Content.Shared/Language/Systems/SharedTranslatorSystem.cs @@ -0,0 +1,34 @@ +using Content.Shared.Examine; +using Content.Shared.Toggleable; +using Content.Shared.Language.Components.Translators; + +namespace Content.Shared.Language.Systems; + +public abstract class SharedTranslatorSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(EntityUid uid, HandheldTranslatorComponent component, ExaminedEvent args) + { + var state = Loc.GetString(component.Enabled + ? "translator-enabled" + : "translator-disabled"); + + args.PushMarkup(state); + } + + protected void OnAppearanceChange(EntityUid translator, HandheldTranslatorComponent? comp = null) + { + if (comp == null && !TryComp(translator, out comp)) + return; + + _appearance.SetData(translator, ToggleVisuals.Toggled, comp.Enabled); + } +} diff --git a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs index 813a18f974c..a0feab7052c 100644 --- a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs +++ b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs @@ -14,7 +14,7 @@ public sealed partial class MovementSpeedModifierComponent : Component // Weightless public const float DefaultMinimumFrictionSpeed = 0.005f; public const float DefaultWeightlessFriction = 1f; - public const float DefaultWeightlessFrictionNoInput = 0f; + public const float DefaultWeightlessFrictionNoInput = 0.2f; public const float DefaultWeightlessModifier = 0.7f; public const float DefaultWeightlessAcceleration = 1f; diff --git a/Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs similarity index 100% rename from Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs diff --git a/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs similarity index 77% rename from Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs index c3702880375..ce86111fc4b 100644 --- a/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs @@ -1,6 +1,6 @@ using Content.Shared.Damage; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { /// /// Takes damage when dispelled. @@ -9,7 +9,7 @@ namespace Content.Shared.Psionics.Abilities public sealed partial class DamageOnDispelComponent : Component { [DataField("damage", required: true)] - public DamageSpecifier Damage = default!; + public DamageSpecifier Damage = default!; [DataField("variance")] public float Variance = 0.5f; diff --git a/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs similarity index 79% rename from Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs index 518a28b0967..cd887866364 100644 --- a/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs @@ -1,22 +1,20 @@ +using Content.Shared.Actions; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class DispelPowerComponent : Component { [DataField("range")] public float Range = 10f; - + [DataField("dispelActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] public string? DispelActionId = "ActionDispel"; [DataField("dispelActionEntity")] public EntityUid? DispelActionEntity; - - [DataField("dispelFeedback")] - public string DispelFeedback = "dispel-feedback"; } } diff --git a/Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs similarity index 69% rename from Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs index 4bb5ee653d2..40352004187 100644 --- a/Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class DispellableComponent : Component diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs new file mode 100644 index 00000000000..7d611c63dac --- /dev/null +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared.Actions; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Abilities.Psionics +{ + [RegisterComponent] + public sealed partial class MassSleepPowerComponent : Component + { + public float Radius = 1.25f; + [DataField("massSleepActionId", + customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? MassSleepActionId = "ActionMassSleep"; + + [DataField("massSleepActionEntity")] + public EntityUid? MassSleepActionEntity; + } +} diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs new file mode 100644 index 00000000000..e36a3c70e8a --- /dev/null +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs @@ -0,0 +1,59 @@ +using Content.Shared.Actions; +using Content.Shared.Bed.Sleep; +using Content.Shared.Magic.Events; +using Content.Shared.Damage; +using Content.Shared.Mobs.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; +using Content.Shared.Mind; +using Content.Shared.Actions.Events; + +namespace Content.Shared.Abilities.Psionics +{ + public sealed class MassSleepPowerSystem : EntitySystem + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly SharedPsionicAbilitiesSystem _psionics = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnPowerUsed); + } + + private void OnInit(EntityUid uid, MassSleepPowerComponent component, ComponentInit args) + { + _actions.AddAction(uid, ref component.MassSleepActionEntity, component.MassSleepActionId ); + _actions.TryGetActionData( component.MassSleepActionEntity, out var actionData ); + if (actionData is { UseDelay: not null }) + _actions.StartUseDelay(component.MassSleepActionEntity); + if (TryComp(uid, out var psionic) && psionic.PsionicAbility == null) + psionic.PsionicAbility = component.MassSleepActionEntity; + } + + private void OnShutdown(EntityUid uid, MassSleepPowerComponent component, ComponentShutdown args) + { + _actions.RemoveAction(uid, component.MassSleepActionEntity); + } + + private void OnPowerUsed(EntityUid uid, MassSleepPowerComponent component, MassSleepPowerActionEvent args) + { + foreach (var entity in _lookup.GetEntitiesInRange(args.Target, component.Radius)) + { + if (HasComp(entity) && entity != uid && !HasComp(entity)) + { + if (TryComp(entity, out var damageable) && damageable.DamageContainerID == "Biological") + EnsureComp(entity); + } + } + _psionics.LogPowerUsed(uid, "mass sleep"); + args.Handled = true; + } + } +} diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs new file mode 100644 index 00000000000..c9d0130221a --- /dev/null +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Actions; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Abilities.Psionics +{ + [RegisterComponent] + public sealed partial class MetapsionicPowerComponent : Component + { + [DataField("range")] + public float Range = 5f; + + public InstantActionComponent? MetapsionicPowerAction = null; + [DataField("metapsionicActionId", + customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? MetapsionicActionId = "ActionMetapsionic"; + + [DataField("metapsionicActionEntity")] + public EntityUid? MetapsionicActionEntity; + } +} diff --git a/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs similarity index 76% rename from Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs index 94b73c41e38..6a3fc811c89 100644 --- a/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class MindSwapPowerComponent : Component @@ -12,8 +12,5 @@ public sealed partial class MindSwapPowerComponent : Component [DataField("mindSwapActionEntity")] public EntityUid? MindSwapActionEntity; - - [DataField("mindSwapFeedback")] - public string MindSwapFeedback = "mind-swap-feedback"; } } diff --git a/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs similarity index 77% rename from Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs index 997db65e1b1..0e91894b1dc 100644 --- a/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class NoosphericZapPowerComponent : Component @@ -13,8 +13,5 @@ public sealed partial class NoosphericZapPowerComponent : Component [DataField("noosphericZapActionEntity")] public EntityUid? NoosphericZapActionEntity; - - [DataField("noosphericZapFeedback")] - public string NoosphericZapFeedback = "noospheric-zap-feedback"; } } diff --git a/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs similarity index 71% rename from Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs index d9c36f5b22a..3e198aa9303 100644 --- a/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs @@ -1,7 +1,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class PsionicInvisibilityPowerComponent : Component @@ -12,11 +12,5 @@ public sealed partial class PsionicInvisibilityPowerComponent : Component [DataField("psionicInvisibilityActionEntity")] public EntityUid? PsionicInvisibilityActionEntity; - - [DataField("InvisibilityFeedback")] - public string InvisibilityFeedback = "invisibility-feedback"; - - [DataField("UseTimer")] - public float UseTimer = 30f; } } diff --git a/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs similarity index 94% rename from Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs index 2a9dd7642ba..9037b8bcdfe 100644 --- a/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs @@ -1,7 +1,6 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class PsionicInvisibilityUsedComponent : Component diff --git a/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs similarity index 76% rename from Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs index 3184bf7de5b..4a62e84d191 100644 --- a/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class PsionicRegenerationPowerComponent : Component @@ -12,7 +12,7 @@ public sealed partial class PsionicRegenerationPowerComponent : Component public DoAfterId? DoAfter; [DataField("essence")] - public float EssenceAmount = 10; + public float EssenceAmount = 20; [DataField("useDelay")] public float UseDelay = 8f; @@ -26,12 +26,6 @@ public sealed partial class PsionicRegenerationPowerComponent : Component [DataField("psionicRegenerationActionEntity")] public EntityUid? PsionicRegenerationActionEntity; - - [DataField("regenerationFeedback")] - public string RegenerationFeedback = "regeneration-feedback"; - - [DataField("selfRevive")] - public bool SelfRevive { get; set; } = false; } } diff --git a/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs similarity index 79% rename from Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs index 1f88741b9a9..28425afdb4c 100644 --- a/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class PyrokinesisPowerComponent : Component @@ -14,8 +14,5 @@ public sealed partial class PyrokinesisPowerComponent : Component [DataField("pyrokinesisActionEntity")] public EntityUid? PyrokinesisActionEntity; - - [DataField("pyrokinesisFeedback")] - public string PyrokinesisFeedback = "pyrokinesis-feedback"; } } diff --git a/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs similarity index 73% rename from Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs index f1a71332b18..51958822a41 100644 --- a/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class TelegnosisPowerComponent : Component @@ -19,11 +19,5 @@ public sealed partial class TelegnosisPowerComponent : Component [DataField("telegnosisActionEntity")] public EntityUid? TelegnosisActionEntity; - - [DataField("telegnosisFeedback")] - public string TelegnosisFeedback = "telegnosis-feedback"; - public EntityUid OriginalEntity = default!; - public EntityUid ProjectionUid = default!; - public bool IsProjecting = false; } -} +} \ No newline at end of file diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs new file mode 100644 index 00000000000..9d627cb42d8 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Shared.Abilities.Psionics +{ + [RegisterComponent] + public sealed partial class TelegnosticProjectionComponent : Component + {} +} \ No newline at end of file diff --git a/Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs similarity index 84% rename from Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs index f09efc3064c..4cbb05c8395 100644 --- a/Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class ClothingGrantPsionicPowerComponent : Component diff --git a/Content.Shared/Psionics/Items/HeadCageComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs similarity index 96% rename from Content.Shared/Psionics/Items/HeadCageComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs index c03241e47c7..acaa832860f 100644 --- a/Content.Shared/Psionics/Items/HeadCageComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs @@ -1,7 +1,7 @@ using System.Threading; using Robust.Shared.Audio; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class HeadCageComponent : Component diff --git a/Content.Shared/Psionics/Items/HeadCagedComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs similarity index 81% rename from Content.Shared/Psionics/Items/HeadCagedComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs index 0f826f7a05e..f8af46b8878 100644 --- a/Content.Shared/Psionics/Items/HeadCagedComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] /// diff --git a/Content.Shared/Psionics/Items/PsionicItemsSystem.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs similarity index 98% rename from Content.Shared/Psionics/Items/PsionicItemsSystem.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs index 950353c5dfb..f88acf61f3c 100644 --- a/Content.Shared/Psionics/Items/PsionicItemsSystem.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs @@ -2,7 +2,7 @@ using Content.Shared.Clothing.Components; using Content.Shared.StatusEffect; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { public sealed class PsionicItemsSystem : EntitySystem { diff --git a/Content.Shared/Psionics/Items/TinfoilHatComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs similarity index 90% rename from Content.Shared/Psionics/Items/TinfoilHatComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs index 6ef7bdc823b..5086b9f4977 100644 --- a/Content.Shared/Psionics/Items/TinfoilHatComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class TinfoilHatComponent : Component diff --git a/Content.Shared/Psionics/PsionicComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs similarity index 51% rename from Content.Shared/Psionics/PsionicComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs index 9a06e54cb31..9091e03cfc3 100644 --- a/Content.Shared/Psionics/PsionicComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs @@ -1,6 +1,7 @@ +using Content.Shared.Actions; using Robust.Shared.GameStates; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent, NetworkedComponent] public sealed partial class PsionicComponent : Component @@ -14,17 +15,6 @@ public sealed partial class PsionicComponent : Component public bool Removable = true; [DataField("activePowers")] - public List ActivePowers = new(); - - [DataField("psychicFeedback")] - public List PsychicFeedback = new(); - - [DataField("amplification")] - public float Amplification = 0.1f; - - [DataField("dampening")] - public float Dampening = 0.1f; - public bool Telepath = false; - public bool InnatePsiChecked = false; + public HashSet ActivePowers = new(); } } diff --git a/Content.Shared/Psionics/PsionicInsulationComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs similarity index 82% rename from Content.Shared/Psionics/PsionicInsulationComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs index 2ab054b1f8f..12370da5ae4 100644 --- a/Content.Shared/Psionics/PsionicInsulationComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { [RegisterComponent] public sealed partial class PsionicInsulationComponent : Component diff --git a/Content.Shared/Psionics/PsionicsDisabledComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs similarity index 84% rename from Content.Shared/Psionics/PsionicsDisabledComponent.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs index 00cf5506523..28e7157a9d2 100644 --- a/Content.Shared/Psionics/PsionicsDisabledComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { /// /// Only use this for the status effect, please. diff --git a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs similarity index 97% rename from Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs rename to Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs index 603c5188a52..2739d5ba31a 100644 --- a/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs @@ -7,7 +7,7 @@ using Robust.Shared.Random; using Robust.Shared.Serialization; -namespace Content.Shared.Psionics.Abilities +namespace Content.Shared.Abilities.Psionics { public sealed class SharedPsionicAbilitiesSystem : EntitySystem { @@ -73,7 +73,7 @@ public void SetPsionicsThroughEligibility(EntityUid uid) if (actionData == null) return; - _actions.SetEnabled(uid, IsEligibleForPsionics(uid)); + _actions.SetEnabled(actionData.Owner, IsEligibleForPsionics(uid)); } private bool IsEligibleForPsionics(EntityUid uid) diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs new file mode 100644 index 00000000000..6666ee48d6c --- /dev/null +++ b/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs @@ -0,0 +1,2 @@ +namespace Content.Shared.Actions.Events; +public sealed partial class MassSleepPowerActionEvent : WorldTargetActionEvent {} diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs index b7c3c8ad2d6..b28801efe74 100644 --- a/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs +++ b/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs @@ -1,3 +1,2 @@ namespace Content.Shared.Actions.Events; -public sealed partial class WideMetapsionicPowerActionEvent : InstantActionEvent { } -public sealed partial class FocusedMetapsionicPowerActionEvent : EntityTargetActionEvent { } +public sealed partial class MetapsionicPowerActionEvent : InstantActionEvent {} diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs index 4639aadd55b..896ec0bb63d 100644 --- a/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs +++ b/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs @@ -1,4 +1,2 @@ namespace Content.Shared.Actions.Events; -public sealed partial class PyrokinesisPowerActionEvent : WorldTargetActionEvent {} - - +public sealed partial class PyrokinesisPowerActionEvent : EntityTargetActionEvent {} diff --git a/Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs b/Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs deleted file mode 100644 index 4435f475a44..00000000000 --- a/Content.Shared/Nyanotrasen/Actions/Events/RegenerativeStasisPowerActionEvent.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Content.Shared.Actions.Events; -public sealed partial class RegenerativeStasisPowerActionEvent : EntityTargetActionEvent {} diff --git a/Content.Shared/Nyanotrasen/Psionics/Events.cs b/Content.Shared/Nyanotrasen/Psionics/Events.cs new file mode 100644 index 00000000000..cf9a50c6e18 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Psionics/Events.cs @@ -0,0 +1,28 @@ +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Psionics.Events +{ + [Serializable, NetSerializable] + public sealed partial class PsionicRegenerationDoAfterEvent : DoAfterEvent + { + [DataField("startedAt", required: true)] + public TimeSpan StartedAt; + + private PsionicRegenerationDoAfterEvent() + { + } + + public PsionicRegenerationDoAfterEvent(TimeSpan startedAt) + { + StartedAt = startedAt; + } + + public override DoAfterEvent Clone() => this; + } + + [Serializable, NetSerializable] + public sealed partial class GlimmerWispDrainDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs b/Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs similarity index 98% rename from Content.Shared/Psionics/Glimmer/GlimmerSystem.cs rename to Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs index 8be02f936a9..31af85bbb51 100644 --- a/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs +++ b/Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs @@ -40,7 +40,7 @@ public GlimmerTier GetGlimmerTier(int? glimmer = null) if (glimmer == null) glimmer = Glimmer; - return glimmer switch + return (glimmer) switch { <= 49 => GlimmerTier.Minimal, >= 50 and <= 99 => GlimmerTier.Low, diff --git a/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs b/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs similarity index 100% rename from Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs rename to Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs diff --git a/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs b/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs similarity index 100% rename from Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs rename to Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs diff --git a/Content.Shared/Physics/FrictionRemoverSystem.cs b/Content.Shared/Physics/FrictionRemoverSystem.cs deleted file mode 100644 index 65bbe9e4d23..00000000000 --- a/Content.Shared/Physics/FrictionRemoverSystem.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; - -namespace Content.Shared.Physics; - -public sealed class FrictionRemoverSystem : EntitySystem -{ - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(RemoveDampening); - } - - - private void RemoveDampening(EntityUid uid, PhysicsComponent component, PhysicsSleepEvent args) - { - _physics.SetAngularDamping(uid, component, 0f, false); - _physics.SetLinearDamping(uid, component, 0f); - } -} diff --git a/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs deleted file mode 100644 index 2fbfe18327e..00000000000 --- a/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Shared.DoAfter; -using Robust.Shared.Audio; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Shared.Psionics.Abilities -{ - [RegisterComponent] - public sealed partial class MetapsionicPowerComponent : Component - { - [DataField("doAfter")] - public DoAfterId? DoAfter; - - [DataField("useDelay")] - public float UseDelay = 8f; - [DataField("soundUse")] - - public SoundSpecifier SoundUse = new SoundPathSpecifier("/Audio/Nyanotrasen/heartbeat_fast.ogg"); - - [DataField("range")] - public float Range = 5f; - - [DataField("actionWideMetapsionic", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ActionWideMetapsionic = "ActionWideMetapsionic"; - - [DataField("actionWideMetapsionicEntity")] - public EntityUid? ActionWideMetapsionicEntity; - - [DataField("actionFocusedMetapsionic", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ActionFocusedMetapsionic = "ActionFocusedMetapsionic"; - - [DataField("actionFocusedMetapsionicEntity")] - public EntityUid? ActionFocusedMetapsionicEntity; - - [DataField("metapsionicFeedback")] - public string MetapsionicFeedback = "metapsionic-feedback"; - } -} diff --git a/Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs b/Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs deleted file mode 100644 index 27a0903e224..00000000000 --- a/Content.Shared/Psionics/Abilities/RegenerativeStasis/RegenerativeStasisPowerComponent.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Content.Shared.Actions; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Shared.Psionics.Abilities -{ - [RegisterComponent] - public sealed partial class RegenerativeStasisPowerComponent : Component - { - [DataField("regenerativeStasisActionId", - customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? RegenerativeStasisActionId = "ActionRegenerativeStasis"; - - [DataField("regenerativeStasisActionEntity")] - public EntityUid? RegenerativeStasisActionEntity; - - [DataField("regenerativeStasisFeedback")] - public string RegenerativeStasisFeedback = "regenerative-stasis-feedback"; - } -} diff --git a/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs deleted file mode 100644 index bc18ff9f3c2..00000000000 --- a/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Content.Shared.Psionics.Abilities -{ - [RegisterComponent] - public sealed partial class TelegnosticProjectionComponent : Component - { - public EntityUid OriginalEntity = default!; - } -} diff --git a/Content.Shared/Psionics/Events.cs b/Content.Shared/Psionics/Events.cs deleted file mode 100644 index 45a00b5f048..00000000000 --- a/Content.Shared/Psionics/Events.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Robust.Shared.Serialization; -using Content.Shared.DoAfter; - -namespace Content.Shared.Psionics.Events -{ - [Serializable, NetSerializable] - public sealed partial class PsionicRegenerationDoAfterEvent : DoAfterEvent - { - [DataField("startedAt", required: true)] - public TimeSpan StartedAt; - - private PsionicRegenerationDoAfterEvent() - { - } - - public PsionicRegenerationDoAfterEvent(TimeSpan startedAt) - { - StartedAt = startedAt; - } - - public override DoAfterEvent Clone() => this; - } - - [Serializable, NetSerializable] - public sealed partial class PsionicInvisibilityTimerEvent : DoAfterEvent - { - [DataField("startedAt", required: true)] - public TimeSpan StartedAt; - - private PsionicInvisibilityTimerEvent() - { - } - - public PsionicInvisibilityTimerEvent(TimeSpan startedAt) - { - StartedAt = startedAt; - } - - public override DoAfterEvent Clone() => this; - } - - [Serializable, NetSerializable] - public sealed partial class FocusedMetapsionicDoAfterEvent : DoAfterEvent - { - [DataField("startedAt", required: true)] - public TimeSpan StartedAt; - - private FocusedMetapsionicDoAfterEvent() - { - } - - public FocusedMetapsionicDoAfterEvent(TimeSpan startedAt) - { - StartedAt = startedAt; - } - - public override DoAfterEvent Clone() => this; - } - - [Serializable, NetSerializable] - public sealed partial class GlimmerWispDrainDoAfterEvent : SimpleDoAfterEvent - { - } -} diff --git a/Content.Shared/Psionics/SharedPsionicSystem.Insulated.cs b/Content.Shared/Psionics/SharedPsionicSystem.Insulated.cs deleted file mode 100644 index 5c89f39354c..00000000000 --- a/Content.Shared/Psionics/SharedPsionicSystem.Insulated.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Content.Shared.Psionics -{ - public readonly record struct PsionicInsulationEvent; -} diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index ff8b597a0d5..d20495cfa6c 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -31,14 +31,14 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(HandleAttemptCollide); - SubscribeLocalEvent(HandleStepTrigger); + SubscribeLocalEvent(HandleStepTrigger); SubscribeLocalEvent(OnNoSlipAttempt); SubscribeLocalEvent(OnThrownSlipAttempt); // as long as slip-resistant mice are never added, this should be fine (otherwise a mouse-hat will transfer it's power to the wearer). SubscribeLocalEvent>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args)); } - private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredOffEvent args) + private void HandleStepTrigger(EntityUid uid, SlipperyComponent component, ref StepTriggeredEvent args) { TrySlip(uid, component, args.Tripper); } diff --git a/Content.Shared/Spawning/EntitySystemExtensions.cs b/Content.Shared/Spawning/EntitySystemExtensions.cs index 14b171baeb1..507a0f4aa27 100644 --- a/Content.Shared/Spawning/EntitySystemExtensions.cs +++ b/Content.Shared/Spawning/EntitySystemExtensions.cs @@ -16,7 +16,7 @@ public static class EntitySystemExtensions SharedPhysicsSystem? physicsManager = null) { physicsManager ??= entityManager.System(); - var mapCoordinates = coordinates.ToMap(entityManager); + var mapCoordinates = coordinates.ToMap(entityManager, entityManager.System()); return entityManager.SpawnIfUnobstructed(prototypeName, mapCoordinates, collisionLayer, box, physicsManager); } diff --git a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs index b8483d021a4..f4731bf46ab 100644 --- a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs +++ b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs @@ -49,14 +49,8 @@ public sealed partial class StepTriggerComponent : Component /// If this is true, steptrigger will still occur on entities that are in air / weightless. They do not /// by default. /// - [DataField, AutoNetworkedField] + [DataField] public bool IgnoreWeightless; - - /// - /// Does this have separate "StepOn" and "StepOff" triggers. - /// - [DataField, AutoNetworkedField] - public bool StepOn = false; } [RegisterComponent] diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index b4ac2cde756..ede39b2aa97 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -11,7 +11,6 @@ public sealed class StepTriggerSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; - [Dependency] private readonly SharedMapSystem _map = default!; public override void Initialize() { @@ -41,9 +40,7 @@ public override void Update(float frameTime) while (enumerator.MoveNext(out var uid, out var active, out var trigger, out var transform)) { if (!Update(uid, trigger, transform, query)) - { continue; - } RemCompDeferred(uid, active); } @@ -59,8 +56,7 @@ private bool Update(EntityUid uid, StepTriggerComponent component, TransformComp if (component.Blacklist != null && TryComp(transform.GridUid, out var grid)) { - var positon = _map.LocalToTile(uid, grid, transform.Coordinates); - var anch = _map.GetAnchoredEntitiesEnumerator(uid, grid, positon); + var anch = grid.GetAnchoredEntitiesEnumerator(grid.LocalToTile(transform.Coordinates)); while (anch.MoveNext(out var ent)) { @@ -113,16 +109,8 @@ private void UpdateColliding(EntityUid uid, StepTriggerComponent component, Tran return; } - if (component.StepOn) - { - var evStep = new StepTriggeredOnEvent(uid, otherUid); - RaiseLocalEvent(uid, ref evStep); - } - else - { - var evStep = new StepTriggeredOffEvent(uid, otherUid); - RaiseLocalEvent(uid, ref evStep); - } + var ev = new StepTriggeredEvent { Source = uid, Tripper = otherUid }; + RaiseLocalEvent(uid, ref ev, true); component.CurrentlySteppedOn.Add(otherUid); Dirty(uid, component); @@ -142,7 +130,7 @@ private bool CanTrigger(EntityUid uid, EntityUid otherUid, StepTriggerComponent var msg = new StepTriggerAttemptEvent { Source = uid, Tripper = otherUid }; - RaiseLocalEvent(uid, ref msg); + RaiseLocalEvent(uid, ref msg, true); return msg.Continue && !msg.Cancelled; } @@ -175,12 +163,6 @@ private void OnEndCollide(EntityUid uid, StepTriggerComponent component, ref End component.CurrentlySteppedOn.Remove(otherUid); Dirty(uid, component); - if (component.StepOn) - { - var evStepOff = new StepTriggeredOffEvent(uid, otherUid); - RaiseLocalEvent(uid, ref evStepOff); - } - if (component.Colliding.Count == 0) { RemCompDeferred(uid); @@ -248,14 +230,9 @@ public struct StepTriggerAttemptEvent public bool Cancelled; } -/// -/// Raised when an entity stands on a steptrigger initially (assuming it has both on and off states). -/// -[ByRefEvent] -public readonly record struct StepTriggeredOnEvent(EntityUid Source, EntityUid Tripper); - -/// -/// Raised when an entity leaves a steptrigger if it has on and off states OR when an entity intersects a steptrigger. -/// [ByRefEvent] -public readonly record struct StepTriggeredOffEvent(EntityUid Source, EntityUid Tripper); +public struct StepTriggeredEvent +{ + public EntityUid Source; + public EntityUid Tripper; +} diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index 2f067afbeeb..25245327ce9 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -98,6 +98,9 @@ public partial class ListingData : IEquatable, ICloneable [DataField("productEvent")] public object? ProductEvent; + [DataField] + public bool RaiseProductEventOnUser; + /// /// used internally for tracking how many times an item was purchased. /// @@ -120,7 +123,7 @@ public bool Equals(ListingData? listing) Description != listing.Description || ProductEntity != listing.ProductEntity || ProductAction != listing.ProductAction || - ProductEvent != listing.ProductEvent || + ProductEvent?.GetType() != listing.ProductEvent?.GetType() || RestockTime != listing.RestockTime) return false; diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index a8f7ee23956..91aad895821 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -261,7 +261,7 @@ private void OnBallisticAmmoCount(EntityUid uid, BallisticAmmoProviderComponent args.Capacity = component.Capacity; } - private void UpdateBallisticAppearance(EntityUid uid, BallisticAmmoProviderComponent component) + public void UpdateBallisticAppearance(EntityUid uid, BallisticAmmoProviderComponent component) { if (!Timing.IsFirstTimePredicted || !TryComp(uid, out var appearance)) return; diff --git a/LEGAL.md b/LEGAL.md index 34cd4009d53..2df3c39add1 100644 --- a/LEGAL.md +++ b/LEGAL.md @@ -6,9 +6,9 @@ The Authors retain all copyright to their respective work submitted here. ## Code license -Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). +Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). -Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](./LICENSE-MIT.txt). +Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 is licensed under the MIT license unless otherwise stated. See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). [87c70a89a67d0521a56388e6b1c3f2cb947943e4](https://github.com/Simple-Station/Einstein-Engines/commit/87c70a89a67d0521a56388e6b1c3f2cb947943e4) was pushed on February 17th 2024 at 21:48 UTC diff --git a/README.md b/README.md index f102318611f..3dbe1910e29 100644 --- a/README.md +++ b/README.md @@ -41,24 +41,27 @@ We provide some scripts shown below to make the job easier. ### Build dependencies > - Git -> - .NET SDK 8.0.100 +> - DOTNET SDK 7.0 or higher +> - python 3.7 or higher ### Windows > 1. Clone this repository -> 2. Run `git submodule update --init --recursive` in a terminal to download the engine -> 3. Run `Scripts/bat/buildAllDebug.bat` after making any changes to the source -> 4. Run `Scripts/bat/runQuickAll.bat` to launch the client and the server -> 5. Connect to localhost in the client and play +> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal +> 3. Run the `Scripts/bat/run1buildDebug.bat` +> 4. Run the `Scripts/bat/run2configDev.bat` if you need other configurations run other config scripts +> 5. Run both the `Scripts/bat/run3server.bat` and `Scripts/bat/run4client.bat` +> 6. Connect to localhost and play ### Linux > 1. Clone this repository -> 2. Run `git submodule update --init --recursive` in a terminal to download the engine -> 3. Run `Scripts/bat/buildAllDebug.sh` after making any changes to the source -> 4. Run `Scripts/bat/runQuickAll.sh` to launch the client and the server -> 5. Connect to localhost in the client and play +> 2. Run `RUN_THIS.py` to init submodules and download the engine, or run `git submodule update --init --recursive` in a terminal +> 3. Run the `Scripts/sh/run1buildDebug.sh` +> 4. Run the `Scripts/sh/run2configDev.sh` if you need other configurations run other config scripts +> 5. Run both the `Scripts/sh/run3server.bat` and `scripts/sh/run4client.sh` +> 6. Connect to localhost and play ### MacOS @@ -67,12 +70,12 @@ We provide some scripts shown below to make the job easier. ## License Content contributed to this repository after commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the GNU Affero General Public License version 3.0 unless otherwise stated. -See [LICENSE-AGPLv3](./LICENSE-AGPLv3.txt). +See [LICENSE-AGPLv3](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-AGPLv3.txt). Content contributed to this repository before commit 87c70a89a67d0521a56388e6b1c3f2cb947943e4 (`17 February 2024 23:00:00 UTC`) is licensed under the MIT license unless otherwise stated. -See [LICENSE-MIT](./LICENSE-MIT.txt). +See [LICENSE-MIT](https://github.com/Simple-Station/Einstein-Engines/blob/master/LICENSE-MIT.txt). Most assets are licensed under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) unless stated otherwise. Assets have their license and the copyright in the metadata file. -[Example](./Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). +[Example](https://github.com/Simple-Station/Einstein-Engines/blob/master/Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). Note that some assets are licensed under the non-commercial [CC-BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) or similar non-commercial licenses and will need to be removed if you wish to use this project commercially. diff --git a/RUN_THIS.py b/RUN_THIS.py new file mode 100755 index 00000000000..6ea9f8e707d --- /dev/null +++ b/RUN_THIS.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +# Import future so people on py2 still get the clear error that they need to upgrade. +from __future__ import print_function +import sys +import subprocess + +version = sys.version_info +if version.major < 3 or (version.major == 3 and version.minor < 5): + print("ERROR: You need at least Python 3.5 to build SS14.") + sys.exit(1) + +subprocess.run([sys.executable, "git_helper.py"], cwd="BuildChecker") diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 6f18510d17b..90445a31d1c 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -226,8 +226,3 @@ copyright: TGStation at 3df5d3b42bfb6b3b5adba1067ab41f83816255bb license: CC-BY-SA-3.0 source: https://github.com/tgstation/tgstation/blob/3df5d3b42bfb6b3b5adba1067ab41f83816255bb/sound/misc/server-ready.ogg - -- files: [beep_landmine.ogg] - copyright: '"beep_landmine.ogg" by kaktuscsc of Discord for SS14' - license: "CC-BY-SA-3.0" - source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f diff --git a/Resources/Audio/Effects/beep_landmine.ogg b/Resources/Audio/Effects/beep_landmine.ogg deleted file mode 100644 index 48bc5e21d962084a1db41c473f30892d914894ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6034 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 Bu4e!M diff --git a/Resources/Audio/Nyanotrasen/heartbeat_fast.ogg b/Resources/Audio/Nyanotrasen/heartbeat_fast.ogg deleted file mode 100644 index 85a034d9bd0017dafea7df4128235c815babac0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39983 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 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7fcb7aac227..1f876cf9a7f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4051,7 +4051,7 @@ Entries: - type: Add message: >- Glass/Crystal shards and floor tiles now deal damage and embed in - victims when colliding with them. + victims when colliding with them. id: 6107 time: '2024-05-11T01:23:00.0000000+00:00' - author: FoxxoTrystan @@ -4166,21 +4166,3 @@ Entries: message: Radiation Collector has now a new sprite! id: 6120 time: '2024-06-11T00:34:02.0000000+00:00' -- author: DEATHB4DEFEAT - changes: - - type: Tweak - message: >- - UI layout now defaults to separated, the old one is still available in - settings - id: 6121 - time: '2024-06-16T22:38:10.0000000+00:00' -- author: DEATHB4DEFEAT - changes: - - type: Tweak - message: Space has suddenly become less dense (objects don't slow down in space) - - type: Remove - message: Moths are unable to move in space - - type: Tweak - message: Moths have way better control in zero gravity environments - id: 6122 - time: '2024-06-17T07:58:34.0000000+00:00' diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 03d5059e95b..8c54ecb084d 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl new file mode 100644 index 00000000000..32fa5415b8c --- /dev/null +++ b/Resources/Locale/en-US/language/commands.ftl @@ -0,0 +1,8 @@ +command-list-langs-desc = List languages your current entity can speak at the current moment. +command-list-langs-help = Usage: {$command} + +command-saylang-desc = Send a message in a specific language. +command-saylang-help = Usage: {$command} . Example: {$command} GalacticCommon "Hello World!" + +command-language-select-desc = Select the currently spoken language of your entity. +command-language-select-help = Usage: {$command} . Example: {$command} GalacticCommon diff --git a/Resources/Locale/en-US/language/language-menu.ftl b/Resources/Locale/en-US/language/language-menu.ftl new file mode 100644 index 00000000000..83687d0f1a6 --- /dev/null +++ b/Resources/Locale/en-US/language/language-menu.ftl @@ -0,0 +1,4 @@ +language-menu-window-title = Language Menu +language-menu-current-language = Current Language: {$language} +language-menu-description-header = Description +ui-options-function-open-language-menu = Open language Menu diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl new file mode 100644 index 00000000000..69c5d0a4a76 --- /dev/null +++ b/Resources/Locale/en-US/language/languages.ftl @@ -0,0 +1,71 @@ +language-Universal-name = Universal +language-Universal-description = What are you? + +language-GalacticCommon-name = Galactic common +language-GalacticCommon-description = The standard Galatic language, most commonly used for inter-species communications and legal work. + +language-Bubblish-name = Bubblish +language-Bubblish-description = The language of Slimes. Being a mixture of bubbling noises and pops it's very difficult to speak for humans without the use of mechanical aids. + +language-RootSpeak-name = Rootspeak +language-RootSpeak-description = The strange whistling-style language spoken by the Diona. + +language-Nekomimetic-name = Nekomimetic +language-Nekomimetic-description = To the casual observer, this language is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible. + +language-Draconic-name = Draconic +language-Draconic-description = The common language of lizard-people, composed of sibilant hisses and rattles. + +language-SolCommon-name = Sol common +language-SolCommon-description = The language common to species from the Sol System. + +language-Canilunzt-name = Canilunzt +language-Canilunzt-description = The guttural language spoken and utilized by the inhabitants of the Vazzend system, composed of growls, barks, yaps, and heavy utilization of ears and tail movements. Vulpkanin speak this language with ease. + +language-Moffic-name = Moffic +language-Moffic-description = The language of the mothpeople borders on complete unintelligibility. + +language-RobotTalk-name = RobotTalk +language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators. + +language-Cat-name = Cat +language-Cat-description = Meow + +language-Dog-name = Dog +language-Dog-description = Bark! + +language-Fox-name = Fox +language-Fox-description = Yeeps! + +language-Xeno-name = Xeno +language-Xeno-description = Sssss! + +language-Monkey-name = Monkey +language-Monkey-description = oooook! + +language-Mouse-name = Mouse +language-Mouse-description = Squeeek! + +language-Chicken-name = Chicken +language-Chicken-description = Coot! + +language-Duck-name = Duck +language-Duck-description = Quack! + +language-Cow-name = Cow +language-Cow-description = Moooo! + +language-Sheep-name = Sheep +language-Sheep-description = Baaah! + +language-Kangaroo-name = Kangaroo +language-Kangaroo-description = Chuu! + +language-Pig-name = Pig +language-Pig-description = Oink! + +language-Crab-name = Crab +language-Crab-description = Click! + +language-Kobold-name = Kobold +language-Kobold-description = Hiss! diff --git a/Resources/Locale/en-US/language/technologies.ftl b/Resources/Locale/en-US/language/technologies.ftl new file mode 100644 index 00000000000..901a48061c5 --- /dev/null +++ b/Resources/Locale/en-US/language/technologies.ftl @@ -0,0 +1,2 @@ +research-technology-basic-translation = Basic Translation +research-technology-advanced-translation = Advanced Translation diff --git a/Resources/Locale/en-US/language/translator.ftl b/Resources/Locale/en-US/language/translator.ftl new file mode 100644 index 00000000000..b2a1e9b2b8c --- /dev/null +++ b/Resources/Locale/en-US/language/translator.ftl @@ -0,0 +1,8 @@ +translator-component-shutoff = The {$translator} shuts off. +translator-component-turnon = The {$translator} turns on. +translator-enabled = It appears to be active. +translator-disabled = It appears to be disabled. +translator-implanter-refuse = The {$implanter} has no effect on {$target}. +translator-implanter-success = The {$implanter} successfully injected {$target}. +translator-implanter-ready = This implanter appears to be ready to use. +translator-implanter-used = This implanter seems empty. diff --git a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl b/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl index 5b368e822f1..91ae21233a3 100644 --- a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl +++ b/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl @@ -3,11 +3,8 @@ cage-resist-third-person = {CAPITALIZE(THE($user))} starts removing {POSS-ADJ($u cage-uncage-verb = Uncage -action-name-widemetapsionic = Wide Metapsionic Pulse -action-description-widemetapsionic = Send a mental pulse through the area to see if there are any psychics nearby. - -action-name-focusedmetapsionic = Focused Metapsionic Pulse -action-description-focusedmetapsionic = Probe an entity at close range to glean metaphorical information about any powers they may have +action-name-metapsionic = Metapsionic Pulse +action-description-metapsionic = Send a mental pulse through the area to see if there are any psychics nearby. metapsionic-pulse-success = You detect psychic presence nearby. metapsionic-pulse-failure = You don't detect any psychic presence nearby. @@ -16,8 +13,8 @@ metapsionic-pulse-power = You detect that {$power} was used nearby. action-name-dispel = Dispel action-description-dispel = Dispel summoned entities such as familiars or forcewalls. -action-name-regenerative-stasis = Regenerative Stasis -action-description-regenerative-stasis = Puts the target into a brief stasis, during which time their wounds rapidly heal. +action-name-mass-sleep = Mass Sleep +action-description-mass-sleep = Put targets in a small area to sleep. accept-psionics-window-title = Psionic! accept-psionics-window-prompt-text-part = You rolled a psionic power! @@ -66,14 +63,11 @@ action-name-noospheric-zap = Noospheric Zap action-description-noospheric-zap = Shocks the conciousness of the target and leaves them stunned and stuttering. action-name-pyrokinesis = Pyrokinesis -action-description-pyrokinesis = Hurl a small gateway to the plane of Gehenna at your target. +action-description-pyrokinesis = Light a flammable target on fire. +pyrokinesis-power-used = A wisp of flame engulfs {THE($target)}, igniting {OBJECT($target)}! action-name-psychokinesis = Psychokinesis action-description-psychokinesis = Bend the fabric of space to instantly move across it. action-name-rf-sensitivity = Toggle RF Sensitivity action-desc-rf-sensitivity = Toggle your ability to interpret radio waves on and off. - -trait-latent-psychic-desc = Your mind and soul are open to the noosphere, allowing for a limited use of Telepathy. - Thus, you are eligible for potentially receiving psychic powers. - It is possible that you may be hunted by otherworldly forces, so consider keeping your powers a secret. diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl b/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl deleted file mode 100644 index 26d2acb87cd..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/psionics/psychic-feedback.ftl +++ /dev/null @@ -1,21 +0,0 @@ -# Feedback messages for Focused Metapsionic Pulse -metapulse-self = I AM. -no-powers = {CAPITALIZE($entity)} will never awaken from the dream in this life -psychic-potential = {CAPITALIZE($entity)} has a slim chance of awakening from the dream -dispel-feedback = {CAPITALIZE($entity)} is a mighty stone, standing against the currents of fate -metapsionic-feedback = {CAPITALIZE($entity)} gazes back upon thee -mind-swap-feedback = {CAPITALIZE($entity)}'s vessel seems fit for other souls -mindswapped-feedback = Cursed flesh! {CAPITALIZE($entity)} dwells within the wrong vessel! -noospheric-zap-feedback = {CAPITALIZE($entity)}'s soul writhes with thunder from beyond the veil -pyrokinesis-feedback = The Secret of Fire dwells within {CAPITALIZE($entity)} -invisibility-feedback = {CAPITALIZE($entity)}'s wyrd seeks to hide from thine gaze -telegnosis-feedback = {CAPITALIZE($entity)}'s soul travels across bridges composed of dreamlight -sophic-grammateus-feedback = SEEKER, YOU NEED ONLY ASK FOR MY WISDOM. -oracle-feedback = WHY DO YOU BOTHER ME SEEKER? HAVE I NOT MADE MY DESIRES CLEAR? -metempsychotic-machine-feedback = The sea of fate flows through this machine -ifrit-feedback = A spirit of Gehenna, bound by the will of a powerful psychic - -# Power PVS Messages -focused-metapsionic-pulse-begin = The air around {CAPITALIZE($entity)} begins to shimmer faintly -psionic-regeneration-self-revive = {CAPITALIZE($entity)} begins to visibly regenerate -mindbreaking-feedback = The light of life vanishes from {CAPITALIZE($entity)}'s eyes, leaving behind a husk pretending at sapience diff --git a/Resources/Locale/en-US/paper/book-authorbooks.ftl b/Resources/Locale/en-US/paper/book-authorbooks.ftl index b1981d9e152..ae886e835af 100644 --- a/Resources/Locale/en-US/paper/book-authorbooks.ftl +++ b/Resources/Locale/en-US/paper/book-authorbooks.ftl @@ -253,3 +253,11 @@ book-text-inspiration = As a freelance writer, Sarah was always in search of ins Without a moment's hesitation, Sarah took out her pen and notebook and began to write. She wrote about the beauty of the scene, the peacefulness she felt, and the surreal quality of the moment. She wanted to capture this feeling and share it with others through her words. As she finished writing, Sarah heard the snap of a twig and looked up to see a man approaching her with a camera. He introduced himself as a nature photographer and asked if she had seen the waterfall. They struck up a conversation, and soon they were both laughing and sharing stories of their adventures. As the sun began to set, the two of them packed up their gear and said their goodbyes. Sarah felt grateful for this unexpected encounter and the inspiration it brought her. She knew that this moment would stay with her forever, and she felt a sense of serenity knowing that there was still so much beauty in the world waiting to be discovered. + +book-text-janitor = [bold][color=black][head=3]The Tales of a Tired Janitor[/head][/bold] + Cleaning a space station as a janitor is like being trapped in a cosmic custodial nightmare. You'd think floating through the vastness of space would be glamorous, but no, I'm stuck scrubbing space grime and extraterrestrial goop off the walls. It's a thankless job in a zero-gravity abyss. + First off, let's talk about the mess. Space dust, alien gunk, and who knows what else accumulates faster than a rocket launch. It's not just about sweeping up the crumbs; it's about battling interstellar filth that seems to have a life of its own. You'd hope for a sleek, futuristic space station, but you get a swirling vortex of space garbage waiting for you around every corner. + And the tools they give us! You'd expect state-of-the-art cleaning gadgets, but nope. They raided a dollar store on Earth before launching us into the cosmos. Mops that barely work in microgravity, spray bottles that run out in one use, and don't even get me started on the space janitor jumpsuit. I feel like a reject from a sci-fi B-movie. + Speaking of jumpsuits, the lack of respect is astronomical. The scientists and astronauts zoom past in their sleek suits, utterly oblivious to the fact that I'm the unsung hero keeping this place from turning into a cosmic trash heap. I bet they don't even know my name. "Hey, Space Janitor!" That's what I get. No appreciation for the elbow grease I put into keeping their precious station spick and span. + And let's remember the hazards. Cleaning up alien slime? Yeah, that's a regular Tuesday for me. One wrong move and I'm dealing with an intergalactic biohazard. It's like playing Russian roulette with space critters that could burst out of some hidden nook and cranny. I signed up to mop floors, not play host to extraterrestrial invaders. + Being a janitor on this so-called Space Station 14 is a cosmic joke. Where did the other 13 stations go? It's not all spacewalks and futuristic gadgets; it's scrubbing toilets and battling alien goo. If anyone thinks space is glamorous, they clearly haven't seen the mess we space janitors deal with every single day. It's time they appreciate the unsung heroes of the space station – the custodians of the cosmos. \ No newline at end of file diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl new file mode 100644 index 00000000000..f2451527b09 --- /dev/null +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargoproduct-categories.ftl @@ -0,0 +1,16 @@ +cargoproduct-category-name-armory = Armory +cargoproduct-category-name-atmospherics = Atmospherics +cargoproduct-category-name-cargo = Cargo +cargoproduct-category-name-circuitboards = Circuitboards +cargoproduct-category-name-emergency = Emergency +cargoproduct-category-name-engineering = Engineering +cargoproduct-category-name-food = Food +cargoproduct-category-name-fun = Fun +cargoproduct-category-name-hydroponics = Hydroponics +cargoproduct-category-name-livestock = Livestock +cargoproduct-category-name-materials = Materials +cargoproduct-category-name-medical = Medical +cargoproduct-category-name-science = Science +cargoproduct-category-name-security = Security +cargoproduct-category-name-service = Service +cargoproduct-category-name-shuttle = Shuttle diff --git a/Resources/Locale/en-US/speech/speech-chatsan.ftl b/Resources/Locale/en-US/speech/speech-chatsan.ftl index 4c8cf5db54c..6ce575e648d 100644 --- a/Resources/Locale/en-US/speech/speech-chatsan.ftl +++ b/Resources/Locale/en-US/speech/speech-chatsan.ftl @@ -114,3 +114,6 @@ chatsan-replacement-41 = what are you doing chatsan-word-42 = ofc chatsan-replacement-42 = of course + +chatsan-word-43 = ig +chatsan-replacement-43 = i guess diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index c097a689dd8..7a3564edf66 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -29,3 +29,6 @@ trait-frontal-lisp-desc = You thpeak with a lithp trait-socialanxiety-name = Social Anxiety trait-socialanxiety-desc = You are anxious when you speak and stutter. + +trait-snoring-name = Snoring +trait-snoring-desc = You will snore while sleeping. diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index f040d58253d..a10f070bd25 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -3,20 +3,20 @@ meta: postmapinit: false tilemap: 0: Space - 31: FloorDark - 36: FloorDarkMono - 39: FloorDarkPavementVertical - 51: FloorGrassJungle - 66: FloorMetalDiamond - 79: FloorReinforced - 93: FloorSteel - 104: FloorSteelMono - 108: FloorTechMaint - 109: FloorTechMaint2 - 122: FloorWood - 124: FloorWoodTile - 125: Lattice - 126: Plating + 29: FloorDark + 34: FloorDarkMono + 37: FloorDarkPavementVertical + 49: FloorGrassJungle + 64: FloorMetalDiamond + 77: FloorReinforced + 89: FloorSteel + 100: FloorSteelMono + 104: FloorTechMaint + 105: FloorTechMaint2 + 118: FloorWood + 119: FloorWoodTile + 120: Lattice + 121: Plating entities: - proto: "" entities: @@ -31,27 +31,27 @@ entities: chunks: 0,0: ind: 0,0 - tiles: XQAAAAABXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAAAXQAAAAADXQAAAAAAXQAAAAABXQAAAAADXQAAAAAAJAAAAAABJwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAJAAAAAAAJAAAAAABJAAAAAAAJAAAAAAAJAAAAAACJAAAAAABJAAAAAAAJAAAAAAAJAAAAAABJAAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAfAAAAAABfAAAAAADfAAAAAACMwAAAAAAMwAAAAAAMwAAAAAAfAAAAAADfAAAAAABfAAAAAABegAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAADfAAAAAABfAAAAAADfAAAAAADegAAAAADegAAAAACegAAAAADfAAAAAAAfAAAAAABfAAAAAAAegAAAAACJAAAAAADJwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAegAAAAABegAAAAACegAAAAABegAAAAAAegAAAAACegAAAAAAegAAAAAAegAAAAABegAAAAADegAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: fgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAJAAAAAAAfgAAAAAAfgAAAAAAJAAAAAABJAAAAAABHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAABJAAAAAACJAAAAAAAJAAAAAAAJAAAAAABJAAAAAABJAAAAAACJAAAAAAAJAAAAAACfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAAAXQAAAAACXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAACXQAAAAABXQAAAAABfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAADXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAACaAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAABbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAAAaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAADXQAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAABaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAADTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAACTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADaAAAAAADfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA + tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAACJAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAADJAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA version: 6 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAJAAAAAABJAAAAAACHwAAAAACHwAAAAADHwAAAAABHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAHwAAAAABHwAAAAACHwAAAAABJAAAAAADJAAAAAADHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAIgAAAAABIgAAAAACHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAHQAAAAABHQAAAAACHQAAAAABIgAAAAADIgAAAAADHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-2: ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -1889,303 +1889,276 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-17.5 parent: 2 -- proto: CargoPalletBuy +- proto: CargoPallet entities: + - uid: 20 + components: + - type: Transform + pos: 7.5,0.5 + parent: 2 - uid: 21 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-9.5 + pos: 8.5,0.5 parent: 2 - uid: 24 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-9.5 + pos: 8.5,-0.5 parent: 2 - uid: 25 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-8.5 + pos: 7.5,-0.5 parent: 2 - uid: 26 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-8.5 + pos: 7.5,-1.5 parent: 2 - uid: 27 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-7.5 + pos: 8.5,-1.5 parent: 2 - uid: 30 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-7.5 + pos: 6.5,0.5 parent: 2 - uid: 32 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 2 + - uid: 34 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-9.5 + pos: 7.5,-7.5 parent: 2 - uid: 35 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-0.5 + rot: -1.5707963267948966 rad + pos: 8.5,-7.5 parent: 2 - uid: 36 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-0.5 + rot: -1.5707963267948966 rad + pos: 6.5,-1.5 parent: 2 - uid: 37 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-7.5 + pos: 8.5,-9.5 parent: 2 - uid: 39 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-2.5 + rot: -1.5707963267948966 rad + pos: 8.5,-8.5 parent: 2 - uid: 41 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-1.5 + rot: -1.5707963267948966 rad + pos: 7.5,-8.5 parent: 2 - uid: 42 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-1.5 + rot: -1.5707963267948966 rad + pos: 6.5,-8.5 parent: 2 - uid: 43 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-2.5 + rot: -1.5707963267948966 rad + pos: 6.5,-9.5 parent: 2 - uid: 44 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-1.5 + rot: -1.5707963267948966 rad + pos: 4.5,-0.5 parent: 2 - - uid: 47 + - uid: 45 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,0.5 + rot: -1.5707963267948966 rad + pos: 4.5,-8.5 parent: 2 - - uid: 49 + - uid: 46 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-0.5 + rot: -1.5707963267948966 rad + pos: 6.5,-6.5 parent: 2 - - uid: 50 + - uid: 47 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-2.5 + rot: -1.5707963267948966 rad + pos: 4.5,-9.5 parent: 2 - - uid: 56 + - uid: 48 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-6.5 + pos: 6.5,-7.5 parent: 2 - - uid: 61 + - uid: 49 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-8.5 + pos: 7.5,-9.5 parent: 2 - - uid: 67 + - uid: 50 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-6.5 + pos: 3.5,-7.5 parent: 2 - - uid: 71 + - uid: 51 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-6.5 + pos: 3.5,-9.5 parent: 2 - - uid: 183 + - uid: 52 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,0.5 + pos: 3.5,-8.5 parent: 2 - - uid: 900 + - uid: 54 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,0.5 + rot: -1.5707963267948966 rad + pos: 4.5,-7.5 parent: 2 -- proto: CargoPalletSell - entities: - - uid: 34 + - uid: 55 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-0.5 + pos: 6.5,-2.5 parent: 2 - - uid: 45 + - uid: 56 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-7.5 + pos: 3.5,-1.5 parent: 2 - - uid: 46 + - uid: 57 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-2.5 + pos: 2.5,-8.5 parent: 2 - - uid: 48 + - uid: 58 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-2.5 + pos: 3.5,-0.5 parent: 2 - - uid: 51 + - uid: 59 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-1.5 + pos: 3.5,0.5 parent: 2 - - uid: 52 + - uid: 60 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-2.5 + pos: 6.5,-0.5 parent: 2 - - uid: 54 + - uid: 61 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-9.5 + pos: 2.5,-9.5 parent: 2 - - uid: 55 + - uid: 66 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-1.5 - parent: 2 - - uid: 57 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-9.5 + pos: 7.5,-2.5 parent: 2 - - uid: 58 + - uid: 67 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,0.5 + pos: 2.5,-2.5 parent: 2 - - uid: 59 + - uid: 68 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-6.5 + pos: 2.5,-1.5 parent: 2 - - uid: 60 + - uid: 69 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-7.5 + rot: -1.5707963267948966 rad + pos: 3.5,-2.5 parent: 2 - - uid: 66 + - uid: 70 components: - type: Transform rot: -1.5707963267948966 rad - pos: 3.5,0.5 + pos: 8.5,-2.5 parent: 2 - - uid: 68 + - uid: 71 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-8.5 + pos: 2.5,-0.5 parent: 2 - - uid: 69 + - uid: 72 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-8.5 + pos: 2.5,0.5 parent: 2 - - uid: 70 + - uid: 73 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-9.5 + rot: -1.5707963267948966 rad + pos: 8.5,-6.5 parent: 2 - - uid: 72 + - uid: 183 components: - type: Transform - rot: 1.5707963267948966 rad + rot: -1.5707963267948966 rad pos: 7.5,-6.5 parent: 2 - - uid: 73 + - uid: 900 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-6.5 + rot: -1.5707963267948966 rad + pos: 3.5,-6.5 parent: 2 - uid: 901 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-0.5 + pos: 2.5,-6.5 parent: 2 - uid: 903 components: - type: Transform rot: -1.5707963267948966 rad - pos: 3.5,-0.5 + pos: 4.5,0.5 parent: 2 - uid: 907 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-7.5 + rot: -1.5707963267948966 rad + pos: 4.5,-6.5 parent: 2 - uid: 908 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-1.5 + pos: 4.5,-2.5 parent: 2 - uid: 909 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-8.5 - parent: 2 - - uid: 960 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-7.5 - parent: 2 - - uid: 961 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,0.5 + pos: 4.5,-1.5 parent: 2 - proto: CarpetBlack entities: diff --git a/Resources/Prototypes/Accents/word_replacements.yml b/Resources/Prototypes/Accents/word_replacements.yml index 147aebb5c5d..92b3d7de9b3 100644 --- a/Resources/Prototypes/Accents/word_replacements.yml +++ b/Resources/Prototypes/Accents/word_replacements.yml @@ -1,4 +1,4 @@ -# Accents that work off of word replacements. +# Accents that work off of word replacements. # this is kind of dumb but localization demands it. # i guess you could just specify the prefix ('mobster') and count and let the system fill it @@ -263,7 +263,7 @@ accent-pirate-replaced-30: accent-pirate-replacement-30 accent-pirate-replaced-31: accent-pirate-replacement-31 accent-pirate-replaced-32: accent-pirate-replacement-32 - + - type: accent id: cowboy wordReplacements: @@ -366,7 +366,7 @@ accent-cowboy-words-97: accent-cowboy-replacement-97 accent-cowboy-words-98: accent-cowboy-replacement-98 accent-cowboy-words-99: accent-cowboy-replacement-99 - + # For the chat sanitization system - type: accent @@ -409,8 +409,9 @@ # chatsan-word-35: chatsan-replacement-35 # chatsan-word-36: chatsan-replacement-36 chatsan-word-37: chatsan-replacement-37 - # chatsan-word-38: chatsan-replacement-38 - # chatsan-word-39: chatsan-replacement-etcetera - # chatsan-word-40: chatsan-replacement-etcetera - # chatsan-word-41: chatsan-replacement-41 - # chatsan-word-42: chatsan-replacement-42 + chatsan-word-38: chatsan-replacement-38 + chatsan-word-39: chatsan-replacement-etcetera + chatsan-word-40: chatsan-replacement-etcetera + chatsan-word-41: chatsan-replacement-41 + chatsan-word-42: chatsan-replacement-42 + chatsan-word-43: chatsan-replacement-43 diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index b91b26e3570..22f16bd9568 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -120,7 +120,7 @@ priority: -20 icon: sprite: Objects/Devices/communication.rsi - state: old-radio + state: radio event: !type:OpenUplinkImplantEvent - type: entity diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml index 399181b4fab..6341042bf89 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml @@ -5,7 +5,7 @@ state: icon product: CrateArmorySMG cost: 9000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateArmoryShotgun cost: 7000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: implanter0 product: CrateTrackingImplants cost: 1000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: training-bomb product: CrateTrainingBombs cost: 3000 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateArmoryLaser cost: 4800 - category: Armory + category: cargoproduct-category-name-armory group: market - type: cargoProduct @@ -55,5 +55,5 @@ state: icon product: CrateArmoryPistols cost: 5200 - category: Armory + category: cargoproduct-category-name-armory group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml index 0aa49383992..c85210adf6a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml @@ -5,7 +5,7 @@ state: grey product: AirCanister cost: 1100 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: blue product: OxygenCanister cost: 1100 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: blue product: LiquidOxygenCanister cost: 2500 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: red product: NitrogenCanister cost: 1100 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: red product: LiquidNitrogenCanister cost: 2500 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: black product: CarbonDioxideCanister cost: 2200 # Until someone fixes it co2 can be used to oneshot people so it's more expensive - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: black product: LiquidCarbonDioxideCanister cost: 4000 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: yellow product: StorageCanister cost: 1010 # No gases in it so it's cheaper - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market #- type: cargoProduct @@ -87,7 +87,7 @@ # state: water_vapor # product: WaterVaporCanister # cost: 2600 -# category: Atmospherics +# category: cargoproduct-category-name-atmospherics # group: market - type: cargoProduct @@ -97,7 +97,7 @@ state: orange product: PlasmaCanister cost: 4000 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market #- type: cargoProduct @@ -109,5 +109,5 @@ # state: green # product: TritiumCanister # cost: 15500 -# category: Atmospherics +# category: cargoproduct-category-name-atmospherics # group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml index 4a80b76a3fa..a6671ff0998 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml @@ -5,7 +5,7 @@ state: seed product: CrateHydroponicsSeedsExotic cost: 1000 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: seed product: CrateHydroponicsSeedsMedicinal cost: 500 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateHydroponicsTools cost: 500 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: seed product: CrateHydroponicsSeeds cost: 550 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -45,5 +45,5 @@ state: jug product: CratePlantBGone cost: 750 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml index 9dac47b6f15..fb3b2da41a8 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml @@ -15,7 +15,7 @@ state: orebox product: OreBox cost: 500 - category: Logistics # DeltaV - Logistics Department replacing Cargo + category: cargoproduct-category-name-cargo group: market - type: cargoProduct @@ -25,5 +25,5 @@ state: icon product: CrateCargoLuxuryHardsuit cost: 15000 - category: Logistics # DeltaV - Logistics Department replacing Cargo + category: cargoproduct-category-name-cargo group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml b/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml index 0af5b5db016..a96780fc3ed 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_circuitboards.yml @@ -5,5 +5,5 @@ state: cpuboard product: CrateCrewMonitoringBoards cost: 2000 - category: Circuitboards + category: cargoproduct-category-name-circuitboards group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml index 2777f859a07..2715e0c3501 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml @@ -5,7 +5,7 @@ state: icon product: CrateEmergencyExplosive cost: 650 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: fire_extinguisher_closed product: CrateEmergencyFire cost: 1500 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateEmergencyInternals cost: 500 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateEmergencyInternalsLarge cost: 2000 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: radiation product: CrateEmergencyRadiation cost: 1000 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: item_wall product: CrateEmergencyInflatablewall cost: 500 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateSlimepersonLifeSupport cost: 300 - category: Emergency + category: cargoproduct-category-name-emergency group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: icon product: CrateGenericBiosuit cost: 800 - category: Emergency + category: cargoproduct-category-name-emergency group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml index b5468fd982c..754e30f133a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml @@ -5,7 +5,7 @@ state: coillv-30 product: CrateEngineeringCableLV cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: coilmv-30 product: CrateEngineeringCableMV cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: coilhv-30 product: CrateEngineeringCableHV cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: coilall-30 product: CrateEngineeringCableBulk cost: 750 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateEngineeringElectricalSupplies cost: 4500 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateEngineeringStationBeaconBundle cost: 500 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateEngineeringJetpack cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: icon product: CrateEngineeringMiniJetpack cost: 750 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: icon product: CrateAirlockKit cost: 1100 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: icon product: CrateEvaKit cost: 5000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: ammo product: CrateRCDAmmo cost: 2500 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateRCD cost: 800 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: base product: CrateParticleDecelerators cost: 15000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -135,5 +135,5 @@ state: sheaterOff product: SpaceHeaterAnchored cost: 300 - category: Engineering + category: cargoproduct-category-name-engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml index ece817b746e..bd00b0c2d4c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml @@ -5,7 +5,7 @@ state: jar product: CrateEngineeringAMEJar cost: 2000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateEngineeringSingularityGenerator cost: 4000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateEngineeringSingularityContainment cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market #- type: cargoProduct @@ -37,7 +37,7 @@ # state: emitter2 # product: CrateEngineeringSingularityEmitter # cost: 3000 -# category: Engineering +# category: cargoproduct-category-name-engineering # group: market - type: cargoProduct @@ -47,7 +47,7 @@ state: ca_on product: CrateEngineeringSingularityCollector cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -57,7 +57,7 @@ state: completed product: CrateEngineeringParticleAccelerator cost: 2000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -67,18 +67,18 @@ state: solar-assembly-part product: CrateEngineeringSolar cost: 500 - category: Engineering + category: cargoproduct-category-name-engineering group: market -#- type: cargoProduct -# id: EngineTeslaGenerator -# icon: -# sprite: Structures/Power/Generation/Tesla/generator.rsi -# state: icon -# product: CrateEngineeringTeslaGenerator -# cost: 4000 -# category: Engineering -# group: market +- type: cargoProduct + id: EngineTeslaGenerator + icon: + sprite: Structures/Power/Generation/Tesla/generator.rsi + state: icon + product: CrateEngineeringTeslaGenerator + cost: 4000 + category: cargoproduct-category-name-engineering + group: market - type: cargoProduct id: EngineTeslaCoil @@ -87,7 +87,7 @@ state: coil product: CrateEngineeringTeslaCoil cost: 1200 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -97,5 +97,5 @@ state: grounding_rod product: CrateEngineeringTeslaGroundingRod cost: 400 - category: Engineering + category: cargoproduct-category-name-engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml index e5069959296..1a6f8380961 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml @@ -5,7 +5,7 @@ state: margherita-slice product: CrateFoodPizza cost: 450 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: margherita product: CrateFoodPizzaLarge cost: 1800 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: nutribrick product: CrateFoodMRE cost: 1000 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: flour-big product: CrateFoodCooking cost: 750 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: tin product: CrateFoodDinnerware cost: 750 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateFoodBarSupply cost: 750 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateFoodSoftdrinks cost: 1200 - category: Food + category: cargoproduct-category-name-food group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: icon product: CrateFoodSoftdrinksLarge cost: 2400 - category: Food + category: cargoproduct-category-name-food group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml index d84fedd543f..c29458a1ee5 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml @@ -5,7 +5,7 @@ state: icon product: CrateFunInstrumentsVariety cost: 2000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: tuba product: CrateFunInstrumentsBrass cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: icon product: CrateFunInstrumentsString cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateFunInstrumentsWoodwind cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: icon product: CrateFunInstrumentsKeyedPercussion cost: 2500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon product: CrateFunInstrumentsSpecial cost: 10000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: box product: CrateFunArtSupplies cost: 500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: birthday product: CrateFunParty cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: display product: CrateFunWaterGuns cost: 750 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: plushie_h product: CrateFunPlushie cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: plushie_lizard product: CrateFunLizardPlushieBulk cost: 500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: d6_6 product: CrateFunBoardGames cost: 1500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: implanter0 product: CrateFunSadTromboneImplants cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: implanter0 product: CrateFunLightImplants cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: icon product: CrateFunBoxing cost: 500 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: crate_icon product: CrateFunPirate cost: 400 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: crate_icon product: CrateFunToyBox cost: 900 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: implanter0 product: CrateFunBikeHornImplants cost: 1000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: fig_box product: CrateFunMysteryFigurines cost: 4000 - category: Fun + category: cargoproduct-category-name-fun group: market - type: cargoProduct @@ -205,15 +205,15 @@ state: icon product: CrateFunDartsSet cost: 900 - category: Fun + category: cargoproduct-category-name-fun group: market -#- type: cargoProduct -# id: FunCrateGambling -# icon: -# sprite: Objects/Economy/cash.rsi -# state: cash_1000000 -# product: CrateCargoGambling -# cost: 10000 -# category: Fun -# group: market +- type: cargoProduct + id: FunCrateGambling + icon: + sprite: Objects/Economy/cash.rsi + state: cash_1000000 + product: CrateCargoGambling + cost: 10000 + category: cargoproduct-category-name-fun + group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml index 6ef0ab4e211..922e2951b6c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_livestock.yml @@ -5,7 +5,7 @@ state: 0 product: CrateNPCBee cost: 7000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: butterfly product: CrateNPCButterflies cost: 4400 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: cat product: CrateNPCCat cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon-1 product: CrateNPCChicken cost: 4000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: crab product: CrateNPCCrab cost: 3000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: icon-0 product: CrateNPCDuck cost: 6000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: corgi product: CrateNPCCorgi cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: puppy product: CrateNPCPuppyCorgi cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: cow product: CrateNPCCow cost: 3200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: goat product: CrateNPCGoat cost: 1200 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: goose product: CrateNPCGoose cost: 2100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateNPCGorilla cost: 1100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: box product: CrateNPCMonkeyCube cost: 2000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: box_kobold product: CrateNPCKoboldCube cost: 2000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: icon-0 product: CrateNPCMouse cost: 4400 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: parrot product: CrateNPCParrot cost: 3000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: penguin product: CrateNPCPenguin cost: 2100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: pig product: CrateNPCPig cost: 1100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: snake product: CrateNPCSnake cost: 3000 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: icon-0 product: CrateNPCHamster cost: 2800 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -205,7 +205,7 @@ state: lizard product: CrateNPCLizard cost: 1100 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -215,7 +215,7 @@ state: kangaroo product: CrateNPCKangaroo cost: 2800 - category: Livestock + category: cargoproduct-category-name-livestock group: market - type: cargoProduct @@ -225,5 +225,5 @@ state: mothroach product: CrateNPCMothroach cost: 5000 - category: Livestock + category: cargoproduct-category-name-livestock group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml index e3b07af13ba..6f945001d93 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml @@ -5,7 +5,7 @@ state: glass_3 product: CrateMaterialGlass cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: steel_3 product: CrateMaterialSteel cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: plastic_3 product: CrateMaterialPlastic cost: 1500 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: brass_3 product: CrateMaterialBrass cost: 2500 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: plasteel_3 product: CrateMaterialPlasteel cost: 3000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: cloth_3 product: CrateMaterialTextiles cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: plasma_3 product: CrateMaterialPlasma cost: 2000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: cardboard_3 product: CrateMaterialCardboard cost: 750 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: paper_3 product: CrateMaterialPaper cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: fueltank product: WeldingFuelTankFull cost: 1500 - category: Materials + category: cargoproduct-category-name-materials group: market - type: cargoProduct @@ -105,5 +105,5 @@ state: watertank product: WaterTankFull cost: 1000 - category: Materials + category: cargoproduct-category-name-materials group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml index 01a7192b35b..1addf523e4b 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml @@ -5,7 +5,7 @@ state: firstaid product: CrateMedicalSupplies cost: 2400 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: beaker product: CrateChemistrySupplies cost: 750 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: vial product: CrateChemistryVials cost: 1000 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: burnkit product: CrateEmergencyBurnKit cost: 700 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: toxinkit product: CrateEmergencyToxinKit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: o2kit product: CrateEmergencyO2Kit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: brutekit product: CrateEmergencyBruteKit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: advkit product: CrateEmergencyAdvancedKit cost: 1200 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: radkit product: CrateEmergencyRadiationKit cost: 600 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: bag_folded product: CrateBodyBags cost: 700 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: icon product: CrateVirologyBiosuit cost: 800 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: implanter0 product: CrateMindShieldImplants cost: 3000 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: icon product: CrateChemistryP cost: 850 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: icon product: CrateChemistryS cost: 750 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -145,5 +145,5 @@ state: icon product: CrateChemistryD cost: 750 - category: Medical + category: cargoproduct-category-name-medical group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml index f370155e075..756a223e74d 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml @@ -5,7 +5,7 @@ state: artifact_container_icon product: CrateArtifactContainer cost: 500 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: ano13 product: RandomArtifactSpawner cost: 2000 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market - type: cargoProduct @@ -25,5 +25,5 @@ state: icon product: CrateScienceBiosuit cost: 800 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml index a616202bdba..2ad7628ddb3 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml @@ -4,8 +4,8 @@ sprite: DeltaV/Clothing/OuterClothing/Armor/platecarrier.rsi # DeltaV - resprite state: icon product: CrateSecurityArmor - cost: 1000 # DeltaV - raise price for buffed armour - category: Security + cost: 800 + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: icon product: CrateSecurityHelmet cost: 550 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: base product: CrateSecurityNonlethal cost: 4000 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateSecurityRiot cost: 5500 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: box_security product: CrateSecuritySupplies cost: 500 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: handcuff product: CrateRestraints cost: 1000 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: icon product: CrateSecurityBiosuit cost: 800 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -75,5 +75,5 @@ state: idle product: DeployableBarrier cost: 1000 - category: Security + category: cargoproduct-category-name-security group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index a2c0af9ce7f..f27adb65a4a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -5,7 +5,7 @@ state: cleaner product: CrateServiceJanitorialSupplies cost: 560 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: normal product: CrateServiceReplacementLights cost: 600 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -25,7 +25,7 @@ state: mousetrap product: CrateMousetrapBoxes cost: 500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -35,7 +35,7 @@ state: icon product: CrateServiceTheatre cost: 1800 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -45,7 +45,7 @@ state: closed product: CrateServiceSmokeables cost: 1500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: closed product: CrateServiceCustomSmokable cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: pen product: CrateServiceBureaucracy cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: default product: CrateServicePersonnel cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: book0 product: CrateServiceBooks cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: book_engineering2 product: CrateServiceGuidebooks cost: 1300 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -105,7 +105,7 @@ state: icon product: CrateServiceSodaDispenser cost: 850 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: icon product: CrateServiceBoozeDispenser cost: 750 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: box product: CrateServiceBox cost: 400 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: icon product: CrateJanitorBiosuit cost: 800 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: icon-hot product: FoodCartHot cost: 2000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: icon-cold product: FoodCartCold cost: 2000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: icon product: PetCarrier cost: 500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: icon product: CrateJanitorExplosive cost: 1000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -185,6 +185,6 @@ state: icon-cart product: JanitorialTrolley cost: 300 - category: Service + category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml b/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml index 96a193881ef..278104caed1 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_shuttle.yml @@ -5,7 +5,7 @@ state: base product: CrateEngineeringThruster cost: 1500 - category: Shuttle + category: cargoproduct-category-name-shuttle group: market - type: cargoProduct @@ -15,7 +15,7 @@ state: base product: CrateEngineeringGyroscope cost: 4000 - category: Shuttle + category: cargoproduct-category-name-shuttle group: market # - type: cargoProduct @@ -25,6 +25,6 @@ # state: avionics-systems # product: CrateEngineeringShuttle # cost: 3000 - # category: Shuttle + # category: cargoproduct-category-name-shuttle # group: market # locked: true # only the QM has permission to order by default diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index d0ae444bf77..3e303c32127 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -13,7 +13,7 @@ state: base product: CrateVendingMachineRestockBoozeFilled cost: 3500 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -24,7 +24,7 @@ state: base product: CrateVendingMachineRestockChefvendFilled cost: 680 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -44,7 +44,7 @@ state: base product: CrateVendingMachineRestockDinnerwareFilled cost: 2000 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -55,7 +55,7 @@ state: base product: CrateVendingMachineRestockCondimentStationFilled cost: 300 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -65,7 +65,7 @@ state: base product: CrateVendingMachineRestockEngineeringFilled cost: 3200 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -75,7 +75,7 @@ state: base product: CrateVendingMachineRestockGamesFilled cost: 750 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -85,7 +85,7 @@ state: base product: CrateVendingMachineRestockHotDrinksFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -95,7 +95,7 @@ state: base product: CrateVendingMachineRestockMedicalFilled cost: 1750 - category: Medical + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -104,8 +104,8 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockChemVendFilled - cost: 6300 #Delta V - was 3820, see rebase PR #53 - category: Medical + cost: 3820 + category: cargoproduct-category-name-medical group: market - type: cargoProduct @@ -115,7 +115,7 @@ state: base product: CrateVendingMachineRestockNutriMaxFilled cost: 2400 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -125,7 +125,7 @@ state: base product: CrateVendingMachineRestockPTechFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -135,7 +135,7 @@ state: base product: CrateVendingMachineRestockRobustSoftdrinksFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -145,7 +145,7 @@ state: base product: CrateVendingMachineRestockSalvageEquipmentFilled cost: 1000 - category: Engineering + category: cargoproduct-category-name-engineering group: market - type: cargoProduct @@ -155,7 +155,7 @@ state: base product: CrateVendingMachineRestockSecTechFilled cost: 2200 - category: Security + category: cargoproduct-category-name-security group: market - type: cargoProduct @@ -165,7 +165,7 @@ state: base product: CrateVendingMachineRestockSeedsFilled cost: 3375 - category: Hydroponics + category: cargoproduct-category-name-hydroponics group: market - type: cargoProduct @@ -175,7 +175,7 @@ state: base product: CrateVendingMachineRestockSmokesFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -185,7 +185,7 @@ state: base product: CrateVendingMachineRestockVendomatFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -195,7 +195,7 @@ state: base product: CrateVendingMachineRestockRoboticsFilled cost: 1600 - category: Epistemics # DeltaV - Epistemics Department replacing Science + category: cargoproduct-category-name-science group: market - type: cargoProduct @@ -205,7 +205,7 @@ state: base product: CrateVendingMachineRestockTankDispenserFilled cost: 1000 - category: Atmospherics + category: cargoproduct-category-name-atmospherics group: market - type: cargoProduct @@ -215,7 +215,7 @@ state: base product: CrateVendingMachineRestockHappyHonkFilled cost: 2100 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -225,7 +225,7 @@ state: base product: CrateVendingMachineRestockGetmoreChocolateCorpFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -235,7 +235,7 @@ state: base product: CrateVendingMachineRestockChangFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -245,7 +245,7 @@ state: base product: CrateVendingMachineRestockDiscountDansFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market - type: cargoProduct @@ -255,5 +255,5 @@ state: base product: CrateVendingMachineRestockDonutFilled cost: 1200 - category: Service + category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index 92e4032b0cb..bb21bc36d47 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -87,6 +87,7 @@ ClothingShoesBootsCowboyBrown: 1 ClothingShoesBootsCowboyBlack: 1 ClothingShoesBootsCowboyWhite: 1 + ClothingMaskNeckGaiterRed: 2 emaggedInventory: ClothingShoesBling: 1 ClothingShoesBootsCowboyFancy: 1 diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 7f64ebbd23c..1e81cdf2dd1 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -428,7 +428,7 @@ name: uplink-reinforcement-radio-name description: uplink-reinforcement-radio-desc productEntity: ReinforcementRadioSyndicate - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: Telecrystal: 16 categories: @@ -444,7 +444,7 @@ name: uplink-reinforcement-radio-name description: uplink-reinforcement-radio-desc productEntity: ReinforcementRadioSyndicateNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: Telecrystal: 16 categories: @@ -476,7 +476,7 @@ name: uplink-reinforcement-radio-monkey-name description: uplink-reinforcement-radio-monkey-desc productEntity: ReinforcementRadioSyndicateMonkey - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: Telecrystal: 8 categories: @@ -492,9 +492,9 @@ name: uplink-reinforcement-radio-monkey-name description: uplink-reinforcement-radio-monkey-desc productEntity: ReinforcementRadioSyndicateMonkeyNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: Objects/Devices/communication.rsi, state: radio } cost: - Telecrystal: 8 + Telecrystal: 6 categories: - UplinkUtility conditions: @@ -724,7 +724,7 @@ id: UplinkUplinkImplanter # uplink uplink real name: uplink-uplink-implanter-name description: uplink-uplink-implanter-desc - icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: old-radio } + icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: radio } productEntity: UplinkImplanter cost: Telecrystal: 2 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml index 92615131f05..e932974a0f4 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/animals.yml @@ -66,6 +66,11 @@ - type: Tag tags: - VimPilot + - type: LanguageSpeaker + speaks: + - Fox + understands: + - Fox - type: entity name: security dog @@ -154,8 +159,6 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -176,3 +179,9 @@ tags: - DoorBumpOpener - VimPilot + - type: LanguageSpeaker + speaks: + - Dog + understands: + - Dog + - GalacticCommon diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml index 4f255cad211..fa51b99325c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/familiars.yml @@ -84,10 +84,7 @@ - type: PotentialPsionic - type: Psionic removable: false - amplification: 4 - psychicFeedback: - - "ifrit-feedback" - - type: PyrokinesisPower + # - type: PyrokinesisPower # Pending psionic rework - type: Grammar attributes: proper: true @@ -98,6 +95,11 @@ factions: - PsionicInterloper - NanoTrasen + - type: LanguageSpeaker + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true @@ -106,7 +108,7 @@ requirements: - !type:DepartmentTimeRequirement department: Epistemics - time: 14400 + time: 14400 # DeltaV - 4 hours - type: entity parent: WelderExperimental diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml index 96950317c1f..c2ae33ec0ba 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/NPCs/nukiemouse.yml @@ -96,8 +96,12 @@ spawned: - id: FoodMeat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse + - GalacticCommon - type: Tag tags: - VimPilot @@ -163,4 +167,4 @@ interactFailureString: petting-failure-nukie-mouse interactSuccessSpawn: EffectHearts interactSuccessSound: - path: /Audio/Animals/mouse_squeak.ogg \ No newline at end of file + path: /Audio/Animals/mouse_squeak.ogg diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml index e2541def035..1f4eb696c65 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/harpy.yml @@ -26,3 +26,4 @@ - type: NpcFactionMember factions: - NanoTrasen + - type: PotentialPsionic diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml index ea2357a5c06..06abe8c45fa 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml @@ -24,6 +24,7 @@ - type: NpcFactionMember factions: - NanoTrasen + - type: PotentialPsionic - type: Respirator damage: types: diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index a4498299c9a..18437e074dd 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -122,12 +122,19 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.5 baseSprintSpeed: 5.0 - - type: Inventory + - type: Inventory speciesId: harpy templateId: digitigrade - type: HarpyVisuals - type: UltraVision - + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon + - type: entity save: false name: Urist McHands @@ -138,7 +145,7 @@ components: - type: HumanoidAppearance species: Harpy - - type: Inventory + - type: Inventory speciesId: harpy - type: Sprite scale: 0.9, 0.9 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index 4a187d51b33..52853d696a2 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -97,6 +97,13 @@ Female: FemaleVulpkanin Unsexed: MaleVulpkanin - type: DogVision + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Canilunzt + understands: + - GalacticCommon + - Canilunzt - type: entity save: false diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 43d6c7c9b70..c845d7cc4a0 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -809,8 +809,8 @@ - type: entity parent: ClothingHeadBase id: ClothingHeadHatMagician - name: magician's top hat. - description: "A magician's top hat." + name: magician's tophat + description: "A magician's tophat." components: - type: Icon sprite: Clothing/Head/Hats/magician.rsi @@ -827,6 +827,7 @@ - type: Item size: Small sprite: Clothing/Head/Hats/magician.rsi + storedRotation: 0 - type: Storage grid: - 0,0,0,0 diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index 1f70211caa8..ad738792a73 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -514,6 +514,16 @@ tags: - WhitelistChameleon +- type: entity + parent: ClothingMaskNeckGaiter + id: ClothingMaskNeckGaiterRed + name: red neck gaiter + components: + - type: Sprite + sprite: Clothing/Mask/neckgaiterred.rsi + - type: Clothing + sprite: Clothing/Mask/neckgaiterred.rsi + - type: entity parent: ClothingMaskClownBase id: ClothingMaskSexyClown diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index aa4a7b50e65..f3610178b9e 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -549,9 +549,9 @@ description: A cozy jacket with the Cybersun logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi + sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi + sprite: Clothing/OuterClothing/WinterCoats/cs_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -560,9 +560,9 @@ description: A cozy jacket with the Einstein Engines logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi + sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi + sprite: Clothing/OuterClothing/WinterCoats/ee_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -571,9 +571,9 @@ description: A cozy jacket with the Hephaestus Industries logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi + sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hephestus_industries.rsi + sprite: Clothing/OuterClothing/WinterCoats/hi_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -582,9 +582,9 @@ description: A cozy jacket with the Hawkmoon Acquisitions logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi + sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_hawkmoon_aquisitions.rsi + sprite: Clothing/OuterClothing/WinterCoats/hm_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -593,9 +593,9 @@ description: A cozy jacket with the Interdyne logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi + sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_interdyne.rsi + sprite: Clothing/OuterClothing/WinterCoats/id_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -604,9 +604,9 @@ description: A cozy jacket with the Bishop Cybernetics logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi + sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi + sprite: Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -615,9 +615,9 @@ description: A cozy jacket with the Discount Dan's logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi + sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi + sprite: Clothing/OuterClothing/WinterCoats/dd_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -626,9 +626,9 @@ description: A cozy jacket with the Five Points Armory logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi + sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi + sprite: Clothing/OuterClothing/WinterCoats/fa_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -637,9 +637,9 @@ description: A cozy jacket with the Gilthari Exports logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi + sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_gilthari_exports.rsi + sprite: Clothing/OuterClothing/WinterCoats/ge_corpo_jacket.rsi - type: entity parent: ClothingOuterWinterCoat @@ -648,6 +648,6 @@ description: A cozy jacket with the Zeng-Hu Pharmaceuticals logo printed on the back. Merchandise rewarded to stations with a safety factor of uhh... seven. components: - type: Sprite - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi + sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi - type: Clothing - sprite: Clothing/OuterClothing/WinterCoats/corpo_jacket_zeng_hu_pharma.rsi + sprite: Clothing/OuterClothing/WinterCoats/zh_corpo_jacket.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml index ee1708caef6..d1f6e083f40 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml @@ -47,6 +47,9 @@ collection: FootstepDuck params: variation: 0.07 + - type: Construction + graph: ClothingShoeSlippersDuck + node: shoes - type: entity parent: ClothingShoesBaseButcherable diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index dec46df0b53..0645e451af2 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -213,6 +213,13 @@ visMask: - PsionicInvisibility - Normal + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk - type: entity id: BaseBorgChassisNT diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 378b3f8a9d8..369544fdc1b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -48,8 +48,11 @@ flavorKind: station-event-random-sentience-flavor-organic - type: Bloodstream bloodMaxVolume: 50 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse - type: MeleeWeapon soundHit: path: /Audio/Effects/bite.ogg @@ -229,8 +232,11 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: ReplacementAccent - accent: chicken + - type: LanguageSpeaker + speaks: + - Chicken + understands: + - Chicken - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -504,8 +510,11 @@ prob: 0.5 - type: Extractable grindableSolutionName: food - - type: ReplacementAccent - accent: mothroach + - type: LanguageSpeaker + speaks: + - Moffic + understands: + - Moffic - type: ZombieAccentOverride accent: zombieMoth - type: Vocal @@ -601,8 +610,11 @@ - type: EggLayer eggSpawn: - id: FoodEgg - - type: ReplacementAccent - accent: duck + - type: LanguageSpeaker + speaks: + - Duck + understands: + - Duck - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -839,8 +851,11 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Voice/Arachnid/arachnid_chitter.ogg - - type: ReplacementAccent - accent: crab + - type: LanguageSpeaker + speaks: + - Crab + understands: + - Crab - type: Bloodstream bloodMaxVolume: 50 bloodReagent: CopperBlood @@ -1076,8 +1091,11 @@ - type: Inventory speciesId: kangaroo templateId: kangaroo - - type: ReplacementAccent - accent: kangaroo + - type: LanguageSpeaker + speaks: + - Kangaroo + understands: + - Kangaroo - type: InventorySlots - type: Strippable - type: Butcherable @@ -1266,7 +1284,12 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: MonkeyAccent + - type: LanguageSpeaker + speaks: + - Monkey + understands: + - Monkey + - Kobold - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-primate - type: AlwaysRevolutionaryConvertible @@ -1300,7 +1323,13 @@ - type: Speech speechSounds: Monkey speechVerb: Monkey - - type: MonkeyAccent + - type: LanguageSpeaker + speaks: + - Monkey + understands: + - Monkey + - Kobold + - GalacticCommon - type: NpcFactionMember factions: - Syndicate @@ -1339,8 +1368,12 @@ - type: NameIdentifier group: Kobold - type: LizardAccent - - type: ReplacementAccent - accent: kobold + - type: LanguageSpeaker + speaks: + - Kobold + understands: + - Kobold + - Monkey - type: Speech speechSounds: Lizard speechVerb: Reptilian @@ -1568,8 +1601,11 @@ spawned: - id: FoodMeatRat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse - type: Tag tags: - Trash @@ -1894,6 +1930,11 @@ path: /Audio/Animals/parrot_raught.ogg - type: Bloodstream bloodMaxVolume: 50 + - type: LanguageSpeaker + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: entity name: penguin @@ -2140,8 +2181,11 @@ - type: MeleeChemicalInjector transferAmount: 0.75 solution: melee - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-tarantula @@ -2472,6 +2516,11 @@ - type: Tag tags: - VimPilot + - type: LanguageSpeaker + speaks: + - Fox + understands: + - Fox - type: entity name: corgi @@ -2518,8 +2567,11 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog + - type: LanguageSpeaker + speaks: + - Dog + understands: + - Dog - type: InteractionPopup interactSuccessString: petting-success-dog interactFailureString: petting-failure-generic @@ -2671,8 +2723,11 @@ spawned: - id: FoodMeat amount: 3 - - type: ReplacementAccent - accent: cat + - type: LanguageSpeaker + speaks: + - Cat + understands: + - Cat - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-cat @@ -2739,6 +2794,12 @@ - type: NpcFactionMember factions: - Syndicate + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno + - GalacticCommon - type: entity name: space cat @@ -3034,8 +3095,11 @@ spawned: - id: FoodMeat amount: 1 - - type: ReplacementAccent - accent: mouse + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - Mouse - type: Tag tags: - VimPilot @@ -3141,8 +3205,11 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Animals/pig_oink.ogg - - type: ReplacementAccent - accent: pig + - type: LanguageSpeaker + speaks: + - Pig + understands: + - Pig - type: SentienceTarget flavorKind: station-event-random-sentience-flavor-organic - type: NpcFactionMember @@ -3228,6 +3295,12 @@ reformTime: 10 popupText: diona-reform-attempt reformPrototype: MobDionaReformed + - type: LanguageSpeaker + speaks: + - RootSpeak + understands: + - GalacticCommon + - RootSpeak - type: entity parent: MobDionaNymph diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml index 39e68b63a78..3bcf8e7a16f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml @@ -15,8 +15,11 @@ - type: Sprite sprite: Mobs/Aliens/Argocyte/argocyte_common.rsi - type: SolutionContainerManager - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: Bloodstream bloodReagent: FerrochromicAcid bloodMaxVolume: 75 #we don't want the map to become pools of blood diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 9981bb8bd92..8ca1b2d2f0e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -36,6 +36,12 @@ - VimPilot - type: StealTarget stealGroup: AnimalIan + - type: LanguageSpeaker + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: entity name: Old Ian @@ -121,6 +127,12 @@ tags: - CannotSuicide - VimPilot + - type: LanguageSpeaker + speaks: + - Cat + understands: + - GalacticCommon + - Cat - type: entity name: Exception @@ -139,6 +151,12 @@ tags: - CannotSuicide - VimPilot + - type: LanguageSpeaker + speaks: + - Cat + understands: + - GalacticCommon + - Cat - type: entity name: Floppa @@ -288,8 +306,12 @@ spawned: - id: FoodMeat amount: 2 - - type: ReplacementAccent - accent: dog + - type: LanguageSpeaker + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: InteractionPopup successChance: 0.5 interactSuccessString: petting-success-dog @@ -387,8 +409,12 @@ spawned: - id: FoodMeat amount: 3 - - type: ReplacementAccent - accent: dog + - type: LanguageSpeaker + speaks: + - Dog + understands: + - GalacticCommon + - Dog - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-dog @@ -546,6 +572,12 @@ - VimPilot - type: StealTarget stealGroup: AnimalRenault + - type: LanguageSpeaker + speaks: + - Fox + understands: + - GalacticCommon + - Fox - type: entity name: Hamlet @@ -593,6 +625,12 @@ - CannotSuicide - Hamster - VimPilot + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - GalacticCommon + - Mouse - type: entity name: Shiva @@ -765,6 +803,12 @@ attributes: proper: true gender: female + - type: LanguageSpeaker + speaks: + - Bubblish + understands: + - GalacticCommon + - Bubblish - type: entity name: Pun Pun @@ -799,6 +843,13 @@ attributes: proper: true gender: male + - type: LanguageSpeaker + speaks: + - Monkey + understands: + - GalacticCommon + - Monkey + - Kobold - type: entity name: Tropico @@ -826,3 +877,9 @@ # - type: AlwaysRevolutionaryConvertible - type: StealTarget stealGroup: AnimalTropico + - type: LanguageSpeaker + speaks: + - Crab + understands: + - GalacticCommon + - Crab diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 89a6f16e525..50fe3b6765e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -119,6 +119,13 @@ attributes: gender: male - type: PotentialPsionic # Nyano + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Mouse + understands: + - GalacticCommon + - Mouse - type: entity id: MobRatKingBuff @@ -289,6 +296,12 @@ - type: Food - type: Item size: Tiny # Delta V - Make them eatable and pickable. + - type: LanguageSpeaker + speaks: + - Mouse + understands: + - GalacticCommon + - Mouse - type: weightedRandomEntity id: RatKingLoot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml index ec1ed3a58f6..1316aefc50b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml @@ -97,6 +97,7 @@ - RevenantTheme - type: Speech speechVerb: Ghost + - type: UniversalLanguageSpeaker - type: Tag tags: - NoPaint diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml index f08fe36544e..9559ae3a0c0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/shadows.yml @@ -36,7 +36,7 @@ speedModifierThresholds: 60: 0.7 80: 0.5 - + - type: entity name: shadow cat parent: BaseShadowMob @@ -50,8 +50,11 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: cat - type: Physics - - type: ReplacementAccent - accent: cat + - type: LanguageSpeaker + speaks: + - Cat + understands: + - Cat - type: InteractionPopup successChance: 0.01 # you cant pet shadow cat... almost interactSuccessString: petting-success-cat @@ -64,4 +67,4 @@ gender: epicene - type: Tag tags: - - VimPilot \ No newline at end of file + - VimPilot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 42b7ff9e211..e3166c15f6e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -107,6 +107,13 @@ - type: TypingIndicator proto: robot - type: ZombieImmune + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk - type: entity parent: MobSiliconBase diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index c64479369a6..901bf149cbc 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -111,8 +111,11 @@ successChance: 0.5 interactSuccessString: petting-success-slimes interactFailureString: petting-failure-generic - - type: ReplacementAccent - accent: slimes + - type: LanguageSpeaker + speaks: + - Bubblish + understands: + - Bubblish - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 0a294805cfd..9ea2d784dbb 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -165,8 +165,11 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepBounce - - type: ReplacementAccent - accent: kangaroo + - type: LanguageSpeaker + speaks: + - Kangaroo + understands: + - Kangaroo - type: InventorySlots - type: Strippable - type: UserInterface @@ -248,8 +251,11 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 4 - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.20 interactSuccessString: petting-success-tarantula @@ -351,8 +357,11 @@ - type: MeleeChemicalInjector solution: melee transferAmount: 6 - - type: ReplacementAccent - accent: xeno + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: InteractionPopup successChance: 0.2 interactSuccessString: petting-success-snake @@ -373,4 +382,4 @@ parent: MobCobraSpace suffix: "Salvage Ruleset" components: - - type: SalvageMobRestrictions \ No newline at end of file + - type: SalvageMobRestrictions diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index d0ac6fc0265..26553a2f1f2 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -125,6 +125,11 @@ chance: -2 - type: Psionic #Nyano - Summary: makes psionic by default. removable: false + - type: LanguageSpeaker + speaks: + - Xeno + understands: + - Xeno - type: entity name: Praetorian @@ -234,6 +239,13 @@ - type: Tag tags: - CannotSuicide + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Xeno + understands: + - GalacticCommon + - Xeno - type: entity name: Ravager diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml index d9dea3c18d9..5ebd43ddf48 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml @@ -11,3 +11,4 @@ damageRecovery: types: Asphyxiation: -0.5 + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. diff --git a/Resources/Prototypes/Entities/Mobs/Player/diona.yml b/Resources/Prototypes/Entities/Mobs/Player/diona.yml index dfd5e9a1be7..28687c68bfc 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/diona.yml @@ -11,6 +11,7 @@ damageRecovery: types: Asphyxiation: -1.0 + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. # Reformed Diona - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml index d1de65df012..fb84ad3650f 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dwarf.yml @@ -3,3 +3,5 @@ name: Urist McHands The Dwarf parent: BaseMobDwarf id: MobDwarf + components: + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/human.yml b/Resources/Prototypes/Entities/Mobs/Player/human.yml index 9a7c2ee65ec..6197c82c021 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/human.yml @@ -3,6 +3,8 @@ name: Urist McHands parent: BaseMobHuman id: MobHuman + components: + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. #Syndie - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Player/moth.yml b/Resources/Prototypes/Entities/Mobs/Player/moth.yml index 72feba958ab..ffdb36d86bd 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/moth.yml @@ -3,3 +3,5 @@ name: Urist McFluff parent: BaseMobMoth id: MobMoth + components: + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 8f3e6c13466..0086be81d9a 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -53,6 +53,7 @@ - type: Tag tags: - BypassInteractionRangeChecks + - type: UniversalLanguageSpeaker # Ghosts should understand any language. - type: entity id: ActionGhostBoo diff --git a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml index ad9b37f63e1..07deef857c3 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/replay_observer.yml @@ -7,3 +7,4 @@ - type: MovementSpeedModifier baseSprintSpeed: 24 baseWalkSpeed: 16 + - type: UniversalLanguageSpeaker diff --git a/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml index b9f265e0bcf..71d74222979 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/reptilian.yml @@ -3,5 +3,7 @@ name: Urisst' Mzhand parent: BaseMobReptilian id: MobReptilian + components: + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. #Weh diff --git a/Resources/Prototypes/Entities/Mobs/Player/slime.yml b/Resources/Prototypes/Entities/Mobs/Player/slime.yml index 4e5974b3084..79669a8fe2a 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/slime.yml @@ -2,3 +2,5 @@ save: false parent: BaseMobSlimePerson id: MobSlimePerson + components: + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index a610e04d6dd..67212d416fe 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -141,7 +141,7 @@ - Pacified - StaminaModifier - PsionicsDisabled #Nyano - Summary: PCs can have psionics disabled. - - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. + - PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers. - type: Reflect enabled: false reflectProb: 0 @@ -218,7 +218,12 @@ - type: MobPrice price: 1500 # Kidnapping a living person and selling them for cred is a good move. deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - - type: CanEscapeInventory # Carrying system from nyanotrasen. + - type: CanEscapeInventory # Carrying system from nyanotrasen. + - type: LanguageSpeaker # This is here so all with no LanguageSpeaker at least spawn with the default languages. + speaks: + - GalacticCommon + understands: + - GalacticCommon - type: Tag tags: - CanPilot diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 3d405c4dd91..5cb3de6f168 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -102,6 +102,13 @@ actionPrototype: DionaGibAction allowedStates: - Dead + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RootSpeak + understands: + - GalacticCommon + - RootSpeak - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index fe36754b9b5..7afc5cddd70 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -52,6 +52,13 @@ accent: dwarf - type: Speech speechSounds: Bass + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 900de77712e..7c3f857c001 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -16,6 +16,14 @@ spawned: - id: FoodMeatHuman amount: 5 + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + understands: + - GalacticCommon + - SolCommon - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index df7fad06dd2..39aa0ab8dea 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -23,6 +23,13 @@ accent: zombieMoth - type: Speech speechVerb: Moth + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Moffic + understands: + - GalacticCommon + - Moffic - type: TypingIndicator proto: moth - type: Butcherable @@ -44,7 +51,9 @@ Female: UnisexMoth Unsexed: UnisexMoth - type: MovementSpeedModifier - weightlessAcceleration: 2.5 # Move around more easily in space. + weightlessAcceleration: 1.5 # Move around more easily in space. + weightlessFriction: 1 + weightlessModifier: 1 - type: Flammable damage: types: diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index 09e86b19968..bdea4499ed1 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -59,6 +59,13 @@ types: Heat : 1.5 #per second, scales with temperature & other constants - type: Wagging + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Draconic + understands: + - GalacticCommon + - Draconic - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index 481afd06a3c..a601010ef94 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -74,6 +74,13 @@ types: Asphyxiation: -1.0 maxSaturation: 15 + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Bubblish + understands: + - GalacticCommon + - Bubblish - type: entity parent: MobHumanDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 5e40254e3a8..a271e9d0846 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -14,6 +14,8 @@ - type: HumanoidAppearance species: Vox #- type: VoxAccent # Not yet coded + - type: Inventory + speciesId: vox - type: Speech speechVerb: Vox speechSounds: Vox diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml index f6d57f53a50..a8489866fc7 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml @@ -7,7 +7,7 @@ - type: Sprite sprite: Objects/Devices/communication.rsi layers: - - state: old-radio + - state: radio - type: GhostRole name: ghost-role-information-syndicate-reinforcement-name description: ghost-role-information-syndicate-reinforcement-description diff --git a/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml new file mode 100644 index 00000000000..fc947efe9a3 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/translator_implants.yml @@ -0,0 +1,132 @@ +- type: entity + abstract: true + id: BaseTranslatorImplanter + parent: [ BaseItem ] + name: basic translator implant + description: Translates speech. + components: + - type: Sprite + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 + layers: + - state: implanter1 + map: [ "implantFull" ] + visible: true + - state: implanter0 + map: [ "implantBroken" ] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ImplanterVisuals.Full: + implantFull: + True: {visible: true} + False: {visible: false} + implantBroken: + True: {visible: false} + False: {visible: true} + +- type: entity + id: BasicGalaticCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: basic Galactic Common translator implant + description: An implant giving the ability to understand Galactic Common. + components: + - type: TranslatorImplanter + understood: + - GalacticCommon + +- type: entity + id: AdvancedGalaticCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: advanced Galactic Common translator implant + description: An implant giving the ability to understand and speak Galactic Common. + components: + - type: TranslatorImplanter + spoken: + - GalacticCommon + understood: + - GalacticCommon + +- type: entity + id: BubblishTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Bubblish translator implant + description: An implant giving the ability to understand and speak Bubblish. + components: + - type: TranslatorImplanter + spoken: + - Bubblish + understood: + - Bubblish + +- type: entity + id: NekomimeticTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Nekomimetic translator implant + description: An implant giving the ability to understand and speak Nekomimetic. Nya~! + components: + - type: TranslatorImplanter + spoken: + - Nekomimetic + understood: + - Nekomimetic + +- type: entity + id: DraconicTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Draconic translator implant + description: An implant giving the ability to understand and speak Draconic. + components: + - type: TranslatorImplanter + spoken: + - Draconic + understood: + - Draconic + +- type: entity + id: CanilunztTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Canilunzt translator implant + description: An implant giving the ability to understand and speak Canilunzt. Yeeps! + components: + - type: TranslatorImplanter + spoken: + - Canilunzt + understood: + - Canilunzt + +- type: entity + id: SolCommonTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: SolCommon translator implant + description: An implant giving the ability to understand and speak SolCommon. Raaagh! + components: + - type: TranslatorImplanter + spoken: + - SolCommon + understood: + - SolCommon + +- type: entity + id: RootSpeakTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: RootSpeak translator implant + description: An implant giving the ability to understand and speak RootSpeak. + components: + - type: TranslatorImplanter + spoken: + - RootSpeak + understood: + - RootSpeak + +- type: entity + id: MofficTranslatorImplanter + parent: [ BaseTranslatorImplanter ] + name: Moffic translator implant + description: An implant giving the ability to understand and speak Moffic. + components: + - type: TranslatorImplanter + spoken: + - Moffic + understood: + - Moffic diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml new file mode 100644 index 00000000000..e5ad824c5d9 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml @@ -0,0 +1,205 @@ +- type: entity + abstract: true + id: TranslatorUnpowered + parent: [ BaseItem ] + name: translator + description: Translates speech. + components: + - type: Sprite + sprite: Objects/Devices/translator.rsi + state: icon + layers: + - state: icon + - state: translator + shader: unshaded + visible: false + map: [ "enum.ToggleVisuals.Layer", "enum.PowerDeviceVisualLayers.Powered" ] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ToggleVisuals.Toggled: + enum.ToggleVisuals.Layer: + True: { visible: true } + False: { visible: false } + - type: HandheldTranslator + enabled: false + +- type: entity + abstract: true + id: Translator + parent: [ TranslatorUnpowered, PowerCellSlotMediumItem ] + suffix: Powered + components: + - type: PowerCellDraw + drawRate: 1 + +- type: entity + abstract: true + id: TranslatorEmpty + parent: [ Translator ] + suffix: Empty + components: + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + + +- type: entity + id: CanilunztTranslator + parent: [ TranslatorEmpty ] + name: Canilunzt translator + description: Translates speech between Canilunzt and Galactic Common. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Canilunzt + understood: + - GalacticCommon + - Canilunzt + requires: + - GalacticCommon + - Canilunzt + +- type: entity + id: BubblishTranslator + parent: [ TranslatorEmpty ] + name: Bubblish translator + description: Translates speech between Bubblish and Galactic Common. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Bubblish + understood: + - GalacticCommon + - Bubblish + requires: + - GalacticCommon + - Bubblish + +- type: entity + id: NekomimeticTranslator + parent: [ TranslatorEmpty ] + name: Nekomimetic translator + description: Translates speech between Nekomimetic and Galactic Common. Why would you want that? + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Nekomimetic + understood: + - GalacticCommon + - Nekomimetic + requires: + - GalacticCommon + - Nekomimetic + +- type: entity + id: DraconicTranslator + parent: [ TranslatorEmpty ] + name: Draconic translator + description: Translates speech between Draconic and Galactic Common. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Draconic + understood: + - GalacticCommon + - Draconic + requires: + - GalacticCommon + - Draconic + +- type: entity + id: SolCommonTranslator + parent: [ TranslatorEmpty ] + name: Sol Common translator + description: Translates speech between Sol Common and Galactic Common. Like a true Earthman! + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - SolCommon + understood: + - GalacticCommon + - SolCommon + requires: + - GalacticCommon + - SolCommon + +- type: entity + id: RootSpeakTranslator + parent: [ TranslatorEmpty ] + name: RootSpeak translator + description: Translates speech between RootSpeak and Galactic Common. Like a true plant? + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - RootSpeak + understood: + - GalacticCommon + - RootSpeak + requires: + - GalacticCommon + - RootSpeak + +- type: entity + id: MofficTranslator + parent: [ TranslatorEmpty ] + name: Moffic translator + description: Translates speech between Moffic and Galactic Common. Like a true moth... or bug? + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Moffic + understood: + - GalacticCommon + - Moffic + requires: + - GalacticCommon + - Moffic + +- type: entity + id: XenoTranslator + parent: [ TranslatorEmpty ] + name: Xeno translator + description: Translates speech between Xeno and Galactic Common. Not sure if that will help. + components: + - type: HandheldTranslator + spoken: + - GalacticCommon + - Xeno + understood: + - GalacticCommon + - Xeno + requires: + - GalacticCommon + +- type: entity + id: AnimalTranslator + parent: [ TranslatorEmpty ] + name: Animal translator + description: Translates all the cutes noises that animals make into a more understandable form! + components: + - type: HandheldTranslator + understood: + - Cat + - Dog + - Fox + - Monkey + - Mouse + - Chicken + - Duck + - Cow + - Sheep + - Kangaroo + - Pig + - Crab + - Kobold + requires: + - GalacticCommon diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml index 8c3aed0d069..edad2b40631 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml @@ -89,6 +89,7 @@ program: 125 - type: Item size: Small + storedRotation: -90 - type: entity parent: BaseHandheldInstrument @@ -118,6 +119,7 @@ - type: Item size: Small sprite: Objects/Fun/Instruments/gunpet.rsi + storedRotation: -90 - type: Tag tags: - Sidearm @@ -141,6 +143,7 @@ - type: Item sprite: Objects/Fun/Instruments/bike_horn.rsi size: Small + storedRotation: -90 - type: Clothing sprite: Objects/Fun/Instruments/bike_horn.rsi slots: [Belt] diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml index a255ab4a32c..b09ea96f7b4 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml @@ -98,6 +98,8 @@ - type: Tag tags: - KeyedInstrument + - type: Item + size: Small - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml index 3b89d1075be..e99f825d483 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_wind.yml @@ -141,7 +141,7 @@ sprite: Objects/Fun/Instruments/panflute.rsi state: icon - type: Item - size: Normal + size: Small sprite: Objects/Fun/Instruments/panflute.rsi - type: Tag tags: @@ -160,8 +160,9 @@ sprite: Objects/Fun/Instruments/ocarina.rsi state: icon - type: Item - size: Normal + size: Small sprite: Objects/Fun/Instruments/ocarina.rsi + storedRotation: -90 - type: Tag tags: - WoodwindInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 6697aa711e0..67c6e1194b7 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -643,6 +643,9 @@ requiresSpecialDigestion: true useSound: path: /Audio/Items/Toys/mousesqueek.ogg + - type: Tag + tags: + - ToyRubberDuck - type: entity parent: BasePlushie diff --git a/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml b/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml index c3f5170001a..70d984240ea 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/authorbooks.yml @@ -387,3 +387,17 @@ - state: book6 - type: Paper content: book-text-inspiration + +- type: entity + parent: BookBase + id: BookJanitorTale + name: the tales of a tired janitor + description: A clean looking book, smelling vaguely of soap and bleach. + components: + - type: Sprite + sprite: Objects/Misc/books.rsi + layers: + - state: book0 + - type: Paper + content: book-text-janitor + diff --git a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml index a3e3485bc65..9088edc8159 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/land_mine.yml @@ -35,13 +35,9 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - type: LandMine - sound: - path: /Audio/Effects/beep_landmine.ogg - params: - maxDistance: 10 + - type: TriggerOnStepTrigger - type: StepTrigger requiredTriggeredSpeed: 0 - stepOn: true - type: entity name: kick mine @@ -61,6 +57,7 @@ - type: Construction graph: ModularMineGraph node: emptyCase + - type: LandMine - type: entity name: explosive mine @@ -74,3 +71,4 @@ intensitySlope: 3 totalIntensity: 120 # about a ~4 tile radius canCreateVacuum: false + - type: DeleteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index c628d199a90..925e036e09e 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -21,7 +21,6 @@ mask: - MachineMask - type: CargoPallet - palletType: All - type: StaticPrice price: 100 - type: Sprite @@ -54,33 +53,3 @@ - type: GuideHelp guides: - Cargo - -- type: entity - id: CargoPalletSell - name: cargo selling pallet - description: Designates valid items to sell with a selling computer, or to CentCom when a shuttle is recalled. - parent: CargoPallet - components: - - type: CargoPallet - palletType: sell - - type: Sprite - drawdepth: FloorTiles - layers: - - sprite: Structures/cargo_pallets.rsi - state: cargo_pallet_sell - - -- type: entity - id: CargoPalletBuy - name: cargo buying pallet - description: Designates where orders will appear when purchased. - parent: CargoPallet - components: - - type: CargoPallet - palletType: buy - - type: Sprite - drawdepth: FloorTiles - layers: - - sprite: Structures/cargo_pallets.rsi - state: cargo_pallet_buy - diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 2ddb21b9e6c..8d3c83e3e1e 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -230,7 +230,6 @@ - type: StepTrigger intersectRatio: 0.2 requiredTriggeredSpeed: 0 - stepOn: true - type: CollisionWake enabled: false - type: Physics @@ -252,10 +251,6 @@ mask: - ItemMask - type: LandMine - sound: - path: /Audio/Effects/beep_landmine.ogg - params: - maxDistance: 10 - type: ExplodeOnTrigger - type: Explosive explosionType: HardBomb # normally Default and max 5 total 60 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index bd789214f99..9fde67afb44 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -786,7 +786,7 @@ # Syringes - type: entity name: ephedrine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeEphedrine components: - type: SolutionContainerManager @@ -799,7 +799,7 @@ - type: entity name: inaprovaline syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeInaprovaline components: - type: SolutionContainerManager @@ -812,7 +812,7 @@ - type: entity name: tranexamic acid syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeTranexamicAcid components: - type: SolutionContainerManager @@ -825,7 +825,7 @@ - type: entity name: bicaridine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeBicaridine components: - type: SolutionContainerManager @@ -838,7 +838,7 @@ - type: entity name: dermaline syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeDermaline components: - type: SolutionContainerManager @@ -851,7 +851,7 @@ - type: entity name: hyronalin syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeHyronalin components: - type: SolutionContainerManager @@ -864,7 +864,7 @@ - type: entity name: ipecac syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeIpecac components: - type: SolutionContainerManager @@ -877,7 +877,7 @@ - type: entity name: ambuzol syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeAmbuzol components: - type: SolutionContainerManager @@ -890,7 +890,7 @@ - type: entity name: sigynate syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeSigynate components: - type: SolutionContainerManager @@ -903,7 +903,7 @@ - type: entity name: ethylredoxrazine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeEthylredoxrazine components: - type: SolutionContainerManager @@ -916,7 +916,7 @@ - type: entity name: phalanximine syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringePhalanximine components: - type: SolutionContainerManager @@ -929,7 +929,7 @@ - type: entity name: saline syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeSaline components: - type: SolutionContainerManager @@ -943,7 +943,7 @@ #this is where all the syringes are so i didn't know where to put it - type: entity name: romerol syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeRomerol components: - type: SolutionContainerManager @@ -956,7 +956,7 @@ - type: entity name: stimulants syringe - parent: BaseSyringe + parent: PrefilledSyringe id: SyringeStimulants components: - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index ab65940fabc..ae4aaed7d21 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -364,6 +364,13 @@ - Syringe - Trash +- type: entity + parent: BaseSyringe + id: PrefilledSyringe + components: + - type: Injector + toggleState: Inject + - type: entity id: SyringeBluespace parent: BaseSyringe diff --git a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml index 2b5762aaef2..883f66816de 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml @@ -57,10 +57,10 @@ - type: Sprite sprite: Objects/Devices/communication.rsi layers: - - state: old-radio + - state: radio - type: Item sprite: Objects/Devices/communication.rsi - heldPrefix: old-radio + heldPrefix: radio - type: UserInterface interfaces: - key: enum.StoreUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 51f121c64ff..d07a73b022e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -6,6 +6,8 @@ components: - type: AccessReader access: [["Service"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -14,6 +16,8 @@ components: - type: AccessReader access: [["Lawyer"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -22,6 +26,8 @@ components: - type: AccessReader access: [["Theatre"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockScience # DeltaV - Chapel is in Epistemics @@ -30,6 +36,8 @@ components: - type: AccessReader access: [["Chapel"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -38,6 +46,8 @@ components: - type: AccessReader access: [["Janitor"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -46,6 +56,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -54,6 +66,8 @@ components: - type: AccessReader access: [["Bar"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -62,6 +76,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: Airlock @@ -70,6 +86,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockExternal @@ -86,6 +104,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockExternal @@ -94,6 +114,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockExternal @@ -102,6 +124,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockExternal @@ -126,6 +150,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockFreezer @@ -134,6 +160,8 @@ components: - type: AccessReader access: [["Kitchen"], ["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockFreezer @@ -142,6 +170,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockEngineering @@ -150,6 +180,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockAtmospherics @@ -158,6 +190,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockCargo @@ -166,6 +200,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockCargo @@ -174,6 +210,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMining @@ -182,6 +220,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMedical @@ -190,6 +230,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMedical @@ -206,6 +248,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockChemistry @@ -214,6 +258,8 @@ components: - type: AccessReader access: [["Chemistry"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockScience @@ -222,6 +268,8 @@ components: - type: AccessReader access: [["Research"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockScience @@ -230,6 +278,8 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockCentralCommand @@ -258,6 +308,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -266,6 +318,8 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -274,6 +328,8 @@ components: - type: AccessReader access: [["ChiefEngineer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -282,6 +338,8 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -290,6 +348,8 @@ components: - type: AccessReader access: [["ResearchDirector"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -298,6 +358,8 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommand @@ -306,6 +368,8 @@ components: - type: AccessReader access: [["Quartermaster"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockSecurity @@ -365,6 +429,8 @@ components: - type: AccessReader access: [["Security", "Command"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockCommand @@ -373,6 +439,8 @@ components: - type: AccessReader access: [["External"]] + - type: Wires + layoutId: AirlockCommand # Glass Airlocks - type: entity @@ -382,6 +450,8 @@ components: - type: AccessReader access: [["Service"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -390,6 +460,8 @@ components: - type: AccessReader access: [["Lawyer"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -398,6 +470,8 @@ components: - type: AccessReader access: [["Theatre"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -406,6 +480,8 @@ components: - type: AccessReader access: [["Bar"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockExternalGlass @@ -422,6 +498,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockExternalGlass @@ -446,6 +524,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockExternalGlass @@ -454,6 +534,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockGlass @@ -462,6 +544,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -470,6 +554,8 @@ components: - type: AccessReader access: [["Janitor"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockGlass @@ -478,6 +564,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockScienceGlass # DeltaV - Chapel is in Epistemics @@ -486,6 +574,8 @@ components: - type: AccessReader access: [["Chapel"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockEngineeringGlass @@ -494,6 +584,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockAtmosphericsGlass @@ -502,6 +594,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockCargoGlass @@ -510,6 +604,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockCargoGlass @@ -518,6 +614,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMiningGlass @@ -526,6 +624,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockChemistryGlass @@ -534,6 +634,8 @@ components: - type: AccessReader access: [["Chemistry"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMedicalGlass @@ -542,6 +644,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMedicalGlass @@ -558,6 +662,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockScienceGlass @@ -566,6 +672,8 @@ components: - type: AccessReader access: [["Research"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockScienceGlass @@ -574,6 +682,8 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockCentralCommandGlass @@ -592,6 +702,8 @@ components: - type: AccessReader access: [["Command"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -600,6 +712,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -608,6 +722,8 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -616,6 +732,8 @@ components: - type: AccessReader access: [["ChiefEngineer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -624,6 +742,8 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -632,6 +752,8 @@ components: - type: AccessReader access: [["ResearchDirector"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -640,6 +762,8 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockCommandGlass @@ -648,6 +772,8 @@ components: - type: AccessReader access: [["Quartermaster"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -656,6 +782,8 @@ components: - type: AccessReader access: [["Security"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -664,8 +792,9 @@ components: - type: AccessReader access: [["Detective"]] + - type: Wires + layoutId: AirlockCommand -#Delta V: Removed Brig Access #- type: entity # parent: AirlockSecurityGlass # id: AirlockBrigGlassLocked @@ -673,6 +802,8 @@ # components: # - type: AccessReader # access: [["Brig"]] +# - type: Wires +# layoutId: AirlockCommand - type: entity parent: AirlockSecurityGlass @@ -681,6 +812,8 @@ components: - type: AccessReader access: [["Security"], ["Lawyer"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockSecurityGlass @@ -689,6 +822,8 @@ components: - type: AccessReader access: [["Armory"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockCommandGlassLocked @@ -738,6 +873,8 @@ components: - type: AccessReader access: [["Salvage"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMaint @@ -746,6 +883,8 @@ components: - type: AccessReader access: [["Cargo"]] + - type: Wires + layoutId: AirlockCargo - type: entity parent: AirlockMaint @@ -754,6 +893,8 @@ components: - type: AccessReader access: [["Command"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -770,6 +911,8 @@ components: - type: AccessReader access: [["Engineering"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockMaint @@ -778,6 +921,8 @@ components: - type: AccessReader access: [["Atmospherics"]] + - type: Wires + layoutId: AirlockEngineering - type: entity parent: AirlockMaint @@ -786,6 +931,8 @@ components: - type: AccessReader access: [["Bar"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -794,6 +941,8 @@ components: - type: AccessReader access: [["Chapel"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -802,6 +951,8 @@ components: - type: AccessReader access: [["Hydroponics"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -810,6 +961,8 @@ components: - type: AccessReader access: [["Janitor"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -818,6 +971,8 @@ components: - type: AccessReader access: [["Lawyer"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -826,6 +981,8 @@ components: - type: AccessReader access: [["Service"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -834,6 +991,8 @@ components: - type: AccessReader access: [["Theatre"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -842,6 +1001,8 @@ components: - type: AccessReader access: [["Kitchen"]] + - type: Wires + layoutId: AirlockService - type: entity parent: AirlockMaint @@ -858,6 +1019,8 @@ components: - type: AccessReader access: [["Medical"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMaint @@ -866,6 +1029,8 @@ components: - type: AccessReader access: [["Chemistry"]] + - type: Wires + layoutId: AirlockMedical - type: entity parent: AirlockMaint @@ -874,6 +1039,8 @@ components: - type: AccessReader access: [["Research"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockMaint @@ -882,6 +1049,8 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + - type: Wires + layoutId: AirlockScience - type: entity parent: AirlockMaint @@ -890,6 +1059,8 @@ components: - type: AccessReader access: [["Security"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockMaint @@ -898,6 +1069,8 @@ components: - type: AccessReader access: [["Detective"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockMaint @@ -906,6 +1079,8 @@ components: - type: AccessReader access: [["HeadOfPersonnel"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -914,6 +1089,8 @@ components: - type: AccessReader access: [["Captain"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -922,6 +1099,8 @@ components: - type: AccessReader access: [["ChiefEngineer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -930,6 +1109,8 @@ components: - type: AccessReader access: [["ChiefMedicalOfficer"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -938,6 +1119,8 @@ components: - type: AccessReader access: [["HeadOfSecurity"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -946,6 +1129,8 @@ components: - type: AccessReader access: [["ResearchDirector"]] + - type: Wires + layoutId: AirlockCommand - type: entity parent: AirlockMaint @@ -954,6 +1139,8 @@ components: - type: AccessReader access: [["Armory"]] + - type: Wires + layoutId: AirlockSecurity - type: entity parent: AirlockSyndicate diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 5fca0819984..476e715175e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -104,7 +104,6 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false - type: RadiationBlocker resistance: 3 @@ -131,9 +130,6 @@ - board - type: PlacementReplacement key: walls - - type: IconSmooth - key: walls - mode: NoSprite - type: PaintableAirlock group: Standard department: Civilian diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml index 21d485be0c8..9771f633888 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml @@ -57,7 +57,6 @@ denySound: path: /Audio/Machines/airlock_deny.ogg - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false - type: Tag tags: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index dccc76e96c1..e677ef185be 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -93,7 +93,6 @@ - type: Physics canCollide: false - type: Airtight - fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: true - type: RadiationBlocker @@ -158,7 +157,6 @@ sprite: Structures/Doors/edge_door_hazard.rsi snapCardinals: false - type: Airtight - fixVacuum: true airBlocked: false noAirWhenFullyAirBlocked: false airBlockedDirection: diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index 4b6f72de934..3709b739a3e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -40,7 +40,6 @@ path: /Audio/Effects/stonedoor_openclose.ogg - type: Appearance - type: Airtight - fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic @@ -52,9 +51,6 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] - - type: IconSmooth - key: walls - mode: NoSprite - type: Occluder - type: BlockWeather diff --git a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml index 2c54d3cd418..d6c087af0a5 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml @@ -38,7 +38,6 @@ - type: Weldable time: 2 - type: Airtight - fixVacuum: true - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index e38ba1fd667..55010eea512 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -59,7 +59,6 @@ - key: enum.WiresUiKey.Key type: WiresBoundUserInterface - type: Airtight - fixVacuum: true - type: RadiationBlocker resistance: 2 - type: Damageable @@ -73,9 +72,6 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] - - type: IconSmooth - key: walls - mode: NoSprite - type: DoorSignalControl - type: DeviceNetwork deviceNetId: Wireless diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index 56167c178e2..d03765d4fc9 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -130,7 +130,6 @@ - type: Appearance - type: WiresVisuals - type: Airtight - fixVacuum: true noAirWhenFullyAirBlocked: false airBlockedDirection: - South diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml index 518ff2f066e..0b3c291af25 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml @@ -4,7 +4,7 @@ abstract: true description: You sit in this. Either by will or force. placement: - mode: SnapgridCenter + mode: PlaceFree components: - type: Clickable - type: InteractionOutline @@ -65,6 +65,8 @@ id: ChairBase abstract: true parent: UnanchoredChairBase + placement: + mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -87,6 +89,8 @@ id: StoolBase parent: OfficeChairBase abstract: true + placement: + mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -116,7 +120,7 @@ - type: entity name: stool id: Stool - parent: ChairBase + parent: UnanchoredChairBase description: Apply butt. components: - type: Sprite @@ -241,7 +245,7 @@ - type: entity id: ChairMeat - parent: ChairBase + parent: UnanchoredChairBase name: meat chair description: Uncomfortably sweaty. components: @@ -285,7 +289,7 @@ name: web chair id: ChairWeb description: For true web developers. - parent: ChairBase + parent: UnanchoredChairBase components: - type: Sprite sprite: Structures/Web/chair.rsi @@ -349,8 +353,6 @@ parent: ChairFolding id: ChairFoldingSpawnFolded suffix: folded - placement: - mode: PlaceFree components: - type: Foldable folded: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 011f2a3b649..7300c0b9ec3 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -341,6 +341,24 @@ - FauxTileAstroSnow - OreBagOfHolding - DeviceQuantumSpinInverter + - CanilunztTranslator + - BubblishTranslator + - NekomimeticTranslator + - DraconicTranslator + - SolCommonTranslator + - RootSpeakTranslator + - XenoTranslator + - BasicGalaticCommonTranslatorImplanter + - AdvancedGalaticCommonTranslatorImplanter + - BubblishTranslatorImplanter + - NekomimeticTranslatorImplanter + - DraconicTranslatorImplanter + - CanilunztTranslatorImplanter + - SolCommonTranslatorImplanter + - RootSpeakTranslatorImplanter + - AnimalTranslator + - MofficTranslatorImplanter + - MofficTranslator - type: EmagLatheRecipes emagDynamicRecipes: - ExplosivePayload diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 64b6b068c71..6efa5a63711 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -101,6 +101,13 @@ price: 100 - type: Appearance - type: WiresVisuals + - type: LanguageSpeaker + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk - type: entity parent: VendingMachine diff --git a/Resources/Prototypes/Entities/Structures/Windows/window.yml b/Resources/Prototypes/Entities/Structures/Windows/window.yml index fca0b975e98..ee2ad6bc28f 100644 --- a/Resources/Prototypes/Entities/Structures/Windows/window.yml +++ b/Resources/Prototypes/Entities/Structures/Windows/window.yml @@ -69,7 +69,7 @@ acts: [ "Destruction" ] - type: Airtight - type: IconSmooth - key: windows + key: walls base: window - type: InteractionPopup interactSuccessString: comp-window-knock @@ -242,4 +242,4 @@ sprite: Structures/Windows/cracks_diagonal.rsi - type: Construction graph: WindowDiagonal - node: windowDiagonal \ No newline at end of file + node: windowDiagonal diff --git a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml index 8c53daf3b60..bf49eb1be35 100644 --- a/Resources/Prototypes/Entities/Structures/plastic_flaps.yml +++ b/Resources/Prototypes/Entities/Structures/plastic_flaps.yml @@ -83,7 +83,6 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight - fixVacuum: true - type: entity id: PlasticFlapsAirtightOpaque @@ -101,4 +100,3 @@ - !type:DoActsBehavior acts: ["Destruction"] - type: Airtight - fixVacuum: true diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml new file mode 100644 index 00000000000..90bce1baed2 --- /dev/null +++ b/Resources/Prototypes/Language/languages.yml @@ -0,0 +1,493 @@ +# The universal language, assumed if the entity has a UniversalLanguageSpeakerComponent. +# Do not use otherwise. Try to use the respective component instead of this language. +- type: language + id: Universal + obfuscateSyllables: false + replacement: + - "*incomprehensible*" + +# The common galactic tongue. +- type: language + id: GalacticCommon + obfuscateSyllables: true + replacement: + - Blah + - Blah + - Blah + - dingle-doingle + - dingle + - dangle + - jibber-jabber + - jubber + - bleh + - zippity + - zoop + - wibble + - wobble + - wiggle + - yada + - meh + - neh + - nah + - wah + +# Spoken by slimes. +- type: language + id: Bubblish + obfuscateSyllables: true + replacement: + - blob + - plop + - pop + - bop + - boop + +# Spoken by moths. +- type: language + id: Moffic + obfuscateSyllables: true + replacement: + - år + - i + - går + - sek + - mo + - ff + - ok + - gj + - ø + - gå + - la + - le + - lit + - ygg + - van + - dår + - næ + - møt + - idd + - hvo + - ja + - på + - han + - så + - ån + - det + - att + - nå + - gö + - bra + - int + - tyc + - om + - när + - två + - må + - dag + - sjä + - vii + - vuo + - eil + - tun + - käyt + - teh + - vä + - hei + - huo + - suo + - ää + - ten + - ja + - heu + - stu + - uhr + - kön + - we + - hön + + # Spoken by dionas. +- type: language + id: RootSpeak + obfuscateSyllables: true + replacement: + - hs + - zt + - kr + - st + - sh + +# A mess of broken Japanese, spoken by Felinds and Oni +- type: language + id: Nekomimetic + obfuscateSyllables: true + replacement: + - neko + - nyan + - mimi + - moe + - mofu + - fuwa + - kyaa + - kawaii + - poka + - munya + - puni + - munyu + - ufufu + - icha + - doki + - kyun + - kusu + - nya + - nyaa + - desu + - kis + - ama + - chuu + - baka + - hewo + - boop + - gato + - kit + - sune + - yori + - sou + - baka + - chan + - san + - kun + - mahou + - yatta + - suki + - usagi + - domo + - ori + - uwa + - zaazaa + - shiku + - puru + - ira + - heto + - etto + +# Spoken by the Lizard race. +- type: language + id: Draconic + obfuscateSyllables: true + replacement: + - za + - az + - ze + - ez + - zi + - iz + - zo + - oz + - zu + - uz + - zs + - sz + - ha + - ah + - he + - eh + - hi + - ih + - ho + - oh + - hu + - uh + - hs + - sh + - la + - al + - le + - el + - li + - il + - lo + - ol + - lu + - ul + - ls + - sl + - ka + - ak + - ke + - ek + - ki + - ik + - ko + - ok + - ku + - uk + - ks + - sk + - sa + - as + - se + - es + - si + - is + - so + - os + - su + - us + - ss + - ss + - ra + - ar + - re + - er + - ri + - ir + - ro + - or + - ru + - ur + - rs + - sr + - a + - a + - e + - e + - i + - i + - o + - o + - u + - u + - s + - s + +# Spoken by the Vulpkanin race. +- type: language + id: Canilunzt + obfuscateSyllables: true + replacement: + - rur + - ya + - cen + - rawr + - bar + - kuk + - tek + - qat + - uk + - wu + - vuh + - tah + - tch + - schz + - auch + - ist + - ein + - entch + - zwichs + - tut + - mir + - wo + - bis + - es + - vor + - nic + - gro + - lll + - enem + - zandt + - tzch + - noch + - hel + - ischt + - far + - wa + - baram + - iereng + - tech + - lach + - sam + - mak + - lich + - gen + - or + - ag + - eck + - gec + - stag + - onn + - bin + - ket + - jarl + - vulf + - einech + - cresthz + - azunein + - ghzth + +# The common language of the Sol system. +- type: language + id: SolCommon + obfuscateSyllables: true + replacement: + - tao + - shi + - tzu + - yi + - com + - be + - is + - i + - op + - vi + - ed + - lec + - mo + - cle + - te + - dis + - e + +- type: language + id: RobotTalk + obfuscateSyllables: true + replacement: + - 0 + - 1 + - 01 + - 10 + - 001 + - 100 + - 011 + - 110 + - 101 + - 010 + +# Languages spoken by various critters. +- type: language + id: Cat + obfuscateSyllables: true + replacement: + - murr + - meow + - purr + - mrow + +- type: language + id: Dog + obfuscateSyllables: true + replacement: + - woof + - bark + - ruff + - bork + - raff + - garr + +- type: language + id: Fox + obfuscateSyllables: true + replacement: + - bark + - gecker + - ruff + - raff + - garr + +- type: language + id: Xeno + obfuscateSyllables: true + replacement: + - sss + - sSs + - SSS + +- type: language + id: Monkey + obfuscateSyllables: true + replacement: + - ok + - ook + - oook + - ooook + - oooook + +- type: language + id: Mouse + obfuscateSyllables: true + replacement: + - Squeak + - Piep + - Chuu + - Eeee + - Pip + - Fwiep + - Heep + +- type: language + id: Chicken + obfuscateSyllables: true + replacement: + - Coo + - Coot + - Cooot + +- type: language + id: Duck + obfuscateSyllables: true + replacement: + - Quack + - Quack quack + +- type: language + id: Cow + obfuscateSyllables: true + replacement: + - Moo + - Mooo + +- type: language + id: Sheep + obfuscateSyllables: true + replacement: + - Ba + - Baa + - Baaa + +- type: language + id: Kangaroo + obfuscateSyllables: true + replacement: + - Shreak + - Chuu + +- type: language + id: Pig + obfuscateSyllables: true + replacement: + - Oink + - Oink oink + +- type: language + id: Crab + obfuscateSyllables: true + replacement: + - Click + - Click-clack + - Clack + - Tipi-tap + - Clik-tap + - Cliliick + +- type: language + id: Kobold + obfuscateSyllables: true + replacement: + - Yip + - Grrar. + - Yap + - Bip + - Screet + - Gronk + - Hiss + - Eeee + - Yip diff --git a/Resources/Prototypes/Nyanotrasen/Actions/types.yml b/Resources/Prototypes/Nyanotrasen/Actions/types.yml index 55dd48e5470..e6e4bdc5a75 100644 --- a/Resources/Prototypes/Nyanotrasen/Actions/types.yml +++ b/Resources/Prototypes/Nyanotrasen/Actions/types.yml @@ -36,18 +36,18 @@ event: !type:DispelPowerActionEvent - type: entity - id: ActionRegenerativeStasis - name: action-name-regenerative-stasis - description: action-description-regenerative-stasis + id: ActionMassSleep + name: action-name-mass-sleep + description: action-description-mass-sleep noSpawn: true components: - - type: EntityTargetAction + - type: WorldTargetAction icon: Nyanotrasen/Interface/VerbIcons/mass_sleep.png useDelay: 60 checkCanAccess: false range: 8 itemIconStyle: BigAction - event: !type:RegenerativeStasisPowerActionEvent + event: !type:MassSleepPowerActionEvent - type: entity id: ActionMindSwap @@ -94,7 +94,7 @@ description: action-description-pyrokinesis noSpawn: true components: - - type: WorldTargetAction + - type: EntityTargetAction icon: Nyanotrasen/Interface/VerbIcons/pyrokinesis.png useDelay: 50 range: 6 @@ -103,29 +103,15 @@ event: !type:PyrokinesisPowerActionEvent - type: entity - id: ActionWideMetapsionic - name: action-name-widemetapsionic - description: action-description-widemetapsionic + id: ActionMetapsionic + name: action-name-metapsionic + description: action-description-metapsionic noSpawn: true components: - type: InstantAction icon: Nyanotrasen/Interface/VerbIcons/metapsionic.png useDelay: 45 - event: !type:WideMetapsionicPowerActionEvent - -- type: entity - id: ActionFocusedMetapsionic - name: action-name-focusedmetapsionic - description: action-description-focusedmetapsionic - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/metapsionic.png - useDelay: 45 - range: 3 - checkCanAccess: false - itemIconStyle: BigAction - event: !type:FocusedMetapsionicPowerActionEvent + event: !type:MetapsionicPowerActionEvent - type: entity id: ActionPsionicRegeneration diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml index 28340ead40a..59e3690b6bc 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/books.yml @@ -45,6 +45,7 @@ - BookMap - BookJourney - BookInspiration + - BookJanitorTale # Guidebook Books - BookSpaceEncyclopedia - BookTheBookOfControl diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml index a75f31cf0f7..181bacca45e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/boxes.yml @@ -36,6 +36,7 @@ - BoxCandle - BoxCandleSmall - BoxDarts + - BoxCartridgeBB chance: 0.7 rarePrototypes: - BoxHugHealing @@ -49,6 +50,7 @@ - PresentRandom - BoxHolyWater - MysteryFigureBox + - BoxCleanerGrenades rareChance: 0.05 @@ -100,6 +102,8 @@ - BoxMagazineCaselessRifleRubber - BoxMagazineUniversalMagnumPractice - BoxMagazineUniversalMagnumRubber + - MagazineBoxSpecialRubber + - MagazineBoxSpecialPractice chance: 0.15 rarePrototypes: - BoxMagazinePistolCaselessRifle @@ -121,4 +125,8 @@ - BoxShellSoulbreaker - BoxMagazineUniversalMagnum - BoxSpeedLoaderLightRifle + - MagazineBoxSpecial + - MagazineBoxSpecialIncendiary + - MagazineBoxSpecialUranium + - MagazineBoxSpecialMindbreaker rareChance: 0.015 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml index c8efdbdc8cf..abd4d86a1ef 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/devices.yml @@ -1,7 +1,7 @@ - type: entity parent: MarkerBase id: RandomBoards - name: random machine board spawner + name: random device & board spawner components: - type: Sprite layers: @@ -71,6 +71,16 @@ - HotplateMachineCircuitboard - ElectricGrillMachineCircuitboard - FatExtractorMachineCircuitboard + - SpaceHeaterMachineCircuitBoard + - StationMapCircuitboard + - Igniter + - IntercomElectronics + - DoorRemoteFirefight + - RadiationCollectorFlatpack + - ContainmentFieldGeneratorFlatpack + - SolarAssemblyFlatpack + - StationBeaconPart + - HandheldStationMap chance: 0.8 rarePrototypes: - TraversalDistorterMachineCircuitboard @@ -107,4 +117,26 @@ - ShockCollar - GlimmerMonitorCartridge - PotatoAIChip + - CargoTelepadMachineCircuitboard + - FlatpackerMachineCircuitboard + - OreProcessorIndustrialMachineCircuitboard + - TurboItemRechargerCircuitboard + - PowerCageRechargerCircuitboard + - HellfireHeaterMachineCircuitBoard + - HellfireFreezerMachineCircuitBoard + - BiofabricatorMachineCircuitboard + - SalvageExpeditionsComputerCircuitboard + - RadarConsoleCircuitboard + - RipleyCentralElectronics + - RipleyPeripheralsElectronics + - HamtrCentralElectronics + - HamtrPeripheralsElectronics + - HonkerCentralElectronics + - HonkerPeripheralsElectronics + - HonkerTargetingElectronics + - RemoteSignallerAdvanced + - SignalTimerElectronics + - LogProbeCartridge + - HoloprojectorField + - DeviceQuantumSpinInverter rareChance: 0.25 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml index b9def15132e..f0dd4709034 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/hats.yml @@ -42,6 +42,18 @@ - ClothingHeadCage - ClothingHeadHelmetKendoMen - ClothingHeadBandMerc + - ClothingHeadHatCowboyWhite + - ClothingHeadHatCowboyGrey + - ClothingHeadHatCowboyBrown + - ClothingHeadHatBrownFlatcap + - ClothingHeadHatGreyFlatcap + - ClothingHeadHatPartyRed + - ClothingHeadHatPartyYellow + - ClothingHeadHatPartyGreen + - ClothingHeadHatPartyBlue + - ClothingHeadHatWatermelon + - WaterDropletHat + - ClothingHeadHatRedRacoon rareChance: 0.03 prototypes: - ClothingHeadHatAnimalCat @@ -98,5 +110,13 @@ - ClothingHeadHatFlatBrown - ClothingHeadTinfoil - ClothingHeadHatStrawHat + - ClothingHeadHatCowboyBountyHunter + - ClothingHeadHatCowboyRed + - ClothingHeadHatCowboyBlack + - ClothingHeadHatGladiator + - ClothingHeadHatMagician + - ClothingHeadHatHetmanHat + - ClothingHeadHatTacticalMaidHeadband + - ClothingHeadHatPirateTricord chance: 0.5 offset: 0.2 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml index 7785e5aaa82..61a99faa2f1 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/machineparts.yml @@ -36,5 +36,5 @@ - MatterBinStockPart - CrateMaterialSteel - CrateMaterialGlass - chance: 0.45 + chance: 0.50 offset: 0.0 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml index 9f183dcefbd..0c3370890c8 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/seeds.yml @@ -48,6 +48,7 @@ - PeaSeeds - PumpkinSeeds - CottonSeeds + - LilySeeds chance: 0.95 offset: 0.0 rarePrototypes: @@ -64,4 +65,6 @@ - LemoonSeeds - SteelcapSeeds - KoibeanSeeds + - SpacemansTrumpetSeeds + - LaughinPeaSeeds rareChance: 0.05 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml index 1166d8a29f5..562b9c564ec 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml @@ -32,3 +32,4 @@ - type: NpcFactionMember factions: - NanoTrasen + - type: PotentialPsionic diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml index 94ac8403adc..db7936cc5b4 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml @@ -49,3 +49,5 @@ - type: NpcFactionMember factions: - NanoTrasen + - type: PotentialPsionic + diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml index e11f1c4165f..8a0e750abd6 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml @@ -35,6 +35,13 @@ - MobLayer - type: Stamina critThreshold: 115 + - type: LanguageSpeaker + speaks: + - GalacticCommon + - Nekomimetic + understands: + - GalacticCommon + - Nekomimetic - type: entity save: false diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index d9b25c5dd1b..2184926b95a 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -64,6 +64,15 @@ Unsexed: MaleFelinid - type: Felinid - type: NoShoesSilentFootsteps + - type: LanguageSpeaker + speaks: + - GalacticCommon + - SolCommon + - Nekomimetic + understands: + - GalacticCommon + - SolCommon + - Nekomimetic - type: entity save: false diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml index d773cf87c76..d8e791af1ed 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Machines/metempsychoticMachine.yml @@ -22,7 +22,4 @@ NoMind: { state: pod_1 } Gore: { state: pod_1 } Idle: { state: pod_0 } - - type: PotentialPsionic - type: Psionic - psychicFeedback: - - "metempsychotic-machine-feedback" diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml index 58189e49cec..f7481abf1ed 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml @@ -16,10 +16,7 @@ - type: Oracle - type: Speech speechSounds: Tenor - - type: PotentialPsionic - type: Psionic - psychicFeedback: - - "oracle-feedback" - type: SolutionContainerManager solutions: fountain: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml index 8e34a07ea5e..ae85cd25e03 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/sophicscribe.yml @@ -29,8 +29,6 @@ - Science - type: PotentialPsionic #this makes her easier to access for glimmer events, dw about it - type: Psionic - psychicFeedback: - - "sophic-grammateus-feedback" - type: Grammar attributes: gender: female diff --git a/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml b/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml index e6e497003d5..53910a54a92 100644 --- a/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml +++ b/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml @@ -9,6 +9,29 @@ stealGroup: AntiPsychicKnife owner: job-name-mantis +- type: entity + id: BecomePsionicObjective + parent: BaseTraitorObjective + name: Become psionic + description: We need you to acquire psionics and keep them until your mission is complete. + noSpawn: true + components: + - type: NotJobsRequirement + jobs: + - Mime + - ForensicMantis + - type: Objective + difficulty: 2.5 + #unique: false + icon: + sprite: Nyanotrasen/Icons/psi.rsi + state: psi + - type: ObjectiveBlacklistRequirement + blacklist: + components: + - BecomeGolemCondition + - type: BecomePsionicCondition + #- type: entity # id: BecomeGolemObjective # parent: BaseTraitorObjective diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index 15b2cdd4fa7..c3e682e02a9 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -7,24 +7,22 @@ - !type:OverallPlaytimeRequirement time: 18000 - !type:DepartmentTimeRequirement - department: Epistemics + department: Epistemics # DeltaV - Epistemics Department replacing Science time: 3600 startingGear: ForensicMantisGear icon: "JobIconForensicMantis" supervisors: job-supervisors-rd - antagAdvantage: 5 - canBeAntag: true + antagAdvantage: 5 # DeltaV - From 4 to 5 + canBeAntag: true # DeltaV - Mantis is no longer a Detective + # whitelistRequired: true access: - Research - Maintenance - - Mantis + - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml special: - !type:AddComponentSpecial components: - - type: PotentialPsionic - type: Psionic - amplification: 0.3 - dampening: 0.3 - type: MetapsionicPower - type: startingGear @@ -36,10 +34,11 @@ head: ClothingHeadHatFezMantis id: ForensicMantisPDA eyes: ClothingEyesGlassesSunglasses - ears: ClothingHeadsetScience + ears: ClothingHeadsetScience # DeltaV - Mantis is part of Epistemics gloves: ClothingHandsGlovesColorWhite outerClothing: ClothingOuterCoatMantis belt: ClothingBeltMantis + # pocket2: ForensicScanner # DeltaV - Mantis is no longer a Detective innerClothingSkirt: ClothingUniformSkirtMantis satchel: ClothingBackpackSatchelMantisFilled duffelbag: ClothingBackpackDuffelMantisFilled diff --git a/Resources/Prototypes/Nyanotrasen/Traits/psionics.yml b/Resources/Prototypes/Nyanotrasen/Traits/psionics.yml deleted file mode 100644 index 5fef3427703..00000000000 --- a/Resources/Prototypes/Nyanotrasen/Traits/psionics.yml +++ /dev/null @@ -1,6 +0,0 @@ -- type: trait - id: LatentPsychic - name: Latent Psychic - description: trait-latent-psychic-desc - components: - - type: PotentialPsionic diff --git a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml index ca1764e204c..f40b688fd18 100644 --- a/Resources/Prototypes/Nyanotrasen/psionicPowers.yml +++ b/Resources/Prototypes/Nyanotrasen/psionicPowers.yml @@ -5,8 +5,6 @@ DispelPower: 1 TelegnosisPower: 1 PsionicRegenerationPower: 1 - RegenerativeStasisPower: 0.3 - PsionicInvisibilityPower: 0.15 + MassSleepPower: 0.3 +# PsionicInvisibilityPower: 0.15 MindSwapPower: 0.15 - NoosphericZapPower: 0.15 - PyrokinesisPower: 0.15 diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index d711e9a1b13..fba2c4cc172 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -39,6 +39,7 @@ EscapeShuttleObjective: 1 # DieObjective: 0.05 # DeltaV - Disable the lrp objective aka murderbone justification #HijackShuttleObjective: 0.02 + BecomePsionicObjective: 1 # Nyanotrasen - Become Psionic objective, see Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml #BecomeGolemObjective: 0.5 # Nyanotrasen - Become a golem objective, see Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml - type: weightedRandom diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml new file mode 100644 index 00000000000..e017096fa90 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml @@ -0,0 +1,22 @@ +- type: constructionGraph + id: ClothingShoeSlippersDuck + start: start + graph: + - node: start + edges: + - to: shoes + steps: + - tag: ToyRubberDuck + name: a rubber ducky + icon: + sprite: Objects/Fun/ducky.rsi + state: icon + doAfter: 1 + - tag: ToyRubberDuck + name: a rubber ducky + icon: + sprite: Objects/Fun/ducky.rsi + state: icon + doAfter: 1 + - node: shoes + entity: ClothingShoeSlippersDuck diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index 4fe2c474bb4..f1eb270af73 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -85,3 +85,14 @@ description: Two huds joined by arms icon: { sprite: Clothing/Eyes/Hud/medsec.rsi, state: icon } objectType: Item + +- type: construction + name: ducky slippers + id: ClothingShoeSlippersDuck + graph: ClothingShoeSlippersDuck + startNode: start + targetNode: shoes + category: construction-category-clothing + description: Comfy, yet haunted by the ghosts of ducks you fed bread to as a child. + icon: { sprite: Clothing/Shoes/Misc/duck-slippers.rsi, state: icon } + objectType: Item diff --git a/Resources/Prototypes/Recipes/Lathes/language.yml b/Resources/Prototypes/Recipes/Lathes/language.yml new file mode 100644 index 00000000000..6871ed5228d --- /dev/null +++ b/Resources/Prototypes/Recipes/Lathes/language.yml @@ -0,0 +1,190 @@ +- type: latheRecipe + id: CanilunztTranslator + result: CanilunztTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: BubblishTranslator + result: BubblishTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: NekomimeticTranslator + result: NekomimeticTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: DraconicTranslator + result: DraconicTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: SolCommonTranslator + result: SolCommonTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: RootSpeakTranslator + result: RootSpeakTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: MofficTranslator + result: MofficTranslator + completetime: 2 + materials: + Steel: 500 + Glass: 100 + Plastic: 50 + Gold: 50 + +- type: latheRecipe + id: BasicGalaticCommonTranslatorImplanter + result: BasicGalaticCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: XenoTranslator + result: XenoTranslator + completetime: 2 + materials: + Steel: 200 + Plastic: 50 + Gold: 50 + Plasma: 50 + Silver: 50 + +- type: latheRecipe + id: AdvancedGalaticCommonTranslatorImplanter + result: AdvancedGalaticCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: BubblishTranslatorImplanter + result: BubblishTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: NekomimeticTranslatorImplanter + result: NekomimeticTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: DraconicTranslatorImplanter + result: DraconicTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: CanilunztTranslatorImplanter + result: CanilunztTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: SolCommonTranslatorImplanter + result: SolCommonTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: RootSpeakTranslatorImplanter + result: RootSpeakTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: MofficTranslatorImplanter + result: MofficTranslatorImplanter + completetime: 2 + materials: + Steel: 500 + Glass: 500 + Plastic: 100 + Gold: 50 + Silver: 50 + +- type: latheRecipe + id: AnimalTranslator + result: AnimalTranslator + completetime: 2 + materials: + Steel: 200 + Plastic: 50 + Gold: 50 + Plasma: 50 + Silver: 5 diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml index e5afdbd6def..7608369b2ce 100644 --- a/Resources/Prototypes/Recipes/Reactions/drinks.yml +++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml @@ -454,11 +454,11 @@ id: IrishCoffee reactants: Coffee: - amount: 2 + amount: 1 IrishCream: - amount: 2 + amount: 1 products: - IrishCoffee: 4 + IrishCoffee: 2 - type: reaction id: IrishCream diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index 61f95894ee6..acb6a2498d4 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -227,3 +227,43 @@ recipeUnlocks: - BluespaceBeaker - SyringeBluespace + +- type: technology + id: BasicTranslation + name: research-technology-basic-translation + icon: + sprite: Objects/Devices/translator.rsi + state: icon + discipline: CivilianServices + tier: 2 + cost: 10000 + recipeUnlocks: + - CanilunztTranslator + - BubblishTranslator + - NekomimeticTranslator + - DraconicTranslator + - SolCommonTranslator + - RootSpeakTranslator + - BasicGalaticCommonTranslatorImplanter + - MofficTranslator + +- type: technology + id: AdvancedTranslation + name: research-technology-advanced-translation + icon: + sprite: Objects/Devices/translator.rsi + state: icon + discipline: CivilianServices + tier: 3 + cost: 15000 + recipeUnlocks: + - XenoTranslator + - AdvancedGalaticCommonTranslatorImplanter + - BubblishTranslatorImplanter + - NekomimeticTranslatorImplanter + - DraconicTranslatorImplanter + - CanilunztTranslatorImplanter + - SolCommonTranslatorImplanter + - RootSpeakTranslatorImplanter + - AnimalTranslator + - MofficTranslatorImplanter diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index ddb779669eb..19cf1419111 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -3,13 +3,13 @@ name: job-name-rd description: job-description-rd playTimeTracker: JobResearchDirector - antagAdvantage: 6 + antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff requirements: - !type:DepartmentTimeRequirement - department: Epistemics - time: 54000 + department: Epistemics # DeltaV - Epistemics Department replacing Science + time: 54000 # DeltaV - 15 hours - !type:OverallPlaytimeRequirement - time: 72000 + time: 72000 # DeltaV - 20 hours weight: 10 startingGear: ResearchDirectorGear icon: "JobIconResearchDirector" @@ -21,20 +21,20 @@ - Command - Maintenance - ResearchDirector - - Mantis - - Chapel + - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Chapel # DeltaV - Chaplain is in Epistemics - Cryogenics - special: + special: # Nyanotrasen - Mystagogue can use the Bible - !type:AddComponentSpecial components: - - type: BibleUser - - type: PotentialPsionic - - type: Psionic - dampening: 1 #Mystagogue gets a significant buff to his antimage abilities, making him better at dispelling than other people - - type: DispelPower - - type: CommandStaff + - type: BibleUser # Nyano - Lets them heal with bibles + - type: Psionic # Nyano - They start with telepathic chat + - type: DispelPower # Nyano - They get the Dispel psionic power on spawn - !type:AddImplantSpecial implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CommandStaff - type: startingGear id: ResearchDirectorGear @@ -44,7 +44,7 @@ shoes: ClothingShoesColorBrown id: RnDPDA ears: ClothingHeadsetRD - belt: BibleMystagogue + belt: BibleMystagogue # Nyanotrasen - Mystagogue book for their Ifrit innerClothingSkirt: ClothingUniformJumpskirtResearchDirector satchel: ClothingBackpackSatchelResearchDirectorFilled duffelbag: ClothingBackpackDuffelResearchDirectorFilled diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 064b34adbaf..2f1a7f92d26 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -60,3 +60,10 @@ description: trait-frontal-lisp-desc components: - type: FrontalLisp + +- type: trait + id: Snoring + name: trait-snoring-name + description: trait-snoring-desc + components: + - type: Snoring diff --git a/Resources/Prototypes/Wires/layouts.yml b/Resources/Prototypes/Wires/layouts.yml index 338bf188ba0..b30e68545df 100644 --- a/Resources/Prototypes/Wires/layouts.yml +++ b/Resources/Prototypes/Wires/layouts.yml @@ -15,6 +15,26 @@ - type: wireLayout parent: Airlock + id: AirlockService + +- type: wireLayout + parent: Airlock + id: AirlockCargo + +- type: wireLayout + parent: Airlock + id: AirlockEngineering + +- type: wireLayout + parent: Airlock + id: AirlockMedical + +- type: wireLayout + parent: Airlock + id: AirlockScience + +- type: wireLayout + parent: HighSec id: AirlockCommand - type: wireLayout diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 2694cbeaf39..c6a0ab3f8fd 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1190,6 +1190,9 @@ - type: Tag id: Torch +- type: Tag + id: ToyRubberDuck + - type: Tag id: ToySidearm diff --git a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml index a2a04e03ef0..9e8697a9e13 100644 --- a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml +++ b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml @@ -1,18 +1,18 @@ - + # Thermo-electric Engine (TEG) - The TEG generates power by exchanging heat between hot and cold gases. On station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to make a cold side. + The TEG generates power by exchanging heat between hot and cold gases. On the station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to cool down circulated gases. - The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core, the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. + The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core and circulators; the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. ## Generator - The main generator itself is a machine made up of multiple parts: the core generator and two "circulators", in this arrangement: + The main generator itself is a machine made up of 3 major parts: the central generator and two "circulators", in this arrangement: - - - + + + The circulators take in either a hot or cold gas, and pass it through the machine to exchange heat. The gas then gets output on the other end of the circulator. The generator produces the actual power and outputs it over an HV wire. @@ -21,19 +21,172 @@ There is no preference for which side must be hot or cold, there need only be a difference in temperature between them. The gases in the two "loops" are never mixed, only energy is exchanged between them. The hot side will cool down, the cold side will heat up. - ## Burn Chamber + ## The Pipes + + There are 2 major pipenets to worry about here: The Hot Loop (where gas will be burnt for heat), and The Cold Loop (where circulated, heated waste gas will either be removed into space or cooled back down). Make sure that [bold]both pipenets do NOT mix[/bold], as only heat should be transferred between the two through the TEG. + + # The Hot Loop + + As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context, that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. + + As stated above, there are many different layouts one can follow to heat up (or cool down) gases; this part of the guide will cover 2 common methods one will often see for the hot loop when the TEG is setup: The Pipe Burn, and the Burn chamber. + + Side note: Plasma fires burn relatively cool compared to, for example, Tritium fires. It may be viable to extract Tritium from an extraction setup (using a 97/3 ratio of O2/Plasma) and react it with Oxygen to get truly hellish temperatures for power. Although, this is just a recommendation; I'm not ya mum. + + ## The Pipe Burn + + Also known as the naive method, this is generally discouraged when working for efficiency. However, if all you need is a smidge of power to run the station, and you don't feel like setting up the burn chamber, this method will do. + + TODO: Remove this section when atmos pipes are updated to have pressure/temperature limits in a future atmos refactor. + + Most (if not all) pipe burns follow this general layout: + + Gas input -> High-pressure pump -> Pipe segment (with heater) -> Low-pressure pump -> Circulator + + + + + + + + + + + + - The Gas input is pretty self-explanatory; this is where you will input the O2-Plasma mix to be burnt. A 2:1 (67/33) ratio of Oxygen to Plasma is recommended for the hottest burn. + - The High-pressure pump serves 2 purposes; first, it prevents the burn from backwashing into the supply pipe, which would be.. bad, for many reasons. Second, it maintains a positive pressure in the following pipe segment, which is important to allow the burn to continue, especially since hot gases expand. + - The Pipe segment is where the burn actually occurs; to start it off, one can use a heater to increase the temperature up to the ignition temperature of Plasma. Afterwards, the reaction should be self-sustaining, so long as the Pressure and Moles supplied remains high enough. Be warned; if you wish to remove the heater, it will carry some of this superheated gas with it, transferring it to the next pipenet you connect it to. Best to space the gas through a space vent, if you must. + - The Low-pressure pump (whose pressure should be [italics]slightly lower[/italics] than the input pump) prevents [italics]all[/italics] the gas from passing through the circulator, which could result in the loss of the Moles required to sustain a burn. + - The Circulator is where this generated heat will flow to the cold loop; afterwards, feel free to space the waste gases. + + Note: Pressure pumps are used here as, while they pump on pressure (not flow-rate, which is comparatively faster), they are a bit easier to control when it comes to the limited Plasma supply on-station. However, the steps shown can be followed with volumetric pumps too. + + ## The Burn Chamber + + The burn chamber is the preferred method for heating up gases, and it is commonly used for other purposes too. (see: Tritium production) + + Most (if not all) stations have the burn chamber separated from the main atmospherics block by a 1-wide spaced grid, presumably to prevent conduction. The chambers consist of 3(+1) important parts: + - The Air Injector/Passive Vent + - The Space Vent + - The Radiator Loop + + Most normal burn chambers don't come with Heat-Exchangers; instead, they have air scrubbers (and optionally, an air alarm) to help filter for Tritium, which is a highly reactive, hot-burning gas that can also be used to heat the TEG efficiently. + However, this is a slightly more advanced setup than just burning plasma, as it needs 2 burn chambers instead of 1 (one for tritium production, one for burning said tritium), so remove the scrubbers and retrofit the burn chamber with a parallel array of heat-exchangers instead. + + The air injector (or Passive Vent) injects air (or allows air to flow) into the burn chamber. Either should be supplemented with a pump before it, to keep pressures high. + There is a notable difference between the passive vent and the air injector; the air injector can only keep injecting air up to 9MPa, which can be reached very easily with a good burn. Ideally, switch out the air injector for a passive vent connected to a volume pump. + + The space vent (designated as a blast door to space on one side of the burn chamber) allows waste gases to be expelled and destroyed. Open this to keep the pressure under control. + + The radiator loop collects heat from the burnt gases and brings it to the TEG. To maximize efficiency, hook up the heat-exchangers [italics]in parallel to each other[/italics], with a pressure pump at max pressure after the array and a volumetric pump before the array. + The pressure of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. For example, having 2 heat-exchangers would mean you should set the pressure to 100 L/s. + Finally, fill the whole loop with (ideally) a high heat capacity gas, like Frezon or Plasma. (Yes, Frezon =/= Cold. Frezon has one of the highest heat capacities in the game; so long as it isn't reacting with Nitrogen, it can actually be heated and can store heat really well!) + + # The Cold Loop + + As with the Hot Loop, the Cold Loop must also be setup in order to operate the TEG. However, the Cold Loop is usually a lot more low-tech than the Hot Loop; in reality, the Cold Loop only has to be "relatively" cooler -- hey, room temperature is technically cooler than the surface of the sun, right? + + There are 3 main methods you will see used for the Cold Loop: The Water Cooler (see: Liltenhead's video on the TEG), the Coolant Array and the Freezer Loop. + + ## The Water Cooler - As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. + An equally naive method as the Pipe Burn, this simply involves taking some useless gas (in this case, Water Vapour) and flowing it through the TEG and into space. It's dirt-cheap and simple, at the cost of efficiency and permanant loss of gas. - TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. + Setting this up is so simple, even Hamlet could manage it. Just take an output of a gas (here, Water Vapour), send it through the Cold side of the TEG, and then vent it into space. + + + + + + + + + + + TODO: Remove this section when gas miners are removed in a future atmos refactor. ## Coolant Array - A whole bunch of heat-exchanger piping in space. There's not much to say here: gas goes through and cools down. + This is the default method for the Cold Loop you will see on a variety of stations. Being of moderate complexity and having no losses of any resource, this [italics]should[/italics] be the main method of cooling down the TEG. However, every station at the moment somehow has their heat exchangers hooked up wrong, reducing efficiency greatly. (Thanks a bunch, NT!) - ## The Pipes + To use heat-exchangers properly, they must be setup in [italics]parallel[/italics], not in series (like what you see on most stations). A gas pump at max pressure should be placed after, and a volumetric pump before the heat-exchangers. + The flow-rate of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. - TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. + Simply speaking, the Coolant Array consists of 3 major parts: An input connector port, a few pumps and the heat-exchanger array out in space. It can be setup like so: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - Connector Port: Use this to input a gas with high heat capacity; most of the time, Plasma or Frezon is used to do so, as they both have very high specific heat capacities (although most any gas will do). (Yes, Plasma =/= Hot. You can cool it down, and it acts as a really good heat exchange medium.) + - Input/Output Pumps: Used to make sure gas keeps flowing through both the Circulator and the Heat-Exchanger array. As the gas cools down and heats up (and as it flows through the Exchanger), pressure must be applied for it to keep flowing. + - Heat-Exchanger: Basically, just a bunch of heat-exchanger pipes in space. Not much to say, besides the fact that it cools down the gas inside it. Make sure the heat-exchangers are placed on lattice, not plating! Otherwise, the heat-exchange efficiency will be greatly reduced, as the heat-exchangers aren't directly exposed to space below them. + + ## The Freezer Loop + + Most of the time, you will see this method being used in efficient TEG setups. It's basically just the Coolant array, but replacing the Heat-Exchangers with a freezer. Even though the freezer does use power, it is only a small fraction of what the TEG can generate, and it's better than the default Coolant array at the moment, so go fish. + + Just follow the steps for the Coolant array, but use a freezer in place of the Heat-Exchangers. As so: + + + + + + + + + + + + + + + + + + + + Once again, use Plasma or Frezon in the loop for max efficiency (although most any gas will do). diff --git a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml index b7ba3d4c8b4..a377c980e55 100644 --- a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml +++ b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml @@ -14,7 +14,7 @@ A large portion of Xenoarchaeology gameplay revolves around the interpretation o - [color=#a4885c]Edges:[/color] the amount of nodes that are connected to the current node. Using this, you can calculate the total number of nodes as well as organize a map of their connections. -- [color=#a4885c]Unextracted value:[/color] the amount of research points an artifact will give when extracted. Extracting sets this to zero and traversing new nodes increases it. +- [color=#a4885c]Current value:[/color] the amount of research points an artifact is currently worth. Extracting will set this to zero and traversing new nodes will increase it. Reports are a helpful tool in manipulating an artifact, especially in the later stages where you are traversing nodes that have already been activated. diff --git a/Resources/Textures/Clothing/Ears/Headsets/base.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/base.rsi/icon.png index 44e093f26ad03f1554ba2c82804912058ee2d74b..76cf88f02e7da24dc4e0c870d0f97c23a378dec1 100644 GIT binary patch delta 360 zcmV-u0hj)@0)qpPB!3BTNLh0L01m_e01m_fl`9S#0003sNklKP6n_}ZAjqfBaOluhu$-iX zB#0u*5md3W+k0tX%N*+gApVWeiB60pf$iVHOjcE=YC&)ZqW1YzK7&+)>Y8 zJSRCpk`)3lN8k`A36Nb7QIhqj;s9!aQ3s4VVAKHv?f?L_T728mW+AZv0000B!B!#L_t(|ob8l7io-AvM!#%2gIozT7f4vL2^iGn7Os32pTHN$ zjRs88smL~)PL~50j)JYH!EnZ0RX8G(+OB>A*Do;B#=_VT8nen^%i(~kC%&u|5~rF=kMbYKc~}O zyi)4AmTlV(@=@JEL_W`R|7ib}QvO!r8G>dY6#{i#|M~W#RDR2&3PUR&RH9Gvm)kY^ gz(pdF$W&Yae-qJPl&6RcZ9f@RAy%7ocSy3GfOt5R29e05fPQr*4AtF3A>w_tgCBm zVQ!Zc5b0y-E3cr&z`)R{tneO436=!;1^-6_4618qCIKZm3p^r=85sDEfH31!Z9ZwB zV5_H#V~B~+I)TxIG^i9L3_v-{Zr2-X>E~x;dy!b zgqnWNhKMhkb3O}Z=qTO!W6Lbj^mVuId!-j9o4&qbUo$u1%5Uzu|7_&yI^B5dflgxZ MboFyt=akR{06h$KCjbBd delta 231 zcmX@Zw18=XW4%g%Pl&68goK)^YJPtH{Q2{ZjEwFsn5&_oaW^wLIyyQqFi>1voPmKM zQAYJLkm4x`@(cct01QI+&z%E`a~60+7BevL9R^{>VQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0Lb#b0%17+)TuWND~=ibr^FFNI{;?6yom{t=oz2` z-ZD@ENREP@Wu{=dBPfYztOm+*Kwf|qgeqrF|=3xNQ#DomViSR4S zD+U!M6^7?8UvV%zd~gfJa!GLshLntKFu$U#kSO!W$^~D)ePsYy1_bcX0P#WMFpG&z z7bH6XYVdzhwu3qX?x^Q4o|Bv)$qE6OBXEe51jsIkD9L(MaR9Zzr~^hFFzSE-cK`sL Wa(=4DC}uVQ0000}HVG^<>yGDV{+>LgGJN8~_7p9lIII%E}nL zql+lDmpli2`}U1t&6+g~-@bht7zfY-3@r!bx(YH}xpIXe*MC)zfq{X6fsdD$Vh6Ag ztMKIELktokTnt=XKN%!MxEM|zKE&|p^Jj`3Ky*G5)%LGqjdh`%Kzfx;{TByK@1=%4e;^uGR)Zf8gJaw#OKHW ymk&wxIaM7&i6!M^2N%r~+$b0YqhJ)!3jhFIX;GoKhVf|t0000Op#WBRf|Ln!re1{b{SQ7#+Y`t6a|M=aDH$~sP zeO@+6&9r8t$cj5p_!$MiZ#R_-;7AnUyYj1|mEBN?{}5B3pm+>(l3?K>hSZV;U2bb` zG^jE7RSLu}c*#7=f-Q1}>ilLMewR-rjL()beqYX~^O^U>d<(|lV?6=x{LA(=s=2MW zc3!9;h!d-uLy-@Cg4ks?Ly9I;c5Qb^OFim@-`q9d}S5*`y z3IYJ2)9s>BDSy~=C)bY<1;JM(JS*TPtNc#$%e!an9~`4mDZnsIUwKvru*_c`u59yC zsf5$>TL3_#QUD>uvlXELtQJh^7?e^}t5r}+1LX(>005uwZwq5nI^G-rN%5f|LIboq zBajr2VlDwq(@@MM0!rFZ6mn&tvErAW4$F zll%St()f%lv$LaJsOcnHoe`cseggj!JRzJQ%R~ra_ZNrE&(U+rH>D&=Y)=%IewlUk rejA2sl|lpjHFIjM<&G37(x&wb&nUgko0fn-00000NkvXXu0mjfMLO2r diff --git a/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/meta.json index 1e84b43d94d..84f02032366 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/cargo.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/centcom.rsi/icon.png index 4ee60687d09860657556e171f9ae70c31a1d19a7..070bbfd16a652c755399db14a4928134b3ee8f80 100644 GIT binary patch delta 291 zcmdnZw3%swWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hcfKQ04 zh^UnDOa=>cJBBmHUY>y_MqUj6jpYRmbajoD;+W(W)aJ}z2~;aRyJ9Pl;w=gC3;vG; z7;IlCwE-nK3p^r=85sDEFfi2f9bufR%_j{Mt?_hm46*Qkdm&n=L4kucU`LwN&i`NA z`lU9kG`sLO;Ns&G9#56+UlcZ&Bv&5I6EHU54i;_~m=-RuxXCj@;QEmTZ;r|;^zS-u zJ8@CdOI~iXG_m?O4PCx*2Y&`SwN)})4BYVEU%}aBLhgLN5Jp@1&~Em%-7jU%&5-}x cJS&K=d96K0x=MVf0wHk3|Jf)u#;oa z)`$qci>2@3W9)lea}OX~VO}8k0NF}dF@=a@rD&mS-0Z?}`MN+R^Gz}tAQFlEcRD_s ziHJqFi*mn*wbm=PHblfK2df;6jbb9=5a%XUllNB^0KoYeOMeB}?><6ER1&zt`50Pj zY*diq{RNzJ=wJfp9F*4W3pBys5;#r`hNAO>_%)r10RLFOPajG_-G*HI|PZ!4!3;(khU-LB^ zaIhw1I9iv!{=NUL-)^gg_v-T04L3gYc3n_2*`CGa&b@0D4vH;)76GsRipm}FxWmb9 z;TBWC+u?eIlX=R;MlGq0Nz7IZ9}LPKahLpP(CRy=amHv~vkJe_FWj7tCj delta 454 zcmV;%0XhEj0@VYM8Gi-<0047(dh`GQ0h~!hK~#90?Uk`g!$26v|8YqxB%%~^P;fFu zAyjCz50Igg&(ZhrF?^3s9lE*o7U>{up_7o5U@^g~Ey6jJ3u$f0C8@gPw}eaXzVDas zyGwwQl9GQ$$-1Cnnj8Qssv6yU9*r``$tBRVEFK?!u2!h1YJYUiBO<+^VVYbd8&4)m zl8|_IPyvxBDM8b+c)S`}BvL1K9EY>z5_8|*>N~LAdm#ZJlfY5hg#KWl99OG9lIxm= zj^jivnEO70FhmfB(MFXa_wH?47S}Zm05F}+P=9biZ5seU?q8v6np7oHE0BaJzeo-M ztu9B`2Haj9L4O!Z#mOzOo18zkKqLdz@))?qet*gz&Em4**bG-C=z*1OTx9 zIb7FGjh{NfFpQ|ip6BhI-!M)7b~=s5XN$|s|AbVDxIf4~2qC=IR=CX3iz97m7zRJl w^}TNVQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0LXHWoLo5n_St(3496M%Q{o7s9RRaj#zGNA{O)lE ziU7$`VAh`xrcV`4go}xYO8tNH`WacFK#~K3j!$4PsZeF8kAJ_-@cYDlNE85pq=Y1h zBFhm}$pze8++arl9YC^Pk{qzkvVdW8`~(JHO&}Xd{LZ~Q4CDfm8~_S()uaLx%RzwL z_$SE$;H(DBatsXK4AcZ9g#f}4Xkt(xub}q->(?&~+}u12AexwvAvqC#WqHM*qNKv` z{N)RVhYxO{SZgjRF2RtJkqzcolob+X9$C5I>$k5AAj^ON9vUD%NE~J{vFUN5CER{Ka#U6C_z70CNNmagqSp1ra4#k17tJ78rHFr~^hFFyIaV01k3`k;tpE Qi~s-t07*qoM6N<$f>a=vmjD0& delta 299 zcmV+`0o4AC1H}T6BYy!5Nkl1Ka)7S2 zH-koDA%m{9HvK=4 z)-4qM;^N})Z29u#OX`;q5)u;sJwlRj=6`W<@&Cw2Ke~+7|tKwiZ||Q;&Wtx x%ZH@;oT`qX#3XXEgNx<~ZWN4yQ7{VV1pxH%RrLglhgbjr002ovPDHLkV1gqYlHC9R diff --git a/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/command.rsi/icon_alt.png index a01e0c6c13e9e939597ff9f756a3fcaa3073a6d2..51a87cef7994958a1e61f7f23301d9c5201d84ef 100644 GIT binary patch delta 552 zcmV+@0@wZc1Hc53BYyx1a7bBm000ie000ie0hKEb8vp=JZ}D6A|=ODoFO zj<#=bY$d~)RrBH(mf4*-d_QmA+j(O~kJSh00~iJf2B)huet(q9$lhI<{uO}C6^p{& zYh%?YgfxKOoTOG%v?D`1;B*eN@gaB5Qed~);2rlF+65^9G8y%ZvG>>47j!~~i;%XS zqF2>V_HaPiT@VKF4ozuQUulf|-2w#`*gXT#)rAy<5CEA+Qd`(ti`M5T`ba8?-03Zj zceVkK${^e$E`KSAmH^!RFL^=}m`AJuLPo+Vphzj#`KJQ=rgxenfOaGVKt_kjIA%iO zhIyI`BZ2F)o9+VWwf=R2!1g3oHeA2fs4lt=K;{>*OJLB2PDmPnMcyHEVF1c;IGSKN z*Nf)#`KKdUwmY^2$iAJMkcM^$E!H92E;nYESL^1P^nVdl^D|JkqAMpMhsdP0_Uo{+ zf1UmJ`gKjEBBUi;1Kh;x@Ue>s9ly=Co7y$+kRs`jE<)CPDnBQlz5(&O!ra0V0)9Ud zn{l*~G(f5NNM=>40}jEjXY@^Q2m8BF6tQ|R)Q+1$kjOk=$g_3PdN6z+;1CpP9Y9M@ qZC+SyT_MY5BJB!5C)5Y%Ilwm%yYQoVR*XFW0000f+?$q%IC31;IZ-S{%A`?ocTXZLyB6ElLweD-O@0T&UWbOQX2tTaLTj-TQLy z-2ovXA^(ixcR|!J2mq#3)g8MpmwoRumO#ujX|UgWd&88fx_|9BBGL<@hCw1&rCL=+ z35jpNDj))l3J^0*8axd@5}p&2i3B;_E}q-%Pk9GE=Uzwv@Fg(eHQ_FwSEeJ8Z^3m< zLo$(YQ}Enw!?JByw(S%li`D=Wk~ zr~UIQN?%-4JbxZ15D~Ij;+#vJf@cbTqE@eC`|ub5P`Erru~N-2x5{ z`mGNF2~?_8#j0)rX8-T4EK0tNS%Wi?Qio5Ap$ftrA%5P&%XT@1#SS5W)^_3IY~Zf+h15KTBo4Ef z*mOa%1E2=~2W2~`BjApD{^B{w36iW3fH?w(I7xu)f{2o=M->N93yeBo)B&Ro7;pyw Y09Yn{%O~)p!vFvP07*qoM6N<$f~V4+{Qv*} delta 254 zcmV)Yu~@d^1_r`e2H1rglmGw#07*qoM6N<$ Ef-{zO?EnA( diff --git a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/icon_alt.png index f1559927e0c2fbfda565987acf5bcf246f14b74e..98259eb0700d261983bb1064ac563b845e8e7af4 100644 GIT binary patch delta 336 zcmaFG{ElgYWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hQfKQ04 zuCB4Xf|`Z7otI~zh^UmjpuyYw36FQXdHUvVFVda#@cW7tD~ie*=FDFS)M01)Zx@i_ zFA4Gs{*M9}uH2ci5Gci2;4x8Mu%2PPr;B5Vh5y-$ulWuuaIhu>T-bWI=Kt}#7jKHb zdHcLDyz<1?WMJv0Z5dR^jK0)yq<|M(wLky`U3%cCa z+-Oi^@T(MvU+|K7mIYhn4AuF~I{Yr5N*JFlW&FOJPvQbcRxoK#ty?AOaM13?wep1N_nU+6 YRo~TDe>w4bJkSpep00i_>zopr0Oin(B>(^b delta 475 zcmV<10VMwJ0_p>h8Gi-<0047(dh`GQ010qNS#tmY4#WTe4#WYKD-Ig~00EpyL_t(o zh3%9vPr^VH$N$JsC}~Yd%pD(~Obr7}h;it^#J4aZeijEE^&>Da>f*rQ%w#%&k;w?y zMH-47$aBD6K*9DX=+ghv^zPmLfA`+I0}>@l^v_DkE+`rX0e?V7QN-AzZAU_fwmIg1Man1V)<-N~TH6*^q$<4Xj%hd9xYDjivp>vrO+($XL%=*y%d=zY`yZK-F-C{FzV>9n)B8S|Y|K(@fbV9@+WV86C{dz)>JuxN!21^- R>ka?_002ovPDHLkV1ks9*^~eP diff --git a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json index 1e84b43d94d..84f02032366 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/engineering.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon edited by FoxxoTrystan and Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/freelance.rsi/icon.png index 0ff3f2c989362d67e30f45835f939895d8ce6e62..fa790f7e9908db0be117835f39c7dcf37e749983 100644 GIT binary patch delta 376 zcmV-;0f+vd29g7iBYyx1a7bBm000ie000ie0hKEb8vpVQ!P zj5=V{0VF#>UeMq_GXLTG3ygGg0Lb#b0%17+)TuWND~=ibr^FFNI{;?6yom{t=oz2` z-ZD@ENREP@Wu{=dBPfYztOm+*Kwf|qgeqrF|=3xNQ#DomViSR4S zD+U!M6^7?8UvV%zd~gfJa!GLshLntKFu$U#kSO!W$^~D)ePsYy1_bcX0P#WMFpG&z z7bH6XYVdzhwu3qX?x^Q4o|Bv)$qE6OBXEe51jsIkD9L(MaR9Zzr~^hFFzSE-cK`sL Wa(=4DC}uVQ0000(VDLS delta 777 zcmV+k1NQuq1D^(vBYy#IX+uL$X=7sm04R}lk-JO7P!z_0ZG99UDCi*K&_TsPK@`MM zD(F%j+6q=(l9;qYTSJl};wrc}2o9o)ufhL7SHV?55EMbg&E3}`63=Z4710}R&X4cj z?{M-3!il_5aBIe(Q1qPSWIQ&TnTypw(?BD2v=Y?}*PcpEq<{H$ecTdK^=3fz`v2aa zt8vkE4G2YrM-1EXgk>5ME1s=*Q@Gv8X^X-K!u^g6D151OJ>VzB*?`{^JL%*&gjLU2 z_6O@f*vL5r;XdK+LcU~F=22hLWEN*qQafdL;gV#MI5BieERn}!Kx$Dk``b5I_D!=a z9z)(Xt2pAwl7AC#zo;eYYD%?4H|5E*s&fCGr)v!l1>KwCQ2XfnuRTz|4PRTn|9R;9 zUq=vmfb(M2zbrY8zKgz9)w=hgWgSj0s+zt7XB*IQZ)=WLmLjslmIW^-(42v`YiO7c zvZ|bOde+{CvC&A3uF&c=6%|NqR}K2di3jMd|+s zI?Vr{Y`6OV^ZbN#1Mv=kTF1o5 z3T81gP$vx%?Esi}S^jBIeT~7$ zM2CT!i;Kb3M33Rv*^3OHK7AtFVwgsvBT`LG?SFr^?sIU!|6=^lF!!<~!}XiDQS^(8 zi^H?V%a<=v|>}zz}$2I0000LRPF;QB>A2XZ}i{j-9t3f(+*` z3Gxg6j{+F3+?lZuD8*UeQ6E{%z`%C|gc+x5^GO3m*L%7+hFJKYz4)5%umT5bLcoQs zcWeG1zkBhf=$p6C%Ok#$@~MRJ*;2;u%lX1}KJ&hqZ^0OR ztS7*of7!l9wH4RSt9J&j%CcW;$Z-0_>21=*4l6jh&R;joX!xL)aZnKjag++Ws6$)9uO*31E2J?bEmB+s7YD&Xbn$EOALuH$DhPrih`71?wTQ%X zn?gnOhMV*7-uoU--au&5GV)${6!Lb#O->|Yvvc#Y$TN*ZsedO-zh-#ORBAlUzw6_c z8dY!lRImT<{kft`8P9;42H|1DaSOsS4U?+{NAad`n~~F&gb##!T^UgLQt5iYPl~ev zzbSUp$uS72p0Vr?)_<^(bMwMI!tuOSG%E9`FKNoyGbyPZvODoeGC_hEIz^VTD9|U> zmdyV44U~P;tbd5dkhen#R~%V#;_Vf+C|xsBP0=&*Sd>)mzw`9Wp~0YgQv&K9egCx! zBHQq_<@=w9zW;RuwGVJ^SN$uJ)5yE%TU9N-4=w9(dQsK%9XQ*7_IpQjwX#$zJ7k*h zasthB(0UDx3qe+ubB^yIy(Yit3U>FPTkf|kegpOfXnzHIGe))m000SaNLh0L01FZT z01FZU(%pXi0006PNklkcjm+6F}|#GItin2kon2K!Ja(fT$L~r@PytoQ6oGoVtH-P<0(nt}3yww^xF5^468>^l`vC1(;e zUyTZNlu)VtOr=C)H0l74H8p|AaV`-o-Q38J4}U8ADp_9zypn0fM1tDyY!=^>T^RWE zS&myLmO(xpC43c-6bgosE5Ge+7uFrM0txG$gdM&FNe-N$(%ni(9zxo(=>6lH7D)v&JRSakWLBI zq<;V*M1(;8G$+AY9>b^)2{hQ?x`(S~0>*jK277_C#EarIdV1|kW)*%l6ClXEO=4-} z0fV#aSR67dz&Twt5uj_fu-ypDW|1{6aQWPfs0iUKcZRW*V;F|vyA!?v@p!y^k_&}` zYdk$X^B)SJKnnP>7uR|NoO*c75DArtTTK{Uxv%3fOXupT`K~Kc1GrBFnqx87mGRSi zT`Iv#C9d7o?(cJei;0U#{eSuD8Cjt~k^^SXdBI@S=FPAuFqq-mHGc_k6o7!SsU5@F(}&1% z1XXf@yqqGK-nMlG$$Ck0Kx&EvLpjj*Dw;_s;_KEfWFQxih*8BhF^&18eQ4t0ZO-#s;oCtrgzG4Upj%PS@Xe-0j ztCvtLx3lwRFlIJ00Q0NM3yCt1tX%N$(R~JxWk3KA4GA9J zuCX|1d3dCRrqTp@S=554P4iP#ohJ<#$=3IPZ6FW`d^%rqikVsC!vX!}g0^jE^)7~) zwP~91F|)oTJV_EAhG8{{?>WU;mf?8*MVh8dbDtCN-lM82czo|)Bd`VUC19<^-{}X| zS^z*C$NLF5=U|LM6h$z`z&VG$?-vU^d`v_{^E@B_Wm%%G>zjTe8rQPxy7dngGiy;4 zllxCZdM&X!BBDg3A~GqkS@^w>UBairmV`e&D4P#lAP@-b#Xm6GU!qP=N>~5@002ov JPDHLkV1m(#b}|3} diff --git a/Resources/Textures/Clothing/Ears/Headsets/medical.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/medical.rsi/icon_alt.png index 1087400c3caa26d484116ed669440cb2ba91cbaf..e68f78e061f33d0ee8d933defe0b6cba6aeb102b 100644 GIT binary patch delta 428 zcmV;d0aO0f1H}W7BYyx1a7bBm000ie000ie0hKEb8vpVTo; z0C_=!{~-F|`wNT%;s8-aDF#t#Wrl~FFHp;V(j4&m{xb$@gQ1lM2HXL#G{A6f02~0y z0iZMh!m!)`0+i+mq8wmi^UzOtlGR876k?~T)QR# zjsg%cHnn3od-@Prj-X05l$TQk)7!SLAXzU-4oFRrU?>OrUPUtrMSR`bg$(2Zk{kdE z^3L8W3~_SfpMN9=fU+7W%hmQ(GEftc6ap|upo_uS+S+>m-@JaqAR;Ql0HTQr8Ilv> z57t)L(=$bEbnVR&x{wy$;tU=3c4Gr zmPG(iDi+n)$7G^?&P4(>+ot{ZuiXx%Vo^OW5lOwFYFQKq^M9t(!a1RM?y3TDpmPCg zwoUul(2+=7*lx8bj3O*otAn}&hqaF-0B8x^B`tUz4hxlX`6#$)7-+Xzsszi`3Y+Z~ zo9$LLY8o!?-kNQbX&3;2&)E#)@mS5(>vfohq1_MKJTw}_IVUM4Nh!&39Ezfdq?E)t zPo0H};hdA_d4DSS^V^yn$5BFQBocezH{ucmL4Ys}F&d2!hN0FOnFIh}Fc=(-1wrt4 z0z!yP5}5^j--i$auIu9cYHe*e060Aq~yMNYvvr*5~a{Wbrmwq%Uay=k8OviRyut%+>&qQ6VQ*LWGm7D0000vHul4>cW2iy=LN|7Z{ZLE%~lh-VgcOy4>-R#`sM5P zp9MgxcCvjYkAE)@k)>D_P!K;o^<11TOCdgBS)-scNoCkWC~{A5OD=+L2W`LcEx9vk z!`s-5;)A`dME7ZJf%p`lWTE0}P)xo`oOCYO0KJPPtz8cyh6*|XdmyzcpdkM6S^3I0kx?hJi%FP z?a2#{^?eNtrf2ZgByA01#o9q!xNxEey|!!E&;7|x{!h#-kVqu{I~PM96OkyT;JruN zwu5H-xEfNvSv31_4LspSrjWQCTE3Mf?pA`$q5%;}6oGHHvVX+G%Pa18w_|(H69^%o zsw#vK;tPCy%E>&tz~ftUGS4mm0M=T(Kd)h}1pp|e;t4qCV2nYQWiZCTIS23kXn{Z9 zF*8e^=Z9RDCF;69n%7z%7NhIBNj|D0h)9Z}kiPrZTFXy~$zf*ES_?Dx3d~miTS=7i ozOpgpXD`a^3mcb6BoeXs0x@t}GjErB1ONa407*qoM6N<$f{v_)_W%F@ diff --git a/Resources/Textures/Clothing/Ears/Headsets/medicalscience.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/medicalscience.rsi/meta.json index 3d37ed54346..37ee397b98f 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/medicalscience.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/medicalscience.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/icon.png index cdb552f140ec9f1a86c9333d6d16dc47859f7d61..498a0af6885eaf70bafea8842a6431adcecd420b 100644 GIT binary patch delta 444 zcmV;t0YmVTo; z0C_=!{~-F|`wNT%;s8-aDF#t#Wrl~FFHp;V(j4&m{xb$@gQ1lM2HXL#G{A6f02~0y z0iZMh!m!)`0+i+mq8wmi20S&o5W9|JW3Ng;r61gaQ}Ew7;V z|LfN;4BXs23?Q1AkRdq{er0*ZprWM0@ciWqhKCPsp;#^{F2RtJkqzcolob+X9$C5I z>$k5AAj^ON9vUD%NE~J{vFUN5CER{58dMk`p9ZApmm(4sntI*#!|L mS&u3XpcWW)z^DU89RL7+LYE1kW>c;J0000>ucb1jw2+SqM1{G#knKWBq~Y$6a%G@AK}xy8;z4 zD72J9OBJ>McHD&HBMs-qUQzMm1%wb_jQyWL(NqFEX(khq(tkO}-1p&m-c~6BQc5t! zKtyUd=!DLzR4WCDK)f&i9fAqawU1m501a%r@U1}8Z= z38=0?(-xq*hHI%a!QA&V3nZ>_v(Zo&hd)21uTMNYFYq#(t*jS9gx69^nScKfk-ELy zSL^P-5JD|WBq3E3>YU?l{2E#NLNZ@wU505h&s8Ez@QshF@P@0XsHiB5ZxOg<)UVlL Qz5oCK07*qoM6N<$g7S;1RR910 diff --git a/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/meta.json index df6ee47d086..9c2f13fda0b 100644 --- a/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/meta.json +++ b/Resources/Textures/Clothing/Ears/Headsets/mining.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 // Icon Taken from Paradise at https://github.com/Henri215/Paradise/blob/27087670280de99e2fceb47194aad29a7b99b280/icons/obj/radio.dmi", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Ears/Headsets/robotics.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/robotics.rsi/icon.png index 3d247f05be59b6337a3999eb81040920379ee608..4a67c2aa6e97c830fe27dea40f863cbba9df8282 100644 GIT binary patch delta 308 zcmZ3%bcAVwWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hQfKQ04 zyr4lxM~A1U=l?Sd5z%WzM5P$c{5LW3THENXt7~jwZddNDFR!3BXZ}i{4imQBtAG@L zNswRge-yxQ<<5+SKq<}wkNU`B1_r((Aj~*bn@<`j+Un`z7-Hf7c0#n!VFeD?kB-eA zcm5Z7E9ENATq1qqXTgpNHkrgf4+Yg68IGRP-^ZxAw8kW+EyT-nyVF`#<|var0rA|a z85b?M@96mNaqtdhT(4fD^lIJ4$Hpa3{eIL;S@7o?3uELLk+|#H3peU^6nuW)qkT1D q@AfUit&P%Q{(OgKy5Ep^%zN{wNyVqb8!dq@V(@hJb6Mw<&;$Tw(Rl*^ delta 280 zcmV+z0q6e20;mFz8Gi-<0047(dh`GQ0PjgeK~#90?UcU`f-n$=e;OwUtapne#Fdnp z$H5h!#2Md)U3~)F%L)nWIjF?M5cyMC?3Xm{aP99Kt_N5wmVak8rkI(<_dL{11FiL_ zyR%_tk+XU(2s4X`ch^J1qbLFZs8n!KIkGH+35h`hFH|bHo_{V#RX#U&nn2sO-Ch*M z@&W*W_+%t_x`1Iu2^R7XW`#M776bQn-e~{QGVWV e7K_EQ6nDZmQxRt|$z0!a=y#&n*+s?D2WQGZ}C!!30~a1?-mq=Y1h zBFhm}$pze8++arl9YC^Pk{n?5&k*c;70o0DhJOh0JNND|kPAq104T`g)F-1@4g%!H zKS>S%Wi?QiV=(Mype7(G1mKQ96N9nk71aKJ{rZK0o12FLL=zJ-BqzeJEUy?;lvEg= zzkI>)@WCw<%W5UXB^XjNvcdd{vO=QFBP$nt{q~gsWEl{^Lj%MIiNh==HeHbH0I0$L zLD>%K2)Lu3zj#h^f+Q;hV2;2cP7)xyAfhDeQN;n&0;3KXb-<_t2HXJvQigqU&FZ8y P00000NkvXXu0mjfY~7m2 delta 284 zcmV+%0ptFR1GfT@B!B)%L_t(|ob8mMZo@DThW|}Pk!I?f$_(xWy5YUUkQKDI7!7S$ zu~|T#WGIgiTqy||FfhG>Y1InSElpxFf9#ih`af`IAdyJ?ckZSbX36vX zoa?$q+qM_;TI=&-48yRiBdjRHmCgN iMOl5}5{X1278NIywOTV4Lxu|g0000RJo2OT9xiv>M=As0Ku zr7v(cs7oIafANLUSB6C)#?o>>Yu>v}m>9q?K@KZ`A31OKFVdQ&MBb@0KzAXEdT%j delta 464 zcmV;>0WbdP0`dcp83+ad0047(di0Tw7k>eyNkl#H4*dX(rc*I=srDtLiI7kmhjY3MwI#eYy6`N7 zyZ_zuW3S_J=6!MjGz^1A@4vQNR78%pnj#EC*tU%@ z3^VOf2mk=S?;iHXX6w{vus8rAq!2`50M~Uv2!Ul;==FNAEGyIcLI4xT5&Hc;hma(R zC-Ss8$6~Qad<_!|R8{3!E|<%L^>tmRx2+ZkA#hz6&% z^`c5msj4bHRg{BI#y-8Dz8{-XVSwLeQ5`kzQl(1$wSE9vn7)JLv0%CY0000Nklt+19Tw>f(u2T!H3X=g6P7X52Ho=0jEXBl^HA)VsF|^?LwHF z4DBXoleu?D&NnwVnF3}k58wejfCpd$ECn_7H~##1pPL#0nSb9d?&#;!(vL|i7l_ON z#(a5u7++!@2R#8iwc#T67VN$br(Cb}C*W+Wzydfb7I1eZ&}=;7Eh*!x6zhCg4Qa4~ z$mJA>qRPOwI!+#G5+4 z5fSnbs{$zmNp_BN=Kbp0mXh)tLM(vBES0fp!um#Cm;dGYVZuDDRMFbo*YU~mVWzdL z0AwOTW&@?yGR2fP###G<4KP|*(Xksrq)<^OVmG8!1q{SLd6uj%BGui$OO8+rgeK()JB zmAa-wQFO2v|DZI_k^~ao=gS{pu~_~c$7C`QX^$~9ZHv0Djn>X_F$oXD5WbX1k_1Gg zPZQ|F0YE8*D2jHISiA#$c%C~*({yX@I)Se10O!+YS$4j_5qSKTfDi)r+Y3Sn0D#BX zxdH&-y6(_#+IF+R;?Lw71lpH!7(c5DkFuPs=bR7EQYp2|M>T diff --git a/Resources/Textures/Clothing/Ears/Headsets/security.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/security.rsi/icon_alt.png index 219918544cc972b58236a8a32cea039364ec37df..b47392ea071f0362afaf541887ac19cad27d8b0a 100644 GIT binary patch delta 546 zcmV+-0^R+`1G)r|BYyx1a7bBm000ie000ie0hKEb8vp`6pHRCt{2mcL5^VHn3B zNie!p^1u|%bV)K4gvN%3XeelCXt$}qp`jrf+S_U=8g*}TYm{Bh5=%+tv;^roqrA#3whhW0-$kWNg&U| zwQm%H8$fRyrF0cABSR7Jcto<6$}c1ZE~gWMp|GJSZ~>r^fV4)QTP+!;A;U$8p-1l( z<%9evAa4|y0fH-Wwd%WLJ@@f?f#2tbYhrGLN%z&&_JAb7-_0`wGfU8z;cJ3iwc0+ns+X0R%H#{G;f1P1nSPp>dowZGQZ3^J#X*!0v0MOf%7$rH^3-|Pq zz?RHA9VY@5-!ir&HX+%qL15##{uDLi$*(pjcJ(vtEPsO~osdE#Yiie%23;?auaBJL z+H3%~m}`I<3A)2%9J{22vEjyXO(!HvI=G9F44>{#$I}lWdRN%nKZMOl1THVmC;lHd zK(q0R#`^jJM6YM~j&Kimw;%{?^h2m1I!%Y8)Jdt5vZpBW&I!4>Z+{hViOwY$g`v$?ql!df z;N5g;w`t1jW^>ecIPSfZ04fP|iUR)L-+R5QtN)VwLU1>oW-WN#Y)FhDF(x~xWvG36 zM`37vApm$@F40&*!XGtHS*Y1EiGMNnWqlC*ub}VE^3Q0MO}l zc!}f6|Aaz`yvQk(QdVni%e;DdN?S@P?X~Zpd@}dxeJ4wjvsG#=@Ncp_-&*dLmX@F9 Y1IM;U>K17H9QfB|3wxOQ3m^!=z=_x(r2PBVGj=z3 zL@yAT0c7!oN*Q^IJ%aVM+tluzEUMV>NKt&ehgw}=0h}EMnAl&zO?4S}o|BG%RB}pW zv>>#vV5x8kcs|_ZZ4X%~L;}Fh!veUdH&Ce_V{Wzv4-FM>Jv~5IybfIZ@DAp?ij#Eb z&jO%RbI&1sEe!Db^4L{;wCG^9 zR!{xyt&L3iw5}lfib2H^scw)@aalO)Ua$c=i3Ocq2SP!$gEo61wK^an{)n@r{SozY mdbt4PB?Djp3_#xjz5#i+fJ79`{QCd^002ovPDHLkU;%>a!mXeH delta 284 zcmV+%0ptFn1GfT@B!B)%L_t(|ob8l5j>0eyhJPp{Ih7?(l@7!Ts<_MrD3c>_0F(=G z6U23L0=8MYsgf;;a7t4kMNoh+d2F%%BugG?tog<-z~k}!cP1{$L}WuDaIR~VW$CoG zGel&WxgA7g|D<>v$F^yj-Xx|j$!VHmvp*n7lCE_>6EMbL`+r-)7&E>=p64&)!3Cly zx=nWL$9OCO0MJ@varuJQ8UPRqF`fW3LrRGt2q2{dGvi#>odw?hOy;whU9MJb{Czy) z=X82luas(^WmQ%Ee^f+dvn+f1{*_YpUg8~`?m#F6ilTUV_JeeO&$A9)JMUGZOYx7l iYw!!_@pwFAaTNvIA7Z2|dw$jc0000;U>K17H9QfB|3wxOQ3m^!=z=_x(r2PBVGj=z3 zL@yAT0c7!oN*Q^IJ%aVM+tluzEUMV>NKt&ehgw}=0h}EMnAl&zO?4S}o|BG%RB}pW zv>>#vV5x8kcs|_ZZ4X%~L;}Fh!veUdH&Ce_V{Wzv4-FM>Jv~5IybfIZ@DAp?ij#Eb z&jO%RbI&1sEe!Db^4L{;wCG^9 zR!{xyt&L3iw5}lfib2H^scw)@aalO)Ua$c=i3Ocq2SP!$gEo61wK^an{)n@r{SozY mdbt4PB?Djp3_#xjz5#i+fJ79`{QCd^002ovPDHLkU;%>Ax~-1@ delta 267 zcmV+m0rdW&1EvCyB!BHmL_t(|ob8l74}vfdhF=^>%G9Jcv1v3q(UCs^zl49u=BA5o zH^B-K#=01y1BA+lgME^wx#XIAu3vz|;rMqvn`9y~fe@(b8bwi9t(^=J8D{PV5t*M9 zkD|!5Z9AL9#wIyQ5}eN-;y9jK_d9{6X#npvuPu;e*E z8UPRov7P`kLrMwX_aUVOGoz~O$pWK4lihY}j;B)>UoRKj?)Q)NN~!KymSs8rM@2*? zP1D}@uaq+H5@WEs1A!38^L+5^7wP<+z7B0WpH*T?@vpaQ@eAj0I2>#71p4-0q*qZX RE&u=k07*qoL0I&vVHg_Y8AAR02$okp_&-?uzWg+V#MCjpt7=H32fTmH<23TIH za@D7K?p9n<>cR*@3joIV_YSCi+fLTteWTuBpw4|KfpAwVMi65G#P}$oAia20Axxy5 z0(gpC2d`az$A27avLkGz1t4K|oCUg?tMOWkd|re10+k!UU$wsd)OFNF?f@{3D2#&0 z9Y9i$m9zkmV{gmjoS%d@$vW25{NqSA?T%vs-rrv0pH(9jLbjW_BOsgBtQ7%)P>o~$ z`#VN5mUaz@k$5X|I|fLa$7t8mA$1~RT!h?w;zlGVo@3g8MGyU5N}J@pAMYh8P*G9w$5=%dG#d>G z0H?OCzdbG%h2xYGXuGb=zJDYMPHkI1%ZL~+Xf_&BC3{*ft$#y8YV1b^RH8!(+O8|J z)hHs7JF(a8%J(?Ndb8Q-JFwe(B>|w2KrL^={lkNGes=aPxkCtg-L7uIdb2?oMF^uv zZ&VXX@7}iSN{0{tz_agzbFRl`vl$#hj4F{^fkUYBKl?s9oettS)?=J=gi&M^r?fye zxgw5Z3`Qd@!G9RbZN*Un4k1X>6lt0Q0B&w?F&+*J#W+d;0Fv#_A9x z5ah-`$(uka)jN5$T73%`1cBucA}{N82qBOp30_}bj75?gLn)P6k$o`6BR{fNNVWLb*-f-5R2{uQ5fOvV4I5VPU{0000nX|KM5h52X@ebpCp@BY?F y7w^xTCu(n6=qDVID!sz*$hw}A@!`Oc`yTz+vR@9N{n zE*^&rKbI-pQF$g3n4qU=WUkEKs%MLD#Z zZk_o0`oia5kLkHKS_HqDeqhys2_MZT2w$kTPmxIHy1kW`;j4=Agpkx^x%5@WZ}UID zjAQ(8i~ZJ${@{7Z^|qVerL6bcJLT7dS=>zue^~vm@kOwi|M*%B^e}^`tDnm{r-UW| DT{(Is literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5a37ace23e68bc693b636d6409220d71466ae9ba GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G9p zi(^Q|oVT|Oxehr9v_1^f*}}mcrWA2RFSJNJdi})iincBHT(!B6T7@c1Ez91j;K6ct zX2yg6zxH^hi3gqO02%=T9UEur|Cvy9{8r=Zmp;~)Ov3jv?ko<{3)UB^&wBW?Xy&gw zmc7@j4L5R}ojduIXkE2cPg2o0U)xoi4n29r{>nUIs)~|QQBL&KJrjhBwyrc+*l{nv ze(Gh{y^On0M*@wz-ttZV^eb@=h-C~60!!a3y5;OW_=Y{=YH)7DQxIFTBvW=g7$k77w1alox)LiaTPwqe^_Pj7i_IlP#X+b7olx zXaq!g{@X9=w13Z*)CzwVpvgesF!O9qT+6wH#hK?OzU@AJa!chbhFQBhZt7VRp}?mu98-qj^V@HpS1 zujikb?0kJi?7_dva&M82+`QM`1@*hP@jVXKw`~8!ZPGSP9AYs815d+yHW&HVk=u`* z`Y})PMe^QbtQ?lcA8!9HUs`0hz~{xxMxW3p58qXW$lX3IB)3Fy;F)U1Hi&=O7 qrO+2!;}7A+Tnno{eEG+CV4?o;F1P-kci&%v4EJ>Pb6Mw<&;$TKbd<9I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json new file mode 100644 index 00000000000..9094fa918f0 --- /dev/null +++ b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Originally sprited by belay5 (Discord) then recolored by Nairod (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Armor/bulletproof.rsi/equipped-OUTERCLOTHING.png index 81512185135281cfe088087f850d732431838ab5..78f7cd2453efbbe1b9cd75a835227c0d872a0a16 100644 GIT binary patch delta 589 zcmV-T0c0004VQb$4nuFf3k00004XF*Lt006O%3;baP z0000FP)t-sAs`|d7#c4wF+xE^00014tKnM!000GaQchF<|Ns90`?d~KkuDd10oO@H zK~z{r?N-~C#2^S$+yDROO^}%af}OLoPkWk&Rt$~tQnj65;t_ZR2rJNLpsy8u$ZK?Y zDNJ%}gAty&LhE3F(JgMUyQg-O7`Ow(E;0Ch-<0E=3Gdx4cN0n1-fy)%gxSzJMW5T18l)qzGUL_f@tjpz+< zvt+?Opb5`=fr(lm;cWm)TB!Qar-C10uf{%<2H1i?qY0la0$NVM`HKmmxu_qo8VF-R zverm>E5HGS%`yMl6>!f*cc^E4TLVRg zb|{yKLP02=pLR!Z4vv9a2oEQ%2@t9ysd9krRBji00VI_I*sVCo)gTBZIfZ~cc!}6J znBCtA$N?+y0=7RJF9f7;EFL9ZAnsWxy7215)5$f&^090n8HMo#DAP+%`a2&~PsR)T_U43i r`>O}hgRHI-ZKL3qQraEx&+`q(U?z<000005AXa0qg;gB!3T3OjJd{z`!9OA}=m685kNuK}1D=0xBL50000< KMNUMnLSTZ)D_7_M delta 216 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 delta 328 zcmV-O0k{601J?qO7=Hu<00013M{Ml?001gbOjJbx000;l86zSlDJdyBIX*l(KS4l1 zLqbMHMMYCmR#jD1S5{hCSy^swZg}atJpcdz0d!JMQvg8b*k%9#0NY7KK~zY`?bAI9 z!axuO;D;lm_XK)_g;9$I!B$%l4-iO^Dv&}XWsb7l66+MXL4Q~)TfK{=Gw}xmv5>s( z4If(!J3yarW@v!vn~rr1N|*P(%9#(MgB-}oUNlWEU!Wr|6xcVl2G#YVz^OynFgu%u^ceSs7=k2L=K3{k`*B4{y+8kv*_CeV9)BC6UeGVA!i^5W1tIw zK?j^ASUiBpoQ3Ycer6o_mkLF+OFCcxZF;A3E<_5e;KNEk5PWxgzZ aev=zDtvcEW$;fR00000%X=h6_*`Bpy@s#~XKV;b%Dk5f};t TA?!hr00000NkvXXu0mjfnGHSE delta 224 zcmX@e_=j()+*x_<~Rj6z)&xuGThXyT!;%7W6jK_LrI$Y>7XqHrJ zNYUNJpzWf-;K_X=Ktxv|dm^ioBa??;dO7Zm6f1oo`xWD8G908>YsI`;45b=s}P=DNk@J3oITnGT2Lh(kV zMu=gJ080j30~CuT004(I!j?guuO&3epshu&6OhgqqYa%?7Ld*^-E)@|$a48>&kEUF$H3f{X;5R<=G-p|n%%8| z+Gs#$yzRKFk$f#M+Zn;^0d1Uq{74Q-z_h(RnmzFBoXKGjkS*9{;Jtk=U{mj9U^k~1 zz*l?Vd75qH5?oxuq=y-uai4h!UYVW*&6=RcME%YsP9}n_j|j7wrSrQSfg_;&THwAP Xj1pUE|AAcn00000NkvXXu0mjf14_G% delta 372 zcmaFDyoPy#W4&~MPl&6&o}rVYi=u*3NN_+}YNCX=q_UElxtRq61A~^0$ORz9SrX(I z{2vM!g8eImK!ODxk;M!Qe1}1p@p%4<6b1%HR!6cp39*bI#YIya5+2;=Su{mR zL`pbyN$@FMDMz^*d&E-SJWEe=kPELkDSdF8^M-tG#?1mB)F;g6+BE0Dv-^7v{bE_6 zP#0y=q*AeEMG}jJN=7!ndOoYXK$C!hA_t>zQ#^NH^SNzviY^syS-OCAQ(Q@TKzn;) zaBA-4?^$*)PDW|1cx6@jp+|w6{mZdi)2~ce)b%v$Qi5v9i@D){xtkl(SvX~XeR#mV zmdKI;Vst09n8=KmY&$ delta 261 zcmX@iIF)IFL_G&H0|SH0lCEPwim^Dz-HBn{IhmJ04okYDuOkD)#(wTUiL5}rP=HT} ztAx0uzMi3zqf1(9Vn}cRP}tyDaWIf#D+%%o{tp5SoA)o-4;0}n@Q5sCVBk9p!i>lB zSEK+1t2|vCLoEE?P6*^Xs=&cg&RF-p{^@ou`AasJxJwop&gSblTJ=zPQagi9o(!fU*(~tYWo*xpm^e1`L*wa96$4YzXx;%gQu&X%Q~loCIF)) BUr7J} diff --git a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json index e0d437b8ece..afdd4120b55 100644 --- a/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Armor/security_slim.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/6665eec76c98a4f3f89bebcd10b34b47dcc0b8ae", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..5eadcdc1c1ab3fbd2bf67c5055286b407e2e4a60 GIT binary patch literal 9460 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/icon.png rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/icon.png diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json similarity index 100% rename from Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/meta.json rename to Resources/Textures/Clothing/OuterClothing/WinterCoats/bc_corpo_jacket.rsi/meta.json diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_bishop_cybernetics.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 35003686d555624fcac17b387f726605cd147bd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10509 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_cybersun.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index fe470b0074272a504eac30798883e5e2c6c5e027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9875 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_discount_dans.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 06932fff6fa7370f5410813dea7991e4cf15cae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10492 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 diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_einstein_engines.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 553d9e2f64723d236c10d8feeb56c23836529b00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9782 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 LZBvHT-ot+bfr+RI diff --git a/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/WinterCoats/corpo_jacket_five_points_armory.rsi/equipped-OUTERCLOTHING.png deleted file mode 100644 index 19b5dc75afffdae7d345415572ef0d33fb92b869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10959 zcmeHNcU)7+_P_LE0TmS$0Z|tO11Xdw0#OkaT|ns~$c7XQEkHtz5WB0QtOc7E8!XUZX*M$>;i6P}liPBOZg2kc4J|Ydk1uP*(xhbWmtVrsgUF z_1B=tPktv>LC{Wc_vO0D%6gk7S|5ef$6&#DB-#*syve9ZIm`JQ3@B=qM7LdHGtemWjyquhzf`Yu_OqE$PXUv$nXzn~Em8FX{)R!(+ zQ`20budS)IdbygKj>)RkNR*+Wp@ufj42w3^#~7l;Oe7Q(6lTttsXA+xDtejPGW4JR zzz?B0@?x2!B(xyOITBKHB;coz29Q%mV)8Qu1>8$YNz2H}$tx(%00cS8Voga&N=wPe zNK1p>NYD>S&yktC47E;n-gcs#R-g)c->D?|-kX4N9>R}z06KSbM_GUg%_F+?RW zv@7K|!bi@8+;~mnp(A|G1p!a*Wl3L8Iitr+x7{vyW$FA7>n+D-T->?*WQB&HXqF5jrS)~G@1EB0(gJPaLj$V#?+ZT?#u45f58-`Gm$I_K)$VAidt3$dl^mRb8V4f&}(9abWx{B!X&o zJlj*(>4Y95-|gM?43m&VO5I>jW5S#C>Q_t|mF;W46{q4uNo>E!WTEzpfqO6{+tp^? zQjv8T=WsgODa9r*Rh{M=!8us45{Be+8wizAmHf+z1Eti){KE36k#@Jkrvg8O^YpvA zdt+QXh7IQW4sd?M09BOQrsf2U2N(C6d>rZ>&YD=Mcs6hj|5z>O1EVFQB6D53K7Y6; z|5C)Sal&gKqXeY`gA=&&z}{}R;Ab5ENnRpoXuyFbPcKxw&r@NSrcNlq5GAW1YO%h4 zI&ZK}4Xd`{eynz`Euzlm@e_f^D`9W!N787h7j8s7w#v;dd`Xmh9e0mIbxj8h&BJ_v zp{L0L9x!{L#CwOd51&XYxlq{H{fUCV^>iyQPIsrCN7aW3DHuX23A|wFj+#T@3fhxY*?9(ROQ{CK!M^a~7al#`KoGn$HQN*uCH2+r8ZjT0!-N3d7_GEG% z<>R<{Lm8ta%+A)-|&HH#^AuFqGhim8q z9^afh#9mXz?e8uoNOkUrWec{7F0fm8LhqiEZLwDCt`DwcWxQ!A?N`3GDAnAl+skKU z)>hGuC_=^UEPc}x9R04gBHivXZoTourI5BFA8otH1m{KN>}!4pQgt1cFZxtF7C+i? zD&yy~?fI$n7mL*;VCei2;T;&N%Q)CiKgelbAkY}6*GE-yL_2(ef8Xae3H9ht9&q0j zRSHfB_%Ni7iWabHQjhy`npX)ldd!g9hp z521HcpLv?_5|HujSb|sFgiEmri&eWRH`_HO-2FqgUv!Iw(iVfuu4bWQ>T$q8&L>D z3UWd`41KT_vvo|+SVBUKsq$~8nWtP+N%Ry_lTK&YxTm|y`T zbq|YXWvV;e;AAh4o3-EJ+N;L8Pv^h}>f=om zvL6yMf2!h-Xm~Xa_&1&$&Ajf&cT^E9a!T#~shQK2r)xhQeUYEUq_}4ZV+)>fVzBE=K`O5cXs#HWBoA> zU$pu6b;_!A8&AYEm~xwZ>tdSA8Hs)Av1WxObt8K&<&uh4Wg{uTx&9#8$>4zw`cOuM z|0!Wos|e%@busV2aJF~-Wo*p8c7v~7N@zN5FX)g ziWBfm%D8>q#i*W0p9@8|1R8OIGQr>kwiqQcG6JdLeM(+?RrLF73zO`Q>D)N+hxu&g zn>WHcuY|2-=Rs5lJAvZr-=%WQngts5BCp;(*?JmJCb#8Gnq90_PzeJcyIlUh)hEwy z>D#w#%(ugJ6Q3O`fFVp2`+#b(nXn_Zj@=;CO}7J?9O9YcvB1{juZw>tv|Vamo?s*I zjQ`t_vUM(;}oWW*!KAz!|TFtJ}tbNHgMJ-W%BNb|REBD@W-jn