From be50544252d46386af44fd3cec3b6aad12f0308f Mon Sep 17 00:00:00 2001 From: scrivoy <179060466+scrivoy@users.noreply.github.com> Date: Tue, 1 Apr 2025 22:30:38 +0200 Subject: [PATCH 001/622] remove wizard robes --- Resources/Maps/meta.yml | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/Resources/Maps/meta.yml b/Resources/Maps/meta.yml index bfd02ba6de..6ceb9c2f1c 100644 --- a/Resources/Maps/meta.yml +++ b/Resources/Maps/meta.yml @@ -4,8 +4,8 @@ meta: engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 03/29/2025 04:10:56 - entityCount: 28717 + time: 04/01/2025 20:20:48 + entityCount: 28713 maps: - 951 grids: @@ -67929,13 +67929,6 @@ entities: - type: Transform pos: -7.4309044,-16.489243 parent: 5350 -- proto: ClothingHeadHatRedwizard - entities: - - uid: 6128 - components: - - type: Transform - pos: -50.70865,-38.195942 - parent: 5350 - proto: ClothingHeadHatSkub entities: - uid: 10493 @@ -68012,13 +68005,6 @@ entities: - type: Transform pos: -40.532333,-25.270031 parent: 5350 -- proto: ClothingHeadHatWizard - entities: - - uid: 17456 - components: - - type: Transform - pos: -50.3649,-38.227192 - parent: 5350 - proto: ClothingHeadHelmetBasic entities: - uid: 4235 @@ -68584,20 +68570,6 @@ entities: - type: Transform pos: 35.48533,-43.42037 parent: 5350 -- proto: ClothingOuterWizard - entities: - - uid: 804 - components: - - type: Transform - pos: -50.349274,-38.461567 - parent: 5350 -- proto: ClothingOuterWizardRed - entities: - - uid: 23047 - components: - - type: Transform - pos: -50.70865,-38.445942 - parent: 5350 - proto: ClothingShoesBootsJackFilled entities: - uid: 5435 From 5d62d6074932867a111c2a99afbf71759aea9e05 Mon Sep 17 00:00:00 2001 From: scrivoy <179060466+scrivoy@users.noreply.github.com> Date: Thu, 3 Apr 2025 08:35:22 +0200 Subject: [PATCH 002/622] add two fake wizard hats --- Resources/Maps/meta.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Resources/Maps/meta.yml b/Resources/Maps/meta.yml index 6ceb9c2f1c..541611f192 100644 --- a/Resources/Maps/meta.yml +++ b/Resources/Maps/meta.yml @@ -4,8 +4,8 @@ meta: engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 04/01/2025 20:20:48 - entityCount: 28713 + time: 04/03/2025 06:30:39 + entityCount: 28715 maps: - 951 grids: @@ -68005,6 +68005,18 @@ entities: - type: Transform pos: -40.532333,-25.270031 parent: 5350 +- proto: ClothingHeadHatWizardFake + entities: + - uid: 804 + components: + - type: Transform + pos: -50.66044,-38.362316 + parent: 5350 + - uid: 6128 + components: + - type: Transform + pos: -50.344055,-38.625935 + parent: 5350 - proto: ClothingHeadHelmetBasic entities: - uid: 4235 From a8e347c6066f7d0b563c7f0040f40173a802be2e Mon Sep 17 00:00:00 2001 From: Damn Feds <20566341+K-Dynamic@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:17:38 +1200 Subject: [PATCH 003/622] increase sec count to 6 --- Resources/Prototypes/Maps/bagel.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Maps/bagel.yml b/Resources/Prototypes/Maps/bagel.yml index 793dfc5b21..f704019442 100644 --- a/Resources/Prototypes/Maps/bagel.yml +++ b/Resources/Prototypes/Maps/bagel.yml @@ -16,7 +16,7 @@ - type: StationEmergencyShuttle emergencyShuttlePath: /Maps/Shuttles/emergency_lox.yml - type: StationJobs - availableJobs: + availableJobs: # 60 jobs total w/o latejoins & interns, 77 jobs total w/ latejoins & interns #command Captain: [ 1, 1 ] #service @@ -43,10 +43,10 @@ ResearchDirector: [ 1, 1 ] Scientist: [ 5, 5 ] ResearchAssistant: [ 4, 4 ] - #security + #security (10) HeadOfSecurity: [ 1, 1 ] Warden: [ 1, 1 ] - SecurityOfficer: [ 4, 4 ] + SecurityOfficer: [ 6, 6 ] Detective: [ 1, 1 ] SecurityCadet: [ 4, 4 ] Lawyer: [ 2, 2 ] From ee90926ccdf74d7805101a9ff9389871138bef5a Mon Sep 17 00:00:00 2001 From: Kirby <205904127+154942@users.noreply.github.com> Date: Thu, 10 Apr 2025 15:34:48 -0400 Subject: [PATCH 004/622] Changes the name of the Detectives suitskirts from "... suit" to "... suitskirt" (#36436) * Changes the name of the detectives skirts * Whoops. Didn't mean to delete that --- .../Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index d44880c5be..13f8cc5767 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -133,7 +133,7 @@ - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtDetective - name: hard-worn suit + name: hard-worn suitskirt description: Someone who wears this means business. components: - type: Sprite @@ -144,7 +144,7 @@ - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtDetectiveGrey - name: noir suit + name: noir suitskirt description: A hard-boiled private investigator's grey suit, complete with tie clip. components: - type: Sprite From ddaa62c685328643ca8ef0a9588a8f30a1dd533e Mon Sep 17 00:00:00 2001 From: Silicon14 <129602789+SiLiCoN14WasTaken@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:04:10 +0200 Subject: [PATCH 005/622] Change ambuzol plus guidebook entry to match recipe. (#36444) change ambuzol plus guidebook entry to match recipe --- Resources/Locale/en-US/reagents/meta/medicine.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/reagents/meta/medicine.ftl b/Resources/Locale/en-US/reagents/meta/medicine.ftl index 9e5dcc88d4..efde6c6cf6 100644 --- a/Resources/Locale/en-US/reagents/meta/medicine.ftl +++ b/Resources/Locale/en-US/reagents/meta/medicine.ftl @@ -59,7 +59,7 @@ reagent-name-ambuzol = ambuzol reagent-desc-ambuzol = A highly engineered substance able to halt the progression of a zombie infection. reagent-name-ambuzol-plus = ambuzol plus -reagent-desc-ambuzol-plus = Further engineered with the blood of the infected, inoculates the living against the infection. +reagent-desc-ambuzol-plus = Further engineered with omnizine, inoculates the living against the infection. reagent-name-pulped-banana-peel = pulped banana peel reagent-desc-pulped-banana-peel = Pulped banana peels have some effectiveness against bleeding. From a96fd7e08f9d10a52617bf4e52a5033c4df64c38 Mon Sep 17 00:00:00 2001 From: Myra Date: Thu, 10 Apr 2025 22:10:26 +0200 Subject: [PATCH 006/622] New "PR made on master" message (#36441) * New "PR made on master" message * Update close-master-pr.yml * Sponsored by languagetool * Update close-master-pr.yml * Update close-master-pr.yml --- .github/workflows/close-master-pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-master-pr.yml b/.github/workflows/close-master-pr.yml index 51ce874dd0..42e512d556 100644 --- a/.github/workflows/close-master-pr.yml +++ b/.github/workflows/close-master-pr.yml @@ -12,7 +12,7 @@ jobs: steps: - uses: superbrothers/close-pull-request@v3 with: - comment: "Thank you for contributing to the Space Station 14 repository. Unfortunately, it looks like you submitted your pull request from the master branch. We suggest you follow [our git usage documentation](https://docs.spacestation14.com/en/general-development/setup/git-for-the-ss14-developer.html) \n\n You can move your current work from the master branch to another branch by doing `git branch Date: Fri, 11 Apr 2025 00:22:17 +0200 Subject: [PATCH 007/622] Decrease Syndicate raid suit size, add bundle backpack (#35890) Decreased Syndicate raid suit size, add bundle backpack --- .../Catalog/Fills/Backpacks/backpack.yml | 20 +++++++++++++++++++ .../Catalog/Fills/Backpacks/duffelbag.yml | 13 ------------ .../Prototypes/Catalog/uplink_catalog.yml | 2 +- .../Entities/Clothing/OuterClothing/armor.yml | 2 ++ Resources/migration.yml | 3 +++ 5 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 Resources/Prototypes/Catalog/Fills/Backpacks/backpack.yml diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/backpack.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/backpack.yml new file mode 100644 index 0000000000..4713d8d5bd --- /dev/null +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/backpack.yml @@ -0,0 +1,20 @@ +- type: entity + parent: ClothingBackpackSyndicate + id: ClothingBackpackSyndicateBundle + abstract: true + components: + - type: Tag + tags: [] # ignore "WhitelistChameleon" tag + +- type: entity + parent: ClothingBackpackSyndicateBundle + id: ClothingBackpackSyndicateRaidBundle + name: syndicate raid suit bundle + description: "Contains the Syndicate's durable raid armor suit." + components: + - type: StorageFill + contents: + - id: ClothingOuterArmorRaid + - id: ClothingHeadHelmetRaid + - id: ClothingMaskGasSyndicate + - id: ClothingHandsGlovesCombat diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml index 4db627bdae..c898b4272c 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml @@ -226,19 +226,6 @@ - id: DoubleEmergencyOxygenTankFilled - id: DoubleEmergencyNitrogenTankFilled -- type: entity - parent: ClothingBackpackDuffelSyndicateBundle - id: ClothingBackpackDuffelSyndicateRaidBundle - name: syndicate raid suit bundle - description: "Contains the Syndicate's durable raid armor suit." - components: - - type: StorageFill - contents: - - id: ClothingOuterArmorRaid - - id: ClothingHeadHelmetRaid - - id: ClothingMaskGasSyndicate - - id: ClothingHandsGlovesCombat - - type: entity parent: ClothingBackpackDuffelSyndicateBundle id: ClothingBackpackDuffelSyndicateHardsuitBundle diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index f4f1d754c4..77ce1b3b01 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -1624,7 +1624,7 @@ name: uplink-syndie-raid-name description: uplink-syndie-raid-desc icon: { sprite: /Textures/Clothing/OuterClothing/Armor/syndie-raid.rsi, state: icon } - productEntity: ClothingBackpackDuffelSyndicateRaidBundle + productEntity: ClothingBackpackSyndicateRaidBundle cost: Telecrystal: 8 categories: diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 539cec9328..7835ace80f 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -179,6 +179,8 @@ - type: BatterySelfRecharger autoRecharge: true autoRechargeRate: 2 + - type: Item + size: Normal - type: entity parent: [ ClothingOuterBaseLarge, BaseMajorContraband, AllowSuitStorageClothing ] diff --git a/Resources/migration.yml b/Resources/migration.yml index 672c13103f..88cfc72c3d 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -575,3 +575,6 @@ PaxChemistryBottle: ChemistryBottlePax MuteToxinChemistryBottle: ChemistryBottleMuteToxin LeadChemistryBottle: ChemistryBottleLead ToxinChemistryBottle: ChemistryBottleToxin + +# 2025-03-29 +ClothingBackpackDuffelSyndicateRaidBundle: ClothingBackpackSyndicateRaidBundle From 3c5877edb6cc17284bddb69ab9524c80d94cdb03 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 10 Apr 2025 22:23:24 +0000 Subject: [PATCH 008/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8c3f1efb60..a4cb03d02e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Fixed expeditions on cave planets not having any ore. - type: Fix - id: 7649 - time: '2024-11-24T08:49:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32890 - author: slarticodefast changes: - message: Fixed doors not auto-closing correctly after being unbolted in an open @@ -3890,3 +3883,14 @@ id: 8148 time: '2025-04-10T15:59:18.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36273 +- author: SlamBamActionman + changes: + - message: The Syndicate Raid Bundle now comes in a Syndicate backpack instead of + duffelbag. + type: Tweak + - message: The Syndicate Raid Suit now has an inventory size of 2x2 (previously + 4x4). + type: Tweak + id: 8149 + time: '2025-04-10T22:22:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35890 From d50703d7a46059223ae921e086cfa0dab3dbe9cf Mon Sep 17 00:00:00 2001 From: Tiniest Shark Date: Thu, 10 Apr 2025 20:53:31 -0400 Subject: [PATCH 009/622] Hypospray Inhand Fix (#36452) * fixed the cmo hypospray inhands * whoops it was the gorlex one too --- .../Medical/hypospray.rsi/inhand-left.png | Bin 319 -> 321 bytes .../Medical/hypospray.rsi/inhand-right.png | Bin 319 -> 332 bytes .../Medical/syndihypo.rsi/inhand-left.png | Bin 272 -> 272 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Medical/hypospray.rsi/inhand-left.png index e2007ee06ab73b7b219f29cb59acdb1f27ab88ce..fd5b60fe29f41d94e14eb6e6c434974dc47c6552 100644 GIT binary patch delta 295 zcmV+?0oeY(0>J{1BYyw^b5ch_0Itp)=>Px#`$DH5dUC32F~%;pq3Ii-s+MyW=UmIN;+&J5v$X!PU8t%Z z@6VH+qZxsLl00000002O>+ALn8MM7_$$7`~9iA5*$PiAcr`jUKO!2D@BtaTPI t5o5HRvxtbKlpvP#9()Q39RL8J&@Z2qT8|t}jvW91002ovPDHLkV1m=khOz(v delta 293 zcmV+=0owk-0>1)~BYyz~Nkl$_90000006+o8<143 delta 10 RcmX@Zw4Z5$@@) diff --git a/Resources/Textures/Objects/Specific/Medical/syndihypo.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Medical/syndihypo.rsi/inhand-left.png index a38875627f625db24211be9a9f11423874adcafa..b6b2ec4c388d0f203d55921ade302a146f66218a 100644 GIT binary patch delta 222 zcmV<403rX70+0fbI)6P5gD?z+VYkZ8?8~wB8XbC#3>=9wFy$ETL={#25m8Ktc%KQR zU`L9{@`(Td00000oXo|esH)l{rPuqdpidOB_4%$UDJ7S^UOkHDn_b2r^EBA6_3!3s zuw@J%>vbhR#TMVAg(zaRPtK#}s_Gr!J+fW=5>dodwdzJy)mLo-0000000000z(I$E_dYg1=-34oS+BnxlZdzSHB)Q7JOg4cPcNySV)d!2saFnARTH%W000000001h zy1q(%Q{v|wj-gEMwUVN-O}6;?1Mg9NQ) Date: Thu, 10 Apr 2025 20:54:24 -0400 Subject: [PATCH 010/622] Add Aluminum Source (Cans) (#36449) * aluminium cans * shhhhh --- .../Objects/Consumable/Drinks/drinks_cans.yml | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index c1a6adbb68..d933cbcd1b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -14,11 +14,19 @@ - ReagentId: Cola Quantity: 30 maxVol: 30 + grindable: + reagents: # 5u -> 1/2 steel sheet (10u) + - ReagentId: Aluminium # Fun fact: soda can makeup is approx. 75% aluminium and 25% tin/iron. + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: MixableSolution solution: drink - type: SolutionTransfer canChangeTransferAmount: true maxTransferAmount: 15 + - type: Extractable + grindableSolutionName: grindable - type: UserInterface interfaces: enum.TransferAmountUiKey.Key: @@ -81,6 +89,12 @@ reagents: - ReagentId: Cola Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Tag tags: - Cola @@ -101,6 +115,12 @@ solutions: drink: maxVol: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Openable opened: true - type: Sprite @@ -129,6 +149,12 @@ reagents: - ReagentId: IcedTea Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/ice_tea_can.rsi - type: Item @@ -147,6 +173,12 @@ reagents: - ReagentId: LemonLime Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/lemon-lime.rsi - type: Item @@ -165,6 +197,12 @@ reagents: - ReagentId: LemonLimeCranberry Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/lemon-lime-cranberry.rsi - type: Item @@ -216,6 +254,12 @@ reagents: - ReagentId: GrapeSoda Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/purple_can.rsi - type: Item @@ -234,6 +278,12 @@ reagents: - ReagentId: RootBeer Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/rootbeer.rsi - type: Item @@ -255,6 +305,12 @@ reagents: - ReagentId: SodaWater Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/sodawater.rsi @@ -272,6 +328,12 @@ reagents: - ReagentId: SpaceMountainWind Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/space_mountain_wind.rsi - type: Item @@ -290,6 +352,12 @@ reagents: - ReagentId: SpaceUp Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/space-up.rsi - type: Item @@ -308,6 +376,12 @@ reagents: - ReagentId: SolDry Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/sol_dry.rsi - type: Item @@ -326,6 +400,12 @@ reagents: - ReagentId: Starkist Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/starkist.rsi - type: Item @@ -344,6 +424,12 @@ reagents: - ReagentId: TonicWater Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/tonic.rsi @@ -361,6 +447,12 @@ reagents: - ReagentId: FourteenLoko Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Sprite sprite: Objects/Consumable/Drinks/fourteen_loko.rsi - type: Item @@ -379,6 +471,12 @@ reagents: - ReagentId: ChangelingSting Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/changelingsting.rsi @@ -398,6 +496,12 @@ reagents: - ReagentId: DrGibb Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/dr_gibb.rsi @@ -421,6 +525,12 @@ Quantity: 20 - ReagentId: Ice Quantity: 5 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Tag tags: - DrinkCan @@ -443,6 +553,12 @@ reagents: - ReagentId: EnergyDrink Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/energy_drink.rsi @@ -515,6 +631,12 @@ reagents: - ReagentId: ShamblersJuice Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/shamblersjuice.rsi @@ -534,6 +656,12 @@ reagents: - ReagentId: PwrGame Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/pwrgame.rsi @@ -553,6 +681,12 @@ reagents: - ReagentId: Beer Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/beer_can.rsi @@ -575,6 +709,12 @@ reagents: - ReagentId: Wine Quantity: 30 + grindable: + reagents: + - ReagentId: Aluminium + Quantity: 4 + - ReagentId: Iron + Quantity: 1 - type: Drink - type: Sprite sprite: Objects/Consumable/Drinks/wine_can.rsi From be6753a9c34fd053e79d59e2988d67904d887198 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 00:55:32 +0000 Subject: [PATCH 011/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a4cb03d02e..e5835b012e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed doors not auto-closing correctly after being unbolted in an open - state. - type: Fix - id: 7650 - time: '2024-11-25T04:26:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33524 - author: Schrodinger71 changes: - message: Fixed a bug letting players type "ghost" in the console and then see @@ -3894,3 +3886,10 @@ id: 8149 time: '2025-04-10T22:22:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35890 +- author: EmoGarbage404 + changes: + - message: Grinding soda cans now gives a small amount of Aluminum. + type: Add + id: 8150 + time: '2025-04-11T00:54:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36449 From 05785e7d452668c3cba69d774cea359d83523b28 Mon Sep 17 00:00:00 2001 From: RedBookcase Date: Thu, 10 Apr 2025 17:57:41 -0700 Subject: [PATCH 012/622] Made the mosin major contraband, fixed uplink name. (#36446) Co-authored-by: RedBookcase --- Resources/Locale/en-US/store/uplink-catalog.ftl | 2 +- .../Entities/Objects/Weapons/Guns/Snipers/snipers.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 2080afe993..1d66bf3a8b 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -8,7 +8,7 @@ uplink-revolver-python-desc = A brutally simple, effective, and loud Syndicate r uplink-pistol-cobra-name = Cobra uplink-pistol-cobra-desc = A rugged, robust operator handgun with inbuilt silencer. Uses pistol magazines (.25 caseless). -uplink-rifle-mosin-name = Surplus Rifle +uplink-rifle-mosin-name = Kardashev-Mosin uplink-rifle-mosin-desc = A bolt action service rifle that has seen many wars. Not modern by any standard, hand loaded, and terrible recoil, but it is cheap. uplink-esword-name = Energy Sword diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index 23dc96c49f..e8f26cac89 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -40,7 +40,7 @@ - type: entity name: Kardashev-Mosin - parent: [BaseWeaponSniper, BaseGunWieldable, BaseSyndicateContraband] + parent: [BaseWeaponSniper, BaseGunWieldable, BaseMajorContraband] id: WeaponSniperMosin description: A weapon for hunting, or endless trench warfare. Uses .30 rifle ammo. components: From 55bc0058f4dcf251834e1720fa635188772c8fd4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 00:58:48 +0000 Subject: [PATCH 013/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e5835b012e..651a369bfe 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Schrodinger71 - changes: - - message: Fixed a bug letting players type "ghost" in the console and then see - the whole chat while being in the lobby. - type: Fix - id: 7651 - time: '2024-11-25T07:20:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33529 - author: Minemoder changes: - message: The shark plushie now goes rawr when hitting something or being thrown. @@ -3893,3 +3885,10 @@ id: 8150 time: '2025-04-11T00:54:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36449 +- author: RedBookcase + changes: + - message: The Kardashev-Mosin is now considered Major Contraband. + type: Tweak + id: 8151 + time: '2025-04-11T00:57:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36446 From 0977b742948218534e40394c5438f04ec3156127 Mon Sep 17 00:00:00 2001 From: Ethan_k Date: Thu, 10 Apr 2025 18:12:13 -0700 Subject: [PATCH 014/622] Zombies can no longer Suicide take 2 (#36453) * I did it right * Update Content.Server/Zombies/ZombieSystem.Transform.cs Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Content.Server/Zombies/ZombieSystem.Transform.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 155796481b..48954db4f1 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -63,7 +63,7 @@ public sealed partial class ZombieSystem [Dependency] private readonly NameModifierSystem _nameMod = default!; private static readonly ProtoId InvalidForGlobalSpawnSpellTag = "InvalidForGlobalSpawnSpell"; - + private static readonly ProtoId CannotSuicideTag = "CannotSuicide"; /// /// Handles an entity turning into a zombie when they die or go into crit /// @@ -294,5 +294,6 @@ public sealed partial class ZombieSystem //Need to prevent them from getting an item, they have no hands. // Also prevents them from becoming a Survivor. They're undead. _tag.AddTag(target, InvalidForGlobalSpawnSpellTag); + _tag.AddTag(target, CannotSuicideTag); } } From 1100807944e90dc93bb919fa748381833683fd07 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 01:13:20 +0000 Subject: [PATCH 015/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 651a369bfe..c23374f764 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Minemoder - changes: - - message: The shark plushie now goes rawr when hitting something or being thrown. - type: Tweak - id: 7652 - time: '2024-11-25T12:23:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33540 - author: red15 changes: - message: Vending machine lights turns off when broken. @@ -3892,3 +3885,10 @@ id: 8151 time: '2025-04-11T00:57:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36446 +- author: Nukesthestation + changes: + - message: Zombies /suicideing return to an ai state + type: Tweak + id: 8152 + time: '2025-04-11T01:12:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36453 From 262e7ae904ead4546942c32389acd4311c23abcb Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Fri, 11 Apr 2025 03:15:20 +0200 Subject: [PATCH 016/622] fix cargo products (#36447) --- Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml | 4 ---- Resources/Prototypes/Catalog/Cargo/cargo_engines.yml | 2 -- Resources/Prototypes/Catalog/Cargo/cargo_vending.yml | 2 -- 3 files changed, 8 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml index c85210adf6..e3079f24d4 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml @@ -79,9 +79,7 @@ group: market #- type: cargoProduct -# name: "water vapor canister" # id: AtmosphericsWaterVapor -# description: "Water vapor canister" # icon: # sprite: Structures/Storage/canister.rsi # state: water_vapor @@ -101,9 +99,7 @@ group: market #- type: cargoProduct -# name: "tritium canister" # id: AtmosphericsTritium -# description: "Tritium canister" # icon: # sprite: Structures/Storage/canister.rsi # state: green diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml index 75a1e24cdf..96a9931f2f 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml @@ -29,9 +29,7 @@ group: market - type: cargoProduct - name: "emitter crate" id: EngineSingularityEmitter - description: "Contains an emitter. Used only for dangerous applications." icon: sprite: Structures/Power/Generation/Singularity/emitter.rsi state: emitter2 diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index b8dd035e4f..25c3936406 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -18,7 +18,6 @@ - type: cargoProduct id: CrateVendingMachineRestockChefvend - name: ChefVend restock crate icon: sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base @@ -59,7 +58,6 @@ - type: cargoProduct id: CrateVendingMachineRestockCondimentStation - name: condiment station restock crate icon: sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base From 812d47bb2d5c61a711268ce875fedffcc6a439f6 Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Fri, 11 Apr 2025 01:56:02 +0000 Subject: [PATCH 017/622] Choose correct state when rendering entities (#36409) --- Content.MapRenderer/Painters/EntityPainter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.MapRenderer/Painters/EntityPainter.cs b/Content.MapRenderer/Painters/EntityPainter.cs index 2c70481b8a..0eef467f9a 100644 --- a/Content.MapRenderer/Painters/EntityPainter.cs +++ b/Content.MapRenderer/Painters/EntityPainter.cs @@ -102,7 +102,7 @@ public sealed class EntityPainter var frames = stateCount / entity.Sprite.GetLayerDirectionCount(layer); var target = direction * frames; var targetY = target / statesX; - var targetX = target % statesY; + var targetX = target % statesX; return (targetX * rsi.Size.X, targetY * rsi.Size.Y, rsi.Size.X, rsi.Size.Y); } From 97e8c4d5064add96cbe01d6b60b4923056481939 Mon Sep 17 00:00:00 2001 From: YoungThug Date: Thu, 10 Apr 2025 19:06:47 -0700 Subject: [PATCH 018/622] Wizard added in all at once! (#36408) SpeedMergePlease --- Resources/Prototypes/game_presets.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index 3df262096b..160bb5e4a0 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -39,6 +39,7 @@ - Traitor - Revolutionary - Zombie + - Wizard - KesslerSyndromeScheduler - RampingStationEventScheduler - SpaceTrafficControlEventScheduler @@ -59,6 +60,7 @@ - Traitor - Revolutionary - Zombie + - Wizard - BasicStationEventScheduler - KesslerSyndromeScheduler - MeteorSwarmMildScheduler From b2c05b807d3822d44421db78f58007d9cf983a88 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 02:07:53 +0000 Subject: [PATCH 019/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c23374f764..08ee14a601 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: red15 - changes: - - message: Vending machine lights turns off when broken. - type: Fix - id: 7653 - time: '2024-11-25T12:35:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33513 - author: metalgearsloth changes: - message: Adjusted the top menu on the separated game screen. The buttons will @@ -3892,3 +3885,10 @@ id: 8152 time: '2025-04-11T01:12:13.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36453 +- author: YoungThugSS14 + changes: + - message: Wizards now appear roundstart in the "all at once" gamemode. + type: Tweak + id: 8153 + time: '2025-04-11T02:06:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36408 From 3f0ca9b786fc739a3d3862be652b247759e457e4 Mon Sep 17 00:00:00 2001 From: Dinner <180707738+DinnerCalzone@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:10:03 -0400 Subject: [PATCH 020/622] Fix gas mixers and pneumatic valves being hidden by floor tiles (#36428) fix gas mixers and pneumatics valves being hidden by floor tiles --- .../Entities/Structures/Piping/Atmospherics/trinary.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml index c44f700e7f..daeab2dd19 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml @@ -134,6 +134,9 @@ placement: mode: SnapgridCenter components: + - type: SubFloorHide + visibleLayers: + - enum.SubfloorLayers.FirstLayer - type: Sprite sprite: Structures/Piping/Atmospherics/gasmixer.rsi layers: @@ -233,6 +236,8 @@ - type: SubFloorHide blockInteractions: false blockAmbience: false + visibleLayers: + - enum.SubfloorLayers.FirstLayer - type: NodeContainer nodes: inlet: From 6d2f5a68446fd2501fac23487de03accea79539c Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 02:11:10 +0000 Subject: [PATCH 021/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 08ee14a601..3672996333 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Adjusted the top menu on the separated game screen. The buttons will - now form multiple rows and no longer overflow into the viewport. - type: Tweak - id: 7654 - time: '2024-11-26T00:59:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33047 - author: slarticodefast changes: - message: Added the greytide virus station event. It will bolt open all doors in @@ -3892,3 +3884,10 @@ id: 8153 time: '2025-04-11T02:06:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36408 +- author: DinnerCalzone + changes: + - message: Fixed gas mixers and pneumatic valves being hidden by floor tiles. + type: Fix + id: 8154 + time: '2025-04-11T02:10:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36428 From 4006914e354b59ee942777ab4c78aeebd1d40157 Mon Sep 17 00:00:00 2001 From: Nox Date: Thu, 10 Apr 2025 19:15:26 -0700 Subject: [PATCH 022/622] Descriptions for .25 caseless (#36385) * Initial commit: added descriptions to ammo boxes, cartridges, and magazines, and modified the cobra pistol's description. * Updated magazine descriptions slightly * Updated descriptions according to Roomba's feedback * Minor updates * Minor fixes * Minor touch-up * I should stop making tiny changes. * Update Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml | 2 ++ .../Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml | 4 +++- .../Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml | 2 ++ .../Entities/Objects/Weapons/Guns/Pistols/pistols.yml | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml index 89ac57e9f6..bc9cdd68cf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml @@ -29,6 +29,7 @@ parent: BaseMagazineBoxCaselessRifle id: MagazineBoxCaselessRifle name: ammunition box (.25 caseless) + description: A cardboard box of .25 caseless rounds. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgeCaselessRifle @@ -43,6 +44,7 @@ parent: BaseMagazineBoxCaselessRifle id: MagazineBoxCaselessRiflePractice name: ammunition box (.25 caseless practice) + description: A cardboard box of .25 caseless rounds. Intended to hold non-harmful chalk ammunition. components: - type: BallisticAmmoProvider proto: CartridgeCaselessRiflePractice diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml index 649c0d4542..fd465b71d6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml @@ -1,6 +1,6 @@ - type: entity id: BaseCartridgeCaselessRifle - name: cartridge (.25 rifle) + name: cartridge (.25 caseless) parent: [ BaseCartridge, BaseSecurityContraband ] abstract: true components: @@ -25,6 +25,7 @@ id: CartridgeCaselessRifle name: cartridge (.25 caseless) parent: BaseCartridgeCaselessRifle + description: A small caliber utilizing caseless technology, omitting conventional brass casing in favor of hardened propellant. Standard kinetic ammunition is common and useful in most situations. components: - type: CartridgeAmmo proto: BulletCaselessRifle @@ -33,6 +34,7 @@ id: CartridgeCaselessRiflePractice name: cartridge (.25 caseless practice) parent: BaseCartridgeCaselessRifle + description: A small caliber utilizing caseless technology, omitting conventional brass casing in favor of hardened propellant. Chalk ammunition is generally non-harmful, used for practice. components: - type: CartridgeAmmo proto: BulletCaselessRiflePractice diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml index 7361bc09c7..c0af2b67e1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml @@ -100,6 +100,7 @@ id: MagazinePistolCaselessRifle name: "pistol magazine (.25 caseless)" parent: BaseMagazinePistolCaselessRifle + description: 10-round magazine for the Cobra pistol. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgeCaselessRifle @@ -120,6 +121,7 @@ id: MagazinePistolCaselessRiflePractice name: "pistol magazine (.25 caseless practice)" parent: BaseMagazinePistolCaselessRifle + description: 10-round magazine for the Cobra pistol. Intended to hold non-harmful chalk ammunition. components: - type: BallisticAmmoProvider proto: CartridgeCaselessRiflePractice diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 2ace44189e..375045e400 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -140,7 +140,7 @@ name: cobra parent: [ BaseWeaponPistol, BaseSyndicateContraband ] id: WeaponPistolCobra - description: A rugged, robust operator handgun with inbuilt silencer. Uses .25 caseless ammo. + description: Integrally suppressed semi-automatic pistol used by the Syndicate, firing caseless subsonic rounds. Favored by any agent who likes to keep things quiet and leave no evidence behind. Feeds from .25 pistol magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/cobra.rsi From 3a27de3f7edcb34394c937504d0fdb7f3dbcfe75 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 02:16:33 +0000 Subject: [PATCH 023/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3672996333..b43f981127 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Added the greytide virus station event. It will bolt open all doors in - a few randomly chosen departments and unlock lockers with the corresponding - access. - type: Add - id: 7655 - time: '2024-11-26T13:50:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33547 - author: slarticodefast changes: - message: Fixed space ambient music not playing. @@ -3891,3 +3882,11 @@ id: 8154 time: '2025-04-11T02:10:03.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36428 +- author: Nox38, BurgerMoth, ArtisticRoomba + changes: + - message: Added descriptions for all .25 caseless cartridges, magazines, and ammo + boxes. + type: Add + id: 8155 + time: '2025-04-11T02:15:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36385 From 680544a53a8780d23aa357be650b3a3a3f6a5479 Mon Sep 17 00:00:00 2001 From: Nox Date: Thu, 10 Apr 2025 21:58:33 -0700 Subject: [PATCH 024/622] Descriptions for .45 magnum (#36383) * Initial commit: added descriptions to revolvers, N1984, speedloaders, cartridges, and ammo boxes. * Updated descriptions in accordance with Slarti and Roomba's suggestions. * Oops, did a misclick! * Updated Mateba description slightly * Slightly updated pirate revolver description * Updated Mateba description * Updated Mateba description again * Fixed a last occurence of restricted in AP bullets --- .../Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml | 5 +++++ .../Weapons/Guns/Ammunition/Cartridges/magnum.yml | 6 +++++- .../Weapons/Guns/Ammunition/Magazines/magnum.yml | 5 +++++ .../Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml | 6 ++++++ .../Entities/Objects/Weapons/Guns/Pistols/pistols.yml | 4 ++-- .../Objects/Weapons/Guns/Revolvers/revolvers.yml | 10 +++++----- 6 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml index 6ccf0a1e2a..bee7b33749 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml @@ -28,6 +28,7 @@ parent: BaseMagazineBoxMagnum id: MagazineBoxMagnum name: ammunition box (.45 magnum) + description: A cardboard box of .45 magnum rounds. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnum @@ -42,6 +43,7 @@ parent: BaseMagazineBoxMagnum id: MagazineBoxMagnumPractice name: ammunition box (.45 magnum practice) + description: A cardboard box of .45 magnum rounds. Intended to hold non-harmful chalk ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumPractice @@ -57,6 +59,7 @@ id: MagazineBoxMagnumIncendiary parent: BaseMagazineBoxMagnum name: ammunition box (.45 magnum incendiary) + description: A cardboard box of .45 magnum rounds. Intended to hold self-igniting incendiary ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumIncendiary @@ -72,6 +75,7 @@ id: MagazineBoxMagnumUranium parent: BaseMagazineBoxMagnum name: ammunition box (.45 magnum uranium) + description: A cardboard box of .45 magnum rounds. Intended to hold exotic uranium-core ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumUranium @@ -87,6 +91,7 @@ id: MagazineBoxMagnumAP parent: BaseMagazineBoxMagnum name: ammunition box (.45 magnum armor-piercing) + description: A cardboard box of .45 magnum rounds. Intended to hold rare armor-piercing ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumAP diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml index 383d2adac7..c7adfb5b1e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml @@ -22,6 +22,7 @@ id: CartridgeMagnum name: cartridge (.45 magnum) parent: BaseCartridgeMagnum + description: Heavy magnum cartridge mostly used by revolvers. Standard kinetic ammunition is common and useful in most situations. components: - type: CartridgeAmmo proto: BulletMagnum @@ -30,6 +31,7 @@ id: CartridgeMagnumPractice name: cartridge (.45 magnum practice) parent: BaseCartridgeMagnum + description: Heavy magnum cartridge mostly used by revolvers. Chalk ammunition is generally non-harmful, used for practice. components: - type: CartridgeAmmo proto: BulletMagnumPractice @@ -45,6 +47,7 @@ id: CartridgeMagnumIncendiary name: cartridge (.45 magnum incendiary) parent: BaseCartridgeMagnum + description: Heavy magnum cartridge mostly used by revolvers. Incendiary ammunition contains a self-igniting compound that sets the target ablaze. components: - type: CartridgeAmmo proto: BulletMagnumIncendiary @@ -60,6 +63,7 @@ id: CartridgeMagnumAP name: cartridge (.45 magnum armor-piercing) parent: BaseCartridgeMagnum + description: Heavy magnum cartridge mostly used by revolvers. Armor piercing ammunition is renowned for its ability to cut straight through body armor. components: - type: CartridgeAmmo proto: BulletMagnumAP @@ -75,6 +79,7 @@ id: CartridgeMagnumUranium name: cartridge (.45 magnum uranium) parent: BaseCartridgeMagnum + description: Heavy magnum cartridge mostly used by revolvers. Uranium ammunition replaces the lead core of the bullet with fissile material, irradiating the target from the inside. components: - type: CartridgeAmmo proto: BulletMagnumUranium @@ -85,4 +90,3 @@ - state: tip map: [ "enum.AmmoVisualLayers.Tip" ] color: "#65fe08" - diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml index 91a3e4f360..d94bc444a7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml @@ -52,6 +52,7 @@ name: pistol magazine (.45 magnum any) suffix: empty parent: BaseMagazineMagnum + description: 7-round single stack pistol magazine. components: - type: BallisticAmmoProvider proto: null @@ -66,6 +67,7 @@ id: MagazineMagnum name: pistol magazine (.45 magnum) parent: BaseMagazineMagnum + description: 7-round single stack pistol magazine. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnum @@ -80,6 +82,7 @@ id: MagazineMagnumPractice name: pistol magazine (.45 magnum practice) parent: BaseMagazineMagnum + description: 7-round single stack pistol magazine. Intended to hold non-harmful chalk ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumPractice @@ -94,6 +97,7 @@ id: MagazineMagnumUranium name: pistol magazine (.45 magnum uranium) parent: BaseMagazineMagnum + description: 7-round single stack pistol magazine. Intended to hold exotic uranium-core ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumUranium @@ -108,6 +112,7 @@ id: MagazineMagnumAP name: pistol magazine (.45 magnum armor-piercing) parent: BaseMagazineMagnum + description: 7-round single stack pistol magazine. Intended to hold rare armor-piercing ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumAP diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml index 3044b1f9ff..9976c88314 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml @@ -23,6 +23,7 @@ id: SpeedLoaderMagnum name: "speed loader (.45 magnum)" parent: BaseSpeedLoaderMagnum + description: Designed to quickly refill an empty revolver, it fits up to six rounds. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnum @@ -43,6 +44,7 @@ id: SpeedLoaderMagnumEmpty name: "speed loader (.45 magnum any)" parent: SpeedLoaderMagnum + description: Designed to quickly refill an empty revolver, it fits up to six rounds for the big iron on your hip. #Big Iron reference (duh) components: - type: BallisticAmmoProvider proto: null @@ -61,6 +63,7 @@ id: SpeedLoaderMagnumIncendiary name: "speed loader (.45 magnum incendiary)" parent: SpeedLoaderMagnum + description: Designed to quickly refill an empty revolver, it fits up to six rounds. Intended to hold self-igniting incendiary ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumIncendiary @@ -69,6 +72,7 @@ id: SpeedLoaderMagnumPractice name: "speed loader (.45 magnum practice)" parent: BaseSpeedLoaderMagnum + description: Designed to quickly refill an empty revolver, it fits up to six rounds. Intended to hold non-harmful chalk ammunition, perfect for practicing your quick draw. components: - type: BallisticAmmoProvider proto: CartridgeMagnumPractice @@ -89,6 +93,7 @@ id: SpeedLoaderMagnumAP name: "speed loader (.45 magnum armor-piercing)" parent: BaseSpeedLoaderMagnum + description: Designed to quickly refill an empty revolver, it fits up to six rounds. Intended to hold rare armor-piercing ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumAP @@ -109,6 +114,7 @@ id: SpeedLoaderMagnumUranium name: "speed loader (.45 magnum uranium)" parent: BaseSpeedLoaderMagnum + description: Designed to quickly refill an empty revolver, it fits up to six rounds. Intended to hold exotic uranium-core ammunition. components: - type: BallisticAmmoProvider proto: CartridgeMagnumUranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 375045e400..c9e3fdd034 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -210,8 +210,8 @@ - type: entity name: N1984 parent: [BaseWeaponPistol, BaseSecurityContraband] - 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. + id: WeaponPistolN1984 + description: An exceptionally powerful ‘hand cannon’ designed as part of Nanotrasen's BFG initiative. Chambered in .45, the lord’s caliber, it is generally considered too unwieldy for standard use but has become something of a status symbol among Nanotrasen officials. Feeds from .45 pistol magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/N1984.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml index 564ef7f869..18f0d1c109 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml @@ -54,7 +54,7 @@ name: Deckard parent: [BaseWeaponRevolver, BaseSecurityCommandContraband] id: WeaponRevolverDeckard - description: A rare, custom-built revolver. Use when there is no time for Voight-Kampff test. Uses .45 magnum ammo. + description: A beautifully machined, custom-built revolver. Used when there is no time for the Voight-Kampff test. Loads 5 rounds of .45 magnum. components: - type: Sprite sprite: Objects/Weapons/Guns/Revolvers/deckard.rsi @@ -82,7 +82,7 @@ name: Inspector parent: [BaseWeaponRevolver, BaseSecurityContraband] id: WeaponRevolverInspector - description: A detective's best friend. Uses .45 magnum ammo. + description: A single-action revolver manufactured by various companies. It is readily available on the civilian market, making it a popular choice among private investigators. You feel lucky just holding it. Loads 6 rounds of .45 magnum. components: - type: Sprite sprite: Objects/Weapons/Guns/Revolvers/inspector.rsi @@ -97,7 +97,7 @@ name: Mateba parent: [BaseWeaponRevolver, BaseMajorContraband] id: WeaponRevolverMateba - description: The iconic sidearm of the dreaded death squads. Uses .45 magnum ammo. + description: A modern revolver used by Nanotrasen’s elite, near mythical ‘Death Squad’ task force. Its unique trigger action and barrel placement enable a high fire rate with minimal muzzle flip. Many have looked down this barrel, but few have lived to tell of it. Loads 6 rounds of .45 magnum. components: - type: Sprite sprite: Objects/Weapons/Guns/Revolvers/mateba.rsi @@ -120,7 +120,7 @@ name: Python parent: [BaseWeaponRevolver, BaseSyndicateContraband] id: WeaponRevolverPython - description: A robust revolver favoured by Syndicate agents. Uses .45 magnum ammo. + description: A powerful double-action revolver manufactured by the Syndicate. Loud and flashy, perfect for any agent looking to make a statement. Loads 6 rounds of .45 magnum. components: - type: Sprite sprite: Objects/Weapons/Guns/Revolvers/python.rsi @@ -153,7 +153,7 @@ name: pirate revolver parent: [BaseWeaponRevolver, BaseMinorContraband] id: WeaponRevolverPirate - description: An odd, old-looking revolver, favoured by pirate crews. Uses .45 magnum ammo. + description: A crude single-action revolver handmade by a space pirate. Old and covered in rust, it somehow still works. Loads 5 rounds of .45 magnum. components: - type: Sprite sprite: Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi From b812045d64d847f7ceb60e902054ffb6ae3b1e57 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 04:59:40 +0000 Subject: [PATCH 025/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b43f981127..1d39e71b2f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed space ambient music not playing. - type: Fix - id: 7656 - time: '2024-11-27T05:32:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33594 - author: slarticodefast changes: - message: Fixed windoors and high security doors not showing up on the AI's electrocution @@ -3890,3 +3883,11 @@ id: 8155 time: '2025-04-11T02:15:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36385 +- author: Nox38, BurgerMoth, ArtisticRoomba + changes: + - message: Added descriptions to all .45 magnum cartridges, magazines, speed loaders, + and ammo boxes. + type: Add + id: 8156 + time: '2025-04-11T04:58:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36383 From 1540880eb20957c4a5a0e12ca6906ca14aed041e Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 11 Apr 2025 01:19:48 -0400 Subject: [PATCH 026/622] Predict Labels (#36406) * Predict Labels * nitpicks --- .../Labels/EntitySystems/LabelSystem.cs | 7 - .../Botany/Systems/PlantHolderSystem.cs | 5 +- .../Cargo/Systems/CargoSystem.Bounty.cs | 2 +- .../Cargo/Systems/CargoSystem.Orders.cs | 2 +- .../Cartridges/LogProbeCartridgeSystem.cs | 2 +- .../EntitySystems/ChemMasterSystem.cs | 2 +- .../Cloning/CloningSystem.Subscriptions.cs | 2 +- Content.Server/Delivery/DeliverySystem.cs | 2 +- Content.Server/Fax/FaxSystem.cs | 2 +- .../Forensics/Systems/ForensicPadSystem.cs | 2 +- .../Label/Components/PaperLabelComponent.cs | 14 -- Content.Server/Labels/Label/LabelSystem.cs | 115 -------------- Content.Server/Salvage/SalvageSystem.cs | 2 +- .../Shuttles/Commands/FTLDiskCommand.cs | 2 +- .../Labels/Components/LabelComponent.cs | 2 + .../Labels/Components/PaperLabelComponent.cs | 19 +++ .../Components/PaperLabelTypeComponent.cs | 12 +- .../Labels/EntitySystems/LabelSystem.cs | 144 ++++++++++++++++++ .../EntitySystems/SharedHandLabelerSystem.cs | 2 +- .../Labels/EntitySystems/SharedLabelSystem.cs | 54 ------- 20 files changed, 185 insertions(+), 209 deletions(-) delete mode 100644 Content.Client/Labels/EntitySystems/LabelSystem.cs delete mode 100644 Content.Server/Labels/Label/Components/PaperLabelComponent.cs delete mode 100644 Content.Server/Labels/Label/LabelSystem.cs create mode 100644 Content.Shared/Labels/Components/PaperLabelComponent.cs create mode 100644 Content.Shared/Labels/EntitySystems/LabelSystem.cs delete mode 100644 Content.Shared/Labels/EntitySystems/SharedLabelSystem.cs diff --git a/Content.Client/Labels/EntitySystems/LabelSystem.cs b/Content.Client/Labels/EntitySystems/LabelSystem.cs deleted file mode 100644 index baa9f7fee7..0000000000 --- a/Content.Client/Labels/EntitySystems/LabelSystem.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared.Labels.EntitySystems; - -namespace Content.Client.Labels; - -public sealed partial class LabelSystem : SharedLabelSystem -{ -} diff --git a/Content.Server/Botany/Systems/PlantHolderSystem.cs b/Content.Server/Botany/Systems/PlantHolderSystem.cs index 5dbafae5af..2661ed479c 100644 --- a/Content.Server/Botany/Systems/PlantHolderSystem.cs +++ b/Content.Server/Botany/Systems/PlantHolderSystem.cs @@ -22,10 +22,10 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; -using Content.Server.Labels.Components; using Content.Shared.Administration.Logs; using Content.Shared.Containers.ItemSlots; using Content.Shared.Database; +using Content.Shared.Labels.Components; namespace Content.Server.Botany.Systems; @@ -45,8 +45,7 @@ public sealed class PlantHolderSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - - + public const float HydroponicsSpeedMultiplier = 1f; public const float HydroponicsConsumptionMultiplier = 2f; diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs index 7f74fe269d..c938c6fa50 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs @@ -1,7 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Server.Cargo.Components; -using Content.Server.Labels; using Content.Server.NameIdentifier; using Content.Shared.Access.Components; using Content.Shared.Cargo; @@ -9,6 +8,7 @@ using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Prototypes; using Content.Shared.Database; using Content.Shared.IdentityManagement; +using Content.Shared.Labels.EntitySystems; using Content.Shared.NameIdentifier; using Content.Shared.Paper; using Content.Shared.Stacks; diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index 9b6407c689..ee6526c321 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -1,6 +1,5 @@ using System.Diagnostics.CodeAnalysis; using Content.Server.Cargo.Components; -using Content.Server.Labels.Components; using Content.Server.Station.Components; using Content.Shared.Cargo; using Content.Shared.Cargo.BUI; @@ -11,6 +10,7 @@ using Content.Shared.Database; using Content.Shared.Emag.Systems; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; +using Content.Shared.Labels.Components; using Content.Shared.Paper; using Robust.Shared.Map; using Robust.Shared.Prototypes; diff --git a/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs b/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs index ac5c0baa54..75b6b44636 100644 --- a/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs +++ b/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs @@ -23,7 +23,7 @@ public sealed class LogProbeCartridgeSystem : EntitySystem [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; - [Dependency] private readonly SharedLabelSystem _label = default!; + [Dependency] private readonly LabelSystem _label = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly PaperSystem _paper = default!; diff --git a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs index dd97bfa8f6..6e2e2a91bc 100644 --- a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs @@ -1,5 +1,4 @@ using Content.Server.Chemistry.Components; -using Content.Server.Labels; using Content.Server.Popups; using Content.Server.Storage.EntitySystems; using Content.Shared.Administration.Logs; @@ -10,6 +9,7 @@ using Content.Shared.Chemistry.Reagent; using Content.Shared.Containers.ItemSlots; using Content.Shared.Database; using Content.Shared.FixedPoint; +using Content.Shared.Labels.EntitySystems; using Content.Shared.Storage; using JetBrains.Annotations; using Robust.Server.Audio; diff --git a/Content.Server/Cloning/CloningSystem.Subscriptions.cs b/Content.Server/Cloning/CloningSystem.Subscriptions.cs index 659d9a1ea1..eba806ceb8 100644 --- a/Content.Server/Cloning/CloningSystem.Subscriptions.cs +++ b/Content.Server/Cloning/CloningSystem.Subscriptions.cs @@ -25,7 +25,7 @@ namespace Content.Server.Cloning; public sealed partial class CloningSystem : EntitySystem { [Dependency] private readonly SharedStackSystem _stack = default!; - [Dependency] private readonly SharedLabelSystem _label = default!; + [Dependency] private readonly LabelSystem _label = default!; [Dependency] private readonly ForensicsSystem _forensics = default!; [Dependency] private readonly PaperSystem _paper = default!; diff --git a/Content.Server/Delivery/DeliverySystem.cs b/Content.Server/Delivery/DeliverySystem.cs index 8ac8722821..8d2052733e 100644 --- a/Content.Server/Delivery/DeliverySystem.cs +++ b/Content.Server/Delivery/DeliverySystem.cs @@ -23,7 +23,7 @@ public sealed partial class DeliverySystem : SharedDeliverySystem [Dependency] private readonly StationRecordsSystem _records = default!; [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly FingerprintReaderSystem _fingerprintReader = default!; - [Dependency] private readonly SharedLabelSystem _label = default!; + [Dependency] private readonly LabelSystem _label = default!; [Dependency] private readonly SharedContainerSystem _container = default!; public override void Initialize() diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs index 180689f892..1ac7bd23ca 100644 --- a/Content.Server/Fax/FaxSystem.cs +++ b/Content.Server/Fax/FaxSystem.cs @@ -4,7 +4,6 @@ using Content.Server.Chat.Managers; using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Labels; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Tools; @@ -20,6 +19,7 @@ using Content.Shared.Fax.Systems; using Content.Shared.Fax.Components; using Content.Shared.Interaction; using Content.Shared.Labels.Components; +using Content.Shared.Labels.EntitySystems; using Content.Shared.Mobs.Components; using Content.Shared.Paper; using Robust.Server.GameObjects; diff --git a/Content.Server/Forensics/Systems/ForensicPadSystem.cs b/Content.Server/Forensics/Systems/ForensicPadSystem.cs index 846d72a9fa..2841f36b00 100644 --- a/Content.Server/Forensics/Systems/ForensicPadSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicPadSystem.cs @@ -1,4 +1,3 @@ -using Content.Server.Labels; using Content.Server.Popups; using Content.Shared.DoAfter; using Content.Shared.Examine; @@ -7,6 +6,7 @@ using Content.Shared.Forensics.Components; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Inventory; +using Content.Shared.Labels.EntitySystems; namespace Content.Server.Forensics { diff --git a/Content.Server/Labels/Label/Components/PaperLabelComponent.cs b/Content.Server/Labels/Label/Components/PaperLabelComponent.cs deleted file mode 100644 index 5dead98084..0000000000 --- a/Content.Server/Labels/Label/Components/PaperLabelComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Content.Shared.Containers.ItemSlots; - -namespace Content.Server.Labels.Components -{ - /// - /// This component allows you to attach and remove a piece of paper to an entity. - /// - [RegisterComponent] - public sealed partial class PaperLabelComponent : Component - { - [DataField("labelSlot")] - public ItemSlot LabelSlot = new(); - } -} diff --git a/Content.Server/Labels/Label/LabelSystem.cs b/Content.Server/Labels/Label/LabelSystem.cs deleted file mode 100644 index b70c004123..0000000000 --- a/Content.Server/Labels/Label/LabelSystem.cs +++ /dev/null @@ -1,115 +0,0 @@ -using Content.Server.Labels.Components; -using Content.Shared.Containers.ItemSlots; -using Content.Shared.Examine; -using Content.Shared.Labels; -using Content.Shared.Labels.Components; -using Content.Shared.Labels.EntitySystems; -using Content.Shared.Paper; -using JetBrains.Annotations; -using Robust.Shared.Containers; - -namespace Content.Server.Labels -{ - /// - /// A system that lets players see the contents of a label on an object. - /// - [UsedImplicitly] - public sealed class LabelSystem : SharedLabelSystem - { - [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - - public const string ContainerName = "paper_label"; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnComponentInit); - SubscribeLocalEvent(OnComponentRemove); - SubscribeLocalEvent(OnContainerModified); - SubscribeLocalEvent(OnContainerModified); - SubscribeLocalEvent(OnExamined); - } - - /// - /// Apply or remove a label on an entity. - /// - /// EntityUid to change label on - /// intended label text (null to remove) - /// label component for resolve - /// metadata component for resolve - public override void Label(EntityUid uid, string? text, MetaDataComponent? metadata = null, LabelComponent? label = null) - { - if (!Resolve(uid, ref label, false)) - label = EnsureComp(uid); - - label.CurrentLabel = text; - NameMod.RefreshNameModifiers(uid); - - Dirty(uid, label); - } - - private void OnComponentInit(EntityUid uid, PaperLabelComponent component, ComponentInit args) - { - _itemSlotsSystem.AddItemSlot(uid, ContainerName, component.LabelSlot); - - UpdateAppearance((uid, component)); - } - - private void OnComponentRemove(EntityUid uid, PaperLabelComponent component, ComponentRemove args) - { - _itemSlotsSystem.RemoveItemSlot(uid, component.LabelSlot); - } - - private void OnExamined(EntityUid uid, PaperLabelComponent comp, ExaminedEvent args) - { - if (comp.LabelSlot.Item is not {Valid: true} item) - return; - - using (args.PushGroup(nameof(PaperLabelComponent))) - { - if (!args.IsInDetailsRange) - { - args.PushMarkup(Loc.GetString("comp-paper-label-has-label-cant-read")); - return; - } - - if (!EntityManager.TryGetComponent(item, out PaperComponent? paper)) - // Assuming yaml has the correct entity whitelist, this should not happen. - return; - - if (string.IsNullOrWhiteSpace(paper.Content)) - { - args.PushMarkup(Loc.GetString("comp-paper-label-has-label-blank")); - return; - } - - args.PushMarkup(Loc.GetString("comp-paper-label-has-label")); - var text = paper.Content; - args.PushMarkup(text.TrimEnd()); - } - } - - private void OnContainerModified(EntityUid uid, PaperLabelComponent label, ContainerModifiedMessage args) - { - if (!label.Initialized) return; - - if (args.Container.ID != label.LabelSlot.ID) - return; - - UpdateAppearance((uid, label)); - } - - private void UpdateAppearance(Entity ent) - { - if (!Resolve(ent, ref ent.Comp2, false)) - return; - - var slot = ent.Comp1.LabelSlot; - _appearance.SetData(ent, PaperLabelVisuals.HasLabel, slot.HasItem, ent.Comp2); - if (TryComp(slot.Item, out var type)) - _appearance.SetData(ent, PaperLabelVisuals.LabelType, type.PaperType, ent.Comp2); - } - } -} diff --git a/Content.Server/Salvage/SalvageSystem.cs b/Content.Server/Salvage/SalvageSystem.cs index 9115c60536..53bb0c06b3 100644 --- a/Content.Server/Salvage/SalvageSystem.cs +++ b/Content.Server/Salvage/SalvageSystem.cs @@ -16,7 +16,7 @@ using Content.Shared.Construction.EntitySystems; using Robust.Shared.Audio.Systems; using Robust.Shared.Map.Components; using Robust.Shared.Timing; -using Content.Server.Labels; +using Content.Shared.Labels.EntitySystems; using Robust.Shared.EntitySerialization.Systems; namespace Content.Server.Salvage diff --git a/Content.Server/Shuttles/Commands/FTLDiskCommand.cs b/Content.Server/Shuttles/Commands/FTLDiskCommand.cs index b17c7c11a7..014dbe6d99 100644 --- a/Content.Server/Shuttles/Commands/FTLDiskCommand.cs +++ b/Content.Server/Shuttles/Commands/FTLDiskCommand.cs @@ -1,8 +1,8 @@ using Content.Server.Administration; -using Content.Server.Labels; using Content.Shared.Administration; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; +using Content.Shared.Labels.EntitySystems; using Content.Shared.Shuttles.Components; using Content.Shared.Storage; using Content.Shared.Storage.EntitySystems; diff --git a/Content.Shared/Labels/Components/LabelComponent.cs b/Content.Shared/Labels/Components/LabelComponent.cs index ee508797ad..d126e3bd3a 100644 --- a/Content.Shared/Labels/Components/LabelComponent.cs +++ b/Content.Shared/Labels/Components/LabelComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Labels.EntitySystems; using Robust.Shared.GameStates; namespace Content.Shared.Labels.Components; @@ -6,6 +7,7 @@ namespace Content.Shared.Labels.Components; /// Makes entities have a label in their name. Labels are normally given by /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(LabelSystem))] public sealed partial class LabelComponent : Component { /// diff --git a/Content.Shared/Labels/Components/PaperLabelComponent.cs b/Content.Shared/Labels/Components/PaperLabelComponent.cs new file mode 100644 index 0000000000..e8dad61b87 --- /dev/null +++ b/Content.Shared/Labels/Components/PaperLabelComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Labels.EntitySystems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Labels.Components; + +/// +/// This component allows you to attach and remove a piece of paper to an entity. +/// +[RegisterComponent, NetworkedComponent] +[Access(typeof(LabelSystem))] +public sealed partial class PaperLabelComponent : Component +{ + /// + /// The slot where the label is stored. + /// + [DataField] + public ItemSlot LabelSlot = new(); +} diff --git a/Content.Shared/Labels/Components/PaperLabelTypeComponent.cs b/Content.Shared/Labels/Components/PaperLabelTypeComponent.cs index b045a6af3b..12cddad80f 100644 --- a/Content.Shared/Labels/Components/PaperLabelTypeComponent.cs +++ b/Content.Shared/Labels/Components/PaperLabelTypeComponent.cs @@ -1,15 +1,17 @@ +using Content.Shared.Labels.EntitySystems; using Robust.Shared.GameStates; namespace Content.Shared.Labels.Components; -/// -/// Specifies the paper type (see textures/storage/crates/labels.rsi to see currently supported paper types) to show on crates this label is attached to. -/// +/// +/// Specifies the paper type (see textures/storage/crates/labels.rsi to see currently supported paper types) to show on crates this label is attached to. +/// [RegisterComponent, NetworkedComponent] +[Access(typeof(LabelSystem))] public sealed partial class PaperLabelTypeComponent : Component { - /// - /// The type of label to show. + /// + /// The type of label to show. /// [DataField] public string PaperType = "Paper"; diff --git a/Content.Shared/Labels/EntitySystems/LabelSystem.cs b/Content.Shared/Labels/EntitySystems/LabelSystem.cs new file mode 100644 index 0000000000..569acc7bca --- /dev/null +++ b/Content.Shared/Labels/EntitySystems/LabelSystem.cs @@ -0,0 +1,144 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Examine; +using Content.Shared.Labels.Components; +using Content.Shared.NameModifier.EntitySystems; +using Content.Shared.Paper; +using Robust.Shared.Containers; +using Robust.Shared.Utility; + +namespace Content.Shared.Labels.EntitySystems; + +public sealed partial class LabelSystem : EntitySystem +{ + [Dependency] private readonly NameModifierSystem _nameModifier = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public const string ContainerName = "paper_label"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnLabelCompMapInit); + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnRefreshNameModifiers); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentRemove); + SubscribeLocalEvent(OnContainerModified); + SubscribeLocalEvent(OnContainerModified); + SubscribeLocalEvent(OnExamined); + } + + private void OnLabelCompMapInit(Entity ent, ref MapInitEvent args) + { + if (!string.IsNullOrEmpty(ent.Comp.CurrentLabel)) + { + ent.Comp.CurrentLabel = Loc.GetString(ent.Comp.CurrentLabel); + Dirty(ent); + } + + _nameModifier.RefreshNameModifiers(ent.Owner); + } + + /// + /// Apply or remove a label on an entity. + /// + /// EntityUid to change label on + /// intended label text (null to remove) + /// label component for resolve + /// metadata component for resolve + public void Label(EntityUid uid, string? text, MetaDataComponent? metadata = null, LabelComponent? label = null) + { + label ??= EnsureComp(uid); + + label.CurrentLabel = text; + _nameModifier.RefreshNameModifiers(uid); + + Dirty(uid, label); + } + + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + if (!ent.Comp.Examinable) + return; + + if (ent.Comp.CurrentLabel == null) + return; + + var message = new FormattedMessage(); + message.AddText(Loc.GetString("hand-labeler-has-label", ("label", ent.Comp.CurrentLabel))); + args.PushMessage(message); + } + + private void OnRefreshNameModifiers(Entity entity, ref RefreshNameModifiersEvent args) + { + if (!string.IsNullOrEmpty(entity.Comp.CurrentLabel)) + args.AddModifier("comp-label-format", extraArgs: ("label", entity.Comp.CurrentLabel)); + } + + private void OnComponentInit(Entity ent, ref ComponentInit args) + { + _itemSlots.AddItemSlot(ent, ContainerName, ent.Comp.LabelSlot); + + UpdateAppearance(ent); + } + + private void OnComponentRemove(Entity ent, ref ComponentRemove args) + { + _itemSlots.RemoveItemSlot(ent, ent.Comp.LabelSlot); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + if (ent.Comp.LabelSlot.Item is not {Valid: true} item) + return; + + using (args.PushGroup(nameof(PaperLabelComponent))) + { + if (!args.IsInDetailsRange) + { + args.PushMarkup(Loc.GetString("comp-paper-label-has-label-cant-read")); + return; + } + + // Assuming yaml has the correct entity whitelist, this should not happen. + if (!TryComp(item, out var paper)) + return; + + if (string.IsNullOrWhiteSpace(paper.Content)) + { + args.PushMarkup(Loc.GetString("comp-paper-label-has-label-blank")); + return; + } + + args.PushMarkup(Loc.GetString("comp-paper-label-has-label")); + var text = paper.Content; + args.PushMarkup(text.TrimEnd()); + } + } + + // Not ref-sub due to being used for multiple subscriptions. + private void OnContainerModified(EntityUid uid, PaperLabelComponent label, ContainerModifiedMessage args) + { + if (!label.Initialized) + return; + + if (args.Container.ID != label.LabelSlot.ID) + return; + + UpdateAppearance((uid, label)); + } + + private void UpdateAppearance(Entity ent) + { + if (!Resolve(ent, ref ent.Comp2, false)) + return; + + var slot = ent.Comp1.LabelSlot; + _appearance.SetData(ent, PaperLabelVisuals.HasLabel, slot.HasItem, ent.Comp2); + if (TryComp(slot.Item, out var type)) + _appearance.SetData(ent, PaperLabelVisuals.LabelType, type.PaperType, ent.Comp2); + } +} diff --git a/Content.Shared/Labels/EntitySystems/SharedHandLabelerSystem.cs b/Content.Shared/Labels/EntitySystems/SharedHandLabelerSystem.cs index 0763bb101c..14abae70bb 100644 --- a/Content.Shared/Labels/EntitySystems/SharedHandLabelerSystem.cs +++ b/Content.Shared/Labels/EntitySystems/SharedHandLabelerSystem.cs @@ -14,7 +14,7 @@ public abstract class SharedHandLabelerSystem : EntitySystem { [Dependency] protected readonly SharedUserInterfaceSystem UserInterfaceSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; - [Dependency] private readonly SharedLabelSystem _labelSystem = default!; + [Dependency] private readonly LabelSystem _labelSystem = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; diff --git a/Content.Shared/Labels/EntitySystems/SharedLabelSystem.cs b/Content.Shared/Labels/EntitySystems/SharedLabelSystem.cs deleted file mode 100644 index 8d54871563..0000000000 --- a/Content.Shared/Labels/EntitySystems/SharedLabelSystem.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Content.Shared.Examine; -using Content.Shared.Labels.Components; -using Content.Shared.NameModifier.EntitySystems; -using Robust.Shared.Utility; - -namespace Content.Shared.Labels.EntitySystems; - -public abstract partial class SharedLabelSystem : EntitySystem -{ - [Dependency] protected readonly NameModifierSystem NameMod = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnLabelCompMapInit); - SubscribeLocalEvent(OnExamine); - SubscribeLocalEvent(OnRefreshNameModifiers); - } - - private void OnLabelCompMapInit(EntityUid uid, LabelComponent component, MapInitEvent args) - { - if (!string.IsNullOrEmpty(component.CurrentLabel)) - { - component.CurrentLabel = Loc.GetString(component.CurrentLabel); - Dirty(uid, component); - } - - NameMod.RefreshNameModifiers(uid); - } - - public virtual void Label(EntityUid uid, string? text, MetaDataComponent? metadata = null, LabelComponent? label = null){} - - private void OnExamine(EntityUid uid, LabelComponent? label, ExaminedEvent args) - { - if (!Resolve(uid, ref label)) - return; - - if (!label.Examinable) - return; - - if (label.CurrentLabel == null) - return; - - var message = new FormattedMessage(); - message.AddText(Loc.GetString("hand-labeler-has-label", ("label", label.CurrentLabel))); - args.PushMessage(message); - } - - private void OnRefreshNameModifiers(Entity entity, ref RefreshNameModifiersEvent args) - { - if (!string.IsNullOrEmpty(entity.Comp.CurrentLabel)) - args.AddModifier("comp-label-format", extraArgs: ("label", entity.Comp.CurrentLabel)); - } -} From edb5dd0b30d971f287d33fc27b5a93378e86c9e3 Mon Sep 17 00:00:00 2001 From: Damn Feds <20566341+K-Dynamic@users.noreply.github.com> Date: Fri, 11 Apr 2025 22:43:11 +1200 Subject: [PATCH 027/622] fixes removed annotations --- Resources/Prototypes/Maps/bagel.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Maps/bagel.yml b/Resources/Prototypes/Maps/bagel.yml index 9138d58eaa..397b2628ed 100644 --- a/Resources/Prototypes/Maps/bagel.yml +++ b/Resources/Prototypes/Maps/bagel.yml @@ -17,7 +17,7 @@ emergencyShuttlePath: /Maps/Shuttles/emergency_lox.yml - type: StationJobs availableJobs: # 60 jobs total w/o latejoins & interns, 77 jobs total w/ latejoins & interns - #command + #command (7) Captain: [ 1, 1 ] HeadOfPersonnel: [ 1, 1 ] HeadOfSecurity: [ 1, 1 ] @@ -45,7 +45,7 @@ MedicalIntern: [ 4, 4 ] #intern, not counted #science (5) Scientist: [ 5, 5 ] - ResearchAssistant: [ 4, 4 ] + ResearchAssistant: [ 4, 4 ] #intern, not counted #security (10) Warden: [ 1, 1 ] SecurityOfficer: [ 6, 6 ] From fd7413f51a9a24d75a43dfeeca37085bb3f0227f Mon Sep 17 00:00:00 2001 From: lunarcomets <140772713+lunarcomets@users.noreply.github.com> Date: Fri, 11 Apr 2025 05:17:11 -0700 Subject: [PATCH 028/622] predict borg selection (#36430) do the thing --- Content.Client/Silicons/Borgs/BorgSelectTypeUserInterface.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Silicons/Borgs/BorgSelectTypeUserInterface.cs b/Content.Client/Silicons/Borgs/BorgSelectTypeUserInterface.cs index 8c76fade8c..69a55dd38b 100644 --- a/Content.Client/Silicons/Borgs/BorgSelectTypeUserInterface.cs +++ b/Content.Client/Silicons/Borgs/BorgSelectTypeUserInterface.cs @@ -25,6 +25,6 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface base.Open(); _menu = this.CreateWindow(); - _menu.ConfirmedBorgType += prototype => SendMessage(new BorgSelectTypeMessage(prototype)); + _menu.ConfirmedBorgType += prototype => SendPredictedMessage(new BorgSelectTypeMessage(prototype)); } } From dc37ab7c6d1a8fac0f7a421da98f33eab2e6dc12 Mon Sep 17 00:00:00 2001 From: TakoDragon <69509841+BackeTako@users.noreply.github.com> Date: Fri, 11 Apr 2025 15:13:17 +0200 Subject: [PATCH 029/622] RD Windoor (#36377) rd-windoor --- .../Entities/Structures/Doors/Windoors/windoor.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml index db0fc13b97..d5cb9f1feb 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/windoor.yml @@ -407,6 +407,15 @@ - type: Wires layoutId: AirlockMedical +- type: entity + parent: WindoorSecureCommandLocked + id: WindoorSecureResearchDirectorLocked + suffix: ResearchDirector, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsResearchDirector ] + - type: entity parent: WindoorSecureCargoLocked id: WindoorSecureSalvageLocked From 3a6441932eb5c4923231f97dd202c877b7e03664 Mon Sep 17 00:00:00 2001 From: Milon Date: Fri, 11 Apr 2025 17:33:32 +0200 Subject: [PATCH 030/622] Directional BoundUserInterfaceMessageAttempt content edition (#36320) --- .../Interaction/SharedInteractionSystem.cs | 13 +++++-------- .../StationAi/SharedStationAiSystem.Held.cs | 4 ++-- .../Storage/EntitySystems/SharedStorageSystem.cs | 4 ++-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index ff9f41e1f9..9a2706d8a0 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -106,7 +106,7 @@ namespace Content.Shared.Interaction _uiQuery = GetEntityQuery(); SubscribeLocalEvent(HandleUserInterfaceRangeCheck); - SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); + SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); SubscribeAllEvent(HandleInteractInventorySlotEvent); @@ -151,13 +151,12 @@ namespace Content.Shared.Interaction /// /// Check that the user that is interacting with the BUI is capable of interacting and can access the entity. /// - private void OnBoundInterfaceInteractAttempt(BoundUserInterfaceMessageAttempt ev) + private void OnBoundInterfaceInteractAttempt(Entity ent, ref BoundUserInterfaceMessageAttempt ev) { - _uiQuery.TryComp(ev.Target, out var uiComp); if (!_actionBlockerSystem.CanInteract(ev.Actor, ev.Target)) { // We permit ghosts to open uis unless explicitly blocked - if (ev.Message is not OpenBoundInterfaceMessage || !HasComp(ev.Actor) || uiComp?.BlockSpectators == true) + if (ev.Message is not OpenBoundInterfaceMessage || !HasComp(ev.Actor) || ent.Comp.BlockSpectators) { ev.Cancel(); return; @@ -175,16 +174,14 @@ namespace Content.Shared.Interaction return; } - if (uiComp == null) - return; - if (uiComp.SingleUser && uiComp.CurrentSingleUser != null && uiComp.CurrentSingleUser != ev.Actor) + if (ent.Comp.SingleUser && ent.Comp.CurrentSingleUser != null && ent.Comp.CurrentSingleUser != ev.Actor) { ev.Cancel(); return; } - if (uiComp.RequiresComplex && !_actionBlockerSystem.CanComplexInteract(ev.Actor)) + if (ent.Comp.RequiresComplex && !_actionBlockerSystem.CanComplexInteract(ev.Actor)) ev.Cancel(); } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index 374d9b8cbf..4b0fbdcf4b 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -20,7 +20,7 @@ public abstract partial class SharedStationAiSystem private void InitializeHeld() { SubscribeLocalEvent(OnRadialMessage); - SubscribeLocalEvent(OnMessageAttempt); + SubscribeLocalEvent(OnMessageAttempt); SubscribeLocalEvent>(OnTargetVerbs); SubscribeLocalEvent(OnHeldInteraction); @@ -116,7 +116,7 @@ public abstract partial class SharedStationAiSystem RaiseLocalEvent(target.Value, (object) ev.Event); } - private void OnMessageAttempt(BoundUserInterfaceMessageAttempt ev) + private void OnMessageAttempt(Entity ent, ref BoundUserInterfaceMessageAttempt ev) { if (ev.Actor == ev.Target) return; diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 9297ea043d..f2a2031743 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -142,7 +142,7 @@ public abstract class SharedStorageSystem : EntitySystem SubscribeLocalEvent(OnImplantActivate); SubscribeLocalEvent(AfterInteract); SubscribeLocalEvent(OnDestroy); - SubscribeLocalEvent(OnBoundUIAttempt); + SubscribeLocalEvent(OnBoundUIAttempt); SubscribeLocalEvent(OnBoundUIOpen); SubscribeLocalEvent(OnLockToggled); SubscribeLocalEvent(OnStackCountChanged); @@ -761,7 +761,7 @@ public abstract class SharedStorageSystem : EntitySystem UpdateAppearance((ent.Owner, ent.Comp, null)); } - private void OnBoundUIAttempt(BoundUserInterfaceMessageAttempt args) + private void OnBoundUIAttempt(Entity ent, ref BoundUserInterfaceMessageAttempt args) { if (args.UiKey is not StorageComponent.StorageUiKey.Key || _openStorageLimit == -1 || From 6b96fb45a69c4ce6d75abf159b6da139f46f9c9f Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 12 Apr 2025 02:10:54 +1000 Subject: [PATCH 031/622] Update submodule to 252.0.0 (#36462) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 588c46273e..f274de0f10 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 588c46273ed7c78342c9d9ff4d2215d494e3133e +Subproject commit f274de0f10425e62171618616d97b5dc9810e5fd From 054a58d199dc61fb1fb040786dc078ed94d645b3 Mon Sep 17 00:00:00 2001 From: Silicon14 <129602789+SiLiCoN14WasTaken@users.noreply.github.com> Date: Fri, 11 Apr 2025 19:02:53 +0200 Subject: [PATCH 032/622] Fixed phalanxamines guidebook entry. (#36458) * fixed phalanxamines guidebook entry * Update Resources/Locale/en-US/reagents/meta/medicine.ftl Co-authored-by: Tayrtahn --------- Co-authored-by: Tayrtahn --- Resources/Locale/en-US/reagents/meta/medicine.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/reagents/meta/medicine.ftl b/Resources/Locale/en-US/reagents/meta/medicine.ftl index efde6c6cf6..a06be2a148 100644 --- a/Resources/Locale/en-US/reagents/meta/medicine.ftl +++ b/Resources/Locale/en-US/reagents/meta/medicine.ftl @@ -50,7 +50,7 @@ reagent-name-barozine = barozine reagent-desc-barozine = A potent chemical that prevents pressure damage. Causes extreme stress on the body. reagent-name-phalanximine = phalanximine -reagent-desc-phalanximine = An advanced chemical used in the treatment of cancer. Causes moderate radiation poisoning on organics and vomiting. Can potentially remove the death gene on plants. +reagent-desc-phalanximine = An advanced chemical used in the treatment of cancer. Causes moderate radiation poisoning, acid burns, and vomiting on organics. Can potentially remove the death gene on plants. reagent-name-polypyrylium-oligomers = Polypyrylium Oligomers reagent-desc-polypyrylium-oligomers = A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. Heals asphyxiation and brute damage. Stops bleeding over time. From f7850a3c0b15e8fda0cef16fa5bf79435426e600 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Fri, 11 Apr 2025 13:42:54 -0400 Subject: [PATCH 033/622] Fix ninja battery drain debug assertion (#36461) Fix ninja battery drain using wrong uid --- Content.Server/Ninja/Systems/BatteryDrainerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs index 8e707cf3fc..71e38ed3f6 100644 --- a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs +++ b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs @@ -106,6 +106,6 @@ public sealed class BatteryDrainerSystem : SharedBatteryDrainerSystem _popup.PopupEntity(Loc.GetString("battery-drainer-success", ("battery", target)), uid, uid); // repeat the doafter until battery is full - return !_battery.IsFull(ent, battery); + return !_battery.IsFull(comp.BatteryUid.Value, battery); } } From 4ecdc17bb8233489d3443d15e5db5ae412ba8b64 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 11 Apr 2025 23:04:37 +0200 Subject: [PATCH 034/622] PlayerPanel username copy fix (#36468) weh --- .../Administration/UI/PlayerPanel/PlayerPanel.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml.cs b/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml.cs index 53cc8faa10..1674989c27 100644 --- a/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml.cs +++ b/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml.cs @@ -36,7 +36,7 @@ public sealed partial class PlayerPanel : FancyWindow RobustXamlLoader.Load(this); _adminManager = adminManager; - UsernameCopyButton.OnPressed += _ => OnUsernameCopy?.Invoke(PlayerName.Text ?? ""); + UsernameCopyButton.OnPressed += _ => OnUsernameCopy?.Invoke(TargetUsername ?? ""); BanButton.OnPressed += _ => OnOpenBanPanel?.Invoke(TargetPlayer); KickButton.OnPressed += _ => OnKick?.Invoke(TargetUsername); NotesButton.OnPressed += _ => OnOpenNotes?.Invoke(TargetPlayer); From 86620dbe6c66f652599cf4381b83261c7d8c008b Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 11 Apr 2025 21:05:44 +0000 Subject: [PATCH 035/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index d6c48b8fc0..e1276232cf 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -999,5 +999,13 @@ Entries: id: 121 time: '2025-04-08T14:54:14.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36396 +- author: Errant + changes: + - message: The Copy button on the PlayerPanel now copies only the target username, + not the entire line. + type: Fix + id: 122 + time: '2025-04-11T21:04:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36468 Name: Admin Order: 1 From e6e60dead418aa295b10d02578d6a4a3ef27a14e Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Fri, 11 Apr 2025 23:30:52 +0200 Subject: [PATCH 036/622] Revert "Feature/shader radial menu" due to shader issue (#36470) --- .../UserInterface/Controls/RadialContainer.cs | 82 +--------- .../UserInterface/Controls/RadialMenu.cs | 87 +++++----- .../Controls/SimpleRadialMenu.xaml.cs | 3 +- Resources/Prototypes/Shaders/shaders.yml | 7 +- Resources/Textures/Shaders/radial-menu.swsl | 148 ------------------ 5 files changed, 55 insertions(+), 272 deletions(-) delete mode 100644 Resources/Textures/Shaders/radial-menu.swsl diff --git a/Content.Client/UserInterface/Controls/RadialContainer.cs b/Content.Client/UserInterface/Controls/RadialContainer.cs index 0efa51f63d..72555aab5f 100644 --- a/Content.Client/UserInterface/Controls/RadialContainer.cs +++ b/Content.Client/UserInterface/Controls/RadialContainer.cs @@ -1,23 +1,12 @@ using Robust.Client.UserInterface.Controls; using System.Linq; using System.Numerics; -using Robust.Client.Graphics; -using Robust.Shared.Prototypes; namespace Content.Client.UserInterface.Controls; [Virtual] public class RadialContainer : LayoutContainer { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IClyde _clyde= default!; - private readonly ShaderInstance _shader; - - private readonly float[] _angles = new float[64]; - private readonly float[] _sectorMedians = new float[64]; - private readonly Color[] _sectorColors = new Color[64]; - private readonly Color[] _borderColors = new Color[64]; - /// /// Increment of radius per child element to be rendered. /// @@ -35,7 +24,11 @@ public class RadialContainer : LayoutContainer [ViewVariables(VVAccess.ReadWrite)] public Vector2 AngularRange { - get => _angularRange; + get + { + return _angularRange; + } + set { var x = value.X; @@ -96,9 +89,7 @@ public class RadialContainer : LayoutContainer /// public RadialContainer() { - IoCManager.InjectDependencies(this); - _shader = _prototypeManager.Index("RadialMenu") - .InstanceUnique(); + } /// @@ -170,67 +161,6 @@ public class RadialContainer : LayoutContainer return base.ArrangeOverride(finalSize); } - /// - protected override void Draw(DrawingHandleScreen handle) - { - base.Draw(handle); - - float selectedFrom = 0; - float selectedTo = 0; - - var i = 0; - foreach (var child in Children) - { - if (child is not IRadialMenuItemWithSector menuWithSector) - { - continue; - } - - _angles[i] = menuWithSector.AngleSectorTo; - _sectorMedians[i] = (menuWithSector.AngleSectorTo + menuWithSector.AngleSectorFrom) / 2; - - if (menuWithSector.IsHovered) - { - // menuWithSector.DrawBackground; - // menuWithSector.DrawBorder; - _sectorColors[i] = menuWithSector.HoverBackgroundColor; - _borderColors[i] = menuWithSector.HoverBorderColor; - selectedFrom = menuWithSector.AngleSectorFrom; - selectedTo = menuWithSector.AngleSectorTo; - } - else - { - _sectorColors[i] = menuWithSector.BackgroundColor; - _borderColors[i] = menuWithSector.BorderColor; - } - - i++; - } - - var screenSize = _clyde.ScreenSize; - - var menuCenter = new Vector2( - ScreenCoordinates.X + (Size.X / 2) * UIScale, - screenSize.Y - ScreenCoordinates.Y - (Size.Y / 2) * UIScale - ); - - _shader.SetParameter("separatorAngles", _angles); - _shader.SetParameter("sectorMedianAngles", _sectorMedians); - _shader.SetParameter("selectedFrom", selectedFrom); - _shader.SetParameter("selectedTo", selectedTo); - _shader.SetParameter("childCount", i); - _shader.SetParameter("sectorColors", _sectorColors); - _shader.SetParameter("borderColors", _borderColors); - _shader.SetParameter("centerPos", menuCenter); - _shader.SetParameter("screenSize", screenSize); - _shader.SetParameter("innerRadius", CalculatedRadius * InnerRadiusMultiplier * UIScale); - _shader.SetParameter("outerRadius", CalculatedRadius * OuterRadiusMultiplier * UIScale); - - handle.UseShader(_shader); - handle.DrawRect(new UIBox2(0, 0, screenSize.X, screenSize.Y), Color.White); - handle.UseShader(null); - } - /// /// Specifies the different radial alignment modes /// diff --git a/Content.Client/UserInterface/Controls/RadialMenu.cs b/Content.Client/UserInterface/Controls/RadialMenu.cs index 35aa655f3e..9734cf2960 100644 --- a/Content.Client/UserInterface/Controls/RadialMenu.cs +++ b/Content.Client/UserInterface/Controls/RadialMenu.cs @@ -362,12 +362,12 @@ public interface IRadialMenuItemWithSector /// /// Angle in radian where button sector should start. /// - public float AngleSectorFrom { set; get; } + public float AngleSectorFrom { set; } /// /// Angle in radian where button sector should end. /// - public float AngleSectorTo { set; get; } + public float AngleSectorTo { set; } /// /// Outer radius for drawing segment and pointer detection. @@ -388,41 +388,6 @@ public interface IRadialMenuItemWithSector /// Coordinates of center in parent component - button container. /// public Vector2 ParentCenter { set; } - - /// - /// Marker, is menu item hovered currently. - /// - public bool IsHovered { get; } - - /// - /// Color for menu item background when it is hovered over. - /// - Color HoverBackgroundColor { get; } - - /// - /// Color for menu item default state. - /// - Color BackgroundColor { get; } - - /// - /// Color for menu item border when item is hovered over. - /// - Color HoverBorderColor { get; } - - /// - /// Color for menu item border default state. - /// - Color BorderColor { get; } - - /// - /// Marker, if menu item background should be drawn. - /// - public bool DrawBackground { get; } - - /// - /// Marker, if menu item borders should be drawn. - /// - public bool DrawBorder { get; } } [Virtual] @@ -448,7 +413,7 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia /// Marker, that controls if border of segment should be rendered. Is false by default. /// /// - /// Default color of border is same as color of background. Use + /// By default color of border is same as color of background. Use /// and to change it. /// public bool DrawBorder { get; set; } = false; @@ -494,6 +459,12 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia set => _hoverBorderColorSrgb = Color.ToSrgb(value); } + /// + /// Color of separator lines. + /// Separator lines are used to visually separate sector of radial menu items. + /// + public Color SeparatorColor { get; set; } = new Color(128, 128, 128, 128); + /// float IRadialMenuItemWithSector.AngleSectorFrom { @@ -502,7 +473,6 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia _angleSectorFrom = value; _isWholeCircle = IsWholeCircle(value, _angleSectorTo); } - get => _angleSectorFrom; } /// @@ -513,7 +483,6 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia _angleSectorTo = value; _isWholeCircle = IsWholeCircle(_angleSectorFrom, value); } - get => _angleSectorTo; } /// @@ -535,6 +504,44 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia { } + /// + protected override void Draw(DrawingHandleScreen handle) + { + base.Draw(handle); + + if (_parentCenter == null) + { + return; + } + + // draw sector where space that button occupies actually is + var containerCenter = (_parentCenter.Value - Position) * UIScale; + + var angleFrom = _angleSectorFrom + _angleOffset; + var angleTo = _angleSectorTo + _angleOffset; + if (DrawBackground) + { + var segmentColor = DrawMode == DrawModeEnum.Hover + ? _hoverBackgroundColorSrgb + : _backgroundColorSrgb; + + DrawAnnulusSector(handle, containerCenter, _innerRadius * UIScale, _outerRadius * UIScale, angleFrom, angleTo, segmentColor); + } + + if (DrawBorder) + { + var borderColor = DrawMode == DrawModeEnum.Hover + ? _hoverBorderColorSrgb + : _borderColorSrgb; + DrawAnnulusSector(handle, containerCenter, _innerRadius * UIScale, _outerRadius * UIScale, angleFrom, angleTo, borderColor, false); + } + + if (!_isWholeCircle && DrawBorder) + { + DrawSeparatorLines(handle, containerCenter, _innerRadius * UIScale, _outerRadius * UIScale, angleFrom, angleTo, SeparatorColor); + } + } + /// protected override bool HasPoint(Vector2 point) { diff --git a/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs index 589a97629d..15c8065a44 100644 --- a/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs +++ b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs @@ -7,7 +7,6 @@ using Robust.Client.GameObjects; using Robust.Shared.Timing; using Robust.Client.UserInterface.XAML; using Robust.Client.Input; -using Robust.Shared.Collections; namespace Content.Client.UserInterface.Controls; @@ -174,7 +173,7 @@ public partial class SimpleRadialMenu : RadialMenu private void ClearExistingChildrenRadialButtons() { - var toRemove = new ValueList(ChildCount); + var toRemove = new List(ChildCount); foreach (var child in Children) { if (child != ContextualButton && child != MenuOuterAreaButton) diff --git a/Resources/Prototypes/Shaders/shaders.yml b/Resources/Prototypes/Shaders/shaders.yml index 631b8ee920..6e0bbd55b4 100644 --- a/Resources/Prototypes/Shaders/shaders.yml +++ b/Resources/Prototypes/Shaders/shaders.yml @@ -108,9 +108,4 @@ - type: shader id: Hologram kind: source - path: "/Textures/Shaders/hologram.swsl" - -- type: shader - id: RadialMenu - kind: source - path: "/Textures/Shaders/radial-menu.swsl" + path: "/Textures/Shaders/hologram.swsl" \ No newline at end of file diff --git a/Resources/Textures/Shaders/radial-menu.swsl b/Resources/Textures/Shaders/radial-menu.swsl deleted file mode 100644 index 30fa1a4cba..0000000000 --- a/Resources/Textures/Shaders/radial-menu.swsl +++ /dev/null @@ -1,148 +0,0 @@ -const highp float Thickness = 0.002; - -const highp float pi = 3.14159265; -const highp float twopi = 2.0 * pi; -const highp float halfpi = 0.5 * pi; -const highp float invpi = 1.0 / pi; - -uniform highp float innerRadius; -uniform highp float outerRadius; - -uniform highp vec4[64] sectorColors; -uniform highp vec4[64] borderColors; - -uniform highp float[64] separatorAngles; -uniform highp float[64] sectorMedianAngles; -uniform highp int childCount; -uniform highp vec2 centerPos; - -uniform highp float selectedFrom; -uniform highp float selectedTo; -uniform highp vec2 screenSize; - -highp float SMOOTH(highp float r, highp float R) -{ - return 1.0 - smoothstep(R - 1.0, R + 1.0, r); -} - -// line from center of circle to radius (outer arg) on theta0 angle (radian,) -highp float separator(highp vec2 d, highp float r, highp float outer, highp float theta0, highp float thickness) -{ - // rotate due to difference in coordinate spaces between shaders and ui - highp float theta1 = theta0 - halfpi; - highp vec2 p = outer * vec2(cos(theta1), -sin(theta1)); - highp float l = length(d - p * clamp(dot(d, p) / dot(p, p), 0.0, 1.0)); - return SMOOTH(l, thickness); -} - -highp float circle(highp float r, highp float radius, highp float width) -{ - return SMOOTH(r - width / 2.0, radius) - SMOOTH(r + width / 2.0, radius); -} - -// get angle between current point and circle center -highp float getAngle(highp vec2 d) -{ - highp vec2 n = normalize(d); - highp float angle = acos(n.x); - int isNegativeY = int(n.y < 0.0); - angle = angle + (twopi - angle * 2) * isNegativeY; - // rotate - angle = mod(angle - halfpi, twopi); - return angle; -} - -highp float pcurve(highp float x, highp float a, highp float b ) -{ - highp float k = pow(a + b,a + b) / (pow(a, a) * pow(b, b)); - return k * pow(x, a) * pow(1.0 - x, b); -} - -// gets alpha for radial gradients based on pcurve -highp float fillGradient(highp float r, highp float inner, highp float outer) -{ - highp float nInner = inner / outer; - highp float nR = r / outer; - return pcurve(nR, nInner, 1.0); -} - -void fragment() -{ - highp vec4 col = vec4(0.0); - - //angle of the line - highp vec2 d = FRAGCOORD.xy - centerPos; - highp float angle = getAngle(d); - - highp float r = length(FRAGCOORD.xy - centerPos); - // fill sectors - int isInsideRange = int(r > innerRadius && r < outerRadius); - highp float g = fillGradient(r, innerRadius, outerRadius); - - // trying to mix in color per button - - highp float from = 0; - for (int i = 0; i < childCount; i++) - { - highp float to = separatorAngles[i]; - int isInSector = int(angle > from && angle < to); - col += isInsideRange - * vec4(sectorColors[i].xyz , g)* isInSector; - - from = to; - } - - // get step of radial menu buttons in radian - highp float halfSectorAngleSize = (separatorAngles[1] - separatorAngles[0]) * 0.5; - - for (int i = 0; i < childCount; i++) - { - highp float sectorMedian = sectorMedianAngles[i]; - highp float sectorMedianToAngleDiff = abs(sectorMedian - angle); - highp vec4 borderColor = borderColors[i]; - highp vec4 borderColorLight = borderColor * 0.6; - int isInInnerRadius = int(r > innerRadius); - highp float iAngle = twopi - separatorAngles[i]; - // button separators - highp float sectorFromAngle; - int isCurrentZero = int(i > 0); - sectorFromAngle = separatorAngles[i - 1] * isCurrentZero; - - col += isInInnerRadius - * separator(d, r, outerRadius, sectorFromAngle, 0.5) * borderColor; - col += isInInnerRadius - * separator(d, r, outerRadius, iAngle, 0.5) * borderColor; - - // set up decorations - // inner button 'square' decoration - int isInInnerBorderRange = int(r > innerRadius + 15); - col += isInInnerRadius * isInInnerBorderRange - * separator(d, r, outerRadius - 15, twopi - sectorMedian - halfSectorAngleSize * 0.8, 1.0) * 0.2 * borderColorLight; - col += isInInnerRadius * isInInnerBorderRange - * separator(d, r, outerRadius - 15, twopi - sectorMedian + halfSectorAngleSize * 0.8, 1.0) * 0.2 * borderColorLight; - - int isInInnerBorderSector = int(sectorMedianToAngleDiff < halfSectorAngleSize * 0.8); - col += isInInnerRadius * isInInnerBorderRange * isInInnerBorderSector - * circle(r, innerRadius + 15, 2.0) * 0.2 * borderColorLight; - col += isInInnerRadius * isInInnerBorderRange * isInInnerBorderSector - * circle(r, outerRadius - 15, 2.0) * 0.2 * borderColorLight; - - // outer button decorative elements - int isInOuterBorderOuterSector = int(sectorMedianToAngleDiff < halfSectorAngleSize * 0.2); - col += isInOuterBorderOuterSector - * circle(r, innerRadius - 5, 4.0) * 0.4 * borderColor; - - int isInOuterBorderInnerSector = int(sectorMedianToAngleDiff < halfSectorAngleSize * 0.6); - col += isInOuterBorderInnerSector - * circle(r, outerRadius + 10, 4.0) * 0.4 * borderColor; - - // outer and inner circle of sectors - int isOnSectorBorder = int(sectorMedianToAngleDiff < halfSectorAngleSize); - col += isOnSectorBorder - * circle(r, innerRadius, 2.0) * borderColor; - col += isOnSectorBorder - * circle(r, outerRadius, 2.0) * borderColor; - } - - COLOR = col; -} From 453e85a89973d448acc56c0d93f117e24d04c5c7 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 12 Apr 2025 11:05:13 +0200 Subject: [PATCH 037/622] Lobby duration is now 5 minutes on wizden (#36476) The default value is 2 minutes 30 seconds, which was set many years ago. The game is different now, people need time to stretch their legs or get some water. This was prompted by an internal discussion about unhealthy playing habits in the game. --- Resources/ConfigPresets/WizardsDen/wizardsDen.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/ConfigPresets/WizardsDen/wizardsDen.toml b/Resources/ConfigPresets/WizardsDen/wizardsDen.toml index b29ee87d5c..6c7becbbb6 100644 --- a/Resources/ConfigPresets/WizardsDen/wizardsDen.toml +++ b/Resources/ConfigPresets/WizardsDen/wizardsDen.toml @@ -5,6 +5,7 @@ desc = "Official English Space Station 14 servers. Vanilla, roleplay ruleset." lobbyenabled = true soft_max_players = 80 +lobbyduration = 300 # 5 minutes lobby timer panic_bunker.enabled = true panic_bunker.min_overall_minutes = 120 panic_bunker.disable_with_admins = true From 4e5a73a44744223dea3fb8d98c1ec667d9efaf0b Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 12 Apr 2025 09:06:22 +0000 Subject: [PATCH 038/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1d39e71b2f..86984cdb19 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed windoors and high security doors not showing up on the AI's electrocution - HUD. - type: Fix - id: 7657 - time: '2024-11-27T05:55:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33551 - author: Beck Thompson changes: - message: Handheld light verbs are now predicted! @@ -3891,3 +3883,11 @@ id: 8156 time: '2025-04-11T04:58:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36383 +- author: PJB3005 + changes: + - message: Lobby time on Wizard's Den has been increased from 2 minute 30 seconds + to 5 minutes. + type: Tweak + id: 8157 + time: '2025-04-12T09:05:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36476 From fca83f9924fe2b9975b974fdd5a58b7cfa7ea52d Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sat, 12 Apr 2025 15:37:07 +0200 Subject: [PATCH 039/622] add debug verb for inspecting mind entities (#36474) * mind verb * new line --- .../Administration/Systems/AdminVerbSystem.cs | 17 ++++++++++++++++- .../Locale/en-US/mind/verbs/inspect-mind.ftl | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 Resources/Locale/en-US/mind/verbs/inspect-mind.ftl diff --git a/Content.Client/Administration/Systems/AdminVerbSystem.cs b/Content.Client/Administration/Systems/AdminVerbSystem.cs index dced59bbf2..4ced299a4d 100644 --- a/Content.Client/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Client/Administration/Systems/AdminVerbSystem.cs @@ -32,11 +32,26 @@ namespace Content.Client.Administration.Systems var verb = new VvVerb() { Text = Loc.GetString("view-variables"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/vv.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/vv.svg.192dpi.png")), Act = () => _clientConsoleHost.ExecuteCommand($"vv {GetNetEntity(args.Target)}"), ClientExclusive = true // opening VV window is client-side. Don't ask server to run this verb. }; args.Verbs.Add(verb); + + // Inspect mind + if (TryComp(args.Target, out var mindContainer) + && mindContainer.HasMind) + { + Verb mindVerb = new() + { + Text = Loc.GetString("inspect-mind-verb-get-data-text"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/sentient.svg.192dpi.png")), + Category = VerbCategory.Debug, + Act = () => _clientConsoleHost.ExecuteCommand($"vv {GetNetEntity(mindContainer.Mind)}"), + ClientExclusive = true + }; + args.Verbs.Add(mindVerb); + } } if (!_admin.IsAdmin(args.User)) diff --git a/Resources/Locale/en-US/mind/verbs/inspect-mind.ftl b/Resources/Locale/en-US/mind/verbs/inspect-mind.ftl new file mode 100644 index 0000000000..954676219c --- /dev/null +++ b/Resources/Locale/en-US/mind/verbs/inspect-mind.ftl @@ -0,0 +1 @@ +inspect-mind-verb-get-data-text = Inspect Mind From a6a29e25548c7eebd2ce565bdf0f4d10572c7657 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 12 Apr 2025 13:38:15 +0000 Subject: [PATCH 040/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index e1276232cf..05f2f1cd60 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1007,5 +1007,12 @@ Entries: id: 122 time: '2025-04-11T21:04:37.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36468 +- author: slarticodefast + changes: + - message: Added debug verb for quickly inspecting someone's mind entity in VV. + type: Add + id: 123 + time: '2025-04-12T13:37:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36474 Name: Admin Order: 1 From 76e72893c932b55beb82081bc1effae4095a7547 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Sat, 12 Apr 2025 10:18:31 -0400 Subject: [PATCH 041/622] Add warnings when TagSystem methods are called with string literals (#36281) Apply ForbidLiteralAttribute to all appropriate TagSystem methods --- Content.Shared/Tag/TagSystem.cs | 76 ++++++++++++++++----------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/Content.Shared/Tag/TagSystem.cs b/Content.Shared/Tag/TagSystem.cs index f1f620a694..b75e2a4af1 100644 --- a/Content.Shared/Tag/TagSystem.cs +++ b/Content.Shared/Tag/TagSystem.cs @@ -50,7 +50,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool AddTag(EntityUid entityUid, ProtoId tag) + public bool AddTag(EntityUid entityUid, [ForbidLiteral] ProtoId tag) { return AddTag((entityUid, EnsureComp(entityUid)), tag); } @@ -64,9 +64,9 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool AddTags(EntityUid entityUid, params ProtoId[] tags) + public bool AddTags(EntityUid entityUid, [ForbidLiteral] params ProtoId[] tags) { - return AddTags(entityUid, (IEnumerable>)tags); + return AddTags(entityUid, (IEnumerable>)tags); } /// @@ -78,7 +78,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool AddTags(EntityUid entityUid, IEnumerable> tags) + public bool AddTags(EntityUid entityUid, [ForbidLiteral] IEnumerable> tags) { return AddTags((entityUid, EnsureComp(entityUid)), tags); } @@ -93,7 +93,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool TryAddTag(EntityUid entityUid, ProtoId tag) + public bool TryAddTag(EntityUid entityUid, [ForbidLiteral] ProtoId tag) { return _tagQuery.TryComp(entityUid, out var component) && AddTag((entityUid, component), tag); @@ -109,7 +109,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool TryAddTags(EntityUid entityUid, params ProtoId[] tags) + public bool TryAddTags(EntityUid entityUid, [ForbidLiteral] params ProtoId[] tags) { return TryAddTags(entityUid, (IEnumerable>)tags); } @@ -124,7 +124,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool TryAddTags(EntityUid entityUid, IEnumerable> tags) + public bool TryAddTags(EntityUid entityUid, [ForbidLiteral] IEnumerable> tags) { return _tagQuery.TryComp(entityUid, out var component) && AddTags((entityUid, component), tags); @@ -139,7 +139,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool HasTag(EntityUid entityUid, ProtoId tag) + public bool HasTag(EntityUid entityUid, [ForbidLiteral] ProtoId tag) { return _tagQuery.TryComp(entityUid, out var component) && HasTag(component, tag); @@ -166,7 +166,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(EntityUid entityUid, params ProtoId[] tags) + public bool HasAllTags(EntityUid entityUid, [ForbidLiteral] params ProtoId[] tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAllTags(component, tags); @@ -181,7 +181,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(EntityUid entityUid, HashSet> tags) + public bool HasAllTags(EntityUid entityUid, [ForbidLiteral] HashSet> tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAllTags(component, tags); @@ -196,7 +196,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(EntityUid entityUid, List> tags) + public bool HasAllTags(EntityUid entityUid, [ForbidLiteral] List> tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAllTags(component, tags); @@ -211,7 +211,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(EntityUid entityUid, IEnumerable> tags) + public bool HasAllTags(EntityUid entityUid, [ForbidLiteral] IEnumerable> tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAllTags(component, tags); @@ -226,7 +226,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool HasAnyTag(EntityUid entityUid, ProtoId tag) => + public bool HasAnyTag(EntityUid entityUid, [ForbidLiteral] ProtoId tag) => HasTag(entityUid, tag); /// @@ -238,7 +238,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(EntityUid entityUid, params ProtoId[] tags) + public bool HasAnyTag(EntityUid entityUid, [ForbidLiteral] params ProtoId[] tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAnyTag(component, tags); @@ -253,7 +253,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(EntityUid entityUid, HashSet> tags) + public bool HasAnyTag(EntityUid entityUid, [ForbidLiteral] HashSet> tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAnyTag(component, tags); @@ -268,7 +268,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(EntityUid entityUid, List> tags) + public bool HasAnyTag(EntityUid entityUid, [ForbidLiteral] List> tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAnyTag(component, tags); @@ -283,7 +283,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(EntityUid entityUid, IEnumerable> tags) + public bool HasAnyTag(EntityUid entityUid, [ForbidLiteral] IEnumerable> tags) { return _tagQuery.TryComp(entityUid, out var component) && HasAnyTag(component, tags); @@ -298,7 +298,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool HasTag(TagComponent component, ProtoId tag) + public bool HasTag(TagComponent component, [ForbidLiteral] ProtoId tag) { #if DEBUG AssertValidTag(tag); @@ -315,7 +315,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool HasAllTags(TagComponent component, ProtoId tag) => + public bool HasAllTags(TagComponent component, [ForbidLiteral] ProtoId tag) => HasTag(component, tag); /// @@ -327,7 +327,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(TagComponent component, params ProtoId[] tags) + public bool HasAllTags(TagComponent component, [ForbidLiteral] params ProtoId[] tags) { foreach (var tag in tags) { @@ -350,7 +350,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTagsArray(TagComponent component, ProtoId[] tags) + public bool HasAllTagsArray(TagComponent component, [ForbidLiteral] ProtoId[] tags) { foreach (var tag in tags) { @@ -373,7 +373,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(TagComponent component, List> tags) + public bool HasAllTags(TagComponent component, [ForbidLiteral] List> tags) { foreach (var tag in tags) { @@ -396,7 +396,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(TagComponent component, HashSet> tags) + public bool HasAllTags(TagComponent component, [ForbidLiteral] HashSet> tags) { foreach (var tag in tags) { @@ -419,7 +419,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAllTags(TagComponent component, IEnumerable> tags) + public bool HasAllTags(TagComponent component, [ForbidLiteral] IEnumerable> tags) { foreach (var tag in tags) { @@ -442,7 +442,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool HasAnyTag(TagComponent component, ProtoId tag) => + public bool HasAnyTag(TagComponent component, [ForbidLiteral] ProtoId tag) => HasTag(component, tag); /// @@ -454,7 +454,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(TagComponent component, params ProtoId[] tags) + public bool HasAnyTag(TagComponent component, [ForbidLiteral] params ProtoId[] tags) { foreach (var tag in tags) { @@ -477,7 +477,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(TagComponent component, HashSet> tags) + public bool HasAnyTag(TagComponent component, [ForbidLiteral] HashSet> tags) { foreach (var tag in tags) { @@ -500,7 +500,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(TagComponent component, List> tags) + public bool HasAnyTag(TagComponent component, [ForbidLiteral] List> tags) { foreach (var tag in tags) { @@ -523,7 +523,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool HasAnyTag(TagComponent component, IEnumerable> tags) + public bool HasAnyTag(TagComponent component, [ForbidLiteral] IEnumerable> tags) { foreach (var tag in tags) { @@ -546,7 +546,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool RemoveTag(EntityUid entityUid, ProtoId tag) + public bool RemoveTag(EntityUid entityUid, [ForbidLiteral] ProtoId tag) { return _tagQuery.TryComp(entityUid, out var component) && RemoveTag((entityUid, component), tag); @@ -561,7 +561,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool RemoveTags(EntityUid entityUid, params ProtoId[] tags) + public bool RemoveTags(EntityUid entityUid, [ForbidLiteral] params ProtoId[] tags) { return RemoveTags(entityUid, (IEnumerable>)tags); } @@ -575,7 +575,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool RemoveTags(EntityUid entityUid, IEnumerable> tags) + public bool RemoveTags(EntityUid entityUid, [ForbidLiteral] IEnumerable> tags) { return _tagQuery.TryComp(entityUid, out var component) && RemoveTags((entityUid, component), tags); @@ -590,7 +590,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool AddTag(Entity entity, ProtoId tag) + public bool AddTag(Entity entity, [ForbidLiteral] ProtoId tag) { #if DEBUG AssertValidTag(tag); @@ -611,7 +611,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool AddTags(Entity entity, params ProtoId[] tags) + public bool AddTags(Entity entity, [ForbidLiteral] params ProtoId[] tags) { return AddTags(entity, (IEnumerable>)tags); } @@ -625,7 +625,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool AddTags(Entity entity, IEnumerable> tags) + public bool AddTags(Entity entity, [ForbidLiteral] IEnumerable> tags) { var update = false; foreach (var tag in tags) @@ -653,7 +653,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if no exists with the given id. /// - public bool RemoveTag(Entity entity, ProtoId tag) + public bool RemoveTag(Entity entity, [ForbidLiteral] ProtoId tag) { #if DEBUG AssertValidTag(tag); @@ -675,7 +675,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool RemoveTags(Entity entity, params ProtoId[] tags) + public bool RemoveTags(Entity entity, [ForbidLiteral] params ProtoId[] tags) { return RemoveTags(entity, (IEnumerable>)tags); } @@ -689,7 +689,7 @@ public sealed class TagSystem : EntitySystem /// /// Thrown if one of the ids represents an unregistered . /// - public bool RemoveTags(Entity entity, IEnumerable> tags) + public bool RemoveTags(Entity entity, [ForbidLiteral] IEnumerable> tags) { var update = false; foreach (var tag in tags) From 0c6e21dec26c23d2d1b1f1574003e70051cb80c6 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Sat, 12 Apr 2025 22:00:46 +0200 Subject: [PATCH 042/622] PlayerPanel Follow button (#36466) * Follow button * remove event stuff --- .../Administration/UI/PlayerPanel/PlayerPanel.xaml | 3 ++- .../UI/PlayerPanel/PlayerPanel.xaml.cs | 3 ++- .../Administration/UI/PlayerPanel/PlayerPanelEui.cs | 1 + Content.Server/Administration/PlayerPanelEui.cs | 13 +++++++++++++ .../Administration/PlayerPanelEuiState.cs | 7 +++++-- .../Locale/en-US/administration/ui/player-panel.ftl | 1 + 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml b/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml index 8feec273b4..4791dcf6aa 100644 --- a/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml +++ b/Content.Client/Administration/UI/PlayerPanel/PlayerPanel.xaml @@ -19,12 +19,13 @@ public void PopulateOrders(IEnumerable orders) { - Orders.DisposeAllChildren(); Requests.DisposeAllChildren(); foreach (var order in orders) { + if (order.Approved) + continue; + var product = _protoManager.Index(order.ProductId); var productName = product.Name; @@ -164,35 +221,67 @@ namespace Content.Client.Cargo.UI ("orderAmount", order.OrderQuantity), ("orderRequester", order.Requester)) }, - Description = {Text = Loc.GetString("cargo-console-menu-order-reason-description", - ("reason", order.Reason))} + Description = + { + Text = Loc.GetString("cargo-console-menu-order-reason-description", + ("reason", order.Reason)) + } }; row.Cancel.OnPressed += (args) => { OnOrderCanceled?.Invoke(args); }; - if (order.Approved) - { - row.Approve.Visible = false; - row.Cancel.Visible = false; - Orders.AddChild(row); - } - else - { - // TODO: Disable based on access. - row.Approve.OnPressed += (args) => { OnOrderApproved?.Invoke(args); }; - Requests.AddChild(row); - } + + // TODO: Disable based on access. + row.Approve.OnPressed += (args) => { OnOrderApproved?.Invoke(args); }; + Requests.AddChild(row); } } - public void UpdateCargoCapacity(int count, int capacity) + public void PopulateAccountActions() { - // TODO: Rename + Loc. - ShuttleCapacityLabel.Text = $"{count}/{capacity}"; + if (!_entityManager.TryGetComponent(_station, out var bank) || + !_entityManager.TryGetComponent(_owner, out var console)) + return; + + var i = 0; + ActionOptions.Clear(); + ActionOptions.AddItem(Loc.GetString("cargo-console-menu-account-action-option-withdraw"), i); + i++; + foreach (var account in bank.Accounts.Keys) + { + if (account == console.Account) + continue; + var accountProto = _protoManager.Index(account); + ActionOptions.AddItem(Loc.GetString("cargo-console-menu-account-action-option-transfer", + ("code", Loc.GetString(accountProto.Code))), + i); + ActionOptions.SetItemMetadata(i, account); + i++; + } } - public void UpdateBankData(string name, int points) + public void UpdateStation(EntityUid station) { - AccountNameLabel.Text = name; - PointsLabel.Text = Loc.GetString("cargo-console-menu-points-amount", ("amount", points.ToString())); + _station = station; + } + + protected override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + + if (!_bankQuery.TryComp(_station, out var bankAccount) || + !_orderConsoleQuery.TryComp(_owner, out var orderConsole)) + { + return; + } + + var balance = _cargoSystem.GetBalanceFromAccount((_station.Value, bankAccount), orderConsole.Account); + PointsLabel.Text = Loc.GetString("cargo-console-menu-points-amount", ("amount", balance)); + TransferLimitLabel.Text = Loc.GetString("cargo-console-menu-account-action-transfer-limit", + ("limit", (int) (balance * orderConsole.TransferLimit))); + + UnlimitedNotifier.Visible = orderConsole.TransferUnbounded; + AccountActionButton.Disabled = TransferSpinBox.Value <= 0 || + TransferSpinBox.Value > bankAccount.Accounts[orderConsole.Account] * orderConsole.TransferLimit || + _timing.CurTime < orderConsole.NextAccountActionTime; } } } diff --git a/Content.Client/Cargo/UI/CargoOrderRow.xaml b/Content.Client/Cargo/UI/CargoOrderRow.xaml index 1d636a1a29..22bd2291ae 100644 --- a/Content.Client/Cargo/UI/CargoOrderRow.xaml +++ b/Content.Client/Cargo/UI/CargoOrderRow.xaml @@ -1,11 +1,13 @@  + HorizontalExpand="True" + Margin="0 1"> + @@ -23,10 +25,10 @@ - - - - - - - - + + + + + + + - - + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + [Test] + public async Task XenoArtifactAddNodeTest() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var entManager = server.ResolveDependency(); + var artifactSystem = entManager.System(); + + await server.WaitPost(() => + { + var artifactUid = entManager.Spawn("TestArtifact"); + var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + + // Create 3 nodes + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node1, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node2, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node3, false)); + + Assert.That(artifactSystem.GetAllNodeIndices(artifactEnt).Count(), Is.EqualTo(3)); + + // Add connection from 1 -> 2 and 2-> 3 + artifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + artifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); + + // Assert that successors and direct successors are counted correctly for node 1. + Assert.That(artifactSystem.GetDirectSuccessorNodes(artifactEnt, node1!.Value).Count, Is.EqualTo(1)); + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node1!.Value).Count, Is.EqualTo(2)); + // Assert that we didn't somehow get predecessors on node 1. + Assert.That(artifactSystem.GetDirectPredecessorNodes(artifactEnt, node1!.Value), Is.Empty); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node1!.Value), Is.Empty); + + // Assert that successors and direct successors are counted correctly for node 2. + Assert.That(artifactSystem.GetDirectSuccessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); + // Assert that predecessors and direct predecessors are counted correctly for node 2. + Assert.That(artifactSystem.GetDirectPredecessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); + + // Assert that successors and direct successors are counted correctly for node 3. + Assert.That(artifactSystem.GetDirectSuccessorNodes(artifactEnt, node3!.Value), Is.Empty); + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node3!.Value), Is.Empty); + // Assert that predecessors and direct predecessors are counted correctly for node 3. + Assert.That(artifactSystem.GetDirectPredecessorNodes(artifactEnt, node3!.Value), Has.Count.EqualTo(1)); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node3!.Value), Has.Count.EqualTo(2)); + }); + await server.WaitRunTicks(1); + + await pair.CleanReturnAsync(); + } + + /// + /// Checks to make sure that removing nodes properly cleans up all connections. + /// + [Test] + public async Task XenoArtifactRemoveNodeTest() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var entManager = server.ResolveDependency(); + var artifactSystem = entManager.System(); + + await server.WaitPost(() => + { + var artifactUid = entManager.Spawn("TestArtifact"); + var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + + // Create 3 nodes + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node1, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node2, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node3, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node4, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node5, false)); + + Assert.That(artifactSystem.GetAllNodeIndices(artifactEnt).Count(), Is.EqualTo(5)); + + // Add connection: 1 -> 2 -> 3 -> 4 -> 5 + artifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + artifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); + artifactSystem.AddEdge(artifactEnt, node3!.Value, node4!.Value, false); + artifactSystem.AddEdge(artifactEnt, node4!.Value, node5!.Value, false); + + // Make sure we have a continuous connection between the two ends of the graph. + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node1.Value), Has.Count.EqualTo(4)); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node5.Value), Has.Count.EqualTo(4)); + + // Remove the node and make sure it's no longer in the artifact. + Assert.That(artifactSystem.RemoveNode(artifactEnt, node3!.Value, false)); + Assert.That(artifactSystem.TryGetIndex(artifactEnt, node3!.Value, out _), Is.False, "Node 3 still present in artifact."); + + // Check to make sure that we got rid of all the connections. + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node2!.Value), Is.Empty); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node4!.Value), Is.Empty); + }); + await server.WaitRunTicks(1); + + await pair.CleanReturnAsync(); + } + + /// + /// Sets up series of linked nodes and ensures that resizing the adjacency matrix doesn't disturb the connections + /// + [Test] + public async Task XenoArtifactResizeTest() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var entManager = server.ResolveDependency(); + var artifactSystem = entManager.System(); + + await server.WaitPost(() => + { + var artifactUid = entManager.Spawn("TestArtifact"); + var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + + // Create 3 nodes + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node1, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node2, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node3, false)); + + // Add connection: 1 -> 2 -> 3 + artifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + artifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); + + // Make sure our connection is set up + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node1.Value, node2.Value)); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node2.Value, node3.Value)); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node2.Value, node1.Value), Is.False); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node3.Value, node2.Value), Is.False); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node1.Value, node3.Value), Is.False); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node3.Value, node1.Value), Is.False); + + Assert.That(artifactSystem.GetIndex(artifactEnt, node1!.Value), Is.EqualTo(0)); + Assert.That(artifactSystem.GetIndex(artifactEnt, node2!.Value), Is.EqualTo(1)); + Assert.That(artifactSystem.GetIndex(artifactEnt, node3!.Value), Is.EqualTo(2)); + + // Add a new node, resizing the original adjacency matrix and array. + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node4)); + + // Check that our connections haven't changed. + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node1.Value, node2.Value)); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node2.Value, node3.Value)); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node2.Value, node1.Value), Is.False); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node3.Value, node2.Value), Is.False); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node1.Value, node3.Value), Is.False); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node3.Value, node1.Value), Is.False); + + // Has our array shifted any when we resized? + Assert.That(artifactSystem.GetIndex(artifactEnt, node1!.Value), Is.EqualTo(0)); + Assert.That(artifactSystem.GetIndex(artifactEnt, node2!.Value), Is.EqualTo(1)); + Assert.That(artifactSystem.GetIndex(artifactEnt, node3!.Value), Is.EqualTo(2)); + + // Check that 4 didn't somehow end up with connections + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node4!.Value), Is.Empty); + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node4!.Value), Is.Empty); + }); + await server.WaitRunTicks(1); + + await pair.CleanReturnAsync(); + } + + /// + /// Checks if removing a node and adding a new node into its place in the adjacency matrix doesn't accidentally retain extra data. + /// + [Test] + public async Task XenoArtifactReplaceTest() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var entManager = server.ResolveDependency(); + var artifactSystem = entManager.System(); + + await server.WaitPost(() => + { + var artifactUid = entManager.Spawn("TestArtifact"); + var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + + // Create 3 nodes + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node1, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node2, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node3, false)); + + // Add connection: 1 -> 2 -> 3 + artifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + artifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); + + // Make sure our connection is set up + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node1.Value, node2.Value)); + Assert.That(artifactSystem.NodeHasEdge(artifactEnt, node2.Value, node3.Value)); + + // Remove middle node, severing connections + artifactSystem.RemoveNode(artifactEnt, node2!.Value, false); + + // Make sure our connection are properly severed. + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node1.Value), Is.Empty); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node3.Value), Is.Empty); + + // Make sure our matrix is 3x3 + Assert.That(artifactEnt.Item2.NodeAdjacencyMatrixRows, Is.EqualTo(3)); + Assert.That(artifactEnt.Item2.NodeAdjacencyMatrixColumns, Is.EqualTo(3)); + + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node4, false)); + + // Make sure that adding in a new node didn't add a new slot but instead re-used the middle slot. + Assert.That(artifactEnt.Item2.NodeAdjacencyMatrixRows, Is.EqualTo(3)); + Assert.That(artifactEnt.Item2.NodeAdjacencyMatrixColumns, Is.EqualTo(3)); + + // Ensure that all connections are still severed + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node1.Value), Is.Empty); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node3.Value), Is.Empty); + Assert.That(artifactSystem.GetSuccessorNodes(artifactEnt, node4!.Value), Is.Empty); + Assert.That(artifactSystem.GetPredecessorNodes(artifactEnt, node4!.Value), Is.Empty); + + }); + await server.WaitRunTicks(1); + + await pair.CleanReturnAsync(); + } + + /// + /// Checks if the active nodes are properly detected. + /// + [Test] + public async Task XenoArtifactBuildActiveNodesTest() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var entManager = server.ResolveDependency(); + var artifactSystem = entManager.System(); + + await server.WaitPost(() => + { + var artifactUid = entManager.Spawn("TestArtifact"); + Entity artifactEnt = (artifactUid, entManager.GetComponent(artifactUid)); + + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node1, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node2, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node3, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node4, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node5, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node6, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node7, false)); + Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node8, false)); + + // /----( 6 ) + // /----[*3 ]-/----( 7 )----( 8 ) + // / + // / /----[*5 ] + // [ 1 ]--/----[ 2 ]--/----( 4 ) + // Diagram of the example generation. Nodes in [brackets] are unlocked, nodes in (braces) are locked + // and nodes with an *asterisk are supposed to be active. + artifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + artifactSystem.AddEdge(artifactEnt, node1!.Value, node3!.Value, false); + + artifactSystem.AddEdge(artifactEnt, node2!.Value, node4!.Value, false); + artifactSystem.AddEdge(artifactEnt, node2!.Value, node5!.Value, false); + + artifactSystem.AddEdge(artifactEnt, node3!.Value, node6!.Value, false); + artifactSystem.AddEdge(artifactEnt, node3!.Value, node7!.Value, false); + + artifactSystem.AddEdge(artifactEnt, node7!.Value, node8!.Value, false); + + artifactSystem.SetNodeUnlocked(node1!.Value); + artifactSystem.SetNodeUnlocked(node2!.Value); + artifactSystem.SetNodeUnlocked(node3!.Value); + artifactSystem.SetNodeUnlocked(node5!.Value); + + NetEntity[] expectedActiveNodes = + [ + entManager.GetNetEntity(node3!.Value.Owner), + entManager.GetNetEntity(node5!.Value.Owner) + ]; + Assert.That(artifactEnt.Comp.CachedActiveNodes, Is.SupersetOf(expectedActiveNodes)); + Assert.That(artifactEnt.Comp.CachedActiveNodes, Has.Count.EqualTo(expectedActiveNodes.Length)); + + }); + await server.WaitRunTicks(1); + + await pair.CleanReturnAsync(); + } + + [Test] + public async Task XenoArtifactGenerateSegmentsTest() + { + await using var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var entManager = server.ResolveDependency(); + var artifactSystem = entManager.System(); + + await server.WaitPost(() => + { + var artifact1Uid = entManager.Spawn("TestGenArtifactFlat"); + Entity artifact1Ent = (artifact1Uid, entManager.GetComponent(artifact1Uid)); + + var segments1 = artifactSystem.GetSegments(artifact1Ent); + Assert.That(segments1.Count, Is.EqualTo(2)); + Assert.That(segments1[0].Count, Is.EqualTo(1)); + Assert.That(segments1[1].Count, Is.EqualTo(1)); + + var artifact2Uid = entManager.Spawn("TestGenArtifactTall"); + Entity artifact2Ent = (artifact2Uid, entManager.GetComponent(artifact2Uid)); + + var segments2 = artifactSystem.GetSegments(artifact2Ent); + Assert.That(segments2.Count, Is.EqualTo(1)); + Assert.That(segments2[0].Count, Is.EqualTo(2)); + + var artifact3Uid = entManager.Spawn("TestGenArtifactFull"); + Entity artifact3Ent = (artifact3Uid, entManager.GetComponent(artifact3Uid)); + + var segments3 = artifactSystem.GetSegments(artifact3Ent); + Assert.That(segments3.Count, Is.EqualTo(1)); + Assert.That(segments3.Sum(x => x.Count), Is.EqualTo(6)); + var nodesDepths = segments3[0].Select(x => x.Comp.Depth).ToArray(); + Assert.That(nodesDepths.Distinct().Count(), Is.EqualTo(3)); + var grouped = nodesDepths.ToLookup(x => x); + Assert.That(grouped[0].Count(), Is.EqualTo(2)); + Assert.That(grouped[1].Count(), Is.GreaterThanOrEqualTo(2)); // tree is attempting sometimes to get wider (so it will look like a tree) + Assert.That(grouped[2].Count(), Is.LessThanOrEqualTo(2)); // maintain same width or, if we used 3 nodes on previous layer - we only have 1 left! + + }); + await server.WaitRunTicks(1); + + await pair.CleanReturnAsync(); + } +} diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index c8f19aadbe..c953277aad 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -10,8 +10,6 @@ using Content.Server.Mind; using Content.Server.Mind.Commands; using Content.Server.Prayer; using Content.Server.Station.Systems; -using Content.Server.Xenoarchaeology.XenoArtifacts; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Administration; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Chemistry.EntitySystems; @@ -60,7 +58,6 @@ namespace Content.Server.Administration.Systems [Dependency] private readonly EuiManager _euiManager = default!; [Dependency] private readonly GameTicker _ticker = default!; [Dependency] private readonly GhostRoleSystem _ghostRoleSystem = default!; - [Dependency] private readonly ArtifactSystem _artifactSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly PrayerSystem _prayerSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; @@ -454,29 +451,6 @@ namespace Content.Server.Administration.Systems args.Verbs.Add(verb); } - // XenoArcheology - if (_adminManager.IsAdmin(player) && TryComp(args.Target, out var artifact)) - { - // make artifact always active (by adding timer trigger) - args.Verbs.Add(new Verb() - { - Text = Loc.GetString("artifact-verb-make-always-active"), - Category = VerbCategory.Debug, - Act = () => EntityManager.AddComponent(args.Target), - Disabled = EntityManager.HasComponent(args.Target), - Impact = LogImpact.High - }); - - // force to activate artifact ignoring timeout - args.Verbs.Add(new Verb() - { - Text = Loc.GetString("artifact-verb-activate"), - Category = VerbCategory.Debug, - Act = () => _artifactSystem.ForceActivateArtifact(args.Target, component: artifact), - Impact = LogImpact.High - }); - } - // Make Sentient verb if (_groupController.CanCommand(player, "makesentient") && args.User != args.Target && diff --git a/Content.Server/Emp/EmpSystem.cs b/Content.Server/Emp/EmpSystem.cs index d8eab0c5d1..4b5143aa40 100644 --- a/Content.Server/Emp/EmpSystem.cs +++ b/Content.Server/Emp/EmpSystem.cs @@ -44,6 +44,22 @@ public sealed class EmpSystem : SharedEmpSystem Spawn(EmpPulseEffectPrototype, coordinates); } + /// + /// Triggers an EMP pulse at the given location, by first raising an , then a raising on all entities in range. + /// + /// The location to trigger the EMP pulse at. + /// The range of the EMP pulse. + /// The amount of energy consumed by the EMP pulse. + /// The duration of the EMP effects. + public void EmpPulse(EntityCoordinates coordinates, float range, float energyConsumption, float duration) + { + foreach (var uid in _lookup.GetEntitiesInRange(coordinates, range)) + { + TryEmpEffects(uid, energyConsumption, duration); + } + Spawn(EmpPulseEffectPrototype, coordinates); + } + /// /// Attempts to apply the effects of an EMP pulse onto an entity by first raising an , followed by raising a on it. /// diff --git a/Content.Server/EntityEffects/Effects/ActivateArtifact.cs b/Content.Server/EntityEffects/Effects/ActivateArtifact.cs deleted file mode 100644 index 8540478362..0000000000 --- a/Content.Server/EntityEffects/Effects/ActivateArtifact.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.Prototypes; -using Content.Shared.EntityEffects; - -namespace Content.Server.EntityEffects.Effects; - -public sealed partial class ActivateArtifact : EntityEffect -{ - public override void Effect(EntityEffectBaseArgs args) - { - var artifact = args.EntityManager.EntitySysManager.GetEntitySystem(); - artifact.TryActivateArtifact(args.TargetEntity, logMissing: false); - } - - protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => - Loc.GetString("reagent-effect-guidebook-activate-artifact", ("chance", Probability)); -} diff --git a/Content.Server/Instruments/InstrumentComponent.cs b/Content.Server/Instruments/InstrumentComponent.cs index db9dbb375b..ab1fd2ce04 100644 --- a/Content.Server/Instruments/InstrumentComponent.cs +++ b/Content.Server/Instruments/InstrumentComponent.cs @@ -1,4 +1,3 @@ -using Content.Server.UserInterface; using Content.Shared.Instruments; using Robust.Shared.Player; using ActivatableUIComponent = Content.Shared.UserInterface.ActivatableUIComponent; @@ -21,8 +20,3 @@ public sealed partial class InstrumentComponent : SharedInstrumentComponent _entMan.GetComponentOrNull(Owner)?.CurrentSingleUser ?? _entMan.GetComponentOrNull(Owner)?.PlayerSession.AttachedEntity; } - -[RegisterComponent] -public sealed partial class ActiveInstrumentComponent : Component -{ -} diff --git a/Content.Server/PAI/PAISystem.cs b/Content.Server/PAI/PAISystem.cs index b0f4f2476d..fd581f40e4 100644 --- a/Content.Server/PAI/PAISystem.cs +++ b/Content.Server/PAI/PAISystem.cs @@ -8,6 +8,7 @@ using Content.Shared.PAI; using Content.Shared.Popups; using Robust.Shared.Random; using System.Text; +using Content.Shared.Instruments; using Robust.Shared.Player; namespace Content.Server.PAI; diff --git a/Content.Server/Radiation/Systems/RadiationSystem.cs b/Content.Server/Radiation/Systems/RadiationSystem.cs index 3ba393959c..7402a72701 100644 --- a/Content.Server/Radiation/Systems/RadiationSystem.cs +++ b/Content.Server/Radiation/Systems/RadiationSystem.cs @@ -1,4 +1,4 @@ -using Content.Server.Radiation.Components; +using Content.Server.Radiation.Components; using Content.Shared.Radiation.Components; using Content.Shared.Radiation.Events; using Content.Shared.Stacks; @@ -50,7 +50,7 @@ public sealed partial class RadiationSystem : EntitySystem public void IrradiateEntity(EntityUid uid, float radsPerSecond, float time) { - var msg = new OnIrradiatedEvent(time, radsPerSecond); + var msg = new OnIrradiatedEvent(time, radsPerSecond, uid); RaiseLocalEvent(uid, msg); } diff --git a/Content.Server/StationEvents/Events/VentClogRule.cs b/Content.Server/StationEvents/Events/VentClogRule.cs index f14958631d..3b6eeebe85 100644 --- a/Content.Server/StationEvents/Events/VentClogRule.cs +++ b/Content.Server/StationEvents/Events/VentClogRule.cs @@ -8,6 +8,7 @@ using Content.Shared.Station.Components; using JetBrains.Annotations; using Robust.Shared.Random; using System.Linq; +using Content.Shared.Chemistry.Reaction; namespace Content.Server.StationEvents.Events; @@ -47,7 +48,7 @@ public sealed class VentClogRule : StationEventSystem var quantity = weak ? component.WeakReagentQuantity : component.ReagentQuantity; solution.AddReagent(reagent, quantity); - var foamEnt = Spawn("Foam", transform.Coordinates); + var foamEnt = Spawn(ChemicalReactionSystem.FoamReaction, transform.Coordinates); var spreadAmount = weak ? component.WeakSpread : component.Spread; _smoke.StartSmoke(foamEnt, solution, component.Time, spreadAmount); Audio.PlayPvs(component.Sound, transform.Coordinates); diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteSystem.cs b/Content.Server/Xenoarchaeology/Artifact/RandomArtifactSpriteSystem.cs similarity index 64% rename from Content.Server/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteSystem.cs rename to Content.Server/Xenoarchaeology/Artifact/RandomArtifactSpriteSystem.cs index 091441df21..645dac24e2 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteSystem.cs +++ b/Content.Server/Xenoarchaeology/Artifact/RandomArtifactSpriteSystem.cs @@ -1,11 +1,11 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; using Content.Shared.Item; +using Content.Shared.Xenoarchaeology.Artifact; using Content.Shared.Xenoarchaeology.XenoArtifacts; using Robust.Server.GameObjects; using Robust.Shared.Random; using Robust.Shared.Timing; -namespace Content.Server.Xenoarchaeology.XenoArtifacts; +namespace Content.Server.Xenoarchaeology.Artifact; public sealed class RandomArtifactSpriteSystem : EntitySystem { @@ -17,8 +17,11 @@ public sealed class RandomArtifactSpriteSystem : EntitySystem public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnActivated); + SubscribeLocalEvent(UnlockingStageStarted); + SubscribeLocalEvent(UnlockingStageFinished); + SubscribeLocalEvent(ArtifactActivated); } public override void Update(float frameTime) @@ -47,9 +50,19 @@ public sealed class RandomArtifactSpriteSystem : EntitySystem _item.SetHeldPrefix(uid, "ano" + randomSprite.ToString("D2")); //set item artifact inhands } - private void OnActivated(EntityUid uid, RandomArtifactSpriteComponent component, ArtifactActivatedEvent args) + private void UnlockingStageStarted(Entity ent, ref ArtifactUnlockingStartedEvent args) { - _appearance.SetData(uid, SharedArtifactsVisuals.IsActivated, true); - component.ActivationStart = _time.CurTime; + _appearance.SetData(ent, SharedArtifactsVisuals.IsUnlocking, true); + } + + private void UnlockingStageFinished(Entity ent, ref ArtifactUnlockingFinishedEvent args) + { + _appearance.SetData(ent, SharedArtifactsVisuals.IsUnlocking, false); + } + + private void ArtifactActivated(Entity ent, ref XenoArtifactActivatedEvent args) + { + _appearance.SetData(ent, SharedArtifactsVisuals.IsActivated, true); + ent.Comp.ActivationStart = _time.CurTime; } } diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEChargeBatteryComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEChargeBatteryComponent.cs new file mode 100644 index 0000000000..d63a52f42b --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEChargeBatteryComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// This is used for recharging all nearby batteries when activated. +/// +[RegisterComponent, Access(typeof(XAEChargeBatterySystem))] +public sealed partial class XAEChargeBatteryComponent : Component +{ + /// + /// The radius of entities that will be affected. + /// + [DataField("radius")] + public float Radius = 15f; +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAECreateGasComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAECreateGasComponent.cs new file mode 100644 index 0000000000..ba0893dc71 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAECreateGasComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Atmos; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// XenoArtifact effect that creates gas in atmosphere. +/// +[RegisterComponent, Access(typeof(XAECreateGasSystem))] +public sealed partial class XAECreateGasComponent : Component +{ + /// + /// The gases and how many moles will be created of each. + /// + [DataField] + public Dictionary Gases = new(); +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAECreatePuddleComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAECreatePuddleComponent.cs new file mode 100644 index 0000000000..f77fc96227 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAECreatePuddleComponent.cs @@ -0,0 +1,46 @@ +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Destructible.Thresholds; +using Robust.Shared.Prototypes; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// This is used for an artifact that creates a puddle of +/// random chemicals upon being triggered. +/// +[RegisterComponent, Access(typeof(XAECreatePuddleSystem))] +public sealed partial class XAECreatePuddleComponent : Component +{ + /// + /// The solution where all the chemicals are stored. + /// + [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] + public Solution ChemicalSolution = default!; + + /// + /// The different chemicals that can be spawned by this effect. + /// + [DataField] + public List> PossibleChemicals = new(); + + /// + /// The number of chemicals in the puddle. + /// + [DataField] + public MinMax ChemAmount = new MinMax(1, 3); + + /// + /// List of reagents selected for this node. Selected ones are chosen on first activation + /// and are picked from and is calculated separately for each node. + /// + [DataField] + public List>? SelectedChemicals; + + /// + /// Marker, if entity where this component is placed should have description replaced with selected chemicals + /// on component init. + /// + [DataField] + public bool ReplaceDescription; +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEEmpInAreaComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEEmpInAreaComponent.cs new file mode 100644 index 0000000000..1e9489e9ec --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEEmpInAreaComponent.cs @@ -0,0 +1,26 @@ +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// Effect of EMP on activation. +/// +[RegisterComponent, Access(typeof(XAEEmpInAreaSystem))] +public sealed partial class XAEEmpInAreaComponent : Component +{ + /// + /// Range of EMP effect. + /// + [DataField] + public float Range = 4f; + + /// + /// Energy to be consumed from energy containers. + /// + [DataField] + public float EnergyConsumption = 1000000; + + /// + /// Duration (in seconds) for which devices going to be disabled. + /// + [DataField] + public float DisableDuration = 60f; +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEFoamComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEFoamComponent.cs new file mode 100644 index 0000000000..d216275945 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEFoamComponent.cs @@ -0,0 +1,56 @@ +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.Prototypes; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// Generates foam from the artifact when activated. +/// +[RegisterComponent, Access(typeof(XAEFoamSystem))] +public sealed partial class XAEFoamComponent : Component +{ + /// + /// The list of reagents that will randomly be picked from + /// to choose the foam reagent. + /// + [DataField(required: true)] + public List> Reagents = new(); + + /// + /// The foam reagent. + /// + [DataField] + public string? SelectedReagent; + + /// + /// How long does the foam last? + /// + [DataField] + public float Duration = 10f; + + /// + /// How much reagent is in the foam? + /// + [DataField] + public float ReagentAmount = 100f; + + /// + /// Minimum radius of foam spawned. + /// + [DataField] + public int MinFoamAmount = 15; + + /// + /// Maximum radius of foam spawned. + /// + [DataField] + public int MaxFoamAmount = 20; + + /// + /// Marker, if entity where this component is placed should have description replaced with selected chemicals + /// on component init. + /// + [DataField] + public bool ReplaceDescription; +} + diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEIgniteComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEIgniteComponent.cs new file mode 100644 index 0000000000..a8d591efe1 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEIgniteComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.Destructible.Thresholds; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// Artifact that ignites surrounding entities when triggered. +/// +[RegisterComponent, Access(typeof(XAEIgniteSystem))] +public sealed partial class XAEIgniteComponent : Component +{ + /// + /// Range, inside which all entities going be set on fire. + /// + [DataField] + public float Range = 2f; + + /// + /// Amount of fire stacks to apply + /// + [DataField] + public MinMax FireStack = new(2, 5); +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/LightFlickerArtifactComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAELightFlickerComponent.cs similarity index 51% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/LightFlickerArtifactComponent.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAELightFlickerComponent.cs index 24578d722d..b7fe332dcf 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/LightFlickerArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAELightFlickerComponent.cs @@ -1,20 +1,20 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; /// /// Flickers all the lights within a certain radius. /// -[RegisterComponent] -public sealed partial class LightFlickerArtifactComponent : Component +[RegisterComponent, Access(typeof(XAELightFlickerSystem))] +public sealed partial class XAELightFlickerComponent : Component { /// - /// Lights within this radius will be flickered on activation + /// Lights within this radius will be flickered on activation. /// - [DataField("radius")] + [DataField] public float Radius = 4; /// - /// The chance that the light will flicker + /// The chance that the light will flicker. /// - [DataField("flickerChance")] + [DataField] public float FlickerChance = 0.75f; } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyOthersArtifactComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEPolymorphComponent.cs similarity index 62% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyOthersArtifactComponent.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEPolymorphComponent.cs index 2611d78b08..02aaa3f4ad 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyOthersArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEPolymorphComponent.cs @@ -1,16 +1,14 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; -using Robust.Shared.Audio; using Content.Shared.Polymorph; +using Robust.Shared.Audio; using Robust.Shared.Prototypes; -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; /// -/// Artifact polymorphs surrounding entities when triggered. +/// Artifact polymorphs entities when triggered. /// -[RegisterComponent] -[Access(typeof(PolyOthersArtifactSystem))] -public sealed partial class PolyOthersArtifactComponent : Component +[RegisterComponent, Access(typeof(XAEPolymorphSystem))] +public sealed partial class XAEPolymorphComponent : Component { /// /// The polymorph effect to trigger. @@ -19,7 +17,7 @@ public sealed partial class PolyOthersArtifactComponent : Component public ProtoId PolymorphPrototypeName = "ArtifactMonkey"; /// - /// range of the effect. + /// Range of the effect. /// [DataField] public float Range = 2f; diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TelepathicArtifactComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETelepathicComponent.cs similarity index 85% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TelepathicArtifactComponent.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETelepathicComponent.cs index a7073a743a..2354d2f16b 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TelepathicArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETelepathicComponent.cs @@ -1,11 +1,11 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; /// /// Harmless artifact that broadcast "thoughts" to players nearby. /// Thoughts are shown as popups and unique for each player. /// -[RegisterComponent] -public sealed partial class TelepathicArtifactComponent : Component +[RegisterComponent, Access(typeof(XAETelepathicSystem))] +public sealed partial class XAETelepathicComponent : Component { /// /// Loc string ids of telepathic messages. diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TemperatureArtifactComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETemperatureComponent.cs similarity index 75% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TemperatureArtifactComponent.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETemperatureComponent.cs index 0988617cdc..00d3775a8d 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TemperatureArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETemperatureComponent.cs @@ -1,12 +1,12 @@ using Content.Shared.Atmos; -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; /// /// Change atmospherics temperature until it reach target. /// -[RegisterComponent] -public sealed partial class TemperatureArtifactComponent : Component +[RegisterComponent, Access(typeof(XAETemperatureSystem))] +public sealed partial class XAETemperatureComponent : Component { [DataField("targetTemp"), ViewVariables(VVAccess.ReadWrite)] public float TargetTemperature = Atmospherics.T0C; diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ThrowArtifactComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEThrowThingsAroundComponent.cs similarity index 75% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ThrowArtifactComponent.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEThrowThingsAroundComponent.cs index 0c27392208..674bfd3251 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ThrowArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEThrowThingsAroundComponent.cs @@ -1,11 +1,11 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; /// /// Throws all nearby entities backwards. /// Also pries nearby tiles. /// -[RegisterComponent] -public sealed partial class ThrowArtifactComponent : Component +[RegisterComponent, Access(typeof(XAEThrowThingsAroundSystem))] +public sealed partial class XAEThrowThingsAroundComponent : Component { /// /// How close do you have to be to get yeeted? diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETriggerExplosivesComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETriggerExplosivesComponent.cs new file mode 100644 index 0000000000..b9e23f036b --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAETriggerExplosivesComponent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Explosion.Components.OnTrigger; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// Activates 'trigger' for . +/// +[RegisterComponent, Access(typeof(XAETriggerExplosivesSystem))] +public sealed partial class XAETriggerExplosivesComponent : Component; diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs new file mode 100644 index 0000000000..5e9bf7352b --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs @@ -0,0 +1,31 @@ +using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact activation effect that is fully charging batteries in certain range. +/// +public sealed class XAEChargeBatterySystem : BaseXAESystem +{ + [Dependency] private readonly BatterySystem _battery = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + + /// Pre-allocated and re-used collection. + private readonly HashSet> _batteryEntities = new(); + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + var chargeBatteryComponent = ent.Comp; + _batteryEntities.Clear(); + _lookup.GetEntitiesInRange(args.Coordinates, chargeBatteryComponent.Radius, _batteryEntities); + foreach (var battery in _batteryEntities) + { + _battery.SetCharge(battery, battery.Comp.MaxCharge, battery); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAECreateGasSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAECreateGasSystem.cs new file mode 100644 index 0000000000..517e2144e0 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAECreateGasSystem.cs @@ -0,0 +1,52 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Atmos; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Server.GameObjects; +using Robust.Shared.Collections; +using Robust.Shared.Map.Components; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that creates certain atmospheric gas on artifact tile / adjacent tiles. +/// +public sealed class XAECreateGasSystem : BaseXAESystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly MapSystem _map = default!; + + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + var grid = _transform.GetGrid(args.Coordinates); + var map = _transform.GetMap(args.Coordinates); + if (map == null || !TryComp(grid, out var gridComp)) + return; + + var tile = _map.LocalToTile(grid.Value, gridComp, args.Coordinates); + + var mixtures = new ValueList(); + if (_atmosphere.GetTileMixture(grid.Value, map.Value, tile, excite: true) is { } localMixture) + mixtures.Add(localMixture); + + if (_atmosphere.GetAdjacentTileMixtures(grid.Value, tile, excite: true) is var adjacentTileMixtures) + { + while (adjacentTileMixtures.MoveNext(out var adjacentMixture)) + { + mixtures.Add(adjacentMixture); + } + } + + foreach (var (gas, moles) in ent.Comp.Gases) + { + var molesPerMixture = moles / mixtures.Count; + + foreach (var mixture in mixtures) + { + mixture.AdjustMoles(gas, molesPerMixture); + } + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAECreatePuddleSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAECreatePuddleSystem.cs new file mode 100644 index 0000000000..7f996266f6 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAECreatePuddleSystem.cs @@ -0,0 +1,77 @@ +using Content.Server.Fluids.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that creates puddle of chemical reagents under artifact. +/// +public sealed class XAECreatePuddleSystem: BaseXAESystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly PuddleSystem _puddle = default!; + [Dependency] private readonly MetaDataSystem _metaData= default!; + [Dependency] private readonly IPrototypeManager _prototypeManager= default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + } + + private void OnInit(EntityUid uid, XAECreatePuddleComponent component, MapInitEvent _) + { + if (component.PossibleChemicals == null || component.PossibleChemicals.Count == 0) + return; + + if (component.SelectedChemicals == null) + { + var chemicalList = new List>(); + var chemAmount = component.ChemAmount.Next(_random); + for (var i = 0; i < chemAmount; i++) + { + var chemProto = _random.Pick(component.PossibleChemicals); + chemicalList.Add(chemProto); + } + + component.SelectedChemicals = chemicalList; + } + + if (component.ReplaceDescription) + { + var reagentNames = new HashSet(); + foreach (var chemProtoId in component.SelectedChemicals) + { + var reagent = _prototypeManager.Index(chemProtoId); + reagentNames.Add(reagent.LocalizedName); + } + + var reagentNamesStr = string.Join(", ", reagentNames); + var newEntityDescription = Loc.GetString("xenoarch-effect-puddle", ("reagent", reagentNamesStr)); + _metaData.SetEntityDescription(uid, newEntityDescription); + } + } + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + var component = ent.Comp; + if (component.SelectedChemicals == null) + return; + + var amountPerChem = component.ChemicalSolution.MaxVolume / component.SelectedChemicals.Count; + foreach (var reagent in component.SelectedChemicals) + { + component.ChemicalSolution.AddReagent(reagent, amountPerChem); + } + + _puddle.TrySpillAt(ent, component.ChemicalSolution, out _); + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEEmpInAreaSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEEmpInAreaSystem.cs new file mode 100644 index 0000000000..43a8ed9929 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEEmpInAreaSystem.cs @@ -0,0 +1,20 @@ +using Content.Server.Emp; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that creates EMP on use. +/// +public sealed class XAEEmpInAreaSystem : BaseXAESystem +{ + [Dependency] private readonly EmpSystem _emp = default!; + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + _emp.EmpPulse(args.Coordinates, ent.Comp.Range, ent.Comp.EnergyConsumption, ent.Comp.DisableDuration); + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEFoamSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEFoamSystem.cs new file mode 100644 index 0000000000..d5190ce416 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEFoamSystem.cs @@ -0,0 +1,63 @@ +using Content.Server.Fluids.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that starts Foam chemical reaction with random-ish reagents inside. +/// +public sealed class XAEFoamSystem : BaseXAESystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SmokeSystem _smoke = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager= default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(EntityUid uid, XAEFoamComponent component, MapInitEvent args) + { + if (component.SelectedReagent != null) + return; + + if (component.Reagents.Count == 0) + return; + + component.SelectedReagent = _random.Pick(component.Reagents); + + if (component.ReplaceDescription) + { + var reagent = _prototypeManager.Index(component.SelectedReagent); + var newEntityDescription = Loc.GetString("xenoarch-effect-foam", ("reagent", reagent.LocalizedName)); + _metaData.SetEntityDescription(uid, newEntityDescription); + } + } + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + var component = ent.Comp; + if (component.SelectedReagent == null) + return; + + var sol = new Solution(); + var range = (int)MathF.Round(MathHelper.Lerp(component.MinFoamAmount, component.MaxFoamAmount, _random.NextFloat(0, 1f))); + sol.AddReagent(component.SelectedReagent, component.ReagentAmount); + var foamEnt = Spawn(ChemicalReactionSystem.FoamReaction, args.Coordinates); + var spreadAmount = range * 4; + _smoke.StartSmoke(foamEnt, sol, component.Duration, spreadAmount); + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEIgniteSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEIgniteSystem.cs new file mode 100644 index 0000000000..14270fb866 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEIgniteSystem.cs @@ -0,0 +1,47 @@ +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Shared.Random; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact activation effect that ignites any flammable entity in range. +/// +public sealed class XAEIgniteSystem : BaseXAESystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly FlammableSystem _flammable = default!; + + private EntityQuery _flammables; + + /// Pre-allocated and re-used collection. + private readonly HashSet _entities = new(); + + /// + public override void Initialize() + { + base.Initialize(); + + _flammables = GetEntityQuery(); + } + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + var component = ent.Comp; + _entities.Clear(); + _lookup.GetEntitiesInRange(ent.Owner, component.Range, _entities); + foreach (var target in _entities) + { + if (!_flammables.TryGetComponent(target, out var fl)) + continue; + + fl.FireStacks += component.FireStack.Next(_random); + _flammable.Ignite(target, ent.Owner, fl); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAELightFlickerSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAELightFlickerSystem.cs new file mode 100644 index 0000000000..4c4073b123 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAELightFlickerSystem.cs @@ -0,0 +1,49 @@ +using Content.Server.Ghost; +using Content.Server.Light.Components; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Shared.Random; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact activation effect that flickers light on and off. +/// +public sealed class XAELightFlickerSystem : BaseXAESystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly GhostSystem _ghost = default!; + + private EntityQuery _lights; + + /// Pre-allocated and re-used collection. + private readonly HashSet _entities = new(); + + /// + public override void Initialize() + { + base.Initialize(); + + _lights = GetEntityQuery(); + } + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + _entities.Clear(); + _lookup.GetEntitiesInRange(ent.Owner, ent.Comp.Radius, _entities, LookupFlags.StaticSundries); + foreach (var light in _entities) + { + if (!_lights.HasComponent(light)) + continue; + + if (!_random.Prob(ent.Comp.FlickerChance)) + continue; + + //todo: extract effect from ghost system, update power system accordingly + _ghost.DoGhostBooEvent(light); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEPolymorphSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEPolymorphSystem.cs new file mode 100644 index 0000000000..8418a3baf9 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEPolymorphSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Polymorph.Systems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Humanoid; +using Content.Shared.Mobs.Systems; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Shared.Audio.Systems; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact activation effect that is polymorphing all humanoid entities in range. +/// +public sealed class XAEPolymorphSystem : BaseXAESystem +{ + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly MobStateSystem _mob = default!; + [Dependency] private readonly PolymorphSystem _poly = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + /// Pre-allocated and re-used collection. + private readonly HashSet> _humanoids = new(); + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + _humanoids.Clear(); + _lookup.GetEntitiesInRange(args.Coordinates, ent.Comp.Range, _humanoids); + foreach (var comp in _humanoids) + { + var target = comp.Owner; + if (!_mob.IsAlive(target)) + continue; + + _poly.PolymorphEntity(target, ent.Comp.PolymorphPrototypeName); + _audio.PlayPvs(ent.Comp.PolySound, ent); + } + } +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TelepathicArtifactSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAETelepathicSystem.cs similarity index 53% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TelepathicArtifactSystem.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/XAETelepathicSystem.cs index df06d4ab01..1755248a5b 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TelepathicArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAETelepathicSystem.cs @@ -1,31 +1,34 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; using Content.Shared.Popups; -using Robust.Server.GameObjects; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; using Robust.Shared.Player; using Robust.Shared.Random; -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; +namespace Content.Server.Xenoarchaeology.Artifact.XAE; -public sealed class TelepathicArtifactSystem : EntitySystem +/// +/// System for xeno artifact activation effect that sends sublime telepathic messages. +/// +public sealed class XAETelepathicSystem : BaseXAESystem { [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnActivate); - } + /// Pre-allocated and re-used collection. + private readonly HashSet _entities = new(); - private void OnActivate(EntityUid uid, TelepathicArtifactComponent component, ArtifactActivatedEvent args) + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) { + var component = ent.Comp; // try to find victims nearby - var victims = _lookup.GetEntitiesInRange(uid, component.Range); - foreach (var victimUid in victims) + _entities.Clear(); + _lookup.GetEntitiesInRange(ent, component.Range, _entities); + foreach (var victimUid in _entities) { - if (!EntityManager.HasComponent(victimUid)) + if (!HasComp(victimUid)) continue; // roll if msg should be usual or drastic diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAETemperatureSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAETemperatureSystem.cs new file mode 100644 index 0000000000..01a11b946f --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAETemperatureSystem.cs @@ -0,0 +1,49 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Atmos; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Server.GameObjects; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that changes atmospheric temperature on adjacent tiles. +/// +public sealed class XAETemperatureSystem : BaseXAESystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; + [Dependency] private readonly TransformSystem _transformSystem = default!; + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + var component = ent.Comp; + var transform = Transform(ent); + + var center = _atmosphereSystem.GetContainingMixture(ent.Owner, false, true); + if (center == null) + return; + + UpdateTileTemperature(component, center); + + if (component.AffectAdjacentTiles && transform.GridUid != null) + { + var position = _transformSystem.GetGridOrMapTilePosition(ent, transform); + var enumerator = _atmosphereSystem.GetAdjacentTileMixtures(transform.GridUid.Value, position, excite: true); + + while (enumerator.MoveNext(out var mixture)) + { + UpdateTileTemperature(component, mixture); + } + } + } + + private void UpdateTileTemperature(XAETemperatureComponent component, GasMixture environment) + { + var dif = component.TargetTemperature - environment.Temperature; + var absDif = Math.Abs(dif); + var step = Math.Min(absDif, component.SpawnTemperature); + environment.Temperature += dif > 0 ? step : -step; + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEThrowThingsAroundSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEThrowThingsAroundSystem.cs new file mode 100644 index 0000000000..e73fc86a71 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEThrowThingsAroundSystem.cs @@ -0,0 +1,72 @@ +using System.Numerics; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Maps; +using Content.Shared.Physics; +using Content.Shared.Throwing; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; +using Robust.Shared.Map.Components; +using Robust.Shared.Physics.Components; +using Robust.Shared.Random; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact activation effect that pries tiles and throws stuff around. +/// +public sealed class XAEThrowThingsAroundSystem : BaseXAESystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly TileSystem _tile = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + + private EntityQuery _physQuery; + + /// Pre-allocated and re-used collection. + private readonly HashSet _entities = new(); + + /// + public override void Initialize() + { + base.Initialize(); + + _physQuery = GetEntityQuery(); + } + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + var component = ent.Comp; + var xform = Transform(ent); + if (TryComp(xform.GridUid, out var grid)) + { + var areaForTilesPry = new Circle(_transform.GetWorldPosition(xform), component.Range); + var tiles = _map.GetTilesIntersecting(xform.GridUid.Value, grid, areaForTilesPry, true); + + foreach (var tile in tiles) + { + if (!_random.Prob(component.TilePryChance)) + continue; + + _tile.PryTile(tile); + } + } + + _entities.Clear(); + _lookup.GetEntitiesInRange(ent, component.Range, _entities, LookupFlags.Dynamic | LookupFlags.Sundries); + foreach (var entity in _entities) + { + if (_physQuery.TryGetComponent(entity, out var phys) + && (phys.CollisionMask & (int)CollisionGroup.GhostImpassable) != 0) + continue; + + var tempXform = Transform(entity); + + var foo = _transform.GetWorldPosition(tempXform) - _transform.GetWorldPosition(xform); + _throwing.TryThrow(entity, foo * 2, component.ThrowStrength, ent, 0); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAETriggerExplosivesSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAETriggerExplosivesSystem.cs new file mode 100644 index 0000000000..8767023c61 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAETriggerExplosivesSystem.cs @@ -0,0 +1,24 @@ +using Content.Server.Explosion.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Explosion.Components; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; + +namespace Content.Server.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect of triggering explosion. +/// +public sealed class XAETriggerExplosivesSystem : BaseXAESystem +{ + [Dependency] private readonly ExplosionSystem _explosion = default!; + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + if(!TryComp(ent, out var explosiveComp)) + return; + + _explosion.TriggerExplosive(ent, explosiveComp); + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATGasComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATGasComponent.cs new file mode 100644 index 0000000000..a5a9a4447b --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATGasComponent.cs @@ -0,0 +1,28 @@ +using Content.Shared.Atmos; + +namespace Content.Server.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for an artifact that is activated by having a certain amount of gas around it. +/// +[RegisterComponent, Access(typeof(XATGasSystem))] +public sealed partial class XATGasComponent : Component +{ + /// + /// The gas that is related to trigger. + /// + [DataField] + public Gas TargetGas; + + /// + /// The amount of gas needed. + /// + [DataField] + public float Moles = Atmospherics.MolesCellStandard * 0.1f; + + /// + /// Marker, if mentioned gas should be present in entity tile for trigger to activate, or it should not. + /// + [DataField] + public bool ShouldBePresent = true; +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATMagnetComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATMagnetComponent.cs new file mode 100644 index 0000000000..0126a2f5a8 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATMagnetComponent.cs @@ -0,0 +1,21 @@ +namespace Content.Server.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// Component for triggering node on getting activated by powerful magnets. +/// +[RegisterComponent, Access(typeof(XATMagnetSystem))] +public sealed partial class XATMagnetComponent : Component +{ + /// + /// How close to the magnet do you have to be? + /// + [DataField] + public float MagnetRange = 40f; + + /// + /// How close do active magboots have to be? + /// This is smaller because they are weaker magnets + /// + [DataField] + public float MagbootsRange = 2f; +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATPressureComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATPressureComponent.cs new file mode 100644 index 0000000000..bdd2f21e33 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATPressureComponent.cs @@ -0,0 +1,20 @@ +namespace Content.Server.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for an artifact that activates when above or below a certain pressure. +/// +[RegisterComponent, Access(typeof(XATPressureSystem))] +public sealed partial class XATPressureComponent : Component +{ + /// + /// The lower-end pressure threshold. Is not considered when null. + /// + [DataField] + public float? MinPressureThreshold; + + /// + /// The higher-end pressure threshold. Is not considered when null. + /// + [DataField] + public float? MaxPressureThreshold; +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATTemperatureComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATTemperatureComponent.cs new file mode 100644 index 0000000000..b8e080ccd9 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/Components/XATTemperatureComponent.cs @@ -0,0 +1,20 @@ +namespace Content.Server.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for an artifact that is activated by having a certain temperature near it. +/// +[RegisterComponent, Access(typeof(XATTemperatureSystem))] +public sealed partial class XATTemperatureComponent : Component +{ + /// + /// Threshold temperature for trigger activation. + /// + [DataField] + public float TargetTemperature; + + /// + /// Marker, if temp needs to be above or below the target. + /// + [DataField] + public bool TriggerOnHigherTemp = true; +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/XATGasSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/XATGasSystem.cs new file mode 100644 index 0000000000..49f24acbd1 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/XATGasSystem.cs @@ -0,0 +1,36 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAT.Components; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT; + +namespace Content.Server.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger, which gets activated from some gas being on the same time as artifact with certain concentration. +/// +public sealed class XATGasSystem : BaseQueryUpdateXATSystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + + protected override void UpdateXAT(Entity artifact, Entity node, float frameTime) + { + var xform = Transform(artifact); + + if (_atmosphere.GetTileMixture((artifact, xform)) is not { } mixture) + return; + + var gasTrigger = node.Comp1; + var moles = mixture.GetMoles(gasTrigger.TargetGas); + + if (gasTrigger.ShouldBePresent) + { + if (moles >= gasTrigger.Moles) + Trigger(artifact, node); + } + else + { + if (moles <= gasTrigger.Moles) + Trigger(artifact, node); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/XATMagnetSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/XATMagnetSystem.cs new file mode 100644 index 0000000000..d045682d55 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/XATMagnetSystem.cs @@ -0,0 +1,67 @@ +using Content.Server.Salvage; +using Content.Server.Xenoarchaeology.Artifact.XAT.Components; +using Content.Shared.Clothing; +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT; + +namespace Content.Server.Xenoarchaeology.Artifact.XAT; + +/// +/// System for checking if magnets-related xeno artifact node should be triggered. +/// Works with magboots and salvage magnet, salvage magnet triggers only upon pulsing on activation. +/// +public sealed class XATMagnetSystem : BaseQueryUpdateXATSystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + + /// Pre-allocated and re-used collection. + private HashSet> _magbootEntities = new(); + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMagnetActivated); + } + + /// + protected override void UpdateXAT(Entity artifact, Entity node, float frameTime) + { + var coords = Transform(artifact.Owner).Coordinates; + + _magbootEntities.Clear(); + _lookup.GetEntitiesInRange(coords, node.Comp1.MagbootsRange, _magbootEntities); + foreach (var ent in _magbootEntities) + { + if(!TryComp(ent, out var itemToggle) || !itemToggle.Activated) + continue; + + Trigger(artifact, node); + break; + } + } + + private void OnMagnetActivated(ref SalvageMagnetActivatedEvent args) + { + var magnetCoordinates = Transform(args.Magnet).Coordinates; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp, out var node)) + { + if (node.Attached == null) + continue; + + var artifact = _xenoArtifactQuery.Get(GetEntity(node.Attached.Value)); + + if (!CanTrigger(artifact, (uid, node))) + continue; + + var artifactCoordinates = Transform(artifact).Coordinates; + if (_transform.InRange(magnetCoordinates, artifactCoordinates, comp.MagnetRange)) + Trigger(artifact, (uid, comp, node)); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/XATPressureSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/XATPressureSystem.cs new file mode 100644 index 0000000000..571bbee9a8 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/XATPressureSystem.cs @@ -0,0 +1,29 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAT.Components; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT; + +namespace Content.Server.Xenoarchaeology.Artifact.XAT; + +/// +/// System for checking if pressure-related xeno artifact node should be triggered. +/// +public sealed class XATPressureSystem : BaseQueryUpdateXATSystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + + /// + protected override void UpdateXAT(Entity artifact, Entity node, float frameTime) + { + var xform = Transform(artifact); + + if (_atmosphere.GetTileMixture((artifact, xform)) is not { } mixture) + return; + + var pressure = mixture.Pressure; + if (pressure >= node.Comp1.MaxPressureThreshold || pressure <= node.Comp1.MinPressureThreshold) + { + Trigger(artifact, node); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XAT/XATTemperatureSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAT/XATTemperatureSystem.cs new file mode 100644 index 0000000000..99e2b72eef --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XAT/XATTemperatureSystem.cs @@ -0,0 +1,37 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Server.Xenoarchaeology.Artifact.XAT.Components; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT; + +namespace Content.Server.Xenoarchaeology.Artifact.XAT; + +/// +/// System for checking if temperature-related xeno artifact node should be triggered. +/// +public sealed class XATTemperatureSystem : BaseQueryUpdateXATSystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + + /// + protected override void UpdateXAT(Entity artifact, Entity node, float frameTime) + { + var xform = Transform(artifact); + + if (_atmosphere.GetTileMixture((artifact, xform)) is not { } mixture) + return; + + var curTemp = mixture.Temperature; + + var temperatureTriggerComponent = node.Comp1; + if (temperatureTriggerComponent.TriggerOnHigherTemp) + { + if (curTemp >= temperatureTriggerComponent.TargetTemperature) + Trigger(artifact, node); + } + else + { + if (curTemp <= temperatureTriggerComponent.TargetTemperature) + Trigger(artifact, node); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XenoArtifactCommands.cs b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactCommands.cs new file mode 100644 index 0000000000..31d079e3ad --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactCommands.cs @@ -0,0 +1,125 @@ +using System.Text; +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Robust.Shared.Map; +using Robust.Shared.Prototypes; +using Robust.Shared.Toolshed; + +namespace Content.Server.Xenoarchaeology.Artifact; + +/// +/// Toolshed commands for manipulating xeno artifact. +/// +[ToolshedCommand, AdminCommand(AdminFlags.Debug)] +public sealed class XenoArtifactCommand : ToolshedCommand +{ + [ValidatePrototypeId] + public const string ArtifactPrototype = "BaseXenoArtifact"; + + /// List existing artifacts. + [CommandImplementation("list")] + public IEnumerable List() + { + var query = EntityManager.EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out _)) + { + yield return uid; + } + } + + /// + /// Output matrix of artifact nodes and how they are connected. + /// + [CommandImplementation("printMatrix")] + public string PrintMatrix([PipedArgument] EntityUid artifactEntitUid) + { + var comp = EntityManager.GetComponent(artifactEntitUid); + + var nodeCount = comp.NodeVertices.Length; + + var sb = new StringBuilder("\n |"); + for (var i = 0; i < nodeCount; i++) + { + sb.Append($" {i:D2}|"); + } + + AddHorizontalFiller(sb); + + for (var i = 0; i < nodeCount; i++) + { + sb.Append($"\n{i:D2}|"); + for (var j = 0; j < nodeCount; j++) + { + var value = comp.NodeAdjacencyMatrix[i][j] + ? "X" + : " "; + sb.Append($" {value} |"); + } + AddHorizontalFiller(sb); + } + + return sb.ToString(); + + void AddHorizontalFiller(StringBuilder builder) + { + builder.AppendLine(); + builder.Append("--+"); + for (var i = 0; i < nodeCount; i++) + { + builder.Append($"---+"); + } + } + } + + /// Output total research points artifact contains. + [CommandImplementation("totalResearch")] + public int TotalResearch([PipedArgument] EntityUid artifactEntityUid) + { + var artiSys = EntityManager.System(); + var comp = EntityManager.GetComponent(artifactEntityUid); + + var sum = 0; + + var nodes = artiSys.GetAllNodes((artifactEntityUid, comp)); + foreach (var node in nodes) + { + sum += node.Comp.ResearchValue; + } + + return sum; + } + + /// + /// Spawns a bunch of artifacts and gets average total research points they can yield. + /// + [CommandImplementation("averageResearch")] + public float AverageResearch() + { + const int n = 100; + var sum = 0; + + for (var i = 0; i < n; i++) + { + var ent = Spawn(ArtifactPrototype, MapCoordinates.Nullspace); + sum += TotalResearch(ent); + Del(ent); + } + + return (float) sum / n; + } + + /// Unlocks all nodes of artifact. + [CommandImplementation("unlockAllNodes")] + public void UnlockAllNodes([PipedArgument] EntityUid artifactEntityUid) + { + var artiSys = EntityManager.System(); + var comp = EntityManager.GetComponent(artifactEntityUid); + + var nodes = artiSys.GetAllNodes((artifactEntityUid, comp)); + foreach (var node in nodes) + { + artiSys.SetNodeUnlocked((node, node.Comp)); + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XenoArtifactSystem.ProcGen.cs b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactSystem.ProcGen.cs new file mode 100644 index 0000000000..9da98dca61 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactSystem.ProcGen.cs @@ -0,0 +1,219 @@ +using System.Linq; +using Content.Shared.Random.Helpers; +using Content.Shared.Whitelist; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.Xenoarchaeology.Artifact; + +public sealed partial class XenoArtifactSystem +{ + [Dependency] private readonly EntityWhitelistSystem _entityWhitelist = default!; + + private void GenerateArtifactStructure(Entity ent) + { + var nodeCount = ent.Comp.NodeCount.Next(RobustRandom); + var triggerPool = CreateTriggerPool(ent, nodeCount); + // trigger pool could be smaller, then requested node count + nodeCount = triggerPool.Count; + ResizeNodeGraph(ent, nodeCount); + while (nodeCount > 0) + { + GenerateArtifactSegment(ent, triggerPool, ref nodeCount); + } + + RebuildXenoArtifactMetaData((ent, ent)); + } + + /// + /// Creates pool from all node triggers that current artifact can support. + /// As artifact cannot re-use triggers, pool will be growing smaller + /// and smaller with each node generated. + /// + /// Artifact for which pool should be created. + /// + /// Max size of pool. Resulting pool is not guaranteed to be exactly as large, but it will 100% won't be bigger. + /// + private List CreateTriggerPool(Entity ent, int size) + { + var triggerPool = new List(size); + var weightsProto = PrototypeManager.Index(ent.Comp.TriggerWeights); + var weightsByTriggersLeft = new Dictionary(weightsProto.Weights); + + while (triggerPool.Count < size) + { + // OOPS! We ran out of triggers. + if (weightsByTriggersLeft.Count == 0) + { + Log.Error($"Insufficient triggers for generating {ToPrettyString(ent)}! Needed {size} but had {triggerPool.Count}"); + return triggerPool; + } + + var triggerId = RobustRandom.Pick(weightsByTriggersLeft); + weightsByTriggersLeft.Remove(triggerId); + var trigger = PrototypeManager.Index(triggerId); + if (_entityWhitelist.IsWhitelistFail(trigger.Whitelist, ent)) + continue; + + triggerPool.Add(trigger); + } + + return triggerPool; + } + + /// + /// Generates segment of artifact - isolated graph, nodes inside which are interconnected. + /// As size of segment is randomized - it is subtracted from node count. + /// + private void GenerateArtifactSegment( + Entity ent, + List triggerPool, + ref int nodeCount + ) + { + var segmentSize = GetArtifactSegmentSize(ent, nodeCount); + nodeCount -= segmentSize; + var populatedNodes = PopulateArtifactSegmentRecursive(ent, triggerPool, ref segmentSize); + + var segments = GetSegmentsFromNodes(ent, populatedNodes).ToList(); + + // We didn't connect all of our nodes: do extra work to make sure there's a connection. + if (segments.Count > 1) + { + var parent = segments.MaxBy(s => s.Count)!; + var minP = parent.Min(n => n.Comp.Depth); + var maxP = parent.Max(n => n.Comp.Depth); + + segments.Remove(parent); + foreach (var segment in segments) + { + // calculate the range of the depth of the nodes in the segment + var minS = segment.Min(n => n.Comp.Depth); + var maxS = segment.Max(n => n.Comp.Depth); + + // Figure out the range of depths that allows for a connection between these two. + // The range is essentially the lower values + 1 on each side. + var min = Math.Max(minS, minP) - 1; + var max = Math.Min(maxS, maxP) + 1; + + // how the fuck did you do this? you don't even deserve to get a parent. fuck you. + if (min > max || min == max) + continue; + + var node1Options = segment.Where(n => n.Comp.Depth >= min && n.Comp.Depth <= max) + .ToList(); + if (node1Options.Count == 0) + { + continue; + } + + var node1 = RobustRandom.Pick(node1Options); + var node1Depth = node1.Comp.Depth; + + var node2Options = parent.Where(n => n.Comp.Depth >= node1Depth - 1 && n.Comp.Depth <= node1Depth + 1 && n.Comp.Depth != node1Depth) + .ToList(); + if (node2Options.Count == 0) + { + continue; + } + + var node2 = RobustRandom.Pick(node2Options); + + if (node1.Comp.Depth < node2.Comp.Depth) + { + AddEdge((ent, ent.Comp), node1, node2, false); + } + else + { + AddEdge((ent, ent.Comp), node2, node1, false); + } + } + } + } + + /// + /// Recursively populate layers of artifact segment - isolated graph, nodes inside which are interconnected. + /// Each next iteration is going to have more chances to have more nodes (so it goes 'from top to bottom' of + /// the tree, creating its peak nodes first, and then making layers with more and more branches). + /// + private List> PopulateArtifactSegmentRecursive( + Entity ent, + List triggerPool, + ref int segmentSize, + int iteration = 0 + ) + { + if (segmentSize == 0) + return new(); + + // Try and get larger as we create more layers. Prevents excessive layers. + var mod = RobustRandom.Next((int) (iteration / 1.5f), iteration + 1); + + var layerMin = Math.Min(ent.Comp.NodesPerSegmentLayer.Min + mod, segmentSize); + var layerMax = Math.Min(ent.Comp.NodesPerSegmentLayer.Max + mod, segmentSize); + + // Default to one node if we had shenanigans and ended up with weird layer counts. + var nodeCount = 1; + if (layerMax >= layerMin) + nodeCount = RobustRandom.Next(layerMin, layerMax + 1); // account for non-inclusive max + + segmentSize -= nodeCount; + var nodes = new List>(); + for (var i = 0; i < nodeCount; i++) + { + var trigger = RobustRandom.PickAndTake(triggerPool); + nodes.Add(CreateNode(ent, trigger, iteration)); + } + + var successors = PopulateArtifactSegmentRecursive( + ent, + triggerPool, + ref segmentSize, + iteration: iteration + 1 + ); + + if (successors.Count == 0) + return nodes; + + foreach (var successor in successors) + { + var node = RobustRandom.Pick(nodes); + AddEdge((ent, ent), node, successor, dirty: false); + } + + // randomly add in some extra edges for variance. + var scatterCount = ent.Comp.ScatterPerLayer.Next(RobustRandom); + for (var i = 0; i < scatterCount; i++) + { + var node = RobustRandom.Pick(nodes); + var successor = RobustRandom.Pick(successors); + AddEdge((ent, ent), node, successor, dirty: false); + } + + return nodes; + } + + /// + /// Rolls segment size, based on amount of nodes left and XenoArtifactComponent settings. + /// + private int GetArtifactSegmentSize(Entity ent, int nodeCount) + { + // Make sure we can't generate a single segment artifact. + // We always want to have at least 2 segments. For variety. + var segmentMin = ent.Comp.SegmentSize.Min; + var segmentMax = Math.Min(ent.Comp.SegmentSize.Max, Math.Max(nodeCount / 2, segmentMin)); + + var segmentSize = RobustRandom.Next(segmentMin, segmentMax + 1); // account for non-inclusive max + var remainder = nodeCount - segmentSize; + + // If our next segment is going to be undersized, then we just absorb it into this segment. + if (remainder < ent.Comp.SegmentSize.Min) + segmentSize += remainder; + + // Sanity check to make sure we don't exceed the node count. (it shouldn't happen prior anyway but oh well) + segmentSize = Math.Min(nodeCount, segmentSize); + + return segmentSize; + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XenoArtifactSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactSystem.cs new file mode 100644 index 0000000000..fbea515dc3 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactSystem.cs @@ -0,0 +1,35 @@ +using Content.Server.Cargo.Systems; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.Components; + +namespace Content.Server.Xenoarchaeology.Artifact; + +/// +public sealed partial class XenoArtifactSystem : SharedXenoArtifactSystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnArtifactMapInit); + SubscribeLocalEvent(OnCalculatePrice); + } + + private void OnArtifactMapInit(Entity ent, ref MapInitEvent args) + { + if (ent.Comp.IsGenerationRequired) + GenerateArtifactStructure(ent); + } + + private void OnCalculatePrice(Entity ent, ref PriceCalculationEvent args) + { + foreach (var node in GetAllNodes(ent)) + { + if (node.Comp.Locked) + continue; + + args.Price += node.Comp.ResearchValue * ent.Comp.PriceMultiplier; + } + } +} diff --git a/Content.Server/Xenoarchaeology/Artifact/XenoArtifactUnlockNodeCommand.cs b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactUnlockNodeCommand.cs new file mode 100644 index 0000000000..1782619780 --- /dev/null +++ b/Content.Server/Xenoarchaeology/Artifact/XenoArtifactUnlockNodeCommand.cs @@ -0,0 +1,84 @@ +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Robust.Shared.Console; + +namespace Content.Server.Xenoarchaeology.Artifact; + +/// Command for unlocking specific node of xeno artifact. +[AdminCommand(AdminFlags.Debug)] +public sealed class XenoArtifactUnlockNodeCommand : LocalizedCommands +{ + [Dependency] private readonly EntityManager _entities = default!; + + /// + public override string Command => "unlocknode"; + + /// + public override string Description => Loc.GetString("cmd-unlocknode-desc"); + + /// + public override string Help => Loc.GetString("cmd-unlocknode-help"); + + /// + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 2) + { + shell.WriteError(Loc.GetString("cmd-parse-failure-unlocknode-arg-num")); + return; + } + + if (!NetEntity.TryParse(args[1], out var netNode)) + { + shell.WriteError(Loc.GetString("cmd-parse-failure-unlocknode-invalid-entity")); + return; + } + + if (!_entities.TryGetEntity(netNode, out var entityUid)) + { + shell.WriteError(Loc.GetString("cmd-parse-failure-unlocknode-invalid-entity")); + return; + } + _entities.System() + .SetNodeUnlocked(entityUid.Value); + } + + /// + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + var query = _entities.EntityQueryEnumerator(); + var completionOptions = new List(); + while (query.MoveNext(out var uid, out _)) + { + completionOptions.Add(new CompletionOption(uid.ToString())); + } + + return CompletionResult.FromHintOptions(completionOptions, ""); + } + + if (args.Length == 2 && + NetEntity.TryParse(args[0], out var netEnt) && + _entities.TryGetEntity(netEnt, out var artifactUid) && + _entities.TryGetComponent(artifactUid, out var comp)) + { + var artifactSystem = _entities.System(); + + var result = new List(); + foreach (var node in artifactSystem.GetAllNodes((artifactUid.Value, comp))) + { + var metaData = _entities.MetaQuery.Comp(artifactUid.Value); + var entityUidStr = _entities.GetNetEntity(node) + .ToString(); + var completionOption = new CompletionOption(entityUidStr, metaData.EntityName); + result.Add(completionOption); + } + + return CompletionResult.FromHintOptions(result, ""); + } + + return CompletionResult.Empty; + } +} diff --git a/Content.Server/Xenoarchaeology/Equipment/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/ArtifactAnalyzerSystem.cs new file mode 100644 index 0000000000..2d5aa459fb --- /dev/null +++ b/Content.Server/Xenoarchaeology/Equipment/ArtifactAnalyzerSystem.cs @@ -0,0 +1,50 @@ +using Content.Server.Research.Systems; +using Content.Server.Xenoarchaeology.Artifact; +using Content.Shared.Popups; +using Content.Shared.Xenoarchaeology.Equipment; +using Content.Shared.Xenoarchaeology.Equipment.Components; +using Robust.Shared.Audio.Systems; + +namespace Content.Server.Xenoarchaeology.Equipment; + +/// +public sealed class ArtifactAnalyzerSystem : SharedArtifactAnalyzerSystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly ResearchSystem _research = default!; + [Dependency] private readonly XenoArtifactSystem _xenoArtifact = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExtractButtonPressed); + } + + private void OnExtractButtonPressed(Entity ent, ref AnalysisConsoleExtractButtonPressedMessage args) + { + if (!TryGetArtifactFromConsole(ent, out var artifact)) + return; + + if (!_research.TryGetClientServer(ent, out var server, out var serverComponent)) + return; + + var sumResearch = 0; + foreach (var node in _xenoArtifact.GetAllNodes(artifact.Value)) + { + var research = _xenoArtifact.GetResearchValue(node); + _xenoArtifact.SetConsumedResearchValue(node, node.Comp.ConsumedResearchValue + research); + sumResearch += research; + } + + if (sumResearch == 0) + return; + + _research.ModifyServerPoints(server.Value, sumResearch, serverComponent); + _audio.PlayPvs(ent.Comp.ExtractSound, artifact.Value); + _popup.PopupEntity(Loc.GetString("analyzer-artifact-extract-popup"), artifact.Value, PopupType.Large); + } +} + diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/ActiveArtifactAnalyzerComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/ActiveArtifactAnalyzerComponent.cs deleted file mode 100644 index 7c1fe288fc..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/ActiveArtifactAnalyzerComponent.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations; - -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -/// -/// Activecomp used for tracking artifact analyzers that are currently -/// in the process of scanning an artifact. -/// -[RegisterComponent] -public sealed partial class ActiveArtifactAnalyzerComponent : Component -{ - /// - /// When did the scanning start or last resume? - /// - [DataField("startTime", customTypeSerializer: typeof(TimespanSerializer))] - public TimeSpan StartTime; - - /// - /// When pausing, this will store the duration the scan has already been running for. - /// - [ViewVariables(VVAccess.ReadWrite)] - public TimeSpan AccumulatedRunTime; - - /// - /// Is analysis paused? - /// It could be when the Artifact Analyzer has no power, for example. - /// - [ViewVariables(VVAccess.ReadWrite)] - public bool AnalysisPaused = false; - - /// - /// What is being scanned? - /// - [DataField] - public EntityUid Artifact; -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/ActiveScannedArtifactComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/ActiveScannedArtifactComponent.cs deleted file mode 100644 index da6b35dab0..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/ActiveScannedArtifactComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Robust.Shared.Audio; - -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -/// -/// This is used for tracking artifacts that are currently -/// being scanned by -/// -[RegisterComponent] -public sealed partial class ActiveScannedArtifactComponent : Component -{ - /// - /// The scanner that is scanning this artifact - /// - [ViewVariables] - public EntityUid Scanner; - - /// - /// The sound that plays when the scan fails - /// - public readonly SoundSpecifier ScanFailureSound = new SoundPathSpecifier("/Audio/Machines/custom_deny.ogg"); -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/AnalysisConsoleComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/AnalysisConsoleComponent.cs deleted file mode 100644 index 892e24495b..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/AnalysisConsoleComponent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Shared.DeviceLinking; -using Robust.Shared.Audio; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -/// -/// The console that is used for artifact analysis -/// -[RegisterComponent] -public sealed partial class AnalysisConsoleComponent : Component -{ - /// - /// The analyzer entity the console is linked. - /// Can be null if not linked. - /// - [ViewVariables(VVAccess.ReadWrite)] - public EntityUid? AnalyzerEntity; - - /// - /// The machine linking port for the analyzer - /// - [DataField("linkingPort", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string LinkingPort = "ArtifactAnalyzerSender"; - - /// - /// The sound played when an artifact has points extracted. - /// - [DataField("extractSound")] - public SoundSpecifier ExtractSound = new SoundPathSpecifier("/Audio/Effects/radpulse11.ogg"); - - /// - /// The entity spawned by a report. - /// - [DataField("reportEntityId", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ReportEntityId = "Paper"; -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/ArtifactAnalyzerComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/ArtifactAnalyzerComponent.cs deleted file mode 100644 index 949717676f..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/ArtifactAnalyzerComponent.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts; -using Content.Shared.Construction.Prototypes; -using Robust.Shared.Audio; -using Robust.Shared.Serialization.TypeSerializers.Implementations; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -/// -/// A machine that is combined and linked to the -/// in order to analyze artifacts and extract points. -/// -[RegisterComponent] -public sealed partial class ArtifactAnalyzerComponent : Component -{ - /// - /// How long it takes to analyze an artifact - /// - [DataField("analysisDuration", customTypeSerializer: typeof(TimespanSerializer))] - public TimeSpan AnalysisDuration = TimeSpan.FromSeconds(30); - - /// - /// The corresponding console entity. - /// Can be null if not linked. - /// - [ViewVariables] - public EntityUid? Console; - - [ViewVariables(VVAccess.ReadWrite)] - public bool ReadyToPrint = false; - - [DataField("scanFinishedSound")] - public SoundSpecifier ScanFinishedSound = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg"); - - #region Analysis Data - [DataField] - public EntityUid? LastAnalyzedArtifact; - - [ViewVariables] - public ArtifactNode? LastAnalyzedNode; - - [ViewVariables(VVAccess.ReadWrite)] - public int? LastAnalyzerPointValue; - #endregion -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/BiasedArtifactComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/BiasedArtifactComponent.cs deleted file mode 100644 index 16bd34d7ea..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/BiasedArtifactComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -/// -/// This is used for artifacts that are biased to move -/// in a particular direction via the -/// -[RegisterComponent] -public sealed partial class BiasedArtifactComponent : Component -{ - [ViewVariables] - public EntityUid Provider; -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs deleted file mode 100644 index 36cc5f830e..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -[RegisterComponent] -public sealed partial class NodeScannerComponent : Component -{ - -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/SuppressArtifactContainerComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/SuppressArtifactContainerComponent.cs deleted file mode 100644 index c555f314ad..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/SuppressArtifactContainerComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -/// -/// Suppress artifact activation, when entity is placed inside this container. -/// -[RegisterComponent] -public sealed partial class SuppressArtifactContainerComponent : Component -{ - -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Components/TraversalDistorterComponent.cs b/Content.Server/Xenoarchaeology/Equipment/Components/TraversalDistorterComponent.cs deleted file mode 100644 index fe95114f73..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Components/TraversalDistorterComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Content.Server.Xenoarchaeology.Equipment.Components; - -/// -/// This is used for a machine that biases -/// an artifact placed on it to move up/down -/// -[RegisterComponent] -public sealed partial class TraversalDistorterComponent : Component -{ - [ViewVariables(VVAccess.ReadWrite)] - public BiasDirection BiasDirection = BiasDirection.Up; - - public TimeSpan NextActivation = default!; - public TimeSpan ActivationDelay = TimeSpan.FromSeconds(1); -} - -public enum BiasDirection : byte -{ - Up, //Towards depth 0 - Down, //Away from depth 0 -} diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs deleted file mode 100644 index a5670ec8ee..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs +++ /dev/null @@ -1,519 +0,0 @@ -using System.Linq; -using Content.Server.Power.Components; -using Content.Server.Research.Systems; -using Content.Shared.UserInterface; -using Content.Server.Xenoarchaeology.Equipment.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Audio; -using Content.Shared.DeviceLinking; -using Content.Shared.DeviceLinking.Events; -using Content.Shared.Paper; -using Content.Shared.Placeable; -using Content.Shared.Popups; -using Content.Shared.Power; -using Content.Shared.Power.EntitySystems; -using Content.Shared.Research.Components; -using Content.Shared.Xenoarchaeology.Equipment; -using Content.Shared.Xenoarchaeology.XenoArtifacts; -using JetBrains.Annotations; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; -using Robust.Shared.Utility; - -namespace Content.Server.Xenoarchaeology.Equipment.Systems; - -/// -/// This system is used for managing the artifact analyzer as well as the analysis console. -/// It also hanadles scanning and ui updates for both systems. -/// -public sealed class ArtifactAnalyzerSystem : EntitySystem -{ - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IPrototypeManager _prototype = default!; - [Dependency] private readonly ArtifactSystem _artifact = default!; - [Dependency] private readonly MetaDataSystem _metaSystem = default!; - [Dependency] private readonly PaperSystem _paper = default!; - [Dependency] private readonly ResearchSystem _research = default!; - [Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedPowerReceiverSystem _receiver = default!; - [Dependency] private readonly TraversalDistorterSystem _traversalDistorter = default!; - [Dependency] private readonly UserInterfaceSystem _ui = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnArtifactActivated); - - SubscribeLocalEvent(OnAnalyzeStart); - SubscribeLocalEvent(OnAnalyzeEnd); - SubscribeLocalEvent(OnPowerChanged); - - SubscribeLocalEvent(OnItemPlaced); - SubscribeLocalEvent(OnItemRemoved); - - SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnNewLink); - SubscribeLocalEvent(OnPortDisconnected); - - SubscribeLocalEvent(OnServerSelectionMessage); - SubscribeLocalEvent(OnScanButton); - SubscribeLocalEvent(OnPrintButton); - SubscribeLocalEvent(OnExtractButton); - SubscribeLocalEvent(OnBiasButton); - - SubscribeLocalEvent((e, c, _) => UpdateUserInterface(e, c), - after: new[] { typeof(ResearchSystem) }); - SubscribeLocalEvent((e, c, _) => UpdateUserInterface(e, c), - after: new[] { typeof(ResearchSystem) }); - SubscribeLocalEvent((e, c, _) => UpdateUserInterface(e, c)); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var active, out var scan)) - { - if (active.AnalysisPaused) - continue; - - if (_timing.CurTime - active.StartTime < scan.AnalysisDuration - active.AccumulatedRunTime) - continue; - - FinishScan(uid, scan, active); - } - } - - /// - /// Resets the current scan on the artifact analyzer - /// - /// The analyzer being reset - /// - [PublicAPI] - public void ResetAnalyzer(EntityUid uid, ArtifactAnalyzerComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - component.LastAnalyzedArtifact = null; - component.ReadyToPrint = false; - UpdateAnalyzerInformation(uid, component); - } - - /// - /// Goes through the current entities on - /// the analyzer and returns a valid artifact - /// - /// - /// - /// - private EntityUid? GetArtifactForAnalysis(EntityUid? uid, ItemPlacerComponent? placer = null) - { - if (uid == null || !Resolve(uid.Value, ref placer)) - return null; - - return placer.PlacedEntities.FirstOrNull(); - } - - /// - /// Updates the current scan information based on - /// the last artifact that was scanned. - /// - /// - /// - private void UpdateAnalyzerInformation(EntityUid uid, ArtifactAnalyzerComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - if (component.LastAnalyzedArtifact == null) - { - component.LastAnalyzerPointValue = null; - component.LastAnalyzedNode = null; - } - else if (TryComp(component.LastAnalyzedArtifact, out var artifact)) - { - var lastNode = artifact.CurrentNodeId == null - ? null - : (ArtifactNode?) _artifact.GetNodeFromId(artifact.CurrentNodeId.Value, artifact).Clone(); - component.LastAnalyzedNode = lastNode; - component.LastAnalyzerPointValue = _artifact.GetResearchPointValue(component.LastAnalyzedArtifact.Value, artifact); - } - } - - private void OnMapInit(EntityUid uid, ArtifactAnalyzerComponent component, MapInitEvent args) - { - if (!TryComp(uid, out var sink)) - return; - - foreach (var source in sink.LinkedSources) - { - if (!TryComp(source, out var analysis)) - continue; - component.Console = source; - analysis.AnalyzerEntity = uid; - return; - } - } - - private void OnNewLink(EntityUid uid, AnalysisConsoleComponent component, NewLinkEvent args) - { - if (!TryComp(args.Sink, out var analyzer)) - return; - - component.AnalyzerEntity = args.Sink; - analyzer.Console = uid; - - UpdateUserInterface(uid, component); - } - - private void OnPortDisconnected(EntityUid uid, AnalysisConsoleComponent component, PortDisconnectedEvent args) - { - if (args.Port == component.LinkingPort && component.AnalyzerEntity != null) - { - if (TryComp(component.AnalyzerEntity, out var analyzezr)) - analyzezr.Console = null; - component.AnalyzerEntity = null; - } - - UpdateUserInterface(uid, component); - } - - private void UpdateUserInterface(EntityUid uid, AnalysisConsoleComponent? component = null) - { - if (!Resolve(uid, ref component, false)) - return; - - EntityUid? artifact = null; - FormattedMessage? msg = null; - TimeSpan? totalTime = null; - var canScan = false; - var canPrint = false; - var points = 0; - - if (TryComp(component.AnalyzerEntity, out var analyzer)) - { - artifact = analyzer.LastAnalyzedArtifact; - msg = GetArtifactScanMessage(analyzer); - totalTime = analyzer.AnalysisDuration; - if (TryComp(component.AnalyzerEntity, out var placer)) - canScan = placer.PlacedEntities.Any(); - canPrint = analyzer.ReadyToPrint; - - // the artifact that's actually on the scanner right now. - if (GetArtifactForAnalysis(component.AnalyzerEntity, placer) is { } current) - points = _artifact.GetResearchPointValue(current); - } - - var analyzerConnected = component.AnalyzerEntity != null; - var serverConnected = TryComp(uid, out var client) && client.ConnectedToServer; - - var scanning = TryComp(component.AnalyzerEntity, out var active); - var paused = active != null ? active.AnalysisPaused : false; - - var biasDirection = BiasDirection.Up; - - if (TryComp(component.AnalyzerEntity, out var trav)) - biasDirection = trav.BiasDirection; - - var state = new AnalysisConsoleUpdateState(GetNetEntity(artifact), analyzerConnected, serverConnected, - canScan, canPrint, msg, scanning, paused, active?.StartTime, active?.AccumulatedRunTime, totalTime, points, biasDirection == BiasDirection.Down); - - _ui.SetUiState(uid, ArtifactAnalzyerUiKey.Key, state); - } - - /// - /// opens the server selection menu. - /// - /// - /// - /// - private void OnServerSelectionMessage(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleServerSelectionMessage args) - { - _ui.OpenUi(uid, ResearchClientUiKey.Key, args.Actor); - } - - /// - /// Starts scanning the artifact. - /// - /// - /// - /// - private void OnScanButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleScanButtonPressedMessage args) - { - if (component.AnalyzerEntity == null) - return; - - if (HasComp(component.AnalyzerEntity)) - return; - - var ent = GetArtifactForAnalysis(component.AnalyzerEntity); - if (ent == null) - return; - - var activeComp = EnsureComp(component.AnalyzerEntity.Value); - activeComp.StartTime = _timing.CurTime; - activeComp.AccumulatedRunTime = TimeSpan.Zero; - activeComp.Artifact = ent.Value; - - if (TryComp(component.AnalyzerEntity.Value, out var powa)) - activeComp.AnalysisPaused = !powa.Powered; - - var activeArtifact = EnsureComp(ent.Value); - activeArtifact.Scanner = component.AnalyzerEntity.Value; - UpdateUserInterface(uid, component); - } - - private void OnPrintButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsolePrintButtonPressedMessage args) - { - if (component.AnalyzerEntity == null) - return; - - if (!TryComp(component.AnalyzerEntity, out var analyzer) || - analyzer.LastAnalyzedNode == null || - analyzer.LastAnalyzerPointValue == null || - !analyzer.ReadyToPrint) - { - return; - } - analyzer.ReadyToPrint = false; - - var report = Spawn(component.ReportEntityId, Transform(uid).Coordinates); - _metaSystem.SetEntityName(report, Loc.GetString("analysis-report-title", ("id", analyzer.LastAnalyzedNode.Id))); - - var msg = GetArtifactScanMessage(analyzer); - if (msg == null) - return; - - _popup.PopupEntity(Loc.GetString("analysis-console-print-popup"), uid); - if (TryComp(report, out var paperComp)) - _paper.SetContent((report, paperComp), msg.ToMarkup()); - UpdateUserInterface(uid, component); - } - - private FormattedMessage? GetArtifactScanMessage(ArtifactAnalyzerComponent component) - { - var msg = new FormattedMessage(); - if (component.LastAnalyzedNode == null) - return null; - - var n = component.LastAnalyzedNode; - - msg.AddMarkupOrThrow(Loc.GetString("analysis-console-info-id", ("id", n.Id))); - msg.PushNewline(); - msg.AddMarkupOrThrow(Loc.GetString("analysis-console-info-depth", ("depth", n.Depth))); - msg.PushNewline(); - - var activated = n.Triggered - ? "analysis-console-info-triggered-true" - : "analysis-console-info-triggered-false"; - msg.AddMarkupOrThrow(Loc.GetString(activated)); - msg.PushNewline(); - - msg.PushNewline(); - var needSecondNewline = false; - - var triggerProto = _prototype.Index(n.Trigger); - if (triggerProto.TriggerHint != null) - { - msg.AddMarkupOrThrow(Loc.GetString("analysis-console-info-trigger", - ("trigger", Loc.GetString(triggerProto.TriggerHint))) + "\n"); - needSecondNewline = true; - } - - var effectproto = _prototype.Index(n.Effect); - if (effectproto.EffectHint != null) - { - msg.AddMarkupOrThrow(Loc.GetString("analysis-console-info-effect", - ("effect", Loc.GetString(effectproto.EffectHint))) + "\n"); - needSecondNewline = true; - } - - if (needSecondNewline) - msg.PushNewline(); - - msg.AddMarkupOrThrow(Loc.GetString("analysis-console-info-edges", ("edges", n.Edges.Count))); - msg.PushNewline(); - - if (component.LastAnalyzerPointValue != null) - msg.AddMarkupOrThrow(Loc.GetString("analysis-console-info-value", ("value", component.LastAnalyzerPointValue))); - - return msg; - } - - /// - /// Extracts points from the artifact and updates the server points - /// - /// - /// - /// - private void OnExtractButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleExtractButtonPressedMessage args) - { - if (component.AnalyzerEntity == null) - return; - - if (!_research.TryGetClientServer(uid, out var server, out var serverComponent)) - return; - - var artifact = GetArtifactForAnalysis(component.AnalyzerEntity); - if (artifact == null) - return; - - var pointValue = _artifact.GetResearchPointValue(artifact.Value); - - // no new nodes triggered so nothing to add - if (pointValue == 0) - return; - - _research.ModifyServerPoints(server.Value, pointValue, serverComponent); - _artifact.AdjustConsumedPoints(artifact.Value, pointValue); - - _audio.PlayPvs(component.ExtractSound, component.AnalyzerEntity.Value, AudioParams.Default.WithVolume(2f)); - - _popup.PopupEntity(Loc.GetString("analyzer-artifact-extract-popup"), - component.AnalyzerEntity.Value, PopupType.Large); - - UpdateUserInterface(uid, component); - } - - private void OnBiasButton(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleBiasButtonPressedMessage args) - { - if (component.AnalyzerEntity == null) - return; - - if (!TryComp(component.AnalyzerEntity, out var trav)) - return; - - if (!_traversalDistorter.SetState(component.AnalyzerEntity.Value, trav, args.IsDown)) - return; - - UpdateUserInterface(uid, component); - } - - /// - /// Cancels scans if the artifact changes nodes (is activated) during the scan. - /// - private void OnArtifactActivated(EntityUid uid, ActiveScannedArtifactComponent component, ArtifactActivatedEvent args) - { - CancelScan(uid); - } - - /// - /// Stops the current scan - /// - [PublicAPI] - public void CancelScan(EntityUid artifact, ActiveScannedArtifactComponent? component = null, ArtifactAnalyzerComponent? analyzer = null) - { - if (!Resolve(artifact, ref component, false)) - return; - - if (!Resolve(component.Scanner, ref analyzer)) - return; - - _audio.PlayPvs(component.ScanFailureSound, component.Scanner, AudioParams.Default.WithVolume(3f)); - - RemComp(component.Scanner); - if (analyzer.Console != null) - UpdateUserInterface(analyzer.Console.Value); - - RemCompDeferred(artifact, component); - } - - /// - /// Finishes the current scan. - /// - [PublicAPI] - public void FinishScan(EntityUid uid, ArtifactAnalyzerComponent? component = null, ActiveArtifactAnalyzerComponent? active = null) - { - if (!Resolve(uid, ref component, ref active)) - return; - - component.ReadyToPrint = true; - _audio.PlayPvs(component.ScanFinishedSound, uid); - component.LastAnalyzedArtifact = active.Artifact; - UpdateAnalyzerInformation(uid, component); - - RemComp(active.Artifact); - RemComp(uid, active); - if (component.Console != null) - UpdateUserInterface(component.Console.Value); - } - - [PublicAPI] - public void PauseScan(EntityUid uid, ArtifactAnalyzerComponent? component = null, ActiveArtifactAnalyzerComponent? active = null) - { - if (!Resolve(uid, ref component, ref active) || active.AnalysisPaused) - return; - - active.AnalysisPaused = true; - // As we pause, we store what was already completed. - active.AccumulatedRunTime = (_timing.CurTime - active.StartTime) + active.AccumulatedRunTime; - - if (Exists(component.Console)) - UpdateUserInterface(component.Console.Value); - } - - [PublicAPI] - public void ResumeScan(EntityUid uid, ArtifactAnalyzerComponent? component = null, ActiveArtifactAnalyzerComponent? active = null) - { - if (!Resolve(uid, ref component, ref active) || !active.AnalysisPaused) - return; - - active.StartTime = _timing.CurTime; - active.AnalysisPaused = false; - - if (Exists(component.Console)) - UpdateUserInterface(component.Console.Value); - } - - private void OnItemPlaced(EntityUid uid, ArtifactAnalyzerComponent component, ref ItemPlacedEvent args) - { - if (component.Console != null && Exists(component.Console)) - UpdateUserInterface(component.Console.Value); - } - - private void OnItemRemoved(EntityUid uid, ArtifactAnalyzerComponent component, ref ItemRemovedEvent args) - { - // Scanners shouldn't give permanent remove vision to an artifact, and the scanned artifact doesn't have any - // component to track analyzers that have scanned it for removal if the artifact gets deleted. - // So we always clear this on removal. - component.LastAnalyzedArtifact = null; - - // cancel the scan if the artifact moves off the analyzer - CancelScan(args.OtherEntity); - if (Exists(component.Console)) - UpdateUserInterface(component.Console.Value); - } - - private void OnAnalyzeStart(EntityUid uid, ActiveArtifactAnalyzerComponent component, ComponentStartup args) - { - _receiver.SetNeedsPower(uid, true); - _ambientSound.SetAmbience(uid, true); - } - - private void OnAnalyzeEnd(EntityUid uid, ActiveArtifactAnalyzerComponent component, ComponentShutdown args) - { - _receiver.SetNeedsPower(uid, false); - _ambientSound.SetAmbience(uid, false); - } - - private void OnPowerChanged(EntityUid uid, ActiveArtifactAnalyzerComponent active, ref PowerChangedEvent args) - { - if (!args.Powered) - { - PauseScan(uid, null, active); - } - else - { - ResumeScan(uid, null, active); - } - } -} - diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactCrusherSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactCrusherSystem.cs index f841ea910e..8bc87cb378 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactCrusherSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactCrusherSystem.cs @@ -1,16 +1,15 @@ using Content.Server.Body.Systems; using Content.Server.Popups; -using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Stack; using Content.Server.Storage.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts; using Content.Shared.Body.Components; using Content.Shared.Damage; using Content.Shared.Power; using Content.Shared.Verbs; using Content.Shared.Whitelist; using Content.Shared.Xenoarchaeology.Equipment; +using Content.Shared.Xenoarchaeology.Equipment.Components; using Robust.Shared.Collections; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -22,7 +21,6 @@ public sealed class ArtifactCrusherSystem : SharedArtifactCrusherSystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ArtifactSystem _artifact = default!; [Dependency] private readonly BodySystem _body = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly StackSystem _stack = default!; @@ -103,7 +101,6 @@ public sealed class ArtifactCrusherSystem : SharedArtifactCrusherSystem { ContainerSystem.Insert((stack, null, null, null), crusher.OutputContainer); } - _artifact.ForceActivateArtifact(contained); } if (!TryComp(contained, out var body)) diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs index b388f3a6d4..2f8cd66736 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/NodeScannerSystem.cs @@ -1,63 +1,13 @@ -using Content.Server.Popups; -using Content.Server.Xenoarchaeology.Equipment.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts; -using Content.Shared.Interaction; -using Content.Shared.Timing; -using Content.Shared.Verbs; +using Content.Shared.Xenoarchaeology.Equipment; +using Content.Shared.Xenoarchaeology.Equipment.Components; namespace Content.Server.Xenoarchaeology.Equipment.Systems; -public sealed class NodeScannerSystem : EntitySystem +/// +public sealed class NodeScannerSystem : SharedNodeScannerSystem { - [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - - /// - public override void Initialize() + protected override void TryOpenUi(Entity device, EntityUid actor) { - SubscribeLocalEvent(OnBeforeRangedInteract); - SubscribeLocalEvent>(AddScanVerb); - } - - private void OnBeforeRangedInteract(EntityUid uid, NodeScannerComponent component, BeforeRangedInteractEvent args) - { - if (args.Handled || !args.CanReach || args.Target is not {} target) - return; - - if (!TryComp(target, out var artifact) || artifact.CurrentNodeId == null) - return; - - CreatePopup(uid, target, artifact); - args.Handled = true; - } - - private void AddScanVerb(EntityUid uid, NodeScannerComponent component, GetVerbsEvent args) - { - if (!args.CanAccess) - return; - - if (!TryComp(args.Target, out var artifact) || artifact.CurrentNodeId == null) - return; - - var verb = new UtilityVerb() - { - Act = () => - { - CreatePopup(uid, args.Target, artifact); - }, - Text = Loc.GetString("node-scan-tooltip") - }; - - args.Verbs.Add(verb); - } - - private void CreatePopup(EntityUid uid, EntityUid target, ArtifactComponent artifact) - { - if (TryComp(uid, out UseDelayComponent? useDelay) - && !_useDelay.TryResetDelay((uid, useDelay), true)) - return; - - _popupSystem.PopupEntity(Loc.GetString("node-scan-popup", - ("id", $"{artifact.CurrentNodeId}")), target); + // no-op } } diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/TraversalDistorterSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/TraversalDistorterSystem.cs deleted file mode 100644 index d277792243..0000000000 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/TraversalDistorterSystem.cs +++ /dev/null @@ -1,79 +0,0 @@ -using Content.Server.Popups; -using Content.Server.Power.EntitySystems; -using Content.Server.Xenoarchaeology.Equipment.Components; -using Content.Shared.Examine; -using Content.Shared.Interaction; -using Content.Shared.Placeable; -using Robust.Shared.Timing; - -namespace Content.Server.Xenoarchaeology.Equipment.Systems; - -public sealed class TraversalDistorterSystem : EntitySystem -{ - [Dependency] private readonly IGameTiming _timing = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnExamine); - - SubscribeLocalEvent(OnItemPlaced); - SubscribeLocalEvent(OnItemRemoved); - } - - private void OnInit(EntityUid uid, TraversalDistorterComponent component, MapInitEvent args) - { - component.NextActivation = _timing.CurTime; - } - - /// - /// Switches the state of the traversal distorter between up and down. - /// - /// The distorter's entity - /// The component on the entity - /// If the distorter changed state - public bool SetState(EntityUid uid, TraversalDistorterComponent component, bool isDown) - { - if (!this.IsPowered(uid, EntityManager)) - return false; - - if (_timing.CurTime < component.NextActivation) - return false; - - component.NextActivation = _timing.CurTime + component.ActivationDelay; - - component.BiasDirection = isDown ? BiasDirection.Down : BiasDirection.Up; - - return true; - } - - private void OnExamine(EntityUid uid, TraversalDistorterComponent component, ExaminedEvent args) - { - string examine = string.Empty; - switch (component.BiasDirection) - { - case BiasDirection.Up: - examine = Loc.GetString("traversal-distorter-desc-up"); - break; - case BiasDirection.Down: - examine = Loc.GetString("traversal-distorter-desc-down"); - break; - } - - args.PushMarkup(examine); - } - - private void OnItemPlaced(EntityUid uid, TraversalDistorterComponent component, ref ItemPlacedEvent args) - { - var bias = EnsureComp(args.OtherEntity); - bias.Provider = uid; - } - - private void OnItemRemoved(EntityUid uid, TraversalDistorterComponent component, ref ItemRemovedEvent args) - { - var otherEnt = args.OtherEntity; - if (TryComp(otherEnt, out var bias) && bias.Provider == uid) - RemComp(otherEnt, bias); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactComponent.cs deleted file mode 100644 index 4afd8af21c..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactComponent.cs +++ /dev/null @@ -1,166 +0,0 @@ -using Content.Shared.Xenoarchaeology.XenoArtifacts; -using Robust.Shared.Audio; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts; - -[RegisterComponent, Access(typeof(ArtifactSystem))] -public sealed partial class ArtifactComponent : Component -{ - /// - /// Every node contained in the tree - /// - [DataField("nodeTree"), ViewVariables] - public List NodeTree = new(); - - /// - /// The current node the artifact is on. - /// - [DataField("currentNodeId"), ViewVariables] - public int? CurrentNodeId; - - #region Node Tree Gen - /// - /// Minimum number of nodes to generate, inclusive - /// - [DataField("nodesMin")] - public int NodesMin = 3; - - /// - /// Maximum number of nodes to generate, exclusive - /// - [DataField("nodesMax")] - public int NodesMax = 9; - #endregion - - /// - /// Cooldown time between artifact activations (in seconds). - /// - [DataField("timer"), ViewVariables(VVAccess.ReadWrite)] - public TimeSpan CooldownTime = TimeSpan.FromSeconds(5); - - /// - /// Is this artifact under some suppression device? - /// f true, will ignore all trigger activations attempts. - /// - [DataField("isSuppressed"), ViewVariables(VVAccess.ReadWrite)] - public bool IsSuppressed; - - /// - /// The last time the artifact was activated. - /// - [DataField("lastActivationTime", customTypeSerializer: typeof(TimeOffsetSerializer))] - public TimeSpan LastActivationTime; - - /// - /// A multiplier applied to the calculated point value - /// to determine the monetary value of the artifact - /// - [DataField("priceMultiplier"), ViewVariables(VVAccess.ReadWrite)] - public float PriceMultiplier = 0.05f; - - /// - /// The base amount of research points for each artifact node. - /// - [DataField("pointsPerNode"), ViewVariables(VVAccess.ReadWrite)] - public int PointsPerNode = 6500; - - /// - /// Research points which have been "consumed" from the theoretical max value of the artifact. - /// - [DataField("consumedPoints"), ViewVariables(VVAccess.ReadWrite)] - public int ConsumedPoints; - - /// - /// A multiplier that is raised to the power of the average depth of a node. - /// Used for calculating the research point value of an artifact node. - /// - [DataField("pointDangerMultiplier"), ViewVariables(VVAccess.ReadWrite)] - public float PointDangerMultiplier = 1.35f; - - /// - /// The sound that plays when an artifact is activated - /// - [DataField("activationSound")] - public SoundSpecifier ActivationSound = new SoundCollectionSpecifier("ArtifactActivation") - { - Params = new() - { - Variation = 0.1f, - Volume = 3f - } - }; - - [DataField("activateActionEntity")] public EntityUid? ActivateActionEntity; -} - -/// -/// A single "node" of an artifact that contains various data about it. -/// -[DataDefinition] -public sealed partial class ArtifactNode : ICloneable -{ - /// - /// A numeric id corresponding to each node. - /// - [DataField("id"), ViewVariables] - public int Id; - - /// - /// how "deep" into the node tree. used for generation and price/value calculations - /// - [DataField("depth"), ViewVariables] - public int Depth; - - /// - /// A list of surrounding nodes. Used for tree traversal - /// - [DataField("edges"), ViewVariables] - public HashSet Edges = new(); - - /// - /// Whether or not the node has been entered - /// - [DataField("discovered"), ViewVariables(VVAccess.ReadWrite)] - public bool Discovered; - - /// - /// The trigger for the node - /// - [DataField("trigger", customTypeSerializer: typeof(PrototypeIdSerializer), required: true), ViewVariables] - public string Trigger = default!; - - /// - /// Whether or not the node has been triggered - /// - [DataField("triggered"), ViewVariables(VVAccess.ReadWrite)] - public bool Triggered; - - /// - /// The effect when the node is activated - /// - [DataField("effect", customTypeSerializer: typeof(PrototypeIdSerializer), required: true), ViewVariables] - public string Effect = default!; - - /// - /// Used for storing cumulative information about nodes - /// - [DataField("nodeData"), ViewVariables] - public Dictionary NodeData = new(); - - public object Clone() - { - return new ArtifactNode - { - Id = Id, - Depth = Depth, - Edges = Edges, - Discovered = Discovered, - Trigger = Trigger, - Triggered = Triggered, - Effect = Effect, - NodeData = NodeData - }; - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs deleted file mode 100644 index 6c4089a2db..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Content.Server.Actions; -using Content.Server.Popups; -using Content.Shared.Xenoarchaeology.XenoArtifacts; -using Robust.Shared.Prototypes; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts; - -public partial class ArtifactSystem -{ - [Dependency] private readonly ActionsSystem _actions = default!; - [Dependency] private readonly PopupSystem _popup = default!; - - [ValidatePrototypeId] private const string ArtifactActivateActionId = "ActionArtifactActivate"; - - /// - /// Used to add the artifact activation action (hehe), which lets sentient artifacts activate themselves, - /// either through admemery or the sentience effect. - /// - public void InitializeActions() - { - SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnRemove); - - SubscribeLocalEvent(OnSelfActivate); - } - - private void OnMapInit(EntityUid uid, ArtifactComponent component, MapInitEvent args) - { - RandomizeArtifact(uid, component); - _actions.AddAction(uid, ref component.ActivateActionEntity, ArtifactActivateActionId); - } - - private void OnRemove(EntityUid uid, ArtifactComponent component, ComponentRemove args) - { - _actions.RemoveAction(uid, component.ActivateActionEntity); - } - - private void OnSelfActivate(EntityUid uid, ArtifactComponent component, ArtifactSelfActivateEvent args) - { - if (component.CurrentNodeId == null) - return; - - var curNode = GetNodeFromId(component.CurrentNodeId.Value, component).Id; - _popup.PopupEntity(Loc.GetString("activate-artifact-popup-self", ("node", curNode)), uid, uid); - TryActivateArtifact(uid, uid, component); - - args.Handled = true; - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Commands.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Commands.cs deleted file mode 100644 index d840a1f209..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Commands.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.Linq; -using Content.Server.Administration; -using Content.Shared.Administration; -using Robust.Shared.Console; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts; - -public partial class ArtifactSystem -{ - [Dependency] private readonly IConsoleHost _conHost = default!; - - public void InitializeCommands() - { - _conHost.RegisterCommand("forceartifactnode", "Forces an artifact to traverse to a given node", "forceartifacteffect ", - ForceArtifactNode, - ForceArtifactNodeCompletions); - - _conHost.RegisterCommand("getartifactmaxvalue", "Reports the maximum research point value for a given artifact", "forceartifacteffect ", - GetArtifactMaxValue); - } - - [AdminCommand(AdminFlags.Fun)] - private void ForceArtifactNode(IConsoleShell shell, string argstr, string[] args) - { - if (args.Length != 2) - { - shell.WriteError("Argument length must be 2"); - return; - } - - if (!NetEntity.TryParse(args[0], out var uidNet) || !TryGetEntity(uidNet, out var uid) || !int.TryParse(args[1], out var id)) - return; - - if (!TryComp(uid, out var artifact)) - return; - - if (artifact.NodeTree.FirstOrDefault(n => n.Id == id) is { } node) - { - EnterNode(uid.Value, ref node); - } - } - - private CompletionResult ForceArtifactNodeCompletions(IConsoleShell shell, string[] args) - { - if (args.Length == 2 && NetEntity.TryParse(args[0], out var uidNet) && TryGetEntity(uidNet, out var uid)) - { - if (TryComp(uid, out var artifact)) - { - return CompletionResult.FromHintOptions(artifact.NodeTree.Select(s => s.Id.ToString()), ""); - } - } - - return CompletionResult.Empty; - } - - [AdminCommand(AdminFlags.Debug)] - private void GetArtifactMaxValue(IConsoleShell shell, string argstr, string[] args) - { - if (args.Length != 1) - shell.WriteError("Argument length must be 1"); - - if (!NetEntity.TryParse(args[0], out var uidNet) || !TryGetEntity(uidNet, out var uid)) - return; - - if (!TryComp(uid, out var artifact)) - return; - - var pointSum = GetResearchPointValue(uid.Value, artifact, true); - shell.WriteLine($"Max point value for {ToPrettyString(uid.Value)} with {artifact.NodeTree.Count} nodes: {pointSum}"); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs deleted file mode 100644 index a0e8420011..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Nodes.cs +++ /dev/null @@ -1,244 +0,0 @@ -using System.Linq; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Whitelist; -using Content.Shared.Xenoarchaeology.XenoArtifacts; -using JetBrains.Annotations; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts; - -public sealed partial class ArtifactSystem -{ - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; - - private const int MaxEdgesPerNode = 4; - - private readonly HashSet _usedNodeIds = new(); - - /// - /// Generate an Artifact tree with fully developed nodes. - /// - /// - /// - /// The amount of nodes it has. - private void GenerateArtifactNodeTree(EntityUid artifact, List allNodes, int nodesToCreate) - { - if (nodesToCreate < 1) - { - Log.Error($"nodesToCreate {nodesToCreate} is less than 1. Aborting artifact tree generation."); - return; - } - - _usedNodeIds.Clear(); - - var uninitializedNodes = new List { new(){ Id = GetValidNodeId() } }; - var createdNodes = 1; - - while (uninitializedNodes.Count > 0) - { - var node = uninitializedNodes[0]; - uninitializedNodes.Remove(node); - - node.Trigger = GetRandomTrigger(artifact, ref node); - node.Effect = GetRandomEffect(artifact, ref node); - - var maxChildren = _random.Next(1, MaxEdgesPerNode - 1); - - for (var i = 0; i < maxChildren; i++) - { - if (nodesToCreate <= createdNodes) - { - break; - } - - var child = new ArtifactNode {Id = GetValidNodeId(), Depth = node.Depth + 1}; - node.Edges.Add(child.Id); - child.Edges.Add(node.Id); - - uninitializedNodes.Add(child); - createdNodes++; - } - - allNodes.Add(node); - } - } - - private int GetValidNodeId() - { - var id = _random.Next(100, 1000); - while (_usedNodeIds.Contains(id)) - { - id = _random.Next(100, 1000); - } - - _usedNodeIds.Add(id); - - return id; - } - - //yeah these two functions are near duplicates but i don't - //want to implement an interface or abstract parent - - private string GetRandomTrigger(EntityUid artifact, ref ArtifactNode node) - { - var allTriggers = _prototype.EnumeratePrototypes() - .Where(x => _whitelistSystem.IsWhitelistPassOrNull(x.Whitelist, artifact) && - _whitelistSystem.IsBlacklistFailOrNull(x.Blacklist, artifact)).ToList(); - var validDepth = allTriggers.Select(x => x.TargetDepth).Distinct().ToList(); - - var weights = GetDepthWeights(validDepth, node.Depth); - var selectedRandomTargetDepth = GetRandomTargetDepth(weights); - var targetTriggers = allTriggers - .Where(x => x.TargetDepth == selectedRandomTargetDepth).ToList(); - - return _random.Pick(targetTriggers).ID; - } - - private string GetRandomEffect(EntityUid artifact, ref ArtifactNode node) - { - var allEffects = _prototype.EnumeratePrototypes() - .Where(x => _whitelistSystem.IsWhitelistPassOrNull(x.Whitelist, artifact) && - _whitelistSystem.IsBlacklistFailOrNull(x.Blacklist, artifact)).ToList(); - var validDepth = allEffects.Select(x => x.TargetDepth).Distinct().ToList(); - - var weights = GetDepthWeights(validDepth, node.Depth); - var selectedRandomTargetDepth = GetRandomTargetDepth(weights); - var targetEffects = allEffects - .Where(x => x.TargetDepth == selectedRandomTargetDepth).ToList(); - - return _random.Pick(targetEffects).ID; - } - - /// - /// The goal is that the depth that is closest to targetDepth has the highest chance of appearing. - /// The issue is that we also want some variance, so levels that are +/- 1 should also have a - /// decent shot of appearing. This function should probably get some tweaking at some point. - /// - private Dictionary GetDepthWeights(IEnumerable depths, int targetDepth) - { - // this function is just a normal distribution with a - // mean of target depth and standard deviation of 0.75 - var weights = new Dictionary(); - foreach (var d in depths) - { - var w = 10f / (0.75f * MathF.Sqrt(2 * MathF.PI)) * MathF.Pow(MathF.E, -MathF.Pow((d - targetDepth) / 0.75f, 2)); - weights.Add(d, w); - } - return weights; - } - - /// - /// Uses a weighted random system to get a random depth. - /// - private int GetRandomTargetDepth(Dictionary weights) - { - var sum = weights.Values.Sum(); - var accumulated = 0f; - - var rand = _random.NextFloat() * sum; - - foreach (var (key, weight) in weights) - { - accumulated += weight; - - if (accumulated >= rand) - { - return key; - } - } - - return _random.Pick(weights.Keys); //shouldn't happen - } - - /// - /// Enter a node: attach the relevant components - /// - private void EnterNode(EntityUid uid, ref ArtifactNode node, ArtifactComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - if (component.CurrentNodeId != null) - { - ExitNode(uid, component); - } - - component.CurrentNodeId = node.Id; - - var trigger = _prototype.Index(node.Trigger); - var effect = _prototype.Index(node.Effect); - - var allComponents = effect.Components.Concat(effect.PermanentComponents).Concat(trigger.Components); - foreach (var (name, entry) in allComponents) - { - var reg = _componentFactory.GetRegistration(name); - - if (node.Discovered && EntityManager.HasComponent(uid, reg.Type)) - { - // Don't re-add permanent components unless this is the first time you've entered this node - if (effect.PermanentComponents.ContainsKey(name)) - continue; - - EntityManager.RemoveComponent(uid, reg.Type); - } - - var comp = (Component)_componentFactory.GetComponent(reg); - - var temp = (object)comp; - _serialization.CopyTo(entry.Component, ref temp); - EntityManager.RemoveComponent(uid, temp!.GetType()); - EntityManager.AddComponent(uid, (Component)temp!); - } - - node.Discovered = true; - RaiseLocalEvent(uid, new ArtifactNodeEnteredEvent(component.CurrentNodeId.Value)); - } - - /// - /// Exit a node: remove the relevant components. - /// - private void ExitNode(EntityUid uid, ArtifactComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - if (component.CurrentNodeId == null) - return; - var currentNode = GetNodeFromId(component.CurrentNodeId.Value, component); - - var trigger = _prototype.Index(currentNode.Trigger); - var effect = _prototype.Index(currentNode.Effect); - - var entityPrototype = MetaData(uid).EntityPrototype; - var toRemove = effect.Components.Keys.Concat(trigger.Components.Keys).ToList(); - - foreach (var name in toRemove) - { - // if the entity prototype contained the component originally - if (entityPrototype?.Components.TryGetComponent(name, out var entry) ?? false) - { - var comp = (Component)_componentFactory.GetComponent(name); - var temp = (object)comp; - _serialization.CopyTo(entry, ref temp); - EntityManager.RemoveComponent(uid, temp!.GetType()); - EntityManager.AddComponent(uid, (Component)temp); - continue; - } - - EntityManager.RemoveComponentDeferred(uid, _componentFactory.GetRegistration(name).Type); - } - component.CurrentNodeId = null; - } - - [PublicAPI] - public ArtifactNode GetNodeFromId(int id, ArtifactComponent component) - { - return component.NodeTree.First(x => x.Id == id); - } - - [PublicAPI] - public ArtifactNode GetNodeFromId(int id, IEnumerable nodes) - { - return nodes.First(x => x.Id == id); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs deleted file mode 100644 index 6ddcd56abd..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs +++ /dev/null @@ -1,299 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using Content.Server.Cargo.Systems; -using Content.Server.GameTicking; -using Content.Server.Power.EntitySystems; -using Content.Server.Xenoarchaeology.Equipment.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.CCVar; -using Content.Shared.Xenoarchaeology.XenoArtifacts; -using JetBrains.Annotations; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Configuration; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; -using Robust.Shared.Serialization.Manager; -using Robust.Shared.Timing; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts; - -public sealed partial class ArtifactSystem : EntitySystem -{ - [Dependency] private readonly IComponentFactory _componentFactory = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IPrototypeManager _prototype = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ISerializationManager _serialization = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(GetPrice); - - InitializeCommands(); - InitializeActions(); - } - - /// - /// Calculates the price of an artifact based on - /// how many nodes have been unlocked/triggered - /// - /// - /// General balancing (for fully unlocked artifacts): - /// Simple (1-2 Nodes): 1-2K - /// Medium (5-8 Nodes): 6-7K - /// Complex (7-12 Nodes): 10-11K - /// - private void GetPrice(EntityUid uid, ArtifactComponent component, ref PriceCalculationEvent args) - { - args.Price += (GetResearchPointValue(uid, component) + component.ConsumedPoints) * component.PriceMultiplier; - } - - /// - /// Calculates how many research points the artifact is worth - /// - /// - /// General balancing (for fully unlocked artifacts): - /// Simple (1-2 Nodes): ~10K - /// Medium (5-8 Nodes): ~30-40K - /// Complex (7-12 Nodes): ~60-80K - /// - /// Simple artifacts should be enough to unlock a few techs. - /// Medium should get you partway through a tree. - /// Complex should get you through a full tree and then some. - /// - public int GetResearchPointValue(EntityUid uid, ArtifactComponent? component = null, bool getMaxPrice = false) - { - if (!Resolve(uid, ref component)) - return 0; - - var sumValue = component.NodeTree.Sum(n => GetNodePointValue(n, component, getMaxPrice)); - var fullyExploredBonus = component.NodeTree.All(x => x.Triggered) || getMaxPrice ? 1.25f : 1; - - return (int) (sumValue * fullyExploredBonus) - component.ConsumedPoints; - } - - /// - /// Adjusts how many points on the artifact have been consumed - /// - public void AdjustConsumedPoints(EntityUid uid, int amount, ArtifactComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - component.ConsumedPoints += amount; - } - - /// - /// Sets whether or not the artifact is suppressed, - /// preventing it from activating - /// - public void SetIsSuppressed(EntityUid uid, bool suppressed, ArtifactComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - component.IsSuppressed = suppressed; - } - - /// - /// Gets the point value for an individual node - /// - private float GetNodePointValue(ArtifactNode node, ArtifactComponent component, bool getMaxPrice = false) - { - var valueDeduction = 1f; - if (!getMaxPrice) - { - if (!node.Discovered) - return 0; - - valueDeduction = !node.Triggered ? 0.25f : 1; - } - - var triggerProto = _prototype.Index(node.Trigger); - var effectProto = _prototype.Index(node.Effect); - - var nodeDanger = (node.Depth + effectProto.TargetDepth + triggerProto.TargetDepth) / 3; - return component.PointsPerNode * MathF.Pow(component.PointDangerMultiplier, nodeDanger) * valueDeduction; - } - - /// - /// Randomize a given artifact. - /// - [PublicAPI] - public void RandomizeArtifact(EntityUid uid, ArtifactComponent component) - { - var nodeAmount = _random.Next(component.NodesMin, component.NodesMax); - - GenerateArtifactNodeTree(uid, component.NodeTree, nodeAmount); - var firstNode = GetRootNode(component.NodeTree); - EnterNode(uid, ref firstNode, component); - } - - /// - /// Tries to activate the artifact - /// - /// - /// - /// - /// Set this to false if you don't know if the entity is an artifact. - /// - public bool TryActivateArtifact(EntityUid uid, EntityUid? user = null, ArtifactComponent? component = null, bool logMissing = true) - { - if (!Resolve(uid, ref component, logMissing)) - return false; - - // check if artifact is under suppression field - if (component.IsSuppressed) - return false; - - // check if artifact isn't under cooldown - var timeDif = _gameTiming.CurTime - component.LastActivationTime; - if (timeDif < component.CooldownTime) - return false; - - ForceActivateArtifact(uid, user, component); - return true; - } - - /// - /// Forces an artifact to activate - /// - /// - /// - /// - public void ForceActivateArtifact(EntityUid uid, EntityUid? user = null, ArtifactComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - if (component.CurrentNodeId == null) - return; - - _audio.PlayPvs(component.ActivationSound, uid); - component.LastActivationTime = _gameTiming.CurTime; - - var ev = new ArtifactActivatedEvent - { - Activator = user - }; - RaiseLocalEvent(uid, ev, true); - - var currentNode = GetNodeFromId(component.CurrentNodeId.Value, component); - - currentNode.Triggered = true; - if (currentNode.Edges.Count == 0) - return; - - var newNode = GetNewNode(uid, component); - if (newNode == null) - return; - - EnterNode(uid, ref newNode, component); - } - - private ArtifactNode? GetNewNode(EntityUid uid, ArtifactComponent component) - { - if (component.CurrentNodeId == null) - return null; - - var currentNode = GetNodeFromId(component.CurrentNodeId.Value, component); - - var allNodes = currentNode.Edges; - Log.Debug($"our node: {currentNode.Id}"); - Log.Debug($"other nodes: {string.Join(", ", allNodes)}"); - - if (TryComp(uid, out var bias) && - TryComp(bias.Provider, out var trav) && - this.IsPowered(bias.Provider, EntityManager)) - { - switch (trav.BiasDirection) - { - case BiasDirection.Up: - var upNodes = allNodes.Where(x => GetNodeFromId(x, component).Depth < currentNode.Depth).ToHashSet(); - if (upNodes.Count != 0) - allNodes = upNodes; - break; - case BiasDirection.Down: - var downNodes = allNodes.Where(x => GetNodeFromId(x, component).Depth > currentNode.Depth).ToHashSet(); - if (downNodes.Count != 0) - allNodes = downNodes; - break; - } - } - - var undiscoveredNodes = allNodes.Where(x => !GetNodeFromId(x, component).Discovered).ToList(); - Log.Debug($"Undiscovered nodes: {string.Join(", ", undiscoveredNodes)}"); - var newNode = _random.Pick(allNodes); - - if (undiscoveredNodes.Count != 0 && _random.Prob(0.75f)) - { - newNode = _random.Pick(undiscoveredNodes); - } - - Log.Debug($"Going to node {newNode}"); - - return GetNodeFromId(newNode, component); - } - - /// - /// Try and get a data object from a node - /// - /// The entity you're getting the data from - /// The data's key - /// The data you are trying to get. - /// - /// - /// - public bool TryGetNodeData(EntityUid uid, string key, [NotNullWhen(true)] out T? data, ArtifactComponent? component = null) - { - data = default; - - if (!Resolve(uid, ref component)) - return false; - - if (component.CurrentNodeId == null) - return false; - var currentNode = GetNodeFromId(component.CurrentNodeId.Value, component); - - if (currentNode.NodeData.TryGetValue(key, out var dat) && dat is T value) - { - data = value; - return true; - } - - return false; - } - - /// - /// Sets the node data to a certain value - /// - /// The artifact - /// The key being set - /// The value it's being set to - /// - public void SetNodeData(EntityUid uid, string key, object value, ArtifactComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - if (component.CurrentNodeId == null) - return; - var currentNode = GetNodeFromId(component.CurrentNodeId.Value, component); - - currentNode.NodeData[key] = value; - } - - /// - /// Gets the base node (depth 0) of an artifact's node graph - /// - /// - /// - public ArtifactNode GetRootNode(List allNodes) - { - return allNodes.First(n => n.Depth == 0); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChargeBatteryArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChargeBatteryArtifactComponent.cs deleted file mode 100644 index a46dd9e813..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChargeBatteryArtifactComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// This is used for recharging all nearby batteries when activated -/// -[RegisterComponent] -public sealed partial class ChargeBatteryArtifactComponent : Component -{ - /// - /// The radius of entities that will be affected - /// - [DataField("radius")] - public float Radius = 15f; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChemicalPuddleArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChemicalPuddleArtifactComponent.cs deleted file mode 100644 index 3065b1c417..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChemicalPuddleArtifactComponent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// This is used for an artifact that creates a puddle of -/// random chemicals upon being triggered. -/// -[RegisterComponent, Access(typeof(ChemicalPuddleArtifactSystem))] -public sealed partial class ChemicalPuddleArtifactComponent : Component -{ - /// - /// The solution where all the chemicals are stored - /// - [DataField("chemicalSolution", required: true), ViewVariables(VVAccess.ReadWrite)] - public Solution ChemicalSolution = default!; - - /// - /// The different chemicals that can be spawned by this effect - /// - [DataField("possibleChemicals", required: true, customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List PossibleChemicals = default!; - - /// - /// The number of chemicals in the puddle - /// - [DataField("chemAmount")] - public int ChemAmount = 3; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/EmpArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/EmpArtifactComponent.cs deleted file mode 100644 index d00e65e7c6..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/EmpArtifactComponent.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// Artifact that EMP -/// -[RegisterComponent] -[Access(typeof(EmpArtifactSystem))] -public sealed partial class EmpArtifactComponent : Component -{ - [DataField("range"), ViewVariables(VVAccess.ReadWrite)] - public float Range = 4f; - - [DataField("energyConsumption"), ViewVariables(VVAccess.ReadWrite)] - public float EnergyConsumption = 1000000; - - [DataField("disableDuration"), ViewVariables(VVAccess.ReadWrite)] - public float DisableDuration = 60f; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/FoamArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/FoamArtifactComponent.cs deleted file mode 100644 index dc6fd06839..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/FoamArtifactComponent.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// Generates foam from the artifact when activated -/// -[RegisterComponent, Access(typeof(FoamArtifactSystem))] -public sealed partial class FoamArtifactComponent : Component -{ - /// - /// The list of reagents that will randomly be picked from - /// to choose the foam reagent - /// - [DataField("reagents", required: true, customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List Reagents = new(); - - /// - /// The foam reagent - /// - [DataField("selectedReagent"), ViewVariables(VVAccess.ReadWrite)] - public string? SelectedReagent; - - /// - /// How long does the foam last? - /// - [DataField("duration"), ViewVariables(VVAccess.ReadWrite)] - public float Duration = 10; - - /// - /// How much reagent is in the foam? - /// - [DataField("reagentAmount"), ViewVariables(VVAccess.ReadWrite)] - public float ReagentAmount = 100; - - /// - /// Minimum radius of foam spawned - /// - [DataField("minFoamAmount"), ViewVariables(VVAccess.ReadWrite)] - public int MinFoamAmount = 15; - - /// - /// Maximum radius of foam spawned - /// - [DataField("maxFoamAmount"), ViewVariables(VVAccess.ReadWrite)] - public int MaxFoamAmount = 20; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs deleted file mode 100644 index ee12326df3..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Content.Shared.Atmos; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// Spawn a random gas with random temperature when artifact activated. -/// -[RegisterComponent] -public sealed partial class GasArtifactComponent : Component -{ - /// - /// Gas that will be spawned when artifact activated. - /// If null it will be picked on startup from . - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("spawnGas")] - public Gas? SpawnGas; - - /// - /// List of possible activation gases to pick on startup. - /// - [DataField("possibleGas")] - public List PossibleGases = new() - { - Gas.Oxygen, - Gas.Plasma, - Gas.Nitrogen, - Gas.CarbonDioxide, - Gas.Tritium, - Gas.Ammonia, - Gas.NitrousOxide, - Gas.Frezon - }; - - /// - /// Temperature of spawned gas. If null it will be picked on startup from range from - /// to . - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("spawnTemperature")] - public float? SpawnTemperature; - - [DataField("minRandomTemp")] - public float MinRandomTemperature = 100; - - [DataField("maxRandomTemp")] - public float MaxRandomTemperature = 400; - - /// - /// Max allowed external atmospheric pressure. - /// Artifact will stop spawn gas. - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("maxExternalPressure")] - public float MaxExternalPressure = Atmospherics.GasMinerDefaultMaxExternalPressure; - - /// - /// Moles of gas to spawn each time when artifact activated. - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("spawnAmount")] - public float SpawnAmount = Atmospherics.MolesCellStandard * 3; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/IgniteArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/IgniteArtifactComponent.cs deleted file mode 100644 index 436790a16f..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/IgniteArtifactComponent.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// Artifact that ignites surrounding entities when triggered. -/// -[RegisterComponent] -public sealed partial class IgniteArtifactComponent : Component -{ - [DataField("range")] - public float Range = 2f; - - [DataField("minFireStack")] - public int MinFireStack = 2; - - [DataField("maxFireStack")] - public int MaxFireStack = 5; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/KnockArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/KnockArtifactComponent.cs deleted file mode 100644 index 4db2f8ea5e..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/KnockArtifactComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// This is used for using the "knock" spell when the artifact is activated -/// -[RegisterComponent] -public sealed partial class KnockArtifactComponent : Component -{ - /// - /// The range of the spell - /// - [DataField("knockRange")] - public float KnockRange = 4f; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PhasingArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PhasingArtifactComponent.cs deleted file mode 100644 index 4857233b65..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PhasingArtifactComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// Removes the masks/layers of hard fixtures from the artifact when added, allowing it to pass through walls -/// and such. -/// -[RegisterComponent] -public sealed partial class PhasingArtifactComponent : Component -{ -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PortalArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PortalArtifactComponent.cs deleted file mode 100644 index f64b95d821..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PortalArtifactComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; -using Robust.Shared.Prototypes; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// When activated artifact will spawn an pair portals. First - right in artifact, Second - at random point of station. -/// -[RegisterComponent, Access(typeof(PortalArtifactSystem))] -public sealed partial class PortalArtifactComponent : Component -{ - [DataField] - public EntProtoId PortalProto = "PortalArtifact"; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/RandomInstrumentArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/RandomInstrumentArtifactComponent.cs deleted file mode 100644 index 28e91584ce..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/RandomInstrumentArtifactComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -[RegisterComponent] -public sealed partial class RandomInstrumentArtifactComponent : Component -{ - -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ShuffleArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ShuffleArtifactComponent.cs deleted file mode 100644 index 4b712135f2..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ShuffleArtifactComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// When activated, will shuffle the position of all players -/// within a certain radius. -/// -[RegisterComponent] -public sealed partial class ShuffleArtifactComponent : Component -{ - [DataField("radius")] - public float Radius = 7.5f; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/SpawnArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/SpawnArtifactComponent.cs deleted file mode 100644 index 6fcd8b3f8b..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/SpawnArtifactComponent.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Content.Shared.Storage; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// When activated artifact will spawn an entity from prototype. -/// It could be an angry mob or some random item. -/// -[RegisterComponent] -public sealed partial class SpawnArtifactComponent : Component -{ - [DataField("spawns")] - public List? Spawns; - - /// - /// The range around the artifact that it will spawn the entity - /// - [DataField("range")] - public float Range = 0.5f; - - /// - /// The maximum number of times the spawn will occur - /// - [DataField("maxSpawns")] - public int MaxSpawns = 10; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TriggerArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TriggerArtifactComponent.cs deleted file mode 100644 index 9194cde7b1..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/TriggerArtifactComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; - -/// -/// This is used for an artifact that triggers when activated. -/// -[RegisterComponent] -public sealed partial class TriggerArtifactComponent : Component -{ - -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChargeBatteryArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChargeBatteryArtifactSystem.cs deleted file mode 100644 index 778c672729..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChargeBatteryArtifactSystem.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Content.Server.Power.Components; -using Content.Server.Power.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Robust.Server.GameObjects; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -/// -/// This handles -/// -public sealed class ChargeBatteryArtifactSystem : EntitySystem -{ - [Dependency] private readonly BatterySystem _battery = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly TransformSystem _transform = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivated); - } - - private void OnActivated(EntityUid uid, ChargeBatteryArtifactComponent component, ArtifactActivatedEvent args) - { - foreach (var battery in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(uid), component.Radius)) - { - _battery.SetCharge(battery, battery.Comp.MaxCharge, battery); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChemicalPuddleArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChemicalPuddleArtifactSystem.cs deleted file mode 100644 index 542d8bb84c..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChemicalPuddleArtifactSystem.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Content.Server.Fluids.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -/// -/// This handles -/// -public sealed class ChemicalPuddleArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ArtifactSystem _artifact = default!; - [Dependency] private readonly PuddleSystem _puddle = default!; - - /// - /// The key for the node data entry containing - /// the chemicals that the puddle is made of. - /// - public const string NodeDataChemicalList = "nodeDataChemicalList"; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivated); - } - - private void OnActivated(EntityUid uid, ChemicalPuddleArtifactComponent component, ArtifactActivatedEvent args) - { - if (!TryComp(uid, out var artifact)) - return; - - if (!_artifact.TryGetNodeData(uid, NodeDataChemicalList, out List? chemicalList, artifact)) - { - chemicalList = new(); - for (var i = 0; i < component.ChemAmount; i++) - { - var chemProto = _random.Pick(component.PossibleChemicals); - chemicalList.Add(chemProto); - } - - _artifact.SetNodeData(uid, NodeDataChemicalList, chemicalList, artifact); - } - - var amountPerChem = component.ChemicalSolution.MaxVolume / component.ChemAmount; - foreach (var reagent in chemicalList) - { - component.ChemicalSolution.AddReagent(reagent, amountPerChem); - } - - _puddle.TrySpillAt(uid, component.ChemicalSolution, out _); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/DamageNearbyArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/DamageNearbyArtifactSystem.cs deleted file mode 100644 index f231120ad5..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/DamageNearbyArtifactSystem.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Damage; -using Content.Shared.Whitelist; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class BreakWindowArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivated); - } - - private void OnActivated(EntityUid uid, DamageNearbyArtifactComponent component, ArtifactActivatedEvent args) - { - var ents = _lookup.GetEntitiesInRange(uid, component.Radius); - if (args.Activator != null) - ents.Add(args.Activator.Value); - foreach (var ent in ents) - { - if (_whitelistSystem.IsWhitelistFail(component.Whitelist, ent)) - continue; - - if (!_random.Prob(component.DamageChance)) - return; - - _damageable.TryChangeDamage(ent, component.Damage, component.IgnoreResistances); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/EmpArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/EmpArtifactSystem.cs deleted file mode 100644 index 970743f484..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/EmpArtifactSystem.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Content.Server.Emp; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Robust.Server.GameObjects; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class EmpArtifactSystem : EntitySystem -{ - [Dependency] private readonly EmpSystem _emp = default!; - [Dependency] private readonly TransformSystem _transform = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivate); - } - - private void OnActivate(EntityUid uid, EmpArtifactComponent component, ArtifactActivatedEvent args) - { - _emp.EmpPulse(_transform.GetMapCoordinates(uid), component.Range, component.EnergyConsumption, component.DisableDuration); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/FoamArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/FoamArtifactSystem.cs deleted file mode 100644 index 2d2c230b12..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/FoamArtifactSystem.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Linq; -using Content.Server.Fluids.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Chemistry.Components; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class FoamArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly SmokeSystem _smoke = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnNodeEntered); - SubscribeLocalEvent(OnActivated); - } - - private void OnNodeEntered(EntityUid uid, FoamArtifactComponent component, ArtifactNodeEnteredEvent args) - { - if (!component.Reagents.Any()) - return; - - component.SelectedReagent = component.Reagents[args.RandomSeed % component.Reagents.Count]; - } - - private void OnActivated(EntityUid uid, FoamArtifactComponent component, ArtifactActivatedEvent args) - { - if (component.SelectedReagent == null) - return; - - var sol = new Solution(); - var xform = Transform(uid); - var range = (int) MathF.Round(MathHelper.Lerp(component.MinFoamAmount, component.MaxFoamAmount, _random.NextFloat(0, 1f))); - sol.AddReagent(component.SelectedReagent, component.ReagentAmount); - var foamEnt = Spawn("Foam", xform.Coordinates); - var spreadAmount = range * 4; - _smoke.StartSmoke(foamEnt, sol, component.Duration, spreadAmount); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/GasArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/GasArtifactSystem.cs deleted file mode 100644 index dc054d2318..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/GasArtifactSystem.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Content.Server.Atmos; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Atmos; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class GasArtifactSystem : EntitySystem -{ - [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnNodeEntered); - SubscribeLocalEvent(OnActivate); - } - - private void OnNodeEntered(EntityUid uid, GasArtifactComponent component, ArtifactNodeEnteredEvent args) - { - if (component.SpawnGas == null && component.PossibleGases.Count != 0) - { - var gas = component.PossibleGases[args.RandomSeed % component.PossibleGases.Count]; - component.SpawnGas = gas; - } - - if (component.SpawnTemperature == null) - { - var temp = args.RandomSeed % component.MaxRandomTemperature - component.MinRandomTemperature + - component.MinRandomTemperature; - component.SpawnTemperature = temp; - } - } - - private void OnActivate(EntityUid uid, GasArtifactComponent component, ArtifactActivatedEvent args) - { - if (component.SpawnGas == null || component.SpawnTemperature == null) - return; - - var environment = _atmosphereSystem.GetContainingMixture(uid, false, true); - if (environment == null) - return; - - if (environment.Pressure >= component.MaxExternalPressure) - return; - - var merger = new GasMixture(1) { Temperature = component.SpawnTemperature.Value }; - merger.SetMoles(component.SpawnGas.Value, component.SpawnAmount); - - _atmosphereSystem.Merge(environment, merger); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/IgniteArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/IgniteArtifactSystem.cs deleted file mode 100644 index 0d6480a3ac..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/IgniteArtifactSystem.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Linq; -using Content.Server.Atmos.Components; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class IgniteArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly FlammableSystem _flammable = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivate); - } - - private void OnActivate(EntityUid uid, IgniteArtifactComponent component, ArtifactActivatedEvent args) - { - var flammable = GetEntityQuery(); - foreach (var target in _lookup.GetEntitiesInRange(uid, component.Range)) - { - if (!flammable.TryGetComponent(target, out var fl)) - continue; - fl.FireStacks += _random.Next(component.MinFireStack, component.MaxFireStack); - _flammable.Ignite(target, uid, fl); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs deleted file mode 100644 index 0245b220a3..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Magic.Events; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class KnockArtifactSystem : EntitySystem -{ - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivated); - } - - private void OnActivated(EntityUid uid, KnockArtifactComponent component, ArtifactActivatedEvent args) - { - var ev = new KnockSpellEvent - { - Performer = uid, - Range = component.KnockRange - }; - RaiseLocalEvent(ev); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/LightFlickerArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/LightFlickerArtifactSystem.cs deleted file mode 100644 index 52d9fb0b36..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/LightFlickerArtifactSystem.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Server.Ghost; -using Content.Server.Light.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -/// -/// This handles... -/// -public sealed class LightFlickerArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly GhostSystem _ghost = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivated); - } - - private void OnActivated(EntityUid uid, LightFlickerArtifactComponent component, ArtifactActivatedEvent args) - { - var lights = GetEntityQuery(); - foreach (var light in _lookup.GetEntitiesInRange(uid, component.Radius, LookupFlags.StaticSundries )) - { - if (!lights.HasComponent(light)) - continue; - - if (!_random.Prob(component.FlickerChance)) - continue; - - _ghost.DoGhostBooEvent(light); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PhasingArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PhasingArtifactSystem.cs deleted file mode 100644 index d07da6aa8f..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PhasingArtifactSystem.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Physics; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Dynamics; -using Robust.Shared.Physics.Systems; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -/// -/// Handles allowing activated artifacts to phase through walls. -/// -public sealed class PhasingArtifactSystem : EntitySystem -{ - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - - /// - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnActivate); - } - - private void OnActivate(EntityUid uid, PhasingArtifactComponent component, ArtifactActivatedEvent args) - { - if (!TryComp(uid, out var fixtures)) - return; - - foreach (var fixture in fixtures.Fixtures.Values) - { - _physics.SetHard(uid, fixture, false, fixtures); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyOthersArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyOthersArtifactSystem.cs deleted file mode 100644 index 3831bea06c..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyOthersArtifactSystem.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Content.Server.Polymorph.Systems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Humanoid; -using Content.Shared.Mobs.Systems; -using Robust.Shared.Audio.Systems; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class PolyOthersArtifactSystem : EntitySystem -{ - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly MobStateSystem _mob = default!; - [Dependency] private readonly PolymorphSystem _poly = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - - /// - /// On effect trigger polymorphs targets in range. - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivate); - } - - /// - /// Provided target is alive and is not a zombie, polymorphs the target. - /// - private void OnActivate(Entity ent, ref ArtifactActivatedEvent args) - { - var xform = Transform(ent); - var humanoids = new HashSet>(); - _lookup.GetEntitiesInRange(xform.Coordinates, ent.Comp.Range, humanoids); - - foreach (var comp in humanoids) - { - var target = comp.Owner; - if (_mob.IsAlive(target)) - { - _poly.PolymorphEntity(target, ent.Comp.PolymorphPrototypeName); - _audio.PlayPvs(ent.Comp.PolySound, ent); - } - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/RandomInstrumentArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/RandomInstrumentArtifactSystem.cs deleted file mode 100644 index 118bc396a7..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/RandomInstrumentArtifactSystem.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Content.Server.Instruments; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Shared.Instruments; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class RandomInstrumentArtifactSystem : EntitySystem -{ - [Dependency] private readonly InstrumentSystem _instrument = default!; - [Dependency] private readonly IRobustRandom _random = default!; - /// - public override void Initialize() - { - SubscribeLocalEvent(OnStartup); - } - - private void OnStartup(EntityUid uid, RandomInstrumentArtifactComponent component, ComponentStartup args) - { - var instrument = EnsureComp(uid); - _instrument.SetInstrumentProgram(uid, instrument, (byte) _random.Next(0, 127), 0); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/RandomTeleportArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/RandomTeleportArtifactSystem.cs deleted file mode 100644 index 7e3ecb8faa..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/RandomTeleportArtifactSystem.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Popups; -using Robust.Shared.Player; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class RandomTeleportArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedTransformSystem _xform = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivate); - } - - private void OnActivate(EntityUid uid, RandomTeleportArtifactComponent component, ArtifactActivatedEvent args) - { - var xform = Transform(uid); - _popup.PopupCoordinates(Loc.GetString("blink-artifact-popup"), xform.Coordinates, PopupType.Medium); - - _xform.SetCoordinates(uid, xform, xform.Coordinates.Offset(_random.NextVector2(component.MinRange, component.MaxRange))); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ShuffleArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ShuffleArtifactSystem.cs deleted file mode 100644 index c39627818a..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ShuffleArtifactSystem.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Mobs.Components; -using Robust.Shared.Map; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class ShuffleArtifactSystem : EntitySystem -{ - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly SharedTransformSystem _xform = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivated); - } - - private void OnActivated(EntityUid uid, ShuffleArtifactComponent component, ArtifactActivatedEvent args) - { - var mobState = GetEntityQuery(); - - List> toShuffle = new(); - - foreach (var ent in _lookup.GetEntitiesInRange(uid, component.Radius, LookupFlags.Dynamic | LookupFlags.Sundries)) - { - if (!mobState.HasComponent(ent)) - continue; - - var xform = Transform(ent); - - toShuffle.Add((ent, xform)); - } - - _random.Shuffle(toShuffle); - - while (toShuffle.Count > 1) - { - var ent1 = _random.PickAndTake(toShuffle); - var ent2 = _random.PickAndTake(toShuffle); - _xform.SwapPositions((ent1, ent1), (ent2, ent2)); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/SpawnArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/SpawnArtifactSystem.cs deleted file mode 100644 index c262283787..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/SpawnArtifactSystem.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Numerics; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Storage; -using Robust.Server.GameObjects; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class SpawnArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ArtifactSystem _artifact = default!; - [Dependency] private readonly TransformSystem _transform = default!; - - public const string NodeDataSpawnAmount = "nodeDataSpawnAmount"; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnActivate); - } - - private void OnActivate(EntityUid uid, SpawnArtifactComponent component, ArtifactActivatedEvent args) - { - if (!_artifact.TryGetNodeData(uid, NodeDataSpawnAmount, out int amount)) - amount = 0; - - if (amount >= component.MaxSpawns) - return; - - if (component.Spawns is not {} spawns) - return; - - var artifactCord = _transform.GetMapCoordinates(uid); - foreach (var spawn in EntitySpawnCollection.GetSpawns(spawns, _random)) - { - var dx = _random.NextFloat(-component.Range, component.Range); - var dy = _random.NextFloat(-component.Range, component.Range); - var spawnCord = artifactCord.Offset(new Vector2(dx, dy)); - var ent = Spawn(spawn, spawnCord); - _transform.AttachToGridOrMap(ent); - } - _artifact.SetNodeData(uid, NodeDataSpawnAmount, amount + 1); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TemperatureArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TemperatureArtifactSystem.cs deleted file mode 100644 index e62ce36b5b..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TemperatureArtifactSystem.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Content.Server.Atmos; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Atmos; -using Robust.Server.GameObjects; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class TemperatureArtifactSystem : EntitySystem -{ - [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnActivate); - } - - private void OnActivate(EntityUid uid, TemperatureArtifactComponent component, ArtifactActivatedEvent args) - { - var transform = Transform(uid); - - var center = _atmosphereSystem.GetContainingMixture(uid, false, true); - if (center == null) - return; - UpdateTileTemperature(component, center); - - if (component.AffectAdjacentTiles && transform.GridUid != null) - { - var enumerator = _atmosphereSystem.GetAdjacentTileMixtures(transform.GridUid.Value, - _transformSystem.GetGridOrMapTilePosition(uid, transform), excite: true); - - while (enumerator.MoveNext(out var mixture)) - { - UpdateTileTemperature(component, mixture); - } - } - } - - private void UpdateTileTemperature(TemperatureArtifactComponent component, GasMixture environment) - { - var dif = component.TargetTemperature - environment.Temperature; - var absDif = Math.Abs(dif); - var step = Math.Min(absDif, component.SpawnTemperature); - environment.Temperature += dif > 0 ? step : -step; - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs deleted file mode 100644 index 7b8430dc48..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Numerics; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Shared.Maps; -using Content.Shared.Physics; -using Content.Shared.Throwing; -using Robust.Shared.Map.Components; -using Robust.Shared.Physics.Components; -using Robust.Shared.Random; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -public sealed class ThrowArtifactSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly ThrowingSystem _throwing = default!; - [Dependency] private readonly TileSystem _tile = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly SharedMapSystem _mapSystem = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnActivated); - } - - private void OnActivated(EntityUid uid, ThrowArtifactComponent component, ArtifactActivatedEvent args) - { - var xform = Transform(uid); - if (TryComp(xform.GridUid, out var grid)) - { - var tiles = _mapSystem.GetTilesIntersecting( - xform.GridUid.Value, - grid, - Box2.CenteredAround(_transform.GetWorldPosition(xform), new Vector2(component.Range * 2, component.Range))); - - foreach (var tile in tiles) - { - if (!_random.Prob(component.TilePryChance)) - continue; - - _tile.PryTile(tile); - } - } - - var lookup = _lookup.GetEntitiesInRange(uid, component.Range, LookupFlags.Dynamic | LookupFlags.Sundries); - var physQuery = GetEntityQuery(); - foreach (var ent in lookup) - { - if (physQuery.TryGetComponent(ent, out var phys) - && (phys.CollisionMask & (int) CollisionGroup.GhostImpassable) != 0) - continue; - - var tempXform = Transform(ent); - - var foo = _transform.GetMapCoordinates(ent, xform: tempXform).Position - _transform.GetMapCoordinates(uid, xform: xform).Position; - _throwing.TryThrow(ent, foo*2, component.ThrowStrength, uid, 0); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TriggerArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TriggerArtifactSystem.cs deleted file mode 100644 index f70c8d7e9e..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/TriggerArtifactSystem.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Server.Explosion.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; - -/// -/// This handles -/// -public sealed class TriggerArtifactSystem : EntitySystem -{ - [Dependency] private readonly TriggerSystem _trigger = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnArtifactActivated); - } - - private void OnArtifactActivated(EntityUid uid, TriggerArtifactComponent component, ArtifactActivatedEvent args) - { - _trigger.Trigger(uid, args.Activator); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Events/ArtifactEvents.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Events/ArtifactEvents.cs deleted file mode 100644 index 57f5089825..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Events/ArtifactEvents.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Events; - -/// -/// Invokes when artifact was successfully activated. -/// Used to start attached effects. -/// -public sealed class ArtifactActivatedEvent : EntityEventArgs -{ - /// - /// Entity that activate this artifact. - /// Usually player, but can also be another object. - /// - public EntityUid? Activator; -} - -/// -/// Force to randomize artifact triggers. -/// -public sealed class ArtifactNodeEnteredEvent : EntityEventArgs -{ - /// - /// An entity-specific seed that can be used to - /// generate random values. - /// - public readonly int RandomSeed; - - public ArtifactNodeEnteredEvent(int randomSeed) - { - RandomSeed = randomSeed; - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactAnchorTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactAnchorTriggerComponent.cs deleted file mode 100644 index 3b2190debd..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactAnchorTriggerComponent.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when an artifact is anchored -/// -/// -/// Not every trigger can be a winner -/// -[RegisterComponent] -public sealed partial class ArtifactAnchorTriggerComponent : Component -{ - -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactDamageTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactDamageTriggerComponent.cs deleted file mode 100644 index 2f5ac6de81..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactDamageTriggerComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Content.Shared.Damage.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when a certain threshold of damage of certain types is reached -/// -[RegisterComponent] -public sealed partial class ArtifactDamageTriggerComponent : Component -{ - /// - /// What damage types are accumulated for the trigger? - /// - [DataField("damageTypes", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List? DamageTypes; - - /// - /// What threshold has to be reached before it is activated? - /// - [DataField("damageThreshold", required: true)] - public float DamageThreshold; - - /// - /// How much damage has been accumulated on the artifact so far - /// - [ViewVariables(VVAccess.ReadWrite)] - public float AccumulatedDamage = 0; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactDeathTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactDeathTriggerComponent.cs deleted file mode 100644 index a9d4d1af48..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactDeathTriggerComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when a nearby entity dies -/// -[RegisterComponent] -public sealed partial class ArtifactDeathTriggerComponent : Component -{ - /// - /// How close to the death the artifact has to be for it to trigger. - /// - [DataField("range")] - public float Range = 15f; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactElectricityTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactElectricityTriggerComponent.cs deleted file mode 100644 index 4046d8c4d8..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactElectricityTriggerComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Activate artifact when it contacted with an electricity source. -/// It could be connected MV cables, stun baton or multi tool. -/// -[RegisterComponent] -public sealed partial class ArtifactElectricityTriggerComponent : Component -{ - /// - /// How much power should artifact receive to operate. - /// - [DataField("minPower")] - public float MinPower = 400; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactExamineTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactExamineTriggerComponent.cs deleted file mode 100644 index ac669970de..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactExamineTriggerComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when the artifact is examined. -/// -[RegisterComponent] -public sealed partial class ArtifactExamineTriggerComponent : Component -{ - -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs deleted file mode 100644 index 77cb86f47f..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Shared.Atmos; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Activates artifact when it surrounded by certain gas. -/// -[RegisterComponent] -public sealed partial class ArtifactGasTriggerComponent : Component -{ - /// - /// List of possible activation gases to pick on startup. - /// - [DataField("possibleGas")] - public List PossibleGases = new() - { - Gas.Oxygen, - Gas.Plasma, - Gas.Nitrogen, - Gas.CarbonDioxide, - Gas.Ammonia, - Gas.NitrousOxide - }; - - /// - /// Gas id that will activate artifact. - /// - [DataField("gas")] - [ViewVariables(VVAccess.ReadWrite)] - public Gas? ActivationGas; - - /// - /// How many moles of gas should be present in room to activate artifact. - /// - [DataField("moles")] - [ViewVariables(VVAccess.ReadWrite)] - public float ActivationMoles = Atmospherics.MolesCellStandard * 0.1f; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactHeatTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactHeatTriggerComponent.cs deleted file mode 100644 index 0af4200780..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactHeatTriggerComponent.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -// TODO: This should probably be generalized for cold temperature too, -// but right now there is no sane way to make a freezer. - -/// -/// Triggers artifact if its in hot environment or -/// has contacted with a hot object (lit welder, lighter, etc). -/// -[RegisterComponent] -public sealed partial class ArtifactHeatTriggerComponent : Component -{ - /// - /// Minimal surrounding gas temperature to trigger artifact. - /// Around 100 degrees celsius by default. - /// Doesn't affect hot items temperature. - /// - [DataField("activationTemperature")] - [ViewVariables(VVAccess.ReadWrite)] - public float ActivationTemperature = 373; - - /// - /// Should artifact be activated by hot items (welders, lighter, etc)? - /// - [DataField("activateHot")] - [ViewVariables(VVAccess.ReadWrite)] - public bool ActivateHotItems = true; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactInteractionTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactInteractionTriggerComponent.cs deleted file mode 100644 index e2f00f9ebd..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactInteractionTriggerComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Activate artifact by touching, attacking or pulling it. -/// -[RegisterComponent] -public sealed partial class ArtifactInteractionTriggerComponent : Component -{ - /// - /// Should artifact be activated just by touching with empty hand? - /// - [DataField("emptyHandActivation")] - [ViewVariables(VVAccess.ReadWrite)] - public bool EmptyHandActivation = true; - - /// - /// Should artifact be activated by melee attacking? - /// - [DataField("attackActivation")] - [ViewVariables(VVAccess.ReadWrite)] - public bool AttackActivation = true; - - /// - /// Should artifact be activated by starting pulling it? - /// - [DataField("pullActivation")] - [ViewVariables(VVAccess.ReadWrite)] - public bool PullActivation = true; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactLandTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactLandTriggerComponent.cs deleted file mode 100644 index b8be1b196f..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactLandTriggerComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when the artifact lands after being thrown. -/// -[RegisterComponent] -public sealed partial class ArtifactLandTriggerComponent : Component -{ -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMagnetTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMagnetTriggerComponent.cs deleted file mode 100644 index 6e7bb43e8b..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMagnetTriggerComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when the salvage magnet is activated -/// -[RegisterComponent] -public sealed partial class ArtifactMagnetTriggerComponent : Component -{ - /// - /// how close to the magnet do you have to be? - /// - [DataField("range")] - public float Range = 40f; - - /// - /// How close do active magboots have to be? - /// This is smaller because they are weaker magnets - /// - [DataField("magbootRange")] - public float MagbootRange = 2f; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMicrowaveTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMicrowaveTriggerComponent.cs deleted file mode 100644 index 6270e4d826..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMicrowaveTriggerComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when an item artifact is microwaved. -/// -[RegisterComponent] -public sealed partial class ArtifactMicrowaveTriggerComponent : Component -{ -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMusicTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMusicTriggerComponent.cs deleted file mode 100644 index 1a67d5e446..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactMusicTriggerComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when an instrument is played nearby -/// -[RegisterComponent] -public sealed partial class ArtifactMusicTriggerComponent : Component -{ - /// - /// how close does the artifact have to be to the instrument to activate - /// - [DataField("range")] - public float Range = 5; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactPressureTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactPressureTriggerComponent.cs deleted file mode 100644 index 8a7d37cfb1..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactPressureTriggerComponent.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Triggers when a certain pressure threshold is hit -/// -[RegisterComponent] -public sealed partial class ArtifactPressureTriggerComponent : Component -{ - /// - /// The lower-end pressure threshold - /// - [DataField("minPressureThreshold")] - public float? MinPressureThreshold; - - /// - /// The higher-end pressure threshold - /// - [DataField("maxPressureThreshold")] - public float? MaxPressureThreshold; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactTimerTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactTimerTriggerComponent.cs deleted file mode 100644 index bab364afbb..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactTimerTriggerComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -/// -/// Will try to activate artifact periodically. -/// Doesn't used for random artifacts, can be spawned by admins. -/// -[RegisterComponent] -public sealed partial class ArtifactTimerTriggerComponent : Component -{ - /// - /// Time between artifact activation attempts. - /// - [DataField("rate")] - [ViewVariables(VVAccess.ReadWrite)] - public TimeSpan ActivationRate = TimeSpan.FromSeconds(5.0f); - - /// - /// Last time when artifact was activated. - /// - public TimeSpan LastActivation; -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactAnchorTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactAnchorTriggerSystem.cs deleted file mode 100644 index 568273efbd..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactAnchorTriggerSystem.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactAnchorTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnAnchorStateChanged); - } - - private void OnAnchorStateChanged(EntityUid uid, ArtifactAnchorTriggerComponent component, ref AnchorStateChangedEvent args) - { - if (args.Detaching) - return; - - _artifact.TryActivateArtifact(uid); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactDamageTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactDamageTriggerSystem.cs deleted file mode 100644 index aa7c70753c..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactDamageTriggerSystem.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Damage; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactDamageTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnDamageChanged); - } - - private void OnDamageChanged(EntityUid uid, ArtifactDamageTriggerComponent component, DamageChangedEvent args) - { - if (!args.DamageIncreased) - return; - - if (args.DamageDelta == null) - return; - - foreach (var (type, amount) in args.DamageDelta.DamageDict) - { - if (component.DamageTypes != null && !component.DamageTypes.Contains(type)) - continue; - - component.AccumulatedDamage += (float) amount; - } - - if (component.AccumulatedDamage >= component.DamageThreshold) - _artifact.TryActivateArtifact(uid, args.Origin); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactDeathTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactDeathTriggerSystem.cs deleted file mode 100644 index a924120734..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactDeathTriggerSystem.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Mobs; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactDeathTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnMobStateChanged); - } - - private void OnMobStateChanged(MobStateChangedEvent ev) - { - if (ev.NewMobState != MobState.Dead) - return; - - var deathXform = Transform(ev.Target); - - var toActivate = new List>(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var trigger, out var xform)) - { - if (!deathXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance)) - continue; - - if (distance > trigger.Range) - continue; - - toActivate.Add((uid, trigger)); - } - - foreach (var a in toActivate) - { - _artifact.TryActivateArtifact(a); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactElectricityTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactElectricityTriggerSystem.cs deleted file mode 100644 index 9d2fd58980..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactElectricityTriggerSystem.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Content.Server.Power.Components; -using Content.Server.Power.Events; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Interaction; -using Content.Shared.Tools.Components; -using Content.Shared.Tools.Systems; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactElectricityTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - [Dependency] private readonly SharedToolSystem _toolSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInteractUsing); - SubscribeLocalEvent(OnPowerPulse); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - List> toUpdate = new(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var trigger, out var power, out var artifact)) - { - if (power.ReceivedPower <= trigger.MinPower) - continue; - - toUpdate.Add((uid, artifact)); - } - - foreach (var a in toUpdate) - { - _artifactSystem.TryActivateArtifact(a, null, a); - } - } - - private void OnInteractUsing(EntityUid uid, ArtifactElectricityTriggerComponent component, InteractUsingEvent args) - { - if (args.Handled) - return; - - if (!_toolSystem.HasQuality(args.Used, SharedToolSystem.PulseQuality)) - return; - - args.Handled = _artifactSystem.TryActivateArtifact(uid, args.User); - } - - private void OnPowerPulse(EntityUid uid, ArtifactElectricityTriggerComponent component, PowerPulseEvent args) - { - _artifactSystem.TryActivateArtifact(uid, args.User); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactExamineTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactExamineTriggerSystem.cs deleted file mode 100644 index b7afbcfc8b..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactExamineTriggerSystem.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Examine; -using Content.Shared.Ghost; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactExamineTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnExamine); - } - - private void OnExamine(EntityUid uid, ArtifactExamineTriggerComponent component, ExaminedEvent args) - { - // Prevent ghosts from activating this trigger unless they have CanGhostInteract - if (TryComp(args.Examiner, out var ghost) && !ghost.CanGhostInteract) - return; - - _artifact.TryActivateArtifact(uid); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactGasTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactGasTriggerSystem.cs deleted file mode 100644 index 00f409f553..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactGasTriggerSystem.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Content.Server.Atmos.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactGasTriggerSystem : EntitySystem -{ - [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; - [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnRandomizeTrigger); - } - - private void OnRandomizeTrigger(EntityUid uid, ArtifactGasTriggerComponent component, ArtifactNodeEnteredEvent args) - { - if (component.ActivationGas != null) - return; - - var gas = component.PossibleGases[args.RandomSeed % component.PossibleGases.Count]; - component.ActivationGas = gas; - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - List> toUpdate = new(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var trigger, out var artifact, out var transform)) - { - if (trigger.ActivationGas == null) - continue; - - var environment = _atmosphereSystem.GetTileMixture((uid, transform)); - if (environment == null) - continue; - - // check if outside there is enough moles to activate artifact - var moles = environment.GetMoles(trigger.ActivationGas.Value); - if (moles < trigger.ActivationMoles) - continue; - - toUpdate.Add((uid, artifact)); - } - - foreach (var a in toUpdate) - { - _artifactSystem.TryActivateArtifact(a, null, a); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactHeatTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactHeatTriggerSystem.cs deleted file mode 100644 index 5525cdf359..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactHeatTriggerSystem.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Content.Server.Atmos.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Interaction; -using Content.Shared.Temperature; -using Content.Shared.Weapons.Melee.Events; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactHeatTriggerSystem : EntitySystem -{ - [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; - [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnAttacked); - SubscribeLocalEvent(OnUsing); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - List> toUpdate = new(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var trigger, out var transform, out var artifact)) - { - var environment = _atmosphereSystem.GetTileMixture((uid, transform)); - if (environment == null) - continue; - - if (environment.Temperature < trigger.ActivationTemperature) - continue; - - toUpdate.Add((uid, artifact)); - } - - foreach (var a in toUpdate) - { - _artifactSystem.TryActivateArtifact(a, null, a); - } - } - - private void OnAttacked(EntityUid uid, ArtifactHeatTriggerComponent component, AttackedEvent args) - { - if (!component.ActivateHotItems || !CheckHot(args.Used)) - return; - _artifactSystem.TryActivateArtifact(uid, args.User); - } - - private void OnUsing(EntityUid uid, ArtifactHeatTriggerComponent component, InteractUsingEvent args) - { - if (args.Handled) - return; - - if (!component.ActivateHotItems || !CheckHot(args.Used)) - return; - args.Handled = _artifactSystem.TryActivateArtifact(uid, args.User); - } - - private bool CheckHot(EntityUid usedUid) - { - var hotEvent = new IsHotEvent(); - RaiseLocalEvent(usedUid, hotEvent); - return hotEvent.IsHot; - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs deleted file mode 100644 index 9976d56da0..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs +++ /dev/null @@ -1,46 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Interaction; -using Content.Shared.Movement.Pulling.Events; -using Content.Shared.Weapons.Melee.Events; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactInteractionTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnPull); - SubscribeLocalEvent(OnAttack); - SubscribeLocalEvent(OnInteract); - } - - private void OnPull(EntityUid uid, ArtifactInteractionTriggerComponent component, PullStartedMessage args) - { - if (!component.PullActivation) - return; - - _artifactSystem.TryActivateArtifact(uid, args.PullerUid); - } - - private void OnAttack(EntityUid uid, ArtifactInteractionTriggerComponent component, AttackedEvent args) - { - if (!component.AttackActivation) - return; - - _artifactSystem.TryActivateArtifact(uid, args.User); - } - - private void OnInteract(EntityUid uid, ArtifactInteractionTriggerComponent component, InteractHandEvent args) - { - if (args.Handled) - return; - - if (!component.EmptyHandActivation) - return; - - args.Handled = _artifactSystem.TryActivateArtifact(uid, args.User); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactLandSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactLandSystem.cs deleted file mode 100644 index f92e4f8e30..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactLandSystem.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Throwing; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactLandSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnLand); - } - - private void OnLand(EntityUid uid, ArtifactLandTriggerComponent component, ref LandEvent args) - { - _artifact.TryActivateArtifact(uid, args.User); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMagnetTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMagnetTriggerSystem.cs deleted file mode 100644 index a585a9ef45..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMagnetTriggerSystem.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Linq; -using Content.Server.Salvage; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Content.Shared.Clothing; -using Content.Shared.Item.ItemToggle.Components; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -/// -/// This handles artifacts that are activated by magnets, both salvage and magboots. -/// -public sealed class ArtifactMagnetTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - private readonly List _toActivate = new(); - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnMagnetActivated); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - if (!EntityQuery().Any()) - return; - - _toActivate.Clear(); - - //assume that there's more magboots than artifacts - var query = EntityQueryEnumerator(); - while (query.MoveNext(out _, out var magboot, out var magXform, out var toggle)) - { - if (!toggle.Activated) - continue; - - var artiQuery = EntityQueryEnumerator(); - while (artiQuery.MoveNext(out var artifactUid, out var trigger, out var xform)) - { - if (!magXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance)) - continue; - - if (distance > trigger.MagbootRange) - continue; - - _toActivate.Add(artifactUid); - } - } - - foreach (var a in _toActivate) - { - _artifact.TryActivateArtifact(a); - } - } - - private void OnMagnetActivated(ref SalvageMagnetActivatedEvent ev) - { - var magXform = Transform(ev.Magnet); - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var artifact, out var xform)) - { - if (!magXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance)) - continue; - - if (distance > artifact.Range) - continue; - - _toActivate.Add(uid); - } - - foreach (var a in _toActivate) - { - _artifact.TryActivateArtifact(a); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMicrowaveTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMicrowaveTriggerSystem.cs deleted file mode 100644 index ca61c8f8ab..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMicrowaveTriggerSystem.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Content.Server.Kitchen.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactMicrowaveTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnMicrowaved); - } - - private void OnMicrowaved(EntityUid uid, ArtifactMicrowaveTriggerComponent component, BeingMicrowavedEvent args) - { - _artifact.TryActivateArtifact(uid); - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMusicTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMusicTriggerSystem.cs deleted file mode 100644 index c62ed58752..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactMusicTriggerSystem.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Linq; -using Content.Server.Instruments; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -/// -/// This handles activating an artifact when music is playing nearby -/// -public sealed class ArtifactMusicTriggerSystem : EntitySystem -{ - [Dependency] private readonly ArtifactSystem _artifact = default!; - - private readonly List> _artifacts = new(); - - public override void Update(float frameTime) - { - base.Update(frameTime); - - _artifacts.Clear(); - var artifactQuery = EntityQueryEnumerator(); - while (artifactQuery.MoveNext(out var uid, out var trigger, out var xform)) - { - _artifacts.Add((uid, trigger, xform)); - } - - if (!_artifacts.Any()) - return; - - List toActivate = new(); - var query = EntityQueryEnumerator(); - - //assume that there's more instruments than artifacts - while (query.MoveNext(out _, out var instXform)) - { - foreach (var (uid, trigger, xform) in _artifacts) - { - if (!instXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance)) - continue; - - if (distance > trigger.Range) - continue; - - toActivate.Add(uid); - } - } - - foreach (var a in toActivate) - { - _artifact.TryActivateArtifact(a); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactPressureTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactPressureTriggerSystem.cs deleted file mode 100644 index 8777ab0a8c..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactPressureTriggerSystem.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Content.Server.Atmos.EntitySystems; -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -/// -/// This handles activation upon certain pressure thresholds. -/// -public sealed class ArtifactPressureTriggerSystem : EntitySystem -{ - [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; - [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - - public override void Update(float frameTime) - { - base.Update(frameTime); - - List> toUpdate = new(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var trigger, out var artifact, out var transform)) - { - var environment = _atmosphereSystem.GetTileMixture((uid, transform)); - if (environment == null) - continue; - - var pressure = environment.Pressure; - if (pressure >= trigger.MaxPressureThreshold || pressure <= trigger.MinPressureThreshold) - toUpdate.Add((uid, artifact)); - } - - foreach (var a in toUpdate) - { - _artifactSystem.TryActivateArtifact(a, null, a); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactTimerTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactTimerTriggerSystem.cs deleted file mode 100644 index c6ea745e1c..0000000000 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactTimerTriggerSystem.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; -using Robust.Shared.Timing; - -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; - -public sealed class ArtifactTimerTriggerSystem : EntitySystem -{ - [Dependency] private readonly IGameTiming _time = default!; - [Dependency] private readonly ArtifactSystem _artifactSystem = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnStartup); - } - - private void OnStartup(EntityUid uid, ArtifactTimerTriggerComponent component, ComponentStartup args) - { - component.LastActivation = _time.CurTime; - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - List> toUpdate = new(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var trigger, out var artifact)) - { - var timeDif = _time.CurTime - trigger.LastActivation; - if (timeDif <= trigger.ActivationRate) - continue; - - toUpdate.Add((uid, artifact)); - trigger.LastActivation = _time.CurTime; - } - - foreach (var a in toUpdate) - { - _artifactSystem.TryActivateArtifact(a, null, a); - } - } -} diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs index 321a89d591..0042ba8f72 100644 --- a/Content.Shared.Database/LogType.cs +++ b/Content.Shared.Database/LogType.cs @@ -464,4 +464,8 @@ public enum LogType /// Logs related to botany, such as planting and harvesting crops /// Botany = 100, + /// + /// Artifact node got activated. + /// + ArtifactNode = 101 } diff --git a/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs b/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs index 534b6ba9f6..25781d2966 100644 --- a/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs +++ b/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs @@ -15,6 +15,11 @@ namespace Content.Shared.Chemistry.Reaction { public sealed class ChemicalReactionSystem : EntitySystem { + /// + /// Foam reaction protoId. + /// + public static readonly ProtoId FoamReaction = "Foam"; + /// /// The maximum number of reactions that may occur when a solution is changed. /// diff --git a/Content.Shared/Chemistry/ReactiveSystem.cs b/Content.Shared/Chemistry/ReactiveSystem.cs index edd75bb0b4..6306537324 100644 --- a/Content.Shared/Chemistry/ReactiveSystem.cs +++ b/Content.Shared/Chemistry/ReactiveSystem.cs @@ -38,6 +38,10 @@ public sealed class ReactiveSystem : EntitySystem if (!TryComp(uid, out ReactiveComponent? reactive)) return; + // custom event for bypassing reactivecomponent stuff + var ev = new ReactionEntityEvent(method, proto, reagentQuantity, source); + RaiseLocalEvent(uid, ref ev); + // If we have a source solution, use the reagent quantity we have left. Otherwise, use the reaction volume specified. var args = new EntityEffectReagentArgs(uid, EntityManager, null, source, source?.GetReagentQuantity(reagentQuantity.Reagent) ?? reagentQuantity.Quantity, proto, method, 1f); @@ -107,3 +111,11 @@ Touch, Injection, Ingestion, } + +[ByRefEvent] +public readonly record struct ReactionEntityEvent( + ReactionMethod Method, + ReagentPrototype Reagent, + ReagentQuantity ReagentQuantity, + Solution? Source +); diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index fb55a6184e..31426f6bd0 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -329,7 +329,7 @@ namespace Content.Shared.Damage damage.DamageDict.Add(typeId, damageValue); } - TryChangeDamage(uid, damage, interruptsDoAfters: false); + TryChangeDamage(uid, damage, interruptsDoAfters: false, origin: args.Origin); } private void OnRejuvenate(EntityUid uid, DamageableComponent component, RejuvenateEvent args) diff --git a/Content.Shared/Instruments/SharedInstrumentComponent.cs b/Content.Shared/Instruments/SharedInstrumentComponent.cs index 73500f3869..da64bf8cd7 100644 --- a/Content.Shared/Instruments/SharedInstrumentComponent.cs +++ b/Content.Shared/Instruments/SharedInstrumentComponent.cs @@ -34,6 +34,12 @@ public abstract partial class SharedInstrumentComponent : Component public BitArray FilteredChannels { get; set; } = new(RobustMidiEvent.MaxChannels, true); } +/// +/// Component that indicates that musical instrument was activated (ui opened). +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ActiveInstrumentComponent : Component; + [Serializable, NetSerializable] public sealed class InstrumentComponentState : ComponentState { diff --git a/Content.Shared/Radiation/Events/OnIrradiatedEvent.cs b/Content.Shared/Radiation/Events/OnIrradiatedEvent.cs index 3112e1eb47..ec9988fffb 100644 --- a/Content.Shared/Radiation/Events/OnIrradiatedEvent.cs +++ b/Content.Shared/Radiation/Events/OnIrradiatedEvent.cs @@ -1,14 +1,16 @@ -namespace Content.Shared.Radiation.Events; +namespace Content.Shared.Radiation.Events; /// /// Raised on entity when it was irradiated /// by some radiation source. /// -public readonly record struct OnIrradiatedEvent(float FrameTime, float RadsPerSecond) +public readonly record struct OnIrradiatedEvent(float FrameTime, float RadsPerSecond, EntityUid Origin) { public readonly float FrameTime = FrameTime; public readonly float RadsPerSecond = RadsPerSecond; + public readonly EntityUid Origin = Origin; + public float TotalRads => RadsPerSecond * FrameTime; } diff --git a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactComponent.cs new file mode 100644 index 0000000000..fb118602c7 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactComponent.cs @@ -0,0 +1,161 @@ +using Content.Shared.Destructible.Thresholds; +using Content.Shared.EntityTable.EntitySelectors; +using Content.Shared.Xenoarchaeology.Artifact.Prototypes; +using Robust.Shared.Audio; +using Robust.Shared.Containers; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Xenoarchaeology.Artifact.Components; + +/// +/// This is used for handling interactions with artifacts as well as +/// storing data about artifact node graphs. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SharedXenoArtifactSystem)), AutoGenerateComponentState, AutoGenerateComponentPause] +public sealed partial class XenoArtifactComponent : Component +{ + public static string NodeContainerId = "node-container"; + + /// + /// Marker, if nodes graph should be generated for artifact. + /// + [DataField] + public bool IsGenerationRequired = true; + + /// + /// Container for artifact graph node entities. + /// + [ViewVariables] + public Container NodeContainer = default!; + + /// + /// The nodes in this artifact that are currently "active." + /// This is cached and updated when nodes are removed, added, or unlocked. + /// + [DataField, AutoNetworkedField] + public List CachedActiveNodes = new(); + + /// + /// Cache of interconnected node chunks - segments. + /// This is cached and updated when nodes are removed, added, or unlocked. + /// + [DataField, AutoNetworkedField] + public List> CachedSegments = new(); + + /// + /// Marker, if true - node activations should not happen. + /// + [DataField, AutoNetworkedField] + public bool Suppressed; + + /// + /// A multiplier applied to the calculated point value + /// to determine the monetary value of the artifact. + /// + [DataField] + public float PriceMultiplier = 0.10f; + + #region Unlocking + /// + /// How long does the unlocking state last by default. + /// + [DataField] + public TimeSpan UnlockStateDuration = TimeSpan.FromSeconds(6); + + /// + /// By how much unlocking state should be prolonged for each node that was unlocked. + /// + [DataField] + public TimeSpan UnlockStateIncrementPerNode = TimeSpan.FromSeconds(5); + + /// + /// Minimum waiting time between unlock states. + /// + [DataField] + public TimeSpan UnlockStateRefractory = TimeSpan.FromSeconds(10); + + /// + /// When next unlock session can be triggered. + /// + [DataField, AutoPausedField] + public TimeSpan NextUnlockTime; + #endregion + + // NOTE: you should not be accessing any of these values directly. Use the methods in SharedXenoArtifactSystem.Graph + #region Graph + /// + /// List of all nodes currently on this artifact. + /// Indexes are used as a lookup table for . + /// + [DataField, AutoNetworkedField] + public NetEntity?[] NodeVertices = []; + + /// + /// Adjacency matrix that stores connections between this artifact's nodes. + /// A value of "true" denotes an directed edge from node1 to node2, where the location of the vertex is (node1, node2) + /// A value of "false" denotes no edge. + /// + [DataField, AutoNetworkedField] + public List> NodeAdjacencyMatrix = new(); + + public int NodeAdjacencyMatrixRows => NodeAdjacencyMatrix.Count; + public int NodeAdjacencyMatrixColumns => NodeAdjacencyMatrix.TryGetValue(0, out var value) ? value.Count : 0; + #endregion + + #region GenerationInfo + + /// + /// The total number of nodes that make up this artifact. + /// + [DataField] + public MinMax NodeCount = new(10, 16); + + /// + /// The amount of nodes that go in each segment. + /// A segment is an interconnected series of nodes. + /// + [DataField] + public MinMax SegmentSize = new(5, 8); + + /// + /// For each "layer" in a segment (set of nodes with equal depth), how many will we generate? + /// + [DataField] + public MinMax NodesPerSegmentLayer = new(1, 3); + + /// + /// How man nodes can be randomly added on top of usual distribution (per layer). + /// + [DataField] + public MinMax ScatterPerLayer = new(0, 2); + + /// + /// Effects that can be used during this artifact generation. + /// + [DataField] + public EntityTableSelector EffectsTable = new NestedSelector + { + TableId = "XenoArtifactEffectsDefaultTable" + }; + + /// + /// Triggers that can be used during this artefact generation. + /// + [DataField] + public ProtoId TriggerWeights = "DefaultTriggers"; + #endregion + + /// + /// Sound effect to be played when artifact node is force-activated. + /// + [DataField] + public SoundSpecifier? ForceActivationSoundSpecifier = new SoundCollectionSpecifier("ArtifactForceActivation") + { + Params = new() + { + Variation = 0.1f + } + }; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs new file mode 100644 index 0000000000..c4c1673150 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs @@ -0,0 +1,81 @@ +using Content.Shared.Destructible.Thresholds; +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.Components; + +/// +/// Stores metadata about a particular artifact node +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SharedXenoArtifactSystem)), AutoGenerateComponentState] +public sealed partial class XenoArtifactNodeComponent : Component +{ + /// + /// Depth within the graph generation. + /// Used for sorting. + /// + [DataField, AutoNetworkedField] + public int Depth; + + /// + /// Denotes whether an artifact node has been activated at least once (through the required triggers). + /// + [DataField, AutoNetworkedField] + public bool Locked = true; + + /// + /// List of trigger descriptions that this node require for activation. + /// + [DataField, AutoNetworkedField] + public LocId? TriggerTip; + + /// + /// The entity whose graph this node is a part of. + /// + [DataField, AutoNetworkedField] + public NetEntity? Attached; + + #region Durability + /// + /// Marker, is durability of node degraded or not. + /// + public bool Degraded => Durability <= 0; + + /// + /// The amount of generic activations a node has left before becoming fully degraded and useless. + /// + [DataField, AutoNetworkedField] + public int Durability; + + /// + /// The maximum amount of times a node can be generically activated before becoming useless + /// + [DataField, AutoNetworkedField] + public int MaxDurability = 5; + + /// + /// The variance from MaxDurability present when a node is created. + /// + [DataField] + public MinMax MaxDurabilityCanDecreaseBy = new(0, 2); + #endregion + + #region Research + /// + /// The amount of points a node is worth with no scaling + /// + [DataField, AutoNetworkedField] + public float BasePointValue = 5000; + + /// + /// Amount of points available currently for extracting. + /// + [DataField, AutoNetworkedField] + public int ResearchValue; + + /// + /// Amount of points already extracted from node. + /// + [DataField, AutoNetworkedField] + public int ConsumedResearchValue; + #endregion +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactUnlockingComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactUnlockingComponent.cs new file mode 100644 index 0000000000..13b07f4474 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactUnlockingComponent.cs @@ -0,0 +1,48 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.Components; + +/// +/// This is used for tracking the nodes which have been triggered during a particular unlocking state. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +public sealed partial class XenoArtifactUnlockingComponent : Component +{ + /// + /// Indexes corresponding to all of the nodes that have been triggered + /// + [DataField, AutoNetworkedField] + public HashSet TriggeredNodeIndexes = new(); + + /// + /// The time at which the unlocking state ends. + /// + [DataField, AutoNetworkedField, AutoPausedField] + public TimeSpan EndTime; + + /// + /// The sound that plays when an artifact finishes unlocking successfully (with node unlocked). + /// + [DataField] + public SoundSpecifier UnlockActivationSuccessfulSound = new SoundCollectionSpecifier("ArtifactUnlockingActivationSuccess") + { + Params = new() + { + Variation = 0.1f, + Volume = 3f + } + }; + + /// + /// The sound that plays when artifact finishes unlocking non-successfully. + /// + [DataField] + public SoundSpecifier? UnlockActivationFailedSound = new SoundCollectionSpecifier("ArtifactUnlockActivationFailure") + { + Params = new() + { + Variation = 0.1f + } + }; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/Prototypes/XenoArchTriggerPrototype.cs b/Content.Shared/Xenoarchaeology/Artifact/Prototypes/XenoArchTriggerPrototype.cs new file mode 100644 index 0000000000..74d3895234 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/Prototypes/XenoArchTriggerPrototype.cs @@ -0,0 +1,46 @@ +using Content.Shared.Random; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; + +namespace Content.Shared.Xenoarchaeology.Artifact.Prototypes; + +/// Proto for xeno artifact triggers - markers, which event could trigger node to unlock it. +[Prototype] +public sealed partial class XenoArchTriggerPrototype : IPrototype +{ + /// + [IdDataField] + public string ID { get; } = default!; + + /// + /// Tip for user on how to activate this trigger. + /// + [DataField] + public LocId Tip; + + /// + /// Whitelist, describing for which subtype of artifacts this trigger could be used. + /// + [DataField] + public EntityWhitelist? Whitelist; + + /// + /// List of components that represent ways to trigger node. + /// + [DataField] + public ComponentRegistry Components = new(); +} + +/// +/// Container for list of xeno artifact triggers and their respective weights to be used in case randomly rolling trigger is required. +/// +[Prototype] +public sealed partial class WeightedRandomXenoArchTriggerPrototype : IWeightedRandomPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + [DataField(customTypeSerializer: typeof(PrototypeIdDictionarySerializer))] + public Dictionary Weights { get; private set; } = new(); +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Graph.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Graph.cs new file mode 100644 index 0000000000..fca5baf10f --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Graph.cs @@ -0,0 +1,615 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Xenoarchaeology.Artifact; + +/// +/// User-friendly API for viewing and modifying the complex graph relationship in XenoArtifacts +/// +public abstract partial class SharedXenoArtifactSystem +{ + /// + /// Gets the index, corresponding to a given node, throwing if the node is not present. + /// + public int GetIndex(Entity ent, EntityUid node) + { + if (TryGetIndex((ent, ent), node, out var index)) + { + return index.Value; + } + + throw new ArgumentException($"node {ToPrettyString(node)} is not present in {ToPrettyString(ent)}"); + } + + /// + /// Tries to get index inside nodes collection, corresponding to a given node EntityUid. + /// + public bool TryGetIndex(Entity ent, EntityUid node, [NotNullWhen(true)] out int? index) + { + index = null; + if (!Resolve(ent, ref ent.Comp)) + return false; + + for (var i = 0; i < ent.Comp.NodeVertices.Length; i++) + { + if (!TryGetNode(ent, i, out var iNode)) + continue; + + if (node != iNode.Value.Owner) + continue; + + index = i; + return true; + } + + return false; + } + + /// + /// Gets node entity with node component from artifact by index of node inside artifact nodes collection. + /// + /// Throws if requested index doesn't exist on artifact. + public Entity GetNode(Entity ent, int index) + { + if (ent.Comp.NodeVertices[index] is { } netUid && GetEntity(netUid) is var uid) + return (uid, XenoArtifactNode(uid)); + + throw new ArgumentException($"index {index} does not correspond to an existing node in {ToPrettyString(ent)}"); + } + + /// + /// Tries to get node entity with node component from artifact by index of node inside artifact nodes collection. + /// + public bool TryGetNode(Entity ent, int index, [NotNullWhen(true)] out Entity? node) + { + node = null; + if (!Resolve(ent, ref ent.Comp)) + return false; + + if (index < 0 || index >= ent.Comp.NodeVertices.Length) + return false; + + if (ent.Comp.NodeVertices[index] is { } netUid && GetEntity(netUid) is var uid) + node = (uid, XenoArtifactNode(uid)); + + return node != null; + } + + /// + /// Gets the index of the first empty spot in the NodeVertices array. + /// If there is none, resizes both arrays and returns the new index. + /// + public int GetFreeNodeIndex(Entity ent) + { + var length = ent.Comp.NodeVertices.Length; + for (var i = 0; i < length; i++) + { + if (ent.Comp.NodeVertices[i] == null) + return i; + } + + ResizeNodeGraph(ent, length + 1); + return length; + } + + /// + /// Extracts node entities from artifact container + /// (uses pre-cached and mapping from NetEntity). + /// + public IEnumerable> GetAllNodes(Entity ent) + { + foreach (var netNode in ent.Comp.NodeVertices) + { + if (TryGetEntity(netNode, out var node)) + yield return (node.Value, XenoArtifactNode(node.Value)); + } + } + + /// + /// Extracts enumeration of all indices that artifact node container have. + /// + public IEnumerable GetAllNodeIndices(Entity ent) + { + for (var i = 0; i < ent.Comp.NodeVertices.Length; i++) + { + if (ent.Comp.NodeVertices[i] is not null) + yield return i; + } + } + + /// + /// Adds edge between artifact nodes - and + /// + /// Artifact entity that contains 'from' and 'to' node entities. + /// Node from which we need to draw edge. + /// Node to which we need to draw edge. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + /// True if adding edge was successful, false otherwise. + public bool AddEdge(Entity ent, EntityUid from, EntityUid to, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + if (!TryGetIndex(ent, from, out var fromIdx) || + !TryGetIndex(ent, to, out var toIdx)) + return false; + + return AddEdge(ent, fromIdx.Value, toIdx.Value, dirty: dirty); + } + + /// + /// Adds edge between artifact nodes by indices inside node container - and + /// + /// Artifact entity that contains 'from' and 'to' node entities. + /// Node index inside artifact node container, from which we need to draw edge. + /// Node index inside artifact node container, to which we need to draw edge. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + /// True if adding edge was successful, false otherwise. + public bool AddEdge(Entity ent, int fromIdx, int toIdx, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + DebugTools.Assert(fromIdx >= 0 && fromIdx < ent.Comp.NodeVertices.Length, $"fromIdx is out of bounds for fromIdx {fromIdx}"); + DebugTools.Assert(toIdx >= 0 && toIdx < ent.Comp.NodeVertices.Length, $"toIdx is out of bounds for toIdx {toIdx}"); + + if (ent.Comp.NodeAdjacencyMatrix[fromIdx][toIdx]) + return false; //Edge already exists + + // TODO: add a safety check to prohibit cyclic paths. + + ent.Comp.NodeAdjacencyMatrix[fromIdx][toIdx] = true; + if (dirty) + { + RebuildXenoArtifactMetaData(ent); + } + + return true; + } + + /// + /// Removes edge between artifact nodes. + /// + /// Artifact entity that contains 'from' and 'to' node entities. + /// Entity of node from which edge to remove is connected. + /// Entity of node to which edge to remove is connected. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + /// True if removed edge was successfully, false otherwise. + public bool RemoveEdge(Entity ent, EntityUid from, EntityUid to, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + if (!TryGetIndex(ent, from, out var fromIdx) || + !TryGetIndex(ent, to, out var toIdx)) + return false; + + return RemoveEdge(ent, fromIdx.Value, toIdx.Value, dirty); + } + + /// + /// Removes edge between artifact nodes. + /// + /// Artifact entity that contains 'from' and 'to' node entities. + /// First node index inside artifact node container, from which we need to remove connecting edge. + /// Other node index inside artifact node container, from which we need to remove connecting edge. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + /// True if removed edge was successfully, false otherwise. + public bool RemoveEdge(Entity ent, int fromIdx, int toIdx, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + DebugTools.Assert(fromIdx >= 0 && fromIdx < ent.Comp.NodeVertices.Length, $"fromIdx is out of bounds for fromIdx {fromIdx}"); + DebugTools.Assert(toIdx >= 0 && toIdx < ent.Comp.NodeVertices.Length, $"toIdx is out of bounds for toIdx {toIdx}"); + + if (!ent.Comp.NodeAdjacencyMatrix[fromIdx][toIdx]) + return false; //Edge doesn't exist + + ent.Comp.NodeAdjacencyMatrix[fromIdx][toIdx] = false; + + if (dirty) + { + RebuildXenoArtifactMetaData(ent); + } + + return true; + } + + /// + /// Creates node entity (spawns) and adds node into artifact node container. + /// + /// Artifact entity, to container of which node should be added. + /// EntProtoId of node to be added. + /// Created node or null. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + /// True if node creation and adding was successful, false otherwise. + public bool AddNode( + Entity ent, + EntProtoId entProtoId, + [NotNullWhen(true)] out Entity? node, + bool dirty = true + ) + { + node = null; + if (!Resolve(ent, ref ent.Comp)) + return false; + + var uid = Spawn(entProtoId); + node = (uid, XenoArtifactNode(uid)); + return AddNode(ent, (node.Value, node.Value.Comp), dirty: dirty); + } + + /// + /// Adds node entity to artifact node container. + /// + /// Artifact entity, to container of which node should be added. + /// Node entity to add. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + /// True if node adding was successful, false otherwise. + public bool AddNode(Entity ent, Entity node, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + node.Comp ??= XenoArtifactNode(node); + node.Comp.Attached = GetNetEntity(ent); + + var nodeIdx = GetFreeNodeIndex((ent, ent.Comp)); + _container.Insert(node.Owner, ent.Comp.NodeContainer); + ent.Comp.NodeVertices[nodeIdx] = GetNetEntity(node); + + Dirty(node); + if (dirty) + { + RebuildXenoArtifactMetaData(ent); + } + + return true; + } + + /// + /// Removes artifact node from artifact node container. + /// + /// Artifact from container of which node should be removed + /// Node entity to be removed. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + /// True if node was removed successfully, false otherwise. + public bool RemoveNode(Entity ent, Entity node, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + node.Comp ??= XenoArtifactNode(node); + + if (!TryGetIndex(ent, node, out var idx)) + return false; // node isn't attached to this entity. + + RemoveAllNodeEdges(ent, idx.Value, dirty: false); + + _container.Remove(node.Owner, ent.Comp.NodeContainer); + node.Comp.Attached = null; + ent.Comp.NodeVertices[idx.Value] = null; + if (dirty) + { + RebuildXenoArtifactMetaData(ent); + } + + Dirty(node); + + return true; + } + + /// + /// Remove edges, connected to passed artifact node. + /// + /// Entity of artifact, in node container of which node resides. + /// Index of node (inside node container), for which all edges should be removed. + /// + /// Marker, if we need to recalculate caches and mark related components dirty to update on client side. + /// Should be disabled for initial graph creation to not recalculate cache on each node/edge. + /// + public void RemoveAllNodeEdges(Entity ent, int nodeIdx, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + var predecessors = GetDirectPredecessorNodes(ent, nodeIdx); + foreach (var p in predecessors) + { + RemoveEdge(ent, p, nodeIdx, dirty: false); + } + + var successors = GetDirectSuccessorNodes(ent, nodeIdx); + foreach (var s in successors) + { + RemoveEdge(ent, nodeIdx, s, dirty: false); + } + + if (dirty) + { + RebuildXenoArtifactMetaData(ent); + } + } + + /// + /// Gets set of node entities, that are direct predecessors to passed node entity. + /// + /// + /// Direct predecessors are nodes, which are connected by edges directly to target node, + /// and are on outgoing ('FROM') side of edge connection. + /// + public HashSet> GetDirectPredecessorNodes(Entity ent, EntityUid node) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + if (!TryGetIndex(ent, node, out var index)) + return new(); + + var indices = GetDirectPredecessorNodes(ent, index.Value); + var output = new HashSet>(); + foreach (var i in indices) + { + if (TryGetNode(ent, i, out var predecessor)) + output.Add(predecessor.Value); + } + + return output; + } + + /// + /// Gets set of node indices (in artifact node container) which are direct predecessors to node with passed node index. + /// + /// + /// Direct predecessors are nodes, which are connected by edges directly to target node, + /// and are on outgoing ('FROM') side of edge connection. + /// + public HashSet GetDirectPredecessorNodes(Entity ent, int nodeIdx) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + DebugTools.Assert(nodeIdx >= 0 && nodeIdx < ent.Comp.NodeVertices.Length, $"node index {nodeIdx} is out of bounds!"); + + var indices = new HashSet(); + for (var i = 0; i < ent.Comp.NodeAdjacencyMatrixRows; i++) + { + if (ent.Comp.NodeAdjacencyMatrix[i][nodeIdx]) + indices.Add(i); + } + + return indices; + } + + /// + /// Gets set of node entities, that are direct successors to passed node entity. + /// + /// + /// Direct successors are nodes, which are connected by edges + /// directly to target node, and are on incoming ('TO') side of edge connection. + /// + public HashSet> GetDirectSuccessorNodes(Entity ent, EntityUid node) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + if (!TryGetIndex(ent, node, out var index)) + return new(); + + var indices = GetDirectSuccessorNodes(ent, index.Value); + var output = new HashSet>(); + foreach (var i in indices) + { + if (TryGetNode(ent, i, out var successor)) + output.Add(successor.Value); + } + + return output; + } + + /// + /// Gets set of node indices (in artifact node container) which are direct successors to node with passed node index. + /// + /// + /// Direct successors are nodes, which are connected by edges + /// directly to target node, and are on incoming ('TO') side of edge connection. + /// + public HashSet GetDirectSuccessorNodes(Entity ent, int nodeIdx) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + DebugTools.Assert(nodeIdx >= 0 && nodeIdx < ent.Comp.NodeVertices.Length, "node index is out of bounds!"); + + var indices = new HashSet(); + for (var i = 0; i < ent.Comp.NodeAdjacencyMatrixColumns; i++) + { + if (ent.Comp.NodeAdjacencyMatrix[nodeIdx][i]) + indices.Add(i); + } + + return indices; + } + + /// + /// Gets set of node entities, that are predecessors to passed node entity. + /// + /// + /// Predecessors are nodes, which are connected by edges directly to target node on 'FROM' side of edge, + /// or connected to such node on 'FROM' side of edge, etc recursively. + /// + public HashSet> GetPredecessorNodes(Entity ent, Entity node) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + var predecessors = GetPredecessorNodes(ent, GetIndex((ent, ent.Comp), node)); + var output = new HashSet>(); + foreach (var p in predecessors) + { + output.Add(GetNode((ent, ent.Comp), p)); + } + + return output; + } + + /// + /// Gets set of node indices inside artifact node container, that are predecessors to entity with passed node index. + /// + /// + /// Predecessors are nodes, which are connected by edges directly to target node on 'FROM' side of edge, + /// or connected to such node on 'FROM' side of edge, etc recursively. + /// + public HashSet GetPredecessorNodes(Entity ent, int nodeIdx) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + var predecessors = GetDirectPredecessorNodes(ent, nodeIdx); + if (predecessors.Count == 0) + return new(); + + var output = new HashSet(); + foreach (var p in predecessors) + { + output.Add(p); + var recursivePredecessors = GetPredecessorNodes(ent, p); + foreach (var rp in recursivePredecessors) + { + output.Add(rp); + } + } + + return output; + } + + /// + /// Gets set of node entities, that are successors to passed node entity. + /// + /// + /// Successors are nodes, which are connected by edges directly to target node on 'TO' side of edge, + /// or connected to such node on 'TO' side of edge, etc recursively. + /// + public HashSet> GetSuccessorNodes(Entity ent, Entity node) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + var successors = GetSuccessorNodes(ent, GetIndex((ent, ent.Comp), node)); + var output = new HashSet>(); + foreach (var s in successors) + { + output.Add(GetNode((ent, ent.Comp), s)); + } + + return output; + } + + /// + /// Gets set of node indices inside artifact node container, that are successors to entity with passed node index. + /// + /// + /// Successors are nodes, which are connected by edges directly to target node on 'TO' side of edge, + /// or connected to such node on 'TO' side of edge, etc recursively. + /// + public HashSet GetSuccessorNodes(Entity ent, int nodeIdx) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + var successors = GetDirectSuccessorNodes(ent, nodeIdx); + if (successors.Count == 0) + return new(); + + var output = new HashSet(); + foreach (var s in successors) + { + output.Add(s); + var recursiveSuccessors = GetSuccessorNodes(ent, s); + foreach (var rs in recursiveSuccessors) + { + output.Add(rs); + } + } + + return output; + } + + /// + /// Determines, if there is an edge (directed link) FROM one node TO other in passed artifact. + /// + /// Artifact, inside which node container nodes are. + /// Node FROM which existence of edge should be checked. + /// Node TO which existance of edge should be checked. + public bool NodeHasEdge( + Entity ent, + Entity from, + Entity to + ) + { + if (!Resolve(ent, ref ent.Comp)) + return new(); + + var fromIdx = GetIndex((ent, ent.Comp), from); + var toIdx = GetIndex((ent, ent.Comp), to); + + return ent.Comp.NodeAdjacencyMatrix[fromIdx][toIdx]; + } + + /// + /// Resizes the adjacency matrix and vertices array to , + /// or at least what it WOULD do if i wasn't forced to use shitty lists. + /// + protected void ResizeNodeGraph(Entity ent, int newSize) + { + Array.Resize(ref ent.Comp.NodeVertices, newSize); + + while (ent.Comp.NodeAdjacencyMatrix.Count < newSize) + { + ent.Comp.NodeAdjacencyMatrix.Add(new()); + } + + foreach (var row in ent.Comp.NodeAdjacencyMatrix) + { + while (row.Count < newSize) + { + row.Add(false); + } + } + + Dirty(ent); + } + + /// Removes unlocking state from artifact. + private void CancelUnlockingOnGraphStructureChange(Entity ent) + { + if (!TryComp(ent, out var unlockingComponent)) + return; + + Entity artifactEnt = (ent, unlockingComponent, ent.Comp); + CancelUnlockingState(artifactEnt); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs new file mode 100644 index 0000000000..e4c1a1bae5 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs @@ -0,0 +1,399 @@ +using System.Linq; +using Content.Shared.EntityTable; +using Content.Shared.NameIdentifier; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.Prototypes; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Xenoarchaeology.Artifact; + +public abstract partial class SharedXenoArtifactSystem +{ + [Dependency] private readonly EntityTableSystem _entityTable = default!; + + private EntityQuery _xenoArtifactQuery; + private EntityQuery _nodeQuery; + + private void InitializeNode() + { + SubscribeLocalEvent(OnNodeMapInit); + + _xenoArtifactQuery = GetEntityQuery(); + _nodeQuery = GetEntityQuery(); + } + + /// + /// Initializes artifact node on its creation (by setting durability). + /// + private void OnNodeMapInit(Entity ent, ref MapInitEvent args) + { + XenoArtifactNodeComponent nodeComponent = ent; + nodeComponent.MaxDurability -= nodeComponent.MaxDurabilityCanDecreaseBy.Next(RobustRandom); + SetNodeDurability((ent, ent), nodeComponent.MaxDurability); + } + + /// Gets node component by node entity uid. + public XenoArtifactNodeComponent XenoArtifactNode(EntityUid uid) + { + return _nodeQuery.Get(uid); + } + + public void SetNodeUnlocked(Entity ent) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + if (ent.Comp.Attached is not { } netArtifact) + return; + + var artifact = GetEntity(netArtifact); + if (!TryComp(artifact, out var artifactComponent)) + return; + + SetNodeUnlocked((artifact, artifactComponent), (ent, ent.Comp)); + } + + public void SetNodeUnlocked(Entity artifact, Entity node) + { + if (!node.Comp.Locked) + return; + + node.Comp.Locked = false; + RebuildCachedActiveNodes((artifact, artifact)); + Dirty(node); + } + + /// + /// Adds to the node's durability by the specified value. To reduce, provide negative value. + /// + public void AdjustNodeDurability(Entity ent, int durabilityDelta) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + SetNodeDurability(ent, ent.Comp.Durability + durabilityDelta); + } + + /// + /// Sets a node's durability to the specified value. HIGHLY recommended to not be less than 0. + /// + public void SetNodeDurability(Entity ent, int durability) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + ent.Comp.Durability = Math.Clamp(durability, 0, ent.Comp.MaxDurability); + UpdateNodeResearchValue((ent, ent.Comp)); + Dirty(ent); + } + + /// + /// Creates artifact node entity, attaching trigger and marking depth level for future use. + /// + public Entity CreateNode(Entity ent, ProtoId trigger, int depth = 0) + { + var triggerProto = PrototypeManager.Index(trigger); + return CreateNode(ent, triggerProto, depth); + } + + /// + /// Creates artifact node entity, attaching trigger and marking depth level for future use. + /// + public Entity CreateNode(Entity ent, XenoArchTriggerPrototype trigger, int depth = 0) + { + var entProtoId = _entityTable.GetSpawns(ent.Comp.EffectsTable) + .First(); + + AddNode((ent, ent), entProtoId, out var nodeEnt, dirty: false); + DebugTools.Assert(nodeEnt.HasValue, "Failed to create node on artifact."); + + var nodeComponent = nodeEnt.Value.Comp; + nodeComponent.Depth = depth; + nodeComponent.TriggerTip = trigger.Tip; + EntityManager.AddComponents(nodeEnt.Value, trigger.Components); + + Dirty(nodeEnt.Value); + return nodeEnt.Value; + } + + /// Checks if all predecessor nodes are marked as 'unlocked'. + public bool HasUnlockedPredecessor(Entity ent, EntityUid node) + { + var predecessors = GetDirectPredecessorNodes((ent, ent), node); + if (predecessors.Count == 0) + { + return true; + } + + foreach (var predecessor in predecessors) + { + if (predecessor.Comp.Locked) + { + return false; + } + } + + return true; + } + + /// Checks if node was marked as 'active'. Active nodes are invoked on artifact use (if durability is greater than zero). + public bool IsNodeActive(Entity ent, EntityUid node) + { + return ent.Comp.CachedActiveNodes.Contains(GetNetEntity(node)); + } + + /// + /// Gets list of 'active' nodes. Active nodes are invoked on artifact use (if durability is greater than zero). + /// + public List> GetActiveNodes(Entity ent) + { + return ent.Comp.CachedActiveNodes + .Select(activeNode => _nodeQuery.Get(GetEntity(activeNode))) + .ToList(); + } + + /// + /// Gets amount of research points that can be extracted from node. + /// We can only extract "what's left" - its base value, reduced by already consumed value. + /// Every drained durability brings more points to be extracted. + /// + public int GetResearchValue(Entity ent) + { + if (ent.Comp.Locked) + return 0; + + return ent.Comp.ResearchValue - ent.Comp.ConsumedResearchValue; + } + + /// + /// Sets amount of points already extracted from node. + /// + public void SetConsumedResearchValue(Entity ent, int value) + { + ent.Comp.ConsumedResearchValue = value; + Dirty(ent); + } + + /// + /// Converts node entity uid to its display name (which is Identifier from . + /// + public string GetNodeId(EntityUid uid) + { + return (CompOrNull(uid)?.Identifier ?? 0).ToString("D3"); + } + + /// + /// Gets two-dimensional array in a form of nested lists, which holds artifact nodes, grouped by segments. + /// Segments are groups of interconnected nodes, there might be one or more segments in non-empty artifact. + /// + public List>> GetSegments(Entity ent) + { + var output = new List>>(); + + foreach (var segment in ent.Comp.CachedSegments) + { + var outSegment = new List>(); + foreach (var netNode in segment) + { + var node = GetEntity(netNode); + outSegment.Add((node, XenoArtifactNode(node))); + } + + output.Add(outSegment); + } + + return output; + } + + /// + /// Gets list of nodes, grouped by depth level. Depth level count starts from 0. + /// Only 0 depth nodes have no incoming edges - as only they are starting nodes. + /// + public Dictionary>> GetDepthOrderedNodes(IEnumerable> nodes) + { + var nodesByDepth = new Dictionary>>(); + + foreach (var node in nodes) + { + if (!nodesByDepth.TryGetValue(node.Comp.Depth, out var depthList)) + { + depthList = new List>(); + nodesByDepth.Add(node.Comp.Depth, depthList); + } + + depthList.Add(node); + } + + return nodesByDepth; + } + + /// + /// Rebuilds all the data, associated with nodes in an artifact, updating caches. + /// + public void RebuildXenoArtifactMetaData(Entity artifact) + { + if (!Resolve(artifact, ref artifact.Comp)) + return; + + RebuildCachedActiveNodes(artifact); + RebuildCachedSegments(artifact); + foreach (var node in GetAllNodes((artifact, artifact.Comp))) + { + RebuildNodeMetaData(node); + } + + CancelUnlockingOnGraphStructureChange((artifact, artifact.Comp)); + } + + public void RebuildNodeMetaData(Entity node) + { + UpdateNodeResearchValue(node); + } + + /// + /// Clears all cached active nodes and rebuilds the list using the current node state. + /// Active nodes have the following property: + /// - Are unlocked themselves + /// - All successors are also unlocked + /// + /// + /// You could technically modify this to have a per-node method that only checks direct predecessors + /// and then does recursive updates for all successors, but I don't think the optimization is necessary right now. + /// + public void RebuildCachedActiveNodes(Entity ent) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + ent.Comp.CachedActiveNodes.Clear(); + var allNodes = GetAllNodes((ent, ent.Comp)); + foreach (var node in allNodes) + { + // Locked nodes cannot be active. + if (node.Comp.Locked) + continue; + + var successors = GetDirectSuccessorNodes(ent, node); + + // If this node has no successors, then we don't need to bother with this extra logic. + if (successors.Count != 0) + { + // Checks for any of the direct successors being unlocked. + var successorIsUnlocked = false; + foreach (var sNode in successors) + { + if (sNode.Comp.Locked) + continue; + + successorIsUnlocked = true; + break; + } + + // Active nodes must be at the end of the path. + if (successorIsUnlocked) + continue; + } + + var netEntity = GetNetEntity(node); + ent.Comp.CachedActiveNodes.Add(netEntity); + } + + Dirty(ent); + } + + public void RebuildCachedSegments(Entity ent) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + ent.Comp.CachedSegments.Clear(); + + var entities = GetAllNodes((ent, ent.Comp)) + .ToList(); + var segments = GetSegmentsFromNodes((ent, ent.Comp), entities); + var netEntities = segments.Select( + s => s.Select(n => GetNetEntity(n)) + .ToList() + ); + ent.Comp.CachedSegments.AddRange(netEntities); + + Dirty(ent); + } + + /// + /// Gets two-dimensional array (as lists inside enumeration) that contains artifact nodes, grouped by segment. + /// + public IEnumerable>> GetSegmentsFromNodes(Entity ent, List> nodes) + { + var outSegments = new List>>(); + foreach (var node in nodes) + { + var segment = new List>(); + GetSegmentNodesRecursive(ent, node, segment, outSegments); + + if (segment.Count == 0) + continue; + + outSegments.Add(segment); + } + + return outSegments; + } + + /// + /// Fills nodes into segments by recursively walking through collections of predecessors and successors. + /// + private void GetSegmentNodesRecursive( + Entity ent, + Entity node, + List> segment, + List>> otherSegments + ) + { + if (otherSegments.Any(s => s.Contains(node))) + return; + + if (segment.Contains(node)) + return; + + segment.Add(node); + + var predecessors = GetDirectPredecessorNodes((ent, ent), node); + foreach (var p in predecessors) + { + GetSegmentNodesRecursive(ent, p, segment, otherSegments); + } + + var successors = GetDirectSuccessorNodes((ent, ent), node); + foreach (var s in successors) + { + GetSegmentNodesRecursive(ent, s, segment, otherSegments); + } + } + + /// + /// Sets node research point amount that can be extracted. + /// Used up durability increases amount to be extracted. + /// + public void UpdateNodeResearchValue(Entity node) + { + XenoArtifactNodeComponent nodeComponent = node; + if (nodeComponent.Attached == null) + { + nodeComponent.ResearchValue = 0; + return; + } + + var artifact = _xenoArtifactQuery.Get(GetEntity(nodeComponent.Attached.Value)); + + var nonactiveNodes = GetActiveNodes(artifact); + var durabilityEffect = MathF.Pow((float)nodeComponent.Durability / nodeComponent.MaxDurability, 2); + var durabilityMultiplier = nonactiveNodes.Contains(node) + ? 1f - durabilityEffect + : 1f + durabilityEffect; + + var predecessorNodes = GetPredecessorNodes((artifact, artifact), node); + nodeComponent.ResearchValue = (int)(Math.Pow(1.25, predecessorNodes.Count) * nodeComponent.BasePointValue * durabilityMultiplier); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs new file mode 100644 index 0000000000..3238bedcba --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs @@ -0,0 +1,167 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Xenoarchaeology.Artifact; + +public abstract partial class SharedXenoArtifactSystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + + private EntityQuery _unlockingQuery; + + private void InitializeUnlock() + { + _unlockingQuery = GetEntityQuery(); + + SubscribeLocalEvent(OnUnlockingStarted); + } + + /// Finish unlocking phase when the time is up. + private void UpdateUnlock(float _) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var unlock, out var comp)) + { + if (_timing.CurTime < unlock.EndTime) + continue; + + FinishUnlockingState((uid, unlock, comp)); + } + } + + /// + /// Checks if node can be unlocked. + /// Only those nodes, that have no predecessors, or have all + /// predecessors unlocked can be unlocked themselves. + /// Artifact being suppressed also prevents unlocking. + /// + public bool CanUnlockNode(Entity ent) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + var artifact = GetEntity(ent.Comp.Attached); + if (!TryComp(artifact, out var artiComp)) + return false; + + if (artiComp.Suppressed) + return false; + + if (!HasUnlockedPredecessor((artifact.Value, artiComp), ent) + // unlocked final nodes should not listen for unlocking + || (!ent.Comp.Locked && GetSuccessorNodes((artifact.Value, artiComp), (ent.Owner, ent.Comp)).Count == 0) + ) + return false; + + return true; + } + + /// + /// Finishes unlocking phase, removing related component, and sums up what nodes were triggered, + /// that could be unlocked. Marks such nodes as unlocked, and pushes their node activation event. + /// + public void FinishUnlockingState(Entity ent) + { + string unlockAttemptResultMsg; + XenoArtifactComponent artifactComponent = ent; + XenoArtifactUnlockingComponent unlockingComponent = ent; + + SoundSpecifier? soundEffect; + if (TryGetNodeFromUnlockState(ent, out var node)) + { + SetNodeUnlocked((ent, artifactComponent), node.Value); + unlockAttemptResultMsg = "artifact-unlock-state-end-success"; + + // as an experiment - unlocking node doesn't activate it, activation is left for player to decide. + // var activated = ActivateNode((ent, artifactComponent), node.Value, null, null, Transform(ent).Coordinates, false); + // if (activated) + soundEffect = unlockingComponent.UnlockActivationSuccessfulSound; + } + else + { + unlockAttemptResultMsg = "artifact-unlock-state-end-failure"; + soundEffect = unlockingComponent.UnlockActivationFailedSound; + } + + if (_net.IsServer) + { + _popup.PopupEntity(Loc.GetString(unlockAttemptResultMsg), ent); + _audio.PlayPvs(soundEffect, ent.Owner); + } + + RemComp(ent, unlockingComponent); + RiseUnlockingFinished(ent, node); + artifactComponent.NextUnlockTime = _timing.CurTime + artifactComponent.UnlockStateRefractory; + } + + public void CancelUnlockingState(Entity ent) + { + RemComp(ent, ent.Comp1); + RiseUnlockingFinished(ent, null); + } + + /// + /// Gets first locked node that can be unlocked (it is locked and all predecessor are unlocked). + /// + public bool TryGetNodeFromUnlockState( + Entity ent, + [NotNullWhen(true)] out Entity? node + ) + { + node = null; + + var artifactUnlockingComponent = ent.Comp1; + foreach (var nodeIndex in artifactUnlockingComponent.TriggeredNodeIndexes) + { + var artifactComponent = ent.Comp2; + var curNode = GetNode((ent, artifactComponent), nodeIndex); + if (!curNode.Comp.Locked || !CanUnlockNode((curNode, curNode))) + continue; + + var requiredIndices = GetPredecessorNodes((ent, artifactComponent), nodeIndex); + requiredIndices.Add(nodeIndex); + + // Make sure the two sets are identical + if (requiredIndices.Count != artifactUnlockingComponent.TriggeredNodeIndexes.Count + || !artifactUnlockingComponent.TriggeredNodeIndexes.All(requiredIndices.Contains)) + continue; + + node = curNode; + return true; + } + + return node != null; + } + + private void OnUnlockingStarted(Entity ent, ref MapInitEvent args) + { + var unlockingStartedEvent = new ArtifactUnlockingStartedEvent(); + RaiseLocalEvent(ent.Owner, ref unlockingStartedEvent); + } + + private void RiseUnlockingFinished( + Entity ent, + Entity? node + ) + { + var unlockingFinishedEvent = new ArtifactUnlockingFinishedEvent(node); + RaiseLocalEvent(ent.Owner, ref unlockingFinishedEvent); + } + +} + +/// +/// Event for starting artifact unlocking stage. +/// +[ByRefEvent] +public record struct ArtifactUnlockingStartedEvent; + +/// +/// Event for finishing artifact unlocking stage. +/// +/// Node which were unlocked. Null if stage was finished without new unlocks. +[ByRefEvent] +public record struct ArtifactUnlockingFinishedEvent(EntityUid? UnlockedNode); diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAE.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAE.cs new file mode 100644 index 0000000000..fb592a03f1 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAE.cs @@ -0,0 +1,160 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Database; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Timing; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Robust.Shared.Map; + +namespace Content.Shared.Xenoarchaeology.Artifact; + +public abstract partial class SharedXenoArtifactSystem +{ + [Dependency] private readonly UseDelaySystem _useDelay = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + + private void InitializeXAE() + { + SubscribeLocalEvent(OnUseInHand); + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnActivateInWorld); + } + + private void OnUseInHand(Entity ent, ref UseInHandEvent args) + { + if (args.Handled) + return; + + args.Handled = TryActivateXenoArtifact(ent, args.User, args.User, Transform(args.User).Coordinates); + } + + private void OnAfterInteract(Entity ent, ref AfterInteractEvent args) + { + if (args.Handled || !args.CanReach) + return; + + args.Handled = TryActivateXenoArtifact(ent, args.User, args.Target, args.ClickLocation); + } + + private void OnActivateInWorld(Entity ent, ref ActivateInWorldEvent args) + { + if (args.Handled || !args.Complex) + return; + + args.Handled = TryActivateXenoArtifact(ent, args.User, args.Target, Transform(args.Target).Coordinates); + } + + /// + /// Attempts to activate artifact nodes. 'active' are nodes that are marked as 'unlocked' and have no other successors, marked as 'unlocked'. + /// + /// Artifact entity, for which attempt to activate was made. + /// Character that attempted to activate artifact. + /// Target, on which artifact activation attempt was used (for hand-held artifact - it can be 'clicked' over someone). + /// Coordinates of entity. + /// True, if activation was successful, false otherwise. + public bool TryActivateXenoArtifact( + Entity artifact, + EntityUid? user, + EntityUid? target, + EntityCoordinates coordinates + ) + { + XenoArtifactComponent xenoArtifactComponent = artifact; + if (xenoArtifactComponent.Suppressed) + return false; + + if (TryComp(artifact, out var delay) && !_useDelay.TryResetDelay((artifact, delay), true)) + return false; + + var success = false; + foreach (var node in GetActiveNodes(artifact)) + { + success |= ActivateNode(artifact, node, user, target, coordinates); + } + + if (!success) + { + _popup.PopupClient(Loc.GetString("artifact-activation-fail"), artifact, user); + return false; + } + + // we raised event for each node activation, + // now we raise event for artifact itself. For animations and stuff. + var ev = new XenoArtifactActivatedEvent( + artifact, + user, + target, + coordinates + ); + RaiseLocalEvent(artifact, ref ev); + + if (user.HasValue) + _audio.PlayPredicted(xenoArtifactComponent.ForceActivationSoundSpecifier, artifact, user); + else + _audio.PlayPvs(xenoArtifactComponent.ForceActivationSoundSpecifier, artifact); + + return true; + } + + /// + /// Pushes node activation event and updates durability for activated node. + /// + /// Artifact entity, for which attempt to activate was made. + /// Node entity, effect of which should be activated. + /// Character that attempted to activate artifact. + /// Target, on which artifact activation attempt was used (for hand-held artifact - it can be 'clicked' over someone). + /// Coordinates of entity. + /// Marker, if node durability should be adjusted as a result of activation. + /// True, if activation was successful, false otherwise. + public bool ActivateNode( + Entity artifact, + Entity node, + EntityUid? user, + EntityUid? target, + EntityCoordinates coordinates, + bool consumeDurability = true + ) + { + if (node.Comp.Degraded) + return false; + + _adminLogger.Add( + LogType.ArtifactNode, + LogImpact.Low, + $"{ToPrettyString(artifact.Owner)} node {ToPrettyString(node)} got activated at {coordinates}" + ); + if (consumeDurability) + { + AdjustNodeDurability((node, node.Comp), -1); + } + + var ev = new XenoArtifactNodeActivatedEvent(artifact, node, user, target, coordinates); + RaiseLocalEvent(node, ref ev); + return true; + } +} + +/// +/// Event of node activation. Should lead to node effect being activated. +/// +/// Artifact entity, for which attempt to activate was made. +/// Node entity, effect of which should be activated. +/// Character that attempted to activate artifact. +/// Target, on which artifact activation attempt was used (for hand-held artifact - it can be 'clicked' over someone). +/// Coordinates of entity. +[ByRefEvent] +public readonly record struct XenoArtifactNodeActivatedEvent( + Entity Artifact, + Entity Node, + EntityUid? User, + EntityUid? Target, + EntityCoordinates Coordinates +); + +[ByRefEvent] +public readonly record struct XenoArtifactActivatedEvent( + Entity Artifact, + EntityUid? User, + EntityUid? Target, + EntityCoordinates Coordinates +); diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAT.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAT.cs new file mode 100644 index 0000000000..863f56134b --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAT.cs @@ -0,0 +1,112 @@ +using System.Linq; +using Content.Shared.Chemistry; +using Content.Shared.Damage; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Throwing; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact; + +public abstract partial class SharedXenoArtifactSystem +{ + private void InitializeXAT() + { + XATRelayLocalEvent(); + XATRelayLocalEvent(); + XATRelayLocalEvent(); + XATRelayLocalEvent(); + XATRelayLocalEvent(); + XATRelayLocalEvent(); + XATRelayLocalEvent(); + XATRelayLocalEvent(); + + // special case this one because we need to order the messages + SubscribeLocalEvent(OnExamined); + } + + /// Relays artifact events for artifact nodes. + protected void XATRelayLocalEvent() where T : notnull + { + SubscribeLocalEvent(RelayEventToNodes); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + using (args.PushGroup(nameof(XenoArtifactComponent))) + { + RelayEventToNodes(ent, ref args); + } + } + + protected void RelayEventToNodes(Entity ent, ref T args) where T : notnull + { + var ev = new XenoArchNodeRelayedEvent(ent, args); + + var nodes = GetAllNodes(ent); + foreach (var node in nodes) + { + RaiseLocalEvent(node, ref ev); + } + } + + /// + /// Attempts to shift artifact into unlocking state, in which it is going to listen to interactions, that could trigger nodes. + /// + public void TriggerXenoArtifact(Entity ent, Entity node) + { + // limits spontaneous chain activations, also prevents spamming every triggering tool to activate nodes + // without real knowledge about triggers + if (_timing.CurTime < ent.Comp.NextUnlockTime) + return; + + var index = GetIndex(ent, node); + + if (!_unlockingQuery.TryGetComponent(ent, out var unlockingComp)) + { + unlockingComp = EnsureComp(ent); + unlockingComp.EndTime = _timing.CurTime + ent.Comp.UnlockStateDuration; + Log.Debug($"{ToPrettyString(ent)} entered unlocking state"); + + if (_net.IsServer) + _popup.PopupEntity(Loc.GetString("artifact-unlock-state-begin"), ent); + } + else + { + var predecessorNodeIndices = GetPredecessorNodes((ent, ent), index); + var successorNodeIndices = GetSuccessorNodes((ent, ent), index); + if(unlockingComp.TriggeredNodeIndexes.Count == 0 + || unlockingComp.TriggeredNodeIndexes.All( + x => predecessorNodeIndices.Contains(x) || successorNodeIndices.Contains(x) + ) + ) + // we add time on each new trigger, if it is not going to fail us + unlockingComp.EndTime += ent.Comp.UnlockStateIncrementPerNode; + } + + if (unlockingComp.TriggeredNodeIndexes.Add(index)) + { + Dirty(ent, unlockingComp); + } + } +} + +/// +/// Event wrapper for XenoArch Trigger events. +/// +[ByRefEvent] +public record struct XenoArchNodeRelayedEvent(Entity Artifact, TEvent Args) +{ + /// + /// Original event. + /// + public TEvent Args = Args; + + /// + /// Artifact entity, that received original event. + /// + public Entity Artifact = Artifact; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.cs new file mode 100644 index 0000000000..aad2f51239 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.cs @@ -0,0 +1,56 @@ +using Content.Shared.Popups; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Robust.Shared.Containers; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Artifact; + +/// +/// Handles all logic for generating and facilitating interactions with XenoArtifacts +/// +public abstract partial class SharedXenoArtifactSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] protected readonly IPrototypeManager PrototypeManager = default!; + [Dependency] protected readonly IRobustRandom RobustRandom = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + + InitializeNode(); + InitializeUnlock(); + InitializeXAT(); + InitializeXAE(); + } + + /// + public override void Update(float frameTime) + { + base.Update(frameTime); + + UpdateUnlock(frameTime); + } + + /// As all artifacts have to contain nodes - we ensure that they are containers. + private void OnStartup(Entity ent, ref ComponentStartup args) + { + ent.Comp.NodeContainer = _container.EnsureContainer(ent, XenoArtifactComponent.NodeContainerId); + } + + public void SetSuppressed(Entity ent, bool val) + { + if (ent.Comp.Suppressed == val) + return; + + ent.Comp.Suppressed = val; + Dirty(ent); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/BaseXAESystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/BaseXAESystem.cs new file mode 100644 index 0000000000..69437821e0 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/BaseXAESystem.cs @@ -0,0 +1,21 @@ +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; + +/// +/// Base class for +/// +/// +public abstract class BaseXAESystem : EntitySystem where T : Component +{ + /// + public override void Initialize() + { + SubscribeLocalEvent(OnActivated); + } + + /// + /// Handler for node activation. + /// + /// Entity (node) that got activated. + /// Activation event (containing artifact and other useful info). + protected abstract void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args); +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEApplyComponentsComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEApplyComponentsComponent.cs new file mode 100644 index 0000000000..6f2eb81771 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEApplyComponentsComponent.cs @@ -0,0 +1,29 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// Applies components when effect is activated. +/// +[RegisterComponent, Access(typeof(XAEApplyComponentsSystem))] +public sealed partial class XAEApplyComponentsComponent : Component +{ + /// + /// Components that are permanently added to an entity when the effect's node is entered. + /// + [DataField] + public ComponentRegistry Components = new(); + + /// + /// Does adding components need to be done only on first activation. + /// + [DataField] + public bool ApplyIfAlreadyHave { get; set; } + + /// + /// Does component need to be restored when activated 2nd or more times. + /// + [DataField] + public bool RefreshOnReactivate { get; set; } +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/DamageNearbyArtifactComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEDamageInAreaComponent.cs similarity index 60% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/DamageNearbyArtifactComponent.cs rename to Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEDamageInAreaComponent.cs index fb85446400..3725c1ba1f 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/DamageNearbyArtifactComponent.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEDamageInAreaComponent.cs @@ -1,44 +1,42 @@ -using Content.Shared.Damage; +using Content.Shared.Damage; using Content.Shared.Whitelist; +using Robust.Shared.GameStates; -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; /// /// When activated, damages nearby entities. /// -[RegisterComponent] -public sealed partial class DamageNearbyArtifactComponent : Component +[RegisterComponent, Access(typeof(XAEDamageInAreaSystem)), NetworkedComponent, AutoGenerateComponentState] +public sealed partial class XAEDamageInAreaComponent : Component { /// /// The radius of entities that will be affected /// - [DataField("radius")] + [DataField, AutoNetworkedField] public float Radius = 3f; /// /// A whitelist for filtering certain damage. /// - /// - /// TODO: The component portion, since it uses an array, does not work currently. - /// - [DataField("whitelist")] + [DataField, AutoNetworkedField] public EntityWhitelist? Whitelist; /// /// The damage that is applied /// - [DataField("damage", required: true)] + [DataField(required: true), AutoNetworkedField] public DamageSpecifier Damage = default!; /// /// The chance that damage is applied to each individual entity /// - [DataField("damageChance")] + [DataField, AutoNetworkedField] public float DamageChance = 1f; /// /// Whether or not this should ignore resistances for the damage /// - [DataField("ignoreResistances")] + [DataField, AutoNetworkedField] public bool IgnoreResistances; } diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEKnockComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEKnockComponent.cs new file mode 100644 index 0000000000..72080e099d --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEKnockComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// This is used for using the "knock" spell when the artifact is activated +/// +[RegisterComponent, Access(typeof(XAEKnockSystem)), NetworkedComponent, AutoGenerateComponentState] +public sealed partial class XAEKnockComponent : Component +{ + /// + /// The range of the spell + /// + [DataField, AutoNetworkedField] + public float KnockRange = 4f; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs new file mode 100644 index 0000000000..2e922bb055 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// When activated artifact will spawn a pair of portals. First - right in artifact, Second - at random point of station. +/// +[RegisterComponent, Access(typeof(XAEPortalSystem)), NetworkedComponent, AutoGenerateComponentState] +public sealed partial class XAEPortalComponent : Component +{ + /// + /// Entity that should be spawned as portal. + /// + [DataField, AutoNetworkedField] + public EntProtoId PortalProto = "PortalArtifact"; +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/RandomTeleportArtifactComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAERandomTeleportInvokerComponent.cs similarity index 51% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/RandomTeleportArtifactComponent.cs rename to Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAERandomTeleportInvokerComponent.cs index d2be32e95c..a9d9ba1299 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/RandomTeleportArtifactComponent.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAERandomTeleportInvokerComponent.cs @@ -1,21 +1,23 @@ -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; /// /// When activated, will teleport the artifact /// to a random position within a certain radius /// -[RegisterComponent] -public sealed partial class RandomTeleportArtifactComponent : Component +[RegisterComponent, Access(typeof(XAERandomTeleportInvokerSystem)), NetworkedComponent, AutoGenerateComponentState] +public sealed partial class XAERandomTeleportInvokerComponent : Component { /// /// The max distance that the artifact will teleport. /// - [DataField("maxRange")] + [DataField, AutoNetworkedField] public float MaxRange = 15f; /// /// The min distance that the artifact will teleport. /// - [DataField("minRange")] + [DataField, AutoNetworkedField] public float MinRange = 6f; } diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAERemoveCollisionComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAERemoveCollisionComponent.cs new file mode 100644 index 0000000000..cbc6ee1096 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAERemoveCollisionComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// Removes the masks/layers of hard fixtures from the artifact when added, allowing it to pass through walls +/// and such. +/// +[RegisterComponent, Access(typeof(XAERemoveCollisionSystem)), NetworkedComponent] +public sealed partial class XAERemoveCollisionComponent : Component; diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEShuffleComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEShuffleComponent.cs new file mode 100644 index 0000000000..38858e5948 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEShuffleComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; + +/// +/// When activated, will shuffle the position of all players +/// within a certain radius. +/// +[RegisterComponent, Access(typeof(XAEShuffleSystem)), NetworkedComponent, AutoGenerateComponentState] +public sealed partial class XAEShuffleComponent : Component +{ + /// + /// Radius, within which mobs would be switched. + /// + [DataField, AutoNetworkedField] + public float Radius = 7.5f; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEApplyComponentsSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEApplyComponentsSystem.cs new file mode 100644 index 0000000000..e5bd33f581 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEApplyComponentsSystem.cs @@ -0,0 +1,38 @@ +using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; + +/// +/// System for applying component-registry when artifact effect is activated. +/// +public sealed class XAEApplyComponentsSystem : BaseXAESystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + var artifact = args.Artifact; + + foreach (var registry in ent.Comp.Components) + { + var componentType = registry.Value.Component.GetType(); + if (!ent.Comp.ApplyIfAlreadyHave && EntityManager.HasComponent(artifact, componentType)) + { + continue; + } + + if (ent.Comp.RefreshOnReactivate) + { + EntityManager.RemoveComponent(artifact, componentType); + } + + var clone = EntityManager.ComponentFactory.GetComponent(registry.Value); + EntityManager.AddComponent(artifact, clone); + } + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEDamageInAreaSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEDamageInAreaSystem.cs new file mode 100644 index 0000000000..405fa338ff --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEDamageInAreaSystem.cs @@ -0,0 +1,43 @@ +using Content.Shared.Damage; +using Content.Shared.Whitelist; +using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that damages entities from whitelist in area. +/// +public sealed class XAEDamageInAreaSystem : BaseXAESystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + /// Pre-allocated and re-used collection. + private readonly HashSet _entitiesInRange = new(); + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + var damageInAreaComponent = ent.Comp; + _entitiesInRange.Clear(); + _lookup.GetEntitiesInRange(ent.Owner, damageInAreaComponent.Radius, _entitiesInRange); + foreach (var entityInRange in _entitiesInRange) + { + if (!_random.Prob(damageInAreaComponent.DamageChance)) + continue; + + if (_whitelistSystem.IsWhitelistFail(damageInAreaComponent.Whitelist, entityInRange)) + continue; + + _damageable.TryChangeDamage(entityInRange, damageInAreaComponent.Damage, damageInAreaComponent.IgnoreResistances); + } + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs new file mode 100644 index 0000000000..9cc9efe51b --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs @@ -0,0 +1,27 @@ +using Content.Shared.Magic.Events; +using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that opens doors in some area around. +/// +public sealed class XAEKnockSystem : BaseXAESystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + var ev = new KnockSpellEvent + { + Performer = ent.Owner, + Range = ent.Comp.KnockRange + }; + RaiseLocalEvent(ev); + } +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PortalArtifactSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs similarity index 51% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PortalArtifactSystem.cs rename to Content.Shared/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs index 810d56e89b..3d5355b5fd 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PortalArtifactSystem.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs @@ -1,30 +1,32 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts.Events; using Content.Shared.Mind.Components; using Content.Shared.Mobs.Components; using Content.Shared.Teleportation.Systems; +using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; using Robust.Shared.Collections; using Robust.Shared.Containers; using Robust.Shared.Random; +using Robust.Shared.Timing; -namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; -public sealed class PortalArtifactSystem : EntitySystem +/// +/// System for xeno artifact effect that creates temporary portal between places on station. +/// +public sealed class XAEPortalSystem : BaseXAESystem { [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly LinkedEntitySystem _link = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly IGameTiming _timing = default!; - public override void Initialize() + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) { - base.Initialize(); - SubscribeLocalEvent(OnActivate); - } + if (!_timing.IsFirstTimePredicted) + return; - private void OnActivate(Entity artifact, ref ArtifactActivatedEvent args) - { - var map = Transform(artifact).MapID; + var map = Transform(ent).MapID; var validMinds = new ValueList(); var mindQuery = EntityQueryEnumerator(); while (mindQuery.MoveNext(out var uid, out var mc, out _, out var xform, out var meta)) @@ -35,18 +37,20 @@ public sealed class PortalArtifactSystem : EntitySystem validMinds.Add(uid); } } - //this would only be 0 if there were a station full of AIs and no one else, in that case just stop this function + // this would only be 0 if there were a station full of AIs and no one else, in that case just stop this function if (validMinds.Count == 0) return; - var firstPortal = Spawn(artifact.Comp.PortalProto, _transform.GetMapCoordinates(artifact)); + var offset = _random.NextVector2(2, 3); + var originWithOffset = args.Coordinates.Offset(offset); + var firstPortal = Spawn(ent.Comp.PortalProto, originWithOffset); var target = _random.Pick(validMinds); - var secondPortal = Spawn(artifact.Comp.PortalProto, _transform.GetMapCoordinates(target)); + var secondPortal = Spawn(ent.Comp.PortalProto, _transform.GetMapCoordinates(target)); - //Manual position swapping, because the portal that opens doesn't trigger a collision, and doesn't teleport targets the first time. - _transform.SwapPositions(target, artifact.Owner); + // Manual position swapping, because the portal that opens doesn't trigger a collision, and doesn't teleport targets the first time. + _transform.SwapPositions(target, ent.Owner); _link.TryLink(firstPortal, secondPortal, true); } diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAERandomTeleportInvokerSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAERandomTeleportInvokerSystem.cs new file mode 100644 index 0000000000..24563cbff7 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAERandomTeleportInvokerSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.Popups; +using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; + +public sealed class XAERandomTeleportInvokerSystem : BaseXAESystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + // todo: teleport person who activated artifact with artifact itself + var component = ent.Comp; + + var xform = Transform(ent.Owner); + _popup.PopupCoordinates(Loc.GetString("blink-artifact-popup"), xform.Coordinates, PopupType.Medium); + + var offsetTo = _random.NextVector2(component.MinRange, component.MaxRange); + _xform.SetCoordinates(ent.Owner, xform, xform.Coordinates.Offset(offsetTo)); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAERemoveCollisionSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAERemoveCollisionSystem.cs new file mode 100644 index 0000000000..5b557a77f3 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAERemoveCollisionSystem.cs @@ -0,0 +1,25 @@ +using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Systems; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; + +/// +/// System for xeno artifact effect that make artifact pass through other objects. +/// +public sealed class XAERemoveCollisionSystem : BaseXAESystem +{ + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + if (!TryComp(ent.Owner, out var fixtures)) + return; + + foreach (var fixture in fixtures.Fixtures.Values) + { + _physics.SetHard(ent.Owner, fixture, false, fixtures); + } + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEShuffleSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEShuffleSystem.cs new file mode 100644 index 0000000000..9eb627b4f6 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEShuffleSystem.cs @@ -0,0 +1,59 @@ +using Content.Shared.Mobs.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAE; + +/// +/// System that handles mob entities spacial shuffling effect. +/// +public sealed class XAEShuffleSystem : BaseXAESystem +{ + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + private EntityQuery _mobState; + + /// Pre-allocated and re-used collection. + private readonly HashSet _entities= new(); + + /// + public override void Initialize() + { + base.Initialize(); + + _mobState = GetEntityQuery(); + } + + /// + protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) + { + if(!_timing.IsFirstTimePredicted) + return; + + List> toShuffle = new(); + _entities.Clear(); + _lookup.GetEntitiesInRange(ent.Owner, ent.Comp.Radius, _entities, LookupFlags.Dynamic | LookupFlags.Sundries); + foreach (var entity in _entities) + { + if (!_mobState.HasComponent(entity)) + continue; + + var xform = Transform(entity); + + toShuffle.Add((entity, xform)); + } + + _random.Shuffle(toShuffle); + + while (toShuffle.Count > 1) + { + var ent1 = _random.PickAndTake(toShuffle); + var ent2 = _random.PickAndTake(toShuffle); + _xform.SwapPositions((ent1, ent1), (ent2, ent2)); + } + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/BaseQueryUpdateXATSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/BaseQueryUpdateXATSystem.cs new file mode 100644 index 0000000000..5a7fc53e9e --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/BaseQueryUpdateXATSystem.cs @@ -0,0 +1,51 @@ +using Content.Shared.Xenoarchaeology.Artifact.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// Base type for xeno artifact trigger systems, that are relied on updating loop. +/// +/// Type of XAT component that system will work with. +public abstract class BaseQueryUpdateXATSystem : BaseXATSystem where T : Component +{ + protected EntityQuery _xenoArtifactQuery; + + /// + public override void Initialize() + { + base.Initialize(); + + _xenoArtifactQuery = GetEntityQuery(); + } + + /// + public override void Update(float frameTime) + { + base.Update(frameTime); + + // TODO: add a way to defer triggering artifacts to the end of the Update loop + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp, out var node)) + { + if (node.Attached == null) + continue; + + var artifact = _xenoArtifactQuery.Get(GetEntity(node.Attached.Value)); + + if (!CanTrigger(artifact, (uid, node))) + continue; + + UpdateXAT(artifact, (uid, comp, node), frameTime); + } + } + + /// + /// Handles update logic that is related to trigger component. + /// + protected abstract void UpdateXAT( + Entity artifact, + Entity node, + float frameTime + ); +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/BaseXATSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/BaseXATSystem.cs new file mode 100644 index 0000000000..d995a12d6a --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/BaseXATSystem.cs @@ -0,0 +1,88 @@ +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// Base type for xeno artifact trigger systems. Each system should work with 1 trigger mechanics. +/// +/// Type of XAT component that system will work with. +public abstract class BaseXATSystem : EntitySystem where T : Component +{ + [Dependency] protected readonly IGameTiming Timing = default!; + [Dependency] protected readonly SharedXenoArtifactSystem XenoArtifact = default!; + + private EntityQuery _unlockingQuery; + + /// + public override void Initialize() + { + base.Initialize(); + + _unlockingQuery = GetEntityQuery(); + } + + /// + /// Subscribes to event occurring on artifact (and by relaying - on node). + /// + /// Type of event to sub for. + /// Delegate that handles event. + protected void XATSubscribeDirectEvent(XATEventHandler eventHandler) where TEvent : notnull + { + SubscribeLocalEvent>((uid, component, args) => + { + var nodeComp = Comp(uid); + + if (!CanTrigger(args.Artifact, (uid, nodeComp))) + return; + + var node = new Entity(uid, component, nodeComp); + eventHandler.Invoke(args.Artifact, node, ref args.Args); + }); + } + + /// + /// Checks if node can be triggered. + /// + /// Artifact entity. + /// Node from . + protected bool CanTrigger(Entity artifact, Entity node) + { + if (Timing.CurTime < artifact.Comp.NextUnlockTime) + return false; + + if (_unlockingQuery.TryComp(artifact, out var unlocking) && + unlocking.TriggeredNodeIndexes.Contains(XenoArtifact.GetIndex(artifact, node))) + return false; + + if (!XenoArtifact.CanUnlockNode((node, node))) + return false; + + return true; + } + + /// + /// Triggers node. Triggered nodes participate in node unlocking. + /// + protected void Trigger(Entity artifact, Entity node) + { + if (!Timing.IsFirstTimePredicted) + return; + + Log.Debug($"Activated trigger {typeof(T).Name} on node {ToPrettyString(node)} for {ToPrettyString(artifact)}"); + XenoArtifact.TriggerXenoArtifact(artifact, (node.Owner, node.Comp2)); + } + + /// + /// Delegate for handling relayed artifact trigger events. + /// + /// Event type to be handled. + /// Artifact, on which event occurred. + /// Node which for which event were relayed. + /// Event data. + protected delegate void XATEventHandler( + Entity artifact, + Entity node, + ref TEvent args + ) where TEvent : notnull; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATCompNearbyComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATCompNearbyComponent.cs new file mode 100644 index 0000000000..90c697a359 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATCompNearbyComponent.cs @@ -0,0 +1,30 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used a XAT that activates when an entity fulfilling the given whitelist is nearby the artifact. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATCompNearbyComponent)), AutoGenerateComponentState] +public sealed partial class XATCompNearbyComponent : Component +{ + /// + /// Component name that is required to activate trigger. + /// Is spelled without 'Component' suffix. + /// + [DataField(customTypeSerializer: typeof(ComponentNameSerializer)), AutoNetworkedField] + public string RequireComponentWithName = "Item"; + + /// + /// Radius, in which trigger going to search for entity with component. + /// + [DataField, AutoNetworkedField] + public float Radius = 5; + + /// + /// Required entities count. + /// + [DataField, AutoNetworkedField] + public int Count = 1; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATDamageThresholdReachedComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATDamageThresholdReachedComponent.cs new file mode 100644 index 0000000000..4f5ceb1bae --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATDamageThresholdReachedComponent.cs @@ -0,0 +1,38 @@ +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for an artifact that is activated after a certain amount of damage is dealt. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(XATDamageThresholdReachedSystem))] +public sealed partial class XATDamageThresholdReachedComponent : Component +{ + /// + /// Damage, accumulated by artifact so far. Is cleared on node activation. + /// + [DataField, AutoNetworkedField] + public DamageSpecifier AccumulatedDamage = new(); + + /// + /// Damage that is required to activate trigger, grouped by damage type. + /// Only one damage type is required, amount of damage must exceed set limit. + /// is not required to activate trigger if this + /// requirement is satisfied. + /// + [DataField, AutoNetworkedField] + public Dictionary, FixedPoint2> TypesNeeded = new(); + + /// + /// Damage that is required to activate trigger, grouped by damage group. + /// Only one damage type is required, amount of damage must exceed set limit. + /// is not required to activate trigger if this + /// requirement is satisfied. + /// + [DataField, AutoNetworkedField] + public Dictionary, FixedPoint2> GroupsNeeded = new(); +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATDeathComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATDeathComponent.cs new file mode 100644 index 0000000000..48a0916d1b --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATDeathComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for a xenoarch trigger that activates when something dies nearby. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATDeathSystem)), AutoGenerateComponentState] +public sealed partial class XATDeathComponent : Component +{ + /// + /// Range within which artifact going to listen to death event. + /// + [DataField, AutoNetworkedField] + public float Range = 15; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATExaminableTextComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATExaminableTextComponent.cs new file mode 100644 index 0000000000..b097389563 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATExaminableTextComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for an artifact node that puts examine text on the artifact itself. Useful for flavor +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SharedXenoArtifactSystem)), AutoGenerateComponentState] +public sealed partial class XATExaminableTextComponent : Component +{ + /// Text to display. + [DataField(required: true), AutoNetworkedField] + public LocId ExamineText; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATExamineComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATExamineComponent.cs new file mode 100644 index 0000000000..1b00141484 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATExamineComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for an artifact that is activated when someone examines it. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATExamineSystem))] +public sealed partial class XATExamineComponent : Component; diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATInteractionComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATInteractionComponent.cs new file mode 100644 index 0000000000..988738fbb5 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATInteractionComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for a xenoarch trigger that activates after any type of physical interaction. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATInteractionSystem))] +public sealed partial class XATInteractionComponent : Component; diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATItemLandComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATItemLandComponent.cs new file mode 100644 index 0000000000..153e532288 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATItemLandComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for an artifact trigger that activates when a thrown item lands on the ground. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATItemLandSystem))] +public sealed partial class XATItemLandComponent : Component; diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATReactiveComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATReactiveComponent.cs new file mode 100644 index 0000000000..1af168b4a9 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATReactiveComponent.cs @@ -0,0 +1,38 @@ +using Content.Shared.Chemistry; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for a xenoarch trigger that activates when a reaction occurs on the artifact. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATReactiveSystem)), AutoGenerateComponentState] +public sealed partial class XATReactiveComponent : Component +{ + [DataField, AutoNetworkedField] + public List ReactionMethods = new() { ReactionMethod.Touch }; + + /// + /// Reagents that are required in quantity to activate trigger. + /// If any of them are present in required amount - activation will be triggered. + /// + [DataField, AutoNetworkedField] + public HashSet> Reagents = new(); + + /// + /// ReagentGroups that are required in quantity to activate trigger. + /// If any of them are present in required amount - activation will be triggered. + /// + [DataField, AutoNetworkedField] + public HashSet> ReactiveGroups = new(); + + /// + /// Min amount of reagent to trigger. + /// + [DataField, AutoNetworkedField] + public FixedPoint2 MinQuantity = 5f; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATTimerComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATTimerComponent.cs new file mode 100644 index 0000000000..d23b222b14 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATTimerComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Destructible.Thresholds; +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for a xenoarch trigger that self-activates at a regular interval +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATTimerSystem)), AutoGenerateComponentState, AutoGenerateComponentPause] +public sealed partial class XATTimerComponent : Component +{ + /// + /// Next time timer going to activate. + /// + [DataField, AutoNetworkedField, AutoPausedField] + public TimeSpan NextActivation; + + /// + /// Delay between activations. + /// + [DataField, AutoNetworkedField] + public MinMax PossibleDelayInSeconds; +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATToolUseComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATToolUseComponent.cs new file mode 100644 index 0000000000..f07e6ae642 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/Components/XATToolUseComponent.cs @@ -0,0 +1,49 @@ +using Content.Shared.DoAfter; +using Content.Shared.Tools; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +/// +/// This is used for a xenoarch trigger that is activated by a tool being used on it. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(XATToolUseSystem)), AutoGenerateComponentState] +public sealed partial class XATToolUseComponent : Component +{ + /// + /// Tool to be used. + /// + [DataField, AutoNetworkedField] + public ProtoId RequiredTool; + + /// + /// Time that using tool on artifact will take. + /// + [DataField, AutoNetworkedField] + public float Delay = 3; + + /// + /// Amount of fuel using tool will take (for devices such as Welding tool). + /// + [DataField, AutoNetworkedField] + public float Fuel; +} + +/// Do after that will be used if proper tool was used on artifact with . +[Serializable, NetSerializable] +public sealed partial class XATToolUseDoAfterEvent : DoAfterEvent +{ + public NetEntity Node; + + public XATToolUseDoAfterEvent(NetEntity node) + { + Node = node; + } + + public override DoAfterEvent Clone() + { + return this; + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATCompNearbySystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATCompNearbySystem.cs new file mode 100644 index 0000000000..8036ec054f --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATCompNearbySystem.cs @@ -0,0 +1,34 @@ +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that requires some entity/entities with certain component on them nearby. +/// +public sealed class XATCompNearbySystem : BaseQueryUpdateXATSystem +{ + [Dependency] private readonly EntityLookupSystem _entityLookup = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + /// Pre-allocated and re-used collection. + private readonly HashSet> _entities = new(); + + /// + protected override void UpdateXAT( + Entity artifact, + Entity node, + float frameTime + ) + { + var compNearbyComponent = node.Comp1; + + var pos = _transform.GetMapCoordinates(artifact); + var comp = EntityManager.ComponentFactory.GetRegistration(compNearbyComponent.RequireComponentWithName); + + _entities.Clear(); + _entityLookup.GetEntitiesInRange(comp.Type, pos, compNearbyComponent.Radius, _entities); + if (_entities.Count >= compNearbyComponent.Count) + Trigger(artifact, node); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATDamageThresholdReachedSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATDamageThresholdReachedSystem.cs new file mode 100644 index 0000000000..eab832ce6d --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATDamageThresholdReachedSystem.cs @@ -0,0 +1,65 @@ +using Content.Shared.Damage; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that requires certain damage to be applied to artifact within a timeframe. +/// +public sealed class XATDamageThresholdReachedSystem : BaseXATSystem +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + XATSubscribeDirectEvent(OnDamageChanged); + } + + private void OnDamageChanged(Entity artifact, Entity node, ref DamageChangedEvent args) + { + if (!args.DamageIncreased || args.DamageDelta == null || args.Origin == artifact.Owner) + return; + + var damageTriggerComponent = node.Comp1; + if (Timing.IsFirstTimePredicted) + damageTriggerComponent.AccumulatedDamage += args.DamageDelta; + + foreach (var (type, needed) in damageTriggerComponent.TypesNeeded) + { + if (damageTriggerComponent.AccumulatedDamage.DamageDict.GetValueOrDefault(type) >= needed) + { + InvokeTrigger(artifact, node); + return; // intentional. Do not continue checks + } + } + + foreach (var (group, needed) in damageTriggerComponent.GroupsNeeded) + { + var damageGroupPrototype = _prototype.Index(group); + if (!damageTriggerComponent.AccumulatedDamage.TryGetDamageInGroup(damageGroupPrototype, out var damage)) + continue; + + if (damage >= needed) + { + InvokeTrigger(artifact, node); + return; // intentional. Do not continue checks + } + } + } + + private void InvokeTrigger( + Entity artifact, + Entity node + ) + { + var damageTriggerComponent = node.Comp1; + damageTriggerComponent.AccumulatedDamage.DamageDict.Clear(); + Dirty(node, damageTriggerComponent); + Trigger(artifact, node); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATDeathSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATDeathSystem.cs new file mode 100644 index 0000000000..747bd82feb --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATDeathSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared.Mobs; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that requires death of some mob near artifact. +/// +public sealed class XATDeathSystem : BaseXATSystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + + private EntityQuery _xenoArtifactQuery; + + /// + public override void Initialize() + { + base.Initialize(); + + _xenoArtifactQuery = GetEntityQuery(); + + SubscribeLocalEvent(OnMobStateChanged); + } + + private void OnMobStateChanged(MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead) + return; + + var targetCoords = Transform(args.Target).Coordinates; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp, out var node)) + { + if (node.Attached == null) + continue; + + var artifact = _xenoArtifactQuery.Get(GetEntity(node.Attached.Value)); + + if (!CanTrigger(artifact, (uid, node))) + continue; + + var artifactCoords = Transform(artifact).Coordinates; + if (_transform.InRange(targetCoords, artifactCoords, comp.Range)) + Trigger(artifact, (uid, comp, node)); + } + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATExaminableTextSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATExaminableTextSystem.cs new file mode 100644 index 0000000000..affb850fb0 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATExaminableTextSystem.cs @@ -0,0 +1,28 @@ +using Content.Shared.Examine; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for marking xeno artifact with certain text. +/// +/// Not actually a trigger but nice and easy to use. +public sealed class XATExaminableTextSystem : BaseXATSystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + XATSubscribeDirectEvent(OnExamined); + } + + private void OnExamined(Entity artifact, Entity node, ref ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + args.PushMarkup(Loc.GetString(node.Comp1.ExamineText)); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATExamineSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATExamineSystem.cs new file mode 100644 index 0000000000..44616ee7de --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATExamineSystem.cs @@ -0,0 +1,32 @@ +using Content.Shared.Examine; +using Content.Shared.Ghost; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that requires player to examine details of artifact. +/// +public sealed class XATExamineSystem : BaseXATSystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + XATSubscribeDirectEvent(OnExamine); + } + + private void OnExamine(Entity artifact, Entity node, ref ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + if (HasComp(args.Examiner)) + return; + + Trigger(artifact, node); + args.PushMarkup(Loc.GetString("artifact-examine-trigger-desc")); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATInteractionSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATInteractionSystem.cs new file mode 100644 index 0000000000..940e46198e --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATInteractionSystem.cs @@ -0,0 +1,42 @@ +using Content.Shared.Interaction; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that requires some way of 'using' (with default action) an artifact entity. +/// +public sealed class XATInteractionSystem : BaseXATSystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + XATSubscribeDirectEvent(OnPullStart); + XATSubscribeDirectEvent(OnAttacked); + XATSubscribeDirectEvent(OnInteractHand); + } + + private void OnPullStart(Entity artifact, Entity node, ref PullStartedMessage args) + { + Trigger(artifact, node); + } + + private void OnAttacked(Entity artifact, Entity node, ref AttackedEvent args) + { + Trigger(artifact, node); + } + + private void OnInteractHand(Entity artifact, Entity node, ref InteractHandEvent args) + { + if (args.Handled) + return; + + args.Handled = true; + Trigger(artifact, node); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATItemLandSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATItemLandSystem.cs new file mode 100644 index 0000000000..943d1ef5c5 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATItemLandSystem.cs @@ -0,0 +1,24 @@ +using Content.Shared.Throwing; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that requires hand-held artifact to be thrown (and land). +/// +public sealed class XATItemLandSystem : BaseXATSystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + XATSubscribeDirectEvent(OnLand); + } + + private void OnLand(Entity artifact, Entity node, ref LandEvent args) + { + Trigger(artifact, node); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATReactiveSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATReactiveSystem.cs new file mode 100644 index 0000000000..6b0c425ea3 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATReactiveSystem.cs @@ -0,0 +1,58 @@ +using Content.Shared.Chemistry; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that requires some chemical reagent. +/// +public sealed class XATReactiveSystem : BaseXATSystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + XATSubscribeDirectEvent(OnReaction); + } + + private void OnReaction(Entity artifact, Entity node, ref ReactionEntityEvent args) + { + var reactiveTriggerComponent = node.Comp1; + if (!reactiveTriggerComponent.ReactionMethods.Contains(args.Method)) + return; + + if (args.ReagentQuantity.Quantity < reactiveTriggerComponent.MinQuantity) + return; + + if (!reactiveTriggerComponent.Reagents.Contains(args.Reagent.ID)) + return; + + if (reactiveTriggerComponent.ReactiveGroups?.Count > 0 && !ReagentHaveReactiveGroup(args, reactiveTriggerComponent)) + return; + + Trigger(artifact, node); + } + + private static bool ReagentHaveReactiveGroup(ReactionEntityEvent args, XATReactiveComponent reactiveTriggerComponent) + { + var reactiveReagentEffectEntries = args.Reagent.ReactiveEffects; + if (reactiveReagentEffectEntries == null) + { + return false; + } + + var reactiveGroups = reactiveTriggerComponent.ReactiveGroups; + foreach(var reactiveGroup in reactiveGroups) + { + if (reactiveReagentEffectEntries.TryGetValue(reactiveGroup, out var effectEntry) + && effectEntry.Methods?.Contains(args.Method) == true) + { + return true; + } + } + + return false; + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATTimerSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATTimerSystem.cs new file mode 100644 index 0000000000..af77711852 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATTimerSystem.cs @@ -0,0 +1,68 @@ +using Content.Shared.Examine; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; +using Robust.Shared.Random; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// System for xeno artifact trigger that activates from time to time on schedule. +/// +public sealed class XATTimerSystem : BaseQueryUpdateXATSystem +{ + [Dependency] private readonly IRobustRandom _robustRandom = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + XATSubscribeDirectEvent(OnExamine); + } + + // We handle the timer resetting here because we need to keep it updated even if the node isn't able to unlock. + public override void Update(float frameTime) + { + base.Update(frameTime); + + var timerQuery = EntityQueryEnumerator(); + while (timerQuery.MoveNext(out var uid, out var timer)) + { + if (Timing.CurTime < timer.NextActivation) + continue; + timer.NextActivation += GetNextDelay(timer); + Dirty(uid, timer); + } + } + + /// + protected override void UpdateXAT(Entity artifact, Entity node, float frameTime) + { + if (Timing.CurTime > node.Comp1.NextActivation) + Trigger(artifact, node); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + var delay = GetNextDelay(ent); + ent.Comp.NextActivation = Timing.CurTime + delay; + Dirty(ent); + } + + private void OnExamine(Entity artifact, Entity node, ref ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + args.PushMarkup( + Loc.GetString("xenoarch-trigger-examine-timer", + ("time", MathF.Ceiling((float) (node.Comp1.NextActivation - Timing.CurTime).TotalSeconds))) + ); + } + + private TimeSpan GetNextDelay(XATTimerComponent comp) + { + return TimeSpan.FromSeconds(comp.PossibleDelayInSeconds.Next(_robustRandom)); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAT/XATToolUseSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATToolUseSystem.cs new file mode 100644 index 0000000000..ca2692af46 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Artifact/XAT/XATToolUseSystem.cs @@ -0,0 +1,52 @@ +using Content.Shared.Interaction; +using Content.Shared.Tools.Components; +using Content.Shared.Tools.Systems; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Artifact.XAT.Components; + +namespace Content.Shared.Xenoarchaeology.Artifact.XAT; + +/// +/// This handles +/// +public sealed class XATToolUseSystem : BaseXATSystem +{ + [Dependency] private readonly SharedToolSystem _tool = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + XATSubscribeDirectEvent(OnInteractUsing); + XATSubscribeDirectEvent(OnToolUseComplete); + } + + private void OnToolUseComplete(Entity artifact, Entity node, ref XATToolUseDoAfterEvent args) + { + if (args.Cancelled) + return; + + if (GetEntity(args.Node) != node.Owner) + return; + + Trigger(artifact, node); + args.Handled = true; + } + + private void OnInteractUsing(Entity artifact, Entity node, ref InteractUsingEvent args) + { + if (!TryComp(args.Used, out var tool)) + return; + + var toolUseTriggerComponent = node.Comp1; + args.Handled = _tool.UseTool(args.Used, + args.User, + artifact, + toolUseTriggerComponent.Delay, + toolUseTriggerComponent.RequiredTool, + new XATToolUseDoAfterEvent(GetNetEntity(node)), + fuel: toolUseTriggerComponent.Fuel, + tool); + } +} diff --git a/Content.Shared/Xenoarchaeology/Equipment/Components/AnalysisConsoleComponent.cs b/Content.Shared/Xenoarchaeology/Equipment/Components/AnalysisConsoleComponent.cs new file mode 100644 index 0000000000..3247e3365a --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Equipment/Components/AnalysisConsoleComponent.cs @@ -0,0 +1,52 @@ +using Content.Shared.DeviceLinking; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Xenoarchaeology.Equipment.Components; + +/// +/// The console that is used for artifact analysis +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class AnalysisConsoleComponent : Component +{ + /// + /// The analyzer entity the console is linked. + /// Can be null if not linked. + /// + [DataField, AutoNetworkedField] + public NetEntity? AnalyzerEntity; + + [DataField] + public SoundSpecifier? ScanFinishedSound = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg"); + + /// + /// The sound played when an artifact has points extracted. + /// + [DataField] + public SoundSpecifier? ExtractSound = new SoundPathSpecifier("/Audio/Effects/radpulse11.ogg") + { + Params = new AudioParams + { + Volume = 4, + } + }; + + /// + /// The machine linking port for the analyzer + /// + [DataField] + public ProtoId LinkingPort = "ArtifactAnalyzerSender"; +} + +[Serializable, NetSerializable] +public enum ArtifactAnalyzerUiKey : byte +{ + Key +} + +[Serializable, NetSerializable] +public sealed class AnalysisConsoleExtractButtonPressedMessage : BoundUserInterfaceMessage; + diff --git a/Content.Shared/Xenoarchaeology/Equipment/Components/ArtifactAnalyzerComponent.cs b/Content.Shared/Xenoarchaeology/Equipment/Components/ArtifactAnalyzerComponent.cs new file mode 100644 index 0000000000..05d17bb123 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Equipment/Components/ArtifactAnalyzerComponent.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Equipment.Components; + +/// +/// A machine that is combined and linked to the +/// in order to analyze artifacts and extract points. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class ArtifactAnalyzerComponent : Component +{ + /// + /// How long it takes to analyze an artifact + /// + [DataField] + public TimeSpan AnalysisDuration = TimeSpan.FromSeconds(30); + + /// + /// The current artifact placed on this analyzer. + /// Can be null if none are present. + /// + [DataField, AutoNetworkedField] + public EntityUid? CurrentArtifact; + + /// + /// The corresponding console entity. + /// Can be null if not linked. + /// + [ViewVariables, AutoNetworkedField] + public EntityUid? Console; + + /// + /// Marker, if artifact graph data is ready for printing. + /// + [ViewVariables(VVAccess.ReadWrite)] + public bool ReadyToPrint = false; +} diff --git a/Content.Shared/Xenoarchaeology/Equipment/ArtifactCrusherComponent.cs b/Content.Shared/Xenoarchaeology/Equipment/Components/ArtifactCrusherComponent.cs similarity index 98% rename from Content.Shared/Xenoarchaeology/Equipment/ArtifactCrusherComponent.cs rename to Content.Shared/Xenoarchaeology/Equipment/Components/ArtifactCrusherComponent.cs index e21cedb6f9..69a682b660 100644 --- a/Content.Shared/Xenoarchaeology/Equipment/ArtifactCrusherComponent.cs +++ b/Content.Shared/Xenoarchaeology/Equipment/Components/ArtifactCrusherComponent.cs @@ -9,7 +9,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -namespace Content.Shared.Xenoarchaeology.Equipment; +namespace Content.Shared.Xenoarchaeology.Equipment.Components; /// /// This is an entity storage that, when activated, crushes the artifact inside of it and gives artifact fragments. diff --git a/Content.Shared/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs b/Content.Shared/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs new file mode 100644 index 0000000000..89403ee1e3 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Equipment/Components/NodeScannerComponent.cs @@ -0,0 +1,58 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Xenoarchaeology.Equipment.Components; + +/// +/// Component for managing data stored on NodeScanner hand-held device. +/// Can store snapshot list of currently triggered artifact nodes. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), Access(typeof(SharedNodeScannerSystem))] +public sealed partial class NodeScannerComponent : Component +{ + /// + /// Identity-names (3-digit codes) of nodes that are triggered on scanned artifact. + /// + [DataField, AutoNetworkedField] + public HashSet TriggeredNodesSnapshot = new(); + + /// + /// State of artifact on the moment of scanning. + /// + [DataField, AutoNetworkedField] + public ArtifactState ArtifactState; + + /// + /// Time until next unlocking of scanned artifact can be started. + /// + [DataField, AutoNetworkedField] + public TimeSpan? WaitTime; + + /// + /// Moment of gametime, at which last artifact scanning was done. + /// + [DataField, AutoNetworkedField] + public TimeSpan? ScannedAt; +} + +/// +/// Displayable to player artifact states. +/// +[Serializable, NetSerializable] +public enum ArtifactState +{ + /// Unused default. + None, + /// Artifact is ready to start unlocking. + Ready, + /// Artifact is in unlocking state, listening to any additional trigger. + Unlocking, + /// Artifact unlocking is on cooldown, nodes could not be triggered. + Cooldown +} + +[Serializable, NetSerializable] +public enum NodeScannerUiKey : byte +{ + Key +} diff --git a/Content.Shared/Xenoarchaeology/Equipment/Components/SuppressArtifactContainerComponent.cs b/Content.Shared/Xenoarchaeology/Equipment/Components/SuppressArtifactContainerComponent.cs new file mode 100644 index 0000000000..831813b1c9 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Equipment/Components/SuppressArtifactContainerComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Xenoarchaeology.Equipment.Components; + +/// +/// Suppress artifact activation, when entity is placed inside this container. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SuppressArtifactContainerSystem))] +public sealed partial class SuppressArtifactContainerComponent : Component; diff --git a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs deleted file mode 100644 index 07f2a60c84..0000000000 --- a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzer.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Robust.Shared.Serialization; -using Robust.Shared.Utility; - -namespace Content.Shared.Xenoarchaeology.Equipment; - -[Serializable, NetSerializable] -public enum ArtifactAnalzyerUiKey : byte -{ - Key -} - -[Serializable, NetSerializable] -public sealed class AnalysisConsoleServerSelectionMessage : BoundUserInterfaceMessage -{ -} - -[Serializable, NetSerializable] -public sealed class AnalysisConsoleScanButtonPressedMessage : BoundUserInterfaceMessage -{ -} - -[Serializable, NetSerializable] -public sealed class AnalysisConsolePrintButtonPressedMessage : BoundUserInterfaceMessage -{ -} - -[Serializable, NetSerializable] -public sealed class AnalysisConsoleExtractButtonPressedMessage : BoundUserInterfaceMessage -{ -} - -[Serializable, NetSerializable] -public sealed class AnalysisConsoleBiasButtonPressedMessage(bool isDown) : BoundUserInterfaceMessage -{ - public bool IsDown = isDown; -} - -[Serializable, NetSerializable] -public sealed class AnalysisConsoleUpdateState( - NetEntity? artifact, - bool analyzerConnected, - bool serverConnected, - bool canScan, - bool canPrint, - FormattedMessage? scanReport, - bool scanning, - bool paused, - TimeSpan? startTime, - TimeSpan? accumulatedRunTime, - TimeSpan? totalTime, - int pointAmount, - bool isTraversalDown -) - : BoundUserInterfaceState -{ - public NetEntity? Artifact = artifact; - public bool AnalyzerConnected = analyzerConnected; - public bool ServerConnected = serverConnected; - public bool CanScan = canScan; - public bool CanPrint = canPrint; - public FormattedMessage? ScanReport = scanReport; - public bool Scanning = scanning; - public bool Paused = paused; - public TimeSpan? StartTime = startTime; - public TimeSpan? AccumulatedRunTime = accumulatedRunTime; - public TimeSpan? TotalTime = totalTime; - public int PointAmount = pointAmount; - public bool IsTraversalDown = isTraversalDown; -} diff --git a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzerSystem.cs b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzerSystem.cs new file mode 100644 index 0000000000..e47e964225 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactAnalyzerSystem.cs @@ -0,0 +1,136 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Shared.DeviceLinking; +using Content.Shared.DeviceLinking.Events; +using Content.Shared.Placeable; +using Content.Shared.Power.EntitySystems; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Equipment.Components; + +namespace Content.Shared.Xenoarchaeology.Equipment; + +/// +/// This system is used for managing the artifact analyzer as well as the analysis console. +/// It also handles scanning and ui updates for both systems. +/// +public abstract class SharedArtifactAnalyzerSystem : EntitySystem +{ + [Dependency] private readonly SharedPowerReceiverSystem _powerReceiver = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnItemPlaced); + SubscribeLocalEvent(OnItemRemoved); + SubscribeLocalEvent(OnMapInit); + + SubscribeLocalEvent(OnNewLink); + SubscribeLocalEvent(OnPortDisconnected); + } + + private void OnItemPlaced(Entity ent, ref ItemPlacedEvent args) + { + ent.Comp.CurrentArtifact = args.OtherEntity; + Dirty(ent); + } + + private void OnItemRemoved(Entity ent, ref ItemRemovedEvent args) + { + if (args.OtherEntity != ent.Comp.CurrentArtifact) + return; + + ent.Comp.CurrentArtifact = null; + Dirty(ent); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + if (!TryComp(ent, out var sink)) + return; + + foreach (var source in sink.LinkedSources) + { + if (!TryComp(source, out var analysis)) + continue; + + analysis.AnalyzerEntity = GetNetEntity(ent); + ent.Comp.Console = source; + Dirty(source, analysis); + Dirty(ent); + break; + } + } + + private void OnNewLink(Entity ent, ref NewLinkEvent args) + { + if (!TryComp(args.Sink, out var analyzer)) + return; + + ent.Comp.AnalyzerEntity = GetNetEntity(args.Sink); + analyzer.Console = ent; + Dirty(args.Sink, analyzer); + Dirty(ent); + } + + private void OnPortDisconnected(Entity ent, ref PortDisconnectedEvent args) + { + var analyzerNetEntity = ent.Comp.AnalyzerEntity; + if (args.Port != ent.Comp.LinkingPort || analyzerNetEntity == null) + return; + + var analyzerEntityUid = GetEntity(analyzerNetEntity); + if (TryComp(analyzerEntityUid, out var analyzer)) + { + analyzer.Console = null; + Dirty(analyzerEntityUid.Value, analyzer); + } + + ent.Comp.AnalyzerEntity = null; + Dirty(ent); + } + + public bool TryGetAnalyzer(Entity ent, [NotNullWhen(true)] out Entity? analyzer) + { + analyzer = null; + + var consoleEnt = ent.Owner; + if (!_powerReceiver.IsPowered(consoleEnt)) + return false; + + var analyzerUid = GetEntity(ent.Comp.AnalyzerEntity); + if (!TryComp(analyzerUid, out var analyzerComp)) + return false; + + if (!_powerReceiver.IsPowered(analyzerUid.Value)) + return false; + + analyzer = (analyzerUid.Value, analyzerComp); + return true; + } + + public bool TryGetArtifactFromConsole(Entity ent, [NotNullWhen(true)] out Entity? artifact) + { + artifact = null; + + if (!TryGetAnalyzer(ent, out var analyzer)) + return false; + + if (!TryComp(analyzer.Value.Comp.CurrentArtifact, out var comp)) + return false; + + artifact = (analyzer.Value.Comp.CurrentArtifact.Value, comp); + return true; + } + + public bool TryGetAnalysisConsole(Entity ent, [NotNullWhen(true)] out Entity? analysisConsole) + { + analysisConsole = null; + + if (!TryComp(ent.Comp.Console, out var consoleComp)) + return false; + + analysisConsole = (ent.Comp.Console.Value, consoleComp); + return true; + } +} diff --git a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactCrusherSystem.cs b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactCrusherSystem.cs index 2d7d86822f..64f3126297 100644 --- a/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactCrusherSystem.cs +++ b/Content.Shared/Xenoarchaeology/Equipment/SharedArtifactCrusherSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Storage.Components; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Content.Shared.Emag.Systems; +using Content.Shared.Xenoarchaeology.Equipment.Components; namespace Content.Shared.Xenoarchaeology.Equipment; diff --git a/Content.Shared/Xenoarchaeology/Equipment/SharedNodeScannerSystem.cs b/Content.Shared/Xenoarchaeology/Equipment/SharedNodeScannerSystem.cs new file mode 100644 index 0000000000..7589cc8971 --- /dev/null +++ b/Content.Shared/Xenoarchaeology/Equipment/SharedNodeScannerSystem.cs @@ -0,0 +1,120 @@ +using Content.Shared.Interaction; +using Content.Shared.NameIdentifier; +using Content.Shared.Timing; +using Content.Shared.Verbs; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Equipment.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Xenoarchaeology.Equipment; + +/// Controls behaviour of artifact node scanner device. +public abstract class SharedNodeScannerSystem : EntitySystem +{ + [Dependency] private readonly UseDelaySystem _useDelay = default!; + [Dependency] private readonly SharedXenoArtifactSystem _artifact = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnBeforeRangedInteract); + SubscribeLocalEvent>(AddScanVerb); + } + + private void OnBeforeRangedInteract(EntityUid uid, NodeScannerComponent component, BeforeRangedInteractEvent args) + { + if (args.Handled || !args.CanReach || args.Target is not { } target) + return; + + Entity unlockingEnt = TryComp(target, out var unlockingComponent) + ? (target, unlockingComponent) + : (target, null); + + TryMakeActiveNodesSnapshot((uid, component), unlockingEnt, args.User); + + args.Handled = true; + } + + private void AddScanVerb(EntityUid uid, NodeScannerComponent component, GetVerbsEvent args) + { + if (!args.CanAccess) + return; + + if (!TryComp(args.Target, out var unlockingComponent)) + return; + + var verb = new UtilityVerb + { + Act = () => + { + TryMakeActiveNodesSnapshot((uid, component), (args.Target, unlockingComponent), args.User); + }, + Text = Loc.GetString("node-scan-tooltip") + }; + + args.Verbs.Add(verb); + } + + private void TryMakeActiveNodesSnapshot( + Entity device, + Entity unlockingEnt, + EntityUid actor + ) + { + if (!_timing.IsFirstTimePredicted) + return; + + if (TryComp(device, out UseDelayComponent? useDelay) + && !_useDelay.TryResetDelay((device, useDelay), true)) + return; + + if (!TryComp(unlockingEnt.Owner, out var artifactComponent)) + return; + + TryOpenUi(device, actor); + + TimeSpan? waitTime = null; + HashSet triggeredNodeNames; + ArtifactState artifactState; + if (unlockingEnt.Comp == null) + { + triggeredNodeNames = new HashSet(); + var timeToUnlockAvailable = artifactComponent.NextUnlockTime - _timing.CurTime; + if (timeToUnlockAvailable > TimeSpan.Zero) + { + artifactState = ArtifactState.Cooldown; + waitTime = timeToUnlockAvailable; + } + else + { + artifactState = ArtifactState.Ready; + } + } + else + { + var triggeredIndexes = unlockingEnt.Comp.TriggeredNodeIndexes; + triggeredNodeNames = new HashSet(triggeredIndexes.Count); + + foreach (var triggeredIndex in triggeredIndexes) + { + var node = _artifact.GetNode((unlockingEnt.Owner, artifactComponent), triggeredIndex); + var triggeredNodeName = (CompOrNull(node)?.Identifier ?? 0).ToString("D3"); + triggeredNodeNames.Add(triggeredNodeName); + } + + artifactState = ArtifactState.Unlocking; + waitTime = _timing.CurTime - unlockingEnt.Comp.EndTime; + } + + device.Comp.ArtifactState = artifactState; + device.Comp.WaitTime = waitTime; + device.Comp.TriggeredNodesSnapshot = triggeredNodeNames; + device.Comp.ScannedAt = _timing.CurTime; + + Dirty(device); + } + + protected abstract void TryOpenUi(Entity device, EntityUid actor); +} diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/SuppressArtifactContainerSystem.cs b/Content.Shared/Xenoarchaeology/Equipment/SuppressArtifactContainerSystem.cs similarity index 54% rename from Content.Server/Xenoarchaeology/Equipment/Systems/SuppressArtifactContainerSystem.cs rename to Content.Shared/Xenoarchaeology/Equipment/SuppressArtifactContainerSystem.cs index 4278af409a..4076274ca2 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/SuppressArtifactContainerSystem.cs +++ b/Content.Shared/Xenoarchaeology/Equipment/SuppressArtifactContainerSystem.cs @@ -1,12 +1,13 @@ -using Content.Server.Xenoarchaeology.Equipment.Components; -using Content.Server.Xenoarchaeology.XenoArtifacts; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using Content.Shared.Xenoarchaeology.Equipment.Components; using Robust.Shared.Containers; -namespace Content.Server.Xenoarchaeology.Equipment.Systems; +namespace Content.Shared.Xenoarchaeology.Equipment; public sealed class SuppressArtifactContainerSystem : EntitySystem { - [Dependency] private readonly ArtifactSystem _artifact = default!; + [Dependency] private readonly SharedXenoArtifactSystem _xenoArtifact = default!; public override void Initialize() { @@ -17,17 +18,17 @@ public sealed class SuppressArtifactContainerSystem : EntitySystem private void OnInserted(EntityUid uid, SuppressArtifactContainerComponent component, EntInsertedIntoContainerMessage args) { - if (!TryComp(args.Entity, out var artifact)) + if (!TryComp(args.Entity, out var artifact)) return; - _artifact.SetIsSuppressed(args.Entity, true, artifact); + _xenoArtifact.SetSuppressed((args.Entity, artifact), true); } private void OnRemoved(EntityUid uid, SuppressArtifactContainerComponent component, EntRemovedFromContainerMessage args) { - if (!TryComp(args.Entity, out var artifact)) + if (!TryComp(args.Entity, out var artifact)) return; - _artifact.SetIsSuppressed(args.Entity, false, artifact); + _xenoArtifact.SetSuppressed((args.Entity, artifact), false); } } diff --git a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactEffectPrototype.cs b/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactEffectPrototype.cs deleted file mode 100644 index 4ba4d0d43a..0000000000 --- a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactEffectPrototype.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Content.Shared.Item; -using Content.Shared.Whitelist; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; - -namespace Content.Shared.Xenoarchaeology.XenoArtifacts; - -/// -/// This is a prototype for... -/// -[Prototype] -[DataDefinition] -public sealed partial class ArtifactEffectPrototype : IPrototype -{ - /// - [IdDataField] - public string ID { get; private set; } = default!; - - /// - /// Components that are added to the artifact when the specfic effect is active. - /// These are removed after the node is exited and the effect is changed. - /// - [DataField("components", serverOnly: true)] - public ComponentRegistry Components = new(); - - /// - /// Components that are permanently added to an entity when the effect's node is entered. - /// - [DataField("permanentComponents")] - public ComponentRegistry PermanentComponents = new(); - - //TODO: make this a list so we can have multiple target depths - [DataField("targetDepth")] - public int TargetDepth = 0; - - [DataField("effectHint")] - public string? EffectHint; - - [DataField("whitelist")] - public EntityWhitelist? Whitelist; - - [DataField("blacklist")] - public EntityWhitelist? Blacklist; -} diff --git a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactTriggerPrototype.cs b/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactTriggerPrototype.cs deleted file mode 100644 index 53ade6a5c6..0000000000 --- a/Content.Shared/Xenoarchaeology/XenoArtifacts/ArtifactTriggerPrototype.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Content.Shared.Item; -using Content.Shared.Whitelist; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; - -namespace Content.Shared.Xenoarchaeology.XenoArtifacts; - -/// -/// This is a prototype for... -/// -[Prototype] -[DataDefinition] -public sealed partial class ArtifactTriggerPrototype : IPrototype -{ - /// - [IdDataField] - public string ID { get; private set; } = default!; - - [DataField("components", serverOnly: true)] - public ComponentRegistry Components = new(); - - [DataField("targetDepth")] - public int TargetDepth = 0; - - [DataField("triggerHint")] - public string? TriggerHint; - - [DataField("whitelist")] - public EntityWhitelist? Whitelist; - - [DataField("blacklist")] - public EntityWhitelist? Blacklist; -} diff --git a/Content.Shared/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs b/Content.Shared/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs index 77b381b0b5..ff10ec628b 100644 --- a/Content.Shared/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs +++ b/Content.Shared/Xenoarchaeology/XenoArtifacts/RandomArtifactSpriteComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Xenoarchaeology.XenoArtifacts; +namespace Content.Shared.Xenoarchaeology.XenoArtifacts; [RegisterComponent] public sealed partial class RandomArtifactSpriteComponent : Component @@ -10,7 +10,7 @@ public sealed partial class RandomArtifactSpriteComponent : Component public int MaxSprite = 14; [DataField("activationTime")] - public double ActivationTime = 2.0; + public double ActivationTime = 0.4; public TimeSpan? ActivationStart; } diff --git a/Content.Shared/Xenoarchaeology/XenoArtifacts/SharedArtifact.cs b/Content.Shared/Xenoarchaeology/XenoArtifacts/SharedArtifact.cs index f7a69eade3..a434f468eb 100644 --- a/Content.Shared/Xenoarchaeology/XenoArtifacts/SharedArtifact.cs +++ b/Content.Shared/Xenoarchaeology/XenoArtifacts/SharedArtifact.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions; using Robust.Shared.Serialization; namespace Content.Shared.Xenoarchaeology.XenoArtifacts; @@ -7,12 +6,6 @@ namespace Content.Shared.Xenoarchaeology.XenoArtifacts; public enum SharedArtifactsVisuals : byte { SpriteIndex, - IsActivated -} - -/// -/// Raised as an instant action event when a sentient artifact activates itself using an action. -/// -public sealed partial class ArtifactSelfActivateEvent : InstantActionEvent -{ + IsActivated, + IsUnlocking } diff --git a/Resources/Audio/Items/Artifact/artifact-activation-fail1.ogg b/Resources/Audio/Items/Artifact/artifact-activation-fail1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fb9b7e1289b40da9ef5d41440bb8434aa2cd91e1 GIT binary patch literal 16443 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Items/Artifact/artifact-force-activated1.ogg b/Resources/Audio/Items/Artifact/artifact-force-activated1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9ad8cb165919f48d053edb939cf064d03c06deef GIT binary patch literal 9845 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 - [1] Attempts - *[other] attempt - } to activate an artifact - reagent-effect-guidebook-set-solution-temperature-effect = { $chance -> [1] Sets diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl index 35dd42167f..8e9cd073d9 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-analyzer.ftl @@ -1,42 +1,40 @@ -analysis-console-menu-title = analysis console -analysis-console-server-list-button = Server List -analysis-console-scan-button = Scan -analysis-console-scan-tooltip-info = Scan artifacts to learn information about their structure. -analysis-console-print-button = Print -analysis-console-print-tooltip-info = Print out the current information about the artifact. -analysis-console-extract-button = Extract -analysis-console-extract-button-info = Extract points from an artifact based on the newly explored nodes. -analysis-console-bias-up = Up -analysis-console-bias-down = Down -analysis-console-bias-button-info-up = Toggles the bias an artifact has in moving between its nodes. Up heads toward zero depth. -analysis-console-bias-button-info-down = Toggles the bias an artifact has in moving between its nodes. Down heads toward ever-higher depths. +analysis-console-menu-title = Broad-Spectrum Mark 3 Analysis Console +analysis-console-server-list-button = Server +analysis-console-extract-button = Extract points analysis-console-info-no-scanner = No analyzer connected! Please connect one using a multitool. -analysis-console-info-no-artifact = No artifact present! Place one on the pad then scan for information. +analysis-console-info-no-artifact = No artifact present! Place one on the pad to view node information. analysis-console-info-ready = Systems operational. Ready to scan. -analysis-console-info-id = NODE_ID: {$id} -analysis-console-info-depth = DEPTH: {$depth} -analysis-console-info-triggered-true = ACTIVATED: TRUE -analysis-console-info-triggered-false = ACTIVATED: FALSE -analysis-console-info-effect = REACTION: {$effect} -analysis-console-info-trigger = STIMULUS: {$trigger} -analysis-console-info-edges = EDGES: {$edges} -analysis-console-info-value = UNEXTRACTED_VALUE: {$value} - +analysis-console-no-node = Select node to view +analysis-console-info-id = [font="Monospace" size=11]ID:[/font] +analysis-console-info-id-value = [font="Monospace" size=11][color=yellow]{$id}[/color][/font] +analysis-console-info-class = [font="Monospace" size=11]Class:[/font] +analysis-console-info-class-value = [font="Monospace" size=11]{$class}[/font] +analysis-console-info-locked = [font="Monospace" size=11]Status:[/font] +analysis-console-info-locked-value = [font="Monospace" size=11][color={ $state -> + [0] red]Locked + [1] lime]Unlocked + *[2] plum]Active +}[/color][/font] +analysis-console-info-durability = [font="Monospace" size=11]Durability:[/font] +analysis-console-info-durability-value = [font="Monospace" size=11][color={$color}]{$current}/{$max}[/color][/font] +analysis-console-info-effect = [font="Monospace" size=11]Effect:[/font] +analysis-console-info-effect-value = [font="Monospace" size=11][color=gray]{ $state -> + [true] {$info} + *[false] Unlock nodes to gain info +}[/color][/font] +analysis-console-info-trigger = [font="Monospace" size=11]Triggers:[/font] +analysis-console-info-triggered-value = [font="Monospace" size=11][color=gray]{$triggers}[/color][/font] analysis-console-info-scanner = Scanning... analysis-console-info-scanner-paused = Paused. analysis-console-progress-text = {$seconds -> [one] T-{$seconds} second *[other] T-{$seconds} seconds } -analysis-console-no-server-connected = Cannot extract. No server connected. -analysis-console-no-artifact-placed = No artifact on scanner. -analysis-console-no-points-to-extract = No points to extract. -analyzer-artifact-component-upgrade-analysis = analysis duration +analysis-console-extract-value = [font="Monospace" size=11][color=orange]Node {$id} (+{$value})[/color][/font] +analysis-console-extract-none = [font="Monospace" size=11][color=orange] No unlocked nodes have any points left to extract [/color][/font] +analysis-console-extract-sum = [font="Monospace" size=11][color=orange]Total Research: {$value}[/color][/font] -analysis-console-print-popup = The console printed out a report. analyzer-artifact-extract-popup = Energy shimmers on the artifact's surface! - -analysis-report-title = Artifact Report: Node {$id} diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl index debb365304..b083d33f35 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl @@ -1,4 +1,27 @@ -### Verbs +### Commands +cmd-unlocknode-desc = Unlocks a node on a given artifact +cmd-unlocknode-help = unlocknode +cmd-parse-failure-unlocknode-arg-num = Incorrect number of args +cmd-parse-failure-unlocknode-invalid-entity = Provided netEntity is not valid node +### Verbs artifact-verb-make-always-active = Make artifact always active artifact-verb-activate = Activate artifact + +### Unlocking +artifact-unlock-state-begin = It begins to shift in strange ways... +artifact-unlock-state-end-success = It slows down, visibly changed. +artifact-unlock-state-end-failure = It slows down before uneventfully stopping. + +### Activation +artifact-activation-fail = Nothing happens... + +### Misc. +artifact-examine-trigger-desc = [color=gray][italic]Am I on your mind?[/italic][/color] + +artifact-node-class-1 = [color=#ff2bb1]Hylic[/color] +artifact-node-class-2 = [color=#ff8b2b]Psychic[/color] +artifact-node-class-3 = [color=#a9ff38]Pneumatic[/color] +artifact-node-class-4 = [color=#2bfff8]Archon[/color] +artifact-node-class-5 = [color=#7883ff]Luminary[/color] +artifact-node-class-6 = [color=#be78ff]Demiurge[/color] diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl index c38016b1ca..23abad3383 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl @@ -42,3 +42,40 @@ artifact-trigger-hint-land = Active deceleration artifact-trigger-hint-examine = Examination artifact-trigger-hint-medical = Therapeutic chemicals +xenoarch-trigger-tip-music = Harmonical sound vibrations +xenoarch-trigger-tip-heat = High temperature gas +xenoarch-trigger-tip-cold = Low temperature gas +xenoarch-trigger-tip-no-oxygen = Oxygen-free environment +xenoarch-trigger-tip-water = Water +xenoarch-trigger-tip-co2 = Carbon dioxide +xenoarch-trigger-tip-plasma = Non-solid plasma +xenoarch-trigger-tip-tritium = Tritium +xenoarch-trigger-tip-ammonia = Ammonia +xenoarch-trigger-tip-n2o = Nitrous oxide +xenoarch-trigger-tip-frezon = Frezon +xenoarch-trigger-tip-radiation = Radiation +xenoarch-trigger-tip-brute-damage = Physical damage +xenoarch-trigger-tip-interaction = Physical interaction +xenoarch-trigger-tip-wrenching = Tightening +xenoarch-trigger-tip-prying = Prying +xenoarch-trigger-tip-screwing = Screwing +xenoarch-trigger-tip-pulsing = Pulsing +xenoarch-trigger-tip-pressure-low = Low pressure +xenoarch-trigger-tip-pressure-high = High pressure +xenoarch-trigger-tip-examine = Close inspection +xenoarch-trigger-tip-timer = Regular self-activation +xenoarch-trigger-tip-blood = Blood +xenoarch-trigger-tip-throw = Being thrown +xenoarch-trigger-tip-death = Death +xenoarch-trigger-tip-magnet = Magnetic waves + +### Description hints +xenoarch-trigger-examine-wrenching = There's a loose bit spinning around. +xenoarch-trigger-examine-prying = There's a panel coming up from the surface. +xenoarch-trigger-examine-screwing = There's a raised section with a small inset on it. +xenoarch-trigger-examine-pulsing = An exposed diode pokes out of the artifact's surface. +xenoarch-trigger-examine-timer = Carvings and scratches cover the surface... You can just barely make out a number: [italic]{$time}[/italic] + +### Effects hints +xenoarch-effect-puddle = Produces puddle of following reagents: {$reagent} +xenoarch-effect-foam = Produces foam of following reagents: {$reagent} diff --git a/Resources/Locale/en-US/xenoarchaeology/node-scanner.ftl b/Resources/Locale/en-US/xenoarchaeology/node-scanner.ftl index 4a05414c46..f43843203e 100644 --- a/Resources/Locale/en-US/xenoarchaeology/node-scanner.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/node-scanner.ftl @@ -1,2 +1,9 @@ -node-scan-popup = The node ID is {$id} -node-scan-tooltip = Scan artifact +node-scan-tooltip = Scan active nodes +node-scan-no-data = No active node data found +node-scan-display-title = Node scanner + +node-scanner-artifact-scanned-time = Artifact last scanned at {$time} +node-scanner-artifact-state-ready = Artifact is ready for interaction +node-scanner-artifact-state-unlocking = Artifact is resonating with your actions +node-scanner-artifact-state-cooldown = Artifact is resting +node-scanner-artifact-scanned-time-none = Scan artifact to see current state diff --git a/Resources/Maps/Shuttles/ShuttleEvent/incorporation.yml b/Resources/Maps/Shuttles/ShuttleEvent/incorporation.yml index 75362b414e..bbcef8f933 100644 --- a/Resources/Maps/Shuttles/ShuttleEvent/incorporation.yml +++ b/Resources/Maps/Shuttles/ShuttleEvent/incorporation.yml @@ -5292,8 +5292,7 @@ entities: components: - type: Transform parent: 766 - - type: Artifact - isSuppressed: True + - type: XenoArtifact - type: Physics canCollide: False - type: InsideEntityStorage @@ -5301,8 +5300,7 @@ entities: components: - type: Transform parent: 768 - - type: Artifact - isSuppressed: True + - type: XenoArtifact - type: Physics canCollide: False - type: InsideEntityStorage @@ -5312,14 +5310,12 @@ entities: rot: 1.5707963267948966 rad pos: -5.5242987,-12.5 parent: 1 - - type: BiasedArtifact - uid: 789 components: - type: Transform rot: 1.5707963267948966 rad pos: 6.506952,-12.5 parent: 1 - - type: BiasedArtifact - proto: VendingMachineMedical entities: - uid: 230 diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index aa378d8861..b1c68f9d0e 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -216,18 +216,6 @@ useDelay: 30 event: !type:VendingMachineSelfDispenseEvent -- type: entity - id: ActionArtifactActivate - name: Activate Artifact - description: Immediately activates your current artifact node. - components: - - type: InstantAction - icon: - sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi - state: ano01 - useDelay: 60 - event: !type:ArtifactSelfActivateEvent - - type: entity id: ActionToggleBlock name: Block diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index b96ce86df3..450d8ec618 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -7,7 +7,7 @@ amount: 1 whitelist: components: - - Artifact + - XenoArtifact - type: cargoBounty id: BountyBaseballBat diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml index 7053eda226..27084003ee 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml @@ -46,7 +46,7 @@ capacity: 1 whitelist: components: - - Artifact + - XenoArtifact - type: Weldable - type: SuppressArtifactContainer - type: RadiationBlockingContainer diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_xenoartifacts.yml similarity index 73% rename from Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml rename to Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_xenoartifacts.yml index 2241cdd4aa..00c6abf362 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_xenoartifacts.yml @@ -1,27 +1,29 @@ - type: entity - parent: BaseItem + parent: [BaseItem, BaseXenoArtifact] id: BaseXenoArtifactItem - name: alien artifact - description: A strange handheld alien device. + name: artifact + description: A strange artifact from time unknown. Looks like a good time. Fits in hand perfectly. abstract: true + noSpawn: true components: + # Visual - type: Sprite sprite: Objects/Specific/Xenoarchaeology/item_artifacts.rsi layers: - state: ano01 map: [ "enum.ArtifactsVisualLayers.Base" ] - state: ano01_on - map: [ "enum.ArtifactsVisualLayers.Effect" ] + map: [ "enum.ArtifactsVisualLayers.UnlockingEffect" ] + visible: false + - state: artifact-activation + sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi + map: [ "enum.ArtifactsVisualLayers.ActivationEffect" ] visible: false - - type: Damageable - type: Physics bodyType: Dynamic - type: CollisionWake enabled: false - type: InteractionOutline - - type: Reactive - groups: - Acidic: [Touch] - type: Fixtures fixtures: fix1: @@ -35,73 +37,71 @@ - Opaque restitution: 0.3 # fite me friction: 0.2 - - type: Artifact - type: RandomArtifactSprite maxSprite: 11 activationTime: 2.4 - type: RandomSprite available: - - enum.ArtifactsVisualLayers.Effect: + - enum.ArtifactsVisualLayers.UnlockingEffect: ano01_on: Rainbow - - type: UserInterface #needs to be here for certain effects - interfaces: - enum.StorageUiKey.Key: - type: StorageBoundUserInterface - enum.TransferAmountUiKey.Key: - type: TransferAmountBoundUserInterface - enum.InstrumentUiKey.Key: - type: InstrumentBoundUserInterface - enum.IntercomUiKey.Key: - type: IntercomBoundUserInterface - - type: Appearance + # gameplay interactions - type: Item size: Normal sprite: Objects/Specific/Xenoarchaeology/item_artifacts.rsi heldPrefix: ano01 - - type: Actions - type: Construction graph: Artifact node: done - - type: GuideHelp - guides: - - Xenoarchaeology + - type: XenoArtifact + effectsTable: !type:GroupSelector + children: + - !type:NestedSelector + tableId: XenoArtifactEffectsDefaultTable + weight: 54 + - !type:NestedSelector + tableId: XenoArtifactEffectsHandheldOnlyTable + weight: 2 - type: entity parent: BaseXenoArtifactItem id: SimpleXenoArtifactItem - suffix: Simple + suffix: hand-sized Simple components: - - type: Artifact - nodesMin: 2 - nodesMax: 5 + - type: XenoArtifact + nodeCount: + min: 2 + max: 5 - type: entity parent: BaseXenoArtifactItem id: MediumXenoArtifactItem - suffix: Medium + suffix: hand-sized Medium components: - - type: Artifact - nodesMin: 5 - nodesMax: 9 + - type: XenoArtifact + nodeCount: + min: 5 + max: 9 - type: entity parent: BaseXenoArtifactItem id: ComplexXenoArtifactItem - suffix: Complex + suffix: hand-sized Complex components: - - type: Artifact - nodesMin: 9 - nodesMax: 13 + - type: XenoArtifact + nodeCount: + min: 9 + max: 13 # this exists for crafting item artifacts so that the final result can be simple, medium, or complex. - type: entity parent: BaseXenoArtifactItem id: VariedXenoArtifactItem - suffix: Varied + suffix: hand-sized Varied components: - - type: Artifact - nodesMin: 2 - nodesMax: 13 + - type: XenoArtifact + nodeCount: + min: 2 + max: 13 - type: entity id: ArtifactFragment diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/node_scanner.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/node_scanner.yml index 7406555fe3..788374618c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/node_scanner.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/node_scanner.yml @@ -11,7 +11,14 @@ sprite: Objects/Specific/Xenoarchaeology/node_scanner.rsi - type: NodeScanner - type: UseDelay - delay: 3 + delay: 1 - type: GuideHelp guides: - ArtifactReports + - type: ActivatableUI + key: enum.NodeScannerUiKey.Key + singleUser: true + - type: UserInterface #needs to be here for certain effects + interfaces: + enum.NodeScannerUiKey.Key: + type: NodeScannerBoundUserInterface diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml deleted file mode 100644 index 68947c0a71..0000000000 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml +++ /dev/null @@ -1,94 +0,0 @@ -- type: entity - parent: BaseStructureDynamic - id: BaseXenoArtifact - name: alien artifact - description: A strange alien device. - abstract: true - components: - - type: Sprite - drawdepth: SmallObjects - sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi - noRot: true - layers: - - state: ano30 - map: [ "enum.ArtifactsVisualLayers.Base" ] - - state: ano30_on - map: [ "enum.ArtifactsVisualLayers.Effect" ] - visible: false - - type: Damageable - - type: Physics - bodyType: Dynamic - - type: Transform - noRot: true - - type: UserInterface #needs to be here for certain effects - interfaces: - enum.StorageUiKey.Key: - type: StorageBoundUserInterface - enum.TransferAmountUiKey.Key: - type: TransferAmountBoundUserInterface - enum.InstrumentUiKey.Key: - type: InstrumentBoundUserInterface - enum.IntercomUiKey.Key: - type: IntercomBoundUserInterface - - type: Reactive - groups: - Acidic: [Touch] - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.45 - density: 75 - layer: # doesn't collide with artifact storage - - Opaque - mask: - - MachineMask - - type: InteractionOutline - - type: Artifact - - type: RandomArtifactSprite - maxSprite: 36 - - type: RandomSprite - available: - - enum.ArtifactsVisualLayers.Effect: - ano01_on: Rainbow - - type: Appearance - - type: Actions - - type: GuideHelp - guides: - - Xenoarchaeology - - type: StealTarget - stealGroup: XenoArtifact - - type: ContainerContainer - containers: - storagebase: !type:Container # needed for the EffectStorage artifactEffect - ents: [ ] - revolver-ammo: !type:Container # needed for the EffectBigIron artifactEffect - -- type: entity - parent: BaseXenoArtifact - id: SimpleXenoArtifact - suffix: Simple - components: - - type: Artifact - nodesMin: 2 - nodesMax: 5 - -- type: entity - parent: BaseXenoArtifact - id: MediumXenoArtifact - suffix: Medium - components: - - type: Artifact - nodesMin: 5 - nodesMax: 9 - -- type: entity - parent: BaseXenoArtifact - id: ComplexXenoArtifact - suffix: Complex - components: - - type: Artifact - nodesMin: 9 - nodesMax: 13 - diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_xenoartifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_xenoartifacts.yml new file mode 100644 index 0000000000..0b3d95777d --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_xenoartifacts.yml @@ -0,0 +1,71 @@ +- type: entity + parent: [BaseStructureDynamic, BaseXenoArtifact] + id: BaseXenoArtifactStructure + name: artifact + abstract: true + noSpawn: true + components: + # Visual + - type: Sprite + drawdepth: SmallObjects + sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi + noRot: true + layers: + - state: ano30 + map: [ "enum.ArtifactsVisualLayers.Base" ] + - state: ano30_on + map: [ "enum.ArtifactsVisualLayers.UnlockingEffect" ] + visible: false + - state: artifact-activation + map: [ "enum.ArtifactsVisualLayers.ActivationEffect" ] + visible: false + - type: RandomArtifactSprite + maxSprite: 36 + - type: RandomSprite + available: + - enum.ArtifactsVisualLayers.UnlockingEffect: + ano01_on: Rainbow + - type: Transform + noRot: true + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.45 + density: 75 + layer: # doesn't collide with artifact storage + - Opaque + mask: + - MachineMask + +- type: entity + parent: BaseXenoArtifactStructure + id: SimpleXenoArtifact + suffix: Simple + components: + - type: XenoArtifact + nodeCount: + min: 2 + max: 5 + +- type: entity + parent: BaseXenoArtifactStructure + id: MediumXenoArtifact + suffix: Medium + components: + - type: XenoArtifact + nodeCount: + min: 5 + max: 9 + +- type: entity + parent: BaseXenoArtifactStructure + id: ComplexXenoArtifact + suffix: Complex + components: + - type: XenoArtifact + nodeCount: + min: 9 + max: 13 + diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/xenoartifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/xenoartifacts.yml new file mode 100644 index 0000000000..b9db84b58e --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/xenoartifacts.yml @@ -0,0 +1,43 @@ +- type: entity + id: BaseXenoArtifact + name: artifact + description: A strange artifact from time unknown. Looks like a good time. + abstract: true + noSpawn: true + components: + # Visual + - type: Appearance + - type: InteractionOutline + - type: UserInterface #needs to be here for certain effects + interfaces: + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.IntercomUiKey.Key: + type: IntercomBoundUserInterface + - type: GuideHelp + guides: + - Xenoarchaeology + # gameplay interactions + - type: XenoArtifact + effectsTable: !type:NestedSelector + tableId: XenoArtifactEffectsDefaultTable + - type: Damageable + - type: Actions + - type: Physics + bodyType: Dynamic + - type: UseDelay + - type: StealTarget + stealGroup: XenoArtifact + - type: ContainerContainer + containers: + node-container: !type:Container + showEnts: False + occludes: True + ents: [] + # These components are needed for certain triggers to work. + - type: RadiationReceiver + - type: Reactive diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 0f502e83f0..93125455bc 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -532,7 +532,6 @@ state: generic_panel_open - type: ResearchClient - type: AnalysisConsole - reportEntityId: PaperArtifactAnalyzer - type: DeviceList - type: DeviceNetwork deviceNetId: Wired @@ -541,10 +540,10 @@ ports: - ArtifactAnalyzerSender - type: ActivatableUI - key: enum.ArtifactAnalzyerUiKey.Key + key: enum.ArtifactAnalyzerUiKey.Key - type: UserInterface interfaces: - enum.ArtifactAnalzyerUiKey.Key: + enum.ArtifactAnalyzerUiKey.Key: type: AnalysisConsoleBoundUserInterface enum.ResearchClientUiKey.Key: type: ResearchClientBoundUserInterface diff --git a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml index b9efefdf75..d4fc8263a8 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml @@ -51,11 +51,10 @@ powerLoad: 12000 needsPower: false #only turns on when scanning - type: ArtifactAnalyzer - - type: TraversalDistorter - type: ItemPlacer whitelist: components: - - Artifact + - XenoArtifact - type: DeviceNetwork deviceNetId: Wired receiveFrequencyId: BasicDevice @@ -90,7 +89,7 @@ - type: ArtifactCrusher crushingWhitelist: components: - - Artifact + - XenoArtifact crushingDamage: types: Blunt: 10 @@ -127,7 +126,7 @@ capacity: 1 whitelist: components: - - Artifact + - XenoArtifact tags: - CanPilot # People - VimPilot # Pets diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index 769b7748f3..be5473fb8c 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -72,14 +72,6 @@ damage: types: Caustic: 2 - reactiveEffects: - Acidic: - methods: [ Touch ] - effects: - - !type:ActivateArtifact - conditions: - - !type:ReagentThreshold - min: 5 - type: reagent id: Benzene diff --git a/Resources/Prototypes/SoundCollections/artifact.yml b/Resources/Prototypes/SoundCollections/artifact.yml index 9584a019a5..d6a65487d9 100644 --- a/Resources/Prototypes/SoundCollections/artifact.yml +++ b/Resources/Prototypes/SoundCollections/artifact.yml @@ -1,5 +1,5 @@ - type: soundCollection - id: ArtifactActivation + id: ArtifactUnlockingActivationSuccess files: - /Audio/Items/Artifact/artifact1.ogg - /Audio/Items/Artifact/artifact2.ogg @@ -8,3 +8,13 @@ - /Audio/Items/Artifact/artifact5.ogg - /Audio/Items/Artifact/artifact6.ogg - /Audio/Items/Artifact/artifact7.ogg + +- type: soundCollection + id: ArtifactUnlockActivationFailure + files: + - /Audio/Items/Artifact/artifact-activation-fail1.ogg + +- type: soundCollection + id: ArtifactForceActivation + files: + - /Audio/Items/Artifact/artifact-force-activated1.ogg diff --git a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml deleted file mode 100644 index f2723e5369..0000000000 --- a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml +++ /dev/null @@ -1,679 +0,0 @@ -- type: artifactEffect - id: EffectBadFeeling - targetDepth: 0 - effectHint: artifact-effect-hint-mental - components: - - type: TelepathicArtifact - messages: - - badfeeling-artifact-1 - - badfeeling-artifact-2 - - badfeeling-artifact-3 - - badfeeling-artifact-4 - - badfeeling-artifact-5 - - badfeeling-artifact-6 - - badfeeling-artifact-7 - - badfeeling-artifact-8 - - badfeeling-artifact-9 - - badfeeling-artifact-10 - - badfeeling-artifact-11 - - badfeeling-artifact-12 - - badfeeling-artifact-13 - - badfeeling-artifact-14 - - badfeeling-artifact-15 - drastic: - - badfeeling-artifact-drastic-1 - - badfeeling-artifact-drastic-2 - - badfeeling-artifact-drastic-3 - - badfeeling-artifact-drastic-4 - - badfeeling-artifact-drastic-5 - - badfeeling-artifact-drastic-6 - -- type: artifactEffect - id: EffectGoodFeeling - targetDepth: 0 - effectHint: artifact-effect-hint-mental - components: - - type: TelepathicArtifact - messages: - - goodfeeling-artifact-1 - - goodfeeling-artifact-2 - - goodfeeling-artifact-3 - - goodfeeling-artifact-4 - - goodfeeling-artifact-5 - - goodfeeling-artifact-6 - - goodfeeling-artifact-7 - - goodfeeling-artifact-8 - - goodfeeling-artifact-9 - - goodfeeling-artifact-10 - - goodfeeling-artifact-11 - - goodfeeling-artifact-12 - - goodfeeling-artifact-13 - - goodfeeling-artifact-14 - drastic: - - goodfeeling-artifact-drastic-1 - - goodfeeling-artifact-drastic-2 - - goodfeeling-artifact-drastic-3 - - goodfeeling-artifact-drastic-4 - - goodfeeling-artifact-drastic-5 - - goodfeeling-artifact-drastic-6 - -- type: artifactEffect - id: EffectJunkSpawn - targetDepth: 0 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 10 - spawns: - - id: FoodPacketSyndiTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketSemkiTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketBoritosTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketCheesieTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketChipsTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketChocolateTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketEnergyTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketPopcornTrash - prob: 0.1 - orGroup: Trash - - id: FoodPacketRaisinsTrash - prob: 0.1 - orGroup: Trash - - id: ToySpawner - prob: 0.1 - orGroup: Trash - -- type: artifactEffect - id: EffectLightFlicker - targetDepth: 0 - effectHint: artifact-effect-hint-electrical-interference - components: - - type: LightFlickerArtifact - -- type: artifactEffect - id: EffectPointLight - targetDepth: 0 - components: - - type: PointLight - radius: 8 - energy: 10 - color: "#daa3fd" - - type: TriggerArtifact - - type: FlashOnTrigger - range: 8 - -- type: artifactEffect #bornana - id: EffectBananaSpawn - targetDepth: 0 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 20 - spawns: - - id: FoodBanana - amount: 3 - maxAmount: 6 - - type: ChemicalPuddleArtifact - chemicalSolution: - maxVol: 100 - canReact: false - possibleChemicals: - - Potassium - -- type: artifactEffect - id: EffectFloraSpawn - targetDepth: 1 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 3 - spawns: - - id: RandomFloraTree - -- type: artifactEffect - id: EffectThrow - targetDepth: 0 - effectHint: artifact-effect-hint-environment - components: - - type: ThrowArtifact - -- type: artifactEffect - id: EffectChemicalPuddle - targetDepth: 0 - effectHint: artifact-effect-hint-biochemical - components: - - type: ChemicalPuddleArtifact - chemicalSolution: - maxVol: 500 - canReact: false - possibleChemicals: - - Aluminium - - Carbon - - Chlorine - - Copper - - Ethanol - - Fluorine - - Sugar - - Hydrogen - - Iodine - - Iron - - Lithium - - Mercury - - Nitrogen - - Oxygen - - Phosphorus - - Potassium - - Radium - - Silicon - - Sodium - - Water - - Sulfur - -- type: artifactEffect - id: EffectCold - targetDepth: 1 - effectHint: artifact-effect-hint-consumption - components: - - type: TemperatureArtifact - targetTemp: 50 - -- type: artifactEffect - id: EffectHeat - targetDepth: 1 - effectHint: artifact-effect-hint-release - components: - - type: TemperatureArtifact - targetTemp: 500 - -- type: artifactEffect - id: EffectFoamMild - targetDepth: 1 - effectHint: artifact-effect-hint-biochemical - components: - - type: FoamArtifact - reagents: - - Oxygen - - Plasma - - Blood - - SpaceCleaner - - Nutriment - - SpaceLube - - Ethanol - - Mercury - - VentCrud - - WeldingFuel - - JuiceThatMakesYouWeh - -- type: artifactEffect - id: EffectInstrumentSpawn - targetDepth: 1 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 5 - spawns: - - id: RandomInstruments - -- type: artifactEffect - id: EffectMonkeySpawn - targetDepth: 1 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - spawns: - - id: MobMonkey - orGroup: monkey - prob: 0.95 - - id: MobGorilla #harambe - orGroup: monkey - prob: 0.05 - -- type: artifactEffect - id: EffectChargeBatteries - targetDepth: 1 - effectHint: artifact-effect-hint-release - components: - - type: ChargeBatteryArtifact - - type: TelepathicArtifact - messages: - - charge-artifact-popup - -- type: artifactEffect - id: EffectRadiate - targetDepth: 1 - effectHint: artifact-effect-hint-release - components: - - type: RadiationSource - intensity: 1 - slope: 0.3 - -- type: artifactEffect - id: EffectKnock - targetDepth: 1 - effectHint: artifact-effect-hint-electrical-interference - components: - - type: KnockArtifact - -- type: artifactEffect - id: EffectMagnet - targetDepth: 1 - effectHint: artifact-effect-hint-magnet - components: - - type: GravityWell - maxRange: 3 - baseRadialAcceleration: 1 - baseTangentialAcceleration: 3 - -- type: artifactEffect - id: EffectAntiMagnet - targetDepth: 1 - effectHint: artifact-effect-hint-magnet - components: - - type: GravityWell - maxRange: 3 - baseRadialAcceleration: -1 - baseTangentialAcceleration: -3 - -- type: artifactEffect - id: EffectInvisibility - targetDepth: 2 - effectHint: artifact-effect-hint-visual - components: - - type: Stealth - hadOutline: true - - type: StealthOnMove - passiveVisibilityRate: -0.10 - movementVisibilityRate: 0.10 - -- type: artifactEffect - id: EffectExplosionScary - targetDepth: 2 - effectHint: artifact-effect-hint-environment - components: - - type: TriggerArtifact - - type: ExplodeOnTrigger - - type: Explosive - deleteAfterExplosion: false - explosionType: Radioactive - totalIntensity: 300 - intensitySlope: 2 - maxIntensity: 1.5 - canCreateVacuum: false - -- type: artifactEffect - id: EffectRareMaterialSpawn - targetDepth: 2 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - spawns: - - id: SilverOre1 - prob: 0.3 - maxAmount: 3 - - id: PlasmaOre1 - prob: 0.3 - maxAmount: 3 - - id: GoldOre1 - prob: 0.3 - maxAmount: 3 - - id: UraniumOre1 - prob: 0.3 - maxAmount: 3 - -- type: artifactEffect - id: EffectAngryCarpSpawn - targetDepth: 2 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 5 - spawns: - - id: MobCarpHolo - orGroup: carp - - id: MobCarpMagic - orGroup: carp - -- type: artifactEffect - id: EffectFaunaSpawn - targetDepth: 2 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 5 - spawns: - - id: MobAdultSlimesYellowAngry - orGroup: fauna - - id: MobAngryBee - orGroup: fauna - - id: MobBearSpace - orGroup: fauna - - id: MobBee - orGroup: fauna - maxAmount: 5 - - id: MobCat - orGroup: fauna - maxAmount: 2 - - id: MobCatKitten - orGroup: fauna - maxAmount: 2 - - id: MobCorgiPuppy - orGroup: fauna - maxAmount: 2 - - id: MobFox - orGroup: fauna - maxAmount: 1 - - id: MobGoat - orGroup: fauna - maxAmount: 3 - - id: MobKangaroo - orGroup: fauna - maxAmount: 1 - - id: MobKangarooSpace - orGroup: fauna - - id: MobMothroach - orGroup: fauna - maxAmount: 2 - - id: MobMonkeySyndicateAgent #so lucky - orGroup: fauna - maxAmount: 1 - prob: 0.03 - - id: MobMouse - orGroup: fauna - - id: MobParrot - orGroup: fauna - maxAmount: 1 - - id: MobPenguin - orGroup: fauna - maxAmount: 2 - - id: MobPig - orGroup: fauna - maxAmount: 1 - - id: MobPurpleSnake - orGroup: fauna - - id: MobSpiderSpace - orGroup: fauna - - id: MobTick - orGroup: fauna - - id: MobXenoRavager - orGroup: fauna - -- type: artifactEffect - id: EffectCashSpawn - targetDepth: 2 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 10 - spawns: - - id: SpaceCash10 - maxAmount: 5 - prob: 0.75 - - id: SpaceCash100 - maxAmount: 2 - prob: 0.5 - - id: SpaceCash500 - prob: 0.25 - - id: SpaceCash1000 - prob: 0.1 - -- type: artifactEffect - id: EffectShatterWindows - targetDepth: 2 - effectHint: artifact-effect-hint-environment - components: - - type: DamageNearbyArtifact - damageChance: 0.75 - whitelist: - tags: - - Window - damage: - types: - Structural: 200 - -- type: artifactEffect - id: EffectGas - targetDepth: 2 - effectHint: artifact-effect-hint-environment - components: - - type: GasArtifact - possibleGas: - - CarbonDioxide - - Plasma - - Tritium - - Ammonia - - NitrousOxide - - Frezon - -- type: artifactEffect - id: EffectBlink - targetDepth: 2 - effectHint: artifact-effect-hint-displacement - components: - - type: RandomTeleportArtifact - -- type: artifactEffect - id: EffectFoamGood - targetDepth: 2 - effectHint: artifact-effect-hint-biochemical - components: - - type: FoamArtifact - reagents: - - Dermaline - - Arithrazine - - Bicaridine - - Inaprovaline - - Kelotane - - Dexalin - - Omnizine - -- type: artifactEffect - id: EffectChemicalPuddleRare - targetDepth: 2 - effectHint: artifact-effect-hint-biochemical - components: - - type: ChemicalPuddleArtifact - chemicalSolution: - maxVol: 500 - canReact: false - possibleChemicals: - - Dermaline - - Arithrazine - - Bicaridine - - Inaprovaline - - Kelotane - - Dexalin - - Omnizine - - Napalm - - Toxin - - Epinephrine - - Cognizine - - Ultravasculine - - Desoxyephedrine - - Pax - - Siderlac - -- type: artifactEffect - id: EffectEmp - targetDepth: 2 - effectHint: artifact-effect-hint-electrical-interference - components: - - type: EmpArtifact - -- type: artifactEffect - id: EffectPolyMonkey - targetDepth: 2 - effectHint: artifact-effect-hint-polymorph - components: - - type: PolyOthersArtifact - -- type: artifactEffect - id: EffectPolyLizard - targetDepth: 2 - effectHint: artifact-effect-hint-polymorph - components: - - type: PolyOthersArtifact - polymorphPrototypeName: ArtifactLizard - -- type: artifactEffect - id: EffectPolyLuminous - targetDepth: 3 - effectHint: artifact-effect-hint-polymorph - components: - - type: PolyOthersArtifact - polymorphPrototypeName: ArtifactLuminous - -- type: artifactEffect - id: EffectHealAll - targetDepth: 3 - effectHint: artifact-effect-hint-environment - components: - - type: DamageNearbyArtifact - damageChance: 1 - radius: 8 - whitelist: - components: - - MobState - damage: - groups: - Brute: -300 - Burn: -300 - -- type: artifactEffect - id: EffectRadiateStrong - targetDepth: 3 - effectHint: artifact-effect-hint-release - components: - - type: RadiationSource - intensity: 2 - slope: 0.3 - -- type: artifactEffect - id: EffectMaterialSpawn - targetDepth: 3 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 5 - spawns: - - id: SheetSteel - orGroup: materials - - id: SheetGlass - orGroup: materials - - id: SheetPlastic - orGroup: materials - -- type: artifactEffect - id: EffectShuffle - targetDepth: 3 - effectHint: artifact-effect-hint-displacement - components: - - type: ShuffleArtifact - - type: TelepathicArtifact - range: 7.5 - messages: - - shuffle-artifact-popup - -- type: artifactEffect - id: EffectFoamDangerous - targetDepth: 3 - effectHint: artifact-effect-hint-biochemical - components: - - type: FoamArtifact - minFoamAmount: 20 - maxFoamAmount: 30 - reagents: - - Tritium - - Plasma - - SulfuricAcid - - SpaceDrugs - - Nocturine - - MuteToxin - - Napalm - - CarpoToxin - - ChloralHydrate - - Mold - - Amatoxin - -- type: artifactEffect - id: EffectIgnite - targetDepth: 3 - effectHint: artifact-effect-hint-release - components: - - type: IgniteArtifact - range: 7 - minFireStack: 3 - maxFireStack: 6 - -- type: artifactEffect - id: EffectMitosis - targetDepth: 3 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 1 - spawns: - - id: RandomArtifactSpawner - -- type: artifactEffect - id: EffectAnomaly - targetDepth: 3 - effectHint: artifact-effect-hint-creation - components: - - type: SpawnArtifact - maxSpawns: 1 - spawns: - - id: RandomAnomalySpawner - -- type: artifactEffect - id: EffectBoom - targetDepth: 3 - effectHint: artifact-effect-hint-environment - components: - - type: TriggerArtifact - - type: ExplodeOnTrigger - - type: Explosive - deleteAfterExplosion: false - explosionType: Default - totalIntensity: 500 - intensitySlope: 2.5 - maxIntensity: 50 - -- type: artifactEffect - id: EffectPortal - targetDepth: 3 - effectHint: artifact-effect-hint-displacement - components: - - type: PortalArtifact - -- type: artifactEffect - id: EffectSingulo - targetDepth: 10 - effectHint: artifact-effect-hint-destruction - components: - - type: SpawnArtifact - maxSpawns: 1 - spawns: - - id: Singularity - -- type: artifactEffect - id: EffectTesla - targetDepth: 10 - effectHint: artifact-effect-hint-destruction - components: - - type: SpawnArtifact - maxSpawns: 1 - spawns: - - id: TeslaEnergyBall diff --git a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml deleted file mode 100644 index 22581068d2..0000000000 --- a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml +++ /dev/null @@ -1,251 +0,0 @@ -# Utility effects permanently modify the entity in some way when triggered, and they generally make it 'useful' for some purpose, -# like turning the artifact into a tool, or gun, or whatever. -- type: artifactEffect - id: EffectIntercom - targetDepth: 2 - effectHint: artifact-effect-hint-communication - permanentComponents: - - type: RadioMicrophone - powerRequired: false - toggleOnInteract: false - listenRange: 3 - - type: Speech - - type: RadioSpeaker - toggleOnInteract: false - - type: ActivatableUI - key: enum.IntercomUiKey.Key - - type: Intercom - requiresPower: false - supportedChannels: - - Common - - CentCom - - Command - - Engineering - - Medical - - Science - - Security - - Service - - Supply - -- type: artifactEffect - id: EffectRandomInstrument - targetDepth: 2 - effectHint: artifact-effect-hint-mental - permanentComponents: - - type: Instrument - - type: ActivatableUI - singleUser: true - verbText: verb-instrument-openui - key: enum.InstrumentUiKey.Key - - type: RandomInstrumentArtifact - -- type: artifactEffect - id: EffectStorage - targetDepth: 2 - effectHint: artifact-effect-hint-storage - whitelist: - components: - - Item # it doesnt necessarily have to be restricted from structures, but i think it'll be better that way - permanentComponents: - - type: Item - size: Huge - - type: Storage - maxItemSize: Huge - grid: - - 0,0,10,5 - -- type: artifactEffect - id: EffectPhasing - targetDepth: 2 - effectHint: artifact-effect-hint-phasing - permanentComponents: - - type: PhasingArtifact - -- type: artifactEffect - id: EffectWandering - targetDepth: 2 - effectHint: artifact-effect-hint-displacement - blacklist: - components: - - Item # item artifacts can't be anchored, so wanderers can't really be scanned properly - permanentComponents: - - type: RandomWalk - minSpeed: 12 - maxSpeed: 20 - minStepCooldown: 1 - maxStepCooldown: 3 - -- type: artifactEffect - id: EffectSolutionStorage - targetDepth: 2 - effectHint: artifact-effect-hint-storage - whitelist: - components: - - Item - permanentComponents: - - type: SolutionContainerManager - solutions: - beaker: - maxVol: 150 - - type: FitsInDispenser - solution: beaker - - type: RefillableSolution - solution: beaker - - type: DrainableSolution - solution: beaker - - type: ExaminableSolution - solution: beaker - - type: DrawableSolution - solution: beaker - - type: InjectableSolution - solution: beaker - - type: SolutionTransfer - canChangeTransferAmount: true - - type: Drink - solution: beaker - -- type: artifactEffect - id: EffectSpeedUp - targetDepth: 2 - effectHint: artifact-effect-hint-displacement - whitelist: - components: - - Item - permanentComponents: - - type: HeldSpeedModifier - walkModifier: 1.2 - sprintModifier: 1.3 - -- type: artifactEffect - id: EffectDrill - targetDepth: 3 - effectHint: artifact-effect-hint-drill - whitelist: - components: - - Item - permanentComponents: - - type: UseDelay - - type: MeleeWeapon - damage: - types: - Piercing: 18 - Blunt: 4 - soundHit: - path: /Audio/Weapons/bladeslice.ogg - - type: Sharp - -- type: artifactEffect - id: EffectPowerGen20K - targetDepth: 3 - effectHint: artifact-effect-hint-release - blacklist: - components: - - Item - permanentComponents: - - type: PowerSupplier - supplyRate: 20000 - - type: NodeContainer - examinable: true - nodes: - output_hv: - !type:CableDeviceNode - nodeGroupID: HVPower - -- type: artifactEffect - id: EffectBigIron - targetDepth: 3 - effectHint: artifact-effect-hint-gun - whitelist: - components: - - Item - permanentComponents: - - type: RevolverAmmoProvider - whitelist: - tags: - - CartridgeMagnum - - SpeedLoaderMagnum - proto: CartridgeMagnum - capacity: 7 - chambers: [ True, True, True, True, True, True, True ] - ammoSlots: [ null, null, null, null, null, null, null ] - soundEject: - path: /Audio/Weapons/Guns/MagOut/revolver_magout.ogg - soundInsert: - path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg - - type: Gun - selectedMode: SemiAuto - fireRate: 2 - availableModes: - - SemiAuto - - FullAuto # no alien revolver in buildings - soundGunshot: - path: /Audio/Weapons/Guns/Gunshots/revolver.ogg - -- type: artifactEffect - id: EffectSentience - targetDepth: 3 - effectHint: artifact-effect-hint-sentience - permanentComponents: - - type: GhostRole - allowMovement: true - allowSpeech: true - makeSentient: true - name: ghost-role-information-artifact-name - description: ghost-role-information-artifact-description - rules: ghost-role-information-freeagent-rules - mindRoles: - - MindRoleGhostRoleFreeAgent - raffle: - settings: default - - type: GhostTakeoverAvailable - - type: MovementSpeedModifier - baseWalkSpeed: 0.25 - baseSprintSpeed: 0.5 - -- type: artifactEffect - id: EffectMultitool - targetDepth: 3 - effectHint: artifact-effect-hint-multitool - whitelist: - components: - - Item - permanentComponents: - - type: UserInterface - interfaces: - enum.SignalLinkerUiKey.Key: - type: SignalPortSelectorBoundUserInterface - - type: ToolTileCompatible - - type: Tool - qualities: - - Screwing - speedModifier: 2 # Very powerful multitool to balance out the desire to sell or scrap for points - useSound: /Audio/Items/drill_use.ogg - - type: Tag - tags: - - Multitool - - type: MultipleTool - statusShowBehavior: true - entries: - - behavior: Screwing - useSound: - path: /Audio/Items/drill_use.ogg - changeSound: - path: /Audio/Items/change_drill.ogg - - behavior: Prying - useSound: - path: /Audio/Items/jaws_pry.ogg - changeSound: - path: /Audio/Items/change_drill.ogg - - behavior: Anchoring - useSound: - path: /Audio/Items/ratchet.ogg - changeSound: - path: /Audio/Items/change_drill.ogg - - behavior: Cutting - useSound: - path: /Audio/Items/jaws_cut.ogg - changeSound: - path: /Audio/Items/change_drill.ogg - - behavior: Pulsing - changeSound: - path: /Audio/Items/change_drill.ogg diff --git a/Resources/Prototypes/XenoArch/artifact_triggers.yml b/Resources/Prototypes/XenoArch/artifact_triggers.yml deleted file mode 100644 index ea2ea904c9..0000000000 --- a/Resources/Prototypes/XenoArch/artifact_triggers.yml +++ /dev/null @@ -1,205 +0,0 @@ -- type: artifactTrigger - id: TriggerInteraction - targetDepth: 0 - triggerHint: artifact-trigger-hint-physical - components: - - type: ArtifactInteractionTrigger - -- type: artifactTrigger - id: TriggerTimer - targetDepth: 0 - components: - - type: ArtifactTimerTrigger - -- type: artifactTrigger - id: TriggerExamine - targetDepth: 0 - triggerHint: artifact-trigger-hint-examine - components: - - type: ArtifactExamineTrigger - -- type: artifactTrigger - id: TriggerAnchor - targetDepth: 0 - triggerHint: artifact-trigger-hint-tool - blacklist: - components: - - Item - components: - - type: ArtifactAnchorTrigger - -- type: artifactTrigger - id: TriggerElectricity - targetDepth: 0 - triggerHint: artifact-trigger-hint-electricity - blacklist: - components: - - Item - components: - - type: ArtifactElectricityTrigger - - type: PowerConsumer - voltage: Medium - drawRate: 500 - - type: Electrified - requirePower: true - noWindowInTile: true - highVoltageNode: high - mediumVoltageNode: medium - lowVoltageNode: low - - type: NodeContainer - nodes: - medium: - !type:CableDeviceNode - nodeGroupID: MVPower - # sadly, HVPower and Apc cables doesn't work right now - -- type: artifactTrigger - id: TriggerMusic - targetDepth: 1 - triggerHint: artifact-trigger-hint-music - components: - - type: ArtifactMusicTrigger - -- type: artifactTrigger - id: TriggerBruteDamage - targetDepth: 1 - triggerHint: artifact-trigger-hint-physical - components: - - type: ArtifactDamageTrigger - damageTypes: - - Blunt - - Slash - - Piercing - damageThreshold: 50 - -- type: artifactTrigger - id: TriggerItemLanded - targetDepth: 1 - triggerHint: artifact-trigger-hint-land - whitelist: - components: - - Item - components: - - type: ArtifactLandTrigger - -- type: artifactTrigger - id: TriggerHeat - targetDepth: 1 - triggerHint: artifact-trigger-hint-heat - components: - - type: ArtifactHeatTrigger - -- type: artifactTrigger - id: TriggerWater - targetDepth: 1 - triggerHint: artifact-trigger-hint-water - components: - - type: Reactive - groups: - Acidic: [ Touch ] - reactions: - - reagents: [ Water ] - methods: [ Touch ] - effects: - - !type:ActivateArtifact - -- type: artifactTrigger - id: TriggerBlood - targetDepth: 1 - triggerHint: artifact-trigger-hint-blood - components: - - type: Reactive - groups: - Acidic: [ Touch ] - reactions: - - reagents: [ Blood, CopperBlood, InsectBlood, Slime, AmmoniaBlood, ZombieBlood ] - methods: [ Touch ] - effects: - - !type:ActivateArtifact - -- type: artifactTrigger - id: TriggerMedical - targetDepth: 2 - triggerHint: artifact-trigger-hint-medical - components: - - type: Reactive - groups: - Acidic: [ Touch ] - reactions: - - reagents: [ Dylovene, Diphenhydramine, Arithrazine, Bicaridine, Dermaline, Dexalin, DexalinPlus, Tricordrazine, Leporazine, Bruizine, Lacerinol, Puncturase, Pyrazine, Insuzine, Kelotane, Hyronalin, Inaprovaline, Epinephrine ] - methods: [ Touch ] - effects: - - !type:ActivateArtifact - -- type: artifactTrigger - id: TriggerGas - targetDepth: 2 - triggerHint: artifact-trigger-hint-regular-gases - components: - - type: ArtifactGasTrigger - possibleGas: - - Oxygen - - Nitrogen - - CarbonDioxide - -- type: artifactTrigger - id: TriggerDeath - targetDepth: 2 - triggerHint: artifact-trigger-hint-death - components: - - type: ArtifactDeathTrigger - -- type: artifactTrigger - id: TriggerMagnet - targetDepth: 2 - triggerHint: artifact-trigger-hint-magnet - components: - - type: ArtifactMagnetTrigger - -- type: artifactTrigger - id: TriggerLowPressure - targetDepth: 2 - triggerHint: artifact-trigger-hint-pressure - components: - - type: ArtifactPressureTrigger - minPressureThreshold: 50 - -- type: artifactTrigger - id: TriggerHighDamage - targetDepth: 3 - triggerHint: artifact-trigger-hint-physical - components: - - type: ArtifactDamageTrigger - damageThreshold: 500 #make it go boom or w/e - -- type: artifactTrigger - id: TriggerRadiation - targetDepth: 3 - triggerHint: artifact-trigger-hint-radiation - components: - - type: ArtifactMicrowaveTrigger - - type: ArtifactDamageTrigger - damageTypes: - - Radiation - damageThreshold: 50 - - type: RadiationReceiver - -- type: artifactTrigger - id: TriggerHighPressure - targetDepth: 3 - triggerHint: artifact-trigger-hint-pressure - components: - - type: ArtifactPressureTrigger - maxPressureThreshold: 385 - -- type: artifactTrigger - id: TriggerPlasma - targetDepth: 3 - triggerHint: artifact-trigger-hint-plasma - components: - - type: ArtifactGasTrigger - possibleGas: - - Plasma - -#don't add in new targetdepth values until you have a few -#or else it will skew heavily towards a few options. diff --git a/Resources/Prototypes/XenoArch/effects.yml b/Resources/Prototypes/XenoArch/effects.yml new file mode 100644 index 0000000000..01a316d780 --- /dev/null +++ b/Resources/Prototypes/XenoArch/effects.yml @@ -0,0 +1,1359 @@ +- type: entityTable + id: XenoArtifactEffectsDefaultTable + table: !type:GroupSelector + children: + # hijacks use key, prevents from using artifact, sadly + #- id: XenoArtifactEffectUniversalIntercom + # weight: 10.0 + - id: XenoArtifactSolutionStorage + weight: 10.0 + - id: XenoArtifactPhasing + weight: 2.0 + - id: XenoArtifactWandering + weight: 4.0 + - id: XenoArtifactSpeedUp + weight: 4.0 + - id: XenoArtifactGhost + weight: 2.0 + - id: XenoArtifactEffectBadFeeling + weight: 10.0 + - id: XenoArtifactEffectGoodFeeling + weight: 10.0 + - id: XenoArtifactEffectJunkSpawn + weight: 10.0 + - id: XenoArtifactEffectLightFlicker + weight: 10.0 + - id: XenoArtifactPotassiumWave + weight: 7.0 + - id: XenoArtifactFloraSpawn + weight: 10.0 + - id: XenoArtifactChemicalPuddle + weight: 10.0 + - id: XenoArtifactThrowThingsAround + weight: 10.0 + - id: XenoArtifactColdWave + weight: 10.0 + - id: XenoArtifactHeatWave + weight: 4.0 + - id: XenoArtifactFoamMild + weight: 8.0 + - id: XenoArtifactRandomInstrumentSpawn + weight: 10.0 + - id: XenoArtifactMonkeySpawn + weight: 10.0 + - id: XenoArtifactRadioactive + weight: 8.0 + - id: XenoArtifactChargeBattery + weight: 10.0 + - id: XenoArtifactKnock + weight: 4.0 + - id: XenoArtifactMagnet + weight: 2.0 + - id: XenoArtifactMagnetNegative + weight: 2.0 + - id: XenoArtifactStealth + weight: 1.0 + - id: XenoArtifactRareMaterialSpawnSilver + weight: 1.8 # amount is laughable + - id: XenoArtifactRareMaterialSpawnPlasma + weight: 2.0 # amount is laughable + - id: XenoArtifactRareMaterialSpawnGold + weight: 1.8 # amount is laughable + - id: XenoArtifactRareMaterialSpawnUranium + weight: 1.0 # amount is laughable + - id: XenoArtifactAngryCarpSpawn + weight: 4.0 + - id: XenoArtifactFaunaSpawn + weight: 10.0 + - id: XenoArtifactCashSpawn + weight: 10.0 + - id: XenoArtifactShatterWindows + weight: 8.0 + - id: XenoArtifactFoamGood + weight: 4.0 + - id: XenoArtifactFoamDangerous + weight: 2.0 + - id: XenoArtifactPuddleRare + weight: 2.0 + - id: XenoArtifactAnomalySpawn + weight: 10.0 + - id: XenoArtifactIgnite + weight: 2.0 + - id: XenoArtifactTeleport + weight: 2.0 + - id: XenoArtifactEmp + weight: 2.0 + - id: XenoArtifactPolyMonkey + weight: 2.0 + - id: XenoArtifactPolyLuminous + weight: 2.0 + - id: XenoArtifactPolyLizard + weight: 2.0 + - id: XenoArtifactRadioactiveStrong + weight: 3.0 + - id: XenoArtifactMaterialSpawnGlass + weight: 3.3 + - id: XenoArtifactMaterialSpawnSteel + weight: 3.3 + - id: XenoArtifactMaterialSpawnPlastic + weight: 3.3 + - id: XenoArtifactPortal + weight: 2.0 + - id: XenoArtifactArtifactSpawn + weight: 0.5 + - id: XenoArtifactShuffle + weight: 3.0 + - id: XenoArtifactHealAll + weight: 1.0 + #- id: XenoArtifactTesla + # weight: 10.0 + #- id: XenoArtifactSingularity + # weight: 10.0 + - id: XenoArtifactExplosionScary + weight: 1.0 + - id: XenoArtifactBoom + weight: 5.0 + - id: XenoArtifactEffectCreationGasPlasma + weight: 2.0 + - id: XenoArtifactEffectCreationGasTritium + weight: 2.0 + - id: XenoArtifactEffectCreationGasAmmonia + weight: 3.0 + - id: XenoArtifactEffectCreationGasFrezon + weight: 1.0 + - id: XenoArtifactEffectCreationGasNitrousOxide + weight: 4.0 + - id: XenoArtifactEffectCreationGasCarbonDioxide + weight: 4.0 + +- type: entityTable + id: XenoArtifactEffectsHandheldOnlyTable + table: !type:GroupSelector + children: + #- id: XenoArtifactBecomeRandomInstrument + # weight 10.0 # removed until we have value-based system + #- id: XenoArtifactGun + # weight 4.0 #it conflicts with default interaction - it should activate artifact nodes + - id: XenoArtifactOmnitool + weight: 10.0 + - id: XenoArtifactDrill + weight: 10.0 + +- type: entity + id: BaseXenoArtifactEffect + name: effect + description: Unknown + categories: [ HideSpawnMenu ] + abstract: true + components: + - type: XenoArtifactNode + - type: NameIdentifier + group: XenoArtifactNode + +- type: entity + id: BaseOneTimeXenoArtifactEffect + parent: BaseXenoArtifactEffect + name: one-time-effect + description: Unknown + categories: [ HideSpawnMenu ] + abstract: true + components: + - type: XenoArtifactNode + maxDurability: 1 + maxDurabilityCanDecreaseBy: + min: 0 + max: 0 + - type: NameIdentifier + group: XenoArtifactNode + +- type: entity + id: XenoArtifactEffectUniversalIntercom + parent: BaseOneTimeXenoArtifactEffect + description: Obtains ability of long-distance communication device + components: + - type: XAEApplyComponents + components: + - type: RadioMicrophone + powerRequired: false + toggleOnInteract: false + listenRange: 3 + - type: Speech + - type: RadioSpeaker + toggleOnInteract: false + - type: ActivatableUI + key: enum.IntercomUiKey.Key + - type: Intercom + requiresPower: false + supportedChannels: + - Common + - CentCom + - Command + - Engineering + - Medical + - Science + - Security + - Service + - Supply + +- type: entity + id: XenoArtifactBecomeRandomInstrument + parent: BaseOneTimeXenoArtifactEffect + description: Obtains ability of musical instrument + components: + - type: XAEApplyComponents + components: + - type: Instrument + - type: ActivatableUI + singleUser: true + verbText: verb-instrument-openui + key: enum.InstrumentUiKey.Key + +- type: entity + id: XenoArtifactStorage + parent: BaseOneTimeXenoArtifactEffect + description: Obtains ability of hidden storage + components: + - type: XAEApplyComponents + components: + - type: Item + size: Huge + - type: Storage + maxItemSize: Huge + grid: + - 0,0,10,5 + +- type: entity + id: XenoArtifactPhasing + parent: BaseOneTimeXenoArtifactEffect + description: Becomes phased + components: + - type: XAERemoveCollision + +- type: entity + id: XenoArtifactWandering + parent: BaseOneTimeXenoArtifactEffect + description: Starts to move sporadically + components: + - type: XAEApplyComponents + components: + - type: RandomWalk + minSpeed: 12 + maxSpeed: 20 + minStepCooldown: 1 + maxStepCooldown: 3 + +- type: entity + id: XenoArtifactSolutionStorage + parent: BaseOneTimeXenoArtifactEffect + description: Obtains ability of container for chemical solutions + components: + - type: XAEApplyComponents + components: + - type: SolutionContainerManager + solutions: + beaker: + maxVol: 150 + - type: FitsInDispenser + solution: beaker + - type: RefillableSolution + solution: beaker + - type: DrainableSolution + solution: beaker + - type: ExaminableSolution + solution: beaker + - type: DrawableSolution + solution: beaker + - type: InjectableSolution + solution: beaker + - type: SolutionTransfer + canChangeTransferAmount: true + - type: Drink + solution: beaker + +- type: entity + id: XenoArtifactSpeedUp + parent: BaseOneTimeXenoArtifactEffect + description: Improves holder movement speed + components: + - type: XAEApplyComponents + components: + - type: HeldSpeedModifier + walkModifier: 1.2 + sprintModifier: 1.3 + +- type: entity + id: XenoArtifactDrill + parent: BaseOneTimeXenoArtifactEffect + description: Obtains ability of drill + components: + - type: XAEApplyComponents + components: + - type: MeleeWeapon + damage: + types: + Piercing: 18 + Blunt: 4 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: Sharp + +- type: entity + id: XenoArtifactGenerateEnergy + parent: BaseOneTimeXenoArtifactEffect # todo - increment power, but only once per node + description: Produces power + components: + - type: XAEApplyComponents + components: + - type: PowerSupplier + supplyRate: 20000 + - type: NodeContainer + examinable: true + nodes: + output_hv: + !type:CableDeviceNode + nodeGroupID: HVPower + +- type: entity + id: XenoArtifactGun + parent: BaseOneTimeXenoArtifactEffect + description: Obtains ability of firearm + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: RevolverAmmoProvider + whitelist: + tags: + - CartridgeMagnum + - SpeedLoaderMagnum + proto: CartridgeMagnum + capacity: 7 + chambers: [ True, True, True, True, True, True, True ] + ammoSlots: [ null, null, null, null, null, null, null ] + soundEject: + path: /Audio/Weapons/Guns/MagOut/revolver_magout.ogg + soundInsert: + path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg + - type: Gun + selectedMode: SemiAuto + fireRate: 2 + availableModes: + - SemiAuto + - FullAuto # no alien revolver in buildings + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/revolver.ogg + +- type: entity + id: XenoArtifactGhost + parent: BaseOneTimeXenoArtifactEffect + description: Becomes sentient + components: + - type: XAEApplyComponents + components: + - type: GhostRole + allowMovement: true + allowSpeech: true + makeSentient: true + name: ghost-role-information-artifact-name + description: ghost-role-information-artifact-description + rules: ghost-role-information-freeagent-rules + raffle: + settings: default + mindRoles: + - MindRoleGhostRoleFreeAgent + - type: GhostTakeoverAvailable + - type: MovementSpeedModifier + baseWalkSpeed: 0.25 + baseSprintSpeed: 0.5 + +- type: entity + id: XenoArtifactOmnitool + parent: BaseOneTimeXenoArtifactEffect + description: Obtains ability of omnitool + components: + - type: XAEApplyComponents + components: + - type: UserInterface + interfaces: + enum.SignalLinkerUiKey.Key: + type: SignalPortSelectorBoundUserInterface + - type: ToolTileCompatible + - type: Tool + qualities: + - Screwing + speedModifier: 2 # Very powerful multitool to balance out the desire to sell or scrap for points + useSound: /Audio/Items/drill_use.ogg + - type: Tag + tags: + - Multitool + - type: MultipleTool + statusShowBehavior: true + entries: + - behavior: Screwing + useSound: + path: /Audio/Items/drill_use.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Prying + useSound: + path: /Audio/Items/jaws_pry.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Anchoring + useSound: + path: /Audio/Items/ratchet.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Cutting + useSound: + path: /Audio/Items/jaws_cut.ogg + changeSound: + path: /Audio/Items/change_drill.ogg + - behavior: Pulsing + changeSound: + path: /Audio/Items/change_drill.ogg + +- type: entity + id: XenoArtifactEffectBadFeeling + parent: BaseXenoArtifactEffect + description: Broadcasts sublime message + components: + - type: XAETelepathic + messages: + - badfeeling-artifact-1 + - badfeeling-artifact-2 + - badfeeling-artifact-3 + - badfeeling-artifact-4 + - badfeeling-artifact-5 + - badfeeling-artifact-6 + - badfeeling-artifact-7 + - badfeeling-artifact-8 + - badfeeling-artifact-9 + - badfeeling-artifact-10 + - badfeeling-artifact-11 + - badfeeling-artifact-12 + - badfeeling-artifact-13 + - badfeeling-artifact-14 + - badfeeling-artifact-15 + drastic: + - badfeeling-artifact-drastic-1 + - badfeeling-artifact-drastic-2 + - badfeeling-artifact-drastic-3 + - badfeeling-artifact-drastic-4 + - badfeeling-artifact-drastic-5 + - badfeeling-artifact-drastic-6 + +- type: entity + id: XenoArtifactEffectGoodFeeling + parent: BaseXenoArtifactEffect + description: Broadcasts sublime message + components: + - type: XAETelepathic + messages: + - goodfeeling-artifact-1 + - goodfeeling-artifact-2 + - goodfeeling-artifact-3 + - goodfeeling-artifact-4 + - goodfeeling-artifact-5 + - goodfeeling-artifact-6 + - goodfeeling-artifact-7 + - goodfeeling-artifact-8 + - goodfeeling-artifact-9 + - goodfeeling-artifact-10 + - goodfeeling-artifact-11 + - goodfeeling-artifact-12 + - goodfeeling-artifact-13 + - goodfeeling-artifact-14 + drastic: + - goodfeeling-artifact-drastic-1 + - goodfeeling-artifact-drastic-2 + - goodfeeling-artifact-drastic-3 + - goodfeeling-artifact-drastic-4 + - goodfeeling-artifact-drastic-5 + - goodfeeling-artifact-drastic-6 + +- type: entity + id: XenoArtifactEffectJunkSpawn + parent: BaseXenoArtifactEffect + description: Create recyclable junk + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + rolls: !type:RangeNumberSelector + range: 1, 4 + children: + - !type:NestedSelector + tableId: GenericTrashItems + weight: 35 + - !type:AllSelector + weight: 1 + children: + - id: ToySpawner + +- type: entity + id: XenoArtifactEffectLightFlicker + parent: BaseXenoArtifactEffect + description: Minor electromagnetic interference + components: + - type: XAELightFlicker + +- type: entity + id: XenoArtifactPotassiumWave + parent: BaseXenoArtifactEffect + description: Produces potassium + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: FoodBanana + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.5 + - type: XAECreatePuddle + chemAmount: + min: 1 + max: 1 + chemicalSolution: + maxVol: 100 + canReact: false + possibleChemicals: + - Potassium + +- type: entity + id: XenoArtifactFloraSpawn + parent: BaseXenoArtifactEffect + description: Produces flora + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: RandomFloraTree + +- type: entity + id: XenoArtifactChemicalPuddle + parent: BaseXenoArtifactEffect + description: Produces puddle of chemical mixture # todo: make description say what exact chemical is produced, maybe add mixes into possible chemicals + components: + - type: XAECreatePuddle + chemAmount: + min: 1 + max: 3 + replaceDescription: true + chemicalSolution: + maxVol: 500 + canReact: false + possibleChemicals: + - Aluminium + - Carbon + - Chlorine + - Copper + - Ethanol + - Fluorine + - Sugar + - Hydrogen + - Iodine + - Iron + - Lithium + - Mercury + - Nitrogen + - Oxygen + - Phosphorus + - Potassium + - Radium + - Silicon + - Sodium + - Water + - Sulfur + +- type: entity + id: XenoArtifactThrowThingsAround + parent: BaseXenoArtifactEffect + description: Minor implosion + components: + - type: XAEThrowThingsAround + +- type: entity + id: XenoArtifactColdWave + parent: BaseXenoArtifactEffect + description: Cools down surrounding gas + components: + - type: XAETemperature + targetTemp: 50 + +- type: entity + id: XenoArtifactHeatWave + parent: BaseXenoArtifactEffect + description: Heats up surrounding gas greatly + components: + - type: XAETemperature + targetTemp: 500 + +- type: entity + id: XenoArtifactFoamMild + parent: BaseXenoArtifactEffect + description: Produces chemical foam # todo: separate in 1 for each chemical for description? actually sounds like a very good idea + components: + - type: XAEFoam + replaceDescription: true + reagents: + - Oxygen + - Plasma + - Blood + - SpaceCleaner + - Nutriment + - SpaceLube + - Ethanol + - Mercury + - VentCrud + - WeldingFuel + - JuiceThatMakesYouWeh + +- type: entity + id: XenoArtifactRandomInstrumentSpawn + parent: BaseXenoArtifactEffect + description: Creates musical instrument + components: + - type: XenoArtifactNode + maxDurability: 2 + maxDurabilityCanDecreaseBy: + min: 0 + max: 1 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: RandomInstruments + +- type: entity + id: XenoArtifactMonkeySpawn + parent: BaseXenoArtifactEffect + description: Creates primate + components: + - type: XenoArtifactNode + maxDurability: 3 + maxDurabilityCanDecreaseBy: + min: 0 + max: 2 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + children: + - id: MobMonkey + weight: 95.0 + - id: MobGorilla + weight: 5.0 + +- type: entity + id: XenoArtifactRadioactive + parent: BaseOneTimeXenoArtifactEffect + description: Becomes mildly radioactive + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: RadiationSource + intensity: 1 + slope: 0.3 + +- type: entity + id: XenoArtifactChargeBattery + parent: BaseXenoArtifactEffect + description: Charges up batteries + components: + - type: XAEChargeBattery + - type: XAETelepathic + messages: + - charge-artifact-popup + +- type: entity + id: XenoArtifactKnock + parent: BaseXenoArtifactEffect + description: Mild electromagnetic interference + components: + - type: XAEKnock + - type: XAELightFlicker + +- type: entity + id: XenoArtifactMagnet + parent: BaseOneTimeXenoArtifactEffect + description: Create small gravity well + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: GravityWell + maxRange: 3 + baseRadialAcceleration: 1 + baseTangentialAcceleration: 3 + +- type: entity + id: XenoArtifactMagnetNegative + parent: BaseOneTimeXenoArtifactEffect + description: Create small gravity well + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: GravityWell + maxRange: 3 + baseRadialAcceleration: -1 + baseTangentialAcceleration: -3 + +- type: entity + id: XenoArtifactStealth + parent: BaseOneTimeXenoArtifactEffect + description: Create light interference + components: + - type: XAEApplyComponents + components: + - type: Stealth + hadOutline: true + - type: StealthOnMove + passiveVisibilityRate: -0.10 + movementVisibilityRate: 0.10 + +- type: entity + id: XenoArtifactRareMaterialSpawn + parent: BaseXenoArtifactEffect # todo: splice into different well-named effects, amounts should reflect how rare material is + description: Create rare materials + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: SilverOre1 + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.3 + - id: PlasmaOre1 + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.3 + - id: GoldOre1 + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.3 + - id: UraniumOre1 + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.3 + +- type: entity + id: XenoArtifactRareMaterialSpawnSilver + parent: BaseXenoArtifactEffect + description: Create rare materials + components: + - type: XenoArtifactNode + maxDurability: 4 + maxDurabilityCanDecreaseBy: + min: 0 + max: 2 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: SilverOre1 + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.3 + +- type: entity + id: XenoArtifactRareMaterialSpawnPlasma + parent: BaseXenoArtifactEffect + description: Create plasma + components: + - type: XenoArtifactNode + maxDurability: 4 + maxDurabilityCanDecreaseBy: + min: 0 + max: 2 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: PlasmaOre1 + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.3 + +- type: entity + id: XenoArtifactRareMaterialSpawnGold + parent: BaseXenoArtifactEffect + description: Create gold + components: + - type: XenoArtifactNode + maxDurability: 3 + maxDurabilityCanDecreaseBy: + min: 0 + max: 1 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: GoldOre1 + rolls: !type:ConstantNumberSelector + value: 6 + prob: 0.3 + +- type: entity + id: XenoArtifactRareMaterialSpawnUranium + parent: BaseXenoArtifactEffect + description: Create uranium + components: + - type: XenoArtifactNode + maxDurability: 4 + maxDurabilityCanDecreaseBy: + min: 0 + max: 2 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: UraniumOre1 + rolls: !type:ConstantNumberSelector + value: 3 + prob: 0.3 + +- type: entity + id: XenoArtifactAngryCarpSpawn + parent: BaseXenoArtifactEffect + description: Create hostile fish + components: + - type: XenoArtifactNode + maxDurability: 3 + maxDurabilityCanDecreaseBy: + min: 0 + max: 2 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + children: + - id: MobCarpMagic + weight: 1.0 + - id: MobCarpHolo + weight: 1.0 + +- type: entity + id: XenoArtifactFaunaSpawn + parent: BaseXenoArtifactEffect + description: Create friendly fauna + components: + - type: XenoArtifactNode + maxDurability: 4 + maxDurabilityCanDecreaseBy: + min: 0 + max: 3 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + children: + - id: MobAdultSlimesYellowAngry + - id: MobAngryBee + - id: MobBearSpace + - id: MobXenoRavager + - id: MobTick + - id: MobSpiderSpace + - id: MobPurpleSnake + - id: MobMouse + - id: MobKangarooSpace + - id: MobPig + - id: MobParrot + - id: MobKangaroo + - id: MobFox + - id: MobPenguin + amount: !type:RangeNumberSelector + range: 1, 2 + - id: MobMothroach + amount: !type:RangeNumberSelector + range: 1, 2 + - id: MobCorgiPuppy + amount: !type:RangeNumberSelector + range: 1, 2 + - id: MobCatKitten + amount: !type:RangeNumberSelector + range: 1, 2 + - id: MobCat + amount: !type:RangeNumberSelector + range: 1, 2 + - id: MobBee + amount: !type:RangeNumberSelector + range: 2, 5 + - id: MobGoat + amount: !type:RangeNumberSelector + range: 1, 3 + - id: MobMonkeySyndicateAgent #so lucky + prob: 0.03 + +- type: entity + id: XenoArtifactCashSpawn + parent: BaseXenoArtifactEffect + description: Create money + components: + - type: XenoArtifactNode + maxDurability: 2 + maxDurabilityCanDecreaseBy: + min: 0 + max: 1 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + rolls: !type:RangeNumberSelector + range: 2, 4 + children: + - id: SpaceCash10 + weight: 0.75 + - id: SpaceCash100 + weight: 0.5 + - id: SpaceCash500 + weight: 0.25 + - id: SpaceCash1000 + weight: 0.1 + +- type: entity + id: XenoArtifactShatterWindows + parent: BaseXenoArtifactEffect + description: Break windows + components: + - type: XenoArtifactNode + maxDurability: 3 + maxDurabilityCanDecreaseBy: + min: 0 + max: 2 + - type: XAEDamageInArea + damageChance: 0.75 + whitelist: + tags: + - Window + damage: + types: + Structural: 200 + +- type: entity + id: XenoArtifactFoamGood + parent: BaseXenoArtifactEffect + description: Creates wave of helpful foam + components: + - type: XenoArtifactNode + maxDurability: 7 + maxDurabilityCanDecreaseBy: + min: 0 + max: 5 + - type: XAEFoam + replaceDescription: true + reagents: + - Dermaline + - Arithrazine + - Bicaridine + - Inaprovaline + - Kelotane + - Dexalin + - Omnizine + +- type: entity + id: XenoArtifactFoamDangerous + parent: BaseXenoArtifactEffect + description: Creates wave of harmful foam + components: + - type: XAEFoam + minFoamAmount: 20 + maxFoamAmount: 30 + replaceDescription: true + reagents: + - Tritium + - Plasma + - SulfuricAcid + - SpaceDrugs + - Nocturine + - MuteToxin + - Napalm + - CarpoToxin + - ChloralHydrate + - Mold + - Amatoxin + +- type: entity + id: XenoArtifactPuddleRare + parent: BaseXenoArtifactEffect + description: Creates puddle of helpful chemicals + components: + - type: XAECreatePuddle + chemAmount: + min: 1 + max: 3 + replaceDescription: true + chemicalSolution: + maxVol: 500 + canReact: false + possibleChemicals: + - Dermaline + - Arithrazine + - Bicaridine + - Inaprovaline + - Kelotane + - Dexalin + - Omnizine + - Napalm + - Toxin + - Epinephrine + - Cognizine + - Ultravasculine + - Desoxyephedrine + - Pax + - Siderlac + +- type: entity + id: XenoArtifactAnomalySpawn + parent: BaseXenoArtifactEffect + description: Creates anomaly + components: + - type: XenoArtifactNode + maxDurability: 2 + maxDurabilityCanDecreaseBy: + min: 0 + max: 1 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: RandomAnomalySpawner + +- type: entity + id: XenoArtifactIgnite + parent: BaseXenoArtifactEffect + description: Pyrokinesis + components: + - type: XAEIgnite + range: 7 + fireStack: + min: 3 + max: 6 + +- type: entity + id: XenoArtifactTeleport + parent: BaseXenoArtifactEffect + description: Teleportation + components: + - type: XAERandomTeleportInvoker + +- type: entity + id: XenoArtifactEmp + parent: BaseXenoArtifactEffect + description: Dangerous electromagnetic interference + components: + - type: XenoArtifactNode + maxDurability: 5 + maxDurabilityCanDecreaseBy: + min: 0 + max: 3 + - type: XAEEmpInArea + +- type: entity + id: XenoArtifactPolyMonkey + parent: BaseXenoArtifactEffect + description: Temporarily reshape flesh to fur + components: + - type: XAEPolymorph + +- type: entity + id: XenoArtifactPolyLizard + parent: BaseXenoArtifactEffect + description: Temporarily reshape flesh to scale + components: + - type: XAEPolymorph + polymorphPrototypeName: ArtifactLizard + +- type: entity + id: XenoArtifactPolyLuminous + parent: BaseXenoArtifactEffect + description: Temporarily reshape flesh to light + components: + - type: XAEPolymorph + polymorphPrototypeName: ArtifactLuminous + +- type: entity + id: XenoArtifactRadioactiveStrong + parent: BaseOneTimeXenoArtifactEffect + description: Becomes highly radioactive + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: RadiationSource + intensity: 2 + slope: 0.3 + +- type: entity + id: XenoArtifactMaterialSpawnGlass + parent: BaseXenoArtifactEffect + description: Create glass + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + children: + - id: SheetGlass + +- type: entity + id: XenoArtifactMaterialSpawnSteel + parent: BaseXenoArtifactEffect + description: Create steel + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + children: + - id: SheetSteel + +- type: entity + id: XenoArtifactMaterialSpawnPlastic + parent: BaseXenoArtifactEffect + description: Create plastic + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:GroupSelector + children: + - id: SheetPlastic + +- type: entity + id: XenoArtifactPortal + parent: BaseXenoArtifactEffect + description: Create short-living bluespace portal + components: + - type: XAEPortal + +- type: entity + id: XenoArtifactArtifactSpawn + parent: BaseXenoArtifactEffect + description: Create artifact + components: + - type: XenoArtifactNode + maxDurability: 2 + maxDurabilityCanDecreaseBy: + min: 0 + max: 1 + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: RandomArtifactSpawner + +- type: entity + id: XenoArtifactShuffle + parent: BaseXenoArtifactEffect + description: Switch places of sentient beings #not ALL beings, but oh well... + components: + - type: XAEShuffle + - type: XAETelepathic + range: 7.5 + messages: + - shuffle-artifact-popup + +- type: entity + id: XenoArtifactHealAll + parent: BaseXenoArtifactEffect + description: Miraclous healing + components: + - type: XAEDamageInArea + damageChance: 1 + radius: 8 + whitelist: + components: + - MobState + damage: + groups: + Brute: -300 + Burn: -300 + +- type: entity + id: XenoArtifactTesla + parent: BaseOneTimeXenoArtifactEffect + description: Mass destruction + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: Singularity + +- type: entity + id: XenoArtifactSingularity + parent: BaseOneTimeXenoArtifactEffect + description: Imminent doom + components: + - type: XAEApplyComponents + applyIfAlreadyHave: true + refreshOnReactivate: true + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + table: !type:AllSelector + children: + - id: TeslaEnergyBall + +- type: entity + id: XenoArtifactExplosionScary + parent: BaseOneTimeXenoArtifactEffect + description: Small scale high-speed nuclear reaction + components: + - type: XAETriggerExplosives + - type: Explosive + deleteAfterExplosion: false + explosionType: Radioactive + totalIntensity: 300 + intensitySlope: 2 + maxIntensity: 1.5 + canCreateVacuum: false + repeatable: true + +- type: entity + id: XenoArtifactBoom + parent: BaseOneTimeXenoArtifactEffect + description: Explosion + components: + - type: XAETriggerExplosives + - type: Explosive + deleteAfterExplosion: false + explosionType: Default + totalIntensity: 500 + intensitySlope: 2.5 + maxIntensity: 50 + repeatable: true + +- type: entity + id: XenoArtifactEffectCreationGasPlasma + parent: BaseXenoArtifactEffect + description: Expels plasma + components: + - type: XAECreateGas + gases: + Plasma: 300 + +- type: entity + id: XenoArtifactEffectCreationGasTritium + parent: BaseXenoArtifactEffect + description: Expels tritium + components: + - type: XAECreateGas + gases: + Tritium: 300 + +- type: entity + id: XenoArtifactEffectCreationGasAmmonia + parent: BaseXenoArtifactEffect + description: Expels ammonia + components: + - type: XAECreateGas + gases: + Ammonia: 300 + +- type: entity + id: XenoArtifactEffectCreationGasFrezon + parent: BaseXenoArtifactEffect + description: Expels frezon + components: + - type: XAECreateGas + gases: + Frezon: 300 + +- type: entity + id: XenoArtifactEffectCreationGasNitrousOxide + parent: BaseXenoArtifactEffect + description: Expels nitrous oxide + components: + - type: XAECreateGas + gases: + NitrousOxide: 300 + +- type: entity + id: XenoArtifactEffectCreationGasCarbonDioxide + parent: BaseXenoArtifactEffect + description: Expels carbon dioxide + components: + - type: XAECreateGas + gases: + CarbonDioxide: 300 diff --git a/Resources/Prototypes/XenoArch/triggers.yml b/Resources/Prototypes/XenoArch/triggers.yml new file mode 100644 index 0000000000..5e70843c1d --- /dev/null +++ b/Resources/Prototypes/XenoArch/triggers.yml @@ -0,0 +1,265 @@ +- type: weightedRandomXenoArchTrigger + id: DefaultTriggers + weights: + TriggerMusic: 1 + TriggerHeat: 1 + TriggerCold: 0.5 + TriggerNoOxygen: 1 + TriggerWater: 1 + TriggerCO2: 0.5 + TriggerPlasma: 0.5 + TriggerN2O: 0.5 + TriggerTritium: 0.1 + TriggerAmmonia: 0.1 + TriggerFrezon: 0.1 + TriggerRadiation: 1 + TriggerPressureHigh: 0.5 + TriggerPressureLow: 1 + TriggerExamine: 1 + TriggerBruteDamage: 1 + #TriggerInteraction: 1 #this one interferes with activating artifact AND brute dmg! + TriggerWrenching: 0.5 + TriggerPrying: 0.5 + TriggerScrewing: 0.5 + TriggerPulsing: 0.5 + TriggerTimer: 0.25 + TriggerBlood: 1 + TriggerThrow: 1 + TriggerDeath: 1 + TriggerMagnet: 1 + +- type: xenoArchTrigger + id: TriggerMusic + tip: xenoarch-trigger-tip-music + components: + - type: XATCompNearby + requireComponentWithName: ActiveInstrument + radius: 2 + +- type: xenoArchTrigger + id: TriggerHeat + tip: xenoarch-trigger-tip-heat + components: + - type: XATTemperature + targetTemperature: 373 + triggerOnHigherTemp: true + - type: XATDamageThresholdReached + typesNeeded: + Heat: 20 +# This kinda trivializes the difficulty. +# - type: XATToolUse +# requiredTool: Welding +# delay: 5 +# fuel: 10 + +- type: xenoArchTrigger + id: TriggerCold + tip: xenoarch-trigger-tip-cold + components: + - type: XATTemperature + targetTemperature: 255 + triggerOnHigherTemp: false + - type: XATDamageThresholdReached + typesNeeded: + Cold: 20 + +- type: xenoArchTrigger + id: TriggerNoOxygen + tip: xenoarch-trigger-tip-no-oxygen + components: + - type: XATGas + targetGas: Oxygen + moles: 10 + shouldBePresent: false + +- type: xenoArchTrigger + id: TriggerWater + tip: xenoarch-trigger-tip-water + components: + - type: XATGas + targetGas: WaterVapor + - type: XATReactive + reagents: + - Water + +- type: xenoArchTrigger + id: TriggerCO2 + tip: xenoarch-trigger-tip-co2 + components: + - type: XATGas + targetGas: CarbonDioxide + - type: XATReactive + reagents: + - CarbonDioxide + +- type: xenoArchTrigger + id: TriggerPlasma + tip: xenoarch-trigger-tip-plasma + components: + - type: XATGas + targetGas: Plasma + - type: XATReactive + reagents: + - Plasma + +- type: xenoArchTrigger + id: TriggerTritium + tip: xenoarch-trigger-tip-tritium + components: + - type: XATGas + targetGas: Tritium + - type: XATReactive + reagents: + - Tritium + +- type: xenoArchTrigger + id: TriggerAmmonia + tip: xenoarch-trigger-tip-ammonia + components: + - type: XATGas + targetGas: Ammonia + - type: XATReactive + reagents: + - Ammonia + +- type: xenoArchTrigger + id: TriggerN2O + tip: xenoarch-trigger-tip-n2o + components: + - type: XATGas + targetGas: NitrousOxide + - type: XATReactive + reagents: + - NitrousOxide + +- type: xenoArchTrigger + id: TriggerFrezon + tip: xenoarch-trigger-tip-frezon + components: + - type: XATGas + targetGas: Frezon + - type: XATReactive + reagents: + - Frezon + +- type: xenoArchTrigger + id: TriggerRadiation + tip: xenoarch-trigger-tip-radiation + components: + - type: XATDamageThresholdReached + typesNeeded: + Radiation: 20 + # TODO: legendary microwave trigger + +- type: xenoArchTrigger + id: TriggerPressureHigh + tip: xenoarch-trigger-tip-pressure-high + components: + - type: XATPressure + maxPressureThreshold: 385 + +- type: xenoArchTrigger + id: TriggerPressureLow + tip: xenoarch-trigger-tip-pressure-low + components: + - type: XATPressure + minPressureThreshold: 50 + +- type: xenoArchTrigger + id: TriggerExamine + tip: xenoarch-trigger-tip-examine + components: + - type: XATExamine + +- type: xenoArchTrigger + id: TriggerBruteDamage + tip: xenoarch-trigger-tip-brute-damage + components: + - type: XATDamageThresholdReached + groupsNeeded: + Brute: 20 + +- type: xenoArchTrigger + id: TriggerInteraction + tip: xenoarch-trigger-tip-interaction + components: + - type: XATInteraction + +- type: xenoArchTrigger + id: TriggerWrenching + tip: xenoarch-trigger-tip-wrenching + components: + - type: XATToolUse + requiredTool: Anchoring + - type: XATExaminableText + examineText: xenoarch-trigger-examine-wrenching + +- type: xenoArchTrigger + id: TriggerPrying + tip: xenoarch-trigger-tip-prying + components: + - type: XATToolUse + requiredTool: Prying + - type: XATExaminableText + examineText: xenoarch-trigger-examine-prying + +- type: xenoArchTrigger + id: TriggerScrewing + tip: xenoarch-trigger-tip-screwing + components: + - type: XATToolUse + requiredTool: Screwing + - type: XATExaminableText + examineText: xenoarch-trigger-examine-screwing + +- type: xenoArchTrigger + id: TriggerPulsing + tip: xenoarch-trigger-tip-pulsing + components: + - type: XATToolUse + requiredTool: Pulsing + - type: XATExaminableText + examineText: xenoarch-trigger-examine-pulsing + +- type: xenoArchTrigger + id: TriggerTimer + tip: xenoarch-trigger-tip-timer + components: + - type: XATTimer + possibleDelayInSeconds: + min: 80 + max: 120 + +- type: xenoArchTrigger + id: TriggerBlood + tip: xenoarch-trigger-tip-blood + components: + - type: XATReactive + reagents: + - Blood + - CopperBlood + - InsectBlood + - Slime + - AmmoniaBlood + - ZombieBlood + +- type: xenoArchTrigger + id: TriggerThrow + tip: xenoarch-trigger-tip-throw + whitelist: + components: + - Item + components: + - type: XATItemLand + +- type: xenoArchTrigger + id: TriggerDeath + tip: xenoarch-trigger-tip-death + components: + - type: XATDeath + +- type: xenoArchTrigger + id: TriggerMagnet + tip: xenoarch-trigger-tip-magnet + components: + - type: XATMagnet diff --git a/Resources/Prototypes/name_identifier_groups.yml b/Resources/Prototypes/name_identifier_groups.yml index 4823e31f55..f175058e9a 100644 --- a/Resources/Prototypes/name_identifier_groups.yml +++ b/Resources/Prototypes/name_identifier_groups.yml @@ -29,6 +29,11 @@ minValue: 1000 maxValue: 9999 +- type: nameIdentifierGroup + id: XenoArtifactNode + minValue: 0 + maxValue: 999 + # Used to suffix a number to any mob to identify player controlled mob griefing. - type: nameIdentifierGroup id: GenericNumber diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi/artifact-activation.png b/Resources/Textures/Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi/artifact-activation.png new file mode 100644 index 0000000000000000000000000000000000000000..fd45f20d9d4e5af467ba7d49f567d6b8816c4d39 GIT binary patch literal 5993 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�!2{@i^bAorBeAXrIZN62>bW%dEGS4gSxJ{+1ut`XzQnf3n9y1Ib>2$}JqKL&Zne;bqJ9OYtMWNR^J2O?=Hcd35$9w=KtRYP1 z`h5UF!zucX_dU-?5QL%YdgU+-uVpjo-w1*LzVD+@C{9!=l{wGzi@qO}_wL(uN>LPB z2;TA+Y!yC$gN|eWq7WjVPN%-1sub~f>{>DzpNqvDq3b#YFomBuO;%;821qmx7iRPI z+uz)0Kl2!#_~Soidv@=vZQtI1*|M#o?N|@a%;c-X!y{LQhe!MmJ@kM=2*Jeo^dZC0 zn@933LjcGFSlGK~u;#?#qN~{%P8ZG(xZNBpF z{tc#QX5rX26GFIgv>kAkcy!l!TBd3?uG1n^*te{mK_waYOvj zp#ywya66L{LQ0`Ij`Lm5^KL<7OI$|7H`p3>YpQ!)D%xBrOf=5o1^_<{qlyqh1+XKE zSmxPhpF4WXEqnIX>h3j#5cbF;N7hrtiny)|MNzTsr&KLk@ zn&!GxZzBc~(R`Qys1U*r!%zc|v2E+1z@M|2fS1&haDZMfyv34 zxiF0C2M_L#IOkaD9KI1u)5N*+m*l0(BYdH-=>Pd&d>4g6v0f~ed^AJk*IVXBh5$!n zk1zoMK^XFKrHaYPX%_%E=b}=rZh7ZhoIQI1&5H>NrfJw0hAu|{_^r3zvY`ogqejt| z7F_=xMn@;`@sB;a!D3g3bB-ut(r+3D(1-@vvY6yHZQ8VH)8;+IhR*9NCM z4Yo2mbTkYP8XB7*AC1is18!)PC;;HvwQ)>LPJ?rSTxSM7JzY>$b=}wZZ6t3{17J!i zJDSfi03d`c5JIY0qbX{=EU8}s04{`t1QbP~LP)5p%2idp;b#FVrQ8W%2j^lx=UgX* z{1G7pnx;ZZ`SDtY0Q}Kwue}Z-MCxHtLrv4v;&GLrF$~sZAX!lW*WJ_W5P~!S zEEY?j7~H+%tZ5igXJ>X=aDICbMul3ve$DfIB$M&qJ9Oy4NDzd3(1_yLP{!C2WE4du z0CqmVz|iO*rIeaiu3j_gC^ch_gTDSAaqxY&tgGO)XaH?~P9uZ}Ri%i8`Ez7K=l8GwTk;1Yb z9)IFVJow-})V576lkPAL!{C->*3n!EHhqJ{bpp`Pu)hZYSQIfO48uME=PQ-!e~rgu zL$+-{O`0XvYHmtVh^r_{WLf5o%pg&kZS&CxqN)K9Taq)h}>v{&;95n%+D8!vvc!hG_ttr*y8&GR$!?|Yu%>t^<1vr3WSWIF&~(WF?RLps6RC| zi>c{Z4?sXEjXwLC$JWz^e^J)64``*dMrgRj6h%?EWm#1T@M^Ut0El>e^YH-xoNVMY zsNpB~i9~3u^R1!8(D2V~VH0mG8+D8X&1Zq11XTcAv+4O~W!)Q<)*<8M$ul_l`Wf=* zqYtN3$wbmLO`#}CNl{3NQhL)EM%L{cG|k4Ee)9D*1b{j*K4s6&&0Dp4T@AyKQc7>C zB#h03%ToaMTjws0zx?vCb1}yruDfpQUt8QXY&u^+N(sZzA3T5l(q1X#O*Q_3%?W^` z@t-E*K@h%KE?36@6kXTfa&y>?WHTu<5{+9XT*er}C=&I$3(K-@nhCH?n>KCQyw~~v XW^ct03O`@}00000NkvXXu0mjf`8A*h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi/meta.json b/Resources/Textures/Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi/meta.json index 9550a7217d..797abd80ee 100644 --- a/Resources/Textures/Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi/meta.json @@ -586,6 +586,21 @@ 0.10599999 ] ] + }, + { + "name": "artifact-activation", + "delays": [ + [ + 0.100, + 0.100, + 0.100, + 0.100, + 0.100, + 0.100, + 0.100, + 0.100 + ] + ] } ] } From 3f35b0d29654383dcdd6af7f1ed3944ce5c1d310 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 15 Apr 2025 00:36:00 +0000 Subject: [PATCH 134/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 003dc3bcc0..38ac77db73 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: Silicons now have a proper preview in the lobby/character editor. - type: Tweak - id: 7686 - time: '2024-12-08T01:46:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33763 - author: PJB3005 changes: - message: You can now use Interact (E by default) to toggle radiation collectors, @@ -3896,3 +3889,14 @@ id: 8185 time: '2025-04-14T23:27:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36472 +- author: EmoGarbage404, Fildrance + changes: + - message: new ui for analysis console, new ui for node scanner. Artifact node activation + is now different. + type: Add + - message: artifacts cannot create massive distruction events, become guns or music + instruments. Sentient artifacts cannot activate nodes. + type: Remove + id: 8186 + time: '2025-04-15T00:34:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33370 From b0f2e4dc26fb03e7c89e6593fa21b5d8cbab3d51 Mon Sep 17 00:00:00 2001 From: Deerstop Date: Tue, 15 Apr 2025 11:05:28 +1000 Subject: [PATCH 135/622] changed theatre doors back to theatre access, moved some wallmounts in engi locker --- Resources/Maps/elkridge.yml | 46 +++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/Resources/Maps/elkridge.yml b/Resources/Maps/elkridge.yml index 72d0a4f03b..6669b10ec3 100644 --- a/Resources/Maps/elkridge.yml +++ b/Resources/Maps/elkridge.yml @@ -4,7 +4,7 @@ meta: engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 04/14/2025 23:40:43 + time: 04/15/2025 00:47:30 entityCount: 17536 maps: - 1 @@ -11737,14 +11737,14 @@ entities: name: air alarm (Engineering Locker Room) - type: Transform rot: 1.5707963267948966 rad - pos: 25.5,-14.5 + pos: 22.5,-12.5 parent: 2 - type: DeviceList devices: + - 13803 - 9209 - 9168 - 9210 - - 13803 - uid: 13789 components: - type: MetaData @@ -14332,7 +14332,7 @@ entities: pos: 47.5,5.5 parent: 2 - type: Door - secondsUntilStateChange: -417659.4 + secondsUntilStateChange: -418041.62 state: Opening - type: DeviceLinkSource lastSignals: @@ -14558,13 +14558,6 @@ entities: parent: 2 - proto: AirlockMaintServiceLocked entities: - - uid: 302 - components: - - type: MetaData - name: maintenance access (Service) - - type: Transform - pos: 6.5,11.5 - parent: 2 - uid: 3126 components: - type: MetaData @@ -14586,6 +14579,15 @@ entities: - type: Transform pos: -27.5,-29.5 parent: 2 +- proto: AirlockMaintTheatreLocked + entities: + - uid: 303 + components: + - type: MetaData + name: maintenance access (Theatre) + - type: Transform + pos: 6.5,11.5 + parent: 2 - proto: AirlockMedicalGlassLocked entities: - uid: 3915 @@ -14936,13 +14938,6 @@ entities: parent: 2 - proto: AirlockServiceLocked entities: - - uid: 303 - components: - - type: MetaData - name: airlock (Backstage) - - type: Transform - pos: 6.5,4.5 - parent: 2 - uid: 3129 components: - type: MetaData @@ -14967,6 +14962,13 @@ entities: rot: -1.5707963267948966 rad pos: 5.5,8.5 parent: 2 + - uid: 302 + components: + - type: MetaData + name: airlock (Theatre) + - type: Transform + pos: 6.5,4.5 + parent: 2 - proto: AirlockVirologyLocked entities: - uid: 3976 @@ -57100,10 +57102,10 @@ entities: - uid: 12553 components: - type: MetaData - name: fire alarm (Engineering Locker Room) + name: fire alarm (Engineeering Locker Room) - type: Transform rot: 1.5707963267948966 rad - pos: 25.5,-15.5 + pos: 22.5,-13.5 parent: 2 - type: DeviceList devices: @@ -58361,9 +58363,9 @@ entities: - type: DeviceNetwork deviceLists: - 13800 - - 12553 - - 8138 - 12810 + - 8138 + - 12553 - uid: 13809 components: - type: Transform From f73d721aa5f37232d93f086b6f4a4dbbd5104c70 Mon Sep 17 00:00:00 2001 From: TytosB <54259736+TytosB@users.noreply.github.com> Date: Mon, 14 Apr 2025 20:47:02 -0500 Subject: [PATCH 136/622] loop station dept request pcs (#36566) * request pcs * forgor lockboxes * allocation pc --- Resources/Maps/loop.yml | 257 +++++++++++++++++++++++++++++----------- 1 file changed, 187 insertions(+), 70 deletions(-) diff --git a/Resources/Maps/loop.yml b/Resources/Maps/loop.yml index 0f7f4a55ed..af441f6106 100644 --- a/Resources/Maps/loop.yml +++ b/Resources/Maps/loop.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 248.0.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 03/19/2025 20:53:24 - entityCount: 17797 + time: 04/14/2025 22:52:39 + entityCount: 17812 maps: - 1 grids: @@ -7277,7 +7277,7 @@ entities: pos: -30.5,13.5 parent: 2 - type: Door - secondsUntilStateChange: -51840.86 + secondsUntilStateChange: -52499.977 state: Opening - type: DeviceLinkSource lastSignals: @@ -12168,11 +12168,6 @@ entities: - type: Transform pos: -65.99897,12.61907 parent: 2 - - uid: 5181 - components: - - type: Transform - pos: -33.630547,42.726795 - parent: 2 - uid: 6342 components: - type: Transform @@ -34502,6 +34497,41 @@ entities: - type: Transform pos: 5.5,66.5 parent: 2 +- proto: CargoRequestEngineeringComputerCircuitboard + entities: + - uid: 5181 + components: + - type: Transform + pos: -27.446213,16.10369 + parent: 2 +- proto: CargoRequestMedicalComputerCircuitboard + entities: + - uid: 6362 + components: + - type: Transform + pos: -27.461838,17.69744 + parent: 2 +- proto: CargoRequestScienceComputerCircuitboard + entities: + - uid: 6363 + components: + - type: Transform + pos: -27.477463,17.306814 + parent: 2 +- proto: CargoRequestSecurityComputerCircuitboard + entities: + - uid: 6472 + components: + - type: Transform + pos: -27.477463,16.91619 + parent: 2 +- proto: CargoRequestServiceComputerCircuitboard + entities: + - uid: 5829 + components: + - type: Transform + pos: -27.446213,16.50994 + parent: 2 - proto: Carpet entities: - uid: 15027 @@ -39617,6 +39647,12 @@ entities: rot: -1.5707963267948966 rad pos: 0.54984474,72.83825 parent: 2 + - uid: 13992 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.385203,35.704662 + parent: 2 - uid: 15176 components: - type: Transform @@ -40028,6 +40064,13 @@ entities: - type: Transform pos: -59.5,-6.5 parent: 2 +- proto: ChemistryBottleUnstableMutagen + entities: + - uid: 15490 + components: + - type: Transform + pos: -54.314514,40.52692 + parent: 2 - proto: ChemistryEmptyBottle01 entities: - uid: 15531 @@ -41897,7 +41940,7 @@ entities: - uid: 5177 components: - type: Transform - pos: -38.141457,44.585876 + pos: -37.779823,44.625 parent: 2 - proto: CombatKnife entities: @@ -41943,12 +41986,6 @@ entities: rot: 3.141592653589793 rad pos: -15.5,67.5 parent: 2 - - uid: 5829 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,35.5 - parent: 2 - proto: CommandmentCircuitBoard entities: - uid: 5336 @@ -41967,11 +42004,11 @@ entities: parent: 2 - proto: ComputerAlert entities: - - uid: 6472 + - uid: 5828 components: - type: Transform rot: 1.5707963267948966 rad - pos: -10.5,5.5 + pos: -10.5,3.5 parent: 2 - uid: 7074 components: @@ -42061,6 +42098,45 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,71.5 parent: 2 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 5182 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -10.5,5.5 + parent: 2 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 17799 + components: + - type: Transform + pos: -26.5,25.5 + parent: 2 +- proto: ComputerCargoOrdersScience + entities: + - uid: 6361 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,35.5 + parent: 2 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 6474 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -33.5,42.5 + parent: 2 +- proto: ComputerCargoOrdersService + entities: + - uid: 17812 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -55.5,51.5 + parent: 2 - proto: ComputerCargoShuttle entities: - uid: 2716 @@ -42152,6 +42228,14 @@ entities: - type: Transform pos: -16.5,75.5 parent: 2 +- proto: ComputerFundingAllocation + entities: + - uid: 5179 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -30.5,63.5 + parent: 2 - proto: ComputerId entities: - uid: 6612 @@ -42233,12 +42317,6 @@ entities: rot: 1.5707963267948966 rad pos: 6.5,57.5 parent: 2 - - uid: 6474 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -10.5,3.5 - parent: 2 - uid: 6657 components: - type: Transform @@ -43375,6 +43453,56 @@ entities: - type: Transform pos: -44.5,5.5 parent: 2 +- proto: CrateLockBoxEngineering + entities: + - uid: 17807 + components: + - type: Transform + pos: -24.5,6.5 + parent: 2 + - uid: 17810 + components: + - type: Transform + pos: -2.5,17.5 + parent: 2 +- proto: CrateLockBoxMedical + entities: + - uid: 17803 + components: + - type: Transform + pos: -19.5,30.5 + parent: 2 + - uid: 17804 + components: + - type: Transform + pos: -39.5,33.5 + parent: 2 +- proto: CrateLockBoxScience + entities: + - uid: 17805 + components: + - type: Transform + pos: 17.5,38.5 + parent: 2 +- proto: CrateLockBoxSecurity + entities: + - uid: 17806 + components: + - type: Transform + pos: -28.5,44.5 + parent: 2 +- proto: CrateLockBoxService + entities: + - uid: 17808 + components: + - type: Transform + pos: -59.5,45.5 + parent: 2 + - uid: 17809 + components: + - type: Transform + pos: -33.5,60.5 + parent: 2 - proto: CrateMedicalSurgery entities: - uid: 5690 @@ -43764,7 +43892,7 @@ entities: pos: -9.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -299596.4 + secondsUntilStateChange: -300255.53 state: Opening - uid: 6747 components: @@ -43772,7 +43900,7 @@ entities: pos: -8.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -299597.12 + secondsUntilStateChange: -300256.25 state: Opening - uid: 6749 components: @@ -43780,7 +43908,7 @@ entities: pos: -6.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -299595.7 + secondsUntilStateChange: -300254.8 state: Opening - uid: 6750 components: @@ -43788,7 +43916,7 @@ entities: pos: -5.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -299595.06 + secondsUntilStateChange: -300254.2 state: Opening - uid: 9721 components: @@ -52710,7 +52838,7 @@ entities: - uid: 5162 components: - type: Transform - pos: -37.568985,44.778774 + pos: -37.311073,44.78125 parent: 2 - uid: 5163 components: @@ -53067,6 +53195,14 @@ entities: - type: Transform pos: -53.45894,65.60686 parent: 2 +- proto: FundingAllocationComputerCircuitboard + entities: + - uid: 17811 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -10.469555,74.37512 + parent: 2 - proto: GameMasterCircuitBoard entities: - uid: 5329 @@ -76361,11 +76497,6 @@ entities: parent: 2 - proto: Lamp entities: - - uid: 5182 - components: - - type: Transform - pos: -33.349297,42.633045 - parent: 2 - uid: 5883 components: - type: Transform @@ -77465,6 +77596,13 @@ entities: - type: Transform pos: 24.282629,16.96738 parent: 2 +- proto: MailBag + entities: + - uid: 17798 + components: + - type: Transform + pos: 3.5258055,77.07606 + parent: 2 - proto: MaintenanceFluffSpawner entities: - uid: 13003 @@ -78592,11 +78730,6 @@ entities: - type: Transform pos: -27.5,25.5 parent: 2 - - uid: 13992 - components: - - type: Transform - pos: 7.5,35.5 - parent: 2 - uid: 16632 components: - type: Transform @@ -83443,17 +83576,7 @@ entities: - type: Transform pos: -32.5,15.5 parent: 2 - - uid: 6361 - components: - - type: Transform - pos: -27.5,17.5 - parent: 2 - - uid: 6362 - components: - - type: Transform - pos: -27.5,16.5 - parent: 2 - - uid: 6363 + - uid: 17800 components: - type: Transform pos: -27.5,15.5 @@ -93227,7 +93350,7 @@ entities: - uid: 5161 components: - type: Transform - pos: -38.230072,44.56757 + pos: -38.029823,44.609375 parent: 2 - proto: SubstationBasic entities: @@ -95121,12 +95244,6 @@ entities: - type: Transform pos: -37.5,42.5 parent: 2 - - uid: 5179 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -33.5,42.5 - parent: 2 - uid: 5392 components: - type: Transform @@ -95264,11 +95381,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,35.5 parent: 2 - - uid: 5828 - components: - - type: Transform - pos: 7.5,35.5 - parent: 2 - uid: 5838 components: - type: Transform @@ -97662,7 +97774,7 @@ entities: - uid: 5790 components: - type: Transform - pos: -33.676872,42.47227 + pos: -38.37745,44.65625 parent: 2 - proto: ToyFigurineSpaceDragon entities: @@ -97932,13 +98044,6 @@ entities: - type: Transform pos: -40.292664,59.497982 parent: 2 -- proto: UnstableMutagenChemistryBottle - entities: - - uid: 15490 - components: - - type: Transform - pos: -54.314514,40.52692 - parent: 2 - proto: Vaccinator entities: - uid: 7013 @@ -110527,6 +110632,18 @@ entities: - type: Transform pos: -34.50039,40.60095 parent: 2 +- proto: WeaponTurretSyndicateBroken + entities: + - uid: 17801 + components: + - type: Transform + pos: -27.5,87.5 + parent: 2 + - uid: 17802 + components: + - type: Transform + pos: -15.5,89.5 + parent: 2 - proto: WeldingFuelTankFull entities: - uid: 1641 From 07b7d839cbef5b01fe70db21dc57c9653de7df88 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 14 Apr 2025 23:38:31 -0400 Subject: [PATCH 137/622] Fix skeletons not becoming skulls on gib (#36571) --- Resources/Prototypes/Body/Parts/skeleton.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Body/Parts/skeleton.yml b/Resources/Prototypes/Body/Parts/skeleton.yml index 1b378c6233..378c4263dc 100644 --- a/Resources/Prototypes/Body/Parts/skeleton.yml +++ b/Resources/Prototypes/Body/Parts/skeleton.yml @@ -14,7 +14,6 @@ ents: [] - type: StaticPrice price: 20 - - type: Gibbable - type: Tag tags: - Trash @@ -37,7 +36,7 @@ id: HeadSkeleton name: "skull" description: Alas poor Yorick... - parent: PartSkeleton + parent: [ PartSkeleton, BaseMob ] components: - type: Sprite sprite: Mobs/Species/Skeleton/parts.rsi @@ -47,10 +46,12 @@ state: "skull_icon" - type: BodyPart partType: Head + - type: BlockMovement - type: Input context: "human" - type: Speech speechVerb: Skeleton + speechSounds: Alto - type: SkeletonAccent - type: Actions - type: Vocal From 518e091e6180066b83401776b014090435e0c54f Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 15 Apr 2025 03:39:38 +0000 Subject: [PATCH 138/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 38ac77db73..fa74468733 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: You can now use Interact (E by default) to toggle radiation collectors, - field generators, and emitters. Previously you had to click with an empty hand. - type: Fix - id: 7687 - time: '2024-12-08T22:37:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33762 - author: ArtisticRoomba changes: - message: Detectives are now required to start with outer clothing (armor) like @@ -3900,3 +3892,10 @@ id: 8186 time: '2025-04-15T00:34:53.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33370 +- author: EmoGarbage404 + changes: + - message: Skeletons once again become living skulls on death. + type: Fix + id: 8187 + time: '2025-04-15T03:38:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36571 From bf84924067b1256071158d4428bc1b22b261c8a9 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 14 Apr 2025 23:44:09 -0400 Subject: [PATCH 139/622] Fix shadow anomalies dropping stacks of artifact fragments (#36578) --- .../Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml index bb79958095..4434c6d05d 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml @@ -23,4 +23,4 @@ rareChance: 0.05 rarePrototypes: - MobCatShadow - - ArtifactFragment \ No newline at end of file + - ArtifactFragment1 From 542ac16a1482987dad4ff76249d5f000fb4f2758 Mon Sep 17 00:00:00 2001 From: Spessmann <156740760+Spessmann@users.noreply.github.com> Date: Mon, 14 Apr 2025 21:15:18 -0700 Subject: [PATCH 140/622] Convex update (#36575) conbex updoot --- Resources/Maps/convex.yml | 680 ++++++++++++++++++++++---------------- 1 file changed, 393 insertions(+), 287 deletions(-) diff --git a/Resources/Maps/convex.yml b/Resources/Maps/convex.yml index 17c7ed59a5..8abcde39a8 100644 --- a/Resources/Maps/convex.yml +++ b/Resources/Maps/convex.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 250.0.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 04/08/2025 17:45:29 - entityCount: 37729 + time: 04/15/2025 00:13:23 + entityCount: 37740 maps: - 353 grids: @@ -83,19 +83,19 @@ entities: version: 6 1,4: ind: 1,4 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAACAAAAAACAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAACAAAAAABAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 1,5: ind: 1,5 - tiles: AAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACAAAAAADAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAAAAAAAAAAAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACAAAAAADAgAAAAAACAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACAAAAAABAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAAAAAAAAAAAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACAAAAAACAgAAAAAACAAAAAABCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 1,6: ind: 1,6 - tiles: AAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACBQAAAAABBQAAAAADBQAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACBQAAAAADBQAAAAADBQAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAACBQAAAAADBQAAAAACAwAAAAACAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAABAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACBQAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAADAwAAAAAB + tiles: AAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACBQAAAAACBQAAAAACBQAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAACBQAAAAAABQAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAAABQAAAAADBQAAAAABAwAAAAADAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAABAAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACBQAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAABAwAAAAAA version: 6 1,7: ind: 1,7 - tiles: AAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAAAIQAAAAAAIQAAAAADAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAABQAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAABAgAAAAAAIQAAAAABIQAAAAABAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAABAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAACBQAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAIAAAAAAAAgAAAAAABgAAAAACBgAAAAACBgAAAAACAgAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABgAAAAABBgAAAAADBgAAAAADBgAAAAAABgAAAAADAgAAAAAAAgAAAAAAIAAAAAAAAwAAAAAAAwAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABgAAAAAABgAAAAAABgAAAAADBgAAAAACBgAAAAABBgAAAAAABgAAAAABBgAAAAABAgAAAAAAAgAAAAAAAwAAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABgAAAAAABgAAAAADBgAAAAADAgAAAAAABgAAAAABBgAAAAABBgAAAAADBgAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + tiles: AAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAADIQAAAAADIQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAABQAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAAAAgAAAAAAIQAAAAACIQAAAAABAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAADAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAACBQAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAACAwAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAIAAAAAAAAgAAAAAABgAAAAADBgAAAAAABgAAAAADAgAAAAAAIAAAAAAAIAAAAAAAIAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABgAAAAABBgAAAAAABgAAAAAABgAAAAADBgAAAAACAgAAAAAAAgAAAAAAIAAAAAAEAwAAAAACAwAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABgAAAAABBgAAAAADBgAAAAACBgAAAAADBgAAAAADBgAAAAADBgAAAAADBgAAAAADAgAAAAAAAgAAAAAAAwAAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABgAAAAACBgAAAAABBgAAAAADAgAAAAAABgAAAAABBgAAAAACBgAAAAAABgAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA version: 6 1,8: ind: 1,8 @@ -107,35 +107,35 @@ entities: version: 6 10,2: ind: 10,2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAQAAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAQAAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAA version: 6 10,3: ind: 10,3 - tiles: AwAAAAADAwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAA + tiles: AwAAAAABAwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAA version: 6 10,4: ind: 10,4 - tiles: AgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAABwAAAAADBwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAABwAAAAACBwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAABwAAAAADBwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABwAAAAACBwAAAAADAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABwAAAAADBwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABwAAAAABBwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAADBwAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAABBwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAABwAAAAAABwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAABwAAAAADBwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAABwAAAAABBwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABwAAAAABBwAAAAACAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABwAAAAADBwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABwAAAAACBwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAADBwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAADBwAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 10,5: ind: 10,5 - tiles: AwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 10,6: ind: 10,6 - tiles: AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAABCAAAAAAACAAAAAAACAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAACAAAAAACCAAAAAADCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAACCAAAAAACCAAAAAADCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAACAAAAAAACAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAABCAAAAAABCAAAAAAACAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAACAAAAAACCAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 10,7: ind: 10,7 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 10,8: ind: 10,8 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 10,9: ind: 10,9 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACAAAAAACCgAAAAAACAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACAAAAAADCgAAAAABCAAAAAABAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAACCAAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACAAAAAADCgAAAAABCAAAAAADAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACAAAAAACCgAAAAABCAAAAAABAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 11,2: ind: 11,2 @@ -155,31 +155,31 @@ entities: version: 6 2,1: ind: 2,1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAADCAAAAAABBQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAAACAAAAAACCQAAAAAACAAAAAACCAAAAAABCAAAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAABAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACQAAAAAAAgAAAAAACQAAAAAACQAAAAAACQAAAAAACAAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAABAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAADCAAAAAACCQAAAAAACAAAAAADCAAAAAADCAAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAABCAAAAAACBQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAABAAAAAAABAAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAABCAAAAAABBQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAACCAAAAAACCQAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACQAAAAAAAgAAAAAACQAAAAAACQAAAAAACQAAAAAACAAAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAACAAAAAADCAAAAAABCQAAAAAACAAAAAAACAAAAAABCAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAACAAAAAABCAAAAAACBQAAAAABAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAABAAAAAAABAAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAA version: 6 2,2: ind: 2,2 - tiles: AQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAACAAAAAABCAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAACAAAAAABCAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAACAAAAAADCAAAAAADCAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAACAAAAAABCAAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAACAAAAAACCAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAACCAAAAAABCAAAAAABCAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAACCAAAAAADCAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAADAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAD + tiles: AQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAACAAAAAAACAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAACAAAAAAACAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAACAAAAAACCAAAAAACCAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAACAAAAAADCAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAACAAAAAACCAAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAADAwAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAABCAAAAAAACAAAAAABCAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAAACAAAAAACCAAAAAABCAAAAAABAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAD version: 6 2,3: ind: 2,3 - tiles: AgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAABCAAAAAAACAAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAADAgAAAAAACAAAAAABCgAAAAACAgAAAAAACAAAAAADCAAAAAACCAAAAAABCgAAAAACCAAAAAACCgAAAAAACAAAAAACCAAAAAADFAAAAAAACAAAAAADCAAAAAABCAAAAAAAAgAAAAAACAAAAAADCAAAAAABAgAAAAAACAAAAAADCgAAAAACCAAAAAACCAAAAAACCAAAAAABCAAAAAABCAAAAAADCAAAAAAAFAAAAAAACAAAAAACCAAAAAACCAAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAAACAAAAAADCAAAAAADCAAAAAADCAAAAAACCAAAAAADCAAAAAACCAAAAAAAFAAAAAAACAAAAAAACAAAAAAACAAAAAADAgAAAAAACAAAAAADCAAAAAADCAAAAAADCgAAAAABCAAAAAADCAAAAAABCAAAAAADCAAAAAACCAAAAAADCgAAAAAACAAAAAABAgAAAAAACAAAAAAACAAAAAADCAAAAAABAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAAACAAAAAACAgAAAAAACAAAAAADAgAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAACAAAAAADCAAAAAADCAAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAABCgAAAAAACAAAAAADAgAAAAAACwAAAAAAAgAAAAAACAAAAAAACgAAAAABCAAAAAABAgAAAAAACAAAAAADCAAAAAAACAAAAAADAgAAAAAACAAAAAADCAAAAAAACAAAAAACCAAAAAACCAAAAAADAgAAAAAACwAAAAABAgAAAAAACAAAAAAACAAAAAACCAAAAAABAgAAAAAACAAAAAABCAAAAAADCAAAAAACAgAAAAAACAAAAAAACAAAAAAACAAAAAACCgAAAAAACAAAAAACAgAAAAAACwAAAAADAgAAAAAACAAAAAACCgAAAAADCAAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAACAgAAAAAACAAAAAAACAAAAAABCAAAAAACCAAAAAADCAAAAAAAAgAAAAAACwAAAAABAgAAAAAACAAAAAABCAAAAAAACAAAAAABAgAAAAAACAAAAAAACAAAAAACCAAAAAADFAAAAAAACAAAAAAACAAAAAADCAAAAAAACgAAAAADCAAAAAADAgAAAAAACwAAAAAAAgAAAAAACAAAAAADCgAAAAABCAAAAAACAgAAAAAACAAAAAABCAAAAAABCAAAAAADFAAAAAAACAAAAAAACAAAAAADCAAAAAAACAAAAAABCAAAAAADAgAAAAAACwAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAACAAAAAACCAAAAAACCAAAAAADFAAAAAAACAAAAAADCAAAAAACCAAAAAAACgAAAAACCAAAAAACAgAAAAAACwAAAAAAAgAAAAAACAAAAAAACgAAAAACCAAAAAADAgAAAAAACAAAAAACCAAAAAAACAAAAAAAAgAAAAAACAAAAAADCgAAAAADCAAAAAADCAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAADFAAAAAAACAAAAAADCAAAAAABCAAAAAADAgAAAAAAAgAAAAAACgAAAAADCAAAAAACCgAAAAADCAAAAAABCAAAAAABCAAAAAACCAAAAAADCAAAAAABCgAAAAACCAAAAAAAFAAAAAAACAAAAAACCAAAAAACCAAAAAAAAgAAAAAACAAAAAADCgAAAAACCAAAAAAACAAAAAADCgAAAAACCAAAAAAACgAAAAABCAAAAAADCgAAAAADCAAAAAABCAAAAAABFAAAAAAACAAAAAAACAAAAAADCAAAAAAAAgAAAAAACAAAAAADCAAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAADCAAAAAADCAAAAAADAgAAAAAACAAAAAABCAAAAAADCAAAAAACAgAAAAAACAAAAAADCgAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAABCgAAAAAACAAAAAABCgAAAAAACAAAAAADCAAAAAABFAAAAAAACAAAAAAACAAAAAAACAAAAAADAgAAAAAACAAAAAADCAAAAAABAgAAAAAACAAAAAACCgAAAAACCAAAAAABCAAAAAAACAAAAAADCAAAAAACCAAAAAACCAAAAAABFAAAAAAACAAAAAACCAAAAAAACAAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAADCAAAAAACCAAAAAABCAAAAAABCAAAAAAAFAAAAAAACAAAAAADCAAAAAACCAAAAAABAgAAAAAACAAAAAABCAAAAAAACAAAAAABCgAAAAADCAAAAAAACAAAAAACCAAAAAACCAAAAAAACAAAAAAACgAAAAACCAAAAAABAgAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAABCAAAAAACAgAAAAAACAAAAAADAgAAAAAACAAAAAAACAAAAAACCAAAAAADAgAAAAAACAAAAAADCAAAAAABCAAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAADCgAAAAACCAAAAAABAgAAAAAACwAAAAACAgAAAAAACAAAAAADCgAAAAABCAAAAAACAgAAAAAACAAAAAADCAAAAAACCAAAAAABAgAAAAAACAAAAAABCAAAAAACCAAAAAAACAAAAAABCAAAAAABAgAAAAAACwAAAAABAgAAAAAACAAAAAADCAAAAAAACAAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAADAgAAAAAACAAAAAACCAAAAAADCAAAAAABCgAAAAADCAAAAAADAgAAAAAACwAAAAACAgAAAAAACAAAAAAACgAAAAACCAAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAADAgAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAAACAAAAAADAgAAAAAACwAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAACAAAAAADCAAAAAABCAAAAAACFAAAAAAACAAAAAADCAAAAAADCAAAAAADCgAAAAACCAAAAAADAgAAAAAACwAAAAAAAgAAAAAACAAAAAACCgAAAAACCAAAAAACAgAAAAAACAAAAAAACAAAAAACCAAAAAADFAAAAAAACAAAAAACCAAAAAABCAAAAAACCAAAAAACCAAAAAABAgAAAAAACwAAAAADAgAAAAAACAAAAAAACAAAAAACCAAAAAABAgAAAAAACAAAAAADCAAAAAADCAAAAAACFAAAAAAACAAAAAABCAAAAAADCAAAAAADCgAAAAAACAAAAAADAgAAAAAACwAAAAABAgAAAAAACAAAAAADCgAAAAAACAAAAAADAgAAAAAACAAAAAABCAAAAAABCAAAAAABAgAAAAAACAAAAAADCgAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAADFAAAAAAACAAAAAADCAAAAAAACAAAAAABAgAAAAAAAgAAAAAACgAAAAABCAAAAAABCgAAAAACCAAAAAACCAAAAAADCAAAAAADCAAAAAABCAAAAAABCgAAAAACCAAAAAACFAAAAAAACAAAAAAACAAAAAABCAAAAAADAgAAAAAACAAAAAADCgAAAAADCAAAAAABCAAAAAADCgAAAAABCAAAAAABCgAAAAAACAAAAAAACgAAAAAACAAAAAACCAAAAAABFAAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAACAAAAAAACAAAAAAC version: 6 2,4: ind: 2,4 - tiles: CAAAAAACCAAAAAABCAAAAAABCAAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAAACAAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAADAgAAAAAACAAAAAABCgAAAAADAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAACCgAAAAAADAAAAAABDAAAAAAADAAAAAACDAAAAAADAgAAAAAABwAAAAABBwAAAAADBwAAAAABBwAAAAABAgAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAACAAAAAACCAAAAAABDAAAAAACDAAAAAAADAAAAAAADAAAAAACBwAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAABDQAAAAAADAAAAAABDAAAAAABAgAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAACAgAAAAAACAAAAAACCAAAAAACCAAAAAAAAgAAAAAACAAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAADBwAAAAADBwAAAAACBwAAAAADBwAAAAADCAAAAAABAgAAAAAACAAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAADBwAAAAABBwAAAAADBwAAAAACBwAAAAABBwAAAAAABwAAAAAABwAAAAADBwAAAAADBwAAAAACAgAAAAAACAAAAAAACAAAAAAACAAAAAABAgAAAAAACAAAAAADCAAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAACCAAAAAADBwAAAAADBwAAAAACBwAAAAACBwAAAAADAgAAAAAACAAAAAAACAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABCAAAAAABBwAAAAADBwAAAAAABwAAAAAABwAAAAAACAAAAAABCAAAAAACCAAAAAADCAAAAAACAgAAAAAACAAAAAADCAAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAAACAAAAAABBwAAAAACBwAAAAAABwAAAAADBwAAAAABAgAAAAAACAAAAAACCAAAAAACCAAAAAADCAAAAAABCAAAAAACCAAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAABCAAAAAADBwAAAAADBwAAAAABBwAAAAACBwAAAAADAgAAAAAACAAAAAACCAAAAAAACAAAAAAAAgAAAAAACAAAAAABCAAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAADCAAAAAACBwAAAAACBwAAAAAABwAAAAACBwAAAAACAgAAAAAACAAAAAADCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAA + tiles: CAAAAAACCAAAAAABCAAAAAADCAAAAAABCAAAAAABCAAAAAABCAAAAAAACAAAAAADCAAAAAACAgAAAAAACAAAAAACCAAAAAACCAAAAAAAAgAAAAAACAAAAAABCgAAAAACAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAABCgAAAAADDAAAAAADDAAAAAACDAAAAAABDAAAAAABAgAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAACAgAAAAAACAAAAAABCAAAAAABCAAAAAAAAgAAAAAACAAAAAADCAAAAAABDAAAAAADDAAAAAACDAAAAAACDAAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAADAgAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAADAAAAAABDQAAAAAADAAAAAAADAAAAAACAgAAAAAABwAAAAADBwAAAAABBwAAAAAABwAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAABAgAAAAAACAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAABCAAAAAABCAAAAAADCAAAAAADBwAAAAAABwAAAAADBwAAAAADBwAAAAACBwAAAAAABwAAAAABBwAAAAADBwAAAAABCAAAAAABAgAAAAAACAAAAAADCAAAAAABCAAAAAAACAAAAAABCAAAAAAACAAAAAACBwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAACBwAAAAAABwAAAAAABwAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAAACAAAAAAACAAAAAACCAAAAAACCAAAAAABBwAAAAABBwAAAAAABwAAAAACBwAAAAABAgAAAAAACAAAAAACCAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADCAAAAAABBwAAAAADBwAAAAACBwAAAAACBwAAAAACCAAAAAAACAAAAAACCAAAAAABCAAAAAACAgAAAAAACAAAAAAACAAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAACCAAAAAADBwAAAAABBwAAAAABBwAAAAADBwAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAAACAAAAAABCAAAAAAACAAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAACCAAAAAADBwAAAAABBwAAAAAABwAAAAACBwAAAAABAgAAAAAACAAAAAACCAAAAAACCAAAAAADAgAAAAAACAAAAAACCAAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACCAAAAAACBwAAAAADBwAAAAADBwAAAAABBwAAAAADAgAAAAAACAAAAAADCAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 2,5: ind: 2,5 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAAABQAAAAADBQAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABBQAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAABAwAAAAABBAAAAAAABAAAAAAABAAAAAAAAwAAAAABBQAAAAADAwAAAAADBQAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAADBQAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAADBQAAAAACAwAAAAADBQAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAABBQAAAAADBAAAAAAABAAAAAAAAgAAAAAAAwAAAAADBQAAAAAAAwAAAAACBQAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABBAAAAAAABAAAAAAAAgAAAAAAAwAAAAADBQAAAAADAwAAAAAABQAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAACBQAAAAAAAwAAAAABBQAAAAABAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAABQAAAAADBAAAAAAABAAAAAAABAAAAAAAAwAAAAACBQAAAAACAwAAAAABBQAAAAACAwAAAAABAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAAAAwAAAAABBAAAAAAABAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAwAAAAADBQAAAAACBQAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACBQAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACBAAAAAAABAAAAAAABAAAAAAAAwAAAAAABQAAAAABAwAAAAABBQAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAACBQAAAAABBAAAAAAABAAAAAAAAgAAAAAAAwAAAAADBQAAAAABAwAAAAAABQAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACBQAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAABBQAAAAACAwAAAAADBQAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAADBAAAAAAABAAAAAAAAgAAAAAAAwAAAAAABQAAAAAAAwAAAAADBQAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAAABQAAAAACAwAAAAADBQAAAAACAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACBQAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAADBQAAAAACAwAAAAADBQAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAABBAAAAAAABAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAB version: 6 2,6: ind: 2,6 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAABCwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAAACwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAgAAAAAACAAAAAAACAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAACAAAAAAACAAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAACCAAAAAADCAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAADAgAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAACCAAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAACAAAAAACCAAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAgAAAAAACAAAAAABCAAAAAAACAAAAAAACAAAAAABCAAAAAADAwAAAAAAAwAAAAACAwAAAAADCAAAAAADCAAAAAABCAAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAACAAAAAABCAAAAAACCAAAAAABCAAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAACAAAAAACCAAAAAAAAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAADAwAAAAADAgAAAAAAAwAAAAABAgAAAAAACgAAAAAACgAAAAAACgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAgAAAAAACgAAAAABCgAAAAADAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAACCwAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAACCwAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAACAAAAAACCAAAAAACCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAACAAAAAAACAAAAAACCAAAAAABCAAAAAADCAAAAAACCAAAAAABCAAAAAAACAAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAABAgAAAAAACAAAAAAACAAAAAABCAAAAAAACAAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAABCAAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAACAAAAAABCAAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAACAgAAAAAACAAAAAADCAAAAAADCAAAAAAACAAAAAACCAAAAAACAwAAAAADAwAAAAABAwAAAAACCAAAAAACCAAAAAADCAAAAAACAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAABCAAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAACAAAAAACCAAAAAACAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAABQAAAAADAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAACgAAAAACCgAAAAABCgAAAAADAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAACgAAAAACCgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAA version: 6 2,7: ind: 2,7 - tiles: AwAAAAACBQAAAAACBQAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAABQAAAAADBQAAAAADBQAAAAACAwAAAAACBQAAAAABBQAAAAABBQAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAABQAAAAABAwAAAAADBQAAAAADAgAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAAACgAAAAABCgAAAAAACgAAAAABCAAAAAAACAAAAAABCAAAAAAAAwAAAAABBQAAAAACAwAAAAADBQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACgAAAAAACgAAAAADCgAAAAADCAAAAAACAgAAAAAAAgAAAAAAAwAAAAADBQAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAACwAAAAACCwAAAAACAgAAAAAACAAAAAABCgAAAAADCgAAAAAACgAAAAADCAAAAAABAgAAAAAACwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAgAAAAAACwAAAAACCwAAAAACAgAAAAAACAAAAAACCgAAAAADCgAAAAABCgAAAAABCAAAAAABAgAAAAAACwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAAEAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABBwAAAAADAgAAAAAABwAAAAADBwAAAAACFgAAAAAABwAAAAABAgAAAAAABwAAAAAAAgAAAAAACwAAAAABCwAAAAABCwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAADAgAAAAAAAgAAAAAABwAAAAADBwAAAAADBwAAAAADAgAAAAAACwAAAAAACwAAAAAACwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAABAgAAAAAABwAAAAADBwAAAAACBwAAAAAABwAAAAACBwAAAAACAgAAAAAACwAAAAAACwAAAAAACwAAAAADAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAFgAAAAADBwAAAAABBwAAAAABAgAAAAAABwAAAAABAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAACwAAAAADCwAAAAACAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAACBwAAAAACBwAAAAABBwAAAAADBwAAAAAAFgAAAAAABwAAAAADAwAAAAADCwAAAAABCwAAAAABAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAADBQAAAAACBQAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADBQAAAAACBQAAAAADBQAAAAACAwAAAAAABQAAAAADBQAAAAABBQAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAgAAAAAABQAAAAACAwAAAAACBQAAAAABAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAABCAAAAAACCgAAAAACCgAAAAAACgAAAAABCAAAAAAACAAAAAADCAAAAAABAwAAAAACBQAAAAACAwAAAAABBQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCgAAAAAACgAAAAACCgAAAAADCAAAAAADAgAAAAAAAgAAAAAAAwAAAAADBQAAAAADAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAACwAAAAACCwAAAAADAgAAAAAACAAAAAAACgAAAAADCgAAAAABCgAAAAADCAAAAAACAgAAAAAACwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAACwAAAAAACwAAAAACAgAAAAAACAAAAAACCgAAAAACCgAAAAACCgAAAAADCAAAAAABAgAAAAAACwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACBwAAAAAAAgAAAAAABwAAAAADBwAAAAAAFgAAAAACBwAAAAADAgAAAAAABwAAAAAAAgAAAAAACwAAAAACCwAAAAABCwAAAAABAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAABBwAAAAADAgAAAAAACwAAAAAACwAAAAABCwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAAAAgAAAAAABwAAAAACBwAAAAADBwAAAAACBwAAAAAABwAAAAACAgAAAAAACwAAAAAACwAAAAADCwAAAAADAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAFgAAAAAGBwAAAAAABwAAAAAAAgAAAAAABwAAAAABAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAACwAAAAABCwAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAADBwAAAAACBwAAAAADBwAAAAABBwAAAAAAFgAAAAABBwAAAAACAwAAAAABCwAAAAAACwAAAAABAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 2,8: ind: 2,8 @@ -195,43 +195,43 @@ entities: version: 6 3,1: ind: 3,1 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACBAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAAABQAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAABBQAAAAACAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAABBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABBAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADBQAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAAABQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAwAAAAACAwAAAAADBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACBAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 3,10: ind: 3,10 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 3,2: ind: 3,2 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAwAAAAACAwAAAAADBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAwAAAAADAwAAAAAABAAAAAAACQAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAwAAAAACAwAAAAACBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAwAAAAADAwAAAAACCAAAAAABCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACBAAAAAAACQAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAgAAAAAACAAAAAABBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAACAAAAAADBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAADAgAAAAAACAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAwAAAAAAAwAAAAACBAAAAAAACQAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAwAAAAADAwAAAAACBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAwAAAAAAAwAAAAADCAAAAAACCAAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAwAAAAADAwAAAAABBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAABAAAAAAACQAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAgAAAAAACAAAAAADBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAACAAAAAADBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAgAAAAAACAAAAAACBAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAA version: 6 3,3: ind: 3,3 - tiles: CAAAAAABCAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAAABwAAAAADBwAAAAACBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAADAgAAAAAADAAAAAAADAAAAAADAgAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAAABwAAAAADBwAAAAACDAAAAAABDAAAAAAADAAAAAACAgAAAAAABwAAAAACCAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAADBwAAAAADAgAAAAAADAAAAAAADAAAAAABAgAAAAAABwAAAAAACAAAAAABCAAAAAABCAAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADCAAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAACCAAAAAACAgAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAAACAAAAAABCAAAAAADCAAAAAAAAgAAAAAABwAAAAAACAAAAAACCAAAAAADCAAAAAACCAAAAAADCAAAAAADCAAAAAACAgAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAADCAAAAAACCAAAAAABCAAAAAADAgAAAAAAAwAAAAACCAAAAAADCAAAAAADCAAAAAADCAAAAAAACAAAAAAACAAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAADCAAAAAAACAAAAAACCAAAAAADCAAAAAABAgAAAAAAAwAAAAAACAAAAAAACAAAAAADCAAAAAACCAAAAAACCAAAAAADCAAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAACCAAAAAACCAAAAAABCAAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAADCAAAAAABCAAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAABCAAAAAADCAAAAAABAgAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAABCAAAAAADCAAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAABCAAAAAABCAAAAAADCAAAAAAACAAAAAACCAAAAAACAgAAAAAACgAAAAADCAAAAAADCAAAAAAACAAAAAACCAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAACgAAAAACAgAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAACAgAAAAAACgAAAAACCgAAAAABCgAAAAADCgAAAAACCgAAAAABCgAAAAAACgAAAAABBQAAAAADAgAAAAAACgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACgAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAACCAAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAAB + tiles: CAAAAAABCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAAABwAAAAAABwAAAAACBwAAAAAAAgAAAAAADAAAAAAADAAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAAABwAAAAABBwAAAAABDAAAAAABDAAAAAABDAAAAAAAAgAAAAAABwAAAAAACAAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAACBwAAAAADBwAAAAACBwAAAAABAgAAAAAADAAAAAAADAAAAAABAgAAAAAABwAAAAADCAAAAAAACAAAAAABCAAAAAACAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABCAAAAAAACAAAAAACCAAAAAACCAAAAAACCAAAAAABCAAAAAABAgAAAAAACAAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAADAgAAAAAABwAAAAACCAAAAAABCAAAAAABCAAAAAACCAAAAAADCAAAAAACCAAAAAADAgAAAAAACAAAAAABCAAAAAACCAAAAAAACAAAAAAACAAAAAAACAAAAAACCAAAAAACAgAAAAAAAwAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAACCAAAAAACCAAAAAABAgAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAADCAAAAAAACAAAAAAACAAAAAACAgAAAAAAAwAAAAACCAAAAAACCAAAAAABCAAAAAABCAAAAAAACAAAAAADCAAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAABCAAAAAADCAAAAAADCAAAAAADCAAAAAABAgAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAABCAAAAAACCAAAAAABCAAAAAABCAAAAAAACAAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAABCAAAAAACAgAAAAAACAAAAAACCAAAAAABCAAAAAAACAAAAAABCAAAAAACCAAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAABCAAAAAACAgAAAAAACgAAAAADCAAAAAACCAAAAAACCAAAAAADCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAACgAAAAADAgAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAADAgAAAAAACgAAAAABCgAAAAADCgAAAAADCgAAAAAACgAAAAAACgAAAAABCgAAAAACBQAAAAACAgAAAAAACgAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA version: 6 3,4: ind: 3,4 - tiles: CAAAAAADCAAAAAAACgAAAAADCgAAAAADBQAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAwAAAAADCgAAAAADCAAAAAACCgAAAAACCgAAAAACBQAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAAACAAAAAACCAAAAAACCAAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABAgAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAABCAAAAAABCAAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAABCAAAAAABCAAAAAACCAAAAAABCAAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAACAgAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAABAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAADAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAACCAAAAAAACAAAAAACAgAAAAAACAAAAAADCAAAAAABCAAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAACCAAAAAABCQAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAACAAAAAABCgAAAAACCgAAAAADCAAAAAADCAAAAAAAAgAAAAAACAAAAAACCAAAAAACCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAgAAAAAACAAAAAADCAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAA + tiles: CAAAAAAACAAAAAACCgAAAAADCgAAAAABBQAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAABCgAAAAABCAAAAAACCgAAAAACCgAAAAACBQAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAADCAAAAAACCAAAAAADCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAABCAAAAAADCAAAAAABCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAAACAAAAAADCAAAAAAACAAAAAABAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADAgAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAABCAAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAADCAAAAAABCQAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAwAAAAACAgAAAAAACAAAAAAACgAAAAADCgAAAAAACAAAAAABCAAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAA version: 6 3,5: ind: 3,5 - tiles: AwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAgAAAAAACAAAAAABCAAAAAADCAAAAAABCAAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAACAAAAAAACAAAAAACCAAAAAADCAAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAABCAAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAACAAAAAAACAAAAAABCAAAAAAACAAAAAACCAAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAADCAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAACAAAAAADCAAAAAABCAAAAAAACAAAAAADCAAAAAABAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAFAAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAABCAAAAAAABQAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAACFAAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAACCAAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAADFAAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABFAAAAAAACAAAAAAACAAAAAADCAAAAAAACAAAAAACCAAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAACAwAAAAACAwAAAAABFAAAAAAACAAAAAABCAAAAAACCAAAAAACCAAAAAADCAAAAAADBQAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAFAAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAADCAAAAAADBQAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAABBQAAAAADAwAAAAACBQAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAADBQAAAAABAwAAAAABBQAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAwAAAAACBQAAAAADAwAAAAADBQAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAAA + tiles: AwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAgAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAgAAAAAACAAAAAACCAAAAAABCAAAAAADCAAAAAACAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAABCAAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAAACAAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAACCAAAAAADCAAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABFAAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAACAAAAAACCAAAAAADCAAAAAACCAAAAAAACAAAAAABBQAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAADFAAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAFAAAAAAACAAAAAADCAAAAAABCAAAAAABCAAAAAACCAAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABFAAAAAAACAAAAAADCAAAAAABCAAAAAAACAAAAAACCAAAAAABBQAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABFAAAAAAACAAAAAAACAAAAAAACAAAAAADCAAAAAABCAAAAAADBQAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAAABQAAAAABAwAAAAABBQAAAAACAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABBQAAAAACAwAAAAABBQAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACBQAAAAABAwAAAAACBQAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAABFAAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAAA version: 6 3,6: ind: 3,6 - tiles: AwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABFAAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABBQAAAAADBQAAAAADBQAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAABFAAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAEAAAAAADEAAAAAABEAAAAAADEAAAAAAAEAAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAEAAAAAAAEQAAAAAAEAAAAAAAEQAAAAAAEAAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACFAAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAEAAAAAADEQAAAAAAEAAAAAACEQAAAAABEAAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAFAAAAAAAAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAEAAAAAABEQAAAAAAEAAAAAABEQAAAAACEAAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAEAAAAAACEAAAAAAAEAAAAAADEAAAAAABEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAEAAAAAADEAAAAAADEAAAAAAAEAAAAAADEAAAAAAACAAAAAABCAAAAAADCAAAAAACCAAAAAADCAAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAACAAAAAABCAAAAAABCAAAAAADAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAAACAAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACCgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAFAAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABBQAAAAADBQAAAAABBQAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAABFAAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAEAAAAAADEAAAAAABEAAAAAACEAAAAAAAEAAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAEAAAAAADEQAAAAACEAAAAAAAEQAAAAABEAAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAFAAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAEAAAAAADEQAAAAABEAAAAAADEQAAAAADEAAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAACFAAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAEAAAAAABEQAAAAAAEAAAAAADEQAAAAABEAAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAEAAAAAABEAAAAAAAEAAAAAADEAAAAAADEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAEAAAAAADEAAAAAACEAAAAAADEAAAAAACEAAAAAABCAAAAAACCAAAAAACCAAAAAADCAAAAAADCAAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAADCAAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADCgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 3,7: ind: 3,7 - tiles: AwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAAAFAAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACFAAAAAAAAwAAAAABAwAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAADFAAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAACwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAEAAAAAADEAAAAAADEAAAAAADEAAAAAABEAAAAAAAEAAAAAABEAAAAAACCwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAEAAAAAABEAAAAAABEAAAAAADEAAAAAABEAAAAAADEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAACHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAABwAAAAABAgAAAAAAEAAAAAAAAgAAAAAAEAAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAABwAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAEAAAAAACAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAAACwAAAAABCwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAACCwAAAAACCwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAABCwAAAAACCwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAACwAAAAADCwAAAAACCwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAACwAAAAAACwAAAAAACwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAA + tiles: AwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAADFAAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAAAFAAAAAAAAwAAAAABAwAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACFAAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAACwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAEAAAAAABEAAAAAACEAAAAAADEAAAAAACEAAAAAACEAAAAAABEAAAAAADCwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAEAAAAAAAEAAAAAADEAAAAAABEAAAAAADEAAAAAACEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAACHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAABwAAAAABAgAAAAAAEAAAAAAAAgAAAAAAEAAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAABwAAAAACAgAAAAAAEAAAAAACAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAABCwAAAAABCwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAADCwAAAAABCwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACwAAAAADCwAAAAABCwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAACwAAAAAACwAAAAADCwAAAAADAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAACwAAAAACCwAAAAADCwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAA version: 6 3,8: ind: 3,8 - tiles: AAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAIgAAAAAAIgAAAAADIgAAAAABAgAAAAAAIgAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAABIgAAAAAAAgAAAAAAIgAAAAADAgAAAAAAAgAAAAAAIgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAAAAgAAAAAAIgAAAAABIgAAAAADIgAAAAADIgAAAAAAAgAAAAAAIgAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAABAgAAAAAAAgAAAAAAIgAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAIgAAAAADIgAAAAACAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAIgAAAAABAgAAAAAAIgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAACIgAAAAACIgAAAAADIgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAACIgAAAAAAIgAAAAACIgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAA + tiles: AAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAIgAAAAACIgAAAAABIgAAAAADAgAAAAAAIgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAAAIgAAAAABAgAAAAAAIgAAAAABAgAAAAAAAgAAAAAAIgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAABAgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAADAgAAAAAAIgAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAAAAgAAAAAAAgAAAAAAIgAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAIgAAAAABIgAAAAACAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAIgAAAAAAAgAAAAAAIgAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAAAIgAAAAABIgAAAAACIgAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIgAAAAAAIgAAAAAAIgAAAAADIgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAA version: 6 3,9: ind: 3,9 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAIwAAAAAAEwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIwAAAAABHgAAAAAAIwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAEwAAAAACIwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAHgAAAAAAIwAAAAAAHgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAADCgAAAAADFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAEwAAAAAECgAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAAACgAAAAAAAgAAAAAAEwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACgAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAACCgAAAAACAwAAAAAAEwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEwAAAAAEAgAAAAAAAwAAAAAD + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAABIwAAAAADEwAAAAAEAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIwAAAAAAHgAAAAAAIwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAEwAAAAACIwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAHgAAAAAAIwAAAAABHgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAADCgAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAEwAAAAAACgAAAAADAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAADCgAAAAABAgAAAAAAEwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAACgAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAADCgAAAAADAwAAAAADEwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEwAAAAADAgAAAAAAAwAAAAAD version: 6 4,0: ind: 4,0 @@ -239,35 +239,35 @@ entities: version: 6 4,1: ind: 4,1 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,10: ind: 4,10 - tiles: AwAAAAADEwAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAACJAAAAAAAAgAAAAAAJAAAAAACJAAAAAADAgAAAAAAJAAAAAAAAwAAAAADAwAAAAAAAwAAAAABFgAAAAAFBwAAAAABAgAAAAAAAgAAAAAAFgAAAAABAgAAAAAAJAAAAAADAgAAAAAAJAAAAAABJAAAAAABJAAAAAACJAAAAAACJAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAAFBwAAAAACFgAAAAAFAgAAAAAAJAAAAAADJAAAAAACJAAAAAABJAAAAAABJAAAAAACJAAAAAABJAAAAAACAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABwAAAAADFgAAAAACFgAAAAAEBwAAAAABFgAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AwAAAAABEwAAAAABAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAACJAAAAAADAgAAAAAAJAAAAAABJAAAAAADAgAAAAAAJAAAAAACAwAAAAACAwAAAAADAwAAAAABFgAAAAAGBwAAAAADAgAAAAAAAgAAAAAAFgAAAAAFAgAAAAAAJAAAAAACAgAAAAAAJAAAAAADJAAAAAACJAAAAAAAJAAAAAAAJAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAADBwAAAAADFgAAAAAFAgAAAAAAJAAAAAABJAAAAAADJAAAAAAAJAAAAAABJAAAAAAAJAAAAAABJAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABwAAAAABFgAAAAAEFgAAAAAABwAAAAAAFgAAAAAGAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,2: ind: 4,2 - tiles: AgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAADBwAAAAACBwAAAAADBwAAAAADBwAAAAAD + tiles: AgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAAD version: 6 4,3: ind: 4,3 - tiles: AgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAAABwAAAAACAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAACBwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAABwAAAAACBwAAAAADAwAAAAACAwAAAAADAwAAAAABAgAAAAAABwAAAAAABwAAAAADBwAAAAADBwAAAAADBwAAAAACBwAAAAAABwAAAAABBwAAAAADBwAAAAAABwAAAAACBwAAAAABBwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAABwAAAAADBwAAAAADBwAAAAABBwAAAAABBwAAAAAABwAAAAABBwAAAAAABwAAAAADBwAAAAABBwAAAAAABwAAAAABBwAAAAACAwAAAAABAwAAAAABAwAAAAACAgAAAAAABwAAAAACBwAAAAADBwAAAAABBwAAAAABBwAAAAACBwAAAAABBwAAAAADBwAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAADAwAAAAADAwAAAAACAwAAAAABAgAAAAAABwAAAAADBwAAAAADBwAAAAACBwAAAAADBwAAAAAABwAAAAADBwAAAAABBwAAAAABBwAAAAABBwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAABwAAAAAABwAAAAADBwAAAAAABwAAAAADBwAAAAACBwAAAAADBwAAAAABBwAAAAAABwAAAAAABwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAACBwAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAACBwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAABwAAAAABBwAAAAABBwAAAAACBwAAAAABBwAAAAADBwAAAAABBwAAAAADBwAAAAABBwAAAAAABwAAAAAAHwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAABwAAAAADBwAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAADBwAAAAAABwAAAAADBwAAAAADBwAAAAADHwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAABwAAAAADBwAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAACBwAAAAADBwAAAAACBwAAAAACBwAAAAABHwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAADBwAAAAADBwAAAAADBwAAAAAAHwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAABwAAAAADBwAAAAADBwAAAAADBwAAAAABBwAAAAABBwAAAAADBwAAAAACBwAAAAABBwAAAAAABwAAAAACAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAABwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAACFAAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAB + tiles: AgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAADBwAAAAABBwAAAAACBwAAAAAABwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAADBwAAAAACBwAAAAAABwAAAAADBwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAABwAAAAABBwAAAAACAwAAAAACAwAAAAABAwAAAAACAgAAAAAABwAAAAABBwAAAAADBwAAAAACBwAAAAADBwAAAAAABwAAAAADBwAAAAACBwAAAAACBwAAAAABBwAAAAACBwAAAAADBwAAAAACAwAAAAACAwAAAAACAwAAAAACAgAAAAAABwAAAAADBwAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAADBwAAAAACBwAAAAABBwAAAAACBwAAAAADBwAAAAABBwAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAADBwAAAAADBwAAAAABBwAAAAADBwAAAAAABwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAABBwAAAAAABwAAAAABBwAAAAAABwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAADAgAAAAAABwAAAAADBwAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAABBwAAAAADBwAAAAACBwAAAAABBwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAABwAAAAADBwAAAAADBwAAAAABBwAAAAACBwAAAAAABwAAAAAABwAAAAADBwAAAAADBwAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAABwAAAAABBwAAAAAABwAAAAADBwAAAAACBwAAAAADBwAAAAADBwAAAAABBwAAAAAABwAAAAAABwAAAAAAHwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAABwAAAAABBwAAAAACAgAAAAAABwAAAAACBwAAAAAABwAAAAADBwAAAAADBwAAAAAABwAAAAABBwAAAAAAHwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAABBwAAAAABBwAAAAACBwAAAAABBwAAAAABBwAAAAABBwAAAAADBwAAAAACHwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAABwAAAAACBwAAAAADBwAAAAADBwAAAAABBwAAAAABBwAAAAABBwAAAAAABwAAAAABBwAAAAADBwAAAAAAHwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAADBwAAAAACBwAAAAABBwAAAAABBwAAAAACBwAAAAADAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAABwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACFAAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAAA version: 6 4,4: ind: 4,4 - tiles: AwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABFAAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAACFAAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAABBwAAAAAABwAAAAABAgAAAAAACAAAAAADCAAAAAACCAAAAAABCAAAAAADCAAAAAADAgAAAAAACwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAACBwAAAAADCAAAAAACCAAAAAABCAAAAAADCAAAAAACCAAAAAACAgAAAAAACwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAACAgAAAAAACAAAAAADCAAAAAACCAAAAAACCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAAABwAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAABAgAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAACCAAAAAADCAAAAAAACAAAAAADCAAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAACAAAAAADCAAAAAACCAAAAAACCAAAAAABCAAAAAAACAAAAAABCAAAAAAACAAAAAACAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAACgAAAAAACAAAAAABCAAAAAACCAAAAAAACAAAAAACCAAAAAABCAAAAAACCAAAAAAACAAAAAADCAAAAAADCAAAAAABCAAAAAACAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAACAAAAAADCAAAAAABCAAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAABCAAAAAABCAAAAAADCAAAAAACCAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAACAAAAAAACAAAAAADAgAAAAAACAAAAAADCAAAAAABCAAAAAACCAAAAAADCAAAAAACCAAAAAADCAAAAAACCAAAAAADAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAADAgAAAAAACAAAAAADCAAAAAACCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACFAAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAFAAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAAABwAAAAABAgAAAAAACAAAAAADCAAAAAADCAAAAAABCAAAAAACCAAAAAADAgAAAAAACwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAAABwAAAAAABwAAAAADBwAAAAABCAAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAADAgAAAAAACwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAABBwAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAAACAAAAAABCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAABBwAAAAABAgAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAADCAAAAAACCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAABCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAADAgAAAAAACAAAAAACCAAAAAACCAAAAAADCAAAAAABCAAAAAACCAAAAAABCAAAAAAACAAAAAABAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAACAAAAAACCAAAAAADCAAAAAADAgAAAAAACAAAAAADCAAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAACCAAAAAACCAAAAAADAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAACgAAAAADCAAAAAAACAAAAAABCAAAAAADCAAAAAABCAAAAAABCAAAAAACCAAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAACAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAACAAAAAADCAAAAAAACAAAAAADAgAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAAACAAAAAAACAAAAAAACAAAAAAACAAAAAABAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAACAAAAAABCAAAAAADAgAAAAAACAAAAAAACAAAAAABCAAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAADCAAAAAABAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACAgAAAAAACAAAAAAACAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 4,5: ind: 4,5 - tiles: AgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAAAAwAAAAACAwAAAAADBQAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAADAwAAAAACAwAAAAABBQAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADBQAAAAAAAwAAAAABAwAAAAACBQAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAABCAAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAEAAAAAACAgAAAAAAAgAAAAAAEQAAAAADEQAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAEAAAAAABEAAAAAABEAAAAAADEAAAAAABAgAAAAAAEAAAAAADEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAABEAAAAAAAEAAAAAABEAAAAAABAgAAAAAAEAAAAAABEAAAAAABEAAAAAAAEAAAAAACAgAAAAAAEAAAAAADEAAAAAAAEAAAAAABEAAAAAABEAAAAAACEAAAAAAAEAAAAAACEAAAAAABEAAAAAACEAAAAAACAgAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAADAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAADEAAAAAACEAAAAAADEAAAAAAAEAAAAAADEAAAAAABEAAAAAACEAAAAAAAAgAAAAAAEAAAAAACEAAAAAABEAAAAAAAEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAACEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAABEAAAAAAAEAAAAAAAAgAAAAAAEQAAAAABEQAAAAABEQAAAAACEAAAAAAAEQAAAAACEQAAAAAAEAAAAAACEQAAAAACEQAAAAABEQAAAAADAgAAAAAAEAAAAAABEAAAAAADEAAAAAADEAAAAAADAgAAAAAAEQAAAAAAEQAAAAAAEQAAAAABEAAAAAADEQAAAAABEQAAAAABEAAAAAAAEQAAAAABEQAAAAADEQAAAAAD + tiles: AgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAABAwAAAAACAwAAAAABBQAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACBQAAAAADAwAAAAABAwAAAAADBQAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAABQAAAAACAwAAAAACAwAAAAABBQAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAAACAAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAEQAAAAACEQAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAAAEAAAAAABEAAAAAADAgAAAAAAEAAAAAADEAAAAAADEAAAAAACEAAAAAAAEAAAAAACEAAAAAABEAAAAAABEAAAAAABEAAAAAAAEAAAAAACAgAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAACAgAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAADEAAAAAAAEAAAAAADEAAAAAACEAAAAAABEAAAAAACEAAAAAADAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAACEAAAAAABEAAAAAABEAAAAAADEAAAAAADEAAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAEAAAAAAAEAAAAAACEAAAAAADEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAACEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAABEAAAAAAAEAAAAAABAgAAAAAAEQAAAAADEQAAAAAAEQAAAAABEAAAAAACEQAAAAAAEQAAAAABEAAAAAADEQAAAAADEQAAAAADEQAAAAAAAgAAAAAAEAAAAAADEAAAAAADEAAAAAACEAAAAAADAgAAAAAAEQAAAAABEQAAAAAAEQAAAAAAEAAAAAADEQAAAAAAEQAAAAABEAAAAAAAEQAAAAABEQAAAAACEQAAAAAD version: 6 4,6: ind: 4,6 - tiles: AgAAAAAAEAAAAAADEAAAAAADEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAABEAAAAAACEAAAAAACEAAAAAADEAAAAAAAEAAAAAACEAAAAAABEAAAAAACEAAAAAAAEAAAAAABAgAAAAAAEAAAAAADEAAAAAADEAAAAAADEAAAAAAAAgAAAAAAEAAAAAABEAAAAAACEQAAAAAAEQAAAAACEQAAAAABEQAAAAABEQAAAAADEQAAAAADEAAAAAADEAAAAAACAgAAAAAAEAAAAAACEAAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAACEAAAAAACEAAAAAACEAAAAAAAEAAAAAACEAAAAAABEAAAAAACEAAAAAABEAAAAAAAEAAAAAABEAAAAAABEAAAAAACEAAAAAACEAAAAAAAEAAAAAADAgAAAAAAEQAAAAAAEQAAAAADEQAAAAAAEAAAAAADEQAAAAABEQAAAAABEAAAAAADEQAAAAAAEQAAAAACEQAAAAACAgAAAAAAEAAAAAADEAAAAAADEAAAAAAAEAAAAAABAgAAAAAAEQAAAAADEQAAAAADEQAAAAACEAAAAAACEQAAAAADEQAAAAACEAAAAAACEQAAAAAAEQAAAAABEQAAAAABAgAAAAAAEAAAAAAAEAAAAAADEAAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAABEAAAAAABEQAAAAADAgAAAAAAEAAAAAADEAAAAAADEAAAAAABEAAAAAABEAAAAAAAEAAAAAABEAAAAAADEAAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAADEAAAAAADEQAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAACEAAAAAACEAAAAAABEAAAAAABEAAAAAADEAAAAAADEAAAAAADAgAAAAAAEAAAAAACEAAAAAAAEAAAAAACEAAAAAAAEQAAAAACAgAAAAAAEAAAAAADEAAAAAADEAAAAAABEAAAAAABEAAAAAABEAAAAAAAEAAAAAADEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAACEAAAAAAAEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAACwAAAAACCwAAAAACCwAAAAAACwAAAAADCwAAAAADCwAAAAABCwAAAAABCwAAAAAACwAAAAACCwAAAAACCwAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AgAAAAAAEAAAAAABEAAAAAADEAAAAAACEAAAAAADEAAAAAABEAAAAAAAEAAAAAACEAAAAAACEAAAAAAAEAAAAAADEAAAAAACEAAAAAABEAAAAAADEAAAAAABEAAAAAACAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAADEAAAAAACAgAAAAAAEAAAAAAAEAAAAAADEQAAAAADEQAAAAADEQAAAAACEQAAAAAAEQAAAAACEQAAAAADEAAAAAABEAAAAAADAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAACEAAAAAAAEAAAAAADEAAAAAADEAAAAAABEAAAAAABEAAAAAACEAAAAAABEAAAAAAAEAAAAAADEAAAAAABEAAAAAAAEAAAAAACEAAAAAADEAAAAAADEAAAAAACEAAAAAABEAAAAAABAgAAAAAAEQAAAAABEQAAAAAAEQAAAAACEAAAAAACEQAAAAABEQAAAAACEAAAAAAAEQAAAAABEQAAAAADEQAAAAABAgAAAAAAEAAAAAADEAAAAAABEAAAAAADEAAAAAABAgAAAAAAEQAAAAAAEQAAAAADEQAAAAACEAAAAAABEQAAAAACEQAAAAADEAAAAAADEQAAAAADEQAAAAACEQAAAAADAgAAAAAAEAAAAAABEAAAAAADEAAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAACEAAAAAABEAAAAAADEQAAAAAAAgAAAAAAEAAAAAABEAAAAAADEAAAAAACEAAAAAADEAAAAAADEAAAAAADEAAAAAACEAAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAAAEAAAAAABEAAAAAAAEQAAAAABAgAAAAAAEAAAAAADEAAAAAABEAAAAAABEAAAAAABEAAAAAADEAAAAAAAEAAAAAABEAAAAAADEAAAAAADAgAAAAAAEAAAAAAAEAAAAAABEAAAAAABEAAAAAADEQAAAAADAgAAAAAAEAAAAAAAEAAAAAACEAAAAAACEAAAAAAAEAAAAAACEAAAAAACEAAAAAAAEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAADEAAAAAAAEAAAAAADEAAAAAADEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAgAAAAAACwAAAAACCwAAAAADCwAAAAAACwAAAAABCwAAAAACCwAAAAADCwAAAAABCwAAAAABCwAAAAACCwAAAAACCwAAAAACAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 4,7: ind: 4,7 - tiles: AwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAABEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAADEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAABBQAAAAADBQAAAAAABQAAAAADAwAAAAABAgAAAAAAAwAAAAABEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAwAAAAADEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAABBQAAAAACBQAAAAACBQAAAAAAAwAAAAACAgAAAAAAAwAAAAABEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 4,8: ind: 4,8 @@ -275,7 +275,7 @@ entities: version: 6 4,9: ind: 4,9 - tiles: BAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAADJAAAAAADJAAAAAADJAAAAAACJAAAAAAAJAAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAABJAAAAAABAgAAAAAAAgAAAAAAAgAAAAAA + tiles: BAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAADJAAAAAAAJAAAAAACJAAAAAABJAAAAAAAJAAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAAAJAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 5,0: ind: 5,0 @@ -283,43 +283,43 @@ entities: version: 6 5,1: ind: 5,1 - tiles: AwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACFAAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAFAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAQAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAFAAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAAAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAQAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAAAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAB + tiles: AwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABFAAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAFAAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABAQAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADFAAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAQAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAAAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAC version: 6 5,10: ind: 5,10 - tiles: JAAAAAADJAAAAAAAJAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAADAgAAAAAAJAAAAAACAgAAAAAAJAAAAAACJAAAAAACAgAAAAAAAgAAAAAAJQAAAAABJQAAAAACJQAAAAAAJQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAAAJAAAAAAAJAAAAAACAgAAAAAAJAAAAAACAgAAAAAAJQAAAAADJQAAAAACAgAAAAAAJQAAAAABJQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJQAAAAACJQAAAAAAAgAAAAAAJQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAJQAAAAADAgAAAAAAAgAAAAAAJQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAJQAAAAADJQAAAAABAgAAAAAAJQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAJgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAEwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAJgAAAAAAAgAAAAAAJgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAJgAAAAAAJgAAAAAAAgAAAAAAJgAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA + tiles: JAAAAAACJAAAAAABJAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAABAgAAAAAAJAAAAAABAgAAAAAAJAAAAAADJAAAAAAAAgAAAAAAAgAAAAAAJQAAAAACJQAAAAACJQAAAAABJQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAAAJAAAAAAAJAAAAAAAAgAAAAAAJAAAAAADAgAAAAAAJQAAAAAAJQAAAAADAgAAAAAAJQAAAAAAJQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJQAAAAADJQAAAAACAgAAAAAAJQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAJQAAAAADAgAAAAAAAgAAAAAAJQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAJQAAAAACJQAAAAACAgAAAAAAJQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAJgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAJgAAAAAAAgAAAAAAJgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAJgAAAAAAJgAAAAAAAgAAAAAAJgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA version: 6 5,2: ind: 5,2 - tiles: AAAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAADCAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAADCAAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAABCAAAAAABCAAAAAAACAAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAACAgAAAAAACAAAAAABCAAAAAADCAAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAABwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAC + tiles: AAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAABCAAAAAACCAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAAACAAAAAABCAAAAAABCAAAAAABCAAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAAACAAAAAAACAAAAAADCAAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACAgAAAAAACAAAAAADCAAAAAADCAAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAADBwAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAAB version: 6 5,3: ind: 5,3 - tiles: BwAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAADBwAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAADBwAAAAACAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAADBwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAABwAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABBwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAABwAAAAADBwAAAAACBwAAAAACBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAABwAAAAABBwAAAAABBwAAAAADBwAAAAABBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAABwAAAAABBwAAAAAABwAAAAADBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAgAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAgAAAAAABwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACBwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAABwAAAAACAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAA + tiles: BwAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAADBwAAAAACAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAACBwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAAABwAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAABwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADBwAAAAADAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAABwAAAAADBwAAAAAABwAAAAABBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAABwAAAAAABwAAAAAABwAAAAADBwAAAAACBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAABwAAAAABBwAAAAADBwAAAAADBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAABwAAAAAABwAAAAABBwAAAAAABwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAgAAAAAABwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAABwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAADAgAAAAAABwAAAAADAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAA version: 6 5,4: ind: 5,4 - tiles: AwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAACwAAAAABCwAAAAABCwAAAAAACwAAAAAACwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAgAAAAAACwAAAAADCwAAAAAACwAAAAAACwAAAAAACwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAgAAAAAACAAAAAACCAAAAAADCgAAAAACCgAAAAADCgAAAAADCAAAAAABCAAAAAACAgAAAAAACAAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAADCAAAAAACCAAAAAABCAAAAAABCAAAAAACCAAAAAADCAAAAAAACAAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAABBwAAAAADCAAAAAACCAAAAAACCAAAAAACCAAAAAAACAAAAAACCAAAAAADCAAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAABwAAAAACBwAAAAACBwAAAAACCAAAAAADCAAAAAABCAAAAAACCAAAAAADCAAAAAADCAAAAAADCAAAAAACAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAABwAAAAABBwAAAAADCgAAAAACCgAAAAABCgAAAAAACgAAAAAACAAAAAACCgAAAAABCgAAAAABCgAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAgAAAAAABwAAAAACBwAAAAABBwAAAAAACAAAAAADCAAAAAADCAAAAAAACAAAAAACCAAAAAABCAAAAAADCAAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAABwAAAAABBwAAAAAABwAAAAACCAAAAAAACAAAAAACCAAAAAABCAAAAAADCAAAAAACCAAAAAACCAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAADCAAAAAADCAAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAACCAAAAAAACAAAAAABCgAAAAADCgAAAAAACgAAAAADCAAAAAABCAAAAAABAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAACwAAAAAACwAAAAADCwAAAAACCwAAAAABCwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAgAAAAAACwAAAAABCwAAAAADCwAAAAAACwAAAAACCwAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAACAgAAAAAACAAAAAADCAAAAAACCgAAAAACCgAAAAACCgAAAAABCAAAAAAACAAAAAADAgAAAAAACAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAABwAAAAACBwAAAAABBwAAAAAACAAAAAAACAAAAAAACAAAAAACCAAAAAACCAAAAAADCAAAAAACCAAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAgAAAAAABwAAAAAABwAAAAADBwAAAAABCAAAAAACCAAAAAABCAAAAAADCAAAAAADCAAAAAAACAAAAAADCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAABwAAAAAABwAAAAACCgAAAAABCgAAAAACCgAAAAADCgAAAAAACAAAAAACCgAAAAAACgAAAAACCgAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAABwAAAAAABwAAAAABBwAAAAAACAAAAAACCAAAAAADCAAAAAABCAAAAAAACAAAAAADCAAAAAADCAAAAAABAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAABwAAAAAABwAAAAADBwAAAAACCAAAAAACCAAAAAAACAAAAAABCAAAAAADCAAAAAADCAAAAAACCAAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAgAAAAAACAAAAAADCAAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAAACAAAAAAACAAAAAADCAAAAAABCAAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAABCAAAAAACCAAAAAACCgAAAAADCgAAAAACCgAAAAAACAAAAAAACAAAAAADAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAA version: 6 5,5: ind: 5,5 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAABAgAAAAAACAAAAAAACAAAAAAACAAAAAADCAAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAAAEAAAAAADEAAAAAACAgAAAAAACAAAAAABCAAAAAACCAAAAAADCAAAAAACCAAAAAABCAAAAAABCAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAADEAAAAAADEAAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAABCAAAAAABAgAAAAAACAAAAAABCAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAADEAAAAAABAgAAAAAACAAAAAADCAAAAAACCAAAAAACCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAADEAAAAAADEAAAAAADCAAAAAABCAAAAAAACAAAAAABCAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAABEAAAAAAAEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAADEAAAAAABAgAAAAAACAAAAAACCAAAAAABCAAAAAACCAAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAACAgAAAAAACAAAAAACCAAAAAAACAAAAAACCAAAAAACCAAAAAABCAAAAAAACAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAABEAAAAAADEAAAAAACAgAAAAAACAAAAAADCAAAAAACCAAAAAAACAAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAABEAAAAAAAEAAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAABEAAAAAACEAAAAAACCAAAAAAACAAAAAADCAAAAAADCAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAAAEAAAAAADEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 5,6: ind: 5,6 - tiles: EAAAAAADEAAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAAAEAAAAAAAEAAAAAABEAAAAAACEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAEAAAAAAAEAAAAAACEAAAAAABEAAAAAAAAgAAAAAAEAAAAAACEAAAAAACEAAAAAACEAAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADFQAAAAAAEAAAAAABEAAAAAAAEAAAAAAAEAAAAAACAgAAAAAAAgAAAAAAEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACFQAAAAAAAgAAAAAAEAAAAAACEAAAAAACEAAAAAAAAgAAAAAAEAAAAAABEAAAAAADEAAAAAADEAAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAABFQAAAAAAAgAAAAAAEAAAAAACEAAAAAABEAAAAAACAgAAAAAAEAAAAAAAEAAAAAABEAAAAAABEAAAAAABEAAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAAAFQAAAAAAAgAAAAAAEAAAAAABEAAAAAADEAAAAAACAgAAAAAAEAAAAAACEAAAAAADEAAAAAABEAAAAAADEAAAAAAAAwAAAAADAwAAAAADAwAAAAADFQAAAAAAAwAAAAADFQAAAAAAEAAAAAADEAAAAAACEAAAAAABEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAACEAAAAAACAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADFQAAAAAAEAAAAAAAEAAAAAABEAAAAAAAEAAAAAABAgAAAAAAEAAAAAABEAAAAAABEAAAAAADEAAAAAABEAAAAAACAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAACFQAAAAAAEAAAAAADEAAAAAAAEAAAAAACEAAAAAADAgAAAAAAEAAAAAADEAAAAAADEAAAAAAAEAAAAAACEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAEAAAAAAAEAAAAAACEAAAAAABEAAAAAADEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAABEAAAAAACEAAAAAADEAAAAAAAEAAAAAABEAAAAAADEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAAAEAAAAAABEAAAAAACEAAAAAABEAAAAAABEAAAAAACEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAABEAAAAAADEAAAAAADEAAAAAABEAAAAAACEAAAAAABEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAACEAAAAAACEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: EAAAAAABEAAAAAACEAAAAAABEAAAAAAAEAAAAAADEAAAAAACEAAAAAAAEAAAAAAAEAAAAAADEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAEAAAAAABEAAAAAACEAAAAAADEAAAAAABAgAAAAAAEAAAAAABEAAAAAACEAAAAAACEAAAAAADAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAADFQAAAAAAEAAAAAADEAAAAAABEAAAAAABEAAAAAAAAgAAAAAAAgAAAAAAEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAFQAAAAAAAgAAAAAAEAAAAAADEAAAAAACEAAAAAACAgAAAAAAEAAAAAABEAAAAAAAEAAAAAADEAAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAAAFQAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAACAgAAAAAAEAAAAAABEAAAAAABEAAAAAABEAAAAAACEAAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAFQAAAAAAAgAAAAAAEAAAAAAAEAAAAAADEAAAAAABAgAAAAAAEAAAAAAAEAAAAAADEAAAAAADEAAAAAACEAAAAAABAwAAAAADAwAAAAABAwAAAAAAFQAAAAAAAwAAAAAAFQAAAAAAEAAAAAAAEAAAAAAAEAAAAAABEAAAAAACEAAAAAAAEAAAAAABEAAAAAADEAAAAAABEAAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAADFQAAAAAAEAAAAAABEAAAAAACEAAAAAAAEAAAAAAAAgAAAAAAEAAAAAABEAAAAAACEAAAAAADEAAAAAAAEAAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACFQAAAAAAEAAAAAADEAAAAAABEAAAAAAAEAAAAAABAgAAAAAAEAAAAAABEAAAAAACEAAAAAADEAAAAAAAEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAEAAAAAADEAAAAAACEAAAAAACEAAAAAADEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABEAAAAAADEAAAAAACEAAAAAABEAAAAAACEAAAAAABEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADEAAAAAABEAAAAAABEAAAAAAAEAAAAAAAEAAAAAABEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAEAAAAAABEAAAAAAAEAAAAAABEAAAAAAAEAAAAAACEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAEAAAAAACEAAAAAACEAAAAAAAEAAAAAADEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 5,7: ind: 5,7 - tiles: AwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADFAAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAACCAAAAAAACAAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAACFAAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAACCAAAAAAACAAAAAACCAAAAAACCAAAAAAACAAAAAADCAAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAABFAAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAADAgAAAAAACAAAAAABCAAAAAACCAAAAAAACAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADCAAAAAACCAAAAAAACAAAAAADCAAAAAAACAAAAAAACAAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAADCAAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAAACAAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAADCAAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAABCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAADFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAABBQAAAAACBQAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACBQAAAAADBQAAAAADHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAA + tiles: AwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAACAAAAAACCAAAAAADCAAAAAAACAAAAAADCAAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABFAAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAAACAAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAAAFAAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAACAgAAAAAACAAAAAACCAAAAAABCAAAAAADCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADCAAAAAADCAAAAAACCAAAAAACCAAAAAAACAAAAAAACAAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAACCAAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAADCAAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAADCAAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAABCAAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAABFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAABQAAAAADBQAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAAABQAAAAABHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAD version: 6 5,8: ind: 5,8 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAFAAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAFAAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAFAAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAD + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAFAAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAFAAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAFAAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAA version: 6 5,9: ind: 5,9 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAAAJAAAAAACAgAAAAAAJAAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAADAgAAAAAAJAAAAAACJAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAB + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAADJAAAAAACAgAAAAAAJAAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAJAAAAAAAAgAAAAAAJAAAAAAAJAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAC version: 6 6,0: ind: 6,0 @@ -327,147 +327,147 @@ entities: version: 6 6,1: ind: 6,1 - tiles: AgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAACAAAAAABAgAAAAAACAAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACAAAAAADCAAAAAABAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAACAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAADCAAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAACAAAAAADCAAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAACAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAFAAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAADAwAAAAACFAAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAD + tiles: AgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAABAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAACAAAAAADAgAAAAAACAAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAACAAAAAABCAAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAABCAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAACAAAAAABCAAAAAABAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAACAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAFAAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAFAAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAD version: 6 6,10: ind: 6,10 - tiles: CAAAAAABCAAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAACAgAAAAAAAwAAAAADBQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACCgAAAAADCgAAAAACCgAAAAAACAAAAAADCAAAAAABAgAAAAAAAwAAAAABBQAAAAACBQAAAAADBQAAAAAABQAAAAACBQAAAAADBQAAAAADBQAAAAAACAAAAAABCAAAAAACCgAAAAABCQAAAAAACgAAAAADCAAAAAAACAAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAACgAAAAABCgAAAAABCgAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAAFBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBwAAAAADAgAAAAAAFgAAAAAGBwAAAAACBwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAABAgAAAAAAAwAAAAABAgAAAAAAEwAAAAAEAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAABBwAAAAADBwAAAAAAFgAAAAAEBwAAAAADBwAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: CAAAAAACCAAAAAAACAAAAAAACAAAAAAACAAAAAAACAAAAAABCAAAAAABAgAAAAAAAwAAAAACBQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAABCgAAAAABCgAAAAADCgAAAAADCAAAAAAACAAAAAABAgAAAAAAAwAAAAACBQAAAAABBQAAAAADBQAAAAADBQAAAAAABQAAAAAABQAAAAACBQAAAAACCAAAAAACCAAAAAAACgAAAAAACQAAAAAACgAAAAAACAAAAAACCAAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAgAAAAAACgAAAAACCgAAAAADCgAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAAGBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBwAAAAADAgAAAAAAFgAAAAAGBwAAAAABBwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAABwAAAAADBwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAEwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFgAAAAAGBwAAAAACBwAAAAABFgAAAAAEBwAAAAADBwAAAAADAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 6,2: ind: 6,2 - tiles: AwAAAAACAwAAAAACAgAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAACBwAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAACCAAAAAACCAAAAAACAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAABwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAAAAwAAAAABAwAAAAACBwAAAAABBwAAAAABBwAAAAADBwAAAAACBwAAAAAABwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAACCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAABwAAAAAABwAAAAACBwAAAAABBwAAAAADBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAACAAAAAADCAAAAAACAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAACAAAAAACCAAAAAABCAAAAAABCAAAAAABCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAABAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAABwAAAAABBwAAAAACBwAAAAABBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAAABwAAAAACBwAAAAABBwAAAAADBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAACBwAAAAADBwAAAAABBwAAAAACBwAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAACBwAAAAACBwAAAAADBwAAAAABBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAACAwAAAAAAAgAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAABBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAABAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAABwAAAAACBwAAAAAABwAAAAADBwAAAAACBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAADCAAAAAABAwAAAAACAwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAABBwAAAAACBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAAACAAAAAABAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAABwAAAAACBwAAAAACBwAAAAAABwAAAAADBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAACAAAAAAACAAAAAACAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAABCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAADAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAABwAAAAAABwAAAAAABwAAAAADBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAADBwAAAAADBwAAAAACBwAAAAABBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABBwAAAAADBwAAAAAABwAAAAAABwAAAAADBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAACBwAAAAABBwAAAAAABwAAAAAABwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 6,3: ind: 6,3 - tiles: AwAAAAABAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAABBwAAAAAABwAAAAACBwAAAAACBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAABFAAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAACFAAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAADFAAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAABwAAAAADBwAAAAAAFgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAAgAAAAAAGAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAGAAAAAAAAgAAAAAABwAAAAAABwAAAAADAgAAAAAAAgAAAAAAFwAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAFwAAAAAAAgAAAAAAGAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAGAAAAAAAAgAAAAAABwAAAAACGgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAFwAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAABwAAAAADGgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAACBwAAAAABBwAAAAADBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAADBwAAAAACBwAAAAAABwAAAAABBwAAAAADBwAAAAADBwAAAAADBwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAADBwAAAAACBwAAAAAABwAAAAACBwAAAAACBwAAAAAABwAAAAAABwAAAAADAwAAAAABAwAAAAAB + tiles: AwAAAAAAAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABBwAAAAAABwAAAAABBwAAAAACBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAADFAAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACFAAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAFAAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAABwAAAAACBwAAAAADFgAAAAAEAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAAgAAAAAAGAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAGAAAAAAAAgAAAAAABwAAAAABBwAAAAABAgAAAAAAAgAAAAAAFwAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAFwAAAAAAAgAAAAAAGAAAAAAAGQAAAAAAGQAAAAAAGQAAAAAAGAAAAAAAAgAAAAAABwAAAAABGgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAFwAAAAAAAgAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAGAAAAAAAAgAAAAAABwAAAAADGgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAFwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAACBwAAAAAABwAAAAACBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAABBwAAAAAABwAAAAACBwAAAAABBwAAAAACBwAAAAAABwAAAAADBwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABwAAAAAABwAAAAABBwAAAAABBwAAAAAABwAAAAADBwAAAAAABwAAAAAAAwAAAAABAwAAAAAB version: 6 6,4: ind: 6,4 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAABwAAAAAABwAAAAACBwAAAAADBwAAAAABBwAAAAABBwAAAAABBwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADBwAAAAACBwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAABBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAACBwAAAAACBwAAAAACBwAAAAACBwAAAAADBwAAAAABBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAABwAAAAACBwAAAAADBwAAAAADBwAAAAABBwAAAAACBwAAAAACBwAAAAADBwAAAAACBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAACBwAAAAADBwAAAAACBwAAAAAABwAAAAABBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAABFAAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAACFAAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAADFAAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAB + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADBwAAAAADBwAAAAAABwAAAAABBwAAAAAABwAAAAABBwAAAAACBwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAABwAAAAABBwAAAAACBwAAAAACBwAAAAAABwAAAAABBwAAAAAABwAAAAACBwAAAAACBwAAAAAABwAAAAACBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAACBwAAAAABBwAAAAABBwAAAAADBwAAAAACBwAAAAADBwAAAAADBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAABwAAAAABBwAAAAADBwAAAAACBwAAAAADBwAAAAACBwAAAAAABwAAAAAABwAAAAADBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAABwAAAAAABwAAAAADBwAAAAACBwAAAAADBwAAAAAABwAAAAACBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAACFAAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAACFAAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAAAFAAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAA version: 6 6,5: ind: 6,5 - tiles: AgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAGwAAAAABGwAAAAACGwAAAAADGwAAAAADGwAAAAACAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAGwAAAAABGwAAAAADGwAAAAAAGwAAAAADGwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAABAgAAAAAAGwAAAAADGwAAAAACGwAAAAACGwAAAAACGwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAGwAAAAABGwAAAAAAGwAAAAACGwAAAAAAGwAAAAACAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAADGwAAAAACGwAAAAADGwAAAAAAGwAAAAAAGwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAACwAAAAADBwAAAAAABwAAAAACBwAAAAAAAgAAAAAAAwAAAAACFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAACwAAAAABCwAAAAAABwAAAAACBwAAAAAABwAAAAAAAgAAAAAAAwAAAAABFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAACwAAAAAACwAAAAACBwAAAAABBwAAAAAABwAAAAACAwAAAAACAwAAAAABFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAACwAAAAAACwAAAAADBwAAAAACBwAAAAABBwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAACwAAAAABCwAAAAABBwAAAAADBwAAAAADBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAA + tiles: AgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAGwAAAAACGwAAAAADGwAAAAACGwAAAAABGwAAAAABAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAGwAAAAABGwAAAAABGwAAAAACGwAAAAACGwAAAAABAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAABAgAAAAAAGwAAAAAAGwAAAAADGwAAAAACGwAAAAADGwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAGwAAAAACGwAAAAACGwAAAAADGwAAAAACGwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAGwAAAAADGwAAAAADGwAAAAADGwAAAAABGwAAAAACAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAACwAAAAADBwAAAAABBwAAAAABBwAAAAAAAgAAAAAAAwAAAAADFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAACwAAAAAACwAAAAAABwAAAAAABwAAAAACBwAAAAADAgAAAAAAAwAAAAADFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAACwAAAAAACwAAAAACBwAAAAADBwAAAAAABwAAAAAAAwAAAAACAwAAAAABFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAACwAAAAABCwAAAAAABwAAAAABBwAAAAABBwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAACwAAAAACCwAAAAABBwAAAAABBwAAAAACBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAA version: 6 6,6: ind: 6,6 - tiles: AwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAABFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAACAwAAAAACAwAAAAAADwAAAAACDwAAAAAADwAAAAABDwAAAAABDwAAAAACDwAAAAACDwAAAAADDwAAAAACCwAAAAABCwAAAAAACwAAAAAACwAAAAABFQAAAAAAAwAAAAACAwAAAAACAwAAAAABDwAAAAABDwAAAAAADwAAAAACDwAAAAAADwAAAAABDwAAAAABDwAAAAAADwAAAAADCwAAAAABCwAAAAAACwAAAAADCwAAAAABFQAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAACwAAAAAACwAAAAABCwAAAAACCwAAAAABFQAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACwAAAAACCwAAAAADCwAAAAABCwAAAAAAFQAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAABwAAAAADBwAAAAAABwAAAAACBwAAAAADBwAAAAAAAgAAAAAACwAAAAAACwAAAAADCwAAAAAACwAAAAADFQAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAACBwAAAAACBwAAAAAAAgAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAABwAAAAABBwAAAAAABwAAAAADBwAAAAABBwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAABwAAAAABBwAAAAABBwAAAAACBwAAAAACBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFQAAAAAAFQAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAACBwAAAAACBwAAAAADBwAAAAACBwAAAAACAwAAAAABAgAAAAAAAwAAAAABHAAAAAAAHAAAAAABHAAAAAADHAAAAAADAwAAAAABBwAAAAACBwAAAAACBwAAAAABBwAAAAADBwAAAAACBwAAAAACBwAAAAAABwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAHAAAAAADHAAAAAABHAAAAAACHAAAAAACAwAAAAADBwAAAAAABwAAAAACBwAAAAADBwAAAAADBwAAAAABBwAAAAAABwAAAAABBwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACHAAAAAAAHAAAAAAAHAAAAAACHAAAAAABAwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAACBwAAAAADBwAAAAACBwAAAAACAgAAAAAAAwAAAAAAAwAAAAADHAAAAAABHAAAAAAAHAAAAAADHAAAAAACAwAAAAAAAwAAAAACBwAAAAABBwAAAAACBwAAAAABBwAAAAACBwAAAAACBwAAAAACBwAAAAACAgAAAAAAAgAAAAAAAwAAAAABHAAAAAABHAAAAAAAHAAAAAADHAAAAAABHAAAAAACAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAA + tiles: AwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAACFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAABAwAAAAAAAwAAAAADDwAAAAAADwAAAAABDwAAAAADDwAAAAACDwAAAAACDwAAAAACDwAAAAABDwAAAAACCwAAAAADCwAAAAADCwAAAAADCwAAAAACFQAAAAAAAwAAAAAAAwAAAAABAwAAAAABDwAAAAACDwAAAAABDwAAAAABDwAAAAADDwAAAAADDwAAAAADDwAAAAADDwAAAAACCwAAAAACCwAAAAACCwAAAAACCwAAAAAAFQAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAAACwAAAAAACwAAAAADCwAAAAABCwAAAAACFQAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAAAgAAAAAACwAAAAABCwAAAAADCwAAAAAACwAAAAAAFQAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAgAAAAAABwAAAAACBwAAAAACBwAAAAABBwAAAAACBwAAAAAAAgAAAAAACwAAAAADCwAAAAACCwAAAAABCwAAAAADFQAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAACAgAAAAAABwAAAAAABwAAAAABBwAAAAADBwAAAAADBwAAAAABAgAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAgAAAAAABwAAAAACBwAAAAAABwAAAAABBwAAAAACBwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAgAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAADBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFQAAAAAAFQAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAACAgAAAAAABwAAAAACBwAAAAABBwAAAAABBwAAAAADBwAAAAADBwAAAAABBwAAAAADAwAAAAADAgAAAAAAAwAAAAADHAAAAAABHAAAAAACHAAAAAACHAAAAAACAwAAAAAABwAAAAAABwAAAAABBwAAAAABBwAAAAADBwAAAAACBwAAAAAABwAAAAACBwAAAAABAwAAAAAAAgAAAAAAAwAAAAABHAAAAAAAHAAAAAABHAAAAAACHAAAAAAAAwAAAAADBwAAAAADBwAAAAAABwAAAAABBwAAAAABBwAAAAADBwAAAAABBwAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABHAAAAAACHAAAAAACHAAAAAACHAAAAAAAAwAAAAAABwAAAAADBwAAAAACBwAAAAABBwAAAAABBwAAAAAABwAAAAADBwAAAAAABwAAAAACAgAAAAAAAwAAAAABAwAAAAAAHAAAAAACHAAAAAAAHAAAAAABHAAAAAAAAwAAAAACAwAAAAADBwAAAAABBwAAAAABBwAAAAAABwAAAAADBwAAAAABBwAAAAABBwAAAAADAgAAAAAAAgAAAAAAAwAAAAABHAAAAAAAHAAAAAAAHAAAAAABHAAAAAACHAAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAAC version: 6 6,7: ind: 6,7 - tiles: CAAAAAABAgAAAAAAAwAAAAADHAAAAAACHAAAAAAAHAAAAAAAHAAAAAACHAAAAAAAHAAAAAAAHAAAAAAAHAAAAAABHAAAAAAAHAAAAAABHAAAAAACHAAAAAABHAAAAAAACAAAAAADAgAAAAAAAwAAAAABHAAAAAAAHAAAAAAAHAAAAAAAHAAAAAACHAAAAAADHAAAAAACHAAAAAADHAAAAAAAHAAAAAACHAAAAAABHAAAAAABHAAAAAACHAAAAAADCAAAAAABAgAAAAAAAwAAAAADAwAAAAACHAAAAAACHAAAAAACHAAAAAADHAAAAAACHAAAAAACHAAAAAADHAAAAAADHAAAAAAAHAAAAAACHAAAAAACHAAAAAADHAAAAAADCAAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAFAAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAAAFAAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABFAAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAABAgAAAAAACwAAAAADCwAAAAADCwAAAAADAgAAAAAAAwAAAAABBQAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAABBQAAAAABAwAAAAACBQAAAAACBQAAAAABBQAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: CAAAAAACAgAAAAAAAwAAAAADHAAAAAACHAAAAAABHAAAAAACHAAAAAACHAAAAAADHAAAAAAAHAAAAAABHAAAAAABHAAAAAAAHAAAAAADHAAAAAABHAAAAAACHAAAAAAACAAAAAADAgAAAAAAAwAAAAACHAAAAAADHAAAAAADHAAAAAACHAAAAAABHAAAAAABHAAAAAABHAAAAAACHAAAAAAAHAAAAAAAHAAAAAABHAAAAAAAHAAAAAADHAAAAAAACAAAAAADAgAAAAAAAwAAAAAAAwAAAAACHAAAAAAAHAAAAAAAHAAAAAACHAAAAAABHAAAAAADHAAAAAACHAAAAAABHAAAAAABHAAAAAADHAAAAAABHAAAAAABHAAAAAACCAAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADFAAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACFAAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAABFAAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAACwAAAAAACwAAAAAACwAAAAACAgAAAAAAAwAAAAABBQAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAABBQAAAAACAwAAAAADBQAAAAAABQAAAAAABQAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 6,8: ind: 6,8 - tiles: AwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACgAAAAACCgAAAAADAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAwAAAAACBQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAABBQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAwAAAAADAwAAAAABBQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACgAAAAADCgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAA + tiles: AwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACgAAAAACCgAAAAABAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAADBQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAAABQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAwAAAAACAwAAAAADBQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAACgAAAAAACgAAAAADAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAA version: 6 6,9: ind: 6,9 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABCgAAAAAACgAAAAADCgAAAAACAwAAAAADAwAAAAADAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAABCgAAAAACCgAAAAACCgAAAAAAAwAAAAABAwAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAADBQAAAAABAwAAAAABCgAAAAADCgAAAAADCgAAAAABAwAAAAACBQAAAAADAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAABBQAAAAACAwAAAAACCgAAAAABCgAAAAACCgAAAAAAAwAAAAADBQAAAAABAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAAABQAAAAAAAwAAAAADCgAAAAABCgAAAAABCgAAAAAAAwAAAAACBQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAACCAAAAAAACAAAAAADCAAAAAACCAAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACCAAAAAADCAAAAAACCAAAAAAACAAAAAACCAAAAAABCAAAAAACCAAAAAABAgAAAAAAAwAAAAABBQAAAAAABQAAAAACBQAAAAACBQAAAAADBQAAAAAABQAAAAABBQAAAAAD + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACCgAAAAADCgAAAAABCgAAAAABAwAAAAADAwAAAAABAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACCgAAAAABCgAAAAADCgAAAAACAwAAAAABAwAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAADBQAAAAACAwAAAAABCgAAAAAACgAAAAADCgAAAAAAAwAAAAABBQAAAAABAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAAABQAAAAAAAwAAAAABCgAAAAADCgAAAAACCgAAAAAAAwAAAAABBQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAADBQAAAAACAwAAAAAACgAAAAABCgAAAAADCgAAAAAAAwAAAAACBQAAAAACAgAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAACCAAAAAABCAAAAAADCAAAAAADCAAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAABCAAAAAACCAAAAAADCAAAAAACCAAAAAABCAAAAAAACAAAAAADCAAAAAADAgAAAAAAAwAAAAACBQAAAAABBQAAAAADBQAAAAABBQAAAAAABQAAAAAABQAAAAACBQAAAAAB version: 6 7,1: ind: 7,1 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAQAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAQAAAAAA version: 6 7,10: ind: 7,10 - tiles: BQAAAAABAwAAAAADAgAAAAAACAAAAAABCgAAAAAACQAAAAAACgAAAAACCAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABQAAAAACAwAAAAAAAgAAAAAACAAAAAADCgAAAAABCgAAAAACCgAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAABAwAAAAADAgAAAAAACAAAAAACCAAAAAAACAAAAAACCAAAAAACCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAHAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAFgAAAAAABwAAAAACAgAAAAAABwAAAAAAAgAAAAAAHAAAAAABHAAAAAAAHAAAAAAAHAAAAAADAgAAAAAAHAAAAAABHAAAAAAAAgAAAAAAHAAAAAAAAgAAAAAAAAAAAAAABwAAAAADBwAAAAAAAgAAAAAAFgAAAAADFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAAgAAAAAAHAAAAAADAgAAAAAAAAAAAAAABwAAAAADAgAAAAAABwAAAAADBwAAAAAAFAAAAAAAAgAAAAAAHAAAAAAAHAAAAAACHAAAAAADHAAAAAACAgAAAAAAAgAAAAAAHAAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAFgAAAAABFgAAAAAFBwAAAAACFAAAAAAAHAAAAAABAgAAAAAAHAAAAAACAgAAAAAAAgAAAAAAHAAAAAABHAAAAAABAgAAAAAAHAAAAAABAgAAAAAAAAAAAAAABwAAAAAAFgAAAAAFBwAAAAABBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: BQAAAAADAwAAAAACAgAAAAAACAAAAAAACgAAAAACCQAAAAAACgAAAAADCAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABQAAAAACAwAAAAABAgAAAAAACAAAAAABCgAAAAADCgAAAAAACgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAwAAAAADAgAAAAAACAAAAAAACAAAAAAACAAAAAACCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAACHAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAFgAAAAAEBwAAAAABAgAAAAAABwAAAAAAAgAAAAAAHAAAAAAAHAAAAAAAHAAAAAAAHAAAAAACAgAAAAAAHAAAAAACHAAAAAACAgAAAAAAHAAAAAADAgAAAAAAAAAAAAAABwAAAAABBwAAAAAAAgAAAAAAFgAAAAADFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAACAgAAAAAAHAAAAAACAgAAAAAAAAAAAAAABwAAAAADAgAAAAAABwAAAAABBwAAAAABFAAAAAAAAgAAAAAAHAAAAAADHAAAAAADHAAAAAADHAAAAAAAAgAAAAAAAgAAAAAAHAAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAFgAAAAAAFgAAAAAEBwAAAAABFAAAAAAAHAAAAAAAAgAAAAAAHAAAAAADAgAAAAAAAgAAAAAAHAAAAAADHAAAAAABAgAAAAAAHAAAAAACAgAAAAAAAAAAAAAABwAAAAACFgAAAAAGBwAAAAADBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAACAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 7,2: ind: 7,2 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAHQAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAADEAAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAADEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAAAEAAAAAAAEAAAAAABEAAAAAADEAAAAAACEAAAAAACEAAAAAAAAgAAAAAAAwAAAAADBQAAAAABAwAAAAABAgAAAAAAAwAAAAADAwAAAAAA + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAHQAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAADAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAEAAAAAABEAAAAAACEAAAAAAAEAAAAAAAEAAAAAADEAAAAAACEAAAAAABEAAAAAABAgAAAAAAAwAAAAACBQAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAB version: 6 7,3: ind: 7,3 - tiles: AgAAAAAAEAAAAAABEAAAAAADEAAAAAAAEAAAAAADEAAAAAADEAAAAAADEAAAAAACEAAAAAABAgAAAAAAAwAAAAABBQAAAAAAAwAAAAABAgAAAAAAAwAAAAABBQAAAAAAAgAAAAAAEAAAAAAAEAAAAAABEAAAAAABEAAAAAADEAAAAAADEAAAAAACEAAAAAAAEAAAAAADAgAAAAAAAwAAAAAABQAAAAADAwAAAAABAgAAAAAAAwAAAAACBQAAAAABAgAAAAAAEAAAAAADEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAEAAAAAABEAAAAAADEAAAAAAAEAAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAwAAAAACBQAAAAABAgAAAAAAEAAAAAAAEAAAAAACEAAAAAABEAAAAAAAEAAAAAACEAAAAAABEAAAAAAAEAAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAEAAAAAADAgAAAAAAAgAAAAAAEAAAAAABEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAABBQAAAAACBQAAAAADBQAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACBwAAAAABBwAAAAABBwAAAAADBwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAABwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAADGgAAAAAAGgAAAAAABwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAACAwAAAAABBwAAAAACBwAAAAADBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAADBwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAFAAAAAAAFAAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAB + tiles: AgAAAAAAEAAAAAAAEAAAAAADEAAAAAADEAAAAAACEAAAAAACEAAAAAABEAAAAAADEAAAAAADAgAAAAAAAwAAAAADBQAAAAAAAwAAAAAAAgAAAAAAAwAAAAADBQAAAAACAgAAAAAAEAAAAAACEAAAAAABEAAAAAACEAAAAAADEAAAAAADEAAAAAAAEAAAAAABEAAAAAABAgAAAAAAAwAAAAADBQAAAAAAAwAAAAABAgAAAAAAAwAAAAADBQAAAAAAAgAAAAAAEAAAAAABEAAAAAACEAAAAAAAEAAAAAABEAAAAAABEAAAAAADEAAAAAABEAAAAAAAEAAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADBQAAAAABAgAAAAAAEAAAAAACEAAAAAAAEAAAAAABEAAAAAABEAAAAAABEAAAAAADEAAAAAABEAAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAEAAAAAADAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAwAAAAABBQAAAAAABQAAAAACBQAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADBwAAAAACBwAAAAACBwAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAABwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAACGgAAAAAAGgAAAAAABwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAACBwAAAAADBwAAAAABBwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAAABwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAFAAAAAAAFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAB version: 6 7,4: ind: 7,4 - tiles: AwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAADFAAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAABFAAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAACFAAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAFAAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAAAFAAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAABAgAAAAAAAgAAAAAAAwAAAAAD + tiles: AwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAABFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAADFAAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADFAAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAABFAAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAFAAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAACFAAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAABEAAAAAACAgAAAAAAAgAAAAAAAwAAAAAA version: 6 7,5: ind: 7,5 - tiles: AwAAAAAAAwAAAAACAwAAAAACAgAAAAAAEAAAAAABEAAAAAACEAAAAAAAEAAAAAABEAAAAAAAEAAAAAADEAAAAAACEAAAAAADEAAAAAADEAAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAEAAAAAABEQAAAAAAEQAAAAAAEQAAAAABEQAAAAABEAAAAAACEAAAAAADEAAAAAABEAAAAAAAEAAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAEAAAAAABEQAAAAABEQAAAAAAEQAAAAABEQAAAAAAEAAAAAADEAAAAAADEAAAAAACEAAAAAABEAAAAAADAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAAEAAAAAABEQAAAAACEQAAAAACEQAAAAABEQAAAAADEAAAAAAAEAAAAAACEAAAAAACEAAAAAADEAAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAEAAAAAACEQAAAAACEQAAAAAAEQAAAAACEQAAAAADEAAAAAAAEAAAAAACAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAADAgAAAAAAEAAAAAAAEQAAAAABEQAAAAABEQAAAAADEQAAAAACEAAAAAACEAAAAAACAgAAAAAAEAAAAAAAEAAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAEAAAAAACEAAAAAADEAAAAAABEAAAAAABEAAAAAADEAAAAAACEAAAAAAAAgAAAAAAEAAAAAADEAAAAAADAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAACwAAAAABCwAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABCwAAAAABCwAAAAABAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADCwAAAAABCwAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACCwAAAAAACwAAAAADAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADCwAAAAAACwAAAAADAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAB + tiles: AwAAAAABAwAAAAACAwAAAAACAgAAAAAAEAAAAAADEAAAAAADEAAAAAAAEAAAAAAAEAAAAAADEAAAAAABEAAAAAAAEAAAAAABEAAAAAACEAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAEAAAAAADEQAAAAAAEQAAAAACEQAAAAACEQAAAAADEAAAAAADEAAAAAACEAAAAAACEAAAAAADEAAAAAABAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAgAAAAAAEAAAAAAAEQAAAAAAEQAAAAABEQAAAAABEQAAAAACEAAAAAADEAAAAAADEAAAAAADEAAAAAABEAAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAADAgAAAAAAEAAAAAABEQAAAAAAEQAAAAAAEQAAAAAAEQAAAAAAEAAAAAADEAAAAAADEAAAAAACEAAAAAADEAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAADAgAAAAAAEAAAAAACEQAAAAAAEQAAAAABEQAAAAADEQAAAAABEAAAAAADEAAAAAACAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAEAAAAAADEQAAAAADEQAAAAADEQAAAAADEQAAAAADEAAAAAADEAAAAAAAAgAAAAAAEAAAAAAAEAAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAABEAAAAAABEAAAAAAAEAAAAAACEAAAAAACAgAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABCwAAAAACCwAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAACwAAAAAACwAAAAADAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABCwAAAAACCwAAAAABAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABCwAAAAACCwAAAAADAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAACwAAAAABCwAAAAABAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAB version: 6 7,6: ind: 7,6 - tiles: AwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABDwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADDwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAADAgAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAACBwAAAAAAAwAAAAADHAAAAAADHAAAAAAAHAAAAAABHAAAAAACAwAAAAADAgAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAADBwAAAAADAwAAAAACHAAAAAAAHAAAAAABHAAAAAAAHAAAAAAAAwAAAAABAgAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAAABwAAAAAAAwAAAAAAHAAAAAAAHAAAAAAAHAAAAAABHAAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAHAAAAAACHAAAAAAAHAAAAAADHAAAAAAAAwAAAAAAAwAAAAADBwAAAAADBwAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAAAAgAAAAAAAwAAAAACAwAAAAABHAAAAAAAHAAAAAABHAAAAAADHAAAAAADHAAAAAABAwAAAAAAAgAAAAAABwAAAAACPgAAAAAAPgAAAAAAPQAAAAAAPQAAAAAABwAAAAADAgAAAAAAAwAAAAAA + tiles: AwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADDwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACDwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAQAAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAAABwAAAAABAwAAAAADHAAAAAAAHAAAAAADHAAAAAAAHAAAAAAAAwAAAAACAgAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABBwAAAAAAAwAAAAADHAAAAAABHAAAAAADHAAAAAACHAAAAAADAwAAAAABAgAAAAAAQQAAAAAAQQAAAAAAQQAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAAABwAAAAAAAwAAAAAAHAAAAAABHAAAAAAAHAAAAAAAHAAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADHAAAAAADHAAAAAADHAAAAAADHAAAAAABAwAAAAACAwAAAAABBwAAAAADBwAAAAAABwAAAAACBwAAAAACBwAAAAADBwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAHAAAAAADHAAAAAAAHAAAAAABHAAAAAACHAAAAAACAwAAAAABAgAAAAAABwAAAAADPgAAAAAAPgAAAAAAPQAAAAAAPQAAAAAABwAAAAAAAgAAAAAAAwAAAAAA version: 6 7,7: ind: 7,7 - tiles: HAAAAAADHAAAAAACHAAAAAADHAAAAAADHAAAAAAAHAAAAAABAwAAAAADAgAAAAAABwAAAAACPgAAAAAAPgAAAAAAPQAAAAAAPQAAAAAABwAAAAADFAAAAAAAAwAAAAABHAAAAAABHAAAAAADHAAAAAADHAAAAAABHAAAAAACHAAAAAADAwAAAAADAgAAAAAABwAAAAADPgAAAAAAPgAAAAAAPQAAAAAAPQAAAAAABwAAAAADFAAAAAAAAwAAAAACHAAAAAADHAAAAAAAHAAAAAADHAAAAAADHAAAAAAAAwAAAAADAwAAAAACAgAAAAAABwAAAAABBwAAAAADBwAAAAADBwAAAAABBwAAAAABBwAAAAAAFAAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAACAgAAAAAAAwAAAAADFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAABFAAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAFAAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAABFAAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACBQAAAAABBQAAAAACBQAAAAADAwAAAAADAwAAAAACAwAAAAAABQAAAAACBQAAAAADAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAABQAAAAADBQAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAACBQAAAAABBQAAAAADBQAAAAACAwAAAAAABQAAAAADBQAAAAABBQAAAAADAwAAAAABAgAAAAAAAwAAAAABBQAAAAAABQAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAAABQAAAAADBQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAAABQAAAAAABQAAAAAB + tiles: HAAAAAACHAAAAAAAHAAAAAABHAAAAAAAHAAAAAAAHAAAAAACAwAAAAADAgAAAAAABwAAAAABPgAAAAAAPgAAAAAAPQAAAAAAPQAAAAAABwAAAAABFAAAAAAAAwAAAAACHAAAAAADHAAAAAAAHAAAAAABHAAAAAABHAAAAAABHAAAAAADAwAAAAABAgAAAAAABwAAAAABPgAAAAAAPgAAAAAAPQAAAAAAPQAAAAAABwAAAAADFAAAAAAAAwAAAAAAHAAAAAADHAAAAAAAHAAAAAAAHAAAAAADHAAAAAADAwAAAAACAwAAAAABAgAAAAAABwAAAAAABwAAAAAABwAAAAAABwAAAAACBwAAAAABBwAAAAAAFAAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAAAAgAAAAAAAwAAAAADFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADFAAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACFAAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAABFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAABBQAAAAAABQAAAAAABQAAAAAAAwAAAAABAwAAAAABAwAAAAABBQAAAAAABQAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADBQAAAAACBQAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAADBQAAAAADBQAAAAACBQAAAAACAwAAAAADBQAAAAAABQAAAAAABQAAAAADAwAAAAACAgAAAAAAAwAAAAABBQAAAAAABQAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAABBQAAAAACBQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABBQAAAAADBQAAAAAB version: 6 7,8: ind: 7,8 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAACBQAAAAAABQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAABQAAAAABBQAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACgAAAAACCgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACBQAAAAABAwAAAAADAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAwAAAAAABQAAAAACAwAAAAADAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACBQAAAAACAwAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAAAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAAABQAAAAABAwAAAAACAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADBQAAAAABBQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACgAAAAABCgAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAACAAAAAADCAAAAAACCAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAACAAAAAADCAAAAAACCAAAAAAC + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAAABQAAAAADBQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAACBQAAAAAABQAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACgAAAAABCgAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAwAAAAADBQAAAAADAwAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAwAAAAAABQAAAAAAAwAAAAADAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAADBQAAAAACAwAAAAADAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACBQAAAAAAAwAAAAABAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAADAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAABBQAAAAAABQAAAAABAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAACgAAAAADCgAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAACAAAAAACCAAAAAACCAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAAD version: 6 7,9: ind: 7,9 - tiles: AQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAADAgAAAAAACAAAAAABCAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAgAAAAAACAAAAAADCAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAgAAAAAACAAAAAADCAAAAAAACAAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAABQAAAAAABQAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACBQAAAAACBQAAAAADBQAAAAACAwAAAAADAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAADAwAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABQAAAAACAwAAAAADAgAAAAAACAAAAAACCgAAAAADCgAAAAAACgAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAA + tiles: AQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAADAgAAAAAACAAAAAAACAAAAAABCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAACAgAAAAAACAAAAAACCAAAAAACCAAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAABQAAAAADBQAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAABQAAAAABBQAAAAABBQAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAwAAAAABAgAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABQAAAAAAAwAAAAABAgAAAAAACAAAAAAACgAAAAACCgAAAAABCgAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAA version: 6 8,2: ind: 8,2 - tiles: AQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAACCAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAACAwAAAAAABQAAAAACAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAgAAAAAACAAAAAADCAAAAAABCAAAAAAACAAAAAACCAAAAAADAgAAAAAAAgAAAAAAAwAAAAADBQAAAAACAwAAAAADBQAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAgAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAABCAAAAAACAgAAAAAAAwAAAAABAwAAAAACBQAAAAADAwAAAAACBQAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAACCAAAAAADCAAAAAACCAAAAAAAAgAAAAAA + tiles: AQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAAAAwAAAAACBQAAAAACAwAAAAABAgAAAAAAAwAAAAADAwAAAAACAgAAAAAACAAAAAABCAAAAAADCAAAAAABCAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAwAAAAADBQAAAAABAwAAAAAABQAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAgAAAAAACAAAAAAACAAAAAABCAAAAAACCAAAAAABCAAAAAACAgAAAAAAAwAAAAABAwAAAAACBQAAAAAAAwAAAAACBQAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAACCAAAAAAACAAAAAABCAAAAAADAgAAAAAA version: 6 8,3: ind: 8,3 - tiles: AwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAACAAAAAACCAAAAAADCAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABBQAAAAACAwAAAAAABQAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAABAgAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAABCAAAAAABAgAAAAAAAwAAAAABAwAAAAAABQAAAAAAAwAAAAABBQAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAABQAAAAABAwAAAAACBQAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAADFAAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAACFAAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAABFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAABFAAAAAAACAAAAAACCAAAAAADCAAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABFAAAAAAACAAAAAACCAAAAAAACAAAAAADCAAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACFAAAAAAACAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAADAgAAAAAACAAAAAABAwAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAgAAAAAACAAAAAABFAAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAABCAAAAAAACAAAAAABCAAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAgAAAAAACAAAAAAAAwAAAAAAAgAAAAAACAAAAAADCgAAAAACCAAAAAAACAAAAAAACgAAAAABCAAAAAADAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAgAAAAAACAAAAAACCAAAAAAACAAAAAABCAAAAAAACAAAAAABAgAAAAAAAwAAAAAAAwAAAAAABQAAAAABAwAAAAAABQAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAABCAAAAAABCAAAAAAAAgAAAAAAAwAAAAACAwAAAAAABQAAAAAAAwAAAAADBQAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADBQAAAAAAAwAAAAABBQAAAAADAwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAADFAAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAACFAAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAAAFAAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAABFAAAAAAACAAAAAADCAAAAAADCAAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAwAAAAACFAAAAAAACAAAAAADCAAAAAAACAAAAAACCAAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACFAAAAAAACAAAAAAACAAAAAAACAAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAAAAgAAAAAACAAAAAABAwAAAAAAAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACAAAAAAAFAAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAAACAAAAAABCAAAAAABCAAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAACAAAAAAAAwAAAAACAgAAAAAACAAAAAAACgAAAAAACAAAAAAACAAAAAAACgAAAAADCAAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAA version: 6 8,4: ind: 8,4 - tiles: AwAAAAACAgAAAAAACAAAAAAACgAAAAAACAAAAAABCAAAAAACCgAAAAADCAAAAAADAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAACAwAAAAACAgAAAAAACAAAAAADCgAAAAAACAAAAAADCAAAAAADCgAAAAABCAAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAACAgAAAAAACAAAAAAACAAAAAAACAAAAAACAwAAAAABAgAAAAAACAAAAAABCAAAAAACCAAAAAACCAAAAAACCAAAAAACCAAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAABAwAAAAABAgAAAAAACAAAAAABCAAAAAACCAAAAAABCAAAAAABCAAAAAAACAAAAAAACAAAAAADAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAACAAAAAAACAAAAAABCAAAAAACCAAAAAABCAAAAAADCAAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAgAAAAAACAAAAAAACgAAAAABCAAAAAABCAAAAAAACgAAAAABCAAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAADCAAAAAABCAAAAAABCgAAAAADCAAAAAADCAAAAAABCgAAAAADCAAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAgAAAAAACAAAAAAACgAAAAACCAAAAAACCAAAAAABCgAAAAADCAAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAACCAAAAAABCAAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAAACAAAAAACCAAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAAAAgAAAAAACAAAAAACCgAAAAADCAAAAAADCAAAAAABCgAAAAACCAAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAADAwAAAAABAgAAAAAACAAAAAACCgAAAAABCAAAAAACCAAAAAAACgAAAAADCAAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAgAAAAAACAAAAAAACAAAAAACCAAAAAADAwAAAAABAgAAAAAACAAAAAABCAAAAAADCAAAAAACCAAAAAADCAAAAAACCAAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAACAAAAAADCAAAAAADCAAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAACAAAAAACCAAAAAADCAAAAAADAwAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAACCAAAAAADCAAAAAADCAAAAAADCAAAAAACAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAACAAAAAABCAAAAAABCAAAAAAACAAAAAAACAAAAAADCAAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAgAAAAAACAAAAAACCgAAAAAACAAAAAABCAAAAAABCgAAAAAACAAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACCAAAAAACCAAAAAADCgAAAAAACAAAAAABCAAAAAACCgAAAAADCAAAAAADAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACAAAAAABCgAAAAACCAAAAAAACAAAAAACCgAAAAAACAAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAACAAAAAACCAAAAAAACAAAAAADCAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAgAAAAAACAAAAAADCAAAAAADCAAAAAACCAAAAAACCAAAAAABCAAAAAACAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 8,5: ind: 8,5 - tiles: AwAAAAABAwAAAAADAgAAAAAACwAAAAADCwAAAAABCwAAAAABCwAAAAABCwAAAAACCwAAAAABCwAAAAADCwAAAAABAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACwAAAAABCwAAAAAACwAAAAACCwAAAAAACwAAAAABCwAAAAADCwAAAAADCwAAAAABAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAwAAAAABAwAAAAADAgAAAAAACwAAAAADCwAAAAACCwAAAAABCwAAAAABCwAAAAADCwAAAAADCwAAAAADCwAAAAABAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAgAAAAAACwAAAAADCwAAAAAACwAAAAABCwAAAAACCwAAAAADCwAAAAABCwAAAAAACwAAAAACAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAACCAAAAAACCAAAAAABCAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAABQAAAAADAwAAAAACAwAAAAADAgAAAAAACAAAAAACCAAAAAABDgAAAAADDgAAAAADDgAAAAAADgAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAADAwAAAAADAwAAAAABAgAAAAAACAAAAAABCAAAAAADDgAAAAAACAAAAAAACAAAAAADCAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABBQAAAAAAAwAAAAADAwAAAAACCAAAAAADCAAAAAACCAAAAAAADgAAAAADCAAAAAACCgAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAACAAAAAADCAAAAAADDgAAAAABCAAAAAABCAAAAAABCAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACAAAAAAACAAAAAADDgAAAAABDgAAAAACDgAAAAACDgAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACFAAAAAAAFAAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAACCAAAAAABCAAAAAAACAAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAD + tiles: AwAAAAADAwAAAAADAgAAAAAACwAAAAADCwAAAAAACwAAAAACCwAAAAACCwAAAAADCwAAAAADCwAAAAAACwAAAAABAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAACwAAAAABCwAAAAAACwAAAAAACwAAAAACCwAAAAACCwAAAAAACwAAAAABCwAAAAADAgAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAwAAAAAAAwAAAAABAgAAAAAACwAAAAADCwAAAAACCwAAAAADCwAAAAAACwAAAAABCwAAAAAACwAAAAACCwAAAAACAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAACwAAAAADCwAAAAADCwAAAAAACwAAAAABCwAAAAAACwAAAAABCwAAAAACCwAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAgAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAABCAAAAAAACAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAABQAAAAACAwAAAAADAwAAAAADAgAAAAAACAAAAAAACAAAAAACDgAAAAADDgAAAAADDgAAAAADDgAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAABQAAAAAAAwAAAAABAwAAAAACAgAAAAAACAAAAAABCAAAAAADDgAAAAACCAAAAAABCAAAAAACCAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAADAwAAAAADAwAAAAACCAAAAAACCAAAAAADCAAAAAADDgAAAAACCAAAAAABCgAAAAACCAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAgAAAAAACAAAAAADCAAAAAADDgAAAAABCAAAAAAACAAAAAADCAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAACAAAAAAACAAAAAACDgAAAAAADgAAAAAADgAAAAABDgAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADFAAAAAAAFAAAAAAAAgAAAAAACAAAAAADCAAAAAADCAAAAAAACAAAAAABCAAAAAACCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAAA version: 6 8,6: ind: 8,6 - tiles: AwAAAAADAwAAAAAAFAAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAACFAAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACFAAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAACAAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAACAAAAAAACAAAAAACAwAAAAABAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAgAAAAAACAAAAAABCAAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAACAAAAAABCAAAAAACAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAgAAAAAACAAAAAADCAAAAAABAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAACAAAAAADCAAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAACAAAAAABAwAAAAADAwAAAAAAFAAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAACAAAAAACCAAAAAACAwAAAAACAwAAAAABFAAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADFAAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAACAAAAAACCAAAAAADAwAAAAAAAwAAAAACFAAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABFAAAAAAAAwAAAAABBQAAAAAAAwAAAAADBQAAAAACAwAAAAACAgAAAAAACAAAAAACCAAAAAACAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADBQAAAAACAwAAAAABBQAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAACAwAAAAAAFAAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADFAAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABFAAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAACAAAAAABAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACAAAAAAACAAAAAADAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAADAgAAAAAACAAAAAADCAAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAACAAAAAACCAAAAAADAwAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAACAAAAAAACAAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAACAAAAAABCAAAAAABAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAACAAAAAAAAwAAAAADAwAAAAADFAAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAABAwAAAAACAwAAAAAAFAAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADFAAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAACAAAAAABCAAAAAAAAwAAAAABAwAAAAAAFAAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAABFAAAAAAAAwAAAAADBQAAAAADAwAAAAAABQAAAAACAwAAAAACAgAAAAAACAAAAAACCAAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAABQAAAAACAwAAAAAABQAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAA version: 6 8,7: ind: 8,7 - tiles: AwAAAAAAAwAAAAACCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACBQAAAAACAwAAAAABBQAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAADAwAAAAABFAAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAADAwAAAAABFAAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAADFAAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAACgAAAAADCAAAAAAACAAAAAAACAAAAAACCgAAAAABAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBQAAAAADAwAAAAADAgAAAAAACgAAAAADCAAAAAAACAAAAAAACAAAAAABCgAAAAABAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBQAAAAACAwAAAAADAgAAAAAACgAAAAACCAAAAAAACAAAAAADCAAAAAABCgAAAAADAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBQAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBQAAAAADAwAAAAAAAwAAAAAAAwAAAAAABQAAAAAAAwAAAAACBQAAAAACAwAAAAABBQAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAACAwAAAAADAgAAAAAAAwAAAAAABQAAAAADAwAAAAADBQAAAAABAwAAAAABBQAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAA + tiles: AwAAAAABAwAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACBQAAAAACAwAAAAAABQAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAADFAAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAACFAAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAFAAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAACgAAAAADCAAAAAABCAAAAAACCAAAAAAACgAAAAACAgAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBQAAAAACAwAAAAADAgAAAAAACgAAAAABCAAAAAADCAAAAAABCAAAAAAACgAAAAADAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABQAAAAABAwAAAAACAgAAAAAACgAAAAAACAAAAAACCAAAAAACCAAAAAABCgAAAAADAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBQAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBQAAAAAAAwAAAAABAwAAAAAAAwAAAAABBQAAAAACAwAAAAABBQAAAAAAAwAAAAAABQAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAADAwAAAAADAgAAAAAAAwAAAAAABQAAAAACAwAAAAABBQAAAAACAwAAAAADBQAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAC version: 6 8,8: ind: 8,8 - tiles: BQAAAAABAwAAAAADAgAAAAAAAwAAAAAABQAAAAABAwAAAAACBQAAAAACAwAAAAADBQAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABBQAAAAAABQAAAAADBQAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAADBQAAAAABBQAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACQAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAABBQAAAAAAAwAAAAAABQAAAAAABQAAAAADAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAABQAAAAADAwAAAAABBQAAAAACBQAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADBQAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAABAwAAAAACBQAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAABQAAAAABAwAAAAAABQAAAAABBQAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAADAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAAABwAAAAABBwAAAAACBwAAAAADAwAAAAAAAgAAAAAA + tiles: BQAAAAABAwAAAAADAgAAAAAAAwAAAAAABQAAAAADAwAAAAACBQAAAAAAAwAAAAACBQAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABBQAAAAACBQAAAAADBQAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAAABQAAAAADBQAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAACBQAAAAACAwAAAAAABQAAAAACBQAAAAACAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADBQAAAAAAAwAAAAABBQAAAAACBQAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADBQAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACBQAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAABQAAAAADAwAAAAABBQAAAAAABQAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAADBwAAAAADBwAAAAAAAwAAAAADAgAAAAAA version: 6 8,9: ind: 8,9 - tiles: CAAAAAADAgAAAAAACAAAAAACCAAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAABBwAAAAADBwAAAAABAwAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAABBwAAAAACBwAAAAAABwAAAAACBwAAAAABAgAAAAAACAAAAAADAgAAAAAACAAAAAADCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAACCAAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAACCAAAAAAACAAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAACAAAAAABCAAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAAACAAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: CAAAAAACAgAAAAAACAAAAAADCAAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAADBwAAAAAABwAAAAADBwAAAAAABwAAAAACBwAAAAADAwAAAAACCAAAAAACCAAAAAADCAAAAAADCAAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAABBwAAAAACBwAAAAADBwAAAAABBwAAAAAABwAAAAABAgAAAAAACAAAAAACAgAAAAAACAAAAAACCAAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAABAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAABCAAAAAACCAAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAAACAAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 9,2: ind: 9,2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAPwAAAAAAAgAAAAAAQAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 9,3: ind: 9,3 - tiles: AwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAABQAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAABQAAAAACAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAACAAAAAACCAAAAAADCAAAAAACCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAAACAAAAAABCAAAAAADCAAAAAADCAAAAAADCAAAAAACCAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAACAAAAAAACAAAAAABCAAAAAADCAAAAAAACAAAAAACCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAADCAAAAAAACAAAAAABCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: AwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAABBQAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAACBQAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAACAAAAAAACAAAAAADCAAAAAADCAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAAACAAAAAADCAAAAAAACAAAAAABCAAAAAAACAAAAAACCAAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAACAAAAAADCAAAAAABCAAAAAADCAAAAAACCAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAgAAAAAACAAAAAAACAAAAAAACAAAAAACCAAAAAAACAAAAAADCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAA version: 6 9,4: ind: 9,4 - tiles: CAAAAAADCAAAAAACAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAADCAAAAAAACAAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAACAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAADAwAAAAACAgAAAAAACAAAAAAACAAAAAABCAAAAAABCAAAAAACAgAAAAAAAgAAAAAABwAAAAABBwAAAAACBwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAACAgAAAAAACAAAAAABCAAAAAAACAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAAB + tiles: CAAAAAACCAAAAAADAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAADCAAAAAACCAAAAAABCAAAAAADCAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAADCAAAAAADAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABBwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAACAAAAAACCAAAAAABCAAAAAABCAAAAAACAgAAAAAAAgAAAAAABwAAAAACBwAAAAABBwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAACAAAAAACCAAAAAADCAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAACAgAAAAAACAAAAAABCAAAAAABCAAAAAACCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAACAAAAAAACAAAAAADCAAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAACAAAAAACCAAAAAAACAAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAABwAAAAAABwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADBwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAACBwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAAB version: 6 9,5: ind: 9,5 - tiles: HQAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAACHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + tiles: HQAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAACAwAAAAACHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAADAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAACAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA version: 6 9,6: ind: 9,6 - tiles: AwAAAAABAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAABFAAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAACFAAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAwAAAAADFAAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAACAAAAAABCAAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAACAAAAAAACAAAAAADAgAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAAAAgAAAAAACAAAAAACCAAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAADAgAAAAAACAAAAAACCAAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAgAAAAAACAAAAAADCAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAACCAAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAACAwAAAAACCAAAAAABCAAAAAACCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAABCAAAAAACCAAAAAADCAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAAACAAAAAADCAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAABAgAAAAAAAgAAAAAA + tiles: AwAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAABFAAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAAAFAAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACFAAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAACAAAAAAACAAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAACAwAAAAABAgAAAAAACAAAAAACCAAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAADAwAAAAACAgAAAAAACAAAAAAACAAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAACAgAAAAAACAAAAAABCAAAAAADAgAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAACAAAAAABCAAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAACCAAAAAABCAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAABCAAAAAADCAAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAACAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAABAwAAAAACCAAAAAAACAAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAADAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACAwAAAAACCAAAAAADCAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAACAwAAAAAAAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAA version: 6 9,7: ind: 9,7 - tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAADAwAAAAABAwAAAAADAwAAAAADAwAAAAABAwAAAAACAwAAAAABAwAAAAACAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAADAwAAAAACAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAAAAwAAAAADAwAAAAADAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAAgAAAAAABwAAAAABBwAAAAAABwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAwAAAAADAwAAAAADBwAAAAAABwAAAAAABwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAwAAAAABAwAAAAACBwAAAAABBwAAAAAABwAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAABBwAAAAABBwAAAAABBwAAAAACAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADBwAAAAAABwAAAAAABwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAABBwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAAABwAAAAACBwAAAAAABwAAAAABAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAABAwAAAAAC + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAACAwAAAAAAAwAAAAAAAwAAAAADAwAAAAACAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAAAAwAAAAACAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAAgAAAAAABwAAAAAABwAAAAADBwAAAAABAgAAAAAAAwAAAAADAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAwAAAAAAAwAAAAABBwAAAAACBwAAAAACBwAAAAACAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABBwAAAAAABwAAAAADBwAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAACAwAAAAAABwAAAAABBwAAAAAABwAAAAAAAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADBwAAAAAABwAAAAACBwAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAAAwAAAAABAwAAAAADAwAAAAACBwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAADBwAAAAABBwAAAAAABwAAAAACAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAwAAAAAAAwAAAAACAwAAAAAB version: 6 9,8: ind: 9,8 - tiles: BwAAAAAABwAAAAADBwAAAAABAgAAAAAAAwAAAAACAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAADAgAAAAAAAwAAAAADAwAAAAADAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAwAAAAACAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAABwAAAAADBwAAAAACAgAAAAAABwAAAAADBwAAAAAAAgAAAAAAHQAAAAAAHQAAAAAAAwAAAAACAwAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAABwAAAAAABwAAAAADAgAAAAAABwAAAAABBwAAAAACAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAABwAAAAACBwAAAAABAgAAAAAABwAAAAADBwAAAAABAgAAAAAAHQAAAAAAHQAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAABwAAAAADAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAwAAAAABAwAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAwAAAAABBwAAAAADBwAAAAADBwAAAAAABwAAAAAABwAAAAACBwAAAAACBwAAAAABBwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAAAAwAAAAAAAwAAAAABAwAAAAABBwAAAAAABwAAAAACBwAAAAACBwAAAAACBwAAAAACBwAAAAACBwAAAAACBwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAADAwAAAAABAwAAAAACBwAAAAABBwAAAAADBwAAAAABBwAAAAADBwAAAAABBwAAAAACBwAAAAAABwAAAAABAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAgAAAAAAAgAAAAAABwAAAAACAgAAAAAAAgAAAAAABwAAAAACFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAAAAgAAAAAABwAAAAAABwAAAAADAgAAAAAABwAAAAAABwAAAAAAAgAAAAAABwAAAAACBwAAAAABAwAAAAABAwAAAAACAwAAAAACAgAAAAAACAAAAAAACAAAAAADCAAAAAADAgAAAAAABwAAAAACBwAAAAAAAgAAAAAABwAAAAADBwAAAAAAAgAAAAAABwAAAAADBwAAAAABAwAAAAACAwAAAAABAwAAAAACAgAAAAAACAAAAAACCAAAAAAACAAAAAADAgAAAAAABwAAAAAABwAAAAABAgAAAAAABwAAAAAABwAAAAAAAgAAAAAABwAAAAAABwAAAAAA + tiles: BwAAAAABBwAAAAACBwAAAAADAgAAAAAAAwAAAAACAwAAAAACAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAACAwAAAAABAwAAAAAAAwAAAAABAwAAAAACAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAADAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAABwAAAAACBwAAAAAAAgAAAAAABwAAAAAABwAAAAACAgAAAAAAHQAAAAAAHQAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAABwAAAAADBwAAAAADAgAAAAAABwAAAAABBwAAAAADAgAAAAAAHQAAAAAAHQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAABwAAAAACBwAAAAACAgAAAAAABwAAAAAABwAAAAADAgAAAAAAHQAAAAAAHQAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAACAgAAAAAABwAAAAACAgAAAAAAAgAAAAAABwAAAAAAAgAAAAAAAgAAAAAAHQAAAAAAAgAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAAABwAAAAADBwAAAAADBwAAAAABBwAAAAAABwAAAAAABwAAAAAABwAAAAADBwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAACAwAAAAACAwAAAAAAAwAAAAAAAwAAAAACBwAAAAADBwAAAAACBwAAAAADBwAAAAADBwAAAAADBwAAAAACBwAAAAACBwAAAAACAwAAAAADAwAAAAACAwAAAAABAwAAAAABAwAAAAADAwAAAAADAwAAAAADAwAAAAADBwAAAAACBwAAAAADBwAAAAADBwAAAAAABwAAAAADBwAAAAAABwAAAAADBwAAAAADAwAAAAADAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAACAAAAAADAgAAAAAAAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAABwAAAAADAgAAAAAAAgAAAAAABwAAAAADFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAACAAAAAABCAAAAAAACAAAAAADAgAAAAAABwAAAAABBwAAAAACAgAAAAAABwAAAAAABwAAAAADAgAAAAAABwAAAAADBwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAACAAAAAABCAAAAAADCAAAAAADAgAAAAAABwAAAAACBwAAAAADAgAAAAAABwAAAAACBwAAAAADAgAAAAAABwAAAAAABwAAAAAAAwAAAAACAwAAAAADAwAAAAACAgAAAAAACAAAAAADCAAAAAAACAAAAAACAgAAAAAABwAAAAACBwAAAAACAgAAAAAABwAAAAACBwAAAAACAgAAAAAABwAAAAACBwAAAAAC version: 6 9,9: ind: 9,9 - tiles: AwAAAAABAwAAAAADAwAAAAAAAgAAAAAAAgAAAAAACAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAwAAAAADAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAABAwAAAAADAwAAAAACAwAAAAABAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAACAwAAAAACAwAAAAACAgAAAAAAAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAwAAAAACAwAAAAADAwAAAAADAgAAAAAAAgAAAAAAAwAAAAADAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAABAgAAAAAAAwAAAAAAAwAAAAACAwAAAAACAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAAAAAAAAAwAAAAAAAwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAABAwAAAAACAgAAAAAAAwAAAAADAwAAAAADAwAAAAABAgAAAAAAAQAAAAAAAwAAAAACAwAAAAADAwAAAAADAwAAAAAAAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AwAAAAAAAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAACAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAACAwAAAAABAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAwAAAAAAAwAAAAABAwAAAAADAwAAAAACAwAAAAADAwAAAAABAwAAAAAAAwAAAAACAwAAAAAAAwAAAAACAwAAAAABAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAABAwAAAAACAgAAAAAAAwAAAAACAwAAAAAAAwAAAAABAwAAAAABAwAAAAADAwAAAAAAAwAAAAACAgAAAAAAAgAAAAAAAwAAAAACAwAAAAABAgAAAAAAAwAAAAABAwAAAAAAAwAAAAACAgAAAAAAAwAAAAADAwAAAAABAwAAAAAAAgAAAAAAAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAABAwAAAAADAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAABAwAAAAABAwAAAAADAgAAAAAAAwAAAAACAwAAAAADAwAAAAAAAgAAAAAAAAAAAAAAAwAAAAADAwAAAAAAAwAAAAACAwAAAAABAwAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAAAAgAAAAAAAwAAAAABAwAAAAAAAwAAAAABAgAAAAAAAQAAAAAAAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAABAwAAAAAAAgAAAAAAAwAAAAACAwAAAAADAwAAAAABAgAAAAAAAwAAAAAAAwAAAAABAwAAAAABAgAAAAAAAAAAAAAAAgAAAAAAAwAAAAADAwAAAAADAwAAAAADAgAAAAAAAwAAAAADAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,6: ind: 0,6 @@ -666,8 +666,6 @@ entities: 2907: 52,86 2996: 40,110 2998: 38,110 - 4132: 51,82 - 4133: 52,82 4134: 47,82 4136: 48,82 8325: 59,76 @@ -735,6 +733,8 @@ entities: 14565: 93,97 14566: 98,90 14567: 100,90 + 14835: 50,82 + 14836: 51,82 - node: zIndex: 1 color: '#FFFFFFFF' @@ -875,8 +875,6 @@ entities: 14777: 37,82 14778: 39,82 14779: 38,86 - 14780: 49,80 - 14781: 50,80 14782: 44,48 14783: 44,50 14817: 94,24 @@ -1235,10 +1233,7 @@ entities: 3591: 134,46 4037: 48,81 4039: 48,83 - 4043: 51,81 - 4044: 52,81 4047: 51,83 - 4048: 52,83 4049: 47,81 4051: 47,83 10272: 132,127 @@ -1278,6 +1273,9 @@ entities: 14568: 99,90 14569: 61,90 14776: 38,82 + 14837: 50,83 + 14838: 50,81 + 14839: 51,81 - node: zIndex: 1 color: '#FFFFFFFF' @@ -3735,10 +3733,8 @@ entities: 11505: 56,77 11507: 56,71 11508: 55,68 - 11509: 50,80 11510: 47,82 11511: 50,83 - 11512: 51,82 11513: 52,89 11514: 53,91 11515: 51,91 @@ -4091,6 +4087,11 @@ entities: 13840: 53,99 13841: 47,102 14639: 30,103 + 14840: 48,80 + 14842: 50,84 + 14843: 53,84 + 14844: 51,82 + 14845: 52,80 - node: cleanable: True color: '#FFFFFFFF' @@ -4352,6 +4353,7 @@ entities: 13833: 48,103 13834: 52,103 13835: 51,99 + 14841: 53,81 - node: cleanable: True color: '#C6FF91FF' @@ -5935,8 +5937,6 @@ entities: 2715: 48,86 2732: 47,80 2733: 48,80 - 2734: 49,80 - 2735: 50,80 2736: 51,80 2737: 52,80 2773: 38,82 @@ -5946,6 +5946,8 @@ entities: 2785: 39,86 3020: 39,104 3045: 123,67 + 14833: 49,80 + 14834: 50,80 - node: zIndex: 1 color: '#D381C996' @@ -27682,7 +27684,7 @@ entities: parent: 1 - proto: BannerSecurity entities: - - uid: 23131 + - uid: 2489 components: - type: Transform pos: 143.5,58.5 @@ -29414,8 +29416,7 @@ entities: - uid: 23138 components: - type: Transform - rot: -18.84955592153876 rad - pos: 142.52057,52.14776 + pos: 142.5432,51.54286 parent: 1 - proto: BoxInflatable entities: @@ -29510,7 +29511,7 @@ entities: - uid: 33873 components: - type: Transform - pos: 59.343575,57.763638 + pos: 59.350124,57.59677 parent: 1 - proto: BriefcaseBrownFilled entities: @@ -29535,6 +29536,11 @@ entities: rot: 1.5707963267948966 rad pos: 125.5,72.5 parent: 1 + - type: DeviceLinkSource + linkedPorts: + 22833: + - Start: Close + - Timer: Open - uid: 22838 components: - type: MetaData @@ -29543,6 +29549,11 @@ entities: rot: 1.5707963267948966 rad pos: 125.5,69.5 parent: 1 + - type: DeviceLinkSource + linkedPorts: + 22834: + - Start: Close + - Timer: Open - uid: 22839 components: - type: MetaData @@ -29551,6 +29562,11 @@ entities: rot: 1.5707963267948966 rad pos: 125.5,66.5 parent: 1 + - type: DeviceLinkSource + linkedPorts: + 22835: + - Start: Close + - Timer: Open - uid: 22840 components: - type: MetaData @@ -29559,6 +29575,11 @@ entities: rot: 1.5707963267948966 rad pos: 125.5,63.5 parent: 1 + - type: DeviceLinkSource + linkedPorts: + 22836: + - Start: Close + - Timer: Open - proto: BrokenBottle entities: - uid: 33540 @@ -98633,6 +98654,21 @@ entities: rot: -1.5707963267948966 rad pos: 132.5,86.5 parent: 1 + - uid: 37738 + components: + - type: Transform + pos: 104.5,169.5 + parent: 1 + - uid: 37739 + components: + - type: Transform + pos: 103.5,169.5 + parent: 1 + - uid: 37740 + components: + - type: Transform + pos: 102.5,169.5 + parent: 1 - proto: Chair entities: - uid: 107 @@ -98723,6 +98759,12 @@ entities: - type: Transform pos: 97.5,45.5 parent: 1 + - uid: 4199 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 144.5,55.5 + parent: 1 - uid: 4373 components: - type: Transform @@ -98871,6 +98913,12 @@ entities: - type: Transform pos: 108.5,72.5 parent: 1 + - uid: 10317 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 143.5,55.5 + parent: 1 - uid: 10336 components: - type: Transform @@ -99613,24 +99661,6 @@ entities: rot: 3.141592653589793 rad pos: 131.5,54.5 parent: 1 - - uid: 23139 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 144.5,55.5 - parent: 1 - - uid: 23140 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 143.5,55.5 - parent: 1 - - uid: 23141 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 142.5,55.5 - parent: 1 - uid: 23355 components: - type: Transform @@ -101311,6 +101341,12 @@ entities: rot: 1.5707963267948966 rad pos: 49.5,92.5 parent: 1 + - uid: 20450 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 52.5,82.5 + parent: 1 - uid: 20476 components: - type: Transform @@ -101659,6 +101695,12 @@ entities: rot: 3.141592653589793 rad pos: 117.5,51.5 parent: 1 + - uid: 37730 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 66.5,82.5 + parent: 1 - proto: ChairPilotSeat entities: - uid: 29520 @@ -102023,6 +102065,11 @@ entities: - type: Transform pos: 167.68417,134.58716 parent: 1 + - uid: 37736 + components: + - type: Transform + pos: 122.56481,63.605835 + parent: 1 - proto: CheapRollerBed entities: - uid: 28659 @@ -102342,6 +102389,11 @@ entities: - type: Transform pos: 26.243996,99.750244 parent: 1 + - uid: 23131 + components: + - type: Transform + pos: 122.64815,63.40792 + parent: 1 - uid: 23777 components: - type: Transform @@ -103066,11 +103118,6 @@ entities: - type: Transform pos: 38.5,82.5 parent: 1 - - uid: 10318 - components: - - type: Transform - pos: 49.5,80.5 - parent: 1 - uid: 20853 components: - type: Transform @@ -103081,11 +103128,6 @@ entities: - type: Transform pos: 30.5,103.5 parent: 1 - - uid: 20969 - components: - - type: Transform - pos: 50.5,80.5 - parent: 1 - proto: ClosetL3SecurityFilled entities: - uid: 22689 @@ -103620,11 +103662,16 @@ entities: - type: Transform pos: 39.5,82.5 parent: 1 - - uid: 4199 + - uid: 13672 components: - type: Transform pos: 91.5,121.5 parent: 1 + - uid: 13711 + components: + - type: Transform + pos: 92.5,121.5 + parent: 1 - uid: 14255 components: - type: Transform @@ -103650,11 +103697,6 @@ entities: - type: Transform pos: 112.5,147.5 parent: 1 - - uid: 16592 - components: - - type: Transform - pos: 92.5,121.5 - parent: 1 - uid: 18909 components: - type: Transform @@ -104582,12 +104624,6 @@ entities: rot: 3.141592653589793 rad pos: 131.5,144.5 parent: 1 - - uid: 28127 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 96.5,121.5 - parent: 1 - uid: 32984 components: - type: Transform @@ -104779,6 +104815,45 @@ entities: rot: -1.5707963267948966 rad pos: 158.5,104.5 parent: 1 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 16162 + components: + - type: Transform + pos: 100.5,125.5 + parent: 1 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 26639 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 65.5,82.5 + parent: 1 +- proto: ComputerCargoOrdersScience + entities: + - uid: 26641 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 53.5,82.5 + parent: 1 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 23846 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 142.5,52.5 + parent: 1 +- proto: ComputerCargoOrdersService + entities: + - uid: 22728 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 111.5,96.5 + parent: 1 - proto: ComputerComms entities: - uid: 9635 @@ -104861,18 +104936,18 @@ entities: rot: -1.5707963267948966 rad pos: 144.5,73.5 parent: 1 - - uid: 22871 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 142.5,54.5 - parent: 1 - uid: 22872 components: - type: Transform rot: 3.141592653589793 rad pos: 128.5,68.5 parent: 1 + - uid: 26655 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 141.5,51.5 + parent: 1 - uid: 37452 components: - type: Transform @@ -104897,6 +104972,13 @@ entities: rot: -1.5707963267948966 rad pos: 90.5,86.5 parent: 1 +- proto: ComputerFundingAllocation + entities: + - uid: 22731 + components: + - type: Transform + pos: 58.5,57.5 + parent: 1 - proto: ComputerId entities: - uid: 9629 @@ -104980,17 +105062,18 @@ entities: - type: Transform pos: 116.5,125.5 parent: 1 - - uid: 16162 - components: - - type: Transform - pos: 99.5,125.5 - parent: 1 - uid: 16165 components: - type: Transform rot: 3.141592653589793 rad pos: 111.5,147.5 parent: 1 + - uid: 20437 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 96.5,121.5 + parent: 1 - uid: 31757 components: - type: Transform @@ -105134,11 +105217,6 @@ entities: rot: 3.141592653589793 rad pos: 129.5,131.5 parent: 1 - - uid: 16163 - components: - - type: Transform - pos: 100.5,125.5 - parent: 1 - uid: 31154 components: - type: Transform @@ -105730,16 +105808,16 @@ entities: parent: 1 - proto: CrateArtifactContainer entities: - - uid: 10760 - components: - - type: Transform - pos: 51.5,81.5 - parent: 1 - uid: 20490 components: - type: Transform pos: 48.5,82.5 parent: 1 + - uid: 23141 + components: + - type: Transform + pos: 50.5,81.5 + parent: 1 - proto: CrateCoffin entities: - uid: 27063 @@ -105875,6 +105953,41 @@ entities: - type: Transform pos: 155.5,93.5 parent: 1 +- proto: CrateLockBoxEngineering + entities: + - uid: 16592 + components: + - type: Transform + pos: 99.5,125.5 + parent: 1 +- proto: CrateLockBoxMedical + entities: + - uid: 37731 + components: + - type: Transform + pos: 89.5,85.5 + parent: 1 +- proto: CrateLockBoxScience + entities: + - uid: 20440 + components: + - type: Transform + pos: 50.5,82.5 + parent: 1 +- proto: CrateLockBoxSecurity + entities: + - uid: 37732 + components: + - type: Transform + pos: 152.5,55.5 + parent: 1 +- proto: CrateLockBoxService + entities: + - uid: 32257 + components: + - type: Transform + pos: 110.5,90.5 + parent: 1 - proto: CrateMedicalSurgery entities: - uid: 36639 @@ -119823,7 +119936,7 @@ entities: desc: It's just some soda water... you think that it is, at least. name: dr. breen's private reserve - type: Transform - pos: 122.5,63.5 + pos: 122.418976,63.53292 parent: 1 - proto: DrinkSyndicatebomb entities: @@ -121721,11 +121834,6 @@ entities: - type: Transform pos: 140.5,106.5 parent: 1 - - uid: 10317 - components: - - type: Transform - pos: 53.5,80.5 - parent: 1 - uid: 13616 components: - type: Transform @@ -187914,6 +188022,11 @@ entities: - type: Physics canCollide: True - type: ActionsContainer + - uid: 20969 + components: + - type: Transform + pos: 53.5,81.5 + parent: 1 - uid: 23071 components: - type: Transform @@ -188938,11 +189051,6 @@ entities: rot: -1.5707963267948966 rad pos: 46.5,110.5 parent: 1 - - uid: 20456 - components: - - type: Transform - pos: 53.5,81.5 - parent: 1 - uid: 28152 components: - type: Transform @@ -189533,15 +189641,14 @@ entities: - uid: 13656 components: - type: Transform - rot: -25.132741228718352 rad - pos: 58.557903,57.64333 + pos: 56.412624,52.536133 parent: 1 - proto: MaterialDurathread entities: - uid: 13655 components: - type: Transform - pos: 56.09103,52.62849 + pos: 60.620956,57.067383 parent: 1 - proto: MatterBinStockPart entities: @@ -190493,6 +190600,12 @@ entities: parent: 1 - proto: PaperBin10 entities: + - uid: 10318 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 52.5,80.5 + parent: 1 - uid: 19387 components: - type: Transform @@ -190739,11 +190852,6 @@ entities: parent: 1 - proto: Pen entities: - - uid: 13711 - components: - - type: Transform - pos: 56.62228,52.62849 - parent: 1 - uid: 13721 components: - type: Transform @@ -191823,6 +191931,12 @@ entities: - type: Transform pos: 148.5,47.5 parent: 1 + - uid: 37737 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 135.5,112.5 + parent: 1 - proto: PosterLegitWorkForAFuture entities: - uid: 13682 @@ -192146,13 +192260,6 @@ entities: - type: Transform pos: 145.5,106.5 parent: 1 -- proto: PottedPlant23 - entities: - - uid: 26655 - components: - - type: Transform - pos: 111.5,96.5 - parent: 1 - proto: PottedPlant24 entities: - uid: 2633 @@ -192644,12 +192751,6 @@ entities: rot: 3.141592653589793 rad pos: 106.5,66.5 parent: 1 - - uid: 2489 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 99.5,75.5 - parent: 1 - uid: 2721 components: - type: Transform @@ -192692,12 +192793,6 @@ entities: rot: -1.5707963267948966 rad pos: 49.5,88.5 parent: 1 - - uid: 4342 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 113.5,75.5 - parent: 1 - uid: 4401 components: - type: Transform @@ -193749,6 +193844,11 @@ entities: - type: Transform pos: 98.5,88.5 parent: 1 + - uid: 22871 + components: + - type: Transform + pos: 106.5,99.5 + parent: 1 - uid: 22880 components: - type: Transform @@ -193925,6 +194025,18 @@ entities: rot: -1.5707963267948966 rad pos: 149.5,69.5 parent: 1 + - uid: 23139 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 99.5,73.5 + parent: 1 + - uid: 23140 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 113.5,73.5 + parent: 1 - uid: 23143 components: - type: Transform @@ -193948,12 +194060,6 @@ entities: rot: -1.5707963267948966 rad pos: 150.5,51.5 parent: 1 - - uid: 23846 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 108.5,96.5 - parent: 1 - uid: 24697 components: - type: Transform @@ -194018,12 +194124,6 @@ entities: rot: 1.5707963267948966 rad pos: 63.5,53.5 parent: 1 - - uid: 26473 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 103.5,102.5 - parent: 1 - uid: 26474 components: - type: Transform @@ -194081,18 +194181,6 @@ entities: rot: -1.5707963267948966 rad pos: 114.5,79.5 parent: 1 - - uid: 26500 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 98.5,84.5 - parent: 1 - - uid: 26501 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 114.5,84.5 - parent: 1 - uid: 26505 components: - type: Transform @@ -194760,6 +194848,18 @@ entities: rot: 1.5707963267948966 rad pos: 82.5,57.5 parent: 1 + - uid: 37734 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 104.5,102.5 + parent: 1 + - uid: 37735 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 112.5,96.5 + parent: 1 - proto: PoweredlightGreen entities: - uid: 18066 @@ -195835,6 +195935,12 @@ entities: - type: Transform pos: 135.5,48.5 parent: 1 + - uid: 23142 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 142.5,51.5 + parent: 1 - uid: 23144 components: - type: Transform @@ -196623,10 +196729,10 @@ entities: - type: Transform pos: 47.5,81.5 parent: 1 - - uid: 20440 + - uid: 22730 components: - type: Transform - pos: 51.5,82.5 + pos: 51.5,83.5 parent: 1 - proto: RandomBoard entities: @@ -209212,8 +209318,7 @@ entities: - uid: 23130 components: - type: Transform - rot: -18.84955592153876 rad - pos: 142.42798,52.68017 + pos: 142.42955,54.096626 parent: 1 - proto: SubstationBasic entities: @@ -212203,6 +212308,12 @@ entities: - type: Transform pos: 144.5,93.5 parent: 1 + - uid: 10760 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 53.5,81.5 + parent: 1 - uid: 11105 components: - type: Transform @@ -212256,6 +212367,12 @@ entities: - type: Transform pos: 118.5,125.5 parent: 1 + - uid: 16163 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 142.5,54.5 + parent: 1 - uid: 16199 components: - type: Transform @@ -212362,6 +212479,12 @@ entities: - type: Transform pos: 27.5,99.5 parent: 1 + - uid: 20456 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 53.5,80.5 + parent: 1 - uid: 20461 components: - type: Transform @@ -212491,18 +212614,6 @@ entities: rot: -1.5707963267948966 rad pos: 123.5,56.5 parent: 1 - - uid: 22730 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 142.5,51.5 - parent: 1 - - uid: 22731 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 142.5,52.5 - parent: 1 - uid: 22732 components: - type: Transform @@ -212645,6 +212756,24 @@ entities: rot: 1.5707963267948966 rad pos: 101.5,92.5 parent: 1 + - uid: 26473 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 113.5,96.5 + parent: 1 + - uid: 26500 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 112.5,104.5 + parent: 1 + - uid: 26501 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 110.5,99.5 + parent: 1 - uid: 26526 components: - type: Transform @@ -212654,32 +212783,19 @@ entities: - uid: 26575 components: - type: Transform - pos: 113.5,96.5 + rot: 3.141592653589793 rad + pos: 112.5,96.5 parent: 1 - uid: 26576 components: - type: Transform - pos: 112.5,96.5 + rot: 3.141592653589793 rad + pos: 111.5,99.5 parent: 1 - uid: 26590 components: - type: Transform rot: 3.141592653589793 rad - pos: 112.5,104.5 - parent: 1 - - uid: 26639 - components: - - type: Transform - pos: 111.5,99.5 - parent: 1 - - uid: 26640 - components: - - type: Transform - pos: 110.5,99.5 - parent: 1 - - uid: 26641 - components: - - type: Transform pos: 107.5,99.5 parent: 1 - uid: 26683 @@ -212733,6 +212849,12 @@ entities: rot: -1.5707963267948966 rad pos: 63.5,82.5 parent: 1 + - uid: 28127 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 52.5,80.5 + parent: 1 - uid: 28284 components: - type: Transform @@ -212867,11 +212989,6 @@ entities: - type: Transform pos: 143.5,133.5 parent: 1 - - uid: 32257 - components: - - type: Transform - pos: 65.5,82.5 - parent: 1 - uid: 33282 components: - type: Transform @@ -214782,12 +214899,6 @@ entities: rot: 3.141592653589793 rad pos: 60.5,57.5 parent: 1 - - uid: 13672 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 58.5,57.5 - parent: 1 - uid: 13673 components: - type: Transform @@ -216367,11 +216478,6 @@ entities: - type: Transform pos: 32.5,109.5 parent: 1 - - uid: 20437 - components: - - type: Transform - pos: 53.5,82.5 - parent: 1 - uid: 23486 components: - type: Transform @@ -216529,16 +216635,16 @@ entities: - type: Transform pos: 46.5,48.5 parent: 1 + - uid: 4342 + components: + - type: Transform + pos: 149.5,55.5 + parent: 1 - uid: 9663 components: - type: Transform pos: 79.5,82.5 parent: 1 - - uid: 23142 - components: - - type: Transform - pos: 142.5,58.5 - parent: 1 - uid: 23791 components: - type: Transform @@ -216848,10 +216954,10 @@ entities: parent: 1 - proto: VendingMachineVendomat entities: - - uid: 20450 + - uid: 26640 components: - type: Transform - pos: 47.5,80.5 + pos: 46.5,81.5 parent: 1 - uid: 33894 components: @@ -239116,12 +239222,6 @@ entities: rot: -1.5707963267948966 rad pos: 122.5,56.5 parent: 1 - - uid: 22728 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 142.5,51.5 - parent: 1 - uid: 22737 components: - type: Transform @@ -239160,6 +239260,12 @@ entities: - type: Transform pos: 131.5,61.5 parent: 1 + - uid: 37733 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 142.5,54.5 + parent: 1 - proto: WeaponDisabler entities: - uid: 22693 From f611b6ea5ea875a6e760c6e8032d84fa3283649e Mon Sep 17 00:00:00 2001 From: TheProNoob678 <147959703+TheProNoob678@users.noreply.github.com> Date: Mon, 14 Apr 2025 23:15:49 -0500 Subject: [PATCH 141/622] Inhand sprites for figurines (#36017) * figurine sprite update * Updated meta.json to credit inhand sprites * Update meta.json to credit inhand sprites * Updated meta.json because crlf check * potentially fixing CRLF issues in meta.json + consistent spacing * Fix CRLF, maybe? * properly credited myself for all my amazing work in the community * Reformat meta.json as per the newly merged "fix as you go" procedure. --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Objects/Fun/figurines.rsi/inhand-left.png | Bin 0 -> 504 bytes .../Fun/figurines.rsi/inhand-right.png | Bin 0 -> 532 bytes .../Objects/Fun/figurines.rsi/meta.json | 22 ++++++++++++------ 3 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 Resources/Textures/Objects/Fun/figurines.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Fun/figurines.rsi/inhand-right.png diff --git a/Resources/Textures/Objects/Fun/figurines.rsi/inhand-left.png b/Resources/Textures/Objects/Fun/figurines.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..06e99674fd96e1f0f7901cd3779a8fea59f36f87 GIT binary patch literal 504 zcmVPx$vPnciRCt{2*+FXCKp4gG|Fll56k;eO!A{x(Bv4i(0Y}l6b$Jx z3M~oPtDeHU93U7Zs0AVgebYs2=u(Yl3?lEh9*yUFVvOK{h=_=Yh=_=UmZoE$reh!b zna6q-bMrJE`{R>7{lO8V(PgcHMx#sL9~^Of(q|hXL=6DI%*gW`^Hy)Y|GVDmt#7Im zbMqwGAZ>_&#Vr*yU+Q#E&Jn>#q{HcC?Nz3;Pa2AySvXh&6hZ< zD2fuG@u7>N#975@zHENTZMZr=^PB4s%4{<9SLbJ2`7Q_|WC*PrUPMGhL_|bHL_{Q{ z(9Lo5ax|nE&2g&&h|wIkDu5WxakSPome9>{>jK!gc>CV>_Fr&tc*vLQ>qpPgsw?oX uP|a~`1ArDb$1yzV^7Kg$FCro$($sIl^3s@cnT7iR0000Z7%pIIgRgW75qcAX2S)HO_+n)-u2IC3$vF9|i@+f;7X z5I9jmOpr4}ZFW_%_SEdtXN7C_KXvYyc~LsouAu`07!H)$md5(q@9NW<@^#bZiVJVQ zZMkZ9>}4c(seIGxs;a7MPOEEs^0tTHIDLu1h1GMCgUhz~hxH1dmdoqDTfVVk!KxFV zWeQ~u7nW_0dthdHPVbRLTZhBeA4anm9iDyLnw5vo?)~GZrtBgHY!wwh0)Oo3ty;JI z>|XzhS*Z*ni60^&eqZ8ZaFDQ>Wgsy#a@N62vx2&dZJYPAGe~^1zV=`IU2Xi_H0I4F z&JsOms?RdN=SlE$QB>+!%;Db74pd<^Q|)SajN<>-;=PMGl$a)d%Kv(uk-=eBn!%*U zMv}=!z90TRzwyd+htDyCNy@&PU&UFyDK9CgP5pb7z2V^3sbRa8m1fng`=lr!2m`vS zvKPh7;$D+9RpeUOR2~Km|HRy_Q~1^=gZR??3!YbLDJ|7pv(`-Nz~1+--)kJY{6;d- zU{&bj;_Uy-|4duAUcJS9!;9-TH9S@rbldY0e_B_*XrQq{~e@80fe T-f>kC7|jfxu6{1-oD!M<+S}(F literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/figurines.rsi/meta.json b/Resources/Textures/Objects/Fun/figurines.rsi/meta.json index ebbb50e796..31208a764a 100644 --- a/Resources/Textures/Objects/Fun/figurines.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/figurines.rsi/meta.json @@ -1,12 +1,20 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Sprites made by Flareguy for Space Station 14. Griffinprize, skeletonprize, thiefcharacter and owlprize taken from /tg/station at commit https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. Figurine_spawner sprite made using parts found in spawner_icons.dmi from Paradise Station at commit https://github.com/ParadiseSS13/Paradise/commit/813f0a3ae556d86dddd7c4ef93a52880de8d2e37. Head sprites excluding Captain, Medical exluding doctor, non-human excluding queen and slime, and service jobs excluding librarian done by tacobeller and holoclown done by brainfood1183.", - "size": { - "x": 32, - "y": 32 - }, + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites made by Flareguy for Space Station 14. Griffinprize, skeletonprize, thiefcharacter and owlprize taken from /tg/station at commit https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. Figurine_spawner sprite made using parts found in spawner_icons.dmi from Paradise Station at commit https://github.com/ParadiseSS13/Paradise/commit/813f0a3ae556d86dddd7c4ef93a52880de8d2e37. Head sprites excluding Captain, Medical exluding doctor, non-human excluding queen and slime, and service jobs excluding librarian done by tacobeller and holoclown done by brainfood1183. inhand-left and inhand-right sprites made by the_pro_noob678 for SS14.", + "size": { + "x": 32, + "y": 32 + }, "states": [ + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, { "name": "ce" }, From 7f7564595958cbd2f8ef9e721655444a2e495f34 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Tue, 15 Apr 2025 07:13:41 +0200 Subject: [PATCH 142/622] Bagel Dept Economy (#36556) * init * lockboxes --- Resources/Maps/bagel.yml | 163 +++++++++++++++++++++++++++++---------- 1 file changed, 122 insertions(+), 41 deletions(-) diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index 2ac538e80f..88d2565dd2 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 250.0.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 03/27/2025 06:48:27 - entityCount: 25710 + time: 04/14/2025 14:08:28 + entityCount: 25721 maps: - 943 grids: @@ -64048,6 +64048,44 @@ entities: - type: Transform pos: 43.5,10.5 parent: 60 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 1921 + components: + - type: Transform + pos: -1.5,21.5 + parent: 60 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 22116 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 47.5,-10.5 + parent: 60 +- proto: ComputerCargoOrdersScience + entities: + - uid: 7070 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -45.5,-9.5 + parent: 60 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 9618 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -28.5,-6.5 + parent: 60 +- proto: ComputerCargoOrdersService + entities: + - uid: 9591 + components: + - type: Transform + pos: 21.5,-26.5 + parent: 60 - proto: ComputerCargoShuttle entities: - uid: 21024 @@ -64165,6 +64203,14 @@ entities: rot: 1.5707963267948966 rad pos: -64.5,46.5 parent: 60 +- proto: ComputerFundingAllocation + entities: + - uid: 278 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,-30.5 + parent: 60 - proto: ComputerId entities: - uid: 1378 @@ -65324,6 +65370,46 @@ entities: - type: Transform pos: 33.5,-37.5 parent: 60 +- proto: CrateLockBoxEngineering + entities: + - uid: 22134 + components: + - type: Transform + pos: 4.5,17.5 + parent: 60 +- proto: CrateLockBoxMedical + entities: + - uid: 22133 + components: + - type: Transform + pos: 49.5,-20.5 + parent: 60 +- proto: CrateLockBoxScience + entities: + - uid: 22135 + components: + - type: Transform + pos: -49.5,-4.5 + parent: 60 +- proto: CrateLockBoxSecurity + entities: + - uid: 22136 + components: + - type: Transform + pos: -31.5,-16.5 + parent: 60 +- proto: CrateLockBoxService + entities: + - uid: 22137 + components: + - type: Transform + pos: 13.5,-39.5 + parent: 60 + - uid: 22138 + components: + - type: Transform + pos: 34.5,-41.5 + parent: 60 - proto: CrateMaterialSteel entities: - uid: 16243 @@ -72377,16 +72463,16 @@ entities: - type: Transform pos: -49.5,-15.5 parent: 60 - - uid: 4359 - components: - - type: Transform - pos: 3.5,-30.5 - parent: 60 - uid: 5297 components: - type: Transform pos: -22.5,-29.5 parent: 60 + - uid: 10369 + components: + - type: Transform + pos: 3.5,-28.5 + parent: 60 - proto: filingCabinetTallRandom entities: - uid: 134 @@ -115496,7 +115582,7 @@ entities: - uid: 9425 components: - type: Transform - pos: -45.496006,-9.58335 + pos: -45.038364,-10.503761 parent: 60 - uid: 9474 components: @@ -115506,7 +115592,7 @@ entities: - uid: 13014 components: - type: Transform - pos: -45.404285,-9.838601 + pos: -44.96024,-10.316261 parent: 60 - uid: 19181 components: @@ -118528,11 +118614,6 @@ entities: showEnts: False occludes: True ent: 4540 - - uid: 9618 - components: - - type: Transform - pos: -1.5,21.5 - parent: 60 - proto: PottedPlant4 entities: - uid: 15519 @@ -118834,6 +118915,11 @@ entities: - type: Transform pos: 38.5,11.5 parent: 60 + - uid: 22117 + components: + - type: Transform + pos: -1.5,17.5 + parent: 60 - proto: PottedPlantRD entities: - uid: 5770 @@ -135805,12 +135891,6 @@ entities: parent: 60 - proto: StoolBar entities: - - uid: 1921 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 21.5,-27.5 - parent: 60 - uid: 1922 components: - type: Transform @@ -135915,6 +135995,11 @@ entities: - type: Transform pos: 35.5,18.5 parent: 60 + - uid: 22120 + components: + - type: Transform + pos: 18.5,-27.5 + parent: 60 - uid: 23459 components: - type: Transform @@ -138755,6 +138840,12 @@ entities: - type: Transform pos: 53.5,-36.5 parent: 60 + - uid: 4359 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 49.5,-13.5 + parent: 60 - uid: 4577 components: - type: Transform @@ -138875,11 +138966,6 @@ entities: - type: Transform pos: -45.5,-4.5 parent: 60 - - uid: 7070 - components: - - type: Transform - pos: 49.5,-13.5 - parent: 60 - uid: 7079 components: - type: Transform @@ -139060,11 +139146,6 @@ entities: - type: Transform pos: -49.5,-7.5 parent: 60 - - uid: 9591 - components: - - type: Transform - pos: -45.5,-9.5 - parent: 60 - uid: 9595 components: - type: Transform @@ -139090,11 +139171,6 @@ entities: - type: Transform pos: -18.5,32.5 parent: 60 - - uid: 10369 - components: - - type: Transform - pos: 21.5,-26.5 - parent: 60 - uid: 10620 components: - type: Transform @@ -139580,6 +139656,11 @@ entities: - type: Transform pos: 13.5,-26.5 parent: 60 + - uid: 22119 + components: + - type: Transform + pos: 18.5,-26.5 + parent: 60 - uid: 23424 components: - type: Transform @@ -157264,11 +157345,6 @@ entities: parent: 60 - proto: WaterCooler entities: - - uid: 278 - components: - - type: Transform - pos: -28.5,-6.5 - parent: 60 - uid: 1382 components: - type: Transform @@ -157314,6 +157390,11 @@ entities: - type: Transform pos: -36.5,21.5 parent: 60 + - uid: 22118 + components: + - type: Transform + pos: -28.5,-3.5 + parent: 60 - proto: WaterTankFull entities: - uid: 2329 From 1d7ad04905b1c3f8cf1f049a80d32ad5f9ec2517 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Tue, 15 Apr 2025 07:14:26 +0200 Subject: [PATCH 143/622] Omega Dept Economy (#36559) init --- Resources/Maps/omega.yml | 199 ++++++++++++++++++++++++++------------- 1 file changed, 132 insertions(+), 67 deletions(-) diff --git a/Resources/Maps/omega.yml b/Resources/Maps/omega.yml index db2f9709bc..ec6ecaac6a 100644 --- a/Resources/Maps/omega.yml +++ b/Resources/Maps/omega.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 247.2.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 03/07/2025 18:56:09 - entityCount: 13931 + time: 04/14/2025 14:30:33 + entityCount: 13940 maps: - 473 grids: @@ -4865,6 +4865,17 @@ entities: - type: Transform pos: -49.383278,-8.450993 parent: 4812 +- proto: ActionStethoscope + entities: + - uid: 917 + mapInit: true + paused: true + components: + - type: Transform + parent: 7580 + - type: EntityTargetAction + originalIconColor: '#FFFFFFFF' + container: 7580 - proto: ActionToggleBlock entities: - uid: 12052 @@ -33527,8 +33538,16 @@ entities: - uid: 7580 components: - type: Transform - pos: -18.561977,-20.380136 + pos: -18.519077,-23.380693 parent: 4812 + - type: Stethoscope + actionEntity: 917 + - type: ActionsContainer + - type: ContainerContainer + containers: + actions: !type:Container + ents: + - 917 - proto: ClothingNeckTieRed entities: - uid: 10922 @@ -34174,6 +34193,44 @@ entities: rot: 3.141592653589793 rad pos: 16.5,29.5 parent: 4812 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 13932 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -38.5,-5.5 + parent: 4812 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 13157 + components: + - type: Transform + pos: -15.5,-15.5 + parent: 4812 +- proto: ComputerCargoOrdersScience + entities: + - uid: 13936 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 29.5,-27.5 + parent: 4812 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 10759 + components: + - type: Transform + pos: -38.5,12.5 + parent: 4812 +- proto: ComputerCargoOrdersService + entities: + - uid: 13337 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,9.5 + parent: 4812 - proto: ComputerCargoShuttle entities: - uid: 2760 @@ -34287,6 +34344,13 @@ entities: rot: 3.141592653589793 rad pos: 9.5,-44.5 parent: 4812 +- proto: ComputerFundingAllocation + entities: + - uid: 2514 + components: + - type: Transform + pos: 7.5,26.5 + parent: 4812 - proto: ComputerId entities: - uid: 2504 @@ -34888,6 +34952,46 @@ entities: - type: Transform pos: -19.5,-28.5 parent: 4812 +- proto: CrateLockBoxEngineering + entities: + - uid: 9118 + components: + - type: Transform + pos: -35.5,-11.5 + parent: 4812 +- proto: CrateLockBoxMedical + entities: + - uid: 6250 + components: + - type: Transform + pos: -16.5,-28.5 + parent: 4812 +- proto: CrateLockBoxScience + entities: + - uid: 2511 + components: + - type: Transform + pos: 12.5,-23.5 + parent: 4812 +- proto: CrateLockBoxSecurity + entities: + - uid: 13937 + components: + - type: Transform + pos: -31.5,23.5 + parent: 4812 +- proto: CrateLockBoxService + entities: + - uid: 13938 + components: + - type: Transform + pos: -15.5,5.5 + parent: 4812 + - uid: 13939 + components: + - type: Transform + pos: 1.5,13.5 + parent: 4812 - proto: CrateMedicalSurgery entities: - uid: 4926 @@ -34936,29 +35040,6 @@ entities: - 0 - proto: CrateScienceSecure entities: - - uid: 6250 - components: - - type: Transform - pos: 12.5,-23.5 - parent: 4812 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 1.6033952 - - 6.031821 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - uid: 6251 components: - type: Transform @@ -38430,11 +38511,6 @@ entities: parent: 4812 - proto: DogBed entities: - - uid: 2511 - components: - - type: Transform - pos: 5.5,26.5 - parent: 4812 - uid: 2610 components: - type: MetaData @@ -38459,6 +38535,11 @@ entities: - type: Transform pos: -36.5,14.5 parent: 4812 + - uid: 13933 + components: + - type: Transform + pos: 7.5,25.5 + parent: 4812 - proto: DonkpocketBoxSpawner entities: - uid: 1571 @@ -38718,7 +38799,7 @@ entities: - uid: 8435 components: - type: Transform - pos: -38.614426,12.463839 + pos: -37.616684,10.457129 parent: 4812 - uid: 10760 components: @@ -38742,7 +38823,7 @@ entities: - uid: 8434 components: - type: Transform - pos: -38.3488,12.713839 + pos: -37.31981,10.691504 parent: 4812 - proto: DrinkRootBeerGlass entities: @@ -39298,10 +39379,10 @@ entities: parent: 4812 - proto: filingCabinetDrawer entities: - - uid: 2514 + - uid: 2512 components: - type: Transform - pos: 7.5,26.5 + pos: 5.5,26.5 parent: 4812 - proto: filingCabinetTall entities: @@ -65387,12 +65468,6 @@ entities: parent: 4812 - type: Physics canCollide: False - - uid: 13157 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -15.5,-15.5 - parent: 4812 - uid: 13162 components: - type: Transform @@ -65404,6 +65479,12 @@ entities: - type: Transform pos: -43.5,-18.5 parent: 4812 + - uid: 13935 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,-20.5 + parent: 4812 - proto: PowerDrill entities: - uid: 6309 @@ -73695,9 +73776,10 @@ entities: parent: 4812 - proto: SolidSecretDoor entities: - - uid: 13337 + - uid: 8425 components: - type: Transform + rot: 1.5707963267948966 rad pos: -41.5,-17.5 parent: 4812 - proto: SpaceHeater @@ -73742,10 +73824,10 @@ entities: parent: 4812 - proto: SpawnMobCorgi entities: - - uid: 2512 + - uid: 13934 components: - type: Transform - pos: 5.5,26.5 + pos: 7.5,25.5 parent: 4812 - proto: SpawnMobCow entities: @@ -76281,11 +76363,6 @@ entities: - type: Transform pos: -27.5,26.5 parent: 4812 - - uid: 8425 - components: - - type: Transform - pos: -38.5,12.5 - parent: 4812 - uid: 8426 components: - type: Transform @@ -76571,11 +76648,6 @@ entities: - type: Transform pos: -40.5,-34.5 parent: 4812 - - uid: 9118 - components: - - type: Transform - pos: -15.5,-15.5 - parent: 4812 - uid: 10659 components: - type: Transform @@ -78301,13 +78373,6 @@ entities: parent: 4812 - proto: VendingMachineCigs entities: - - uid: 917 - components: - - type: MetaData - name: cigarette machine - - type: Transform - pos: -6.5,9.5 - parent: 4812 - uid: 2672 components: - type: MetaData @@ -78353,6 +78418,11 @@ entities: - type: Transform pos: -27.5,8.5 parent: 4812 + - uid: 13940 + components: + - type: Transform + pos: -5.5,10.5 + parent: 4812 - proto: VendingMachineClothing entities: - uid: 10850 @@ -87474,11 +87544,6 @@ entities: - type: Transform pos: -39.5,10.5 parent: 4812 - - uid: 10759 - components: - - type: Transform - pos: -38.5,-5.5 - parent: 4812 - uid: 13496 components: - type: Transform From 16617f0ec651a145c09858d72cb3c1ace05a632d Mon Sep 17 00:00:00 2001 From: Kirby <205904127+154942@users.noreply.github.com> Date: Tue, 15 Apr 2025 07:55:29 -0400 Subject: [PATCH 144/622] AgriChem kit "handing" typo fix (#36588) Handing typo fix --- Resources/Locale/en-US/paper/paper-misc.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/paper/paper-misc.ftl b/Resources/Locale/en-US/paper/paper-misc.ftl index 8d552d099e..ab87e13b12 100644 --- a/Resources/Locale/en-US/paper/paper-misc.ftl +++ b/Resources/Locale/en-US/paper/paper-misc.ftl @@ -51,7 +51,7 @@ book-text-agrichemkit-manual = Thank you for choosing the safe-for-all-ages Nano Each individual plant responds to unstable mutagen differently, so you may want to use small doses on multiple crops and try to crossbreed the best traits from each of those. Applying multiple doses to one plant can stack multiple changes and make it harder to single out desirable traits. Unstable mutagen is entirely safe when used as a fertilizer, and NanoTrasen takes no responsibility for dead crops, excessive water bills, newly sentient plants asking existential questions, or flora-strangled farmhands that may coincidentally occur while using it. - Do not drink unstable mutagen. Wash your hands thoroughly after handing. Wash your eyes if you have looked at unstable mutagen for over 30 minutes in a 24 hour period. Store in a dark room between 293–295K. Do not use on corporate holidays. If you begin hearing voices telling you to drink unstable mutagen, please contact your doctor, head of personnel, or exorcist. + Do not drink unstable mutagen. Wash your hands thoroughly after handling. Wash your eyes if you have looked at unstable mutagen for over 30 minutes in a 24 hour period. Store in a dark room between 293–295K. Do not use on corporate holidays. If you begin hearing voices telling you to drink unstable mutagen, please contact your doctor, head of personnel, or exorcist. book-text-combat-bakery-kit = Thank you for choosing our combat bakery kit! Enclosed are two (2) CyberSun patented Throwing Croissants, and one (1) patent-pending Baguette Sword. From c0adeee9e2ec092852b2200ae405d31c138a7c40 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:03:59 +0200 Subject: [PATCH 145/622] Marathon Dept Economy (#36592) init --- Resources/Maps/marathon.yml | 173 ++++++++++++++++++++++++------------ 1 file changed, 116 insertions(+), 57 deletions(-) diff --git a/Resources/Maps/marathon.yml b/Resources/Maps/marathon.yml index 2f11c20cef..e30090a807 100644 --- a/Resources/Maps/marathon.yml +++ b/Resources/Maps/marathon.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 247.2.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 03/07/2025 19:59:53 - entityCount: 23196 + time: 04/15/2025 13:49:33 + entityCount: 23203 maps: - 5350 grids: @@ -11558,7 +11558,7 @@ entities: pos: 34.5,45.5 parent: 30 - type: Door - secondsUntilStateChange: -9541.195 + secondsUntilStateChange: -10031.035 state: Opening - type: DeviceLinkSource lastSignals: @@ -15557,11 +15557,6 @@ entities: - type: Transform pos: -33.499332,49.57459 parent: 30 - - uid: 2187 - components: - - type: Transform - pos: -30.483707,51.590214 - parent: 30 - uid: 5840 components: - type: Transform @@ -38730,7 +38725,7 @@ entities: - uid: 10203 components: - type: Transform - pos: -24.57955,-44.498714 + pos: -21.548817,-40.18438 parent: 30 - uid: 10314 components: @@ -44399,7 +44394,7 @@ entities: - uid: 10202 components: - type: Transform - pos: -24.846876,-44.33535 + pos: -21.470692,-40.52813 parent: 30 - uid: 10260 components: @@ -54391,6 +54386,44 @@ entities: - type: Transform pos: 16.5,2.5 parent: 30 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 21714 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -24.5,-44.5 + parent: 30 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 2187 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,-20.5 + parent: 30 +- proto: ComputerCargoOrdersScience + entities: + - uid: 21715 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,13.5 + parent: 30 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 21719 + components: + - type: Transform + pos: -30.5,51.5 + parent: 30 +- proto: ComputerCargoOrdersService + entities: + - uid: 2177 + components: + - type: Transform + pos: -6.5,11.5 + parent: 30 - proto: ComputerCargoShuttle entities: - uid: 11718 @@ -54514,6 +54547,13 @@ entities: - type: Transform pos: -17.5,-0.5 parent: 30 +- proto: ComputerFundingAllocation + entities: + - uid: 5238 + components: + - type: Transform + pos: 2.5,34.5 + parent: 30 - proto: ComputerId entities: - uid: 5032 @@ -54552,12 +54592,6 @@ entities: - type: Transform pos: -34.5,-15.5 parent: 30 - - uid: 7574 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -12.5,-20.5 - parent: 30 - proto: ComputerPowerMonitoring entities: - uid: 5800 @@ -55342,6 +55376,46 @@ entities: - 0 - 0 - 0 +- proto: CrateLockBoxEngineering + entities: + - uid: 21679 + components: + - type: Transform + pos: 1.5,-41.5 + parent: 30 +- proto: CrateLockBoxMedical + entities: + - uid: 23202 + components: + - type: Transform + pos: -18.5,-21.5 + parent: 30 +- proto: CrateLockBoxScience + entities: + - uid: 23201 + components: + - type: Transform + pos: 24.5,18.5 + parent: 30 +- proto: CrateLockBoxSecurity + entities: + - uid: 23200 + components: + - type: Transform + pos: -30.5,46.5 + parent: 30 +- proto: CrateLockBoxService + entities: + - uid: 23198 + components: + - type: Transform + pos: -13.5,19.5 + parent: 30 + - uid: 23199 + components: + - type: Transform + pos: -23.5,19.5 + parent: 30 - proto: CrateMedicalScrubs entities: - uid: 7019 @@ -63681,11 +63755,6 @@ entities: parent: 30 - proto: filingCabinetDrawerRandom entities: - - uid: 5726 - components: - - type: Transform - pos: 2.5,34.5 - parent: 30 - uid: 11017 components: - type: Transform @@ -63696,6 +63765,11 @@ entities: - type: Transform pos: -9.5,-36.5 parent: 30 + - uid: 23197 + components: + - type: Transform + pos: -12.5,31.5 + parent: 30 - proto: filingCabinetRandom entities: - uid: 8234 @@ -106451,6 +106525,11 @@ entities: - type: Transform pos: -8.522221,33.58804 parent: 30 + - uid: 5726 + components: + - type: Transform + pos: 18.04272,13.451241 + parent: 30 - uid: 6761 components: - type: Transform @@ -106466,6 +106545,16 @@ entities: - type: Transform pos: -13.41527,-5.1955566 parent: 30 + - uid: 7110 + components: + - type: Transform + pos: 18.04272,13.451241 + parent: 30 + - uid: 7574 + components: + - type: Transform + pos: 18.04272,13.451241 + parent: 30 - uid: 11629 components: - type: Transform @@ -106571,21 +106660,6 @@ entities: - type: Transform pos: -72.49536,-65.49479 parent: 30 - - uid: 21714 - components: - - type: Transform - pos: 23.549414,13.599922 - parent: 30 - - uid: 21715 - components: - - type: Transform - pos: 23.549414,13.599922 - parent: 30 - - uid: 21719 - components: - - type: Transform - pos: 23.549414,13.599922 - parent: 30 - proto: PaperBin5 entities: - uid: 9040 @@ -108153,11 +108227,6 @@ entities: - type: Transform pos: 0.5,-37.5 parent: 30 - - uid: 7110 - components: - - type: Transform - pos: 1.5,-41.5 - parent: 30 - uid: 8613 components: - type: Transform @@ -108372,6 +108441,11 @@ entities: - type: ContainerContainer containers: stash: !type:ContainerSlot {} + - uid: 23203 + components: + - type: Transform + pos: -1.5,-41.5 + parent: 30 - proto: PottedPlantRD entities: - uid: 12726 @@ -125885,11 +125959,6 @@ entities: - type: Transform pos: -13.5,-8.5 parent: 30 - - uid: 5238 - components: - - type: Transform - pos: -24.5,-44.5 - parent: 30 - uid: 5240 components: - type: Transform @@ -126646,11 +126715,6 @@ entities: - type: Transform pos: 46.5,36.5 parent: 30 - - uid: 21679 - components: - - type: Transform - pos: 23.5,13.5 - parent: 30 - uid: 21705 components: - type: Transform @@ -127667,11 +127731,6 @@ entities: - type: Transform pos: -31.5,51.5 parent: 30 - - uid: 2177 - components: - - type: Transform - pos: -30.5,51.5 - parent: 30 - uid: 3361 components: - type: Transform From c6c502d45dcba9c91b48a7ab14cdbe7b4bcaa973 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:05:20 +0200 Subject: [PATCH 146/622] Fland Dept Economy (#36589) init --- Resources/Maps/fland.yml | 163 ++++++++++++++++++++++++++------------- 1 file changed, 109 insertions(+), 54 deletions(-) diff --git a/Resources/Maps/fland.yml b/Resources/Maps/fland.yml index 43761ac5e3..b125e62ce6 100644 --- a/Resources/Maps/fland.yml +++ b/Resources/Maps/fland.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 250.0.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 03/29/2025 03:57:17 - entityCount: 36017 + time: 04/15/2025 11:43:28 + entityCount: 36027 maps: - 1 grids: @@ -19518,7 +19518,7 @@ entities: pos: -15.5,-4.5 parent: 13329 - type: Door - secondsUntilStateChange: -11435.99 + secondsUntilStateChange: -12067.695 state: Opening - type: DeviceLinkSource lastSignals: @@ -29756,13 +29756,6 @@ entities: parent: 13329 - type: SpamEmitSound enabled: False - - uid: 1292 - components: - - type: Transform - pos: -21.5,22.5 - parent: 13329 - - type: SpamEmitSound - enabled: False - uid: 10343 components: - type: Transform @@ -29770,6 +29763,12 @@ entities: parent: 13329 - type: SpamEmitSound enabled: False + - uid: 18804 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -10.5,17.5 + parent: 13329 - uid: 29164 components: - type: Transform @@ -90501,6 +90500,12 @@ entities: - type: Transform pos: 83.5,-41.5 parent: 13329 + - uid: 36021 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -21.5,21.5 + parent: 13329 - proto: ChairOfficeLight entities: - uid: 15343 @@ -94959,7 +94964,7 @@ entities: - uid: 18480 components: - type: Transform - pos: 75.48135,-11.298034 + pos: 75.596245,-9.047987 parent: 13329 - proto: ClothingEyesBlindfold entities: @@ -97341,11 +97346,43 @@ entities: - type: Transform pos: 82.5,57.5 parent: 13329 +- proto: ComputerCargoOrdersEngineering + entities: - uid: 31626 components: - type: Transform rot: 1.5707963267948966 rad - pos: 59.5,49.5 + pos: 75.5,-11.5 + parent: 13329 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 18823 + components: + - type: Transform + pos: 6.5,68.5 + parent: 13329 +- proto: ComputerCargoOrdersScience + entities: + - uid: 36019 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 41.5,-27.5 + parent: 13329 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 18860 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 30.5,23.5 + parent: 13329 +- proto: ComputerCargoOrdersService + entities: + - uid: 1292 + components: + - type: Transform + pos: -21.5,22.5 parent: 13329 - proto: ComputerCargoShuttle entities: @@ -97606,6 +97643,14 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,40.5 parent: 13329 +- proto: ComputerFundingAllocation + entities: + - uid: 10132 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 59.5,49.5 + parent: 13329 - proto: ComputerId entities: - uid: 30663 @@ -99092,6 +99137,46 @@ entities: - 0 - 0 - 0 +- proto: CrateLockBoxEngineering + entities: + - uid: 36027 + components: + - type: Transform + pos: 73.5,-12.5 + parent: 13329 +- proto: CrateLockBoxMedical + entities: + - uid: 36026 + components: + - type: Transform + pos: 11.5,61.5 + parent: 13329 +- proto: CrateLockBoxScience + entities: + - uid: 36025 + components: + - type: Transform + pos: 45.5,-27.5 + parent: 13329 +- proto: CrateLockBoxSecurity + entities: + - uid: 36024 + components: + - type: Transform + pos: 26.5,7.5 + parent: 13329 +- proto: CrateLockBoxService + entities: + - uid: 36022 + components: + - type: Transform + pos: -18.5,35.5 + parent: 13329 + - uid: 36023 + components: + - type: Transform + pos: -19.5,7.5 + parent: 13329 - proto: CrateMaterialSteel entities: - uid: 11674 @@ -116503,7 +116588,7 @@ entities: - uid: 10156 components: - type: Transform - pos: 30.550055,23.487902 + pos: 30.482075,22.65195 parent: 13329 - uid: 10548 components: @@ -163792,10 +163877,10 @@ entities: parent: 13329 - proto: Jukebox entities: - - uid: 32340 + - uid: 36020 components: - type: Transform - pos: -21.5,21.5 + pos: -10.5,16.5 parent: 13329 - proto: KitchenElectricGrill entities: @@ -167078,10 +167163,10 @@ entities: parent: 13329 - proto: MedicalTechFab entities: - - uid: 18823 + - uid: 32340 components: - type: Transform - pos: 6.5,68.5 + pos: 4.5,72.5 parent: 13329 - proto: MedkitAdvancedFilled entities: @@ -169946,13 +170031,6 @@ entities: - type: Transform pos: 69.55452,-12.772156 parent: 13329 -- proto: PottedPlant15 - entities: - - uid: 18860 - components: - - type: Transform - pos: 5.5,72.5 - parent: 13329 - proto: PottedPlant16 entities: - uid: 6631 @@ -170514,6 +170592,11 @@ entities: - type: Transform pos: 58.5,55.5 parent: 13329 + - uid: 36018 + components: + - type: Transform + pos: 6.5,70.5 + parent: 13329 - proto: PottedPlantRandomPlastic entities: - uid: 32710 @@ -197961,11 +198044,6 @@ entities: - type: Transform pos: 30.5,22.5 parent: 13329 - - uid: 10132 - components: - - type: Transform - pos: 30.5,23.5 - parent: 13329 - uid: 10133 components: - type: Transform @@ -199219,11 +199297,6 @@ entities: - type: Transform pos: 75.5,-8.5 parent: 13329 - - uid: 18804 - components: - - type: Transform - pos: 75.5,-11.5 - parent: 13329 - uid: 18886 components: - type: Transform @@ -224685,26 +224758,8 @@ entities: - uid: 18859 components: - type: Transform - pos: 4.5,72.5 + pos: 5.5,72.5 parent: 13329 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.1495 - moles: - - 3.0981817 - - 11.655066 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - proto: WardrobeMixedFilled entities: - uid: 29334 From cfbc54d154e969df1293c13b18d0be43da782639 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:06:32 +0200 Subject: [PATCH 147/622] Box Dept Economy (#36587) init --- Resources/Maps/box.yml | 157 ++++++++++++++++++++++++++++------------- 1 file changed, 109 insertions(+), 48 deletions(-) diff --git a/Resources/Maps/box.yml b/Resources/Maps/box.yml index 457ef0a8ef..2d46765fad 100644 --- a/Resources/Maps/box.yml +++ b/Resources/Maps/box.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 250.0.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 03/29/2025 05:00:25 - entityCount: 28319 + time: 04/15/2025 11:22:33 + entityCount: 28326 maps: - 780 grids: @@ -10551,8 +10551,8 @@ entities: id: docking46345 localAnchorB: -0.5,-1 localAnchorA: -66.5,22 - damping: 42.400753 - stiffness: 380.5883 + damping: 42.400772 + stiffness: 380.58847 - type: OccluderTree - type: Shuttle - type: RadiationGridResistance @@ -13906,7 +13906,7 @@ entities: pos: 24.5,16.5 parent: 8364 - type: Door - secondsUntilStateChange: -95912.98 + secondsUntilStateChange: -96621.34 state: Opening - type: DeviceLinkSource lastSignals: @@ -15461,7 +15461,7 @@ entities: pos: 9.5,25.5 parent: 8364 - type: Door - secondsUntilStateChange: -9169.472 + secondsUntilStateChange: -9877.836 state: Opening - type: DeviceLinkSource lastSignals: @@ -21702,7 +21702,7 @@ entities: - uid: 5795 components: - type: Transform - pos: 15.418736,30.571737 + pos: 16.409477,33.177017 parent: 8364 - uid: 9389 components: @@ -21813,7 +21813,7 @@ entities: - uid: 548 components: - type: Transform - pos: -11.614725,-21.270159 + pos: -13.529548,-15.192467 parent: 8364 - proto: BoxSterileMask entities: @@ -21865,7 +21865,7 @@ entities: - uid: 13477 components: - type: Transform - pos: -11.524348,-21.41842 + pos: -13.388923,-15.426842 parent: 8364 - proto: BriefcaseBrown entities: @@ -73661,6 +73661,45 @@ entities: - type: Transform pos: -22.5,-21.5 parent: 8364 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 20632 + components: + - type: Transform + pos: -1.5,-66.5 + parent: 8364 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 5493 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 46.5,-25.5 + parent: 8364 +- proto: ComputerCargoOrdersScience + entities: + - uid: 11598 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 69.5,-26.5 + parent: 8364 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 17837 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 15.5,30.5 + parent: 8364 +- proto: ComputerCargoOrdersService + entities: + - uid: 5773 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 31.5,-10.5 + parent: 8364 - proto: ComputerCargoShuttle entities: - uid: 14854 @@ -73712,6 +73751,12 @@ entities: rot: 1.5707963267948966 rad pos: -8.5,-55.5 parent: 8364 + - uid: 18061 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 37.5,-35.5 + parent: 8364 - uid: 19094 components: - type: Transform @@ -73724,12 +73769,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,-41.5 parent: 8364 - - uid: 20698 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 46.5,-25.5 - parent: 8364 - proto: ComputerCriminalRecords entities: - uid: 9181 @@ -73788,6 +73827,13 @@ entities: rot: 1.5707963267948966 rad pos: -1.5,-26.5 parent: 8364 +- proto: ComputerFundingAllocation + entities: + - uid: 20698 + components: + - type: Transform + pos: -11.5,-21.5 + parent: 8364 - proto: ComputerId entities: - uid: 5326 @@ -75005,6 +75051,46 @@ entities: showEnts: False occludes: True ent: null +- proto: CrateLockBoxEngineering + entities: + - uid: 28326 + components: + - type: Transform + pos: 9.5,-68.5 + parent: 8364 +- proto: CrateLockBoxMedical + entities: + - uid: 28325 + components: + - type: Transform + pos: 28.5,-35.5 + parent: 8364 +- proto: CrateLockBoxScience + entities: + - uid: 28324 + components: + - type: Transform + pos: 69.5,-21.5 + parent: 8364 +- proto: CrateLockBoxSecurity + entities: + - uid: 28323 + components: + - type: Transform + pos: 6.5,30.5 + parent: 8364 +- proto: CrateLockBoxService + entities: + - uid: 28321 + components: + - type: Transform + pos: 37.5,2.5 + parent: 8364 + - uid: 28322 + components: + - type: Transform + pos: 45.5,2.5 + parent: 8364 - proto: CrateMaterialPlasma entities: - uid: 26965 @@ -88108,7 +88194,7 @@ entities: pos: 18.5,-13.5 parent: 8364 - type: Door - secondsUntilStateChange: -3143.983 + secondsUntilStateChange: -3852.347 state: Closing - uid: 13388 components: @@ -88116,7 +88202,7 @@ entities: pos: 18.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -3179.683 + secondsUntilStateChange: -3888.047 state: Closing - uid: 13389 components: @@ -88284,7 +88370,7 @@ entities: pos: -34.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -90101.516 + secondsUntilStateChange: -90809.88 state: Closing - uid: 15010 components: @@ -128010,10 +128096,10 @@ entities: parent: 8364 - proto: Jukebox entities: - - uid: 20632 + - uid: 28320 components: - type: Transform - pos: 31.5,-10.5 + pos: 21.5,-3.5 parent: 8364 - proto: KitchenElectricGrill entities: @@ -145655,7 +145741,7 @@ entities: - uid: 506 components: - type: Transform - pos: 69.50902,-26.620325 + pos: 69.430275,-27.968096 parent: 8364 - uid: 19207 components: @@ -154168,11 +154254,6 @@ entities: - type: Transform pos: 71.5,-29.5 parent: 8364 - - uid: 5493 - components: - - type: Transform - pos: 69.5,-26.5 - parent: 8364 - uid: 5494 components: - type: Transform @@ -154473,11 +154554,6 @@ entities: - type: Transform pos: 13.5,30.5 parent: 8364 - - uid: 11598 - components: - - type: Transform - pos: 15.5,30.5 - parent: 8364 - uid: 11611 components: - type: Transform @@ -155077,16 +155153,6 @@ entities: - type: Transform pos: -29.5,-15.5 parent: 8364 - - uid: 17837 - components: - - type: Transform - pos: 37.5,-35.5 - parent: 8364 - - uid: 18061 - components: - - type: Transform - pos: -1.5,-66.5 - parent: 8364 - uid: 18317 components: - type: Transform @@ -156546,11 +156612,6 @@ entities: - type: Transform pos: 9.5,-24.5 parent: 8364 - - uid: 5773 - components: - - type: Transform - pos: -11.5,-21.5 - parent: 8364 - uid: 5789 components: - type: Transform @@ -179880,7 +179941,7 @@ entities: - uid: 2220 components: - type: Transform - pos: 37.56429,-35.54103 + pos: 36.15077,-36.314537 parent: 8364 - uid: 5248 components: From 10e37f7e509e73f0390f61a85fc8e733c8d18b2a Mon Sep 17 00:00:00 2001 From: Crazydave91920 Date: Wed, 16 Apr 2025 03:57:29 +0930 Subject: [PATCH 148/622] Contraband Fix - ZooKeeper - Double barrel shotgun (#36583) * Contraband Fix * Update base_contraband.yml --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> --- .../Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml | 2 +- .../Prototypes/Entities/Objects/base_contraband.yml | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 0f29a65600..4cbdb99f69 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -103,7 +103,7 @@ - type: entity name: double-barreled shotgun - parent: [BaseWeaponShotgun, BaseGunWieldable, BaseSecurityBartenderContraband] + parent: [BaseWeaponShotgun, BaseGunWieldable, BaseSecurityBartenderZookeeperContraband] id: WeaponShotgunDoubleBarreled description: An immortal classic. Uses .50 shotgun shells. components: diff --git a/Resources/Prototypes/Entities/Objects/base_contraband.yml b/Resources/Prototypes/Entities/Objects/base_contraband.yml index ee0e2e8c71..165d23ca82 100644 --- a/Resources/Prototypes/Entities/Objects/base_contraband.yml +++ b/Resources/Prototypes/Entities/Objects/base_contraband.yml @@ -172,6 +172,15 @@ allowedDepartments: [ Security ] allowedJobs: [ Bartender ] +- type: entity + id: BaseSecurityBartenderZookeeperContraband + parent: BaseRestrictedContraband + abstract: true + components: + - type: Contraband + allowedDepartments: [ Security ] + allowedJobs: [ Bartender, Zookeeper ] + - type: entity id: BaseSecurityLawyerContraband parent: BaseRestrictedContraband From 968fd94bcef34b0df28446cfc7df5791be0c4836 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 15 Apr 2025 18:28:40 +0000 Subject: [PATCH 149/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fa74468733..c1f6d200f7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: Detectives are now required to start with outer clothing (armor) like - all other security roles. - type: Tweak - - message: Vox Detectives now spawn with their chosen outer clothing equipped. Previously - the tank harness would override this and your armor would start on the floor. - type: Fix - id: 7688 - time: '2024-12-08T22:50:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33765 - author: slarticodefast changes: - message: Fixed pipes still containing gas after unanchoring them. @@ -3899,3 +3888,10 @@ id: 8187 time: '2025-04-15T03:38:31.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36571 +- author: Crazydave91920 + changes: + - message: Fixed Zookeeper not being on the double barrel shotgun contraband list + type: Fix + id: 8188 + time: '2025-04-15T18:27:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36583 From e0870d0cd2bd7673d0279f9cda35fa557ecdad56 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Tue, 15 Apr 2025 15:01:40 -0400 Subject: [PATCH 150/622] Cleanup: ExtensionCableSystem (#36052) * Use Entity and avoid Owner * Use SharedMapSystem --- .../ExtensionCableProviderComponent.cs | 2 +- .../ExtensionCableReceiverComponent.cs | 2 +- .../EntitySystems/ExtensionCableSystem.cs | 122 +++++++++--------- 3 files changed, 64 insertions(+), 62 deletions(-) diff --git a/Content.Server/Power/Components/ExtensionCableProviderComponent.cs b/Content.Server/Power/Components/ExtensionCableProviderComponent.cs index 27dae2ed76..a0bfc75f80 100644 --- a/Content.Server/Power/Components/ExtensionCableProviderComponent.cs +++ b/Content.Server/Power/Components/ExtensionCableProviderComponent.cs @@ -13,7 +13,7 @@ namespace Content.Server.Power.Components [DataField("transferRange")] public int TransferRange { get; set; } = 3; - [ViewVariables] public List LinkedReceivers { get; } = new(); + [ViewVariables] public List> LinkedReceivers { get; } = new(); /// /// If s should consider connecting to this. diff --git a/Content.Server/Power/Components/ExtensionCableReceiverComponent.cs b/Content.Server/Power/Components/ExtensionCableReceiverComponent.cs index 58e5c05dd0..a4fbdaceac 100644 --- a/Content.Server/Power/Components/ExtensionCableReceiverComponent.cs +++ b/Content.Server/Power/Components/ExtensionCableReceiverComponent.cs @@ -7,7 +7,7 @@ namespace Content.Server.Power.Components public sealed partial class ExtensionCableReceiverComponent : Component { [ViewVariables] - public ExtensionCableProviderComponent? Provider { get; set; } + public Entity? Provider { get; set; } [ViewVariables] public bool Connectable = false; diff --git a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs index 85e553031f..89f32166ae 100644 --- a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs +++ b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs @@ -8,6 +8,8 @@ namespace Content.Server.Power.EntitySystems { public sealed class ExtensionCableSystem : EntitySystem { + [Dependency] private readonly SharedMapSystem _map = default!; + public override void Initialize() { base.Initialize(); @@ -34,17 +36,17 @@ namespace Content.Server.Power.EntitySystems return; provider.TransferRange = range; - ResetReceivers(provider); + ResetReceivers((uid, provider)); } - private void OnProviderStarted(EntityUid uid, ExtensionCableProviderComponent provider, ComponentStartup args) + private void OnProviderStarted(Entity provider, ref ComponentStartup args) { - Connect(uid, provider); + Connect(provider); } - private void OnProviderShutdown(EntityUid uid, ExtensionCableProviderComponent provider, ComponentShutdown args) + private void OnProviderShutdown(Entity provider, ref ComponentShutdown args) { - var xform = Transform(uid); + var xform = Transform(provider); // If grid deleting no need to update power. if (HasComp(xform.GridUid) && @@ -53,54 +55,54 @@ namespace Content.Server.Power.EntitySystems return; } - Disconnect(uid, provider); + Disconnect(provider); } - private void OnProviderAnchorStateChanged(EntityUid uid, ExtensionCableProviderComponent provider, ref AnchorStateChangedEvent args) + private void OnProviderAnchorStateChanged(Entity provider, ref AnchorStateChangedEvent args) { if (args.Anchored) - Connect(uid, provider); + Connect(provider); else - Disconnect(uid, provider); + Disconnect(provider); } - private void Connect(EntityUid uid, ExtensionCableProviderComponent provider) + private void Connect(Entity provider) { - provider.Connectable = true; + provider.Comp.Connectable = true; - foreach (var receiver in FindAvailableReceivers(uid, provider.TransferRange)) + foreach (var receiver in FindAvailableReceivers(provider.Owner, provider.Comp.TransferRange)) { - receiver.Comp.Provider?.LinkedReceivers.Remove(receiver); + receiver.Comp.Provider?.Comp.LinkedReceivers.Remove(receiver); receiver.Comp.Provider = provider; - provider.LinkedReceivers.Add(receiver); + provider.Comp.LinkedReceivers.Add(receiver); RaiseLocalEvent(receiver, new ProviderConnectedEvent(provider), broadcast: false); - RaiseLocalEvent(uid, new ReceiverConnectedEvent(receiver), broadcast: false); + RaiseLocalEvent(provider, new ReceiverConnectedEvent(receiver), broadcast: false); } } - private void Disconnect(EntityUid uid, ExtensionCableProviderComponent provider) + private void Disconnect(Entity provider) { // same as OnProviderShutdown - provider.Connectable = false; + provider.Comp.Connectable = false; ResetReceivers(provider); } - private void OnProviderReAnchor(EntityUid uid, ExtensionCableProviderComponent component, ref ReAnchorEvent args) + private void OnProviderReAnchor(Entity provider, ref ReAnchorEvent args) { - Disconnect(uid, component); - Connect(uid, component); + Disconnect(provider); + Connect(provider); } - private void ResetReceivers(ExtensionCableProviderComponent provider) + private void ResetReceivers(Entity provider) { var providerId = provider.Owner; - var receivers = provider.LinkedReceivers.ToArray(); - provider.LinkedReceivers.Clear(); + var receivers = provider.Comp.LinkedReceivers.ToArray(); + provider.Comp.LinkedReceivers.Clear(); foreach (var receiver in receivers) { var receiverId = receiver.Owner; - receiver.Provider = null; + receiver.Comp.Provider = null; RaiseLocalEvent(receiverId, new ProviderDisconnectedEvent(provider), broadcast: false); RaiseLocalEvent(providerId, new ReceiverDisconnectedEvent((receiverId, receiver)), broadcast: false); } @@ -126,7 +128,7 @@ namespace Content.Server.Power.EntitySystems if (!TryComp(xform.GridUid, out MapGridComponent? grid)) yield break; - var nearbyEntities = grid.GetCellsInSquareArea(coordinates, (int) Math.Ceiling(range / grid.TileSize)); + var nearbyEntities = _map.GetCellsInSquareArea(xform.GridUid.Value, grid, coordinates, (int)Math.Ceiling(range / grid.TileSize)); foreach (var entity in nearbyEntities) { @@ -162,88 +164,88 @@ namespace Content.Server.Power.EntitySystems if (provider != null) { - RaiseLocalEvent(provider.Owner, new ReceiverDisconnectedEvent((uid, receiver)), broadcast: false); - provider.LinkedReceivers.Remove(receiver); + RaiseLocalEvent(provider.Value, new ReceiverDisconnectedEvent((uid, receiver)), broadcast: false); + provider.Value.Comp.LinkedReceivers.Remove((uid, receiver)); } receiver.ReceptionRange = range; - TryFindAndSetProvider(receiver); + TryFindAndSetProvider((uid, receiver)); } - private void OnReceiverStarted(EntityUid uid, ExtensionCableReceiverComponent receiver, ComponentStartup args) + private void OnReceiverStarted(Entity receiver, ref ComponentStartup args) { if (EntityManager.TryGetComponent(receiver.Owner, out PhysicsComponent? physicsComponent)) { - receiver.Connectable = physicsComponent.BodyType == BodyType.Static; + receiver.Comp.Connectable = physicsComponent.BodyType == BodyType.Static; } - if (receiver.Provider == null) + if (receiver.Comp.Provider == null) { TryFindAndSetProvider(receiver); } } - private void OnReceiverShutdown(EntityUid uid, ExtensionCableReceiverComponent receiver, ComponentShutdown args) + private void OnReceiverShutdown(Entity receiver, ref ComponentShutdown args) { - Disconnect(uid, receiver); + Disconnect(receiver); } - private void OnReceiverAnchorStateChanged(EntityUid uid, ExtensionCableReceiverComponent receiver, ref AnchorStateChangedEvent args) + private void OnReceiverAnchorStateChanged(Entity receiver, ref AnchorStateChangedEvent args) { if (args.Anchored) { - Connect(uid, receiver); + Connect(receiver); } else { - Disconnect(uid, receiver); + Disconnect(receiver); } } - private void OnReceiverReAnchor(EntityUid uid, ExtensionCableReceiverComponent receiver, ref ReAnchorEvent args) + private void OnReceiverReAnchor(Entity receiver, ref ReAnchorEvent args) { - Disconnect(uid, receiver); - Connect(uid, receiver); + Disconnect(receiver); + Connect(receiver); } - private void Connect(EntityUid uid, ExtensionCableReceiverComponent receiver) + private void Connect(Entity receiver) { - receiver.Connectable = true; - if (receiver.Provider == null) + receiver.Comp.Connectable = true; + if (receiver.Comp.Provider == null) { TryFindAndSetProvider(receiver); } } - private void Disconnect(EntityUid uid, ExtensionCableReceiverComponent receiver) + private void Disconnect(Entity receiver) { - receiver.Connectable = false; - RaiseLocalEvent(uid, new ProviderDisconnectedEvent(receiver.Provider), broadcast: false); - if (receiver.Provider != null) + receiver.Comp.Connectable = false; + RaiseLocalEvent(receiver, new ProviderDisconnectedEvent(receiver.Comp.Provider), broadcast: false); + if (receiver.Comp.Provider != null) { - RaiseLocalEvent(receiver.Provider.Owner, new ReceiverDisconnectedEvent((uid, receiver)), broadcast: false); - receiver.Provider.LinkedReceivers.Remove(receiver); + RaiseLocalEvent(receiver.Comp.Provider.Value, new ReceiverDisconnectedEvent(receiver), broadcast: false); + receiver.Comp.Provider.Value.Comp.LinkedReceivers.Remove(receiver); } - receiver.Provider = null; + receiver.Comp.Provider = null; } - private void TryFindAndSetProvider(ExtensionCableReceiverComponent receiver, TransformComponent? xform = null) + private void TryFindAndSetProvider(Entity receiver, TransformComponent? xform = null) { var uid = receiver.Owner; - if (!receiver.Connectable) + if (!receiver.Comp.Connectable) return; - if (!TryFindAvailableProvider(uid, receiver.ReceptionRange, out var provider, xform)) + if (!TryFindAvailableProvider(uid, receiver.Comp.ReceptionRange, out var provider, xform)) return; - receiver.Provider = provider; - provider.LinkedReceivers.Add(receiver); + receiver.Comp.Provider = provider; + provider.Value.Comp.LinkedReceivers.Add(receiver); RaiseLocalEvent(uid, new ProviderConnectedEvent(provider), broadcast: false); - RaiseLocalEvent(provider.Owner, new ReceiverConnectedEvent((uid, receiver)), broadcast: false); + RaiseLocalEvent(provider.Value, new ReceiverConnectedEvent((uid, receiver)), broadcast: false); } - private bool TryFindAvailableProvider(EntityUid owner, float range, [NotNullWhen(true)] out ExtensionCableProviderComponent? foundProvider, TransformComponent? xform = null) + private bool TryFindAvailableProvider(EntityUid owner, float range, [NotNullWhen(true)] out Entity? foundProvider, TransformComponent? xform = null) { if (!Resolve(owner, ref xform) || !TryComp(xform.GridUid, out MapGridComponent? grid)) { @@ -252,12 +254,12 @@ namespace Content.Server.Power.EntitySystems } var coordinates = xform.Coordinates; - var nearbyEntities = grid.GetCellsInSquareArea(coordinates, (int) Math.Ceiling(range / grid.TileSize)); + var nearbyEntities = _map.GetCellsInSquareArea(xform.GridUid.Value, grid, coordinates, (int)Math.Ceiling(range / grid.TileSize)); var cableQuery = GetEntityQuery(); var metaQuery = GetEntityQuery(); var xformQuery = GetEntityQuery(); - ExtensionCableProviderComponent? closestCandidate = null; + Entity? closestCandidate = null; var closestDistanceFound = float.MaxValue; foreach (var entity in nearbyEntities) { @@ -277,12 +279,12 @@ namespace Content.Server.Power.EntitySystems if (distance >= closestDistanceFound) continue; - closestCandidate = provider; + closestCandidate = (entity, provider); closestDistanceFound = distance; } // Make sure the provider is in range before claiming success - if (closestCandidate != null && closestDistanceFound <= Math.Min(range, closestCandidate.TransferRange)) + if (closestCandidate != null && closestDistanceFound <= Math.Min(range, closestCandidate.Value.Comp.TransferRange)) { foundProvider = closestCandidate; return true; From 28e3660e376a983fc504628c209dcdfb471d51d2 Mon Sep 17 00:00:00 2001 From: Minemoder5000 Date: Tue, 15 Apr 2025 15:39:18 -0600 Subject: [PATCH 151/622] Remove elite and juggernaut hardsuits from traitor uplink, add elite webvest (#36225) --- .../Locale/en-US/store/uplink-catalog.ftl | 3 ++ .../Prototypes/Catalog/uplink_catalog.yml | 29 +++++++++++++---- .../Entities/Clothing/OuterClothing/vests.yml | 28 ++++++++++++++++ .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 5654 bytes .../elitevest.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 5732 bytes .../Vests/elitevest.rsi/icon.png | Bin 0 -> 5027 bytes .../Vests/elitevest.rsi/inhand-left.png | Bin 0 -> 5063 bytes .../Vests/elitevest.rsi/inhand-right.png | Bin 0 -> 5052 bytes .../Vests/elitevest.rsi/meta.json | 30 ++++++++++++++++++ 9 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/meta.json diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 1d66bf3a8b..145279b1b5 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -321,6 +321,9 @@ uplink-clothing-thieving-gloves-desc = Discreetly steal from pockets and improve uplink-clothing-outer-vest-web-name = Web Vest uplink-clothing-outer-vest-web-desc = A synthetic armor vest. This one has added webbing and ballistic plates. +uplink-clothing-outer-vest-web-elite-name = Elite Web Vest +uplink-clothing-outer-vest-web-elite-desc = A synthetic armor vest. This one has added webbing and heat resistant fibers. + uplink-clothing-shoes-boots-mag-syndie-name = Blood-red Magboots uplink-clothing-shoes-boots-mag-syndie-desc = A pair of boots that prevent slipping and, in zero gravity, allow you to move normally, at the cost of a slight slowdown. Additionally, they have jetpack functionality and come fueled, but don't last for long. diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 77ce1b3b01..91cf7f1483 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -1564,6 +1564,19 @@ categories: - UplinkWearables +- type: listing + id: UplinkClothingOuterVestWebElite + name: uplink-clothing-outer-vest-web-elite-name + description: uplink-clothing-outer-vest-web-elite-desc + productEntity: ClothingOuterVestWebElite + discountCategory: usualDiscounts + discountDownTo: + Telecrystal: 3 + cost: + Telecrystal: 5 + categories: + - UplinkWearables + - type: listing id: UplinkClothingShoesBootsMagSyndie name: uplink-clothing-shoes-boots-mag-syndie-name @@ -1641,13 +1654,15 @@ description: uplink-hardsuit-syndieelite-desc icon: { sprite: /Textures/Clothing/OuterClothing/Hardsuits/syndieelite.rsi, state: icon } productEntity: ClothingBackpackDuffelSyndicateEliteHardsuitBundle - discountCategory: rareDiscounts - discountDownTo: - Telecrystal: 7 cost: Telecrystal: 12 categories: - UplinkWearables + conditions: + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink - type: listing id: UplinkClothingOuterHardsuitJuggernaut @@ -1655,13 +1670,15 @@ description: uplink-clothing-outer-hardsuit-juggernaut-desc icon: { sprite: /Textures/Structures/Storage/Crates/syndicate.rsi, state: icon } productEntity: CrateCybersunJuggernautBundle - discountCategory: veryRareDiscounts - discountDownTo: - Telecrystal: 8 cost: Telecrystal: 12 categories: - UplinkWearables + conditions: + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink - type: listing id: UplinkClothingEyesHudSyndicate diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml index 42de6bfd02..06bdb73a7c 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml @@ -19,6 +19,34 @@ - type: ExplosionResistance damageCoefficient: 0.9 +#Elite web vest +- type: entity + parent: [ClothingOuterStorageBase, AllowSuitStorageClothing, BaseSyndicateContraband] + id: ClothingOuterVestWebElite + name: elite web vest + description: A synthetic armor vest. This one has added webbing and heat resistant fibers. + components: + - type: Sprite + sprite: Clothing/OuterClothing/Vests/elitevest.rsi + - type: Clothing + sprite: Clothing/OuterClothing/Vests/elitevest.rsi + - type: TemperatureProtection + heatingCoefficient: 0.1 + coolingCoefficient: 0.1 + - type: Armor + modifiers: + coefficients: + Blunt: 0.5 + Slash: 0.5 + Piercing: 0.7 + Heat: 0.3 + Radiation: 0.5 + Caustic: 0.5 + - type: ExplosionResistance + damageCoefficient: 0.5 + - type: FireProtection + reduction: 0.85 + #Mercenary web vest - type: entity parent: [ BaseMajorContraband, ClothingOuterVestWeb] #web vest so it should have some pockets for ammo diff --git a/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/equipped-OUTERCLOTHING-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..c075eb9a7b7a41f54aa9a9310f64410fc2535ade GIT binary patch literal 5654 zcmeHKd0Z3M79N(e1l*qTM8O&(Dq50ELIO!lWD81!076s{st(D73}iD4VY4i?Doa7J z3RSDE?G=f@2JPfz`2WdZKR*s81GQI{wP(}W;8yi%nQV^S2aNl>DAG#(Q} zQ2Z5HaKz{uylvmj33E+rJGG9-<67khuC;hBD_czLWM>DgZ~vepH%aRkTu8|mgg#ia zWM6B+1dsC;mis@nyy*08{)xHfh)s3@%8N_sU01VmZN1Bm?8f#r-E#y+?sdAjo75=HnC0^YIx>2&A!n^+t|gji+PX z3XdbZ1yk*`@{1#O%d~LCe{8nWoMw}9(qm7Z%B?H@FzayX=+boj zFD6|i#_Z#M887{D#3(l7=Z4Cp+)7<)`C?&aXRcXh%d%x zZ$d8DIYu_LaoEXKS@&I@s8e!GDkO0A^sx<}?%7uBP zV`>G7*YZM<_7Yo(`oKh zn86%2T7s&KF;GbqnB-~M!zST>XaX9A<)cCo4ax-LqKt7!7z);d=I98 z9|pi7YlTXnP)IohJz02tjzelbSgS;c1{s2*vtSyFLK6TK8qA{8h_Ks8IKToXPWUrx z{mO)A8~fZ3Q)?8e1cS)9T!o^mjBmzQDP~xw@OZxm2lxW9 z{+-7_ll`48@c6e*-iY6~biJkPjTm?%{TjjKwa&4#UeI!Td)9O02= z`!23$oA!K6nKIj{$Qf6BY0hcb99n~{ zk150XF2b{|PuQ3S6o&TS?kfl^JT~cLcw6(mc2W9SQMxX@EoFBIFaK&{l?7DN7P|(q z3g5D5ub`Hc_V_&y-_!OV78e&?igC_w0{7s>cG(BLuXU@c8|Ir;w?$sCJg{tEYwxx` zLdGtuhfmp`!9v@IPaPLcu$vq-=g??6-zU!rv)|H$au*4lt?e$gr~<~V-di*-eA2Um zS*5#cCb5|U*OVokDWVty0KW9_uTWmid#cdZtn)u6yo^?a!b8ervDeU CV>YA! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..350f6a288ba1846b3a2015c3c57ed3a732bedb34 GIT binary patch literal 5732 zcmeHKd0Z1`6W#>NEmASaXF<|PtyDucA>?WzN5T)F)|BB5K5B z5M*poM$UFR4BPf!8TD=uzAIsazI*G1`E_5q$j?NVj01yQm=N|CD`?Ci}<)|f}Lu2i7f5l*^9{hnW4E6A-&y)w1m7TRlTw<&!bnD zym&mT+(q_H9OQ(oBN0QZ`C z{w3R@JZ=&@vo>?i1qZu_6IRaOTtb+Y0GHo&$fJ9C`>f7bP+h&I=G%`}?kRLC%pl&! zb^5Tp_k}Hg5^hfxb6L0QDi*D&Fr@E&U$UZOjn#_y>t9HN>PJT}sharEP2itlyZpZ= zrk|^E|Df(HkDF4t^3J4Rb!n?{<#M=coO9h5`Rk9oab(Z>{Mw{1S%==)@?J^=_nT9% zE%z+$I&`o`O zNHcBDQSHXdZrL$G_Lyzfi2#D%=gXSD%@z~+{dS|D?C74F6Hb~*_{7~|2Y<1=zxqkL zVQ&bQ{DaW`?eqhq8y>jX;41C&a@(G@h<2Oa}7y` z@AmFZYt%pJ$9W^#5+(3s5~# zjK*Oq9_e<)K@t&@@<=oNM6gK1N99;pvKF0@91$f+ULavhN&b`Vxke5EP@;N-XjCdx zI*yS?GUIZI6NHL;`x^V0=oANHhem(haZx_@EdO4Tb6hQIAI>4NgQ=`f<-fNF_t-H3?dUIUT8lf+|oYFx3IC)aP89CVptea~@3^bCA!% zhYCfJL*^#N;xMJg>;%;2Ibe-ktyk;hYR!=ObLd0r7hLEu*`GvY(!5{}{Qj|rL5|Jg z11ph;BT!2cOf(1uJQ9%jNHHl#!lEM*n93kiX$&cu#ip~!ESZ!+W-ukbFe0HMOqlr$ zgixi^BPt0x2!R0zUtbvZV^P^;nIB9e)0wcCj8Flh7-ov;C`-nWFvZV6Ox0qb>k-BO z6pd8Ek*T#x1hfmLMB-42MipoFVJaJkuU4qFGr*9cJQDS(I1)3WiWmU~IM9K{<&hZl z-zj5XRGLc835*o-NHibVY;KlBDiFOX0x-0gN~$*Ko~ojNgBg0nR2V9gPG?XVbnpk$ zm{i(Rqi9rXiGk)rg?)T2fedwpB?FOK3KH-&FESOM1E>S#LrhaQn3!2^ng>OKN&LPF z1C&_&m{l=PbvzQ227?cUYWjYP8vBQj5S|B}Mee5S$+ergNzDD1br-K)z&{@hlu*0h1;D zowaFaB62N#9){`kYHgBPWZAA}pbITemPZ9<-lvE}^NzzoBo;;`<}{_|NCBEfiTy#x z|Kp(LtE;Wf9QN^L)+!@%p{xW3-mB|qMn&#V2My87;RI=EQfs)xMi^&pG*>u>C{d~~B zOF0zml;%eG+a&$SFzB$MexQ>E(&JK0C(U3fxs(@*Z83P}XaclYWZ=jHCn#m;2p!-H zl;_|43^dul>4Hdn<>aOKeMQ$Rx?YNbmok3UU9aeRDF$B3_*HlP-{`V``Vx++z<)pn z@QO{HQXB+c&#lGbp#rEG!a;A@L)3LZVy6j<)j^Phi|N8ac^lk-&_*v51>0O3=49hN ztZ-|J3WBVD6bb^Pj4j=Hf$Em9QFTukvaE5w^)?xVGpwc`vS-Hk<4C3JL~7pcnR9wS zSFS7iF1Xw)c$(D_;^)oM@9x~(T%FNgVm$oSt@sZ|uc^DYpPAOU9@l6!%6>`E=Ew=7 zR(J+^6LP0dyVugFm`CZa$}Inxt3H->B}sg!wQ_%^o$k)}U+11oQ?^ae?LlL&7PGUx zs+*do-4bMbT@^bu6vG=Mw%MPk;ojCytBk@y?T;w<#A6}brsE`zHa0dpqTVs4Ia}?1 z`1;TN6J37XRT`V7z^}V>ej))6-gA?ZcE>1kXBIV76;C>{(D5)l|2#uK=VRr0*wJdC z`{CkAN%+VqOAxmc2_BC=^b}^dKYl!RgRZr;wF-80TZ)Ty=_tO?m$Ev!(y7)BN~bPO zu3X)>pG8mP;D1^b;-u{nR<$jBaWz?)Br)T zYZp_OPT5wR*mnFiSmaVS;?ix822P~)o5NUFh?!qC$-kPlYfF*1mSFqFCG?C zYiN@0-H_hULg`lQJTr37xdK@5;L(BcNzN&T>>Td{=28q)#C&^5nb1opJ*T)lPntFy z|FG}Q#i@4)_qx|JJ8w6B+0)aZ`Mz}CwjQgNZbnL5UElVmS)0;tb}f59TA8%z?c@Hd z+WRNBbSGXbD|4;t;dZc`QrbedpK6+W@bsMyhs8JcCCO?h3t~zy?JKO`GhGv#meE>F3lLxoZ!w1HB1l%5e=e_pxKQ zMDN^u>RK0L&RN2~!i(3h$4~Sxi^wuIThCi?x3d#pI&1i@Xoucp4`^%LvgWc?IXNzH zttK_Ka_x2qs+>Dj=N@{KJ1pf)XaJ%{Xy>d(eG!0t}W z>ls96ERQ4{DVXNP;}5%EW;Z7I^-SlmQ=4LEO^Iqx&8xaQiOY%4ujl`Aq}Q zR#Pt4ec{?;{OoFCMaAg(u$w&i8YMG}JEN;;G-a!U<`yd{ddjCzJ|>3U>igenjxRlO z@fXirF=PFkqEnRx_&w(wudMFb>VNXFL&2CgGYig49iLN)$|I))f87+bb9VkwTyuE- f3QL`9(l(_*JBq4VI9#6-7H|Tn3<4~Boi}(35W-z z>Jha*sOwv|dTNWU&AL9yL9Jp@aoyF@U3b-<-Bxt9K5MmTcePvgn+XJ{_Tky>f8?CW zWbVD+@80{n_q!iMO>WM(fl<#!K@c?1l4Z^VcUZh4p90@}d3hVSHI>`!LLTXdy*|#t zx)@j}^D;0KU>y(?_{5!?Hna(jJn+@xlr-7ElxF799Gp!VDXzRZoe}0T&S#`*)03!>2B2 zeDRw&b82;D&7WHG&K->}Y(8U5uJ~Zd?WC{y%4ML9-u{;-YZ4k1hHs8FxOT58&TK1mY}ThIt(s%MMo#@W=E5@<>UPwvx^?oU zB>vM2J5E2lgP-{Ahu%rQ{)2DR<+xgVdK4SEqGfE1X6>Sn->EHvO%M7FZ?C&K@%3zZ ze$3MN{&l8#&IgCv&-?2$+42*Xs8Ll1hyU?@TtuJ!WB0QKpEa-kYl^JmqsHHSa`(*i z#=nocdNLSm?6dIwc}uPbN8XgJd8zUE>m#piMgHw9&wk^ zPfdwR4iEsq%?KnMaJxJ_5irUnTmt+S#Y#CWnFu9Dx!sxzn>Zf>;|g4XA{ha8wo0B7 z1tWD!>?80B)HhdbkQd#%+VlYSIyr&kot!sp-UB_Xe#nKuI=&|&QS*>F@cU>F zog7Qy11qbQFmqI?NQ1>}lmm%^W@&=b<0OS*S_D&RX+&?p^@!dQH()qIIxsz=DbnCYI<-!xrLb-g6MZb`deZej zMMG1BgY&sb&@QZ-EM}BmPqE}fEE{3sT%2z**kp`R9&#;-bJ+mnvYT1J0S_A2DA(d$ zYb0gC!%DH_L|U%JC|4;^$y}1;x=2Bc0Bl;;Lvwz!AmOeEWnkrKkbqi37K={+>OlEOao2SwCdtM9;3^fxQ#>r7 zMAfy#-la3jbt)8ml$iM4Wm52iCZJIWlaC<<#tbfijjC|aEC{BzVLAdu36N83#T>(GE0|R@DUe|}4T0hWhT8y&3MX(JLABlC01K?6?8mId$pj~d z`aFx}1A(wu@}Y2pwh6=IZ<(xjzG0a{4OKBD7)@}>!+@SH>N zlRhS`7!=SbPZJLWIJa{~z~J0gp_m39-O)^AddA>)GN9n!&%E*{B*&ApneU`VIZ013 z1J0d}$@N1iqdJmN(P|1YfXRU1ddh*2l*53~8X7B7sr6ciO5Zc+@1#5qOiHN{el$r9 zf`SeU_k&j6kzTS=JZU;hnXG)M*dc>%M-!kWBm+ktI6;-+Bea7rP@bRj)6rxT#>)r&ne%`DC9)kK06E7LGeq$UEMhF&bM#R;=gCgP-yVG}p|24^mTg+)T zd(+KT){Kiw9-8!gFvM0qZISP%rl(cQ5wPd;1I@mTdyY~51#rRq}c=}%c@}VO)T-0BFL*aby zoJ*TOWLn9f!bKO??hCFN2JNg|S73ba%jCh^o}Tn{YuPU!Tp3WzM=YJzf}hkRG~XWC z{&G7n%R5mJIq&*Dx?tho)(5X&d9WF`4oQdSHww|O#h;CNk}0?|o0zovh2J$NPMLCh z^XLC8I~5$gnuiCNHXph(4ja&P$#MQ-PW-}F$3OZuwgh5>7kB_qciOn;^Nzg`3Zh5!Hn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/inhand-left.png b/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..520d5c63408782867db122dac0a72230843b3e5a GIT binary patch literal 5063 zcmeHLdsGu=79Y@6M6tF)Rb;orXtl0RG8rZ$nI@nl0a6S`MFh94P9_sFl4Rn{KmtBW zt@TAg)>_}y#kv)#(siv`_4uj}d{o7wT`O)aVpl6$N*@AC=A3zb z_kO>7@9*C4ewi$=q^CrLM~6cY6k$p=j05+P(izqbTr1gWm%#0CVMdlXj`G4Dp0l$~ z1{MoE49xggI|TV^U6zXx2jO0Kau$|C2{)tX5gX4%kh7lhtQ&khw)Z~q^ZbiVEz>^i z-J^lHx_IhKYicSdM3>YLt*xue`>trx!h6quTRI2px_7zTl)10^U@W#adH9++$1gr} zLOHgv`!H2(OW2-4}5rq<6{O#a))X>0Gh>JHqhIplPvVrq^D+SC3~$mWf%J5EL?p)$1)Ly}m6V z5XS16f7YcQ92s+Xa^gpS&G`K{aD7=hdBJFmNsB6;QvOlYq&#fr_dQnkQ6VKRJj`8na?Y}rHDVz-}s~H)kTt5FylIz$7`p>=9Z9Q6u;nu%a?~h&{I_`D6lN^Xp-h! zGRnqT8JW-J0hI?q+C-m+qH`G$wlX=aTZc65-iN@fO@~ZWnlZCS&p6oBLY^64n4Uow z=F%D)l9&*#^^pL;#fTK_b2;4t>C+*8ToOD>!*T@ntBAQeB+G1p^&HQ@gp813sL{vf z<48g{tmSQXa-1Q#6#~5J5QivwNV(kW^~$_)GLFxYD>NF79K+=}jsgu-C~%9E4|NNJ zB!~cpfe~n)^@uFzh9ykO%H@eV1Oalm%|DmNY!1S^g;o{-A95e%kt<}F+~tyYoFRzD zd;rqw&?9FE8DO2t$1wtz$J2~4pK*(WIzrg!;CxRW@AQXbqvec~aRF5USXDe=Qd;rB z84p;LBz`A5!l#(bmY}-CSPtv*_>F+vJOJ!*a3Uu-I8RXh0ra5wArm5Ne~d?xlu+3;C}qP4)Q+p|n2JzaDJ$IpVhqoM zs;8X4${QO^+Bx1ufpTG8R1PEexO4nAq_mNG&dKrP!6IXHh@ySi!ul9zmVpHv2%vCv zNIdZ)VfMp9DdprSi%EyzGR&{;AF((oQStyRTGnmjyh6Ju0~i=DQc_|RDuRetDC1Od z3Kg!7k8fAXWcYv&xJ-e`;sTBYt0EAAnX`ca;{21O6Lb|rAWdEcJC=^o9GnB{}zzMK1oB+jwD%2SY6^UUat{ILg zz=Iz!sLk;i9Ou*_5?QbmV^C}cy~;+3R1i){Vg#umG5`vWlgc<0i|+^rSYYi1Kc_8q zCRiJ&^Hf$4IljO@6lhoDnQ4Kyz^jw>_bC|mcN~(U1B}xCFl~NM0a`%FKBD4(@uCT$ z2%KH?Qam#%2P9C3jFL74*wWS`V6boFm_iA^&{|Bx9`wQMU_inj&%FE>1Se4W%#T8& z9h5tV0sBsC=lZFTm4sTYrU)8UX>bfB2waU?m39?MGnAdN;y^+L3iWXzr+`lBFNB{B zQi+1*(V-rY*6_4)X{TvRrB?n>vI7bowkAMJU<_<|U}Tefd61LCc~%< zUu|RUmZ@)8BD>X1K9F?qUtPJuvj-fCEiOAY@#}$+&7qBFyZt?f7hgj9_oz5}eMy;n z+h%>keKT_B8h=`M$y78yc+5&Mh)tWKpdU_6G8*Px{cuIgHO0qtr1D6ea%R%v!OhzX z<|^!-l17ao(zr`E@4Y`PjY}SzyLnet&(k++wxbzQ8_r(8m}?xnes9wie&>|6sTA zYi`|b{KC3r`9E&$o3#1dt-BXLmoGcPe$fS4H>%GI&>Tv=C#`J$*YX*mTS~28MNK+o Pl1Mih(+yQgQ)d4US$G{G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/inhand-right.png b/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..e2842ac2743e55fc0be319a714bd05ae64ac6c2a GIT binary patch literal 5052 zcmeHLeN+=y7M~!Bji0TeRI$#ElXP692%q$5Vm%8GV=nXNhX~cOhCGR zRNeYfwTM{1TJ>}Vt!4L!$SOz0Pi(g>w(4QkR+M_ys={bO#%_Cw)O1xKXT5@ zWbVE1cklh(``*jTg3OHZedI&r2!iynrdhJ!bF6gr>;dmv*q6`1$DtB?o|r}XP%qCp zSrKe!~uLzrAO8 zNs-t7sXe}VZMXF~ar*EPiQmlHHMcFR(mbU+yz;~2+ge&Ke@nbM-dvuM`onZ; zr~Jg^DfLg^G=DnU5&rJb9Q{*oC5x}>_D1rx{GI*V=Eb=@mtuf_cg{kS9}8qSGT6P1&$L@=ry?&g;EaYhy+!mdu&9 zZ{N~GTV7pMQ{A_E4*H|4Rbd#lD{aBubUE%wG<@AyKVxaVZ&qCnz3|-9ZVRVgTE!$E z8Js(>A+9aTk~F91f)9^oojephsj=CVSh{=BxA8ZGnM-6l3yFpi{To+pT61vd!J0Lj z4i~>|*#F0k&zEK-Za&t1!SJ05W82}Ku9}qvsn;ht-!de}m(R$%MCE=G+4^*A)z+%= zs~?Sy7tXY9Jw9ZsFyYRA?+Y)z&#(JWR9RlKob9>n=-9}FH(&c?OPK>T-+E&3-Kr}S zmZxJABNs>asxr?mytVJ{Szlc$Tk?Tb{@koRga7qYR76<)*m^de{^svcwto4;fBqRZ8>S7a+kHyl|Wdubznv#=!n*|WD7@7av>ZVB6vP+9l! zn2h1GqKj%vyG2Kb4FDhf*;nlQM_t{_Ch@0RvQZSj;N5fQViBZYH47Uo&-Oe?b8ZF2 za1NmGyS=dU5F|0l@1^KzKtvs&fc2QLtMz*^lx0lV!~`2*^O`{+n^wYu?2-&ST{4X} zGFZ|Wd7__$0B#^ssNe1K2&CVH1#n6DT@ouXG+-i5GhunQOw`Qr0M#nA3Ib2@v(wes z7&)5AGfpzglG+Xd-%MDcD0)ey(&zIjd>RGE7bsOmqftqym1;E(EpVaOBT|0cBaDzB zf*2Mc&^+rESn3RJn5=|He^=LY#e#)yur~JrdkZ;{6AC$R$oxL^koo}^BI|raM3UwKbLjWs z9y&Mt9Q}{3fDM*6W2021MV;a1_w^Upwl`i031XohzUFkyPk6W zPthEw7f1>1#nQw2cj^%MkrNM$3QX-7}N?Cq0j^a33Wv<0~^P{1T+C;srV$M4wjFSW?e^O0l73ETt$*N$HPKO z)c1zu-P4&cJ&b`Mlq%_d&m{jBO<<#tW*$%?u)qsq6KXAN7F=bptMnv6kZNNbp@Lrm zfFWy+w{x7!gh|PwQjQ_D4X#xTB~l@{1d`B_DyvtPv>Ox7CCy0Ug=iOr!3P!B+@i!5_`M@;4+WP}9NBQlkqg zPXU1YPW#IBODPkK%HePldfdnW0@ngK(;ZHS7I&%v%@Bmq0Sv*edsNEf;Yt~3gkMcE z0ViOGh5EsWwWpV;ly;hqQYI=ND0a}G)7AuO3CiG>2X|0qXbWxU3e%hPt_jG}x zT}~d0-!8hk=z1&$9?Q6^ySnIlECwFSxU0MVZ*5?I<*G55MglM&;L|hE-8!>2D*^_t5;D0a*t7V+s zf9lGq-BS+`1LvP>>M?l8++@p~egB@@J72zT+fAMPC345aHE~C}hflaUJ0^T>@5*e{ z{AIr@{m$CFn~SgFJAPEECO2_b4ks^M|L*$w z_Zi3Eo0jq)r>s19bIimS2I^WaO#V9EgU|0DZ_5Vxn~q(K(HwKuSRKYvsEq0@CO&iG z^7q?6_ngq$zWYMn^ABIXQk%86rMa=>z5dDelX^|9JI*@wbguJrOwb+AV8#4}GyM7#X}b?2dXpHMhC;^+x*g`R?`{P-btg&B=-UJYwO@oC`~3BQ2i)FuzMy8+3UKnhK}W8Aruf45_A&(VeKp|xC2DcgQF*e2YE8+o JR3}fF^IwX;3}*lU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/meta.json new file mode 100644 index 0000000000..84009efde3 --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/Vests/elitevest.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Vox state by Flareguy for SS14. Minor edits by SlamBamActionman and Minemoder for elite variant.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-vox", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From ecbbc41bccf504192fa46a8861e9da9e8422dca3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 15 Apr 2025 21:40:26 +0000 Subject: [PATCH 152/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c1f6d200f7..a1e2013b80 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed pipes still containing gas after unanchoring them. - type: Fix - id: 7689 - time: '2024-12-08T23:20:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33774 - author: Errant changes: - message: Signal timers now have a maximum countdown duration, which can be specified @@ -3895,3 +3888,15 @@ id: 8188 time: '2025-04-15T18:27:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36583 +- author: Minemoder5000 + changes: + - message: The Syndicate Elite Hardsuit and Cybersun Juggernaut Suit have been restricted + to Nuclear Operative uplinks. + type: Tweak + - message: The Elite Web Vest has been added to the uplink for 5 tc. It has reduced + pierce resistance, but increased heat, radiation, blunt, slash, and caustic + resistance compared to the normal web vest. + type: Add + id: 8189 + time: '2025-04-15T21:39:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36225 From 98d951008af316b4c4307d67f7b1d657dd6d2ede Mon Sep 17 00:00:00 2001 From: Fildrance Date: Wed, 16 Apr 2025 01:05:36 +0300 Subject: [PATCH 153/622] fix: mode scanner footer now is not jumping up and down on scanning artifact (#36599) fix: scanner footer now is not jumping up and down on scanning artifact Co-authored-by: pa.pecherskij --- Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml b/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml index 448acd0223..c34dbab475 100644 --- a/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml +++ b/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml @@ -11,7 +11,7 @@ [DataField] - public TimeSpan UnlockStateIncrementPerNode = TimeSpan.FromSeconds(5); + public TimeSpan UnlockStateIncrementPerNode = TimeSpan.FromSeconds(10); /// /// Minimum waiting time between unlock states. /// [DataField] - public TimeSpan UnlockStateRefractory = TimeSpan.FromSeconds(10); + public TimeSpan UnlockStateRefractory = TimeSpan.FromSeconds(5); /// /// When next unlock session can be triggered. diff --git a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs index c4c1673150..4a8b8ec49f 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs @@ -64,7 +64,7 @@ public sealed partial class XenoArtifactNodeComponent : Component /// The amount of points a node is worth with no scaling /// [DataField, AutoNetworkedField] - public float BasePointValue = 5000; + public float BasePointValue = 4000; /// /// Amount of points available currently for extracting. diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs index e4c1a1bae5..75f88a41c3 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs @@ -394,6 +394,6 @@ public abstract partial class SharedXenoArtifactSystem : 1f + durabilityEffect; var predecessorNodes = GetPredecessorNodes((artifact, artifact), node); - nodeComponent.ResearchValue = (int)(Math.Pow(1.25, predecessorNodes.Count) * nodeComponent.BasePointValue * durabilityMultiplier); + nodeComponent.ResearchValue = (int)(Math.Pow(1.25, Math.Pow(predecessorNodes.Count, 1.5f)) * nodeComponent.BasePointValue * durabilityMultiplier); } } diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs index 3238bedcba..9786e65478 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs @@ -73,6 +73,7 @@ public abstract partial class SharedXenoArtifactSystem if (TryGetNodeFromUnlockState(ent, out var node)) { SetNodeUnlocked((ent, artifactComponent), node.Value); + ActivateNode((ent, ent), (node.Value, node.Value), null, null, Transform(ent).Coordinates, false); unlockAttemptResultMsg = "artifact-unlock-state-end-success"; // as an experiment - unlocking node doesn't activate it, activation is left for player to decide. diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml index a678ef03f3..0135361044 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/artifacts.yml @@ -10,16 +10,8 @@ state: ano01 - type: RandomSpawner prototypes: - - SimpleXenoArtifact - - MediumXenoArtifact - - MediumXenoArtifact - - MediumXenoArtifact - - MediumXenoArtifact - ComplexXenoArtifact - ComplexXenoArtifact - - ComplexXenoArtifact - - SimpleXenoArtifactItem - - MediumXenoArtifactItem - ComplexXenoArtifactItem chance: 1 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_xenoartifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_xenoartifacts.yml index 00c6abf362..83a04a809b 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_xenoartifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_xenoartifacts.yml @@ -62,47 +62,16 @@ tableId: XenoArtifactEffectsHandheldOnlyTable weight: 2 -- type: entity - parent: BaseXenoArtifactItem - id: SimpleXenoArtifactItem - suffix: hand-sized Simple - components: - - type: XenoArtifact - nodeCount: - min: 2 - max: 5 - -- type: entity - parent: BaseXenoArtifactItem - id: MediumXenoArtifactItem - suffix: hand-sized Medium - components: - - type: XenoArtifact - nodeCount: - min: 5 - max: 9 - - type: entity parent: BaseXenoArtifactItem id: ComplexXenoArtifactItem - suffix: hand-sized Complex + suffix: Hand-Sized components: - type: XenoArtifact nodeCount: min: 9 max: 13 -# this exists for crafting item artifacts so that the final result can be simple, medium, or complex. -- type: entity - parent: BaseXenoArtifactItem - id: VariedXenoArtifactItem - suffix: hand-sized Varied - components: - - type: XenoArtifact - nodeCount: - min: 2 - max: 13 - - type: entity id: ArtifactFragment parent: BaseItem diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_xenoartifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_xenoartifacts.yml index 0b3d95777d..8edbbd71f4 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_xenoartifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_xenoartifacts.yml @@ -39,30 +39,9 @@ mask: - MachineMask -- type: entity - parent: BaseXenoArtifactStructure - id: SimpleXenoArtifact - suffix: Simple - components: - - type: XenoArtifact - nodeCount: - min: 2 - max: 5 - -- type: entity - parent: BaseXenoArtifactStructure - id: MediumXenoArtifact - suffix: Medium - components: - - type: XenoArtifact - nodeCount: - min: 5 - max: 9 - - type: entity parent: BaseXenoArtifactStructure id: ComplexXenoArtifact - suffix: Complex components: - type: XenoArtifact nodeCount: diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/artifact.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/artifact.yml index a0961a1669..d48731ad5a 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/artifact.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/artifact.yml @@ -10,4 +10,4 @@ amount: 4 doAfter: 5 - node: done - entity: VariedXenoArtifactItem + entity: ComplexXenoArtifactItem diff --git a/Resources/Prototypes/XenoArch/effects.yml b/Resources/Prototypes/XenoArch/effects.yml index e02514d2c2..027c79550c 100644 --- a/Resources/Prototypes/XenoArch/effects.yml +++ b/Resources/Prototypes/XenoArch/effects.yml @@ -1059,14 +1059,9 @@ - type: entity id: XenoArtifactAnomalySpawn - parent: BaseXenoArtifactEffect + parent: BaseOneTimeXenoArtifactEffect description: Creates anomaly components: - - type: XenoArtifactNode - maxDurability: 2 - maxDurabilityCanDecreaseBy: - min: 0 - max: 1 - type: XAEApplyComponents applyIfAlreadyHave: true refreshOnReactivate: true diff --git a/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml b/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml index 87177acbaf..cd717511c3 100644 --- a/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml +++ b/Resources/ServerInfo/Guidebook/Science/Xenoarchaeology.xml @@ -9,7 +9,7 @@ By researching the unique things each artifact can do, you gain Research Points, ## Artifact Nodes - + Artifacts consist of a randomly-generated tree of nodes. These nodes have a "[color=#a4885c]depth[/color]", representing how dangerous the node is, and the number of other nodes connected to it, called "[color=#a4885c]edges[/color]", diff --git a/Resources/migration.yml b/Resources/migration.yml index f505db5268..851e6ca03c 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -592,3 +592,10 @@ MailAllAccessSpam: MailSpamLetter MailCentcommRetributionSpam: MailSpamLetter MailEvilLizardSpam: MailSpamLetter MailParentsNeedMoneySpam: MailSpamLetter + +# 2025-04-15 +SimpleXenoArtifact: ComplexXenoArtifact +MediumXenoArtifact: ComplexXenoArtifact +SimpleXenoArtifactItem: ComplexXenoArtifactItem +MediumXenoArtifactItem: ComplexXenoArtifactItem +VariedXenoArtifactItem: ComplexXenoArtifactItem From fe6f2235a26b89ace086cd99b4b8731890e1494b Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 15 Apr 2025 22:39:33 +0000 Subject: [PATCH 157/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0a63332a3a..da810a79b9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: You are now notified of who is pulling you when being pulled. - type: Add - id: 7691 - time: '2024-12-09T03:51:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33612 - author: Bhijn and Myr changes: - message: The Admin Message system now contains an introductory message as the @@ -3900,3 +3893,15 @@ id: 8190 time: '2025-04-15T22:24:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36598 +- author: EmoGarbage404 + changes: + - message: When an artifact's node is unlocked, the effect will now also occur. + Effects can still be triggered manually through interaction. + type: Add + - message: Artifacts will now have more nodes on average. + type: Tweak + - message: Higher-class artifact nodes now grant significantly more points. + type: Tweak + id: 8191 + time: '2025-04-15T22:38:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36604 From a3b68f71816d5d9fb692e4b34c904b7913616c13 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Tue, 15 Apr 2025 18:48:44 -0400 Subject: [PATCH 158/622] Oasis update, request comps etc. (#36582) --- Resources/Maps/oasis.yml | 2455 +++++++++++++++++++++++--------------- 1 file changed, 1461 insertions(+), 994 deletions(-) diff --git a/Resources/Maps/oasis.yml b/Resources/Maps/oasis.yml index 0cde7a9206..0f0e04e64f 100644 --- a/Resources/Maps/oasis.yml +++ b/Resources/Maps/oasis.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 250.0.0 + engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 03/30/2025 03:58:19 - entityCount: 30243 + time: 04/15/2025 03:45:33 + entityCount: 30307 maps: - 1 grids: @@ -31,6 +31,7 @@ tilemap: 0: FloorConcreteSmooth 16: FloorDark 27: FloorDarkDiagonal + 55: FloorDarkHerringbone 41: FloorDarkMini 29: FloorDarkMono 33: FloorDarkOffset @@ -52,6 +53,7 @@ tilemap: 7: FloorPlanetGrass 30: FloorReinforced 48: FloorReinforcedHardened + 54: FloorRockVault 17: FloorSteel 25: FloorSteelDiagonal 37: FloorSteelOffset @@ -131,7 +133,7 @@ entities: version: 6 1,1: ind: 1,1 - tiles: BgAAAAADBgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAADFAAAAAAAFAAAAAACFAAAAAABFAAAAAADFAAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAACFAAAAAAABgAAAAACBgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAABFAAAAAAAFAAAAAADFAAAAAACFAAAAAACFAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAABHAAAAAADAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAABFAAAAAACFAAAAAACFAAAAAABFAAAAAABFAAAAAACAgAAAAAAHAAAAAADHAAAAAABHAAAAAAAHAAAAAAAAgAAAAAADwAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAABDAAAAAAADAAAAAADDAAAAAACAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAHAAAAAADDAAAAAACDAAAAAABDAAAAAABAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAACAgAAAAAAHAAAAAADDAAAAAAADAAAAAACDAAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAEAAAAAAAEAAAAAABAgAAAAAAHAAAAAACHAAAAAACHAAAAAAAHAAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAEAAAAAAAEAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGwAAAAACAgAAAAAADwAAAAAADwAAAAAAAgAAAAAADgAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAADEQAAAAABEQAAAAAAEQAAAAAAEQAAAAAAEQAAAAADDwAAAAAADwAAAAAADwAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAEQAAAAAAEQAAAAACEQAAAAAAEQAAAAABEQAAAAADEQAAAAAAAgAAAAAADwAAAAAADwAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAADEQAAAAABEQAAAAACEQAAAAAAEQAAAAACEQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAABEQAAAAACEQAAAAABEQAAAAABEQAAAAADDwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAACGQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAACDAAAAAAAAgAAAAAADwAAAAAAAgAAAAAAEQAAAAAAEQAAAAAAEQAAAAACEQAAAAAAEQAAAAACEQAAAAABEQAAAAABEQAAAAACEQAAAAAAAgAAAAAAFQAAAAAAEQAAAAACEQAAAAACEQAAAAACEQAAAAADAgAAAAAAEQAAAAACEQAAAAACEQAAAAABEQAAAAABEQAAAAAAEQAAAAABEQAAAAABEQAAAAADEQAAAAADAgAAAAAAFQAAAAAA + tiles: BgAAAAADBgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAADFAAAAAAAFAAAAAACFAAAAAABFAAAAAADFAAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAACFAAAAAAABgAAAAACBgAAAAADAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAABFAAAAAAAFAAAAAADFAAAAAACFAAAAAACFAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAABHAAAAAADAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAABFAAAAAACFAAAAAACFAAAAAABFAAAAAABFAAAAAACAgAAAAAAHAAAAAADHAAAAAABHAAAAAAAHAAAAAAAAgAAAAAADwAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAABDAAAAAAADAAAAAADDAAAAAACAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAHAAAAAADDAAAAAACDAAAAAABDAAAAAABAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAACAgAAAAAAHAAAAAADDAAAAAAADAAAAAACDAAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAEAAAAAAAEAAAAAABAgAAAAAAHAAAAAACHAAAAAACHAAAAAAAHAAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAGgAAAAAAEAAAAAAAEAAAAAABAgAAAAAAHAAAAAAAHAAAAAAAHAAAAAAAHAAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAADEQAAAAABEQAAAAAAEQAAAAAAEQAAAAAAEQAAAAADDwAAAAAADwAAAAAADwAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAEQAAAAAAEQAAAAACEQAAAAAAEQAAAAABEQAAAAADEQAAAAAAAgAAAAAADwAAAAAADwAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAADEQAAAAABEQAAAAACEQAAAAAAEQAAAAACEQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAABEQAAAAACEQAAAAABEQAAAAABEQAAAAADDwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAACGQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAACDAAAAAAAAgAAAAAADwAAAAAAAgAAAAAAEQAAAAAAEQAAAAAAEQAAAAACEQAAAAAAEQAAAAACEQAAAAABEQAAAAABEQAAAAACEQAAAAAAAgAAAAAAFQAAAAAAEQAAAAACEQAAAAACEQAAAAACEQAAAAADAgAAAAAAEQAAAAACEQAAAAACEQAAAAABEQAAAAABEQAAAAAAEQAAAAABEQAAAAABEQAAAAADEQAAAAADAgAAAAAAFQAAAAAA version: 6 1,0: ind: 1,0 @@ -183,7 +185,7 @@ entities: version: 6 2,-1: ind: 2,-1 - tiles: FAAAAAAAAgAAAAAAFAAAAAABFAAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAADFAAAAAAAFAAAAAABFAAAAAACFAAAAAACFAAAAAADFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAADAgAAAAAAFAAAAAACFAAAAAAAAgAAAAAAFAAAAAABFAAAAAADFAAAAAADFAAAAAACFAAAAAACFAAAAAAAFAAAAAADFAAAAAADFAAAAAAAFAAAAAADFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAADAgAAAAAAFAAAAAABFAAAAAAAFAAAAAACFAAAAAADKAAAAAACKAAAAAAAKAAAAAAAKAAAAAACKAAAAAAAIQAAAAAAIQAAAAAAFAAAAAADFAAAAAAAFAAAAAADFAAAAAABFAAAAAADFAAAAAABFAAAAAAAFAAAAAACFAAAAAADKAAAAAABKAAAAAAAKAAAAAABKAAAAAADKAAAAAACIQAAAAAAIQAAAAAAFAAAAAADFAAAAAACFAAAAAACFAAAAAABFAAAAAAAFAAAAAABFAAAAAADFAAAAAABFAAAAAADKAAAAAACKAAAAAACKAAAAAAAKAAAAAADKAAAAAADIQAAAAAAIQAAAAAAFAAAAAABFAAAAAADFAAAAAABFAAAAAAAFAAAAAADFAAAAAADFAAAAAACFAAAAAACFAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAAAIQAAAAAAFAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAACAgAAAAAAAgAAAAAAAgAAAAAADAAAAAABDAAAAAACDAAAAAADAgAAAAAAFAAAAAAAFAAAAAADFAAAAAABFAAAAAADAgAAAAAADAAAAAABDAAAAAABDAAAAAACDAAAAAACGwAAAAAAGwAAAAACAgAAAAAADAAAAAACDAAAAAAADAAAAAABAgAAAAAAFAAAAAADFAAAAAADFAAAAAACFAAAAAADAgAAAAAADAAAAAAADAAAAAACDAAAAAACHAAAAAACGwAAAAADGwAAAAACAgAAAAAAAgAAAAAAHAAAAAAAAgAAAAAAAgAAAAAAFAAAAAAAFAAAAAADFAAAAAACFAAAAAABHAAAAAABDAAAAAACDAAAAAACDAAAAAAAHAAAAAAADAAAAAADDAAAAAACDAAAAAACDAAAAAACDAAAAAACDAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAABFAAAAAAAAgAAAAAAHAAAAAADHAAAAAADHAAAAAABHAAAAAAADAAAAAACDAAAAAABDAAAAAADDAAAAAADDAAAAAADDAAAAAADHAAAAAAADAAAAAACAgAAAAAAFAAAAAABFAAAAAADHAAAAAAADAAAAAAADAAAAAADDAAAAAADHAAAAAABDAAAAAADDAAAAAADDAAAAAADDAAAAAABDAAAAAABDAAAAAACAgAAAAAADAAAAAAAAgAAAAAAFAAAAAABFAAAAAAAAgAAAAAADAAAAAADDAAAAAADDAAAAAACHAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAACAgAAAAAAFAAAAAADFAAAAAADAgAAAAAADAAAAAAADAAAAAADDAAAAAAADAAAAAAAAgAAAAAAEQAAAAADEQAAAAABEQAAAAAAEQAAAAACAgAAAAAAEQAAAAADEQAAAAAAEQAAAAABEQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAACFAAAAAAAFAAAAAACEQAAAAAAAgAAAAAAEQAAAAADEQAAAAAAEQAAAAACEQAAAAACEQAAAAADEQAAAAACEQAAAAAAEQAAAAAAEQAAAAABEQAAAAACEQAAAAAAEQAAAAADEQAAAAABEQAAAAACEQAAAAAAEQAAAAABEQAAAAACEQAAAAABEQAAAAAA + tiles: FAAAAAAAAgAAAAAAFAAAAAABFAAAAAABAgAAAAAAFAAAAAAAFAAAAAAAFAAAAAADFAAAAAAAFAAAAAABFAAAAAACFAAAAAACFAAAAAADFAAAAAAAFAAAAAAAFAAAAAAAFAAAAAADAgAAAAAAFAAAAAACFAAAAAAAAgAAAAAAFAAAAAABFAAAAAADFAAAAAADFAAAAAACFAAAAAACFAAAAAAAFAAAAAADFAAAAAADFAAAAAAAFAAAAAADFAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAADAgAAAAAAFAAAAAABFAAAAAAAFAAAAAACFAAAAAADKAAAAAACKAAAAAAAKAAAAAAAKAAAAAACKAAAAAAAIQAAAAAAIQAAAAAAFAAAAAADFAAAAAAAFAAAAAADFAAAAAABFAAAAAADFAAAAAABFAAAAAAAFAAAAAACFAAAAAADKAAAAAABKAAAAAAAKAAAAAABKAAAAAADKAAAAAACIQAAAAAAIQAAAAAAFAAAAAADFAAAAAACFAAAAAACFAAAAAABFAAAAAAAFAAAAAABFAAAAAADFAAAAAABFAAAAAADKAAAAAACKAAAAAACKAAAAAAAKAAAAAADKAAAAAADIQAAAAAAIQAAAAAAFAAAAAABFAAAAAADFAAAAAABFAAAAAAAFAAAAAADFAAAAAADFAAAAAACFAAAAAACFAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAIQAAAAAAIQAAAAAAFAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAACAgAAAAAAAgAAAAAAAgAAAAAADAAAAAABDAAAAAACDAAAAAADAgAAAAAAFAAAAAAAFAAAAAADFAAAAAABFAAAAAADAgAAAAAADAAAAAABDAAAAAABDAAAAAACDAAAAAACGwAAAAAAGwAAAAACAgAAAAAADAAAAAACDAAAAAAADAAAAAABAgAAAAAAFAAAAAADFAAAAAADFAAAAAACFAAAAAADAgAAAAAADAAAAAAADAAAAAACDAAAAAACHAAAAAACGwAAAAADGwAAAAACAgAAAAAAAgAAAAAAHAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFAAAAAADFAAAAAACFAAAAAABHAAAAAABDAAAAAACDAAAAAACDAAAAAAAHAAAAAAADAAAAAADDAAAAAACDAAAAAACDAAAAAACDAAAAAACNgAAAAAADAAAAAAAAgAAAAAAAgAAAAAAFAAAAAABFAAAAAAAAgAAAAAAHAAAAAADHAAAAAADHAAAAAABHAAAAAAADAAAAAACDAAAAAABDAAAAAADDAAAAAADDAAAAAADDAAAAAADDAAAAAAADAAAAAACAgAAAAAAFAAAAAABFAAAAAADHAAAAAAADAAAAAAADAAAAAADDAAAAAADHAAAAAABDAAAAAADDAAAAAADDAAAAAADDAAAAAABDAAAAAABNgAAAAAADAAAAAAADAAAAAAAAgAAAAAAFAAAAAABFAAAAAAAAgAAAAAADAAAAAADDAAAAAADDAAAAAACHAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAAADAAAAAAAAgAAAAAAFAAAAAADFAAAAAADAgAAAAAADAAAAAAADAAAAAADDAAAAAAADAAAAAAAAgAAAAAAEQAAAAADEQAAAAABEQAAAAAAEQAAAAACAgAAAAAAEQAAAAADHAAAAAAAEQAAAAABEQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAACFAAAAAAAFAAAAAACEQAAAAAAAgAAAAAAEQAAAAADEQAAAAAAEQAAAAACEQAAAAACEQAAAAADEQAAAAACEQAAAAAAEQAAAAAAEQAAAAABEQAAAAACEQAAAAAAEQAAAAADEQAAAAABEQAAAAACEQAAAAAAEQAAAAABEQAAAAACEQAAAAABEQAAAAAA version: 6 2,0: ind: 2,0 @@ -191,7 +193,7 @@ entities: version: 6 2,1: ind: 2,1 - tiles: FAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAAgAAAAAADAAAAAACDAAAAAABDAAAAAADAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAACDAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAHAAAAAABHAAAAAACDAAAAAADDAAAAAAAAgAAAAAAAgAAAAAADAAAAAAADAAAAAACDAAAAAADAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADHAAAAAAAAgAAAAAAAgAAAAAAHAAAAAACAgAAAAAAAgAAAAAALAAAAAAADAAAAAACDAAAAAACAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADHAAAAAACAgAAAAAAEgAAAAADEgAAAAABAgAAAAAAAgAAAAAADAAAAAACDAAAAAACDAAAAAADDwAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADHAAAAAABAgAAAAAAEgAAAAACEgAAAAADAgAAAAAAAgAAAAAADAAAAAAADAAAAAABDAAAAAABAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAHAAAAAADAgAAAAAACwAAAAAACwAAAAAAAgAAAAAAAgAAAAAADAAAAAABDAAAAAAADAAAAAABAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADDAAAAAAADAAAAAABAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAADgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAADgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAFQAAAAAAKwAAAAAAKwAAAAADKwAAAAACFQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAA + tiles: FAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAAgAAAAAADAAAAAACDAAAAAABDAAAAAADAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAACDAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAHAAAAAABHAAAAAACDAAAAAADDAAAAAAAAgAAAAAAAgAAAAAADAAAAAAADAAAAAACDAAAAAADAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADHAAAAAAAAgAAAAAAAgAAAAAAHAAAAAACAgAAAAAAAgAAAAAALAAAAAAADAAAAAACDAAAAAACAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADHAAAAAACAgAAAAAAEgAAAAADEgAAAAABAgAAAAAAAgAAAAAADAAAAAACDAAAAAACDAAAAAADDwAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADHAAAAAABAgAAAAAAEgAAAAACEgAAAAADAgAAAAAAAgAAAAAADAAAAAAADAAAAAABDAAAAAABAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAHAAAAAADAgAAAAAACwAAAAAACwAAAAAAAgAAAAAAAgAAAAAADAAAAAABDAAAAAAADAAAAAABAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAHAAAAAAAHAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADAAAAAADDAAAAAAADAAAAAABAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAADgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAFQAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAFQAAAAAAKwAAAAAAKwAAAAADKwAAAAACFQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAA version: 6 -3,-3: ind: -3,-3 @@ -243,7 +245,7 @@ entities: version: 6 1,2: ind: 1,2 - tiles: HQAAAAAAHQAAAAADEQAAAAAAEQAAAAABGQAAAAABEQAAAAADEQAAAAADHQAAAAAAHQAAAAAAHQAAAAADHQAAAAACHQAAAAADEQAAAAAAEQAAAAADAgAAAAAAFQAAAAAAEQAAAAAAEQAAAAAAEQAAAAADEQAAAAACGQAAAAABEQAAAAACEQAAAAACEQAAAAADEQAAAAACEQAAAAADEQAAAAADEQAAAAAAEQAAAAAAEQAAAAACAgAAAAAAFQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAABEQAAAAABEQAAAAACEQAAAAABEQAAAAABEQAAAAACEQAAAAADEQAAAAAAEQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAGQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFQAAAAAAAgAAAAAAEAAAAAAAHQAAAAAAEAAAAAAAAgAAAAAAEQAAAAAAEQAAAAACEQAAAAACEQAAAAADEQAAAAAAEQAAAAADEQAAAAACEQAAAAACEQAAAAABAgAAAAAAKwAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAEQAAAAAAEQAAAAABEQAAAAAAEQAAAAABEQAAAAAAEQAAAAABEQAAAAADEQAAAAABEQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAAgAAAAAAEQAAAAACEQAAAAABEQAAAAABEQAAAAACEQAAAAACEQAAAAACEQAAAAADEQAAAAABEQAAAAABAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAAAEQAAAAACEQAAAAABAgAAAAAAEQAAAAACEQAAAAADEQAAAAABEQAAAAAAEQAAAAACEQAAAAABEQAAAAABEQAAAAADEQAAAAADAgAAAAAAAgAAAAAAFAAAAAABEQAAAAACEQAAAAADEQAAAAAAAgAAAAAAEQAAAAADEQAAAAACEQAAAAAAEQAAAAABEQAAAAAAEQAAAAADEQAAAAADEQAAAAACEQAAAAABAgAAAAAAKwAAAAADAgAAAAAAEQAAAAACEQAAAAABEQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAADEQAAAAABEQAAAAADEQAAAAACGwAAAAAAGwAAAAACGwAAAAAAGwAAAAACGwAAAAADGwAAAAABGwAAAAAAGwAAAAABGwAAAAADGwAAAAACGwAAAAACFAAAAAAAEQAAAAACEQAAAAACEQAAAAABEQAAAAADGwAAAAACGwAAAAADGwAAAAAAGwAAAAACGwAAAAABGwAAAAABGwAAAAACGwAAAAAAGwAAAAABGwAAAAABGwAAAAABEQAAAAABEQAAAAABEQAAAAAAEQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAAAEQAAAAACEQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAEQAAAAAAEQAAAAACEQAAAAAAEQAAAAAAGgAAAAAAFAAAAAABFAAAAAAAFAAAAAACFAAAAAACFAAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAEQAAAAACEQAAAAADEQAAAAAAGgAAAAAAFAAAAAABFAAAAAAAFAAAAAAAFAAAAAABFAAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAA + tiles: HQAAAAAAHQAAAAADEQAAAAAAEQAAAAABGQAAAAABEQAAAAADEQAAAAADHQAAAAAAHQAAAAAAHQAAAAADHQAAAAACHQAAAAADEQAAAAAAEQAAAAADAgAAAAAAFQAAAAAAEQAAAAAAEQAAAAAAEQAAAAADEQAAAAACGQAAAAABEQAAAAACEQAAAAACEQAAAAADEQAAAAACEQAAAAADEQAAAAADEQAAAAAAEQAAAAAAEQAAAAACAgAAAAAAFQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAABEQAAAAABEQAAAAACEQAAAAABEQAAAAABEQAAAAACEQAAAAADEQAAAAAAEQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAGQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAFQAAAAAAAgAAAAAAEAAAAAAAHQAAAAAAEAAAAAAAAgAAAAAANwAAAAAANwAAAAAAEQAAAAAAEQAAAAADEQAAAAAAEQAAAAADEQAAAAACEQAAAAACEQAAAAABAgAAAAAAKwAAAAAAAgAAAAAAEAAAAAAAEAAAAAAAEAAAAAAAAgAAAAAANwAAAAAANwAAAAAAEQAAAAAAEQAAAAABEQAAAAAAEQAAAAABEQAAAAADEQAAAAABEQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAAgAAAAAANwAAAAAANwAAAAAAEQAAAAAAEQAAAAACEQAAAAACEQAAAAACEQAAAAADEQAAAAABEQAAAAABAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAAAEQAAAAACEQAAAAABAgAAAAAANwAAAAAANwAAAAAAEQAAAAAAEQAAAAAAEQAAAAACEQAAAAABEQAAAAABEQAAAAADEQAAAAADAgAAAAAAAgAAAAAAFAAAAAABEQAAAAACEQAAAAADEQAAAAAAAgAAAAAANwAAAAAANwAAAAAAEQAAAAAAEQAAAAABEQAAAAAAEQAAAAADEQAAAAADEQAAAAACEQAAAAABAgAAAAAAKwAAAAADAgAAAAAAEQAAAAACEQAAAAABEQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAGQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAADEQAAAAABEQAAAAADEQAAAAACGwAAAAAAGwAAAAACGwAAAAAAGwAAAAACGwAAAAADGwAAAAABGwAAAAAAGwAAAAABGwAAAAADGwAAAAACGwAAAAACFAAAAAAAEQAAAAACEQAAAAACEQAAAAABEQAAAAADGwAAAAACGwAAAAADGwAAAAAAGwAAAAACGwAAAAABGwAAAAABGwAAAAACGwAAAAAAGwAAAAABGwAAAAABGwAAAAABEQAAAAABEQAAAAABEQAAAAAAEQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAEQAAAAAAEQAAAAAAEQAAAAACEQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAEQAAAAAAEQAAAAACEQAAAAAAEQAAAAAAGgAAAAAAFAAAAAABFAAAAAAAFAAAAAACFAAAAAACFAAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAEQAAAAACEQAAAAADEQAAAAAAGgAAAAAAFAAAAAABFAAAAAAAFAAAAAAAFAAAAAABFAAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAA version: 6 0,2: ind: 0,2 @@ -263,7 +265,7 @@ entities: version: 6 3,-3: ind: 3,-3 - tiles: DgAAAAAADgAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAKgAAAAAAKgAAAAACKgAAAAAAKgAAAAAAKgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAHKgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAgAAAAAAKgAAAAAAKgAAAAALKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAABKgAAAAAAKgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAADKgAAAAAAKgAAAAABKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAADgAAAAAADgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAGKgAAAAAAKgAAAAAGKgAAAAAAKgAAAAACKgAAAAAAKgAAAAAAKgAAAAAKKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAMKgAAAAAAFAAAAAAAAgAAAAAAFAAAAAABFAAAAAABFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAABFAAAAAACFAAAAAAAAgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAFAAAAAACFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAADFAAAAAACFAAAAAADFAAAAAABAgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAACFAAAAAABFAAAAAAAFAAAAAADFAAAAAACFAAAAAAAFAAAAAACFAAAAAACFAAAAAADAgAAAAAAKgAAAAAAKgAAAAAAFAAAAAABAgAAAAAAFAAAAAADFAAAAAABFAAAAAAAFAAAAAADFAAAAAACFAAAAAAAFAAAAAABFAAAAAADFAAAAAACFAAAAAACFAAAAAAAAgAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAA + tiles: DgAAAAAADgAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAAMQAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAKgAAAAAAKgAAAAACKgAAAAAAKgAAAAAAKgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAHKgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAgAAAAAAKgAAAAAAKgAAAAALKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAABKgAAAAAAKgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAADKgAAAAAAKgAAAAABKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAADgAAAAAADgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAGKgAAAAAAKgAAAAAGKgAAAAAAKgAAAAACKgAAAAAAKgAAAAAAKgAAAAAKKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAKgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAKgAAAAAMKgAAAAAAFAAAAAAAFAAAAAAAFAAAAAABFAAAAAABFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAABFAAAAAACFAAAAAAAFAAAAAAAFAAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAFAAAAAACFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAADFAAAAAACFAAAAAADFAAAAAABFAAAAAAAAgAAAAAAKgAAAAAAKgAAAAAAFAAAAAABFAAAAAACFAAAAAAAFAAAAAABFAAAAAACFAAAAAABFAAAAAAAFAAAAAADFAAAAAACFAAAAAAAFAAAAAACFAAAAAACFAAAAAADAgAAAAAAKgAAAAAAKgAAAAAAFAAAAAABFAAAAAAAFAAAAAADFAAAAAABFAAAAAAAFAAAAAADFAAAAAACFAAAAAAAFAAAAAABFAAAAAADFAAAAAACFAAAAAACFAAAAAAAAgAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAADwAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAADgAAAAAA version: 6 -1,2: ind: -1,2 @@ -524,8 +526,6 @@ entities: color: '#FFFFFFFF' id: Box decals: - 1732: 49,-37 - 1733: 49,-38 2339: -7,-51 2340: -5,-53 - node: @@ -744,11 +744,17 @@ entities: id: BrickTileDarkInnerNw decals: 884: -55,7 + 4183: 23,37 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerSe decals: 3865: 23,8 + - node: + color: '#FFFFFFFF' + id: BrickTileDarkInnerSw + decals: + 4182: 23,39 - node: color: '#FFFFFFFF' id: BrickTileDarkLineE @@ -769,6 +775,10 @@ entities: 4062: 48,-7 4063: 48,-8 4064: 48,-9 + 4168: 22,36 + 4169: 22,37 + 4170: 22,38 + 4171: 22,39 - node: color: '#FFFFFFFF' id: BrickTileDarkLineN @@ -801,6 +811,7 @@ entities: 4067: 52,-7 4068: 52,-6 4069: 52,-6 + 4185: 23,38 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerNe @@ -1359,7 +1370,6 @@ entities: 1394: 50,-6 1395: 48,-6 1418: 47,-8 - 1419: 46,-8 1438: 40,-15 1439: 40,-14 1440: 40,-13 @@ -1436,7 +1446,6 @@ entities: 1847: 23,34 1848: 25,34 1849: 25,40 - 1850: 23,40 1864: 22,31 2494: 3,49 2498: 19,43 @@ -1564,7 +1573,6 @@ entities: 1397: 48,-7 1398: 48,-8 1399: 47,-8 - 1400: 46,-8 1401: 46,-9 1420: 50,-6 1432: 52,-6 @@ -1815,6 +1823,7 @@ entities: 3454: 52,-7 3455: 52,-6 4058: 48,-13 + 4211: 48,-9 - node: color: '#EFB34196' id: BrickTileWhiteInnerSe @@ -1964,7 +1973,6 @@ entities: 1358: 33,-9 1421: 48,-7 1422: 48,-6 - 1423: 46,-8 1424: 46,-9 1453: 30,-13 1454: 32,-13 @@ -3128,6 +3136,13 @@ entities: id: Caution decals: 3544: 56.20735,16.017925 + - node: + angle: 4.71238898038469 rad + color: '#FFFFFFFF' + id: Caution + decals: + 4148: 48,-38 + 4149: 48,-37 - node: color: '#DE3A3A96' id: CheckerNESW @@ -4178,6 +4193,12 @@ entities: id: HalfTileOverlayGreyscale90 decals: 3741: 19,36 + - node: + angle: 1.5707963267948966 rad + color: '#FFFFFFFF' + id: LoadingArea + decals: + 4150: 51,-39 - node: color: '#EFB34196' id: MiniTileCornerOverlayNE @@ -5156,7 +5177,6 @@ entities: 1203: -2,31 1271: 47,-2 1272: 47,-3 - 1273: 46,-3 1274: 44,-1 1275: 42,-1 1276: 39,-1 @@ -5966,7 +5986,6 @@ entities: decals: 266: -30,-39 683: 37,-7 - 689: 44,-5 737: -4,38 738: -12,33 779: -16,32 @@ -5984,6 +6003,8 @@ entities: 3641: -16,13 3642: -30,-35 3782: 15,37 + 4193: 46,-4 + 4199: 43,-5 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNw @@ -6010,12 +6031,12 @@ entities: 2830: 39,23 3615: 7,-19 3781: 12,37 + 4194: 45,-4 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerSe decals: 687: 37,-5 - 702: 44,-7 741: -12,31 742: -4,31 781: -16,27 @@ -6032,6 +6053,7 @@ entities: 3640: -16,15 3643: -30,-37 3728: -30,-41 + 4190: 46,-6 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerSw @@ -6062,16 +6084,11 @@ entities: decals: 669: 38,-3 670: 38,-9 - - node: - color: '#FFFFFFFF' - id: WoodTrimThinEndN - decals: - 917: 46,-5 - node: color: '#FFFFFFFF' id: WoodTrimThinEndS decals: - 918: 46,-6 + 4208: 45,-7 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNe @@ -6079,6 +6096,7 @@ entities: 685: 37,-9 868: -53,10 3634: -16,12 + 4203: 43,-7 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNw @@ -6086,11 +6104,13 @@ entities: 869: -55,10 916: 38,15 3635: -11,12 + 4195: 45,-5 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSe decals: 688: 37,-3 + 4189: 44,-6 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSw @@ -6114,7 +6134,6 @@ entities: 280: -32.29232,-41.003887 684: 37,-8 686: 37,-4 - 703: 44,-6 752: -4,32 753: -4,33 754: -4,34 @@ -6144,6 +6163,8 @@ entities: 3776: 15,34 3777: 15,35 3778: 15,36 + 4196: 46,-5 + 4206: 43,-7 - node: color: '#FFFFFFFF' id: WoodTrimThinLineN @@ -6159,7 +6180,6 @@ entities: 698: 41,-5 699: 41,-5 700: 42,-5 - 701: 43,-5 759: -5,38 760: -6,38 761: -7,38 @@ -6194,6 +6214,7 @@ entities: 3629: -12,12 3783: 14,37 3784: 13,37 + 4207: 44,-7 - node: color: '#FFFFFFFF' id: WoodTrimThinLineS @@ -6238,6 +6259,7 @@ entities: 943: 16,-32 3618: 9,-21 3619: 8,-21 + 4201: 44,-5 - node: color: '#FFFFFFFF' id: WoodTrimThinLineW @@ -6274,6 +6296,7 @@ entities: 3632: -11,15 3779: 12,35 3780: 12,36 + 4200: 45,-5 - type: GridAtmosphere version: 2 data: @@ -6473,9 +6496,7 @@ entities: -5,4: 0: 61944 -4,5: - 1: 53244 - 2: 4096 - 3: 8192 + 1: 65532 -5,5: 1: 3264 0: 305 @@ -6535,7 +6556,7 @@ entities: -9,-2: 0: 43176 -8,-1: - 0: 65295 + 0: 65375 -9,-1: 0: 63528 -8,0: @@ -6660,7 +6681,6 @@ entities: 0: 65535 4,4: 0: 43699 - 4: 16384 4,5: 0: 61182 4,6: @@ -6696,9 +6716,9 @@ entities: 7,4: 0: 65486 7,5: - 0: 4095 + 0: 65535 7,6: - 0: 819 + 0: 816 7,7: 0: 47887 7,3: @@ -6708,7 +6728,7 @@ entities: 8,4: 0: 16257 8,5: - 0: 3003 + 0: 15291 8,7: 0: 65295 5,0: @@ -6793,7 +6813,7 @@ entities: 5,-8: 0: 51677 5,-7: - 0: 2047 + 0: 4095 5,-6: 0: 65527 5,-9: @@ -6802,7 +6822,7 @@ entities: 6,-8: 0: 43195 6,-7: - 0: 65466 + 0: 65450 6,-6: 0: 56782 6,-9: @@ -6848,7 +6868,7 @@ entities: 2,-8: 0: 51 2,-7: - 0: 4080 + 0: 20464 2,-6: 0: 28927 2,-9: @@ -6920,7 +6940,7 @@ entities: -5,-9: 0: 65535 -4,-12: - 0: 61661 + 0: 62685 -4,-13: 0: 56784 -5,-12: @@ -7062,8 +7082,7 @@ entities: 8,-9: 0: 65520 9,-8: - 0: 45167 - 5: 16 + 0: 45183 9,-6: 0: 65376 9,-5: @@ -7119,7 +7138,7 @@ entities: 10,-10: 0: 62207 10,-13: - 6: 9902 + 2: 9902 11,-12: 0: 4913 11,-11: @@ -7128,11 +7147,11 @@ entities: 0: 65262 11,-13: 0: 4352 - 6: 127 + 2: 127 12,-10: - 0: 65488 + 0: 65520 12,-9: - 0: 65293 + 0: 65295 9,-3: 0: 62719 9,-2: @@ -7142,8 +7161,7 @@ entities: 9,0: 0: 53759 10,-3: - 0: 55583 - 4: 1024 + 0: 56607 10,-2: 0: 65529 10,-1: @@ -7153,9 +7171,9 @@ entities: 11,-3: 0: 56783 11,-2: - 0: 22300 + 0: 30520 11,-1: - 0: 65252 + 0: 65094 11,0: 0: 62207 12,-4: @@ -7235,14 +7253,14 @@ entities: 12,6: 0: 48911 12,7: - 6: 65520 + 2: 65520 -12,-12: 0: 13119 -12,-13: 0: 65427 -13,-12: 0: 56524 - 7: 17 + 6: 17 -12,-11: 0: 60931 -13,-11: @@ -7340,70 +7358,70 @@ entities: -13,1: 0: 57296 -12,1: - 6: 36352 + 2: 36352 -12,3: - 6: 34956 + 2: 34956 -11,1: 0: 127 - 6: 30464 + 2: 30464 -12,2: - 6: 34952 + 2: 34952 -11,2: - 6: 255 - 8: 57344 + 2: 255 + 3: 57344 -12,4: - 6: 53192 + 2: 53192 -11,3: - 6: 61440 - 9: 224 + 2: 61440 + 4: 224 -10,1: 0: 40847 -10,2: - 6: 51 + 2: 51 0: 43656 -10,3: - 6: 12288 + 2: 12288 0: 35498 -10,4: 0: 43690 -13,4: - 6: 32630 + 2: 32630 -12,7: - 6: 52476 + 2: 52476 -13,7: - 6: 26615 + 2: 26615 -12,6: - 6: 51336 + 2: 51336 -12,5: - 6: 34952 + 2: 34952 -11,6: - 6: 61440 - 7: 224 + 2: 61440 + 6: 224 -11,7: - 6: 65535 + 2: 65535 -12,8: - 6: 34952 + 2: 34952 -11,4: - 10: 224 - 7: 57344 + 5: 224 + 6: 57344 -11,5: - 7: 57568 + 6: 57568 -11,8: - 6: 65535 + 2: 65535 -10,6: - 6: 12288 + 2: 12288 0: 35498 -10,7: - 6: 13107 + 2: 13107 0: 34952 -10,5: 0: 43690 -10,8: - 6: 62259 + 2: 62259 0: 136 -9,8: 0: 52479 - 6: 4096 + 2: 4096 0,-16: 0: 65528 -1,-16: @@ -7423,28 +7441,27 @@ entities: 1,-15: 0: 52481 1,-14: - 0: 55773 - 4: 1024 + 0: 56797 1,-17: 0: 4371 2,-15: 0: 65280 - 6: 3 + 2: 3 2,-14: 0: 65535 2,-16: - 6: 27776 + 2: 27776 3,-16: - 6: 57375 + 2: 57375 3,-15: 0: 30464 - 6: 11 + 2: 11 3,-14: 0: 30583 4,-16: - 6: 4883 + 2: 4883 4,-14: - 6: 2304 + 2: 2304 -4,-15: 0: 65102 -4,-14: @@ -7482,25 +7499,25 @@ entities: -9,-13: 0: 4095 -7,-15: - 7: 61184 + 6: 61184 -7,-14: 0: 32752 -6,-15: - 7: 256 + 6: 256 0: 32768 -6,-14: 0: 65528 -12,-16: - 6: 4880 + 2: 4880 -13,-16: - 6: 65520 + 2: 65520 -12,-15: 0: 53128 -12,-14: 0: 30487 -13,-14: 0: 52232 - 6: 23 + 2: 23 -11,-16: 0: 4352 -11,-15: @@ -7518,32 +7535,32 @@ entities: -10,-16: 0: 8704 -10,-17: - 7: 49152 + 6: 49152 -16,-7: - 6: 52416 + 2: 52416 -16,-6: - 6: 3276 + 2: 3276 0: 32768 -16,-5: 0: 35852 -16,-4: - 6: 52428 + 2: 52428 -15,-7: - 6: 4368 + 2: 4368 0: 3276 -15,-6: - 6: 273 + 2: 273 0: 52428 -15,-5: 0: 53199 -15,-4: - 6: 4369 + 2: 4369 0: 52420 -15,-8: 0: 52416 -15,-9: 0: 34952 - 7: 256 + 6: 256 -14,-8: 0: 49080 -14,-7: @@ -7563,31 +7580,31 @@ entities: -13,-7: 0: 26214 -16,-12: - 7: 32 + 6: 32 -16,-11: - 7: 32768 + 6: 32768 -16,-10: - 7: 8 + 6: 8 -15,-11: - 7: 13036 + 6: 13036 0: 32768 -15,-10: - 7: 307 + 6: 307 0: 34952 -15,-12: - 7: 51336 + 6: 51336 -14,-12: - 7: 4607 + 6: 4607 0: 49152 -14,-11: - 7: 17 + 6: 17 0: 61644 -14,-10: 0: 65535 -14,-13: - 7: 59392 + 6: 59392 -13,-13: - 7: 4352 + 6: 4352 0: 1604 8,9: 0: 65535 @@ -7619,25 +7636,25 @@ entities: 0: 275 10,12: 0: 305 - 6: 3276 + 2: 3276 11,9: 0: 4469 - 6: 49152 + 2: 49152 11,10: 0: 273 - 6: 52428 + 2: 52428 11,11: - 6: 61166 + 2: 61166 11,12: - 6: 53247 + 2: 53247 12,8: - 6: 13175 + 2: 13175 12,9: - 6: 13107 + 2: 13107 12,10: - 6: 63923 + 2: 63923 12,11: - 6: 61443 + 2: 61443 4,9: 0: 58606 3,9: @@ -7660,7 +7677,7 @@ entities: 0: 60928 5,12: 0: 238 - 6: 49152 + 2: 49152 6,9: 0: 65535 6,10: @@ -7739,10 +7756,10 @@ entities: 0: 48059 16,0: 0: 1793 - 6: 4 + 2: 4 16,1: 0: 7 - 6: 1024 + 2: 1024 13,-4: 0: 26471 13,-3: @@ -7761,22 +7778,22 @@ entities: 0: 61098 15,-4: 0: 4113 - 6: 34952 + 2: 34952 15,-3: 0: 4369 - 6: 34952 + 2: 34952 15,-2: 0: 16177 - 6: 8 + 2: 8 15,-5: 0: 4353 - 6: 34952 + 2: 34952 16,-2: 0: 1792 - 6: 4 + 2: 4 16,-1: 0: 4359 - 6: 17408 + 2: 17408 13,-8: 0: 15 13,-6: @@ -7790,49 +7807,49 @@ entities: 14,-9: 0: 36623 15,-8: - 7: 16 + 6: 16 15,-6: - 7: 16 + 6: 16 0: 4096 - 6: 32768 + 2: 32768 15,-9: 0: 4353 16,-5: - 6: 304 + 2: 304 12,-11: - 7: 49156 + 6: 32772 12,-12: - 6: 12 + 2: 12 12,-13: - 6: 52303 + 2: 52303 13,-12: - 6: 15 - 7: 16384 + 2: 15 + 6: 16384 13,-11: - 7: 65228 + 6: 65228 13,-10: 0: 65520 13,-13: - 6: 65295 + 2: 65295 14,-12: - 6: 15 + 2: 15 14,-11: - 7: 65521 + 6: 65521 14,-10: - 0: 65392 + 0: 65520 14,-13: - 6: 65295 + 2: 65295 15,-12: - 6: 1 + 2: 1 15,-11: - 7: 4112 + 6: 28688 15,-10: - 7: 52451 - 0: 4096 + 0: 4368 + 6: 52420 15,-13: - 6: 4511 + 2: 4511 16,-10: - 7: 19 + 6: 19 -4,9: 0: 7421 -5,9: @@ -7847,13 +7864,13 @@ entities: 0: 32767 -4,12: 0: 34945 - 7: 13072 + 6: 13072 -3,9: 0: 4095 -3,10: 0: 65535 -3,11: - 7: 61408 + 6: 61408 -2,9: 0: 4095 -2,10: @@ -7866,23 +7883,23 @@ entities: 0: 61678 -9,9: 0: 52430 - 6: 4369 + 2: 4369 -8,10: 0: 65535 -9,10: 0: 52428 -8,11: - 6: 43808 + 2: 43808 -9,11: - 6: 20224 + 2: 20224 -8,12: - 6: 43690 + 2: 43690 -7,9: 0: 45311 -7,10: 0: 49087 -7,11: - 6: 768 + 2: 768 0: 34952 -6,9: 0: 61661 @@ -7892,38 +7909,38 @@ entities: 0: 65535 -7,12: 0: 34952 - 6: 12322 + 2: 12322 -6,12: 0: 65535 -5,12: 0: 13111 - 7: 34816 + 6: 34816 -12,9: - 6: 65497 + 2: 65497 -13,9: - 6: 8 + 2: 8 -12,10: - 6: 52428 + 2: 52428 -11,9: - 6: 4607 - 7: 49152 + 2: 4607 + 6: 49152 -11,10: - 6: 33041 - 7: 204 + 2: 33041 + 6: 204 -12,11: - 6: 136 + 2: 136 -11,11: - 6: 248 + 2: 248 -10,9: - 6: 52479 - 7: 4096 + 2: 52479 + 6: 4096 -10,10: - 7: 17 - 6: 34952 + 6: 17 + 2: 34952 -10,11: - 6: 2296 + 2: 2296 -9,12: - 6: 17476 + 2: 17476 8,-15: 0: 65535 7,-15: @@ -7937,48 +7954,48 @@ entities: 9,-14: 0: 4403 10,-16: - 6: 3584 + 2: 3584 11,-16: - 6: 7936 + 2: 7936 10,-14: - 6: 34816 + 2: 34816 11,-14: - 6: 29489 + 2: 29489 11,-15: - 6: 4369 + 2: 4369 12,-16: - 6: 3840 + 2: 3840 4,-17: - 6: 4096 + 2: 4096 5,-14: - 6: 1024 + 2: 1024 6,-14: - 6: 512 + 2: 512 -8,13: - 6: 29666 + 2: 29666 -9,13: - 6: 3140 + 2: 3140 -8,14: - 6: 15 + 2: 15 -7,13: - 6: 32816 + 2: 32816 0: 1032 -7,14: - 6: 15 + 2: 15 -6,13: 0: 255 -6,14: - 6: 49 + 2: 49 -5,13: 0: 51 - 7: 51208 + 6: 51208 -5,14: - 7: 264 + 6: 264 -4,13: - 7: 29443 + 6: 29443 0: 136 -4,14: - 7: 3 + 6: 3 -3,12: 0: 65520 -3,13: @@ -7997,176 +8014,176 @@ entities: 0: 41634 1,14: 0: 8710 - 6: 34952 + 2: 34952 1,15: 0: 8226 - 6: 34952 + 2: 34952 1,16: 0: 8738 - 6: 34952 + 2: 34952 2,13: 0: 4280 2,14: - 6: 49023 + 2: 49023 2,15: - 6: 44974 + 2: 44974 2,16: - 6: 32702 + 2: 32702 3,13: 0: 255 3,14: - 6: 44847 + 2: 44847 3,15: - 6: 44463 + 2: 44463 0: 512 3,16: - 6: 12207 + 2: 12207 4,14: - 6: 61439 + 2: 61439 4,15: - 6: 44971 + 2: 44971 4,13: 0: 49376 4,16: - 6: 65515 + 2: 65515 5,15: 0: 8243 - 6: 1228 + 2: 1228 5,13: 0: 8738 - 7: 136 + 6: 136 5,14: 0: 546 - 6: 16384 + 2: 16384 5,16: 0: 8738 6,15: - 6: 255 + 2: 255 6,13: 0: 1262 7,13: 0: 1279 7,15: - 6: 255 + 2: 255 8,15: - 6: 255 + 2: 255 9,15: - 6: 255 + 2: 255 10,15: - 6: 55 + 2: 55 10,14: - 6: 65224 + 2: 65224 11,14: - 6: 311 + 2: 311 11,13: - 6: 65228 + 2: 65228 12,12: - 6: 65535 + 2: 65535 13,10: - 6: 17 + 2: 17 13,9: - 6: 13028 + 2: 13028 13,8: - 6: 19652 + 2: 19652 13,7: - 6: 20476 + 2: 20476 14,9: - 6: 248 + 2: 248 14,8: - 6: 52428 + 2: 52428 14,7: - 6: 51711 + 2: 51711 15,8: - 6: 56797 + 2: 56797 15,9: - 6: 248 + 2: 248 15,7: - 6: 55539 + 2: 55539 16,8: - 6: 56797 + 2: 56797 16,9: - 6: 248 + 2: 248 13,5: 0: 1911 13,6: 0: 4879 - 6: 52224 + 2: 52224 14,5: 0: 7633 14,6: 0: 15 - 6: 13056 + 2: 13056 15,5: 0: 35768 15,6: 0: 15 - 6: 13824 + 2: 13824 16,7: - 6: 55544 + 2: 55544 13,12: - 6: 4095 + 2: 4095 14,12: - 6: 4095 + 2: 4095 15,12: - 6: 4095 + 2: 4095 16,12: - 6: 883 + 2: 883 0,18: - 6: 49160 + 2: 49160 0,17: - 6: 34816 + 2: 34816 1,17: - 6: 24856 + 2: 24856 0: 3106 1,18: - 6: 64035 + 2: 64035 1,19: - 6: 200 + 2: 200 2,17: - 6: 57359 + 2: 57359 0: 1792 2,18: - 6: 4238 + 2: 4238 2,19: - 6: 240 + 2: 240 3,17: - 6: 61455 + 2: 61455 0: 1792 3,18: - 6: 255 + 2: 255 3,19: - 6: 240 + 2: 240 4,17: - 6: 12303 + 2: 12303 0: 3840 4,18: - 6: 51203 + 2: 51203 4,19: - 6: 248 + 2: 248 5,17: 0: 290 - 6: 48192 + 2: 48192 5,18: - 6: 61998 + 2: 61998 5,19: - 6: 16 + 2: 16 6,17: - 6: 18244 + 2: 18244 6,18: - 6: 4164 + 2: 4164 6,16: - 6: 16384 + 2: 16384 -15,0: - 6: 1 + 2: 1 0: 52428 -15,1: - 6: 4401 + 2: 4401 0: 34944 -15,2: - 6: 4369 + 2: 4369 0: 2176 -15,3: - 6: 34959 + 2: 34959 -15,-1: 0: 52732 -14,0: @@ -8176,49 +8193,49 @@ entities: -14,2: 0: 61439 -14,3: - 6: 61440 + 2: 61440 0: 14 -14,-1: 0: 65535 -13,2: 0: 817 - 6: 128 + 2: 128 -13,3: - 6: 12834 + 2: 12834 -13,5: - 6: 8742 + 2: 8742 -13,6: - 6: 25122 + 2: 25122 -13,8: - 6: 50722 + 2: 50722 -16,-16: - 6: 30583 + 2: 30583 -16,-17: - 6: 29187 + 2: 29187 -16,-15: - 6: 29426 + 2: 29426 -17,-15: - 6: 29426 + 2: 29426 -16,-14: - 6: 30583 + 2: 30583 -16,-13: - 6: 2 + 2: 2 -15,-15: - 6: 240 + 2: 240 -15,-16: - 6: 65520 + 2: 65520 -15,-13: - 7: 64 + 6: 64 -14,-16: - 6: 24404 + 2: 24404 -14,-15: - 6: 52980 + 2: 52980 -14,-17: - 6: 24404 + 2: 24404 -13,-15: - 6: 29456 + 2: 29456 -14,-14: - 6: 8 + 2: 8 0,-20: 0: 34952 0,-19: @@ -8252,14 +8269,14 @@ entities: -2,-18: 0: 4096 -16,-3: - 6: 17612 + 2: 17612 -16,-2: - 6: 4 + 2: 4 0: 51200 -16,-1: 0: 2240 -15,-3: - 6: 1 + 2: 1 0: 56780 -15,-2: 0: 64973 @@ -8268,131 +8285,131 @@ entities: -14,-2: 0: 65535 16,4: - 6: 25188 + 2: 25188 16,5: - 6: 58914 + 2: 58914 16,6: - 6: 34946 + 2: 34946 16,3: - 6: 18018 + 2: 18018 17,5: - 6: 61440 + 2: 61440 17,6: - 6: 65520 + 2: 65520 17,7: - 6: 55536 + 2: 55536 17,8: - 6: 56797 + 2: 56797 18,5: - 6: 61440 + 2: 61440 18,6: - 6: 65520 + 2: 65520 18,7: - 6: 55536 + 2: 55536 18,8: - 6: 56797 + 2: 56797 19,5: - 6: 61440 + 2: 61440 19,6: - 6: 48056 + 2: 48056 19,7: - 6: 39162 + 2: 39162 19,8: - 6: 39321 + 2: 39321 20,7: - 6: 16 + 2: 16 16,2: - 6: 8192 + 2: 8192 -12,-19: - 6: 61440 + 2: 61440 -13,-19: - 6: 61440 + 2: 61440 -12,-18: - 6: 4880 + 2: 4880 -13,-18: - 6: 65520 + 2: 65520 -12,-17: - 6: 4880 + 2: 4880 -13,-17: - 6: 65520 + 2: 65520 -11,-19: - 6: 61440 + 2: 61440 -10,-19: - 6: 4096 + 2: 4096 -10,-18: - 7: 4 + 6: 4 -18,-12: - 6: 68 + 2: 68 -18,-13: - 6: 17476 + 2: 17476 -18,-15: - 6: 17636 + 2: 17636 -18,-16: - 6: 17476 + 2: 17476 -18,-17: - 6: 17484 + 2: 17484 -18,-14: - 6: 17476 + 2: 17476 -17,-16: - 6: 30583 + 2: 30583 -17,-17: - 6: 29199 + 2: 29199 -17,-14: - 6: 30583 + 2: 30583 -17,-13: - 6: 2 + 2: 2 16,-12: - 6: 546 + 2: 546 16,-13: - 6: 8743 + 2: 8743 -16,-19: - 6: 57344 + 2: 57344 -16,-18: - 6: 10786 + 2: 10786 -15,-19: - 6: 61440 + 2: 61440 -15,-18: - 6: 65520 + 2: 65520 -15,-17: - 6: 65520 + 2: 65520 -14,-19: - 6: 62464 + 2: 62464 -14,-18: - 6: 24404 + 2: 24404 12,-15: - 6: 30496 + 2: 30496 12,-14: - 6: 10103 + 2: 10103 13,-16: - 6: 3840 + 2: 3840 13,-15: - 6: 30496 + 2: 30496 13,-14: - 6: 10103 + 2: 10103 14,-16: - 6: 3840 + 2: 3840 14,-15: - 6: 30496 + 2: 30496 14,-14: - 6: 10103 + 2: 10103 15,-16: - 6: 3840 + 2: 3840 15,-15: - 6: 30496 + 2: 30496 15,-14: - 6: 10103 + 2: 10103 16,-16: - 6: 8960 + 2: 8960 16,-15: - 6: 8738 + 2: 8738 16,-14: - 6: 8738 + 2: 8738 17,9: - 6: 248 + 2: 248 18,9: - 6: 248 + 2: 248 19,9: - 6: 248 + 2: 248 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -8424,66 +8441,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 235 - moles: - - 26.653654 - - 100.26852 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 235 - moles: - - 26.782158 - - 100.75194 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.14975 - moles: - - 20.078888 - - 75.53487 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 20.078888 - - 75.53487 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 immutable: True moles: @@ -8499,21 +8456,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 temperature: 293.15 moles: @@ -8559,6 +8501,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -12702,7 +12659,7 @@ entities: pos: 38.5,-9.5 parent: 2 - type: Door - secondsUntilStateChange: -87827.695 + secondsUntilStateChange: -96552.94 state: Opening - type: DeviceLinkSource lastSignals: @@ -14543,24 +14500,18 @@ entities: parent: 2 - proto: AirlockHeadOfPersonnelLocked entities: - - uid: 4 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 45.5,-5.5 - parent: 2 - - uid: 5 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 46.5,-3.5 - parent: 2 - uid: 356 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-7.5 parent: 2 + - uid: 4568 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 46.5,-2.5 + parent: 2 - proto: AirlockHeadOfSecurityGlassLocked entities: - uid: 4315 @@ -14633,7 +14584,7 @@ entities: pos: -22.5,26.5 parent: 2 - type: Door - secondsUntilStateChange: -109879.86 + secondsUntilStateChange: -118605.1 state: Opening - type: DeviceLinkSource lastSignals: @@ -15498,7 +15449,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -208708.47 + secondsUntilStateChange: -217433.7 state: Opening - uid: 6934 components: @@ -15510,7 +15461,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -208711.1 + secondsUntilStateChange: -217436.33 state: Opening - uid: 6935 components: @@ -15522,7 +15473,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -208709.95 + secondsUntilStateChange: -217435.19 state: Opening - uid: 6936 components: @@ -15533,7 +15484,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -208709.17 + secondsUntilStateChange: -217434.4 state: Opening - proto: AirlockTheatreLocked entities: @@ -17217,11 +17168,16 @@ entities: - type: Transform pos: 12.5,-18.5 parent: 2 - - uid: 3554 + - uid: 3049 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 45.5,-4.5 + pos: 43.5,-30.5 + parent: 2 + - uid: 3462 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 46.5,-6.5 parent: 2 - uid: 3610 components: @@ -17229,11 +17185,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,2.5 parent: 2 - - uid: 4518 - components: - - type: Transform - pos: 43.5,-30.5 - parent: 2 - uid: 5517 components: - type: Transform @@ -17554,6 +17505,11 @@ entities: parent: 2 - proto: AsteroidRock entities: + - uid: 1405 + components: + - type: Transform + pos: 50.5,-40.5 + parent: 2 - uid: 2256 components: - type: Transform @@ -17984,21 +17940,11 @@ entities: - type: Transform pos: 61.5,-41.5 parent: 2 - - uid: 19220 - components: - - type: Transform - pos: 61.5,-40.5 - parent: 2 - uid: 19221 components: - type: Transform pos: 62.5,-41.5 parent: 2 - - uid: 19222 - components: - - type: Transform - pos: 62.5,-40.5 - parent: 2 - uid: 19223 components: - type: Transform @@ -18014,11 +17960,6 @@ entities: - type: Transform pos: 64.5,-40.5 parent: 2 - - uid: 19226 - components: - - type: Transform - pos: 62.5,-39.5 - parent: 2 - uid: 19227 components: - type: Transform @@ -36507,6 +36448,24 @@ entities: parent: 21002 - proto: AtmosFixBlockerMarker entities: + - uid: 1354 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 61.5,-40.5 + parent: 2 + - uid: 1368 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 62.5,-40.5 + parent: 2 + - uid: 1403 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 62.5,-39.5 + parent: 2 - uid: 2223 components: - type: Transform @@ -37082,11 +37041,6 @@ entities: - type: Transform pos: 50.5,-43.5 parent: 2 - - uid: 28783 - components: - - type: Transform - pos: 50.5,-40.5 - parent: 2 - uid: 28784 components: - type: Transform @@ -37227,21 +37181,6 @@ entities: - type: Transform pos: 54.5,-44.5 parent: 2 - - uid: 28812 - components: - - type: Transform - pos: 60.5,-39.5 - parent: 2 - - uid: 28813 - components: - - type: Transform - pos: 61.5,-39.5 - parent: 2 - - uid: 28814 - components: - - type: Transform - pos: 61.5,-38.5 - parent: 2 - uid: 28815 components: - type: Transform @@ -39124,7 +39063,7 @@ entities: - uid: 3492 components: - type: Transform - pos: 41.24941,-4.1411743 + pos: 42.21155,-4.3455667 parent: 2 - uid: 9379 components: @@ -39161,7 +39100,7 @@ entities: - uid: 3490 components: - type: Transform - pos: 41.259827,-4.432841 + pos: 42.22197,-4.5122337 parent: 2 - uid: 9380 components: @@ -39304,7 +39243,7 @@ entities: - uid: 3491 components: - type: Transform - pos: 41.270245,-4.2661743 + pos: 42.21155,-4.2518167 parent: 2 - uid: 4433 components: @@ -39776,6 +39715,11 @@ entities: parent: 2 - proto: CableApcExtension entities: + - uid: 5 + components: + - type: Transform + pos: 46.5,-5.5 + parent: 2 - uid: 485 components: - type: Transform @@ -41371,6 +41315,36 @@ entities: - type: Transform pos: -20.5,-5.5 parent: 2 + - uid: 2669 + components: + - type: Transform + pos: 43.5,-32.5 + parent: 2 + - uid: 2689 + components: + - type: Transform + pos: 33.5,23.5 + parent: 2 + - uid: 2690 + components: + - type: Transform + pos: 33.5,21.5 + parent: 2 + - uid: 2692 + components: + - type: Transform + pos: 33.5,20.5 + parent: 2 + - uid: 2693 + components: + - type: Transform + pos: 33.5,18.5 + parent: 2 + - uid: 2701 + components: + - type: Transform + pos: 33.5,19.5 + parent: 2 - uid: 2764 components: - type: Transform @@ -42686,26 +42660,26 @@ entities: - type: Transform pos: 43.5,8.5 parent: 2 + - uid: 3409 + components: + - type: Transform + pos: 46.5,-4.5 + parent: 2 + - uid: 3460 + components: + - type: Transform + pos: 43.5,-30.5 + parent: 2 - uid: 3514 components: - type: Transform pos: -15.5,21.5 parent: 2 - - uid: 3555 - components: - - type: Transform - pos: 45.5,-4.5 - parent: 2 - uid: 3556 components: - type: Transform pos: 45.5,-5.5 parent: 2 - - uid: 3557 - components: - - type: Transform - pos: 45.5,-5.5 - parent: 2 - uid: 3558 components: - type: Transform @@ -43096,25 +43070,20 @@ entities: - type: Transform pos: 40.5,20.5 parent: 2 + - uid: 4095 + components: + - type: Transform + pos: 33.5,22.5 + parent: 2 - uid: 4439 components: - type: Transform pos: 58.5,-4.5 parent: 2 - - uid: 4568 + - uid: 4548 components: - type: Transform - pos: 43.5,-30.5 - parent: 2 - - uid: 4569 - components: - - type: Transform - pos: 43.5,-31.5 - parent: 2 - - uid: 4570 - components: - - type: Transform - pos: 43.5,-32.5 + pos: 32.5,23.5 parent: 2 - uid: 4571 components: @@ -44006,30 +43975,10 @@ entities: - type: Transform pos: 33.5,18.5 parent: 2 - - uid: 4959 - components: - - type: Transform - pos: 33.5,19.5 - parent: 2 - - uid: 4960 - components: - - type: Transform - pos: 33.5,20.5 - parent: 2 - - uid: 4961 - components: - - type: Transform - pos: 32.5,20.5 - parent: 2 - uid: 4962 components: - type: Transform - pos: 31.5,20.5 - parent: 2 - - uid: 4963 - components: - - type: Transform - pos: 30.5,20.5 + pos: 30.5,23.5 parent: 2 - uid: 4964 components: @@ -53086,6 +53035,11 @@ entities: - type: Transform pos: 43.5,29.5 parent: 2 + - uid: 20763 + components: + - type: Transform + pos: 46.5,-6.5 + parent: 2 - uid: 20946 components: - type: Transform @@ -57686,6 +57640,76 @@ entities: - type: Transform pos: 25.5,-27.5 parent: 2 + - uid: 30260 + components: + - type: Transform + pos: 43.5,-31.5 + parent: 2 + - uid: 30266 + components: + - type: Transform + pos: 46.5,-3.5 + parent: 2 + - uid: 30274 + components: + - type: Transform + pos: 29.5,23.5 + parent: 2 + - uid: 30275 + components: + - type: Transform + pos: 28.5,23.5 + parent: 2 + - uid: 30276 + components: + - type: Transform + pos: 31.5,23.5 + parent: 2 + - uid: 30277 + components: + - type: Transform + pos: 28.5,22.5 + parent: 2 + - uid: 30278 + components: + - type: Transform + pos: 28.5,21.5 + parent: 2 + - uid: 30279 + components: + - type: Transform + pos: 28.5,20.5 + parent: 2 + - uid: 30280 + components: + - type: Transform + pos: 28.5,19.5 + parent: 2 + - uid: 30281 + components: + - type: Transform + pos: 28.5,18.5 + parent: 2 + - uid: 30282 + components: + - type: Transform + pos: 29.5,18.5 + parent: 2 + - uid: 30283 + components: + - type: Transform + pos: 30.5,18.5 + parent: 2 + - uid: 30284 + components: + - type: Transform + pos: 31.5,18.5 + parent: 2 + - uid: 30285 + components: + - type: Transform + pos: 32.5,18.5 + parent: 2 - proto: CableApcStack entities: - uid: 30075 @@ -60075,11 +60099,6 @@ entities: - type: Transform pos: 35.5,39.5 parent: 2 - - uid: 6450 - components: - - type: Transform - pos: 32.5,40.5 - parent: 2 - uid: 6451 components: - type: Transform @@ -65427,6 +65446,16 @@ entities: - type: Transform pos: 53.5,-17.5 parent: 2 + - uid: 2614 + components: + - type: Transform + pos: 43.5,-31.5 + parent: 2 + - uid: 2740 + components: + - type: Transform + pos: 42.5,-31.5 + parent: 2 - uid: 3299 components: - type: Transform @@ -65437,6 +65466,11 @@ entities: - type: Transform pos: -29.5,-0.5 parent: 2 + - uid: 3395 + components: + - type: Transform + pos: 43.5,-30.5 + parent: 2 - uid: 3653 components: - type: Transform @@ -65472,6 +65506,11 @@ entities: - type: Transform pos: 43.5,-17.5 parent: 2 + - uid: 4133 + components: + - type: Transform + pos: 46.5,-5.5 + parent: 2 - uid: 4154 components: - type: Transform @@ -65612,21 +65651,6 @@ entities: - type: Transform pos: 41.5,-31.5 parent: 2 - - uid: 4547 - components: - - type: Transform - pos: 42.5,-31.5 - parent: 2 - - uid: 4548 - components: - - type: Transform - pos: 43.5,-31.5 - parent: 2 - - uid: 4549 - components: - - type: Transform - pos: 43.5,-30.5 - parent: 2 - uid: 4550 components: - type: Transform @@ -68337,6 +68361,11 @@ entities: - type: Transform pos: 10.5,49.5 parent: 2 + - uid: 7721 + components: + - type: Transform + pos: 46.5,-6.5 + parent: 2 - uid: 8114 components: - type: Transform @@ -70047,11 +70076,6 @@ entities: - type: Transform pos: -40.5,5.5 parent: 2 - - uid: 18146 - components: - - type: Transform - pos: 45.5,-4.5 - parent: 2 - uid: 18147 components: - type: Transform @@ -72033,6 +72057,16 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,-4.5 parent: 2 + - uid: 3555 + components: + - type: Transform + pos: 29.5,22.5 + parent: 2 + - uid: 4960 + components: + - type: Transform + pos: 30.5,22.5 + parent: 2 - uid: 5869 components: - type: Transform @@ -72063,6 +72097,16 @@ entities: - type: Transform pos: -19.5,-3.5 parent: 2 + - uid: 19220 + components: + - type: Transform + pos: 31.5,22.5 + parent: 2 + - uid: 30267 + components: + - type: Transform + pos: 32.5,22.5 + parent: 2 - proto: CarpetChapel entities: - uid: 773 @@ -77561,12 +77605,6 @@ entities: parent: 2 - proto: ChairFoldingSpawnFolded entities: - - uid: 6852 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.46788,36.60081 - parent: 2 - uid: 12425 components: - type: Transform @@ -77596,6 +77634,11 @@ entities: rot: 3.141592653589793 rad pos: 48.48059,9.701607 parent: 2 + - uid: 30298 + components: + - type: Transform + pos: -19.127499,34.762245 + parent: 2 - proto: ChairGreyscale entities: - uid: 342 @@ -77704,6 +77747,12 @@ entities: rot: 1.5707963267948966 rad pos: -3.5,-27.5 parent: 2 + - uid: 1349 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 43.594894,-32.38475 + parent: 2 - uid: 1638 components: - type: Transform @@ -77779,6 +77828,12 @@ entities: rot: 3.141592653589793 rad pos: 20.5,-39.5 parent: 2 + - uid: 4129 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 23.50942,39.78484 + parent: 2 - uid: 5398 components: - type: Transform @@ -77956,12 +78011,6 @@ entities: rot: 3.141592653589793 rad pos: 39.5,4.5 parent: 2 - - uid: 9956 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 14.5,-35.5 - parent: 2 - uid: 9957 components: - type: Transform @@ -77998,6 +78047,12 @@ entities: rot: 1.5707963267948966 rad pos: 30.5,-16.5 parent: 2 + - uid: 30259 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.49886,-34.42077 + parent: 2 - proto: ChairWood entities: - uid: 483 @@ -78482,7 +78537,7 @@ entities: - uid: 2691 components: - type: Transform - pos: 29.384224,21.543312 + pos: 29.371857,21.544085 parent: 2 - uid: 11465 components: @@ -78537,10 +78592,10 @@ entities: - type: Transform pos: 3.5,-39.5 parent: 2 - - uid: 12057 + - uid: 30265 components: - type: Transform - pos: 46.5,-7.5 + pos: 47.5,-7.5 parent: 2 - proto: ClosetChefFilled entities: @@ -78561,6 +78616,11 @@ entities: - type: Transform pos: -1.5,33.5 parent: 2 + - uid: 3459 + components: + - type: Transform + pos: -15.5,36.5 + parent: 2 - uid: 3478 components: - type: Transform @@ -78581,6 +78641,16 @@ entities: - type: Transform pos: 46.5,-31.5 parent: 2 + - uid: 4518 + components: + - type: Transform + pos: -10.5,-54.5 + parent: 2 + - uid: 4963 + components: + - type: Transform + pos: -19.5,18.5 + parent: 2 - uid: 5343 components: - type: Transform @@ -78626,11 +78696,6 @@ entities: - type: Transform pos: 62.5,-0.5 parent: 2 - - uid: 18917 - components: - - type: Transform - pos: -47.5,-43.5 - parent: 2 - uid: 18970 components: - type: Transform @@ -78736,8 +78801,58 @@ entities: - type: Transform pos: 47.5,9.5 parent: 2 + - uid: 30294 + components: + - type: Transform + pos: 44.5,19.5 + parent: 2 + - uid: 30295 + components: + - type: Transform + pos: 40.5,32.5 + parent: 2 + - uid: 30296 + components: + - type: Transform + pos: 40.5,42.5 + parent: 2 + - uid: 30299 + components: + - type: Transform + pos: -12.5,26.5 + parent: 2 + - uid: 30300 + components: + - type: Transform + pos: -50.5,-17.5 + parent: 2 + - uid: 30303 + components: + - type: Transform + pos: -49.5,-47.5 + parent: 2 + - uid: 30304 + components: + - type: Transform + pos: 47.5,-42.5 + parent: 2 + - uid: 30305 + components: + - type: Transform + pos: 25.5,-32.5 + parent: 2 + - uid: 30307 + components: + - type: Transform + pos: 28.5,-12.5 + parent: 2 - proto: ClosetEmergencyN2FilledRandom entities: + - uid: 9938 + components: + - type: Transform + pos: -50.5,-19.5 + parent: 2 - uid: 12052 components: - type: Transform @@ -78915,6 +79030,21 @@ entities: - type: Transform pos: -1.5,32.5 parent: 2 + - uid: 30297 + components: + - type: Transform + pos: 40.5,41.5 + parent: 2 + - uid: 30301 + components: + - type: Transform + pos: -50.5,-18.5 + parent: 2 + - uid: 30306 + components: + - type: Transform + pos: 22.5,-32.5 + parent: 2 - proto: ClosetJanitorFilled entities: - uid: 3055 @@ -79859,6 +79989,20 @@ entities: - type: Physics canCollide: False - type: InsideEntityStorage +- proto: ClothingNeckHeadphones + entities: + - uid: 6722 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 51.484985,-35.679863 + parent: 2 + - uid: 30253 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 51.474567,-36.84653 + parent: 2 - proto: ClothingNeckStethoscope entities: - uid: 2097 @@ -80796,6 +80940,45 @@ entities: - type: Transform pos: -48.5,1.5 parent: 2 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 14224 + components: + - type: Transform + pos: 23.5,40.5 + parent: 2 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 4096 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -9.5,-33.5 + parent: 2 +- proto: ComputerCargoOrdersScience + entities: + - uid: 18917 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,-34.5 + parent: 2 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 4134 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 44.5,-32.5 + parent: 2 +- proto: ComputerCargoOrdersService + entities: + - uid: 3515 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 41.5,-6.5 + parent: 2 - proto: ComputerComms entities: - uid: 2388 @@ -80804,24 +80987,23 @@ entities: rot: 1.5707963267948966 rad pos: 21.5,7.5 parent: 2 -- proto: ComputerCrewMonitoring - entities: - - uid: 1349 + - uid: 4117 components: - type: Transform - rot: 3.141592653589793 rad - pos: -7.5,-34.5 + pos: 31.5,23.5 parent: 2 +- proto: ComputerCrewMonitoring + entities: - uid: 3046 components: - type: Transform pos: 20.5,9.5 parent: 2 - - uid: 3409 + - uid: 3522 components: - type: Transform rot: 3.141592653589793 rad - pos: 41.5,-6.5 + pos: 40.5,-6.5 parent: 2 - uid: 14688 components: @@ -80834,6 +81016,12 @@ entities: - type: Transform pos: 55.5,-9.5 parent: 2 + - uid: 30257 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,-33.5 + parent: 2 - proto: ComputerCriminalRecords entities: - uid: 12271 @@ -80872,6 +81060,19 @@ entities: rot: 3.141592653589793 rad pos: -26.5,-49.5 parent: 2 +- proto: ComputerFundingAllocation + entities: + - uid: 3557 + components: + - type: Transform + pos: 30.5,23.5 + parent: 2 + - uid: 4109 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 45.5,-6.5 + parent: 2 - proto: ComputerId entities: - uid: 2390 @@ -80880,11 +81081,10 @@ entities: rot: 1.5707963267948966 rad pos: 21.5,6.5 parent: 2 - - uid: 3395 + - uid: 12819 components: - type: Transform - rot: 3.141592653589793 rad - pos: 40.5,-6.5 + pos: 41.5,-4.5 parent: 2 - proto: ComputerMassMedia entities: @@ -80896,12 +81096,6 @@ entities: parent: 2 - proto: ComputerMedicalRecords entities: - - uid: 1348 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,-34.5 - parent: 2 - uid: 2045 components: - type: Transform @@ -80914,6 +81108,12 @@ entities: rot: 3.141592653589793 rad pos: 23.5,4.5 parent: 2 + - uid: 30256 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-33.5 + parent: 2 - proto: ComputerPowerMonitoring entities: - uid: 2377 @@ -81161,6 +81361,12 @@ entities: rot: 3.141592653589793 rad pos: 36.5,12.5 parent: 2 + - uid: 4549 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-34.5 + parent: 2 - uid: 5341 components: - type: Transform @@ -81185,12 +81391,6 @@ entities: rot: -1.5707963267948966 rad pos: 54.5,-21.5 parent: 2 - - uid: 9938 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -4.5,-33.5 - parent: 2 - uid: 11203 components: - type: Transform @@ -82587,6 +82787,8 @@ entities: - type: Transform pos: 42.5,-9.5 parent: 2 + - type: Lock + locked: False - type: EntityStorage air: volume: 200 @@ -82611,15 +82813,16 @@ entities: showEnts: False occludes: True ents: - - 17450 + - 1404 - 18218 - - 18548 - - 18693 - - 18920 - - 19023 - - 19529 - - 19533 - 19534 + - 19533 + - 19529 + - 19023 + - 18920 + - 18693 + - 18548 + - 17450 paper_label: !type:ContainerSlot showEnts: False occludes: True @@ -83539,6 +83742,11 @@ entities: - type: Transform pos: 13.5,-39.5 parent: 2 + - uid: 4102 + components: + - type: Transform + pos: 30.5,23.5 + parent: 2 - uid: 5636 components: - type: Transform @@ -83856,11 +84064,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,6.5 parent: 2 - - uid: 17260 - components: - - type: Transform - pos: 30.5,22.5 - parent: 2 - uid: 17295 components: - type: Transform @@ -84467,6 +84670,12 @@ entities: rot: 3.141592653589793 rad pos: -15.5,-37.5 parent: 2 + - uid: 2702 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -48.5,-16.5 + parent: 2 - uid: 3097 components: - type: Transform @@ -84483,6 +84692,11 @@ entities: - type: Transform pos: -32.5,34.5 parent: 2 + - uid: 3554 + components: + - type: Transform + pos: 30.5,22.5 + parent: 2 - uid: 3718 components: - type: Transform @@ -91024,6 +91238,12 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,-39.5 parent: 2 + - uid: 4959 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 29.5,23.5 + parent: 2 - uid: 7813 components: - type: Transform @@ -91289,12 +91509,6 @@ entities: rot: 1.5707963267948966 rad pos: 26.5,12.5 parent: 2 - - uid: 17263 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 29.5,22.5 - parent: 2 - uid: 17283 components: - type: Transform @@ -91526,11 +91740,6 @@ entities: - type: Transform pos: 28.5,5.5 parent: 2 - - uid: 3049 - components: - - type: Transform - pos: 29.5,22.5 - parent: 2 - uid: 3050 components: - type: Transform @@ -91556,6 +91765,11 @@ entities: - type: Transform pos: 11.5,-39.5 parent: 2 + - uid: 4101 + components: + - type: Transform + pos: 29.5,23.5 + parent: 2 - uid: 5180 components: - type: Transform @@ -91752,6 +91966,11 @@ entities: - type: Transform pos: 53.5,-13.5 parent: 2 + - uid: 30264 + components: + - type: Transform + pos: 38.5,15.5 + parent: 2 - proto: DonkpocketBoxSpawner entities: - uid: 1615 @@ -93116,6 +93335,11 @@ entities: rot: 1.5707963267948966 rad pos: 55.5,-5.5 parent: 2 + - uid: 20707 + components: + - type: Transform + pos: 33.5,23.5 + parent: 2 - uid: 23550 components: - type: Transform @@ -93295,11 +93519,6 @@ entities: rot: 1.5707963267948966 rad pos: 21.5,16.5 parent: 2 - - uid: 24048 - components: - - type: Transform - pos: 33.5,22.5 - parent: 2 - uid: 24049 components: - type: Transform @@ -94071,7 +94290,7 @@ entities: - type: MetaData name: medical fax machine - type: Transform - pos: -9.5,-34.5 + pos: -7.5,-34.5 parent: 2 - type: FaxMachine name: medical @@ -94190,6 +94409,14 @@ entities: - type: Transform pos: 32.5,20.5 parent: 2 +- proto: FenceMetalGate + entities: + - uid: 30252 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 51.5,-38.5 + parent: 2 - proto: FenceWoodSmallGate entities: - uid: 28615 @@ -94224,27 +94451,6 @@ entities: occludes: True ents: - 1115 - - uid: 1403 - components: - - type: Transform - pos: -9.5,-33.5 - parent: 2 - - type: Storage - storedItems: - 1404: - position: 0,0 - _rotation: South - 1405: - position: 1,0 - _rotation: South - - type: ContainerContainer - containers: - storagebase: !type:Container - showEnts: False - occludes: True - ents: - - 1404 - - 1405 - uid: 2577 components: - type: Transform @@ -94266,10 +94472,10 @@ entities: ents: - 6938 - 6941 - - uid: 2669 + - uid: 3542 components: - type: Transform - pos: 28.5,18.5 + pos: -4.5,-33.5 parent: 2 - uid: 3609 components: @@ -94321,6 +94527,11 @@ entities: - type: Transform pos: 40.5,18.5 parent: 2 + - uid: 4097 + components: + - type: Transform + pos: 29.507704,22.5 + parent: 2 - uid: 5843 components: - type: Transform @@ -94355,15 +94566,10 @@ entities: parent: 2 - proto: filingCabinetRandom entities: - - uid: 2692 + - uid: 4569 components: - type: Transform - pos: 28.245878,22.5 - parent: 2 - - uid: 2693 - components: - - type: Transform - pos: 28.730253,22.5 + pos: 28.720076,23.5 parent: 2 - type: Storage storedItems: @@ -94377,6 +94583,11 @@ entities: occludes: True ents: - 10837 + - uid: 4570 + components: + - type: Transform + pos: 28.251326,23.5 + parent: 2 - uid: 19175 components: - type: Transform @@ -94425,6 +94636,16 @@ entities: ents: - 29262 - 15048 + - uid: 30287 + components: + - type: Transform + pos: 33.288647,23.5 + parent: 2 + - uid: 30288 + components: + - type: Transform + pos: 33.757397,23.5 + parent: 2 - proto: filingCabinetTall entities: - uid: 19177 @@ -96874,7 +97095,7 @@ entities: pos: -13.5,-1.5 parent: 2 - type: Door - secondsUntilStateChange: -200032.48 + secondsUntilStateChange: -208757.72 - type: DeviceNetwork deviceLists: - 18275 @@ -100326,6 +100547,15 @@ entities: rot: -1.5707963267948966 rad pos: 9.5,31.5 parent: 2 +- proto: FundingAllocationComputerCircuitboard + entities: + - uid: 1404 + components: + - type: Transform + parent: 3510 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: GameMasterCircuitBoard entities: - uid: 29445 @@ -103917,6 +104147,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 4108 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 43.5,-6.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 4865 components: - type: Transform @@ -111324,13 +111562,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#990000FF' - - uid: 14224 - components: - - type: Transform - pos: 43.5,-5.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 14225 components: - type: Transform @@ -125432,6 +125663,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#990000FF' + - uid: 30262 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 44.5,-5.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - proto: GasPipeTJunction entities: - uid: 17 @@ -125529,6 +125768,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 4103 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 43.5,-5.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 4566 components: - type: Transform @@ -126041,14 +126288,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#990000FF' - - uid: 11968 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 43.5,-6.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 12297 components: - type: Transform @@ -129385,14 +129624,6 @@ entities: - 18258 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 12821 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 44.5,-6.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13132 components: - type: Transform @@ -131261,6 +131492,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 23549 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 45.5,-5.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 23704 components: - type: Transform @@ -133703,10 +133942,10 @@ entities: color: '#FF1212FF' - proto: GlassBoxLaserFilled entities: - - uid: 2740 + - uid: 30286 components: - type: Transform - pos: 39.5,11.5 + pos: 32.5,23.5 parent: 2 - proto: GrassBattlemap entities: @@ -134817,24 +135056,6 @@ entities: rot: -1.5707963267948966 rad pos: 61.5,-37.5 parent: 2 - - uid: 4101 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 60.5,-37.5 - parent: 2 - - uid: 4102 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 60.5,-38.5 - parent: 2 - - uid: 4103 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 59.5,-38.5 - parent: 2 - uid: 4104 components: - type: Transform @@ -134898,20 +135119,14 @@ entities: - uid: 4126 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 50.5,-39.5 + rot: 1.5707963267948966 rad + pos: 60.5,-39.5 parent: 2 - - uid: 4131 + - uid: 4128 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 49.5,-38.5 - parent: 2 - - uid: 4132 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 49.5,-35.5 + rot: 1.5707963267948966 rad + pos: 61.5,-39.5 parent: 2 - uid: 4211 components: @@ -135397,6 +135612,12 @@ entities: rot: 1.5707963267948966 rad pos: 6.5,41.5 parent: 2 + - uid: 6721 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 61.5,-38.5 + parent: 2 - uid: 6847 components: - type: Transform @@ -142002,7 +142223,7 @@ entities: - uid: 3488 components: - type: Transform - pos: 41.696266,-4.611898 + pos: 42.71155,-4.5851502 parent: 2 - proto: HarmonicaInstrument entities: @@ -142894,7 +143115,7 @@ entities: pos: 36.5,-35.5 parent: 2 - type: Door - secondsUntilStateChange: -236864.28 + secondsUntilStateChange: -245589.52 state: Opening - uid: 5211 components: @@ -144216,6 +144437,11 @@ entities: parent: 2 - proto: LockerEvidence entities: + - uid: 2615 + components: + - type: Transform + pos: 44.5,-31.5 + parent: 2 - uid: 4442 components: - type: Transform @@ -144246,16 +144472,6 @@ entities: - type: Transform pos: 36.5,-10.5 parent: 2 - - uid: 5415 - components: - - type: Transform - pos: 44.5,-31.5 - parent: 2 - - uid: 5416 - components: - - type: Transform - pos: 44.5,-32.5 - parent: 2 - uid: 5417 components: - type: Transform @@ -145533,6 +145749,13 @@ entities: - type: Transform pos: -47.520466,-22.794298 parent: 2 +- proto: MagazineBoxPistolPractice + entities: + - uid: 30254 + components: + - type: Transform + pos: 51.509186,-37.41696 + parent: 2 - proto: MagazineMagnum entities: - uid: 4205 @@ -145695,6 +145918,11 @@ entities: - type: Transform pos: 37.5,24.5 parent: 2 + - uid: 3486 + components: + - type: Transform + pos: -11.5,-52.5 + parent: 2 - uid: 4055 components: - type: Transform @@ -145735,11 +145963,6 @@ entities: - type: Transform pos: 25.5,-42.5 parent: 2 - - uid: 23549 - components: - - type: Transform - pos: -10.5,-54.5 - parent: 2 - uid: 23580 components: - type: Transform @@ -145864,7 +146087,7 @@ entities: - uid: 3513 components: - type: Transform - pos: 43.426495,-4.5161743 + pos: 45.4437,-4.2865305 parent: 2 - proto: MaterialDiamond1 entities: @@ -145893,7 +146116,7 @@ entities: - uid: 3512 components: - type: Transform - pos: 41.613995,-4.120341 + pos: 45.41245,-4.5990305 parent: 2 - proto: MatterBinStockPart entities: @@ -147289,7 +147512,7 @@ entities: - uid: 10837 components: - type: Transform - parent: 2693 + parent: 4569 - type: Paper content: >+ [bold]=====================================================[/bold] @@ -148375,18 +148598,6 @@ entities: rot: 3.141592653589793 rad pos: -8.918555,-34.483868 parent: 2 - - uid: 1404 - components: - - type: Transform - parent: 1403 - - type: Physics - canCollide: False - - uid: 1405 - components: - - type: Transform - parent: 1403 - - type: Physics - canCollide: False - uid: 1417 components: - type: Transform @@ -149473,11 +149684,6 @@ entities: - type: Transform pos: -4.5,-39.5 parent: 2 - - uid: 1368 - components: - - type: Transform - pos: -4.5,-32.5 - parent: 2 - uid: 1370 components: - type: Transform @@ -149568,11 +149774,6 @@ entities: - type: Transform pos: 42.5,3.5 parent: 2 - - uid: 5842 - components: - - type: Transform - pos: 42.5,5.5 - parent: 2 - uid: 11893 components: - type: Transform @@ -149758,6 +149959,16 @@ entities: - type: Transform pos: 2.5,-62.5 parent: 2 + - uid: 30258 + components: + - type: Transform + pos: -4.5,-32.5 + parent: 2 + - uid: 30263 + components: + - type: Transform + pos: 38.5,4.5 + parent: 2 - proto: PottedPlantRD entities: - uid: 9902 @@ -149784,11 +149995,6 @@ entities: parent: 2 - proto: PowerCellRecharger entities: - - uid: 1602 - components: - - type: Transform - pos: -4.5,-34.5 - parent: 2 - uid: 1603 components: - type: Transform @@ -149811,6 +150017,12 @@ entities: - type: Transform pos: 34.5,-34.5 parent: 2 + - uid: 4547 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-34.5 + parent: 2 - uid: 5801 components: - type: Transform @@ -150987,6 +151199,12 @@ entities: rot: 3.141592653589793 rad pos: -28.5,-20.5 parent: 2 + - uid: 1348 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 47.5,-1.5 + parent: 2 - uid: 2105 components: - type: Transform @@ -151423,12 +151641,6 @@ entities: - type: Transform pos: 49.5,6.5 parent: 2 - - uid: 6171 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 47.5,-2.5 - parent: 2 - uid: 6172 components: - type: Transform @@ -152662,6 +152874,12 @@ entities: rot: -1.5707963267948966 rad pos: 54.5,-13.5 parent: 2 + - uid: 30261 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 46.5,-4.5 + parent: 2 - proto: PoweredlightEmpty entities: - uid: 12295 @@ -152916,38 +153134,12 @@ entities: rot: 3.141592653589793 rad pos: 35.5,20.5 parent: 2 - - uid: 2689 - components: - - type: Transform - pos: 30.5,22.5 - parent: 2 - - uid: 2690 - components: - - type: Transform - pos: 29.5,22.5 - parent: 2 - uid: 2700 components: - type: Transform rot: 3.141592653589793 rad pos: 35.5,17.5 parent: 2 - - uid: 2701 - components: - - type: Transform - pos: 31.5,22.5 - parent: 2 - - uid: 2702 - components: - - type: Transform - pos: 32.5,22.5 - parent: 2 - - uid: 3522 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 46.5,-4.5 - parent: 2 - uid: 3764 components: - type: Transform @@ -153148,12 +153340,27 @@ entities: rot: 3.141592653589793 rad pos: 64.5,4.5 parent: 2 + - uid: 19222 + components: + - type: Transform + pos: 29.5,23.5 + parent: 2 + - uid: 19226 + components: + - type: Transform + pos: 30.5,23.5 + parent: 2 - uid: 19426 components: - type: Transform rot: 3.141592653589793 rad pos: 64.5,-3.5 parent: 2 + - uid: 20081 + components: + - type: Transform + pos: 31.5,23.5 + parent: 2 - uid: 20212 components: - type: Transform @@ -153170,6 +153377,11 @@ entities: - type: Transform pos: 64.5,-5.5 parent: 2 + - uid: 20670 + components: + - type: Transform + pos: 32.5,23.5 + parent: 2 - uid: 22572 components: - type: Transform @@ -153920,6 +154132,12 @@ entities: rot: 3.141592653589793 rad pos: 52.5,30.5 parent: 2 + - uid: 6171 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 22.5,40.5 + parent: 2 - uid: 6853 components: - type: Transform @@ -154944,6 +155162,12 @@ entities: - type: Transform pos: -11.5,16.5 parent: 2 + - uid: 30255 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 22.5,36.5 + parent: 2 - proto: RailingCorner entities: - uid: 64 @@ -155320,6 +155544,12 @@ entities: rot: -1.5707963267948966 rad pos: 2.5,-44.5 parent: 2 + - uid: 4131 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 22.5,39.5 + parent: 2 - uid: 4219 components: - type: Transform @@ -155502,6 +155732,12 @@ entities: rot: 3.141592653589793 rad pos: 22.5,60.5 parent: 2 + - uid: 7720 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 22.5,37.5 + parent: 2 - uid: 8033 components: - type: Transform @@ -156107,6 +156343,11 @@ entities: parent: 2 - proto: RandomPainting entities: + - uid: 2612 + components: + - type: Transform + pos: 27.5,20.5 + parent: 2 - uid: 8104 components: - type: Transform @@ -156124,11 +156365,6 @@ entities: rot: -1.5707963267948966 rad pos: 41.5,13.5 parent: 2 - - uid: 20759 - components: - - type: Transform - pos: 30.5,23.5 - parent: 2 - uid: 20760 components: - type: Transform @@ -156140,6 +156376,16 @@ entities: - type: Transform pos: 4.5,45.5 parent: 2 + - uid: 30272 + components: + - type: Transform + pos: 29.5,24.5 + parent: 2 + - uid: 30273 + components: + - type: Transform + pos: 32.5,24.5 + parent: 2 - proto: RandomPosterAny entities: - uid: 3728 @@ -156423,11 +156669,10 @@ entities: parent: 2 - proto: RandomSoap entities: - - uid: 20763 + - uid: 5415 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -12.5,26.5 + pos: -9.5,26.5 parent: 2 - uid: 20764 components: @@ -156583,11 +156828,6 @@ entities: - type: Transform pos: 40.5,28.5 parent: 2 - - uid: 20707 - components: - - type: Transform - pos: 40.5,41.5 - parent: 2 - uid: 20708 components: - type: Transform @@ -156603,6 +156843,11 @@ entities: - type: Transform pos: 19.5,-27.5 parent: 2 + - uid: 30290 + components: + - type: Transform + pos: 40.5,40.5 + parent: 2 - proto: RandomSpawner100 entities: - uid: 13018 @@ -156659,11 +156904,6 @@ entities: rot: 1.5707963267948966 rad pos: -27.5,-45.5 parent: 2 - - uid: 3540 - components: - - type: Transform - pos: 45.5,-2.5 - parent: 2 - uid: 3541 components: - type: Transform @@ -156787,10 +157027,11 @@ entities: - type: Transform pos: -1.5,28.5 parent: 2 - - uid: 6722 + - uid: 9956 components: - type: Transform - pos: 21.5,36.5 + rot: -1.5707963267948966 rad + pos: 29.5,37.5 parent: 2 - uid: 18707 components: @@ -157626,6 +157867,12 @@ entities: rot: -1.5707963267948966 rad pos: -31.5,-33.5 parent: 2 + - uid: 1602 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 60.5,-39.5 + parent: 2 - uid: 1610 components: - type: Transform @@ -157741,6 +157988,18 @@ entities: rot: 1.5707963267948966 rad pos: 34.5,12.5 parent: 2 + - uid: 2610 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 61.5,-39.5 + parent: 2 + - uid: 2611 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 61.5,-38.5 + parent: 2 - uid: 3204 components: - type: Transform @@ -158103,24 +158362,6 @@ entities: rot: -1.5707963267948966 rad pos: 59.5,-39.5 parent: 2 - - uid: 4095 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 59.5,-38.5 - parent: 2 - - uid: 4096 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 60.5,-38.5 - parent: 2 - - uid: 4097 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 60.5,-37.5 - parent: 2 - uid: 4098 components: - type: Transform @@ -158175,24 +158416,6 @@ entities: rot: -1.5707963267948966 rad pos: 51.5,-39.5 parent: 2 - - uid: 4117 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 50.5,-39.5 - parent: 2 - - uid: 4129 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 49.5,-35.5 - parent: 2 - - uid: 4130 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 49.5,-38.5 - parent: 2 - uid: 4244 components: - type: Transform @@ -160595,7 +160818,7 @@ entities: - uid: 23360 components: - type: Transform - pos: 41.815514,-4.2144213 + pos: 42.75322,-4.2518167 parent: 2 - uid: 23362 components: @@ -160607,7 +160830,7 @@ entities: - uid: 23361 components: - type: Transform - pos: 41.534264,-4.287338 + pos: 42.44072,-4.3768167 parent: 2 - uid: 23363 components: @@ -162794,19 +163017,6 @@ entities: - Pressed: Toggle 3537: - Pressed: Toggle - - uid: 23783 - components: - - type: MetaData - name: cleaning service - - type: Transform - pos: 47.5,-6.5 - parent: 2 - - type: SignalSwitch - state: True - - type: DeviceLinkSource - linkedPorts: - 23780: - - Pressed: Toggle - uid: 23785 components: - type: MetaData @@ -163664,6 +163874,12 @@ entities: parent: 2 - proto: SignHead entities: + - uid: 4 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 47.5,-2.5 + parent: 2 - uid: 857 components: - type: Transform @@ -163676,12 +163892,6 @@ entities: rot: -1.5707963267948966 rad pos: -22.5,-36.5 parent: 2 - - uid: 8251 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 47.5,-3.5 - parent: 2 - uid: 9604 components: - type: Transform @@ -166754,10 +166964,10 @@ entities: parent: 2 - proto: SpawnMobPossumMorty entities: - - uid: 20670 + - uid: 30302 components: - type: Transform - pos: -50.5,-17.5 + pos: -50.5,-20.5 parent: 2 - proto: SpawnMobPurpleSnake entities: @@ -167822,6 +168032,12 @@ entities: parent: 2 - proto: StairStageWood entities: + - uid: 8251 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 44.5,-5.5 + parent: 2 - uid: 28980 components: - type: Transform @@ -168380,6 +168596,11 @@ entities: parent: 2 - proto: SuitStorageEngi entities: + - uid: 5842 + components: + - type: Transform + pos: 21.5,36.5 + parent: 2 - uid: 7668 components: - type: Transform @@ -168395,15 +168616,10 @@ entities: - type: Transform pos: 21.5,39.5 parent: 2 - - uid: 7720 + - uid: 18146 components: - type: Transform - pos: 29.5,39.5 - parent: 2 - - uid: 7721 - components: - - type: Transform - pos: 29.5,37.5 + pos: 21.5,40.5 parent: 2 - proto: SuitStorageEVA entities: @@ -168412,31 +168628,181 @@ entities: - type: Transform pos: 44.5,3.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 10217 - uid: 6117 components: - type: Transform pos: 44.5,4.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 11968 - uid: 6118 components: - type: Transform pos: 44.5,5.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 12057 - uid: 6119 components: - type: Transform pos: 50.5,3.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 12788 - uid: 6120 components: - type: Transform pos: 50.5,4.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 12789 - uid: 6121 components: - type: Transform pos: 50.5,5.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 12818 - proto: SuitStorageEVAPrisoner entities: - uid: 3948 @@ -170960,6 +171326,18 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,20.5 parent: 2 + - uid: 3487 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-34.5 + parent: 2 + - uid: 3540 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-34.5 + parent: 2 - uid: 3691 components: - type: Transform @@ -171618,6 +171996,24 @@ entities: - type: Transform pos: 46.5,-9.5 parent: 2 + - uid: 30249 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 51.5,-35.5 + parent: 2 + - uid: 30250 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 51.5,-37.5 + parent: 2 + - uid: 30251 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 51.5,-36.5 + parent: 2 - proto: TableCarpet entities: - uid: 7942 @@ -173041,11 +173437,6 @@ entities: rot: 1.5707963267948966 rad pos: 36.5,-7.5 parent: 2 - - uid: 3487 - components: - - type: Transform - pos: 41.5,-4.5 - parent: 2 - uid: 3730 components: - type: Transform @@ -173406,6 +173797,11 @@ entities: rot: -1.5707963267948966 rad pos: -54.5,9.5 parent: 2 + - uid: 17263 + components: + - type: Transform + pos: 42.5,-4.5 + parent: 2 - uid: 18714 components: - type: Transform @@ -173575,11 +173971,11 @@ entities: - type: Transform pos: -29.5,-43.5 parent: 2 - - uid: 4109 + - uid: 17260 components: - type: Transform rot: -1.5707963267948966 rad - pos: 54.5,-37.5 + pos: 56.5,-37.5 parent: 2 - proto: TargetDarts entities: @@ -173591,17 +173987,17 @@ entities: parent: 2 - proto: TargetHuman entities: - - uid: 4108 + - uid: 6450 components: - type: Transform rot: -1.5707963267948966 rad - pos: 56.5,-35.5 + pos: 59.5,-38.5 parent: 2 - - uid: 4128 + - uid: 12821 components: - type: Transform rot: -1.5707963267948966 rad - pos: 57.5,-38.5 + pos: 57.5,-35.5 parent: 2 - proto: TargetSyndicate entities: @@ -174486,10 +174882,10 @@ entities: parent: 2 - proto: UniformPrinter entities: - - uid: 3486 + - uid: 4961 components: - type: Transform - pos: 42.5,-4.5 + pos: 45.5,-3.5 parent: 2 - proto: UprightPianoInstrument entities: @@ -174658,15 +175054,10 @@ entities: - type: Transform pos: 21.5,18.5 parent: 2 - - uid: 6721 - components: - - type: Transform - pos: 21.5,40.5 - parent: 2 - uid: 9949 components: - type: Transform - pos: 13.5,-34.5 + pos: 29.5,39.5 parent: 2 - uid: 10448 components: @@ -177099,41 +177490,11 @@ entities: rot: -1.5707963267948966 rad pos: 27.5,23.5 parent: 2 - - uid: 2610 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 28.5,23.5 - parent: 2 - - uid: 2611 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 29.5,23.5 - parent: 2 - - uid: 2612 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 30.5,23.5 - parent: 2 - uid: 2613 components: - type: Transform rot: -1.5707963267948966 rad - pos: 31.5,23.5 - parent: 2 - - uid: 2614 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 32.5,23.5 - parent: 2 - - uid: 2615 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 33.5,23.5 + pos: 33.5,24.5 parent: 2 - uid: 2616 components: @@ -178066,24 +178427,6 @@ entities: rot: 1.5707963267948966 rad pos: 44.5,-7.5 parent: 2 - - uid: 3459 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 45.5,-3.5 - parent: 2 - - uid: 3460 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 45.5,-4.5 - parent: 2 - - uid: 3462 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 45.5,-6.5 - parent: 2 - uid: 3463 components: - type: Transform @@ -178139,11 +178482,6 @@ entities: - type: Transform pos: 43.5,-10.5 parent: 2 - - uid: 3515 - components: - - type: Transform - pos: 46.5,-6.5 - parent: 2 - uid: 3519 components: - type: Transform @@ -179209,6 +179547,12 @@ entities: rot: 1.5707963267948966 rad pos: 49.5,-39.5 parent: 2 + - uid: 4130 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 50.5,-39.5 + parent: 2 - uid: 4135 components: - type: Transform @@ -179838,6 +180182,12 @@ entities: - type: Transform pos: -15.5,-59.5 parent: 2 + - uid: 5416 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 47.5,-2.5 + parent: 2 - uid: 5431 components: - type: Transform @@ -185536,6 +185886,12 @@ entities: - type: Transform pos: -27.5,7.5 parent: 2 + - uid: 20759 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 46.5,-7.5 + parent: 2 - uid: 21004 components: - type: Transform @@ -186681,6 +187037,12 @@ entities: rot: 3.141592653589793 rad pos: -0.5,44.5 parent: 2 + - uid: 23783 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 46.5,-6.5 + parent: 2 - uid: 23810 components: - type: Transform @@ -188132,6 +188494,12 @@ entities: - type: Transform pos: -12.5,-60.5 parent: 2 + - uid: 28783 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 45.5,-2.5 + parent: 2 - uid: 29003 components: - type: Transform @@ -188372,6 +188740,30 @@ entities: - type: Transform pos: 24.5,-26.5 parent: 2 + - uid: 30268 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 32.5,24.5 + parent: 2 + - uid: 30269 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 31.5,24.5 + parent: 2 + - uid: 30270 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 29.5,24.5 + parent: 2 + - uid: 30271 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 28.5,24.5 + parent: 2 - proto: WallSolid entities: - uid: 309 @@ -192861,7 +193253,7 @@ entities: parent: 21002 - proto: WallWeaponCapacitorRecharger entities: - - uid: 20081 + - uid: 24048 components: - type: Transform rot: -1.5707963267948966 rad @@ -193603,11 +193995,6 @@ entities: - type: Transform pos: -36.5,-45.5 parent: 2 - - uid: 3542 - components: - - type: Transform - pos: 47.5,-2.5 - parent: 2 - uid: 5339 components: - type: Transform @@ -193820,6 +194207,50 @@ entities: - type: Transform pos: 48.66992,-38.664413 parent: 2 +- proto: WeaponGrapplingGun + entities: + - uid: 10217 + components: + - type: Transform + parent: 6116 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 11968 + components: + - type: Transform + parent: 6117 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 12057 + components: + - type: Transform + parent: 6118 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 12788 + components: + - type: Transform + parent: 6119 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 12789 + components: + - type: Transform + parent: 6120 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 12818 + components: + - type: Transform + parent: 6121 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: WeaponLaserCarbine entities: - uid: 4191 @@ -193894,36 +194325,36 @@ entities: parent: 2 - proto: WeaponTurretSyndicateBroken entities: - - uid: 10217 - components: - - type: Transform - pos: 48.5,18.5 - parent: 2 - - uid: 12788 - components: - - type: Transform - pos: 54.5,13.5 - parent: 2 - - uid: 12789 - components: - - type: Transform - pos: 48.5,13.5 - parent: 2 - - uid: 12818 - components: - - type: Transform - pos: 54.5,22.5 - parent: 2 - - uid: 12819 - components: - - type: Transform - pos: 48.5,22.5 - parent: 2 - uid: 20501 components: - type: Transform pos: 63.5,8.5 parent: 2 + - uid: 28812 + components: + - type: Transform + pos: 48.5,22.5 + parent: 2 + - uid: 28813 + components: + - type: Transform + pos: 48.5,13.5 + parent: 2 + - uid: 28814 + components: + - type: Transform + pos: 48.5,18.5 + parent: 2 + - uid: 29833 + components: + - type: Transform + pos: 54.5,13.5 + parent: 2 + - uid: 30245 + components: + - type: Transform + pos: 54.5,22.5 + parent: 2 - proto: WeldingFuelTankFull entities: - uid: 4298 @@ -194001,24 +194432,24 @@ entities: rot: 3.141592653589793 rad pos: -15.5,-26.5 parent: 2 - - uid: 4133 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 49.5,-36.5 - parent: 2 - - uid: 4134 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 49.5,-37.5 - parent: 2 - uid: 19248 components: - type: Transform rot: 1.5707963267948966 rad pos: 10.5,-55.5 parent: 2 + - uid: 30246 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 49.5,-36.5 + parent: 2 + - uid: 30247 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 49.5,-37.5 + parent: 2 - proto: WindoorHydroponicsLocked entities: - uid: 3318 @@ -194165,6 +194596,30 @@ entities: - type: Transform pos: 51.5,21.5 parent: 2 + - uid: 30289 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 46.5,3.5 + parent: 2 + - uid: 30291 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 48.5,3.5 + parent: 2 + - uid: 30292 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 46.5,4.5 + parent: 2 + - uid: 30293 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 48.5,4.5 + parent: 2 - proto: WindoorSecureEngineeringLocked entities: - uid: 6236 @@ -194987,11 +195442,6 @@ entities: - type: Transform pos: -6.5,-34.5 parent: 2 - - uid: 1354 - components: - - type: Transform - pos: -7.5,-34.5 - parent: 2 - uid: 1355 components: - type: Transform @@ -195145,6 +195595,11 @@ entities: rot: -1.5707963267948966 rad pos: -56.5,-27.5 parent: 2 + - uid: 30248 + components: + - type: Transform + pos: -7.5,-34.5 + parent: 2 - proto: WindowFrostedDirectional entities: - uid: 28867 @@ -195436,6 +195891,12 @@ entities: rot: 3.141592653589793 rad pos: 15.5,-41.5 parent: 2 + - uid: 4132 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 49.5,-38.5 + parent: 2 - uid: 4178 components: - type: Transform @@ -195478,6 +195939,12 @@ entities: rot: 1.5707963267948966 rad pos: 48.5,6.5 parent: 2 + - uid: 6852 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 49.5,-35.5 + parent: 2 - uid: 9476 components: - type: Transform @@ -195694,7 +196161,7 @@ entities: pos: 24.5,2.5 parent: 21002 - type: Door - secondsUntilStateChange: -582068.9 + secondsUntilStateChange: -590794.1 state: Opening - uid: 28863 components: From 83c2fdb6197b97bceb9c7b88c85b25ac1c2534d7 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Tue, 15 Apr 2025 18:49:58 -0400 Subject: [PATCH 159/622] Restore Artifexium Effect (#36595) * Restore Artifexium * popup * small tweaks --- .../EntityEffects/Effects/ArtifactUnlock.cs | 47 +++++++++++++++++++ .../XenoArtifactUnlockingComponent.cs | 6 +++ .../SharedXenoArtifactSystem.Unlock.cs | 35 ++++++++++---- .../Artifact/SharedXenoArtifactSystem.XAT.cs | 25 ++++++---- .../en-US/guidebook/chemistry/effects.ftl | 6 +++ .../xenoarchaeology/artifact-component.ftl | 1 + .../Xenoarchaeology/xenoartifacts.yml | 4 ++ Resources/Prototypes/Reagents/chemicals.yml | 8 ++++ 8 files changed, 114 insertions(+), 18 deletions(-) create mode 100644 Content.Server/EntityEffects/Effects/ArtifactUnlock.cs diff --git a/Content.Server/EntityEffects/Effects/ArtifactUnlock.cs b/Content.Server/EntityEffects/Effects/ArtifactUnlock.cs new file mode 100644 index 0000000000..21454ff7a7 --- /dev/null +++ b/Content.Server/EntityEffects/Effects/ArtifactUnlock.cs @@ -0,0 +1,47 @@ +using Content.Server.Popups; +using Content.Server.Xenoarchaeology.Artifact; +using Content.Shared.EntityEffects; +using Content.Shared.Popups; +using Content.Shared.Xenoarchaeology.Artifact.Components; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; + +namespace Content.Server.EntityEffects.Effects; + +/// +/// Sets an artifact into the unlocking state and marks the artifexium effect as true. +/// This is a very specific behavior intended for a specific chem. +/// +[UsedImplicitly] +public sealed partial class ArtifactUnlock : EntityEffect +{ + public override void Effect(EntityEffectBaseArgs args) + { + var entMan = args.EntityManager; + var xenoArtifactSys = entMan.System(); + var popupSys = entMan.System(); + + if (!entMan.TryGetComponent(args.TargetEntity, out var xenoArtifact)) + return; + + if (!entMan.TryGetComponent(args.TargetEntity, out var unlocking)) + { + xenoArtifactSys.TriggerXenoArtifact((args.TargetEntity, xenoArtifact), null, force: true); + unlocking = entMan.EnsureComponent(args.TargetEntity); + } + else if (!unlocking.ArtifexiumApplied) + { + popupSys.PopupEntity(Loc.GetString("artifact-activation-artifexium"), args.TargetEntity, PopupType.Medium); + } + + if (unlocking.ArtifexiumApplied) + return; + + xenoArtifactSys.SetArtifexiumApplied((args.TargetEntity, unlocking), true); + } + + protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) + { + return Loc.GetString("reagent-effect-guidebook-artifact-unlock", ("chance", Probability)); + } +} diff --git a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactUnlockingComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactUnlockingComponent.cs index 13b07f4474..6b2351cc2f 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactUnlockingComponent.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactUnlockingComponent.cs @@ -21,6 +21,12 @@ public sealed partial class XenoArtifactUnlockingComponent : Component [DataField, AutoNetworkedField, AutoPausedField] public TimeSpan EndTime; + /// + /// Tracks if artifexium has been applied, which changes the unlock behavior slightly. + /// + [DataField, AutoNetworkedField] + public bool ArtifexiumApplied; + /// /// The sound that plays when an artifact finishes unlocking successfully (with node unlocked). /// diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs index 9786e65478..57d6502bfb 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Unlock.cs @@ -3,6 +3,8 @@ using System.Linq; using Content.Shared.Xenoarchaeology.Artifact.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; +using Robust.Shared.Collections; +using Robust.Shared.Random; namespace Content.Shared.Xenoarchaeology.Artifact; @@ -94,14 +96,14 @@ public abstract partial class SharedXenoArtifactSystem } RemComp(ent, unlockingComponent); - RiseUnlockingFinished(ent, node); + RaiseUnlockingFinished(ent, node); artifactComponent.NextUnlockTime = _timing.CurTime + artifactComponent.UnlockStateRefractory; } public void CancelUnlockingState(Entity ent) { RemComp(ent, ent.Comp1); - RiseUnlockingFinished(ent, null); + RaiseUnlockingFinished(ent, null); } /// @@ -113,9 +115,10 @@ public abstract partial class SharedXenoArtifactSystem ) { node = null; + var potentialNodes = new ValueList>(); var artifactUnlockingComponent = ent.Comp1; - foreach (var nodeIndex in artifactUnlockingComponent.TriggeredNodeIndexes) + foreach (var nodeIndex in GetAllNodeIndices((ent, ent))) { var artifactComponent = ent.Comp2; var curNode = GetNode((ent, artifactComponent), nodeIndex); @@ -125,15 +128,29 @@ public abstract partial class SharedXenoArtifactSystem var requiredIndices = GetPredecessorNodes((ent, artifactComponent), nodeIndex); requiredIndices.Add(nodeIndex); - // Make sure the two sets are identical - if (requiredIndices.Count != artifactUnlockingComponent.TriggeredNodeIndexes.Count - || !artifactUnlockingComponent.TriggeredNodeIndexes.All(requiredIndices.Contains)) + if (!ent.Comp1.ArtifexiumApplied) + { + // Make sure the two sets are identical + if (requiredIndices.Count != artifactUnlockingComponent.TriggeredNodeIndexes.Count + || !artifactUnlockingComponent.TriggeredNodeIndexes.All(requiredIndices.Contains)) + continue; + + node = curNode; + return true; // exit early + } + + // If we apply artifexium, check that the sets are identical EXCEPT for one extra node. + // This node is a "wildcard" and we'll make a pool so we can pick one to actually unlock. + if (!artifactUnlockingComponent.TriggeredNodeIndexes.All(requiredIndices.Contains) || + requiredIndices.Count - 1 != artifactUnlockingComponent.TriggeredNodeIndexes.Count) continue; - node = curNode; - return true; + potentialNodes.Add(curNode); } + if (potentialNodes.Count != 0) + node = RobustRandom.Pick(potentialNodes); + return node != null; } @@ -143,7 +160,7 @@ public abstract partial class SharedXenoArtifactSystem RaiseLocalEvent(ent.Owner, ref unlockingStartedEvent); } - private void RiseUnlockingFinished( + private void RaiseUnlockingFinished( Entity ent, Entity? node ) diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAT.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAT.cs index 863f56134b..1ef85db27f 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAT.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAT.cs @@ -56,15 +56,13 @@ public abstract partial class SharedXenoArtifactSystem /// /// Attempts to shift artifact into unlocking state, in which it is going to listen to interactions, that could trigger nodes. /// - public void TriggerXenoArtifact(Entity ent, Entity node) + public void TriggerXenoArtifact(Entity ent, Entity? node, bool force = false) { // limits spontaneous chain activations, also prevents spamming every triggering tool to activate nodes // without real knowledge about triggers - if (_timing.CurTime < ent.Comp.NextUnlockTime) + if (!force && _timing.CurTime < ent.Comp.NextUnlockTime) return; - var index = GetIndex(ent, node); - if (!_unlockingQuery.TryGetComponent(ent, out var unlockingComp)) { unlockingComp = EnsureComp(ent); @@ -73,25 +71,34 @@ public abstract partial class SharedXenoArtifactSystem if (_net.IsServer) _popup.PopupEntity(Loc.GetString("artifact-unlock-state-begin"), ent); + Dirty(ent); } - else + else if (node != null) { + var index = GetIndex(ent, node.Value); + var predecessorNodeIndices = GetPredecessorNodes((ent, ent), index); var successorNodeIndices = GetSuccessorNodes((ent, ent), index); - if(unlockingComp.TriggeredNodeIndexes.Count == 0 - || unlockingComp.TriggeredNodeIndexes.All( - x => predecessorNodeIndices.Contains(x) || successorNodeIndices.Contains(x) + if (unlockingComp.TriggeredNodeIndexes.Count == 0 + || unlockingComp.TriggeredNodeIndexes.All( + x => predecessorNodeIndices.Contains(x) || successorNodeIndices.Contains(x) ) ) // we add time on each new trigger, if it is not going to fail us unlockingComp.EndTime += ent.Comp.UnlockStateIncrementPerNode; } - if (unlockingComp.TriggeredNodeIndexes.Add(index)) + if (node != null && unlockingComp.TriggeredNodeIndexes.Add(GetIndex(ent, node.Value))) { Dirty(ent, unlockingComp); } } + + public void SetArtifexiumApplied(Entity ent, bool val) + { + ent.Comp.ArtifexiumApplied = val; + Dirty(ent); + } } /// diff --git a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl index 098403c84c..2a40d00f72 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl @@ -357,6 +357,12 @@ reagent-effect-guidebook-add-to-solution-reaction = *[other] cause } chemicals applied to an object to be added to its internal solution container +reagent-effect-guidebook-artifact-unlock = + { $chance -> + [1] Helps + *[other] help + } unlock an alien artifact. + reagent-effect-guidebook-plant-attribute = { $chance -> [1] Adjusts diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl index b083d33f35..50fa136928 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-component.ftl @@ -15,6 +15,7 @@ artifact-unlock-state-end-failure = It slows down before uneventfully stopping. ### Activation artifact-activation-fail = Nothing happens... +artifact-activation-artifexium = The liquid seeps into the pores of the artifact... ### Misc. artifact-examine-trigger-desc = [color=gray][italic]Am I on your mind?[/italic][/color] diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/xenoartifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/xenoartifacts.yml index 74a78cee59..6fa30b7265 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/xenoartifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/xenoartifacts.yml @@ -45,6 +45,10 @@ # These components are needed for certain triggers to work. - type: RadiationReceiver - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + Acidic: [Touch] - type: entity id: ActionArtifactActivate diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index be5473fb8c..85f518bf5e 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -72,6 +72,14 @@ damage: types: Caustic: 2 + reactiveEffects: + Acidic: + methods: [ Touch ] + effects: + - !type:ArtifactUnlock + conditions: + - !type:ReagentThreshold + min: 5 - type: reagent id: Benzene From 68cfd1c798ca34eb2f4f90f5632f36077941191e Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 15 Apr 2025 22:51:05 +0000 Subject: [PATCH 160/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index da810a79b9..69bd799330 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,14 +1,4 @@ Entries: -- author: Bhijn and Myr - changes: - - message: The Admin Message system now contains an introductory message as the - very first message shown to a user, before any messages are written or received. - This message serves primarily to remind ahelping players (whom are likely to - be experiencing strong emotion) to remember that admins are humans, too. - type: Add - id: 7692 - time: '2024-12-09T08:54:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33348 - author: ScarKy0 changes: - message: You can now pet the AI Core. @@ -3905,3 +3895,12 @@ id: 8191 time: '2025-04-15T22:38:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36604 +- author: EmoGarbage404 + changes: + - message: Restored Artifexium's interaction with artifacts. Now, a single spray + will randomly activate one of the triggers for a node, allowing you to subvert + puzzling artifacts. + type: Add + id: 8192 + time: '2025-04-15T22:49:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36595 From 92b0f62500250385cf258ec3dfca400d2336e532 Mon Sep 17 00:00:00 2001 From: Flareguy <78941145+Flareguy@users.noreply.github.com> Date: Wed, 16 Apr 2025 01:33:39 +0000 Subject: [PATCH 161/622] New Experimental Science T3: Desynchronizer (#35752) * desynchronizer real * yaml stuff from slarti branch * C# stuff * oops * review * improve --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Polymorph/Systems/PolymorphSystem.cs | 9 ++++ .../Polymorph/PolymorphPrototype.cs | 8 ++++ .../Locale/en-US/research/technologies.ftl | 1 + .../Effects/desynchronizer_effecs.yml | 19 +++++++++ .../Entities/Mobs/Player/jaunt_mobs.yml | 11 +++++ .../Objects/Devices/desynchronizer.yml | 14 ++++++ Resources/Prototypes/Polymorphs/polymorph.yml | 15 +++++++ .../Recipes/Lathes/Packs/science.yml | 1 + .../Prototypes/Recipes/Lathes/devices.yml | 9 ++++ .../Prototypes/Research/experimental.yml | 18 ++++++-- .../Effects/chronofield.rsi/chronofield.png | Bin 0 -> 1339 bytes .../Effects/chronofield.rsi/meta.json | 21 +++++++++ .../Devices/desynchronizer.rsi/icon-on.png | Bin 0 -> 975 bytes .../Devices/desynchronizer.rsi/icon.png | Bin 0 -> 573 bytes .../desynchronizer.rsi/inhand-left.png | Bin 0 -> 322 bytes .../desynchronizer.rsi/inhand-right.png | Bin 0 -> 318 bytes .../Devices/desynchronizer.rsi/meta.json | 40 ++++++++++++++++++ 17 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 Resources/Prototypes/Entities/Effects/desynchronizer_effecs.yml create mode 100644 Resources/Prototypes/Entities/Objects/Devices/desynchronizer.yml create mode 100644 Resources/Textures/Effects/chronofield.rsi/chronofield.png create mode 100644 Resources/Textures/Effects/chronofield.rsi/meta.json create mode 100644 Resources/Textures/Objects/Devices/desynchronizer.rsi/icon-on.png create mode 100644 Resources/Textures/Objects/Devices/desynchronizer.rsi/icon.png create mode 100644 Resources/Textures/Objects/Devices/desynchronizer.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/desynchronizer.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Devices/desynchronizer.rsi/meta.json diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index e305109ad5..ddbde38a08 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -5,6 +5,7 @@ using Content.Server.Mind.Commands; using Content.Server.Polymorph.Components; using Content.Shared.Actions; using Content.Shared.Buckle; +using Content.Shared.Coordinates; using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Hands.EntitySystems; @@ -277,6 +278,10 @@ public sealed partial class PolymorphSystem : EntitySystem var ev = new PolymorphedEvent(uid, child, false); RaiseLocalEvent(uid, ref ev); + // visual effect spawn + if (configuration.EffectProto != null) + SpawnAttachedTo(configuration.EffectProto, child.ToCoordinates()); + return child; } @@ -353,6 +358,10 @@ public sealed partial class PolymorphSystem : EntitySystem var ev = new PolymorphedEvent(uid, parent, true); RaiseLocalEvent(uid, ref ev); + // visual effect spawn + if (component.Configuration.EffectProto != null) + SpawnAttachedTo(component.Configuration.EffectProto, parent.ToCoordinates()); + if (component.Configuration.ExitPolymorphPopup != null) _popup.PopupEntity(Loc.GetString(component.Configuration.ExitPolymorphPopup, ("parent", Identity.Entity(uid, EntityManager)), diff --git a/Content.Shared/Polymorph/PolymorphPrototype.cs b/Content.Shared/Polymorph/PolymorphPrototype.cs index 07901b1857..d731c4bfc5 100644 --- a/Content.Shared/Polymorph/PolymorphPrototype.cs +++ b/Content.Shared/Polymorph/PolymorphPrototype.cs @@ -40,6 +40,14 @@ public sealed partial record PolymorphConfiguration [DataField(required: true, serverOnly: true)] public EntProtoId Entity; + /// + /// Additional entity to spawn when polymorphing/reverting. + /// Gets parented to the entity polymorphed into. + /// Useful for visual effects. + /// + [DataField(serverOnly: true)] + public EntProtoId? EffectProto; + /// /// The delay between the polymorph's uses in seconds /// Slightly weird as of right now. diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index 0b0970ec08..f4f12eec52 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -48,6 +48,7 @@ research-technology-anomaly-harnessing = Anomaly Core Harnessing research-technology-abnormal-artifact-manipulation = Artifact Recycling research-technology-gravity-manipulation = Gravity Manipulation research-technology-quantum-leaping = Quantum Leaping +research-technology-bluespace-time-manipulation = Bluespace Time Manipulation research-technology-advanced-anomaly-research = Advanced Anomaly Research research-technology-rped = Rapid Part Exchange research-technology-super-parts = Super Parts diff --git a/Resources/Prototypes/Entities/Effects/desynchronizer_effecs.yml b/Resources/Prototypes/Entities/Effects/desynchronizer_effecs.yml new file mode 100644 index 0000000000..6bede2fa8d --- /dev/null +++ b/Resources/Prototypes/Entities/Effects/desynchronizer_effecs.yml @@ -0,0 +1,19 @@ +- type: entity + id: EffectDesynchronizer + categories: [ HideSpawnMenu ] + components: + - type: Sprite + drawdepth: Effects + noRot: true + layers: + - shader: unshaded + map: ["enum.EffectLayers.Unshaded"] + sprite: Effects/chronofield.rsi + state: chronofield + - type: AnimationPlayer + - type: EffectVisuals + - type: TimedDespawn + lifetime: 0.8 + - type: Tag + tags: + - HideContextMenu \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/jaunt_mobs.yml b/Resources/Prototypes/Entities/Mobs/Player/jaunt_mobs.yml index 3002264a75..fbc0b1943c 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/jaunt_mobs.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/jaunt_mobs.yml @@ -38,3 +38,14 @@ - type: MovementSpeedModifier baseSprintSpeed: 6 baseWalkSpeed: 4 + +- type: entity + parent: [Incorporeal, BaseMob] + id: DesynchronizedPocket + name: desynchronized pocket + description: A pocket in spacetime, keeping the user a fraction of a second in the future. + components: + - type: Spectral + - type: MovementSpeedModifier + baseSprintSpeed: 0 + baseWalkSpeed: 0 diff --git a/Resources/Prototypes/Entities/Objects/Devices/desynchronizer.yml b/Resources/Prototypes/Entities/Objects/Devices/desynchronizer.yml new file mode 100644 index 0000000000..d5f8352baa --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/desynchronizer.yml @@ -0,0 +1,14 @@ +- type: entity + id: DeviceDesynchronizer + parent: BaseItem + name: desynchronizer + description: An experimental device that can temporarily desynchronize the user from spacetime, effectively making them disappear while it's active. + components: + - type: Sprite + sprite: Objects/Devices/desynchronizer.rsi + state: icon + - type: TriggerOnUse + - type: PolymorphOnTrigger + polymorph: VoidPocket + - type: UseDelay + delay: 220 # long delay to ensure it can't be spammed, use it wisely diff --git a/Resources/Prototypes/Polymorphs/polymorph.yml b/Resources/Prototypes/Polymorphs/polymorph.yml index 935b2b27f5..06ec7b0e50 100644 --- a/Resources/Prototypes/Polymorphs/polymorph.yml +++ b/Resources/Prototypes/Polymorphs/polymorph.yml @@ -222,3 +222,18 @@ polymorphSound: /Audio/Magic/ethereal_enter.ogg exitPolymorphSound: /Audio/Magic/ethereal_exit.ogg duration: 3 + +# Desynchronized / Void Pocket status +- type: polymorph + id: VoidPocket + configuration: + entity: DesynchronizedPocket + transferName: false + inventory: None + forced: false + revertOnDeath: true + allowRepeatedMorphs: false + polymorphSound: /Audio/Magic/ethereal_enter.ogg + exitPolymorphSound: /Audio/Magic/ethereal_exit.ogg + duration: 120 + effectProto: EffectDesynchronizer \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/science.yml b/Resources/Prototypes/Recipes/Lathes/Packs/science.yml index 42786937a7..a86b4bbebf 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/science.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/science.yml @@ -29,6 +29,7 @@ - HoloprojectorField - SignallerAdvanced - DeviceQuantumSpinInverter + - DeviceDesynchronizer - type: latheRecipePack id: ScienceClothing diff --git a/Resources/Prototypes/Recipes/Lathes/devices.yml b/Resources/Prototypes/Recipes/Lathes/devices.yml index 21ec6773ef..62a6122342 100644 --- a/Resources/Prototypes/Recipes/Lathes/devices.yml +++ b/Resources/Prototypes/Recipes/Lathes/devices.yml @@ -175,6 +175,15 @@ Glass: 100 Uranium: 100 +- type: latheRecipe + id: DeviceDesynchronizer + result: DeviceDesynchronizer + completetime: 5 + materials: + Steel: 700 + Glass: 100 + Uranium: 200 + - type: latheRecipe id: WeaponProtoKineticAccelerator result: WeaponProtoKineticAccelerator diff --git a/Resources/Prototypes/Research/experimental.yml b/Resources/Prototypes/Research/experimental.yml index be19a11702..da3c053c68 100644 --- a/Resources/Prototypes/Research/experimental.yml +++ b/Resources/Prototypes/Research/experimental.yml @@ -124,8 +124,6 @@ - WeaponParticleDecelerator - HoloprojectorField -# Tier 3 - - type: technology id: GravityManipulation name: research-technology-gravity-manipulation @@ -133,12 +131,14 @@ sprite: Objects/Weapons/Guns/Launchers/tether_gun.rsi state: base discipline: Experimental - tier: 3 + tier: 2 cost: 10000 recipeUnlocks: - WeaponForceGun - WeaponTetherGun +# Tier 3 + - type: technology id: QuantumLeaping name: research-technology-quantum-leaping @@ -150,3 +150,15 @@ cost: 10000 recipeUnlocks: - DeviceQuantumSpinInverter + +- type: technology + id: BluespaceTimeManipulation + name: research-technology-bluespace-time-manipulation + icon: + sprite: Objects/Devices/desynchronizer.rsi + state: icon + discipline: Experimental + tier: 3 + cost: 10000 + recipeUnlocks: + - DeviceDesynchronizer \ No newline at end of file diff --git a/Resources/Textures/Effects/chronofield.rsi/chronofield.png b/Resources/Textures/Effects/chronofield.rsi/chronofield.png new file mode 100644 index 0000000000000000000000000000000000000000..af43def9eb862de2d1ddca8eb818beadbb96366f GIT binary patch literal 1339 zcmV-B1;qM^P)!4GpI&VYpC7)x&ED_sUVdz8uUUX&58xPmMrCWpQY8R4 z`r-5S`$F0KmI2iETigG;-Tu%&>SyC93SftQeg6={+KR>z z3V;DvgG~Cxv(nJVvQ`%s(ISMBXVO3aTabr;Rdnq~CdTB|6SD{Q>W}|T zmw}ppCNPtatdK=upiNx{sRd|j{?9D)AOJ4|sAi3+2zd73y=PNY^OwG7%YgUu z1M=DA4U&=PW4%Gme0$%z{h7M&v2<=5S|Dg zQ4b#ZtUMo#JQ3LOW>;cBMn1g~Q*%_cOY7ge#!|D35Q)HuzCeIpnq=e+t_7$F-eqG1 z-5k}D*S_tUMObnvTOw}=KZ7Vd`UD_%L~NclYd-2*MZmjKV8lps|J!Q$f4{-AXBJxpOaKv~HM;#TRH^(^34`3&z*@o|`!h~64+37fkQI5rjw!1;e$ zoqa>I08xZ?i|gNz3NVe$jbU>yLaP~E{PpM=v-|))2SmAc5J8cpufakPtl0Iu6=rD0 zWfmdQJi^{*-{1L56nV!(v9gJcMy6eMkN4T*Wzyfk;Y=)2tgue`qh z55mjcd))W#doRi5-p5VAaM%DC4jTZ&VFO?|p&2kcJKJ&Zt5hm6M8vrIfeaWFO(v6G zO*)h&grTo&z}(#2ki(fw#xC3Kc7NZ_&JHZg^3{p6)K@YI_T#n`QdD-beCQ$18`UnW|r?-|z)~{m4?!<{Cu48GSQf$ZY83FLp z@62})+l~$EE23mTI-Rylhx1~Vm7E=LkIcmVYwtf^U2Ht~{`OJ@ix?MA{T@==tNzN} zCof;$n8u4wzwr3xwCAyX%>XgY`jmz{;HW3SaeV8v4?*;m4G>>6zYh}Y!omxHRTuq>XWC?_csH2;&zGQ=|?^T2=x6KAjL(whsb9Dg+9*!)rR6r zr?6MBotOM?1X{1Y+|DiM@U{LN_=zyD3&1VmDYdO5B-w~USypHSpSD<*gXqTch zqke)!$E+o5tI=qj?hJSt>|5WmIu892C>csq{Y89vznZFqdE%7%$}>QA!bjUs zq0;yD5uiA+v)1Rk!Y~{*0EWW`z;M_A7!Df%!(ju$IuPdrI3I8V=L6*W{Eu=rzm(rn z=>&;>l=%R;ME=k9d7^y4AkpRn28cW#;944&1K^PlsM6#EJl5tN^+fcK@6wh75M4fC zJ>giJm*SD;16*)EU`#k4;HNR?1592Ww&8pL!1(~Z@&TEFe1IpM4^R>1d_WJ*2XH=s z^8uU>IB&24FdQ}jhQkKHaM%DC4jTZ&IXC%$anU*-5C+=h1E|pA`2mz@_51(|w0M31 zC0ac{fC6ovA3%jR`2Z@k%?E^qR`~!5^jaMzK(BlN0Xzd#8=iGOfC}yM0b!#>K7bOf x@&OcRkq@9mn|uHjTIB;M;Jd;w95w)k^A{zC>+3a!Ly`ah002ovPDHLkV1g-*#`^#O literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/desynchronizer.rsi/icon.png b/Resources/Textures/Objects/Devices/desynchronizer.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec05089677e1c4ea17f1ac8812fe43ce7aec3f4 GIT binary patch literal 573 zcmV-D0>b@?P)?}J7dW&?hfW>poTVK@ zmqMWkLYES{b?MN_4xPL7Z;0SvP>13WM1>8!5VY(hSt z7lsf5K<9-*f!#}y2pmX~qt9?K0KL_MR4N6Ura`@456QC3pmAmB9UO$F>;KwHZLx>AD!PkJs&6G;o}poPm=2caABAiq6z0K(xgvxD)NU0l6h4>r--`v69y-|sKfz3x}x;=2?afLc-kYSv8-K&dJajYbzD z;Mcit0PdVwaE3qd2+W+LZNoo{04_SEt+0`Ec}1Z0c7IuXEW(R%hQ+Im0Jzjcm05&w zdj%29I*`n6x9j;lA%IS&1Mzr#=Gg9N8DcaVG0UABh5;L&hFmxed_zL5ihyM8lDe+L zWHMppt$YvQ(P|kJk6KZQd<_W$*dcuM6_T$h@bln60D=$!5C8!X00B^bfbs*oogXlB zCWLD9f&F@Z!0voiyND=1K>2~)`8#H!`~c+#fbs*BAE5jI0c>ACh&zOTgbzkX00000 LNkvXXu0mjfFd_FS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/desynchronizer.rsi/inhand-left.png b/Resources/Textures/Objects/Devices/desynchronizer.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..46e6f88d0fc074ba6ab22ab3c9e16d89e0fad7bb GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|{&>1LhE&XX zd+T6svx7kE!{-|A+Z`A^oSEMxcrD<)~L*qkNt2rVtLk!~0Hw Otnqa9b6Mw<&;$VW(26+# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/desynchronizer.rsi/inhand-right.png b/Resources/Textures/Objects/Devices/desynchronizer.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5884e852c4070d91c959f01f7a5abdc44be29a GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|et5b#hE&XX zd+VU*5eJE*AH_drC^v>Tva&2|$vpV@mV4i{1a9t?iTP|g3avGACC&oZccg4m`|y9R z5YzoVl4(Uh-I#!;0D+3vhrYJ2H`9Jr$)a5C z Date: Wed, 16 Apr 2025 01:34:46 +0000 Subject: [PATCH 162/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 69bd799330..1665487f57 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ScarKy0 - changes: - - message: You can now pet the AI Core. - type: Add - id: 7693 - time: '2024-12-09T16:10:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33788 - author: joshepvodka changes: - message: Added flavor profiles to beverages that missed them. @@ -3904,3 +3897,14 @@ id: 8192 time: '2025-04-15T22:49:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36595 +- author: slarticodefast, Flareguy + changes: + - message: Added the Desynchronizer, an experimental device that allows the user + to temporarily make themselves invincible, invisible, & immobile. Unlock it + through experimental science today! + type: Add + - message: Gravity Manipulation technology is now a tier 2 technology. + type: Tweak + id: 8193 + time: '2025-04-16T01:33:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35752 From cb7bb7623a31c03ee8bd11ac2e7b4dc987a4872a Mon Sep 17 00:00:00 2001 From: Samuka-C <47865393+Samuka-C@users.noreply.github.com> Date: Tue, 15 Apr 2025 23:26:19 -0300 Subject: [PATCH 163/622] Add bluespace flash effect (#36607) --- Resources/Prototypes/Entities/Effects/admin_triggers.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Prototypes/Entities/Effects/admin_triggers.yml b/Resources/Prototypes/Entities/Effects/admin_triggers.yml index e1f366678d..52c5a6c110 100644 --- a/Resources/Prototypes/Entities/Effects/admin_triggers.yml +++ b/Resources/Prototypes/Entities/Effects/admin_triggers.yml @@ -20,6 +20,14 @@ range: 4 energyConsumption: 50000 +- type: entity + id: AdminInstantEffectBluespace + suffix: BluespaceFlash + parent: AdminInstantEffectBase + components: + - type: SpawnOnTrigger + proto: EffectFlashBluespace + - type: entity id: AdminInstantEffectFlash suffix: Flash From 59327bdc61d2e04d10eec3fba9625273d5ace38e Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 02:27:26 +0000 Subject: [PATCH 164/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index b47cae3aff..bd4f640aa2 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1038,5 +1038,12 @@ Entries: id: 126 time: '2025-04-14T15:37:59.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33548 +- author: Samuka + changes: + - message: Added a Bluespace Instant Effect to the spawn menu + type: Add + id: 127 + time: '2025-04-16T02:26:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36607 Name: Admin Order: 1 From ca1e5e094288391d2e3ce397812d7f03107eaaa1 Mon Sep 17 00:00:00 2001 From: RedBookcase Date: Wed, 16 Apr 2025 03:12:22 -0700 Subject: [PATCH 165/622] Blueprint tweaks. (#36609) * Blueprint tweaks. * Inhand fixes. --------- Co-authored-by: RedBookcase --- .../Entities/Objects/Tools/blueprint.yml | 7 ++++++- .../Objects/Tools/blueprint.rsi/inhand-left.png | Bin 341 -> 449 bytes .../Tools/blueprint.rsi/inhand-right.png | Bin 358 -> 459 bytes .../Objects/Tools/blueprint.rsi/meta.json | 11 +++++++---- .../Objects/Tools/blueprint.rsi/storage.png | Bin 0 -> 312 bytes 5 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 Resources/Textures/Objects/Tools/blueprint.rsi/storage.png diff --git a/Resources/Prototypes/Entities/Objects/Tools/blueprint.yml b/Resources/Prototypes/Entities/Objects/Tools/blueprint.yml index 64aa91c373..82f1ff6725 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/blueprint.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/blueprint.yml @@ -9,8 +9,12 @@ sprite: Objects/Tools/blueprint.rsi state: icon - type: Item - sprite: Objects/Tools/blueprint.rsi size: Normal + shape: + - 0,0,2,0 + storedSprite: + sprite: Objects/Tools/blueprint.rsi + state: storage - type: Blueprint - type: StaticPrice price: 1000 @@ -27,6 +31,7 @@ - type: Blueprint providedRecipes: - Fulton + - FultonBeacon - type: entity parent: BaseBlueprint diff --git a/Resources/Textures/Objects/Tools/blueprint.rsi/inhand-left.png b/Resources/Textures/Objects/Tools/blueprint.rsi/inhand-left.png index 8aecdd7268f7335ef619706660a6ea676b5096d1..18eb6991d06a55656bdadcd93905e0859df22954 100644 GIT binary patch delta 423 zcmcc0bdY(1NLp7=**SBHXJ_gDLZr0%w23NRxdr*E$UUtk|ValD%bLq&Cf47;dRw{`qyW_ z36=OfZJp-I=Iq=8Ek*Fw$E?vzULua9~Wy{I@~#}@7L`U#r$aVtMAjVu2JNVT|GA{ v@~Toqw9Rp`gV)YHwgNg1>cj(4tos;FJYHmdu!a9R0}yz+`njxgN@xNAkvq9# delta 314 zcmV-A0mc5o1JweMB!2;OQb$4nuFf3k0003GNkl%lNz0lM=Rjnx?*1ADR#EPtxTI?^@QWe@Ot1+2Ne z0!7uBHrON6g&b9F*P9+$I@9w+FtN4&0RR91000000AN239-*lVjQ8_CtG=ZdAYpE- ze5!8O%hB+;HY1i7%Z`;v4XVok=&S6d-wUL^2PmrMo2&D$mveMx_6Kq*C3GIWv2J{*9CkXLGDWZP)*-vayx$SDWBixw&-%003YwJ~S+(tVBt^ZU6uP M07*qoM6N<$f?*$v0RR91 diff --git a/Resources/Textures/Objects/Tools/blueprint.rsi/inhand-right.png b/Resources/Textures/Objects/Tools/blueprint.rsi/inhand-right.png index 37dd59e5c3a6ade73d6c428765d5c01995bda25f..57882581ca09e88e2faadee6232307b9ba96c5ad 100644 GIT binary patch delta 433 zcmaFHbeegBN^g>~ehm z;Fd7A0T*|O&H;_shT!#c7fXLR#`?r--5QO`e=@2;!G9+TH2wH_(?0G}^X90Jtqe>Y z3JnOtVf}&I*U!(d)o)xL_1Y>sOS8B9cfjj0^xHM!%=>+XA_M{;<__%()x?9MWf)endrI}|O=KbI->bJm#~lTBW+d@;SNwSfEC{^K^U zj1`XkteXEj{Nkn`pPVlUX;n3z{~&OtVMia_RUg(c{pZ}W$lCEm^|;>MnPV zG2WaTYtiYE@~~z$EkFn%+%HF0;T$BJWVIMw0DZ!q!nx>-mVb-2wH7|#nu(E?<<05d z0&6hq7LbDHTeFHqNRqXz>h9UTx^Mp}lzfskN%2{WCa{*A0000000000V0lICi=pPi z<9aH_#(dJB?>V+-zQa{W(+mbaT|O7;TPzYBV19yF!nXSKXra z_UmK+M@ZG4k3=qj_299)U~Y@w0YfMKY+unU*k3Stuj^R$upT3GrRAN1>mev4(UbiU~#>P(09)v%e|*SiQh~ovpLd&RLo6p8D|MH_3wPnF(f%I^vr- z(kwP*2{C&F&R=bDxcRjCflCTz915QkKPgB>>iWp~=ytTNWW1vC^m@K8J Date: Wed, 16 Apr 2025 10:13:30 +0000 Subject: [PATCH 166/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1665487f57..92e75c052d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,16 +1,4 @@ Entries: -- author: joshepvodka - changes: - - message: Added flavor profiles to beverages that missed them. - type: Add - - message: Tweaked some drink flavor profiles. - type: Tweak - - message: Soda/Booze dispenser will now always eject the shaker/glass before any - bottle or jug. - type: Tweak - id: 7694 - time: '2024-12-09T17:12:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33505 - author: ArtisticRoomba changes: - message: SMES now gives visual feedback for if the maintenance panel is open. @@ -3908,3 +3896,10 @@ id: 8193 time: '2025-04-16T01:33:39.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35752 +- author: RedBookcase + changes: + - message: Minor blueprint tweaks and a new stored sprite for blueprints. + type: Tweak + id: 8194 + time: '2025-04-16T10:12:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36609 From 7e3f3a7ca3715393769a4808c770c4d6a0cbb58a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 16 Apr 2025 20:27:10 +1000 Subject: [PATCH 167/622] Combat mode prediction thing (#36620) Was written before predicted popups prolly --- Content.Shared/CombatMode/SharedCombatModeSystem.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Content.Shared/CombatMode/SharedCombatModeSystem.cs b/Content.Shared/CombatMode/SharedCombatModeSystem.cs index 5eed8ee242..bb3ab712eb 100644 --- a/Content.Shared/CombatMode/SharedCombatModeSystem.cs +++ b/Content.Shared/CombatMode/SharedCombatModeSystem.cs @@ -46,14 +46,8 @@ public abstract class SharedCombatModeSystem : EntitySystem args.Handled = true; SetInCombatMode(uid, !component.IsInCombatMode, component); - // TODO better handling of predicted pop-ups. - // This probably breaks if the client has prediction disabled. - - if (!_netMan.IsClient || !Timing.IsFirstTimePredicted) - return; - var msg = component.IsInCombatMode ? "action-popup-combat-enabled" : "action-popup-combat-disabled"; - _popup.PopupEntity(Loc.GetString(msg), args.Performer, args.Performer); + _popup.PopupClient(Loc.GetString(msg), args.Performer, args.Performer); } public void SetCanDisarm(EntityUid entity, bool canDisarm, CombatModeComponent? component = null) From 0a750fd6db21402145c1c0ff26f54c402873b36e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 16 Apr 2025 20:27:25 +1000 Subject: [PATCH 168/622] Blindness networking (#36623) * Blindness networking Nothing actually sets this. * Update Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Traits/Assorted/PermanentBlindnessComponent.cs | 9 ++++++--- .../Traits/Assorted/PermanentBlindnessSystem.cs | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs b/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs index c1b90b910e..9abbd46f66 100644 --- a/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs +++ b/Content.Shared/Traits/Assorted/PermanentBlindnessComponent.cs @@ -5,10 +5,13 @@ namespace Content.Shared.Traits.Assorted; /// /// This is used for making something blind forever. /// -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class PermanentBlindnessComponent : Component { - [ViewVariables(VVAccess.ReadWrite), DataField] - public int Blindness = 0; // How damaged should their eyes be. Set 0 for maximum damage. + /// + /// How damaged should their eyes be? Set 0 for maximum damage. + /// + [DataField, AutoNetworkedField] + public int Blindness = 0; } diff --git a/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs b/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs index 2ab17e2c5e..7545323546 100644 --- a/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs +++ b/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs @@ -24,7 +24,7 @@ public sealed class PermanentBlindnessSystem : EntitySystem private void OnExamined(Entity blindness, ref ExaminedEvent args) { - if (args.IsInDetailsRange && !_net.IsClient && blindness.Comp.Blindness == 0) + if (args.IsInDetailsRange && blindness.Comp.Blindness == 0) { args.PushMarkup(Loc.GetString("permanent-blindness-trait-examined", ("target", Identity.Entity(blindness, EntityManager)))); } From 2a80540b70000f0aaea0c40adf33f8b2dbb71048 Mon Sep 17 00:00:00 2001 From: J Date: Wed, 16 Apr 2025 11:02:41 +0000 Subject: [PATCH 169/622] Construction spring cleaning (#36163) * Construction warnings cleanup * More construction warnings cleanup * Fix failing ITests - Remove unnecessary casts and dodgy anchroing implementation. * Checking anchor status before setting * Reusing shared system call * inlining anchor setting --- .../Completions/EmptyAllContainers.cs | 7 ++-- .../Completions/EmptyContainer.cs | 7 ++-- .../Construction/Completions/SetAnchor.cs | 14 ++++++-- .../Construction/Completions/SnapToGrid.cs | 2 +- .../Construction/Conditions/ContainerEmpty.cs | 7 ++-- .../Conditions/ContainerNotEmpty.cs | 5 +-- .../Construction/ConstructionSystem.Graph.cs | 34 +++++++++---------- .../ConstructionSystem.Initial.cs | 2 +- .../Conditions/WallmountCondition.cs | 2 +- .../EntitySystems/AnchorableSystem.cs | 4 +-- 10 files changed, 47 insertions(+), 37 deletions(-) diff --git a/Content.Server/Construction/Completions/EmptyAllContainers.cs b/Content.Server/Construction/Completions/EmptyAllContainers.cs index 79de939387..3ed5cf373d 100644 --- a/Content.Server/Construction/Completions/EmptyAllContainers.cs +++ b/Content.Server/Construction/Completions/EmptyAllContainers.cs @@ -2,11 +2,8 @@ using Content.Server.Hands.Systems; using Content.Shared.Construction; using Content.Shared.Hands.Components; using JetBrains.Annotations; -using Robust.Server.Containers; using Robust.Server.GameObjects; using Robust.Shared.Containers; -using Robust.Shared.GameObjects; -using Robust.Shared.Map; namespace Content.Server.Construction.Completions { @@ -31,14 +28,14 @@ namespace Content.Server.Construction.Completions if (!entityManager.TryGetComponent(uid, out ContainerManagerComponent? containerManager)) return; - var containerSys = entityManager.EntitySysManager.GetEntitySystem(); + var containerSys = entityManager.EntitySysManager.GetEntitySystem(); var handSys = entityManager.EntitySysManager.GetEntitySystem(); var transformSys = entityManager.EntitySysManager.GetEntitySystem(); HandsComponent? hands = null; var pickup = Pickup && entityManager.TryGetComponent(userUid, out hands); - foreach (var container in containerManager.GetAllContainers()) + foreach (var container in containerSys.GetAllContainers(uid)) { foreach (var ent in containerSys.EmptyContainer(container, true, reparent: !pickup)) { diff --git a/Content.Server/Construction/Completions/EmptyContainer.cs b/Content.Server/Construction/Completions/EmptyContainer.cs index 21e36e7e14..6d26bb5da1 100644 --- a/Content.Server/Construction/Completions/EmptyContainer.cs +++ b/Content.Server/Construction/Completions/EmptyContainer.cs @@ -21,10 +21,11 @@ namespace Content.Server.Construction.Completions public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager) { - if (!entityManager.TryGetComponent(uid, out ContainerManagerComponent? containerManager) || - !containerManager.TryGetContainer(Container, out var container)) return; + var containerSys = entityManager.EntitySysManager.GetEntitySystem(); + + if (!entityManager.TryGetComponent(uid, out ContainerManagerComponent? containerManager) || + !containerSys.TryGetContainer(uid, Container, out var container, containerManager)) return; - var containerSys = entityManager.EntitySysManager.GetEntitySystem(); var handSys = entityManager.EntitySysManager.GetEntitySystem(); HandsComponent? hands = null; diff --git a/Content.Server/Construction/Completions/SetAnchor.cs b/Content.Server/Construction/Completions/SetAnchor.cs index 989ecc99bd..cdecfa7c90 100644 --- a/Content.Server/Construction/Completions/SetAnchor.cs +++ b/Content.Server/Construction/Completions/SetAnchor.cs @@ -1,4 +1,4 @@ -using Content.Shared.Construction; +using Content.Shared.Construction; using JetBrains.Annotations; namespace Content.Server.Construction.Completions @@ -12,7 +12,17 @@ namespace Content.Server.Construction.Completions public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager) { var transform = entityManager.GetComponent(uid); - transform.Anchored = Value; + + if (transform.Anchored == Value) + return; + + var sys = entityManager.System(); + + if (Value) + sys.AnchorEntity(uid, transform); + else + sys.Unanchor(uid, transform); + } } } diff --git a/Content.Server/Construction/Completions/SnapToGrid.cs b/Content.Server/Construction/Completions/SnapToGrid.cs index 47941108f5..f1c2f8d584 100644 --- a/Content.Server/Construction/Completions/SnapToGrid.cs +++ b/Content.Server/Construction/Completions/SnapToGrid.cs @@ -15,7 +15,7 @@ namespace Content.Server.Construction.Completions var transform = entityManager.GetComponent(uid); if (!transform.Anchored) - transform.Coordinates = transform.Coordinates.SnapToGrid(entityManager); + entityManager.System().SetCoordinates(uid, transform.Coordinates.SnapToGrid(entityManager)); if (SouthRotation) { diff --git a/Content.Server/Construction/Conditions/ContainerEmpty.cs b/Content.Server/Construction/Conditions/ContainerEmpty.cs index cc2b25d1ad..7f940f5b3e 100644 --- a/Content.Server/Construction/Conditions/ContainerEmpty.cs +++ b/Content.Server/Construction/Conditions/ContainerEmpty.cs @@ -1,4 +1,4 @@ -using Content.Shared.Construction; +using Content.Shared.Construction; using Content.Shared.Examine; using JetBrains.Annotations; using Robust.Server.Containers; @@ -39,8 +39,9 @@ namespace Content.Server.Construction.Conditions var entity = args.Examined; - if (!IoCManager.Resolve().TryGetComponent(entity, out ContainerManagerComponent? containerManager) || - !containerManager.TryGetContainer(Container, out var container)) return false; + var entityManager = IoCManager.Resolve(); + if (!entityManager.TryGetComponent(entity, out ContainerManagerComponent? containerManager) || + !entityManager.System().TryGetContainer(entity, Container, out var container, containerManager)) return false; if (container.ContainedEntities.Count == 0) return false; diff --git a/Content.Server/Construction/Conditions/ContainerNotEmpty.cs b/Content.Server/Construction/Conditions/ContainerNotEmpty.cs index c6e79434f4..cb7d2c98ee 100644 --- a/Content.Server/Construction/Conditions/ContainerNotEmpty.cs +++ b/Content.Server/Construction/Conditions/ContainerNotEmpty.cs @@ -32,8 +32,9 @@ namespace Content.Server.Construction.Conditions var entity = args.Examined; - if (!IoCManager.Resolve().TryGetComponent(entity, out ContainerManagerComponent? containerManager) || - !containerManager.TryGetContainer(Container, out var container)) return false; + var entityManager = IoCManager.Resolve(); + if (!entityManager.TryGetComponent(entity, out ContainerManagerComponent? containerManager) || + !entityManager.System().TryGetContainer(entity, Container, out var container, containerManager)) return false; if (container.ContainedEntities.Count != 0) return false; diff --git a/Content.Server/Construction/ConstructionSystem.Graph.cs b/Content.Server/Construction/ConstructionSystem.Graph.cs index 4c73cef703..0027b941f8 100644 --- a/Content.Server/Construction/ConstructionSystem.Graph.cs +++ b/Content.Server/Construction/ConstructionSystem.Graph.cs @@ -66,10 +66,10 @@ namespace Content.Server.Construction if (!Resolve(uid, ref construction, false)) return null; - if (construction.Node is not {} nodeIdentifier) + if (construction.Node is not { } nodeIdentifier) return null; - return GetCurrentGraph(uid, construction) is not {} graph ? null : GetNodeFromGraph(graph, nodeIdentifier); + return GetCurrentGraph(uid, construction) is not { } graph ? null : GetNodeFromGraph(graph, nodeIdentifier); } /// @@ -85,10 +85,10 @@ namespace Content.Server.Construction if (!Resolve(uid, ref construction, false)) return null; - if (construction.EdgeIndex is not {} edgeIndex) + if (construction.EdgeIndex is not { } edgeIndex) return null; - return GetCurrentNode(uid, construction) is not {} node ? null : GetEdgeFromNode(node, edgeIndex); + return GetCurrentNode(uid, construction) is not { } node ? null : GetEdgeFromNode(node, edgeIndex); } /// @@ -102,7 +102,7 @@ namespace Content.Server.Construction if (GetCurrentNode(uid, construction) is not { } node) return (null, null); - if (construction.EdgeIndex is not {} edgeIndex) + if (construction.EdgeIndex is not { } edgeIndex) return (node, null); return (node, GetEdgeFromNode(node, edgeIndex)); @@ -121,7 +121,7 @@ namespace Content.Server.Construction if (!Resolve(uid, ref construction, false)) return null; - if (GetCurrentEdge(uid, construction) is not {} edge) + if (GetCurrentEdge(uid, construction) is not { } edge) return null; return GetStepFromEdge(edge, construction.StepIndex); @@ -141,10 +141,10 @@ namespace Content.Server.Construction if (!Resolve(uid, ref construction)) return null; - if (construction.TargetNode is not {} targetNodeId) + if (construction.TargetNode is not { } targetNodeId) return null; - if (GetCurrentGraph(uid, construction) is not {} graph) + if (GetCurrentGraph(uid, construction) is not { } graph) return null; return GetNodeFromGraph(graph, targetNodeId); @@ -165,10 +165,10 @@ namespace Content.Server.Construction if (!Resolve(uid, ref construction)) return null; - if (construction.TargetEdgeIndex is not {} targetEdgeIndex) + if (construction.TargetEdgeIndex is not { } targetEdgeIndex) return null; - if (GetCurrentNode(uid, construction) is not {} node) + if (GetCurrentNode(uid, construction) is not { } node) return null; return GetEdgeFromNode(node, targetEdgeIndex); @@ -245,8 +245,8 @@ namespace Content.Server.Construction if (!Resolve(uid, ref construction)) return false; - if (GetCurrentGraph(uid, construction) is not {} graph - || GetNodeFromGraph(graph, id) is not {} node) + if (GetCurrentGraph(uid, construction) is not { } graph + || GetNodeFromGraph(graph, id) is not { } node) return false; var oldNode = construction.Node; @@ -257,11 +257,11 @@ namespace Content.Server.Construction $"{ToPrettyString(userUid.Value):player} changed {ToPrettyString(uid):entity}'s node from \"{oldNode}\" to \"{id}\""); // ChangeEntity will handle the pathfinding update. - if (node.Entity.GetId(uid, userUid, new(EntityManager)) is {} newEntity + if (node.Entity.GetId(uid, userUid, new(EntityManager)) is { } newEntity && ChangeEntity(uid, userUid, newEntity, construction) != null) return true; - if(performActions) + if (performActions) PerformActions(uid, userUid, node.Actions); // An action might have deleted the entity... Account for this. @@ -347,7 +347,7 @@ namespace Content.Server.Construction // Retain the target node if an entity change happens in response to deconstruction; // in that case, we must continue to move towards the start node. - if (construction.TargetNode is {} targetNode) + if (construction.TargetNode is { } targetNode) SetPathfindingTarget(newUid, targetNode, newConstruction); } @@ -358,7 +358,7 @@ namespace Content.Server.Construction } if (newConstruction.InteractionQueue.Count > 0 && _queuedUpdates.Add(newUid)) - _constructionUpdateQueue.Enqueue(newUid); + _constructionUpdateQueue.Enqueue(newUid); // Transform transferring. var newTransform = Transform(newUid); @@ -430,7 +430,7 @@ namespace Content.Server.Construction if (!PrototypeManager.TryIndex(graphId, out var graph)) return false; - if(GetNodeFromGraph(graph, nodeId) is not {}) + if (GetNodeFromGraph(graph, nodeId) is not { }) return false; construction.Graph = graphId; diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index 6cc430b74f..94bcc26bf8 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -478,7 +478,7 @@ namespace Content.Server.Construction return; } - var mapPos = location.ToMap(EntityManager, _transformSystem); + var mapPos = _transformSystem.ToMapCoordinates(location); var predicate = GetPredicate(constructionPrototype.CanBuildInImpassable, mapPos); if (!_interactionSystem.InRangeUnobstructed(user, mapPos, predicate: predicate)) diff --git a/Content.Shared/Construction/Conditions/WallmountCondition.cs b/Content.Shared/Construction/Conditions/WallmountCondition.cs index f32cc19eea..65fc6f59fa 100644 --- a/Content.Shared/Construction/Conditions/WallmountCondition.cs +++ b/Content.Shared/Construction/Conditions/WallmountCondition.cs @@ -24,7 +24,7 @@ namespace Content.Shared.Construction.Conditions // get blueprint and user position var transformSystem = entManager.System(); var userWorldPosition = transformSystem.GetWorldPosition(user); - var objWorldPosition = location.ToMap(entManager, transformSystem).Position; + var objWorldPosition = transformSystem.ToMapCoordinates(location).Position; // find direction from user to blueprint var userToObject = (objWorldPosition - userWorldPosition); diff --git a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs index 9c3d6fc9fb..a291473b30 100644 --- a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs +++ b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs @@ -280,7 +280,7 @@ public sealed partial class AnchorableSystem : EntitySystem private bool TileFree(EntityCoordinates coordinates, PhysicsComponent anchorBody) { // Probably ignore CanCollide on the anchoring body? - var gridUid = coordinates.GetGridUid(EntityManager); + var gridUid = _transformSystem.GetGrid(coordinates); if (!TryComp(gridUid, out var grid)) return false; @@ -329,7 +329,7 @@ public sealed partial class AnchorableSystem : EntitySystem public bool AnyUnstackablesAnchoredAt(EntityCoordinates location) { - var gridUid = location.GetGridUid(EntityManager); + var gridUid = _transformSystem.GetGrid(location); if (!TryComp(gridUid, out var grid)) return false; From b1c08582d553692d07c2b0deb7eae5e01f29dbcd Mon Sep 17 00:00:00 2001 From: J Date: Wed, 16 Apr 2025 11:08:22 +0000 Subject: [PATCH 170/622] Various system spring cleaning (#36206) * Various systems warnings cleanup * Last changes before submitting PR * Add guard for transform component, fix failing test * Small corrections * Audio params to specifiers datafields * Using audio params on components and configs --- .../Trigger/TimerTriggerVisualizerSystem.cs | 2 +- .../Cartridges/LogProbeCartridgeComponent.cs | 4 +- .../Cartridges/LogProbeCartridgeSystem.cs | 4 +- .../EmptyOnMachineDeconstructSystem.cs | 8 ++-- Content.Server/Decals/DecalSystem.cs | 5 +- .../Unit/EntitySystems/DisposableSystem.cs | 2 +- .../EntitySystems/SpawnAfterInteractSystem.cs | 3 +- .../Fluids/EntitySystems/PuddleSystem.cs | 4 +- .../IdentityManagement/IdentitySystem.cs | 3 +- .../Implants/SubdermalImplantSystem.cs | 2 +- .../Instruments/InstrumentSystem.cs | 5 +- Content.Server/Medical/HealingSystem.cs | 8 ++-- Content.Server/Mind/MindSystem.cs | 4 +- Content.Server/Parallax/BiomeSystem.cs | 2 +- Content.Server/Points/PointSystem.cs | 2 +- .../Power/EntitySystems/CableSystem.cs | 2 +- .../EntitySystems/EventHorizonSystem.cs | 3 +- .../SingularityAttractorSystem.cs | 4 +- .../Clothing/EntitySystems/ClothingSystem.cs | 4 -- .../Ninja/Systems/DashAbilitySystem.cs | 2 +- .../Ninja/Systems/EmagProviderSystem.cs | 1 - Content.Shared/RCD/Systems/RCDSystem.cs | 5 +- Content.Shared/Random/RandomHelperSystem.cs | 4 +- .../Spawning/EntitySystemExtensions.cs | 4 +- Content.Shared/Tiles/FloorTileSystem.cs | 6 +-- .../Entities/Objects/Materials/materials.yml | 6 +++ .../Objects/Specific/Medical/healing.yml | 48 +++++++++++++++++++ 27 files changed, 101 insertions(+), 46 deletions(-) diff --git a/Content.Client/Trigger/TimerTriggerVisualizerSystem.cs b/Content.Client/Trigger/TimerTriggerVisualizerSystem.cs index 4bea26b47b..ed163f0732 100644 --- a/Content.Client/Trigger/TimerTriggerVisualizerSystem.cs +++ b/Content.Client/Trigger/TimerTriggerVisualizerSystem.cs @@ -52,7 +52,7 @@ public sealed class TimerTriggerVisualizerSystem : VisualizerSystem [DataField, ViewVariables(VVAccess.ReadWrite)] - public SoundSpecifier SoundScan = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg"); + public SoundSpecifier SoundScan = new SoundPathSpecifier("/Audio/Machines/scan_finish.ogg", AudioParams.Default.WithVariation(0.25f)); /// /// Paper to spawn when printing logs. diff --git a/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs b/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs index 75b6b44636..025bb87e17 100644 --- a/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs +++ b/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs @@ -1,6 +1,5 @@ using Content.Shared.Access.Components; using Content.Shared.Administration.Logs; -using Content.Shared.Audio; using Content.Shared.CartridgeLoader; using Content.Shared.CartridgeLoader.Cartridges; using Content.Shared.Database; @@ -8,6 +7,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.Labels.EntitySystems; using Content.Shared.Paper; using Content.Shared.Popups; +using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -52,7 +52,7 @@ public sealed class LogProbeCartridgeSystem : EntitySystem return; //Play scanning sound with slightly randomized pitch - _audio.PlayEntity(ent.Comp.SoundScan, args.InteractEvent.User, target, AudioHelpers.WithVariation(0.25f, _random)); + _audio.PlayEntity(ent.Comp.SoundScan, args.InteractEvent.User, target); _popup.PopupCursor(Loc.GetString("log-probe-scan", ("device", target)), args.InteractEvent.User); ent.Comp.EntityName = Name(target); diff --git a/Content.Server/Containers/EmptyOnMachineDeconstructSystem.cs b/Content.Server/Containers/EmptyOnMachineDeconstructSystem.cs index ae3ca47dd7..ed0350af57 100644 --- a/Content.Server/Containers/EmptyOnMachineDeconstructSystem.cs +++ b/Content.Server/Containers/EmptyOnMachineDeconstructSystem.cs @@ -33,12 +33,14 @@ namespace Content.Server.Containers private void OnDeconstruct(EntityUid uid, EmptyOnMachineDeconstructComponent component, MachineDeconstructedEvent ev) { - if (!EntityManager.TryGetComponent(uid, out var mComp)) + if (!TryComp(uid, out var mComp)) return; - var baseCoords = EntityManager.GetComponent(uid).Coordinates; + + var baseCoords = Transform(uid).Coordinates; + foreach (var v in component.Containers) { - if (mComp.TryGetContainer(v, out var container)) + if (_container.TryGetContainer(uid, v, out var container, mComp)) { _container.EmptyContainer(container, true, baseCoords); } diff --git a/Content.Server/Decals/DecalSystem.cs b/Content.Server/Decals/DecalSystem.cs index 02d3ebd0a1..2e1ed2c68d 100644 --- a/Content.Server/Decals/DecalSystem.cs +++ b/Content.Server/Decals/DecalSystem.cs @@ -36,6 +36,7 @@ namespace Content.Server.Decals [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; private readonly Dictionary> _dirtyChunks = new(); private readonly Dictionary>> _previousSentChunks = new(); @@ -249,7 +250,7 @@ namespace Content.Server.Decals if (!coordinates.IsValid(EntityManager)) return; - var gridId = coordinates.GetGridUid(EntityManager); + var gridId = _transform.GetGrid(coordinates); if (gridId == null) return; @@ -296,7 +297,7 @@ namespace Content.Server.Decals if (!PrototypeManager.HasIndex(decal.Id)) return false; - var gridId = coordinates.GetGridUid(EntityManager); + var gridId = _transform.GetGrid(coordinates); if (!TryComp(gridId, out MapGridComponent? grid)) return false; diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs index 064f9300b3..0e624ca6f5 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs @@ -259,7 +259,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems var newPosition = destination * progress; // This is some supreme shit code. - _xformSystem.SetCoordinates(uid, origin.Offset(newPosition).WithEntityId(currentTube)); + _xformSystem.SetCoordinates(uid, _xformSystem.WithEntityId(origin.Offset(newPosition), currentTube)); continue; } diff --git a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs index 407f877515..2e4cbee10c 100644 --- a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs +++ b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs @@ -17,6 +17,7 @@ namespace Content.Server.Engineering.EntitySystems [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly StackSystem _stackSystem = default!; [Dependency] private readonly TurfSystem _turfSystem = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -31,7 +32,7 @@ namespace Content.Server.Engineering.EntitySystems return; if (string.IsNullOrEmpty(component.Prototype)) return; - if (!TryComp(args.ClickLocation.GetGridUid(EntityManager), out var grid)) + if (!TryComp(_transform.GetGrid(args.ClickLocation), out var grid)) return; if (!grid.TryGetTileRef(args.ClickLocation, out var tileRef)) return; diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index 8267b8e971..9cf3a1252f 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -56,6 +56,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem [Dependency] private readonly StepTriggerSystem _stepTrigger = default!; [Dependency] private readonly SpeedModifierContactsSystem _speedModContacts = default!; [Dependency] private readonly TileFrictionController _tile = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [ValidatePrototypeId] private const string Blood = "Blood"; @@ -626,7 +627,8 @@ public sealed partial class PuddleSystem : SharedPuddleSystem return false; } - var gridUid = coordinates.GetGridUid(EntityManager); + var gridUid = _transform.GetGrid(coordinates); + if (!TryComp(gridUid, out var mapGrid)) { puddleUid = EntityUid.Invalid; diff --git a/Content.Server/IdentityManagement/IdentitySystem.cs b/Content.Server/IdentityManagement/IdentitySystem.cs index d90bf6021d..f1b34c16fa 100644 --- a/Content.Server/IdentityManagement/IdentitySystem.cs +++ b/Content.Server/IdentityManagement/IdentitySystem.cs @@ -27,6 +27,7 @@ public sealed class IdentitySystem : SharedIdentitySystem [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly CriminalRecordsConsoleSystem _criminalRecordsConsole = default!; + [Dependency] private readonly GrammarSystem _grammarSystem = default!; private HashSet _queuedIdentityUpdates = new(); @@ -102,7 +103,7 @@ public sealed class IdentitySystem : SharedIdentitySystem // If presumed name is null and we're using that, we set proper noun to be false ("the old woman") if (name != representation.TrueName && representation.PresumedName == null) - identityGrammar.ProperNoun = false; + _grammarSystem.SetProperNoun((uid, grammar), false); Dirty(ident, identityGrammar); } diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index bd6ffe375c..e2482b7b60 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -130,7 +130,7 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem private EntityCoordinates? SelectRandomTileInRange(TransformComponent userXform, float radius) { - var userCoords = userXform.Coordinates.ToMap(EntityManager, _xform); + var userCoords = _xform.ToMapCoordinates(userXform.Coordinates); _targetGrids.Clear(); _lookupSystem.GetEntitiesInRange(userCoords, radius, _targetGrids); Entity? targetGrid = null; diff --git a/Content.Server/Instruments/InstrumentSystem.cs b/Content.Server/Instruments/InstrumentSystem.cs index f74dd7fb13..2539db7a6f 100644 --- a/Content.Server/Instruments/InstrumentSystem.cs +++ b/Content.Server/Instruments/InstrumentSystem.cs @@ -225,7 +225,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem { var metadataQuery = EntityManager.GetEntityQuery(); - if (Deleted(uid, metadataQuery)) + if (Deleted(uid)) return Array.Empty<(NetEntity, string)>(); var list = new ValueList<(NetEntity, string)>(); @@ -380,7 +380,6 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem } var activeQuery = EntityManager.GetEntityQuery(); - var metadataQuery = EntityManager.GetEntityQuery(); var transformQuery = EntityManager.GetEntityQuery(); var query = AllEntityQuery(); @@ -388,7 +387,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem { if (instrument.Master is {} master) { - if (Deleted(master, metadataQuery)) + if (Deleted(master)) { Clean(uid, instrument); } diff --git a/Content.Server/Medical/HealingSystem.cs b/Content.Server/Medical/HealingSystem.cs index b3318b8c2a..acbbce9e50 100644 --- a/Content.Server/Medical/HealingSystem.cs +++ b/Content.Server/Medical/HealingSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Medical.Components; using Content.Server.Popups; using Content.Server.Stack; using Content.Shared.Chemistry.EntitySystems; -using Content.Shared.Audio; using Content.Shared.Damage; using Content.Shared.Database; using Content.Shared.DoAfter; @@ -21,6 +20,7 @@ using Content.Shared.Popups; using Content.Shared.Stacks; using Robust.Shared.Audio.Systems; using Robust.Shared.Random; +using Robust.Shared.Audio; namespace Content.Server.Medical; @@ -31,7 +31,6 @@ public sealed class HealingSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly StackSystem _stacks = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!; @@ -115,7 +114,7 @@ public sealed class HealingSystem : EntitySystem $"{EntityManager.ToPrettyString(args.User):user} healed themselves for {total:damage} damage"); } - _audio.PlayPvs(healing.HealingEndSound, entity.Owner, AudioHelpers.WithVariation(0.125f, _random).WithVolume(1f)); + _audio.PlayPvs(healing.HealingEndSound, entity.Owner); // Logic to determine the whether or not to repeat the healing action args.Repeat = (HasDamage(entity, healing) && !dontRepeat); @@ -198,8 +197,7 @@ public sealed class HealingSystem : EntitySystem return false; } - _audio.PlayPvs(component.HealingBeginSound, uid, - AudioHelpers.WithVariation(0.125f, _random).WithVolume(1f)); + _audio.PlayPvs(component.HealingBeginSound, uid); var isNotSelf = user != target; diff --git a/Content.Server/Mind/MindSystem.cs b/Content.Server/Mind/MindSystem.cs index 1b55a533e3..0d3c0c750c 100644 --- a/Content.Server/Mind/MindSystem.cs +++ b/Content.Server/Mind/MindSystem.cs @@ -215,7 +215,7 @@ public sealed class MindSystem : SharedMindSystem // not implicitly via optional arguments. var position = Deleted(mind.OwnedEntity) - ? _gameTicker.GetObserverSpawnPoint().ToMap(EntityManager, _transform) + ? _transform.ToMapCoordinates(_gameTicker.GetObserverSpawnPoint()) : _transform.GetMapCoordinates(mind.OwnedEntity.Value); entity = Spawn(GameTicker.ObserverPrototypeName, position); @@ -336,7 +336,7 @@ public sealed class MindSystem : SharedMindSystem if (_players.TryGetSessionById(userId.Value, out var ret)) { mind.Session = ret; - _pvsOverride.AddSessionOverride(netMind, ret); + _pvsOverride.AddSessionOverride(mindId, ret); _players.SetAttachedEntity(ret, mind.CurrentEntity); } } diff --git a/Content.Server/Parallax/BiomeSystem.cs b/Content.Server/Parallax/BiomeSystem.cs index dfa084c283..8dac0bbb75 100644 --- a/Content.Server/Parallax/BiomeSystem.cs +++ b/Content.Server/Parallax/BiomeSystem.cs @@ -256,7 +256,7 @@ public sealed partial class BiomeSystem : SharedBiomeSystem private void OnFTLStarted(ref FTLStartedEvent ev) { - var targetMap = ev.TargetCoordinates.ToMap(EntityManager, _transform); + var targetMap = _transform.ToMapCoordinates(ev.TargetCoordinates); var targetMapUid = _mapManager.GetMapEntityId(targetMap.MapId); if (!TryComp(targetMapUid, out var biome)) diff --git a/Content.Server/Points/PointSystem.cs b/Content.Server/Points/PointSystem.cs index cf33f8e3c6..77c4793c92 100644 --- a/Content.Server/Points/PointSystem.cs +++ b/Content.Server/Points/PointSystem.cs @@ -25,7 +25,7 @@ public sealed class PointSystem : SharedPointSystem private void OnStartup(EntityUid uid, PointManagerComponent component, ComponentStartup args) { - _pvsOverride.AddGlobalOverride(GetNetEntity(uid)); + _pvsOverride.AddGlobalOverride(uid); } /// diff --git a/Content.Server/Power/EntitySystems/CableSystem.cs b/Content.Server/Power/EntitySystems/CableSystem.cs index 8fc7edacf3..1aeddf6e29 100644 --- a/Content.Server/Power/EntitySystems/CableSystem.cs +++ b/Content.Server/Power/EntitySystems/CableSystem.cs @@ -69,7 +69,7 @@ public sealed partial class CableSystem : EntitySystem // anchor state can change as a result of deletion (detach to null). // We don't want to spawn an entity when deleted. - if (!TryLifeStage(uid, out var life) || life >= EntityLifeStage.Terminating) + if (TerminatingOrDeleted(uid)) return; // This entity should not be un-anchorable. But this can happen if the grid-tile is deleted (RCD, explosion, diff --git a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs index 68543cc175..c9e217b170 100644 --- a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs +++ b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Singularity.Components; using Content.Shared.Singularity.EntitySystems; using Content.Shared.Tag; using Robust.Shared.Containers; +using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; @@ -477,7 +478,7 @@ public sealed class EventHorizonSystem : SharedEventHorizonSystem if (drop_container is null) _containerSystem.TryGetContainingContainer((uid, null, null), out drop_container); - foreach (var container in comp.GetAllContainers()) + foreach (var container in _containerSystem.GetAllContainers(uid)) { ConsumeEntitiesInContainer(args.EventHorizonUid, container, args.EventHorizon, drop_container); } diff --git a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs index bc0de7c8c6..4b31d5f814 100644 --- a/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs @@ -64,7 +64,7 @@ public sealed class SingularityAttractorSystem : EntitySystem attractor.LastPulseTime = _timing.CurTime; - var mapPos = xform.Coordinates.ToMap(EntityManager, _transform); + var mapPos = _transform.ToMapCoordinates(xform.Coordinates); if (mapPos == MapCoordinates.Nullspace) return; @@ -72,7 +72,7 @@ public sealed class SingularityAttractorSystem : EntitySystem var query = EntityQuery(); foreach (var (singulo, walk, singuloXform) in query) { - var singuloMapPos = singuloXform.Coordinates.ToMap(EntityManager, _transform); + var singuloMapPos = _transform.ToMapCoordinates(singuloXform.Coordinates); if (singuloMapPos.MapId != mapPos.MapId) continue; diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index f8ab79ec78..d752afc1ad 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -1,13 +1,11 @@ using Content.Shared.Clothing.Components; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; -using Content.Shared.Humanoid; using Content.Shared.Interaction.Events; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Strip.Components; -using Robust.Shared.Containers; using Robust.Shared.GameStates; namespace Content.Shared.Clothing.EntitySystems; @@ -15,10 +13,8 @@ namespace Content.Shared.Clothing.EntitySystems; public abstract class ClothingSystem : EntitySystem { [Dependency] private readonly SharedItemSystem _itemSys = default!; - [Dependency] private readonly SharedContainerSystem _containerSys = default!; [Dependency] private readonly InventorySystem _invSystem = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly HideLayerClothingSystem _hideLayer = default!; public override void Initialize() { diff --git a/Content.Shared/Ninja/Systems/DashAbilitySystem.cs b/Content.Shared/Ninja/Systems/DashAbilitySystem.cs index 830b51d5ad..cd8f7da768 100644 --- a/Content.Shared/Ninja/Systems/DashAbilitySystem.cs +++ b/Content.Shared/Ninja/Systems/DashAbilitySystem.cs @@ -71,7 +71,7 @@ public sealed class DashAbilitySystem : EntitySystem } var origin = _transform.GetMapCoordinates(user); - var target = args.Target.ToMap(EntityManager, _transform); + var target = _transform.ToMapCoordinates(args.Target); if (!_examine.InRangeUnOccluded(origin, target, SharedInteractionSystem.MaxRaycastRange, null)) { // can only dash if the destination is visible on screen diff --git a/Content.Shared/Ninja/Systems/EmagProviderSystem.cs b/Content.Shared/Ninja/Systems/EmagProviderSystem.cs index 3be2ae52e1..d17c4b32cc 100644 --- a/Content.Shared/Ninja/Systems/EmagProviderSystem.cs +++ b/Content.Shared/Ninja/Systems/EmagProviderSystem.cs @@ -15,7 +15,6 @@ namespace Content.Shared.Ninja.Systems; public sealed class EmagProviderSystem : EntitySystem { [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly EmagSystem _emag = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedNinjaGlovesSystem _gloves = default!; diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index 9e5096c77c..a5c2af39ae 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -45,6 +45,7 @@ public class RCDSystem : EntitySystem [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TagSystem _tags = default!; private readonly int _instantConstructionDelay = 0; @@ -561,12 +562,12 @@ public class RCDSystem : EntitySystem public bool TryGetMapGridData(EntityCoordinates location, [NotNullWhen(true)] out MapGridData? mapGridData) { mapGridData = null; - var gridUid = location.GetGridUid(EntityManager); + var gridUid = _transform.GetGrid(location); if (!TryComp(gridUid, out var mapGrid)) { location = location.AlignWithClosestGridTile(1.75f, EntityManager); - gridUid = location.GetGridUid(EntityManager); + gridUid = _transform.GetGrid(location); // Check if we got a grid ID the second time round if (!TryComp(gridUid, out mapGrid)) diff --git a/Content.Shared/Random/RandomHelperSystem.cs b/Content.Shared/Random/RandomHelperSystem.cs index 66ebcc3f78..145b47b045 100644 --- a/Content.Shared/Random/RandomHelperSystem.cs +++ b/Content.Shared/Random/RandomHelperSystem.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.Random.Helpers; using Robust.Shared.Random; using Robust.Shared.Utility; @@ -20,7 +20,7 @@ public sealed class RandomHelperSystem : EntitySystem var offset = new Vector2(randomX, randomY); var xform = Transform(entity); - _transform.SetLocalPosition(xform, xform.LocalPosition + offset); + _transform.SetLocalPosition(entity, xform.LocalPosition + offset, xform); } public void RandomOffset(EntityUid entity, float min, float max) diff --git a/Content.Shared/Spawning/EntitySystemExtensions.cs b/Content.Shared/Spawning/EntitySystemExtensions.cs index 507a0f4aa2..8ee0d3fc45 100644 --- a/Content.Shared/Spawning/EntitySystemExtensions.cs +++ b/Content.Shared/Spawning/EntitySystemExtensions.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using Content.Shared.Physics; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; @@ -16,7 +16,7 @@ namespace Content.Shared.Spawning SharedPhysicsSystem? physicsManager = null) { physicsManager ??= entityManager.System(); - var mapCoordinates = coordinates.ToMap(entityManager, entityManager.System()); + var mapCoordinates = entityManager.System().ToMapCoordinates(coordinates); return entityManager.SpawnIfUnobstructed(prototypeName, mapCoordinates, collisionLayer, box, physicsManager); } diff --git a/Content.Shared/Tiles/FloorTileSystem.cs b/Content.Shared/Tiles/FloorTileSystem.cs index 3acd5051c9..9b78904859 100644 --- a/Content.Shared/Tiles/FloorTileSystem.cs +++ b/Content.Shared/Tiles/FloorTileSystem.cs @@ -59,14 +59,14 @@ public sealed class FloorTileSystem : EntitySystem // this looks a bit sussy but it might be because it needs to be able to place off of grids and expand them var location = args.ClickLocation.AlignWithClosestGridTile(); - var locationMap = location.ToMap(EntityManager, _transform); + var locationMap = _transform.ToMapCoordinates(location); if (locationMap.MapId == MapId.Nullspace) return; var physicQuery = GetEntityQuery(); var transformQuery = GetEntityQuery(); - var map = location.ToMap(EntityManager, _transform); + var map = _transform.ToMapCoordinates(location); // Disallow placement close to grids. // FTLing close is okay but this makes alignment too finnicky. @@ -92,7 +92,7 @@ public sealed class FloorTileSystem : EntitySystem return; } - var userPos = transformQuery.GetComponent(args.User).Coordinates.ToMapPos(EntityManager, _transform); + var userPos = _transform.ToMapCoordinates(transformQuery.GetComponent(args.User).Coordinates).Position; var dir = userPos - map.Position; var canAccessCenter = false; if (dir.LengthSquared() > 0.01) diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index e16044b282..a5d097d86d 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -93,8 +93,14 @@ bloodlossModifier: -4 healingBeginSound: path: "/Audio/Items/Medical/brutepack_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/brutepack_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: Stack stackType: Cloth baseLayer: base diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index 768bc77004..96eb8ed8ad 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -38,8 +38,14 @@ Caustic: -1.5 healingBeginSound: path: "/Audio/Items/Medical/ointment_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/ointment_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: Stack stackType: Ointment count: 10 @@ -89,8 +95,14 @@ Caustic: -10 healingBeginSound: path: "/Audio/Items/Medical/ointment_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/ointment_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: Stack stackType: RegenerativeMesh count: 10 @@ -128,8 +140,14 @@ Brute: -15 # 5 for each type in the group healingBeginSound: path: "/Audio/Items/Medical/brutepack_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/brutepack_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: Stack stackType: Brutepack count: 10 @@ -178,8 +196,14 @@ bloodlossModifier: -10 # a suture should stop ongoing bleeding healingBeginSound: path: "/Audio/Items/Medical/brutepack_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/brutepack_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: Stack stackType: MedicatedSuture count: 10 @@ -218,8 +242,14 @@ ModifyBloodLevel: 15 #restores about 5% blood per use on standard humanoids. healingBeginSound: path: "/Audio/Items/Medical/brutepack_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/brutepack_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: Stack stackType: Bloodpack count: 10 @@ -268,8 +298,14 @@ delay: 0.5 healingBeginSound: path: "/Audio/Items/Medical/brutepack_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/brutepack_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: entity name: roll of gauze @@ -298,8 +334,14 @@ bloodlossModifier: -10 healingBeginSound: path: "/Audio/Items/Medical/brutepack_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/brutepack_end.ogg" + params: + volume: 1.0 + variation: 0.125 - type: Stack stackType: Gauze count: 10 @@ -359,8 +401,14 @@ selfHealPenaltyMultiplier: 0 healingBeginSound: path: "/Audio/Items/Medical/ointment_begin.ogg" + params: + volume: 1.0 + variation: 0.125 healingEndSound: path: "/Audio/Items/Medical/ointment_end.ogg" + params: + volume: 1.0 + variation: 0.125 # Pills - type: entity From 0da8984431e67ae007f707cd8e3de06b5f325813 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Wed, 16 Apr 2025 13:54:42 +0200 Subject: [PATCH 171/622] Fix certain foldable items not being possible to store in crates/lockers (#36625) Remove OnStoreThisAttempt --- Content.Shared/Foldable/FoldableSystem.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Content.Shared/Foldable/FoldableSystem.cs b/Content.Shared/Foldable/FoldableSystem.cs index 3ece56720a..3ba4201e79 100644 --- a/Content.Shared/Foldable/FoldableSystem.cs +++ b/Content.Shared/Foldable/FoldableSystem.cs @@ -9,6 +9,7 @@ using Robust.Shared.Utility; namespace Content.Shared.Foldable; +// TODO: This system could arguably be refactored into a general state system, as it is being utilized for a lot of different objects with various needs. public sealed class FoldableSystem : EntitySystem { [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -24,7 +25,6 @@ public sealed class FoldableSystem : EntitySystem SubscribeLocalEvent(OnFoldableInit); SubscribeLocalEvent(OnInsertEvent); - SubscribeLocalEvent(OnStoreThisAttempt); SubscribeLocalEvent(OnFoldableOpenAttempt); SubscribeLocalEvent(OnStrapAttempt); @@ -46,12 +46,6 @@ public sealed class FoldableSystem : EntitySystem args.Cancelled = true; } - public void OnStoreThisAttempt(EntityUid uid, FoldableComponent comp, ref InsertIntoEntityStorageAttemptEvent args) - { - if (comp.IsFolded) - args.Cancelled = true; - } - public void OnStrapAttempt(EntityUid uid, FoldableComponent comp, ref StrapAttemptEvent args) { if (comp.IsFolded) From de33ed7f02280c39f1f4517fbd4e8cd06d4eb650 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 11:55:49 +0000 Subject: [PATCH 172/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 92e75c052d..b02e124756 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: SMES now gives visual feedback for if the maintenance panel is open. - type: Fix - id: 7695 - time: '2024-12-10T10:00:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33808 - author: metalgearsloth changes: - message: Fix blank newlines on examine tooltips (e.g. tables). @@ -3903,3 +3896,10 @@ id: 8194 time: '2025-04-16T10:12:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36609 +- author: SlamBamActionman + changes: + - message: Unfolded bandanas/lab coats now fit in crates again. + type: Fix + id: 8195 + time: '2025-04-16T11:54:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36625 From a436032963c1c382deb10f14a38c3a1fb52c60a0 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 16 Apr 2025 22:23:40 +1000 Subject: [PATCH 173/622] Fix tippy speech time (#36616) --- Content.Server/Tips/TipsSystem.cs | 20 +++++++++++++++++++- Content.Shared/Tips/TippyEvent.cs | 2 ++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Content.Server/Tips/TipsSystem.cs b/Content.Server/Tips/TipsSystem.cs index 2f7edd45d6..effbb7ba87 100644 --- a/Content.Server/Tips/TipsSystem.cs +++ b/Content.Server/Tips/TipsSystem.cs @@ -35,6 +35,16 @@ public sealed class TipsSystem : EntitySystem private string _tipsDataset = ""; private float _tipTippyChance; + /// + /// Always adds this time to a speech message. This is so really short message stay around for a bit. + /// + private const float SpeechBuffer = 3f; + + /// + /// Expected reading speed. + /// + private const float Wpm = 180f; + [ViewVariables(VVAccess.ReadWrite)] private TimeSpan _nextTipTime = TimeSpan.Zero; @@ -127,6 +137,8 @@ public sealed class TipsSystem : EntitySystem if (args.Length > 3) ev.SpeakTime = float.Parse(args[3]); + else + ev.SpeakTime = GetSpeechTime(ev.Msg); if (args.Length > 4) ev.SlideTime = float.Parse(args[4]); @@ -183,6 +195,12 @@ public sealed class TipsSystem : EntitySystem _tipTippyChance = value; } + public static float GetSpeechTime(string text) + { + var wordCount = (float)text.Split().Length; + return SpeechBuffer + wordCount * (60f / Wpm); + } + private void AnnounceRandomTip() { if (!_prototype.TryIndex(_tipsDataset, out var tips)) @@ -194,7 +212,7 @@ public sealed class TipsSystem : EntitySystem if (_random.Prob(_tipTippyChance)) { var ev = new TippyEvent(msg); - ev.SpeakTime = 1 + tip.Length * 0.05f; + ev.SpeakTime = GetSpeechTime(msg); RaiseNetworkEvent(ev); } else { diff --git a/Content.Shared/Tips/TippyEvent.cs b/Content.Shared/Tips/TippyEvent.cs index 4370e9c822..e5dc0b7f35 100644 --- a/Content.Shared/Tips/TippyEvent.cs +++ b/Content.Shared/Tips/TippyEvent.cs @@ -13,6 +13,8 @@ public sealed class TippyEvent : EntityEventArgs public string Msg; public string? Proto; + + // TODO: Why are these defaults even here, have the caller specify. This get overriden only most of the time. public float SpeakTime = 5; public float SlideTime = 3; public float WaddleInterval = 0.5f; From c9964a61b2d8573284978f9ca32df9f39424f7c6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 12:24:47 +0000 Subject: [PATCH 174/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b02e124756..9297910f59 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Fix blank newlines on examine tooltips (e.g. tables). - type: Fix - id: 7696 - time: '2024-12-10T13:45:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33813 - author: slarticodefast changes: - message: Fixed the greytide virus event affecting non-station maps. @@ -3903,3 +3896,10 @@ id: 8195 time: '2025-04-16T11:54:42.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36625 +- author: metalgearsloth + changes: + - message: Fixes tippy messages being too sh- + type: Fix + id: 8196 + time: '2025-04-16T12:23:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36616 From cbf0f6fdd0669f6648752cbba2e05c6c8da95be0 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Wed, 16 Apr 2025 16:12:30 +0200 Subject: [PATCH 175/622] Remove fixture MachineLayer from pet carriers (#36627) Initial commit --- Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml b/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml index 4ae684c193..e690e1d587 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/pet_carrier.yml @@ -1,12 +1,12 @@ - type: entity id: PetCarrier - name: big pet carrier + name: pet carrier description: Allows large animals to be carried comfortably. It smells vaguely of toilet water and explosives. parent: BaseStructureDynamic components: - type: Sprite noRot: true - drawdepth: Objects + drawdepth: Items sprite: Objects/Storage/petcarrier.rsi layers: - state: pet_carrier_base @@ -31,8 +31,6 @@ density: 25 mask: - ItemMask - layer: - - MachineLayer - type: EntityStorage capacity: 1 airtight: false From 7aa0c7562e15ded888c1d29fcf235a2b6647c91e Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 14:13:37 +0000 Subject: [PATCH 176/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9297910f59..2715a2ecc1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed the greytide virus event affecting non-station maps. - type: Fix - id: 7697 - time: '2024-12-11T14:30:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33806 - author: metalgearsloth changes: - message: Fix battery self-recharging items like the antique laser gun from mispredicting. @@ -3903,3 +3896,10 @@ id: 8196 time: '2025-04-16T12:23:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36616 +- author: SlamBamActionman + changes: + - message: Closed pet carriers no longer push players or lockers. + type: Fix + id: 8197 + time: '2025-04-16T14:12:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36627 From fb388d2265ec34872883c1e5d4405517d8d917c2 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Wed, 16 Apr 2025 19:04:48 +0200 Subject: [PATCH 177/622] Role subtypes (#35359) --- .../Administration/AdminNameOverlay.cs | 101 +++++++++++++----- .../Administration/OverlayOptions.cs | 15 +++ .../Systems/AdminSystem.Overlay.cs | 8 +- .../UI/Tabs/PlayerTab/PlayerTab.xaml.cs | 39 ++++++- .../UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs | 83 +++++++++++--- .../UI/Tabs/PlayerTab/PlayerTabOptions.cs | 24 +++++ .../Options/UI/Tabs/AdminOptionsTab.xaml | 20 ++-- .../Options/UI/Tabs/AdminOptionsTab.xaml.cs | 43 +++++++- .../Character/CharacterUIController.cs | 15 +-- .../Administration/Systems/AdminSystem.cs | 5 + Content.Shared/Administration/PlayerInfo.cs | 1 + Content.Shared/CCVar/CCVars.Interface.cs | 49 ++++++--- Content.Shared/Mind/MindComponent.cs | 6 ++ Content.Shared/Mind/RoleTypePrototype.cs | 2 +- Content.Shared/Roles/MindRoleComponent.cs | 10 +- Content.Shared/Roles/SharedRoleSystem.cs | 32 +++--- .../en-US/escape-menu/ui/options-menu.ftl | 42 ++++++-- Resources/Locale/en-US/mind/role-types.ftl | 16 +++ .../Prototypes/Roles/MindRoles/mind_roles.yml | 17 ++- Resources/Prototypes/Roles/role_types.yml | 7 +- 20 files changed, 414 insertions(+), 121 deletions(-) create mode 100644 Content.Client/Administration/OverlayOptions.cs create mode 100644 Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabOptions.cs diff --git a/Content.Client/Administration/AdminNameOverlay.cs b/Content.Client/Administration/AdminNameOverlay.cs index c0f31f1e3d..0d424cbff0 100644 --- a/Content.Client/Administration/AdminNameOverlay.cs +++ b/Content.Client/Administration/AdminNameOverlay.cs @@ -6,6 +6,7 @@ using Content.Shared.Administration; using Content.Shared.CCVar; using Content.Shared.Ghost; using Content.Shared.Mind; +using Content.Shared.Roles; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; @@ -22,10 +23,11 @@ internal sealed class AdminNameOverlay : Overlay private readonly IEyeManager _eyeManager; private readonly EntityLookupSystem _entityLookup; private readonly IUserInterfaceManager _userInterfaceManager; + private readonly SharedRoleSystem _roles; private readonly Font _font; private readonly Font _fontBold; - private bool _overlayClassic; - private bool _overlaySymbols; + private AdminOverlayAntagFormat _overlayFormat; + private AdminOverlayAntagSymbolStyle _overlaySymbolStyle; private bool _overlayPlaytime; private bool _overlayStartingJob; private float _ghostFadeDistance; @@ -33,9 +35,10 @@ internal sealed class AdminNameOverlay : Overlay private int _overlayStackMax; private float _overlayMergeDistance; - //TODO make this adjustable via GUI + //TODO make this adjustable via GUI? private readonly ProtoId[] _filter = ["SoloAntagonist", "TeamAntagonist", "SiliconAntagonist", "FreeAgent"]; + private readonly string _antagLabelClassic = Loc.GetString("admin-overlay-antag-classic"); public AdminNameOverlay( @@ -45,20 +48,22 @@ internal sealed class AdminNameOverlay : Overlay IResourceCache resourceCache, EntityLookupSystem entityLookup, IUserInterfaceManager userInterfaceManager, - IConfigurationManager config) + IConfigurationManager config, + SharedRoleSystem roles) { _system = system; _entityManager = entityManager; _eyeManager = eyeManager; _entityLookup = entityLookup; _userInterfaceManager = userInterfaceManager; + _roles = roles; ZIndex = 200; // Setting these to a specific ttf would break the antag symbols _font = resourceCache.NotoStack(); _fontBold = resourceCache.NotoStack(variation: "Bold"); - config.OnValueChanged(CCVars.AdminOverlayClassic, (show) => { _overlayClassic = show; }, true); - config.OnValueChanged(CCVars.AdminOverlaySymbols, (show) => { _overlaySymbols = show; }, true); + config.OnValueChanged(CCVars.AdminOverlayAntagFormat, (show) => { _overlayFormat = UpdateOverlayFormat(show); }, true); + config.OnValueChanged(CCVars.AdminOverlaySymbolStyle, (show) => { _overlaySymbolStyle = UpdateOverlaySymbolStyle(show); }, true); config.OnValueChanged(CCVars.AdminOverlayPlaytime, (show) => { _overlayPlaytime = show; }, true); config.OnValueChanged(CCVars.AdminOverlayStartingJob, (show) => { _overlayStartingJob = show; }, true); config.OnValueChanged(CCVars.AdminOverlayGhostHideDistance, (f) => { _ghostHideDistance = f; }, true); @@ -67,6 +72,22 @@ internal sealed class AdminNameOverlay : Overlay config.OnValueChanged(CCVars.AdminOverlayMergeDistance, (f) => { _overlayMergeDistance = f; }, true); } + private AdminOverlayAntagFormat UpdateOverlayFormat(string formatString) + { + if (!Enum.TryParse(formatString, out var format)) + format = AdminOverlayAntagFormat.Binary; + + return format; + } + + private AdminOverlayAntagSymbolStyle UpdateOverlaySymbolStyle(string symbolString) + { + if (!Enum.TryParse(symbolString, out var symbolStyle)) + symbolStyle = AdminOverlayAntagSymbolStyle.Off; + + return symbolStyle; + } + public override OverlaySpace Space => OverlaySpace.ScreenSpace; protected override void Draw(in OverlayDrawArgs args) @@ -183,34 +204,56 @@ internal sealed class AdminNameOverlay : Overlay currentOffset += lineoffset; } - // Classic Antag Label - if (_overlayClassic && playerInfo.Antag) + // Determine antag symbol + string? symbol; + switch (_overlaySymbolStyle) { - var symbol = _overlaySymbols ? Loc.GetString("player-tab-antag-prefix") : string.Empty; - var label = _overlaySymbols - ? Loc.GetString("player-tab-character-name-antag-symbol", - ("symbol", symbol), - ("name", _antagLabelClassic)) - : _antagLabelClassic; - color = Color.OrangeRed; - color.A = alpha; - args.ScreenHandle.DrawString(_fontBold, screenCoordinates + currentOffset, label, uiScale, color); - currentOffset += lineoffset; + case AdminOverlayAntagSymbolStyle.Specific: + symbol = playerInfo.RoleProto.Symbol; + break; + case AdminOverlayAntagSymbolStyle.Basic: + symbol = Loc.GetString("player-tab-antag-prefix"); + break; + default: + case AdminOverlayAntagSymbolStyle.Off: + symbol = string.Empty; + break; } - // Role Type - else if (!_overlayClassic && _filter.Contains(playerInfo.RoleProto)) + + // Determine antag/role type name + string? text; + switch (_overlayFormat) { - var symbol = _overlaySymbols && playerInfo.Antag ? playerInfo.RoleProto.Symbol : string.Empty; - var role = Loc.GetString(playerInfo.RoleProto.Name).ToUpper(); - var label = _overlaySymbols - ? Loc.GetString("player-tab-character-name-antag-symbol", ("symbol", symbol), ("name", role)) - : role; - color = playerInfo.RoleProto.Color; - color.A = alpha; - args.ScreenHandle.DrawString(_fontBold, screenCoordinates + currentOffset, label, uiScale, color); - currentOffset += lineoffset; + case AdminOverlayAntagFormat.Roletype: + color = playerInfo.RoleProto.Color; + symbol = _filter.Contains(playerInfo.RoleProto) ? symbol : string.Empty; + text = _filter.Contains(playerInfo.RoleProto) + ? Loc.GetString(playerInfo.RoleProto.Name).ToUpper() + : string.Empty; + break; + case AdminOverlayAntagFormat.Subtype: + color = playerInfo.RoleProto.Color; + symbol = _filter.Contains(playerInfo.RoleProto) ? symbol : string.Empty; + text = _filter.Contains(playerInfo.RoleProto) + ? _roles.GetRoleSubtypeLabel(playerInfo.RoleProto.Name, playerInfo.Subtype).ToUpper() + : string.Empty; + break; + default: + case AdminOverlayAntagFormat.Binary: + color = Color.OrangeRed; + symbol = playerInfo.Antag ? symbol : string.Empty; + text = playerInfo.Antag ? _antagLabelClassic : string.Empty; + break; } + // Draw antag label + color.A = alpha; + var label = !string.IsNullOrEmpty(symbol) + ? Loc.GetString("player-tab-character-name-antag-symbol", ("symbol", symbol), ("name", text)) + : text; + args.ScreenHandle.DrawString(_fontBold, screenCoordinates + currentOffset, label, uiScale, color); + currentOffset += lineoffset; + //Save the coordinates and size of the text block, for stack merge check drawnOverlays.Add((screenCoordinatesCenter, currentOffset)); } diff --git a/Content.Client/Administration/OverlayOptions.cs b/Content.Client/Administration/OverlayOptions.cs new file mode 100644 index 0000000000..39195603bf --- /dev/null +++ b/Content.Client/Administration/OverlayOptions.cs @@ -0,0 +1,15 @@ +namespace Content.Client.Administration; + +public enum AdminOverlayAntagFormat +{ + Binary, + Roletype, + Subtype +} + +public enum AdminOverlayAntagSymbolStyle +{ + Off, + Basic, + Specific +} diff --git a/Content.Client/Administration/Systems/AdminSystem.Overlay.cs b/Content.Client/Administration/Systems/AdminSystem.Overlay.cs index ba56f4694f..a630df4521 100644 --- a/Content.Client/Administration/Systems/AdminSystem.Overlay.cs +++ b/Content.Client/Administration/Systems/AdminSystem.Overlay.cs @@ -1,4 +1,5 @@ using Content.Client.Administration.Managers; +using Content.Shared.Roles; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; @@ -15,6 +16,7 @@ namespace Content.Client.Administration.Systems [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; [Dependency] private readonly IConfigurationManager _configurationManager = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; private AdminNameOverlay _adminNameOverlay = default!; @@ -30,7 +32,8 @@ namespace Content.Client.Administration.Systems _resourceCache, _entityLookup, _userInterfaceManager, - _configurationManager); + _configurationManager, + _roles); _adminManager.AdminStatusUpdated += OnAdminStatusUpdated; } @@ -46,7 +49,8 @@ namespace Content.Client.Administration.Systems public void AdminOverlayOn() { - if (_overlayManager.HasOverlay()) return; + if (_overlayManager.HasOverlay()) + return; _overlayManager.AddOverlay(_adminNameOverlay); OverlayEnabled?.Invoke(); } diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs index b5b2b0e345..2a25d9e0aa 100644 --- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs +++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs @@ -32,6 +32,10 @@ public sealed partial class PlayerTab : Control private bool _ascending = true; private bool _showDisconnected; + private AdminPlayerTabColorOption _playerTabColorSetting; + private AdminPlayerTabRoleTypeOption _playerTabRoleSetting; + private AdminPlayerTabSymbolOption _playerTabSymbolSetting; + public event Action? OnEntryKeyBindDown; public PlayerTab() @@ -44,9 +48,10 @@ public sealed partial class PlayerTab : Control _adminSystem.OverlayEnabled += OverlayEnabled; _adminSystem.OverlayDisabled += OverlayDisabled; - _config.OnValueChanged(CCVars.AdminPlayerlistSeparateSymbols, PlayerListSettingsChanged); - _config.OnValueChanged(CCVars.AdminPlayerlistHighlightedCharacterColor, PlayerListSettingsChanged); - _config.OnValueChanged(CCVars.AdminPlayerlistRoleTypeColor, PlayerListSettingsChanged); + _config.OnValueChanged(CCVars.AdminPlayerTabRoleSetting, RoleSettingChanged, true); + _config.OnValueChanged(CCVars.AdminPlayerTabColorSetting, ColorSettingChanged, true); + _config.OnValueChanged(CCVars.AdminPlayerTabSymbolSetting, SymbolSettingChanged, true); + OverlayButton.OnPressed += OverlayButtonPressed; ShowDisconnectedButton.OnPressed += ShowDisconnectedPressed; @@ -113,8 +118,27 @@ public sealed partial class PlayerTab : Control #region ListContainer - private void PlayerListSettingsChanged(bool _) + private void RoleSettingChanged(string s) { + if (!Enum.TryParse(s, out var format)) + format = AdminPlayerTabRoleTypeOption.Subtype; + _playerTabRoleSetting = format; + RefreshPlayerList(_adminSystem.PlayerList); + } + + private void ColorSettingChanged(string s) + { + if (!Enum.TryParse(s, out var format)) + format = AdminPlayerTabColorOption.Both; + _playerTabColorSetting = format; + RefreshPlayerList(_adminSystem.PlayerList); + } + + private void SymbolSettingChanged(string s) + { + if (!Enum.TryParse(s, out var format)) + format = AdminPlayerTabSymbolOption.Specific; + _playerTabSymbolSetting = format; RefreshPlayerList(_adminSystem.PlayerList); } @@ -140,7 +164,12 @@ public sealed partial class PlayerTab : Control if (data is not PlayerListData { Info: var player}) return; - var entry = new PlayerTabEntry(player, new StyleBoxFlat(button.Index % 2 == 0 ? _altColor : _defaultColor)); + var entry = new PlayerTabEntry( + player, + new StyleBoxFlat(button.Index % 2 == 0 ? _altColor : _defaultColor), + _playerTabColorSetting, + _playerTabRoleSetting, + _playerTabSymbolSetting); button.AddChild(entry); button.ToolTip = $"{player.Username}, {player.CharacterName}, {player.IdentityName}, {player.StartingJob}"; } diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs index 939fe38fc0..41e3fca761 100644 --- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs +++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs @@ -1,42 +1,99 @@ using Content.Shared.Administration; -using Content.Shared.CCVar; +using Content.Shared.Roles; using Robust.Client.AutoGenerated; using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -using Robust.Shared.Configuration; namespace Content.Client.Administration.UI.Tabs.PlayerTab; [GenerateTypedNameReferences] public sealed partial class PlayerTabEntry : PanelContainer { - public NetEntity? PlayerEntity; + [Dependency] private readonly IEntityManager _entMan = default!; - public PlayerTabEntry(PlayerInfo player, StyleBoxFlat styleBoxFlat) + public PlayerTabEntry( + PlayerInfo player, + StyleBoxFlat styleBoxFlat, + AdminPlayerTabColorOption colorOption, + AdminPlayerTabRoleTypeOption roleSetting, + AdminPlayerTabSymbolOption symbolSetting) { + IoCManager.InjectDependencies(this); RobustXamlLoader.Load(this); - var config = IoCManager.Resolve(); + var roles = _entMan.System(); UsernameLabel.Text = player.Username; if (!player.Connected) UsernameLabel.StyleClasses.Add("Disabled"); JobLabel.Text = player.StartingJob; - var separateAntagSymbols = config.GetCVar(CCVars.AdminPlayerlistSeparateSymbols); - var genericAntagSymbol = player.Antag ? Loc.GetString("player-tab-antag-prefix") : string.Empty; - var roleSymbol = player.Antag ? player.RoleProto.Symbol : string.Empty; - var symbol = separateAntagSymbols ? roleSymbol : genericAntagSymbol; + + var colorAntags = false; + var colorRoles = false; + switch (colorOption) + { + case AdminPlayerTabColorOption.Off: + break; + case AdminPlayerTabColorOption.Character: + colorAntags = true; + break; + case AdminPlayerTabColorOption.Roletype: + colorRoles = true; + break; + default: + case AdminPlayerTabColorOption.Both: + colorAntags = true; + colorRoles = true; + break; + } + + var symbol = string.Empty; + switch (symbolSetting) + { + case AdminPlayerTabSymbolOption.Off: + break; + case AdminPlayerTabSymbolOption.Basic: + symbol = player.Antag ? Loc.GetString("player-tab-antag-prefix") : string.Empty; + break; + default: + case AdminPlayerTabSymbolOption.Specific: + symbol = player.Antag ? player.RoleProto.Symbol : string.Empty; + break; + } + CharacterLabel.Text = Loc.GetString("player-tab-character-name-antag-symbol", ("symbol", symbol), ("name", player.CharacterName)); - if (player.Antag && config.GetCVar(CCVars.AdminPlayerlistHighlightedCharacterColor)) + if (player.Antag && colorAntags) CharacterLabel.FontColorOverride = player.RoleProto.Color; if (player.IdentityName != player.CharacterName) CharacterLabel.Text += $" [{player.IdentityName}]"; - RoleTypeLabel.Text = Loc.GetString(player.RoleProto.Name); - if (config.GetCVar(CCVars.AdminPlayerlistRoleTypeColor)) + + var roletype = RoleTypeLabel.Text = Loc.GetString(player.RoleProto.Name); + var subtype = roles.GetRoleSubtypeLabel(player.RoleProto.Name, player.Subtype); + switch (roleSetting) + { + case AdminPlayerTabRoleTypeOption.RoleTypeSubtype: + RoleTypeLabel.Text = roletype != subtype + ? roletype + " - " +subtype + : roletype; + break; + case AdminPlayerTabRoleTypeOption.SubtypeRoleType: + RoleTypeLabel.Text = roletype != subtype + ? subtype + " - " + roletype + : roletype; + break; + case AdminPlayerTabRoleTypeOption.RoleType: + RoleTypeLabel.Text = roletype; + break; + default: + case AdminPlayerTabRoleTypeOption.Subtype: + RoleTypeLabel.Text = subtype; + break; + } + + if (colorRoles) RoleTypeLabel.FontColorOverride = player.RoleProto.Color; BackgroundColorPanel.PanelOverride = styleBoxFlat; OverallPlaytimeLabel.Text = player.PlaytimeString; - PlayerEntity = player.NetEntity; } } diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabOptions.cs b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabOptions.cs new file mode 100644 index 0000000000..e9eab24710 --- /dev/null +++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabOptions.cs @@ -0,0 +1,24 @@ +namespace Content.Client.Administration.UI.Tabs.PlayerTab; + +public enum AdminPlayerTabColorOption +{ + Off, + Character, + Roletype, + Both +} + +public enum AdminPlayerTabRoleTypeOption +{ + RoleType, + Subtype, + RoleTypeSubtype, + SubtypeRoleType +} + +public enum AdminPlayerTabSymbolOption +{ + Off, + Basic, + Specific +} diff --git a/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml b/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml index 449c16ad91..ca22d7206b 100644 --- a/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml +++ b/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml @@ -6,18 +6,18 @@ diff --git a/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml.cs b/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml.cs index d2e56d80ed..a25d83d337 100644 --- a/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/AdminOptionsTab.xaml.cs @@ -1,3 +1,5 @@ +using Content.Client.Administration; +using Content.Client.Administration.UI.Tabs.PlayerTab; using Content.Shared.CCVar; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; @@ -19,12 +21,43 @@ public sealed partial class AdminOptionsTab : Control { RobustXamlLoader.Load(this); - Control.AddOptionCheckBox(CCVars.AdminPlayerlistSeparateSymbols, PlayerlistSeparateSymbolsCheckBox); - Control.AddOptionCheckBox(CCVars.AdminPlayerlistHighlightedCharacterColor, PlayerlistCharacterColorCheckBox); - Control.AddOptionCheckBox(CCVars.AdminPlayerlistRoleTypeColor, PlayerlistRoleTypeColorCheckBox); + var antagFormats = new List.ValueOption>(); + foreach (var format in Enum.GetValues(typeof(AdminOverlayAntagFormat))) + { + antagFormats.Add(new OptionDropDownCVar.ValueOption(format.ToString()!, Loc.GetString($"ui-options-admin-overlay-antag-format-{format.ToString()!.ToLower()}"))); + } + + var antagSymbolStyles = new List.ValueOption>(); + foreach (var symbol in Enum.GetValues(typeof(AdminOverlayAntagSymbolStyle))) + { + antagSymbolStyles.Add(new OptionDropDownCVar.ValueOption(symbol.ToString()!, Loc.GetString($"ui-options-admin-overlay-antag-symbol-{symbol.ToString()!.ToLower()}"))); + } + + var playerTabColorSettings = new List.ValueOption>(); + foreach (var setting in Enum.GetValues(typeof(AdminPlayerTabColorOption))) + { + playerTabColorSettings.Add(new OptionDropDownCVar.ValueOption(setting.ToString()!, Loc.GetString($"ui-options-admin-player-tab-color-setting-{setting.ToString()!.ToLower()}"))); + } + + var playerTabRoleSettings = new List.ValueOption>(); + foreach (var setting in Enum.GetValues(typeof(AdminPlayerTabRoleTypeOption))) + { + playerTabRoleSettings.Add(new OptionDropDownCVar.ValueOption(setting.ToString()!, Loc.GetString($"ui-options-admin-player-tab-role-setting-{setting.ToString()!.ToLower()}"))); + } + + var playerTabSymbolSettings = new List.ValueOption>(); + foreach (var setting in Enum.GetValues(typeof(AdminPlayerTabSymbolOption))) + { + playerTabSymbolSettings.Add(new OptionDropDownCVar.ValueOption(setting.ToString()!, Loc.GetString($"ui-options-admin-player-tab-symbol-setting-{setting.ToString()!.ToLower()}"))); + } + + Control.AddOptionDropDown(CCVars.AdminPlayerTabSymbolSetting, DropDownPlayerTabSymbolSetting, playerTabSymbolSettings); + Control.AddOptionDropDown(CCVars.AdminPlayerTabRoleSetting, DropDownPlayerTabRoleSetting, playerTabRoleSettings); + Control.AddOptionDropDown(CCVars.AdminPlayerTabColorSetting, DropDownPlayerTabColorSetting, playerTabColorSettings); + + Control.AddOptionDropDown(CCVars.AdminOverlayAntagFormat, DropDownOverlayAntagFormat, antagFormats); + Control.AddOptionDropDown(CCVars.AdminOverlaySymbolStyle, DropDownOverlayAntagSymbol, antagSymbolStyles); - Control.AddOptionCheckBox(CCVars.AdminOverlayClassic, EnableClassicOverlayCheckBox); - Control.AddOptionCheckBox(CCVars.AdminOverlaySymbols, EnableOverlaySymbolsCheckBox); Control.AddOptionCheckBox(CCVars.AdminOverlayPlaytime, EnableOverlayPlaytimeCheckBox); Control.AddOptionCheckBox(CCVars.AdminOverlayStartingJob, EnableOverlayStartingJobCheckBox); diff --git a/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs b/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs index e69f577407..4fd395bbb4 100644 --- a/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs +++ b/Content.Client/UserInterface/Systems/Character/CharacterUIController.cs @@ -221,18 +221,11 @@ public sealed class CharacterUIController : UIController, IOnStateEntered(container.Mind.Value, out var mind)) return; - var roleText = Loc.GetString("role-type-crew-aligned-name"); - var color = Color.White; - if (_prototypeManager.TryIndex(mind.RoleType, out var proto)) - { - roleText = Loc.GetString(proto.Name); - color = proto.Color; - } - else - _sawmill.Error($"{_player.LocalEntity} has invalid Role Type '{mind.RoleType}'. Displaying '{roleText}' instead"); + if (!_prototypeManager.TryIndex(mind.RoleType, out var proto)) + _sawmill.Error($"Player '{_player.LocalSession}' has invalid Role Type '{mind.RoleType}'. Displaying default instead"); - _window.RoleType.Text = roleText; - _window.RoleType.FontColorOverride = color; + _window.RoleType.Text = Loc.GetString(proto?.Name ?? "role-type-crew-aligned-name"); + _window.RoleType.FontColorOverride = proto?.Color ?? Color.White; } private void CharacterDetached(EntityUid uid) diff --git a/Content.Server/Administration/Systems/AdminSystem.cs b/Content.Server/Administration/Systems/AdminSystem.cs index 9e0664bd83..0868157f6e 100644 --- a/Content.Server/Administration/Systems/AdminSystem.cs +++ b/Content.Server/Administration/Systems/AdminSystem.cs @@ -235,12 +235,16 @@ public sealed class AdminSystem : EntitySystem // Starting role, antagonist status and role type RoleTypePrototype roleType = new(); var startingRole = string.Empty; + LocId? subtype = null; if (_minds.TryGetMind(session, out var mindId, out var mindComp) && mindComp is not null) { sortWeight = _role.GetRoleCompByTime(mindComp)?.Comp.SortWeight ?? 0; if (_proto.TryIndex(mindComp.RoleType, out var role)) + { roleType = role; + subtype = mindComp.Subtype; + } else Log.Error($"{ToPrettyString(mindId)} has invalid Role Type '{mindComp.RoleType}'. Displaying '{Loc.GetString(roleType.Name)}' instead"); @@ -269,6 +273,7 @@ public sealed class AdminSystem : EntitySystem startingRole, antag, roleType, + subtype, sortWeight, GetNetEntity(session?.AttachedEntity), data.UserId, diff --git a/Content.Shared/Administration/PlayerInfo.cs b/Content.Shared/Administration/PlayerInfo.cs index ef26ab4fca..5164425347 100644 --- a/Content.Shared/Administration/PlayerInfo.cs +++ b/Content.Shared/Administration/PlayerInfo.cs @@ -12,6 +12,7 @@ public sealed record PlayerInfo( string StartingJob, bool Antag, RoleTypePrototype RoleProto, + LocId? Subtype, int SortWeight, NetEntity? NetEntity, NetUserId SessionId, diff --git a/Content.Shared/CCVar/CCVars.Interface.cs b/Content.Shared/CCVar/CCVars.Interface.cs index 85e06def61..fadf7a4862 100644 --- a/Content.Shared/CCVar/CCVars.Interface.cs +++ b/Content.Shared/CCVar/CCVars.Interface.cs @@ -38,10 +38,13 @@ public sealed partial class CCVars CVarDef.Create("outline.enabled", true, CVar.CLIENTONLY); /// - /// If true, the admin overlay will be displayed in the old style (showing only "ANTAG") + /// Determines how antagonist status/roletype is displayed. Based on AdminOverlayAntagFormats enum + /// Binary: Roletypes of interest get an "ANTAG" label + /// Roletype: Roletypes of interest will have their roletype name displayed in their specific color + /// Subtype: Roletypes of interest will have their subtype displayed. if subtype is not set, roletype will be shown. /// - public static readonly CVarDef AdminOverlayClassic = - CVarDef.Create("ui.admin_overlay_classic", false, CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef AdminOverlayAntagFormat = + CVarDef.Create("ui.admin_overlay_antag_format", "Subtype", CVar.CLIENTONLY | CVar.ARCHIVE); /// /// If true, the admin overlay will display the total time of the players @@ -50,34 +53,48 @@ public sealed partial class CCVars CVarDef.Create("ui.admin_overlay_playtime", true, CVar.CLIENTONLY | CVar.ARCHIVE); /// - /// If true, the admin overlay will display the players starting position. + /// If true, the admin overlay will display the player's starting role. /// public static readonly CVarDef AdminOverlayStartingJob = CVarDef.Create("ui.admin_overlay_starting_job", true, CVar.CLIENTONLY | CVar.ARCHIVE); /// - /// If true, the admin window player tab will show different antag symbols for each role type + /// Determines how antagonist status/roletype is displayed Before character names on the Player Tab + /// Off: No symbol is shown. + /// Basic: The same antag symbol is shown for anyone marked as antag. + /// Specific: The roletype-specific symbol is shown for anyone marked as antag. /// - public static readonly CVarDef AdminPlayerlistSeparateSymbols = - CVarDef.Create("ui.admin_playerlist_separate_symbols", false, CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef AdminPlayerTabSymbolSetting = + CVarDef.Create("ui.admin_player_tab_symbols", "Specific", CVar.CLIENTONLY | CVar.ARCHIVE); /// - /// If true, characters with antag role types will have their names colored by their role type + /// Determines what columns are colorized + /// Off: None. + /// Character: The character names of "roletypes-of-interest" have their role type's color. + /// Roletype: Role types are shown in their respective colors. + /// Both: Both characters and role types are colorized. /// - public static readonly CVarDef AdminPlayerlistHighlightedCharacterColor = - CVarDef.Create("ui.admin_playerlist_highlighted_character_color", true, CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef AdminPlayerTabColorSetting = + CVarDef.Create("ui.admin_player_tab_color", "Both", CVar.CLIENTONLY | CVar.ARCHIVE); /// - /// If true, the Role Types column will be colored + /// Determines what's displayed in the Role column - role type, subtype, or both. + /// RoleType + /// SubType + /// RoleTypeSubtype + /// SubtypeRoleType /// - public static readonly CVarDef AdminPlayerlistRoleTypeColor = - CVarDef.Create("ui.admin_playerlist_role_type_color", true, CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef AdminPlayerTabRoleSetting = + CVarDef.Create("ui.admin_player_tab_role", "Subtype", CVar.CLIENTONLY | CVar.ARCHIVE); /// - /// If true, the admin overlay will show antag symbols + /// Determines how antagonist status/roletype is displayed. Based on AdminOverlayAntagSymbolStyles enum + /// Off: No symbol is shown. + /// Basic: The same antag symbol is shown for anyone marked as antag. + /// Specific: The roletype-specific symbol is shown for anyone marked as antag. /// - public static readonly CVarDef AdminOverlaySymbols = - CVarDef.Create("ui.admin_overlay_symbols", true, CVar.CLIENTONLY | CVar.ARCHIVE); + public static readonly CVarDef AdminOverlaySymbolStyle = + CVarDef.Create("ui.admin_overlay_symbol_style", "Specific", CVar.CLIENTONLY | CVar.ARCHIVE); /// /// The range (in tiles) around the cursor within which the admin overlays of ghosts start to fade out diff --git a/Content.Shared/Mind/MindComponent.cs b/Content.Shared/Mind/MindComponent.cs index fa48511a2a..3b2b934478 100644 --- a/Content.Shared/Mind/MindComponent.cs +++ b/Content.Shared/Mind/MindComponent.cs @@ -108,6 +108,12 @@ public sealed partial class MindComponent : Component [DataField, AutoNetworkedField] public ProtoId RoleType = "Neutral"; + /// + /// The role's subtype, shown only to admins to help with antag categorization + /// + [DataField] + public LocId? Subtype; + /// /// The session of the player owning this mind. /// Can be null, in which case the player is currently not logged in. diff --git a/Content.Shared/Mind/RoleTypePrototype.cs b/Content.Shared/Mind/RoleTypePrototype.cs index 8a4253a733..03f88ba751 100644 --- a/Content.Shared/Mind/RoleTypePrototype.cs +++ b/Content.Shared/Mind/RoleTypePrototype.cs @@ -21,7 +21,7 @@ public sealed partial class RoleTypePrototype : IPrototype /// The role's displayed color. /// [DataField] - public Color Color { get; private set; } = Color.FromHex("#eeeeee"); + public Color Color = Color.FromHex("#eeeeee"); /// /// A symbol used to represent the role type. diff --git a/Content.Shared/Roles/MindRoleComponent.cs b/Content.Shared/Roles/MindRoleComponent.cs index a52a3f5c02..09593c94cd 100644 --- a/Content.Shared/Roles/MindRoleComponent.cs +++ b/Content.Shared/Roles/MindRoleComponent.cs @@ -15,7 +15,7 @@ public sealed partial class MindRoleComponent : BaseMindRoleComponent /// A single antag Mind Role is enough to make the owner mind count as Antagonist. /// [DataField] - public bool Antag { get; set; } = false; + public bool Antag; /// /// The mind's current antagonist/special role, or lack thereof; @@ -23,11 +23,17 @@ public sealed partial class MindRoleComponent : BaseMindRoleComponent [DataField] public ProtoId? RoleType; + /// + /// The role's subtype, shown only to admins to help with antag categorization + /// + [DataField] + public LocId? Subtype; + /// /// True if this mindrole is an exclusive antagonist. Antag setting is not checked if this is True. /// [DataField] - public bool ExclusiveAntag { get; set; } = false; + public bool ExclusiveAntag; /// /// The Mind that this role belongs to diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index d6f108faaf..83ef6cbf23 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -6,7 +6,6 @@ using Content.Shared.Database; using Content.Shared.GameTicking; using Content.Shared.Mind; using Content.Shared.Roles.Jobs; -using Content.Shared.Silicons.Borgs.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Configuration; @@ -202,22 +201,22 @@ public abstract class SharedRoleSystem : EntitySystem return false; //get the most important/latest mind role - var roleType = GetRoleTypeByTime(ent.Comp); + var (roleType, subtype) = GetRoleTypeByTime(ent.Comp); - if (ent.Comp.RoleType == roleType) + if (ent.Comp.RoleType == roleType && ent.Comp.Subtype == subtype) return false; - SetRoleType(ent.Owner, roleType); + SetRoleType(ent.Owner, roleType, subtype); return true; } /// - /// Return the most recently specified role type, or Neutral + /// Return the most recently specified role type and subtype, or Neutral /// - private ProtoId GetRoleTypeByTime(MindComponent mind) + private (ProtoId, LocId?) GetRoleTypeByTime(MindComponent mind) { var role = GetRoleCompByTime(mind); - return role?.Comp?.RoleType ?? "Neutral"; + return (role?.Comp?.RoleType ?? "Neutral", role?.Comp?.Subtype); } /// @@ -238,21 +237,22 @@ public abstract class SharedRoleSystem : EntitySystem return (result); } - private void SetRoleType(EntityUid mind, ProtoId roleTypeId) + private void SetRoleType(EntityUid mind, ProtoId roleTypeId, LocId? subtype) { if (!TryComp(mind, out var comp)) { - Log.Error($"Failed to update Role Type of mind entity {ToPrettyString(mind)} to {roleTypeId}. MindComponent not found."); + Log.Error($"Failed to update Role Type of mind entity {ToPrettyString(mind)} to {roleTypeId}, {subtype}. MindComponent not found."); return; } if (!_prototypes.HasIndex(roleTypeId)) { - Log.Error($"Failed to change Role Type of {_minds.MindOwnerLoggingString(comp)} to {roleTypeId}. Invalid role"); + Log.Error($"Failed to change Role Type of {_minds.MindOwnerLoggingString(comp)} to {roleTypeId}, {subtype}. Invalid role"); return; } comp.RoleType = roleTypeId; + comp.Subtype = subtype; Dirty(mind, comp); // Update player character window @@ -269,13 +269,13 @@ public abstract class SharedRoleSystem : EntitySystem Log.Error($"{ToPrettyString(mind)} does not have an OwnedEntity!"); _adminLogger.Add(LogType.Mind, LogImpact.Medium, - $"Role Type of {ToPrettyString(mind)} changed to {roleTypeId}"); + $"Role Type of {ToPrettyString(mind)} changed to {roleTypeId}, {subtype}"); return; } _adminLogger.Add(LogType.Mind, LogImpact.High, - $"Role Type of {ToPrettyString(comp.OwnedEntity)} changed to {roleTypeId}"); + $"Role Type of {ToPrettyString(comp.OwnedEntity)} changed to {roleTypeId}, {subtype}"); } /// @@ -630,6 +630,14 @@ public abstract class SharedRoleSystem : EntitySystem return antag.Requirements; } + + /// + /// Returns the localized name of a role type's subtype. If the provided subtype parameter turns out to be empty, it returns the localized name of the role type instead. + /// + public string GetRoleSubtypeLabel(LocId roleType, LocId? subtype) + { + return string.IsNullOrEmpty(subtype) ? Loc.GetString(roleType) : Loc.GetString(subtype); + } } /// diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 35ae20ec3c..95c002b745 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -339,15 +339,37 @@ ui-options-censor-nudity = Censor character nudity ui-options-admin-player-panel = Admin Menu Players List -ui-options-admin-playerlist-separate-symbols = Show separate symbols for each antag role type -ui-options-admin-playerlist-character-color = Color names of antagonist characters -ui-options-admin-playerlist-roletype-color = Color role types +ui-options-admin-player-tab-symbol-setting = Character column antag symbols +ui-options-admin-player-tab-symbol-setting-off = No antag symbol +ui-options-admin-player-tab-symbol-setting-basic = Show standard antag symbol +ui-options-admin-player-tab-symbol-setting-specific = Show specific antag symbol + +ui-options-admin-player-tab-role-setting = Role display settings +ui-options-admin-player-tab-role-setting-roletype = Show role type +ui-options-admin-player-tab-role-setting-subtype = Show subtype +ui-options-admin-player-tab-role-setting-roletypesubtype = Show role type and subtype +ui-options-admin-player-tab-role-setting-subtyperoletype = Show subtype and role type + +ui-options-admin-player-tab-color-setting = Color settings +ui-options-admin-player-tab-color-setting-off = I hate colors +ui-options-admin-player-tab-color-setting-character = Colorize antag character names +ui-options-admin-player-tab-color-setting-roletype = Colorize all role types +ui-options-admin-player-tab-color-setting-both = Colorize both ui-options-admin-overlay-title = Admin Overlay -ui-options-enable-classic-overlay = Revert overlay to classic mode -ui-options-enable-overlay-symbols = Add antag symbol to text -ui-options-enable-overlay-playtime = Show playtime -ui-options-enable-overlay-starting-job = Show starting job -ui-options-overlay-merge-distance = Stack merge distance -ui-options-overlay-ghost-fade-distance = Ghost overlay fade range from mouse -ui-options-overlay-ghost-hide-distance = Ghost overlay hide range from mouse + +ui-options-admin-overlay-antag-format = Antag label style +ui-options-admin-overlay-antag-format-binary = Show antag status +ui-options-admin-overlay-antag-format-roletype = Show role type +ui-options-admin-overlay-antag-format-subtype = Show subtype + +ui-options-admin-overlay-antag-symbol = Antag symbol style +ui-options-admin-overlay-antag-symbol-off = No antag symbol +ui-options-admin-overlay-antag-symbol-basic = Show standard antag symbol +ui-options-admin-overlay-antag-symbol-specific = Show specific antag symbol + +ui-options-admin-enable-overlay-playtime = Show playtime +ui-options-admin-enable-overlay-starting-job = Show starting job +ui-options-admin-overlay-merge-distance = Stack merge distance +ui-options-admin-overlay-ghost-fade-distance = Ghost overlay fade range from mouse +ui-options-admin-overlay-ghost-hide-distance = Ghost overlay hide range from mouse diff --git a/Resources/Locale/en-US/mind/role-types.ftl b/Resources/Locale/en-US/mind/role-types.ftl index 1139bf1ab0..7d568fd686 100644 --- a/Resources/Locale/en-US/mind/role-types.ftl +++ b/Resources/Locale/en-US/mind/role-types.ftl @@ -17,3 +17,19 @@ role-type-free-agent-color = #ffff00 role-type-familiar-color = #6495ed role-type-silicon-color = #6495ed role-type-silicon-antagonist-color =#c832e6 + +# Ideally, subtype names should be short +role-subtype-traitor = Traitor +role-subtype-thief = Thief +role-subtype-ninja = Ninja +role-subtype-nukie = Nukie +role-subtype-traitor-reinforcement = Reinforcement +role-subtype-revolutionary = Rev +role-subtype-head-revolutionary = Head Rev +role-subtype-initial-infected = Infected +role-subtype-zombie = Zombie +role-subtype-dragon = Dragon +role-subtype-survivor = Survivor +role-subtype-subverted = Subverted +role-subtype-paradox-clone = Paradox +role-subtype-wizard = Wizard diff --git a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml index cdab1c6150..687b7e17bf 100644 --- a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml @@ -95,7 +95,6 @@ antagPrototype: GenericTeamAntagonist # This should be used (or inherited) for team antags that are summoned or converted in large quantities, and are "secondary" to other antags -# TODO: sort weight - type: entity parent: MindRoleGhostRoleTeamAntagonist id: MindRoleGhostRoleTeamAntagonistFlock @@ -130,6 +129,7 @@ - type: MindRole antagPrototype: SubvertedSilicon roleType: SiliconAntagonist + subtype: role-subtype-subverted - type: SubvertedSiliconRole # Dragon @@ -141,6 +141,7 @@ - type: MindRole antagPrototype: Dragon roleType: TeamAntagonist + subtype: role-subtype-dragon exclusiveAntag: true - type: DragonRole - type: RoleBriefing @@ -154,6 +155,7 @@ components: - type: MindRole antagPrototype: SpaceNinja + subtype: role-subtype-ninja exclusiveAntag: true - type: NinjaRole @@ -165,7 +167,7 @@ components: - type: MindRole antagPrototype: ParadoxClone - roleType: SoloAntagonist + subtype: role-subtype-paradox-clone - type: ParadoxCloneRole # Nukies @@ -176,6 +178,7 @@ components: - type: MindRole roleType: TeamAntagonist + subtype: role-subtype-nukie exclusiveAntag: true antagPrototype: Nukeops - type: NukeopsRole @@ -206,6 +209,7 @@ antagPrototype: HeadRev exclusiveAntag: true roleType: TeamAntagonist + subtype: role-subtype-head-revolutionary - type: RevolutionaryRole - type: entity @@ -215,6 +219,7 @@ components: - type: MindRole antagPrototype: Rev + subtype: role-subtype-revolutionary # Survivors (Wizard) - type: entity @@ -225,6 +230,7 @@ - type: MindRole antagPrototype: Survivor roleType: FreeAgent + subtype: role-subtype-survivor - type: SurvivorRole # Thief @@ -235,6 +241,7 @@ components: - type: MindRole antagPrototype: Thief + subtype: role-subtype-thief - type: ThiefRole # Traitors @@ -246,6 +253,7 @@ - type: MindRole antagPrototype: Traitor exclusiveAntag: true + subtype: role-subtype-traitor - type: TraitorRole - type: entity @@ -263,6 +271,7 @@ components: - type: MindRole roleType: TeamAntagonist + subtype: role-subtype-traitor-reinforcement antagPrototype: GenericTeamAntagonist # Wizards @@ -274,6 +283,7 @@ - type: MindRole antagPrototype: Wizard exclusiveAntag: true + subtype: role-subtype-wizard - type: WizardRole # Zombie Squad @@ -286,6 +296,7 @@ antagPrototype: InitialInfected exclusiveAntag: true roleType: TeamAntagonist + subtype: role-subtype-initial-infected - type: InitialInfectedRole - type: entity @@ -296,5 +307,5 @@ - type: MindRole antagPrototype: Zombie exclusiveAntag: true - roleType: TeamAntagonist + subtype: role-subtype-zombie - type: ZombieRole diff --git a/Resources/Prototypes/Roles/role_types.yml b/Resources/Prototypes/Roles/role_types.yml index 7ae2b44054..eb8db63977 100644 --- a/Resources/Prototypes/Roles/role_types.yml +++ b/Resources/Prototypes/Roles/role_types.yml @@ -1,5 +1,8 @@ -# For use by Role Types -# Do not touch these +# The primary role types are referenced by RP Rules, and were specified based on head admin input. +# Do not create new ones without discussion. +# You probably want a Subtype instead, anyway. Use MindRoleComponent.Subtype + +# Any new primary role types must be listed in RoleTypes.xml # If you change/add a color here, also change it in role-types.ftl! From 5dc012374ebd9d6ae1765ffea40b8ac22245323f Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 17:05:54 +0000 Subject: [PATCH 178/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index bd4f640aa2..2b8fe05cb0 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1045,5 +1045,17 @@ Entries: id: 127 time: '2025-04-16T02:26:20.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36607 +- author: Errant + changes: + - message: Mind Roles now have subtypes, which can more specifically indicate what + role they are. For example, depending on clientside settings a Traitor can either + show as "SOLO ANTAGONIST" or "TRAITOR" on both the admin overlay and playerlist. + See Admin Options for the available settings. (Note, many minor roles don't + ((currently)) have a subtype configured, and will default to showing their role + type instead) + type: Tweak + id: 128 + time: '2025-04-16T17:04:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35359 Name: Admin Order: 1 From a94f64d94288f9fff268a81222e9ac995ddab3e8 Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Wed, 16 Apr 2025 10:58:35 -0700 Subject: [PATCH 179/622] New Arsenal T3: Temperature Gun Revitalization (#35447) * tempgun real * fixin shit * Warios Couch * fix tests. i hope * add to lathes * tests begone * RIP svalinn * maintainer for the project btw --------- Co-authored-by: Flareguy Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> --- .../Locale/en-US/research/technologies.ftl | 5 +- .../Weapons/Guns/Battery/battery_guns.yml | 44 +++++++++++++++ .../Weapons/Guns/Projectiles/projectiles.yml | 32 +++++++++++ .../Recipes/Lathes/Packs/science.yml | 1 - .../Recipes/Lathes/Packs/security.yml | 1 + .../Prototypes/Recipes/Lathes/security.yml | 6 +- Resources/Prototypes/Research/arsenal.yml | 8 +-- .../Guns/Battery/temp_gun.rsi/base.png | Bin 0 -> 679 bytes .../temp_gun.rsi/equipped-BACKPACK.png | Bin 0 -> 845 bytes .../temp_gun.rsi/equipped-SUITSTORAGE.png | Bin 0 -> 845 bytes .../Guns/Battery/temp_gun.rsi/icon.png | Bin 0 -> 717 bytes .../Guns/Battery/temp_gun.rsi/inhand-left.png | Bin 0 -> 1194 bytes .../Battery/temp_gun.rsi/inhand-right.png | Bin 0 -> 1206 bytes .../Battery/temp_gun.rsi/mag-unshaded-1.png | Bin 0 -> 129 bytes .../Battery/temp_gun.rsi/mag-unshaded-2.png | Bin 0 -> 130 bytes .../Battery/temp_gun.rsi/mag-unshaded-3.png | Bin 0 -> 130 bytes .../Battery/temp_gun.rsi/mag-unshaded-4.png | Bin 0 -> 130 bytes .../Guns/Battery/temp_gun.rsi/meta.json | 53 ++++++++++++++++++ .../temp_gun.rsi/wielded-inhand-left.png | Bin 0 -> 688 bytes .../temp_gun.rsi/wielded-inhand-right.png | Bin 0 -> 668 bytes 20 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/base.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/equipped-BACKPACK.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-1.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-2.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-3.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-4.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/wielded-inhand-right.png diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index f4f12eec52..fc4f3e41e8 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -35,8 +35,9 @@ research-technology-wave-particle-harnessing = Wave Particle Harnessing research-technology-advanced-riot-control = Advanced Riot Control research-technology-portable-microfusion-weaponry = Portable Microfusion Weaponry research-technology-experimental-battery-ammo = Experimental Battery Ammo -research-technology-basic-shuttle-armament = Shuttle basic armament -research-technology-advanced-shuttle-weapon = Advanced shuttle weapons +research-technology-basic-shuttle-armament = Shuttle Basic Armament +research-technology-advanced-shuttle-weapon = Advanced Shuttle Weapons +research-technology-thermal-weaponry = Thermal Weaponry research-technology-basic-robotics = Basic Robotics research-technology-basic-anomalous-research = Basic Anomalous Research 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 7b1c77b8d0..4d8856ef9e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -799,3 +799,47 @@ autoRechargeRate: 24 autoRechargePause: true autoRechargePauseTime: 30 + +- type: entity + name: temperature gun + parent: [BaseWeaponBattery, BaseGunWieldable] + id: WeaponTemperatureGun + description: An advanced gun that shoots body-temperature-changing beams. This probably constitutes as some kind of war crime. + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Battery/temp_gun.rsi + layers: + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-unshaded-1 + map: ["enum.GunVisualLayers.MagUnshaded"] + shader: unshaded + - type: Appearance + - type: Item + size: Large + shape: + - 0,0,3,1 + - type: MagazineVisuals + magState: mag + steps: 5 + zeroVisible: false + - type: Clothing + sprite: Objects/Weapons/Guns/Battery/temp_gun.rsi + - type: Gun + fireRate: 1 + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/taser2.ogg + - type: ProjectileBatteryAmmoProvider + proto: BoltTempgunCold + fireCost: 100 + - type: BatteryWeaponFireModes + fireModes: + - proto: BoltTempgunCold + fireCost: 100 + - proto: BoltTempgunHot + fireCost: 100 + - type: Battery + maxCharge: 1000 + startingCharge: 1000 + - type: StaticPrice + price: 100 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 57987b1086..ace364f127 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -384,6 +384,23 @@ - type: ChangeTemperatureOnCollide heat: -50000 +- type: entity + name: freezing bolt + id: BoltTempgunCold + parent: WatcherBolt + categories: [ HideSpawnMenu ] + components: + - type: Projectile + # soundHit: Waiting on serv3 + impactEffect: BulletImpactEffectDisabler + damage: + types: + Cold: 10 + - type: TimedDespawn + lifetime: 3 + - type: ChangeTemperatureOnCollide + heat: -100000 + - type: entity name: magmawing watcher bolt id: WatcherBoltMagmawing @@ -405,6 +422,21 @@ - type: ChangeTemperatureOnCollide heat: 50000 +- type: entity + name: scorching bolt + id: BoltTempgunHot + parent: WatcherBoltMagmawing + categories: [ HideSpawnMenu ] + components: + - type: Projectile + # soundHit: Waiting on serv3 + impactEffect: BulletImpactEffectOrangeDisabler + damage: + types: + Heat: 10 + - type: ChangeTemperatureOnCollide + heat: 100000 #This may be a bit underpowered, but in testing, 130000 was RIDICULOUS and killed in seconds. + - type: entity id: BulletKinetic name: kinetic bolt diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/science.yml b/Resources/Prototypes/Recipes/Lathes/Packs/science.yml index a86b4bbebf..c68b408cac 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/science.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/science.yml @@ -52,7 +52,6 @@ recipes: - WeaponPistolCHIMP - WeaponForceGun - - WeaponLaserSvalinn - WeaponProtoKineticAccelerator - WeaponTetherGun - WeaponGauntletGorilla diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/security.yml b/Resources/Prototypes/Recipes/Lathes/Packs/security.yml index a8eee17d5e..c2839b2379 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/security.yml @@ -127,6 +127,7 @@ - WeaponLaserCannon - WeaponLaserCarbine - WeaponXrayCannon + - WeaponTemperatureGun - type: latheRecipePack id: SecurityDisablers diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index 725b785dd7..864edcba6e 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -92,10 +92,12 @@ - type: latheRecipe parent: BaseWeaponRecipeLong - id: WeaponLaserSvalinn - result: WeaponLaserSvalinn + id: WeaponTemperatureGun + result: WeaponTemperatureGun materials: Steel: 2000 + Glass: 500 + Plastic: 500 Gold: 500 - type: latheRecipe diff --git a/Resources/Prototypes/Research/arsenal.yml b/Resources/Prototypes/Research/arsenal.yml index 6cecc49035..b848ae0998 100644 --- a/Resources/Prototypes/Research/arsenal.yml +++ b/Resources/Prototypes/Research/arsenal.yml @@ -193,16 +193,16 @@ - PortableRecharger - type: technology - id: ExperimentalBatteryAmmo - name: research-technology-experimental-battery-ammo + id: ThermalWeaponry + name: research-technology-thermal-weaponry icon: - sprite: Objects/Weapons/Guns/Battery/svalinn.rsi + sprite: Objects/Weapons/Guns/Battery/temp_gun.rsi state: icon discipline: Arsenal tier: 3 cost: 15000 recipeUnlocks: - - WeaponLaserSvalinn + - WeaponTemperatureGun - type: technology id: AdvancedShuttleWeapon diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/base.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..00fc6f71fb67479641f35469e0370c04b2d52ffa GIT binary patch literal 679 zcmV;Y0$BZtP)Px%VM#%`riY1`As5qE75cfL39S)eFur|-~p6>j<&+~rx4rZ8PhW{Pbv<_ai zq8_>efFwyc9mZqlJG*;R#k8jt@b=S3zJ6XKc(4V)iuLm9Cu$lIQwz|joxA`bOhUR+ zQWob`iQ{;Z+cg-ajry|E>q!}S)rwlG)#yq|zkf`rR5bQB-z?Yw!gW=v*#w~N`x71Z z4-PFriHnR2g~FI^)R)z0csiMM{{FZCtv(Dx6C^7WU8OjVky4`9Y5V@eJKEoW(0cwX z(|+09Htp(4dENryy6WkZ$0qw$vq{_c$I98LFPkc5;kL?UVP|*GvUOmceW6e=>nt1` z9-8bm9LJ&6Y_huYh@Zc<$Ii0$G~zf`cE5iNz~G{UdB>qEWoGta7$T))saB&C1bQCu zsucyWw!T5LQ6D2&Ti?L*szgzAO@QM#*twi-0t+G7>vWj2F590b*CNy88etgXc~!bs zs#7WziK2+C_O*Q<`|NCFHum=qn47bh&*$-~73DaNIU8II-c@3qi6*{jPSS1d1c6!G zxtwh>lf9lLTvrW-L;j8uaNy1BSA5&tx{(|%|A3`hjkfPo7Q$Rk+NMdkTae z&IdB9uW2lng}P_kB%_gOO&rH6%VzmcytVXj2_eWk4xJz%NfLf{rL|ZV3ZS&Gz|o&0 zWUn{%!v?p!1u500LZxC6K$VI`P6h)`qUg@#aL4C3L*NWE%rL{9@eg8_RrW2j88`p{ N002ovPDHLkV1i@^M0x-K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/equipped-BACKPACK.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000000000000000000000000000000000..11dc6f629986c7b9cf588e7fd0c7963c83f70f47 GIT binary patch literal 845 zcmV-T1G4;yP)Px&2T4RhRCt{2n!isIVHn51N32k;>AjdH76W$(i1?$G5KTnlyQ0gN$R zyL$&6i8G?ua6!wyn#9-41K{uQvc2n+s@ehPe5bi?QB}bh!`a(E@#fjE7=Qc}O`9LY zuP^Vn`*`W?ivgT-{EeRSgf++GI2AvM&(DvG`$dkWZ{IOB{!v@Xz7XAA9cZYp*Sz%h z!vN9Q(e7@p%!t^DCKS0XZr!|rN6m5c4fJC(Hzj&|F5%Pc93m0j{gZurt2RIY&~kHm zCj~-v3JR-5asBEQyng!*gEJGD9Ua5v-W~uzcUKn*E2{#4knOEfoKRe^B#HCqP*^RB zzJY$sj*bBU*4KYvxv&DuvM@b8?djH2m4HBo2mT~raApG8kqnX-lY53Y48xNS6`}(h z9st@b3*5FvXZvXYz;a;)%rLO9xCp~AG~2d4y>nEXfRe+Pcn?s9Gkh*Tziar$aM<(k zKy?O`{pbC7{5d$oo2{)_TU&!|+nN!LYU>*t6}@d%Dm2j8?<5wBq0MX+x%@mD!{Let zuLj@ZeMI^b1VIo4K@bE%5ClOG1VQ}cFvf(Rn;ok0Mek8FKz6P4&QL0qathb75rQ!$ zQmK^Ms_ArExMEdnMr`YGbf(j3b^3-2c@YYQglU@YqP1YcE)Aw>iclydh6{NqZBn1cE`E5S)XGLa}Z>|vNtvS%`p@Gk+}wq?Z~8jeQU1V|Z> z9mzn~buhyywQQo8V|nO-@M_lQLj#enF~O zE%C64Nv%63vnUdYpsr5Js~}E|9M~fojbdwSOYO;#mX?-Uc;-uSl(Z5AK@bE%92&m? X9_LCbPbj_g00000NkvXXu0mjfHrITT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000000000000000000000000000000000..11dc6f629986c7b9cf588e7fd0c7963c83f70f47 GIT binary patch literal 845 zcmV-T1G4;yP)Px&2T4RhRCt{2n!isIVHn51N32k;>AjdH76W$(i1?$G5KTnlyQ0gN$R zyL$&6i8G?ua6!wyn#9-41K{uQvc2n+s@ehPe5bi?QB}bh!`a(E@#fjE7=Qc}O`9LY zuP^Vn`*`W?ivgT-{EeRSgf++GI2AvM&(DvG`$dkWZ{IOB{!v@Xz7XAA9cZYp*Sz%h z!vN9Q(e7@p%!t^DCKS0XZr!|rN6m5c4fJC(Hzj&|F5%Pc93m0j{gZurt2RIY&~kHm zCj~-v3JR-5asBEQyng!*gEJGD9Ua5v-W~uzcUKn*E2{#4knOEfoKRe^B#HCqP*^RB zzJY$sj*bBU*4KYvxv&DuvM@b8?djH2m4HBo2mT~raApG8kqnX-lY53Y48xNS6`}(h z9st@b3*5FvXZvXYz;a;)%rLO9xCp~AG~2d4y>nEXfRe+Pcn?s9Gkh*Tziar$aM<(k zKy?O`{pbC7{5d$oo2{)_TU&!|+nN!LYU>*t6}@d%Dm2j8?<5wBq0MX+x%@mD!{Let zuLj@ZeMI^b1VIo4K@bE%5ClOG1VQ}cFvf(Rn;ok0Mek8FKz6P4&QL0qathb75rQ!$ zQmK^Ms_ArExMEdnMr`YGbf(j3b^3-2c@YYQglU@YqP1YcE)Aw>iclydh6{NqZBn1cE`E5S)XGLa}Z>|vNtvS%`p@Gk+}wq?Z~8jeQU1V|Z> z9mzn~buhyywQQo8V|nO-@M_lQLj#enF~O zE%C64Nv%63vnUdYpsr5Js~}E|9M~fojbdwSOYO;#mX?-Uc;-uSl(Z5AK@bE%92&m? X9_LCbPbj_g00000NkvXXu0mjfHrITT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/icon.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1091e6402c97ca607b71e263fba39cb142bab1f6 GIT binary patch literal 717 zcmV;;0y6!HP)Px%he^sl%{@EFrVTKw0cf_U* zFp340%?SW}-{-vVj_mIr98PtnHm!hHwKshExW(q~9-p4UM(pYMCu$lIQws>N_hge2 zVEGm;DangLRb1Dd95{whX{EfTg7u^fjAB8pmP)jwq}x3solb@Jw%90W03w%D>(wd% zb<>;}aCCeU1C+STcyV!Y#8%2{%Ilv`CY`?*uHyj3!b&Zh&0<*=J;x!FS+1RSI&a4V zE9Etn$t>4A&%<#X#;xNxy!-x{xEAO2hxd_o|Jx7pLa?x~K+kaoEfBe!di>~NnEiUS zO5HR^%2_F|g;k2eZIz3{{=s2P3l6p{3mB9#SV!Ubsb)~i(>Y~1JPuiqnk zQN94K>ng3=Jp;hGoZh6a(~>eWd&{zrQnFeq(P%b@w z^FfD~FP`&tckf1WxVn5+OC{>2NnVKXatiD)>F_yP@LvaxKm-g1GODk`Sjh_&*ED?3 z3tQv5u8Oiz@e^;YV7P=3Bz2uevx)Ef{AtP9N?s^{^wJWY(+;xTp88>fTi${p)nSFw zsT6=pr&9DBhn{WUnH=u;97hP8VTKuIxHJ9%S}tD+38Wyz00000NkvXXu0mjf-pg38 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7911e2ead9aa44d023483f3027a67e862173f1fc GIT binary patch literal 1194 zcmV;b1XcTqP)Px(WJyFpRCt{2n!!&LR~*MbuW1~1B|C4G$YR{xqIM;zASIfZR8lYYP!D)*PxfM( zHu0$GU(oczp$ zmYZ5)F%HL?c{H?7T`OATmYy;-`at9+@2IxaF&YfRvAwUZ4a5PBjr(~x`@KR zsf$;yaHA#0h4bAMEn77mh`uI5ODsmyfha}GRu|59bE753#j96Xo10Qyou_y>`2^iGeHFBFwiJiwD&j(nl0dZ)*kygf+A$&M|>o2KdeVnF~7fR`>XO%vO; zRU#h8vTY7E9Ry%*egSEk!m{m(g{728)5NlEb^K^60L%Fmq-l~}T*Nd@VY{yPlRyN3 zmqmp`A|~VHjd*X$gSl=4RH{*Ok*2i9{;JheIJzUR@2OcnI!y z0G4G@UR}kEM1*bIqEsr8h{u_mU%**qH%{@1c$`wHgl*fxj6?!09s+cL8@C&dA8qBY z?4k&V!(_8r01}A=<#L&i5^*&*zYzGUzZ0aCuN`l?#(makG#ZUYqtR$I8jVJy(P;eV zt-KR_TU5VF^YTtHPyu$64cKkJuHv0WPupi7`ZlXgoP5BMOV|0WZ={k9@GHu55r8cFGUb2u#!z z!gm3lKi{Z38{mbV@&hiE>+s})KtfXWWCOfVD?gCUX2o{9NnV~ezB{1aY=9SPnM`I^^Y#5}&?zh&3W@CEqDsW$Eaz9;*#Ko2MqR=ihEXYg zyZnG{+q<4`Ao+lLvjJWRDnAhTe}P)r057~3`2meaqj?wn2c)sY)6J*lTL1t607*qo IM6N<$f@D!Qt^fc4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc3d008a649972bb362f321c3030e1b5f77a679 GIT binary patch literal 1206 zcmV;n1WEgeP)Px(a7jc#RCt{2n$J%gM-<1u6IEI4AkUasi5=D6@S}#dKqyM2NDXQ(>7g9xwLQ@b zs#=L-@+U;SaA+>57jl9F7dVsyN)HtQMT#gA1{$crv0XI|S@4VxHX)>w1KI6j8@zTP z7&;$m<@N4(cHW!!cC2|{K%r156bgkxp-?CkivJy?*v0!&TIaoFw+Ukm0Khqa55p=C z#uzx~V2qgqC+0Yd*Q3S$hPfBOv@+dh)%nor5x?|lcktO4o$zig%GJnUWO{g{U;@wNch=mqjp^YLIW;&0@7AK+iO-sy=RcsDu*PPa zAh{Etg?DRFP7MxWdU!-O_iWo82EgWkfZvZx{)<>1KPzviIa1GGV18u@Nl&Kat=Y%na8cicD;YOt99?1ErC6apn0=Lr~%j0L|CI3YP{C?{AhdnTr~_8gw9tfI5y3bvy2vb(_~4rDmT(vVaJ91oD-)9#SeU`XM~`vi`ZXAvY0D1Fb8Vk|3}Z7byZigFGBF7N$Yx(+ z-PnMx>xe`mfbH#Ct-Q@~+1A#Ecsz~^zVmRqH2^^Pt1t2E&%eM|=OvM)KLO-Lz`()` z=0?ZR-r8PZJf*a%^WP4oltdyC=(>(|V*}ajOSHGPV{UW|0}C_7BjB>Gg9{;>8tMT6 z>&6BcrAQ=`pp+6JL{LJHkUgw#+xw4;C8u?&E+g7WHK3;Hk!+&l>+9CP%wy0CIcY^p&rkP zG#=P}Ic9S?P>+WQAxI{ZK`0nRbS(xm$^lyh_vn z45P4-{WxuyHl0S>6bgkxp-?Ck3WY+UP$(4T;ApQue;etv>=gnI98jeEOo0EKP^$i3 zDM!_BJ|8%2C-cq;0JQer#c%f~t@^tuRCreyV;KGM2TP;S+I!d3C>**z!HEOx#uNMZ z-TJ#Grv`@*izj7s&o)^ee>W%CH46XeL3Dlpo!p7f?s@KEa;9_>3zGNgsQz9Kr8Ej| zSIwd4f)fYq`%um~*{}Xyt`h=&e@TtPQS9kEjQ}$Q3#2lo>hI-HN~7@V)lMbd9!N#Y zAh5d%ghC;?U;W+KOygN9<#-@w1eDS!9QI4lQ3P<#3l7GZJgEL&j`0BSER{MIjY7p8 z>bibl{hgPoCt!?$QTpCB3gxTW2pQdS+@zJ%| z9^>6E*O3V{Dt3U=`g=JXheqL0a;jMU-R*WGkw`f1BNPfDo6VkDje{oQC}02p literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-2.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4feaf6c2bc979b22c57a39f2a0ed27e20a15ad65 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Hl8kyArY-_ z&lw6bCW^b9u@F4td(aNGP?4Kgjcb|Q@{bD>& aYh|qDJyACqmHW~_4uhwwpUXO@geCwFa4B^F literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-4.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/mag-unshaded-4.png new file mode 100644 index 0000000000000000000000000000000000000000..b2e9ea615f4db1c334792fd13b7e0405fd007f89 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Hl8kyArY-_ z&lw6bC_r5eDQyv b)=xWo>!oE^F70Opau_^a{an^LB{Ts5HnuA+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/meta.json new file mode 100644 index 0000000000..d9585ec8f0 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/meta.json @@ -0,0 +1,53 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/b98afcd1400b0f398bf1322b2b20de57ccf7bb0c and modified by Flareguy. equipped-BACKPACK, equipped-SUITSTORAGE, inhand-left and inhand-right states modified by Flareguy using ion rifle states", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "mag-unshaded-1" + }, + { + "name": "mag-unshaded-2" + }, + { + "name": "mag-unshaded-3" + }, + { + "name": "mag-unshaded-4" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "wielded-inhand-left", + "directions": 4 + }, + { + "name": "wielded-inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/wielded-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Battery/temp_gun.rsi/wielded-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e7a960d7d1af2c52c041f31573e57592992e35 GIT binary patch literal 688 zcmV;h0#E&kP)Px%YDq*vRCt{2nlW$FKorOS0SZBu;AWJh*fCZHL{h7*IwSE75Mn?T3la;A8Bv+| z22^4}NDPQi!N5?ZsH~9{r4j>34CJU7f&-YLvT+<=Y|d^Q#Q!HnXZw8by?b}Q4DSyR zLI@#*5JCv~|ETB=6hZ`P&!v>wHcx_6I)j7|LCbOAcG_?|ZFENx0I>PwQK`Wl2WM0r zsud3DdmhBa3jly;mm2^MN)1d15yW>>@?O_YlDRv;woKgYKE(E5Z>nw7>u@`57={7M zG+`J9u3c^6&C};IiOWi4R`B6<%W-tg%te`*Rd*#A4EJZA+m?xq^)>ADb^!nz>uY%V z>UGrLavbzMFFFf~tQ=7MOj&hTf_HoGl{SWK9mz;1&~lv8N@8gog)Tv<56H`*HsG)nCchp;fvVomTB+mK zC7jOlk`N*okH?SW_akqJ<;Era`1uRPx%R!KxbRCt{2+COj8Ko|z_r$8ad65NcE6g$DnfJkbUsxuPb03ilcu^_R)m=TqU zZ$Kp$gv5aO6bv1z6qPlyqC{cOXO4DxTkRPV9T%_s(uQ_yvfF zh=_=Y=>M~nl0uuNC*+XfAI=8t~cN~4m{U|<2VRfO;jrt+-X0- zc5naCSohql_0O!~`_?r~W8E2j=Y$Y(!}rk*!^!#k_wHi1vj+g!Sigzg&K`RG!I3z1 z&&7xRkD2e}TCf`DnWs}5aNHA+dIR)h+Z^+bs}1>=e*$KVr2L7$0p^11o{L_8U>$X{ zETE{xCpk8W9z@;UUVi{7<&wHX<~U2yMKBj$SWQBR_%#2!BO)RqA|fIpA|fK9Z2bYc zlj;>HI&Y@_0NqLS3aFQ~Dqnjj57m-KuKoaB(Y*pm8`up)h|8C>+y|NJHJwd!kq{yt zjYiM(&%>~fmFgAz`uzu$av9NhjBB+TmY2`t_M-=Q{CXP~OBW_%^yMqQ4JGtA)09f3 zt-9yp*2B#sF@AjdjGE^n8jmMA-IX%BJ01LtqAjz=q+CGC-vIqJ^SpZn)`Hd8Hdn<~ zdEUHzH#x6rQZ=f2lh&4N1N7jwM>cP-fQo0EZ!+tc>js!f)wy}}3Z(5zFl(75XJSF- zD{^&g8;g`C*R&dw Date: Wed, 16 Apr 2025 17:59:41 +0000 Subject: [PATCH 180/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2715a2ecc1..273d928f2f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Fix battery self-recharging items like the antique laser gun from mispredicting. - type: Fix - id: 7698 - time: '2024-12-11T15:58:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33384 - author: BramvanZijp changes: - message: The Head of Security's Energy Shotgun has regained its ability to self @@ -3903,3 +3896,13 @@ id: 8197 time: '2025-04-16T14:12:30.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36627 +- author: Flareguy, ArtisticRoomba + changes: + - message: Added the Temperature Gun. It can shoot body-temperature-changing bolts. + Unlock them through arsenal science today! + type: Add + - message: Experimental Battery Ammo technology is no longer available to research.. + type: Remove + id: 8198 + time: '2025-04-16T17:58:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35447 From 1c7e6592e9a48bf2f7366374dded209f884a53c1 Mon Sep 17 00:00:00 2001 From: UpAndLeaves <92269094+Alpha-Two@users.noreply.github.com> Date: Wed, 16 Apr 2025 19:21:45 +0100 Subject: [PATCH 181/622] Zombification resistance rework (#36485) * initial commit * Commit cuz beck said so :thumbsup: * Implement balance changes, and revert some stuff * fix yaml test real * Added full stop, ensured display of infection chance, buffed biosuit speed * Maint reviews, I commit * Review completed, winter coats nerfed, CMO bio suit removed for future PR * Final-final commit-REAL (2)-COPY --- Content.Server/Zombies/ZombieSystem.cs | 40 ++++++++-------- .../Inventory/InventorySystem.Relay.cs | 2 + Content.Shared/Zombies/SharedZombieSystem.cs | 22 ++++++++- Content.Shared/Zombies/ZombieComponent.cs | 23 ++++++++-- .../ZombificationResistanceComponent.cs | 46 +++++++++++++++++++ Resources/Locale/en-US/zombies/zombie.ftl | 2 + .../Clothing/Head/base_clothinghead.yml | 5 ++ .../Clothing/Head/hardsuit-helmets.yml | 2 + .../Entities/Clothing/Head/hoods.yml | 11 ++++- .../Entities/Clothing/OuterClothing/bio.yml | 30 ++++++++++-- .../Clothing/OuterClothing/hardsuits.yml | 2 + .../Clothing/OuterClothing/wintercoats.yml | 2 + 12 files changed, 153 insertions(+), 34 deletions(-) create mode 100644 Content.Shared/Zombies/ZombificationResistanceComponent.cs diff --git a/Content.Server/Zombies/ZombieSystem.cs b/Content.Server/Zombies/ZombieSystem.cs index aa5c2682bc..e34ecb4ad5 100644 --- a/Content.Server/Zombies/ZombieSystem.cs +++ b/Content.Server/Zombies/ZombieSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Emoting.Systems; using Content.Server.Speech.EntitySystems; using Content.Server.Roles; using Content.Shared.Anomaly.Components; +using Content.Shared.Armor; using Content.Shared.Bed.Sleep; using Content.Shared.Cloning.Events; using Content.Shared.Damage; @@ -74,7 +75,6 @@ namespace Content.Server.Zombies SubscribeLocalEvent(OnPendingMapInit); SubscribeLocalEvent(OnDamageChanged); - } private void OnBeforeRemoveAnomalyOnDeath(Entity ent, ref BeforeRemoveAnomalyOnDeathEvent args) @@ -199,33 +199,29 @@ namespace Content.Server.Zombies } } - private float GetZombieInfectionChance(EntityUid uid, ZombieComponent component) + private float GetZombieInfectionChance(EntityUid uid, ZombieComponent zombieComponent) { - var max = component.MaxZombieInfectionChance; + var chance = zombieComponent.BaseZombieInfectionChance; - if (!_inventory.TryGetContainerSlotEnumerator(uid, out var enumerator, ProtectiveSlots)) - return max; - - var items = 0f; - var total = 0f; - while (enumerator.MoveNext(out var con)) + var armorEv = new CoefficientQueryEvent(ProtectiveSlots); + RaiseLocalEvent(uid, armorEv); + foreach (var resistanceEffectiveness in zombieComponent.ResistanceEffectiveness.DamageDict) { - total++; - if (con.ContainedEntity != null) - items++; + if (armorEv.DamageModifiers.Coefficients.TryGetValue(resistanceEffectiveness.Key, out var coefficient)) + { + // Scale the coefficient by the resistance effectiveness, very descriptive I know + // For example. With 30% slash resist (0.7 coeff), but only a 60% resistance effectiveness for slash, + // you'll end up with 1 - (0.3 * 0.6) = 0.82 coefficient, or a 18% resistance + var adjustedCoefficient = 1 - ((1 - coefficient) * resistanceEffectiveness.Value.Float()); + chance *= adjustedCoefficient; + } } - if (total == 0) - return max; + var zombificationResistanceEv = new ZombificationResistanceQueryEvent(ProtectiveSlots); + RaiseLocalEvent(uid, zombificationResistanceEv); + chance *= zombificationResistanceEv.TotalCoefficient; - // Everyone knows that when it comes to zombies, socks & sandals provide just as much protection as an - // armored vest. Maybe these should be weighted per-item. I.e. some kind of coverage/protection component. - // Or at the very least different weights per slot. - - var min = component.MinZombieInfectionChance; - //gets a value between the max and min based on how many items the entity is wearing - var chance = (max - min) * ((total - items) / total) + min; - return chance; + return MathF.Max(chance, zombieComponent.MinZombieInfectionChance); } private void OnMeleeHit(EntityUid uid, ZombieComponent component, MeleeHitEvent args) diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index efa88fb23a..01d3e87246 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -22,6 +22,7 @@ using Content.Shared.Strip.Components; using Content.Shared.Temperature; using Content.Shared.Verbs; using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Zombies; namespace Content.Shared.Inventory; @@ -44,6 +45,7 @@ public partial class InventorySystem SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RelayInventoryEvent); // by-ref events SubscribeLocalEvent(RefRelayInventoryEvent); diff --git a/Content.Shared/Zombies/SharedZombieSystem.cs b/Content.Shared/Zombies/SharedZombieSystem.cs index 0388450a8c..076917c4ac 100644 --- a/Content.Shared/Zombies/SharedZombieSystem.cs +++ b/Content.Shared/Zombies/SharedZombieSystem.cs @@ -1,4 +1,6 @@ -using Content.Shared.Movement.Systems; +using Content.Shared.Armor; +using Content.Shared.Inventory; +using Content.Shared.Movement.Systems; using Content.Shared.NameModifier.EntitySystems; namespace Content.Shared.Zombies; @@ -12,6 +14,24 @@ public abstract class SharedZombieSystem : EntitySystem SubscribeLocalEvent(OnRefreshSpeed); SubscribeLocalEvent(OnRefreshNameModifiers); + SubscribeLocalEvent(OnArmorExamine); + SubscribeLocalEvent>(OnResistanceQuery); + } + + private void OnResistanceQuery(Entity ent, ref InventoryRelayedEvent query) + { + query.Args.TotalCoefficient *= ent.Comp.ZombificationResistanceCoefficient; + } + + private void OnArmorExamine(Entity ent, ref ArmorExamineEvent args) + { + var value = MathF.Round((1f - ent.Comp.ZombificationResistanceCoefficient) * 100, 1); + + if (value == 0) + return; + + args.Msg.PushNewline(); + args.Msg.AddMarkupOrThrow(Loc.GetString(ent.Comp.Examine, ("value", value))); } private void OnRefreshSpeed(EntityUid uid, ZombieComponent component, RefreshMovementSpeedModifiersEvent args) diff --git a/Content.Shared/Zombies/ZombieComponent.cs b/Content.Shared/Zombies/ZombieComponent.cs index f9576dd3aa..47ae35b4c5 100644 --- a/Content.Shared/Zombies/ZombieComponent.cs +++ b/Content.Shared/Zombies/ZombieComponent.cs @@ -1,7 +1,7 @@ -using Content.Shared.Antag; using Content.Shared.Chat.Prototypes; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; +using Content.Shared.FixedPoint; using Content.Shared.Humanoid; using Content.Shared.Roles; using Content.Shared.StatusIcon; @@ -17,17 +17,30 @@ namespace Content.Shared.Zombies; public sealed partial class ZombieComponent : Component { /// - /// The baseline infection chance you have if you are completely nude + /// The baseline infection chance you have if you have no protective gear /// [ViewVariables(VVAccess.ReadWrite)] - public float MaxZombieInfectionChance = 0.80f; + public float BaseZombieInfectionChance = 0.75f; /// /// The minimum infection chance possible. This is simply to prevent - /// being invincible by bundling up. + /// being overly protected by bundling up. /// [ViewVariables(VVAccess.ReadWrite)] - public float MinZombieInfectionChance = 0.25f; + public float MinZombieInfectionChance = 0.05f; + + /// + /// How effective each resistance type on a piece of armor is. Using a damage specifier for this seems illegal. + /// + public DamageSpecifier ResistanceEffectiveness = new() + { + DamageDict = new () + { + {"Slash", 0.5}, + {"Piercing", 0.3}, + {"Blunt", 0.1}, + } + }; [ViewVariables(VVAccess.ReadWrite)] public float ZombieMovementSpeedDebuff = 0.70f; diff --git a/Content.Shared/Zombies/ZombificationResistanceComponent.cs b/Content.Shared/Zombies/ZombificationResistanceComponent.cs new file mode 100644 index 0000000000..58dd99721c --- /dev/null +++ b/Content.Shared/Zombies/ZombificationResistanceComponent.cs @@ -0,0 +1,46 @@ +using Content.Shared.Inventory; +using Robust.Shared.GameStates; + +namespace Content.Shared.Zombies; + +/// +/// An armor-esque component for clothing that grants "resistance" (lowers the chance) against getting infected. +/// It works on a coefficient system, so 0.3 is better than 0.9, 1 is no resistance, and 0 is full resistance. +/// +[NetworkedComponent, RegisterComponent] +public sealed partial class ZombificationResistanceComponent : Component +{ + /// + /// The multiplier that will by applied to the zombification chance. + /// + [DataField] + public float ZombificationResistanceCoefficient = 1; + + /// + /// Examine string for the zombification resistance. + /// Passed value from 0 to 100. + /// + [DataField] + public LocId Examine = "zombification-resistance-coefficient-value"; +} + +/// +/// Gets the total resistance from the ZombificationResistanceComponent, i.e. just all of them multiplied together. +/// +public sealed class ZombificationResistanceQueryEvent : EntityEventArgs, IInventoryRelayEvent +{ + /// + /// All slots to relay to + /// + public SlotFlags TargetSlots { get; } + + /// + /// The Total of all Coefficients. + /// + public float TotalCoefficient = 1.0f; + + public ZombificationResistanceQueryEvent(SlotFlags slots) + { + TargetSlots = slots; + } +} diff --git a/Resources/Locale/en-US/zombies/zombie.ftl b/Resources/Locale/en-US/zombies/zombie.ftl index b46e2ebc30..4643cd228b 100644 --- a/Resources/Locale/en-US/zombies/zombie.ftl +++ b/Resources/Locale/en-US/zombies/zombie.ftl @@ -7,3 +7,5 @@ zombie-role-desc = A malevolent creature of the dead. zombie-role-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color]. Search out the living and bite them in order to infect them and turn them into zombies. Work together with the other zombies and remaining initial infected to overtake the station. zombie-permadeath = This time, you're dead for real. + +zombification-resistance-coefficient-value = - [color=violet]Infection[/color] chance reduced by [color=lightblue]{$value}%[/color]. diff --git a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml index cc4c84840a..646a555037 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml @@ -249,6 +249,11 @@ - type: TemperatureProtection heatingCoefficient: 1.05 coolingCoefficient: 0.7 + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.90 + - type: Armor # so zombification resistance shows up + modifiers: + coefficients: { } - type: GroupExamine - type: HideLayerClothing slots: diff --git a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml index 9aa80e9a6a..eafd384864 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml @@ -738,6 +738,8 @@ Slash: 0.9 Piercing: 0.9 Heat: 0.9 + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.75 #Deathsquad Hardsuit - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Head/hoods.yml b/Resources/Prototypes/Entities/Clothing/Head/hoods.yml index 1330d38f40..0f081679dd 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hoods.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hoods.yml @@ -11,6 +11,11 @@ sprite: Clothing/Head/Hoods/Bio/general.rsi - type: BreathMask - type: IngestionBlocker + - type: GroupExamine + - type: Armor + modifiers: { } + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.9 - type: Tag tags: - WhitelistChameleon @@ -33,6 +38,8 @@ sprite: Clothing/Head/Hoods/Bio/cmo.rsi - type: Clothing sprite: Clothing/Head/Hoods/Bio/cmo.rsi + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.8 - type: entity parent: ClothingHeadHatHoodBioGeneral @@ -78,13 +85,15 @@ id: ClothingHeadHatHoodBioVirology name: bio hood suffix: Virology - description: A hood that protects the head and face from biological contaminants. + description: A hood that strongly protects the head and face from biological contaminants. components: - type: IdentityBlocker - type: Sprite sprite: Clothing/Head/Hoods/Bio/virology.rsi - type: Clothing sprite: Clothing/Head/Hoods/Bio/virology.rsi + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.8 - type: entity parent: ClothingHeadBase diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/bio.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/bio.yml index fec4d4df6c..fa550a83d6 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/bio.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/bio.yml @@ -12,7 +12,13 @@ - type: Armor modifiers: coefficients: - Caustic: 0.5 + Caustic: 0.75 + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.35 + - type: GroupExamine + - type: ClothingSpeedModifier + walkModifier: 1 + sprintModifier: 0.95 - type: entity parent: ClothingOuterBioGeneral @@ -31,12 +37,16 @@ id: ClothingOuterBioJanitor name: bio suit suffix: Janitor - description: A suit that protects against biological contamination, in Janitor colors. + description: A suit that protects against biological contamination and caustic spills. components: - type: Sprite sprite: Clothing/OuterClothing/Bio/janitor.rsi - type: Clothing sprite: Clothing/OuterClothing/Bio/janitor.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.4 - type: entity parent: ClothingOuterBioGeneral @@ -51,25 +61,35 @@ sprite: Clothing/OuterClothing/Bio/scientist.rsi - type: entity - parent: ClothingOuterBioGeneral + parent: [ClothingOuterBioGeneral, BaseSecurityContraband] id: ClothingOuterBioSecurity name: bio suit suffix: Security - description: A suit that protects against biological contamination, in Security colors. + description: A suit that protects against biological contamination, kitted out with additional armor. components: - type: Sprite sprite: Clothing/OuterClothing/Bio/security.rsi - type: Clothing sprite: Clothing/OuterClothing/Bio/security.rsi + - type: Armor + modifiers: + coefficients: + Caustic: 0.8 + Slash: 0.6 + Piercing: 0.8 + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.4 - type: entity parent: ClothingOuterBioGeneral id: ClothingOuterBioVirology name: bio suit suffix: Virology - description: A suit that protects against biological contamination, in Virology colors. + description: A suit that strongly protects against biological contamination. components: - type: Sprite sprite: Clothing/OuterClothing/Bio/virology.rsi - type: Clothing sprite: Clothing/OuterClothing/Bio/virology.rsi + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.25 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index a841b5878f..ba57ef9c53 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -968,6 +968,8 @@ Shock: 0.1 Radiation: 0.1 Caustic: 0.1 + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.25 - type: ClothingSpeedModifier walkModifier: 1.0 sprintModifier: 1.0 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index c141971700..142cac767e 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -19,6 +19,8 @@ Slash: 0.95 Heat: 0.90 priceMultiplier: 0 + - type: ZombificationResistance + zombificationResistanceCoefficient: 0.55 - type: Food requiresSpecialDigestion: true - type: SolutionContainerManager From c0aa3189c74ac07870d5968f52f04557e9aeaa45 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 18:22:52 +0000 Subject: [PATCH 182/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 33 +++++++++++++++++-------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 273d928f2f..33c9a83f4c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,19 +1,4 @@ Entries: -- author: BramvanZijp - changes: - - message: The Head of Security's Energy Shotgun has regained its ability to self - recharge, but only if the weapon has not been discharged in the last 10 seconds. - type: Add - - message: The Head of Security's Energy Shotgun now has a varying amount of shots - depending on the firing mode. - type: Tweak - - message: Energy based weapons with differing energy consumption depending on the - fire-mode will now update the ammo counter on the HUD when switching between - fire-modes. - type: Fix - id: 7699 - time: '2024-12-11T16:21:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32104 - author: Winkarst-cpu changes: - message: The A.P.E. guidebook entry now contains information about Sigma particles @@ -3906,3 +3891,21 @@ id: 8198 time: '2025-04-16T17:58:35.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35447 +- author: UpAndLeaves + changes: + - message: Most clothing will no longer provide protection against zombification + type: Tweak + - message: Blunt/Slash/Piercing resistance will now provide weak protection against + zombification. + type: Tweak + - message: Winter coats are now moderately effective against zombification. + type: Tweak + - message: Bio suits are now very effective against zombification. + type: Tweak + - message: Security bio suits are now lightly armored. + type: Tweak + - message: Bio suits now only have 5% slowdown. + type: Tweak + id: 8199 + time: '2025-04-16T18:21:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36485 From a0d5d85019d1e19613d00312f46fc695172ad432 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Wed, 16 Apr 2025 15:01:54 -0400 Subject: [PATCH 183/622] Cleanup warnings in GunSystem (#36629) * Cleanup warnings in GunSystem * Remove _transform and use shared's TransformSystem instead * Missed one --- .../Ranged/Systems/GunSystem.AutoFire.cs | 2 +- .../Weapons/Ranged/Systems/GunSystem.cs | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.AutoFire.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.AutoFire.cs index e5439cdb06..47b0d5f3c6 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.AutoFire.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.AutoFire.cs @@ -31,7 +31,7 @@ public sealed partial class GunSystem } else if (gun.BurstActivated) { - var parent = _transform.GetParentUid(uid); + var parent = TransformSystem.GetParentUid(uid); if (HasComp(parent)) AttemptShoot(parent, uid, gun, gun.ShootCoordinates ?? new EntityCoordinates(uid, gun.DefaultDirection)); else diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index 86be82d1c3..b8d488b575 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -32,9 +32,9 @@ public sealed partial class GunSystem : SharedGunSystem [Dependency] private readonly DamageExamineSystem _damageExamine = default!; [Dependency] private readonly PricingSystem _pricing = default!; [Dependency] private readonly SharedColorFlashEffectSystem _color = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly StaminaSystem _stamina = default!; [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedMapSystem _map = default!; private const float DamagePitchVariation = 0.05f; @@ -76,16 +76,16 @@ public sealed partial class GunSystem : SharedGunSystem } } - var fromMap = fromCoordinates.ToMap(EntityManager, TransformSystem); - var toMap = toCoordinates.ToMapPos(EntityManager, TransformSystem); + var fromMap = TransformSystem.ToMapCoordinates(fromCoordinates); + var toMap = TransformSystem.ToMapCoordinates(toCoordinates).Position; var mapDirection = toMap - fromMap.Position; var mapAngle = mapDirection.ToAngle(); var angle = GetRecoilAngle(Timing.CurTime, gun, mapDirection.ToAngle()); // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map. - var fromEnt = MapManager.TryFindGridAt(fromMap, out var gridUid, out var grid) - ? fromCoordinates.WithEntityId(gridUid, EntityManager) - : new EntityCoordinates(MapManager.GetMapEntityId(fromMap.MapId), fromMap.Position); + var fromEnt = MapManager.TryFindGridAt(fromMap, out var gridUid, out _) + ? TransformSystem.WithEntityId(fromCoordinates, gridUid) + : new EntityCoordinates(_map.GetMapOrInvalid(fromMap.MapId), fromMap.Position); // Update shot based on the recoil toMap = fromMap.Position + angle.ToVec() * mapDirection.Length(); @@ -196,7 +196,7 @@ public sealed partial class GunSystem : SharedGunSystem break; fromEffect = Transform(hit).Coordinates; - from = fromEffect.ToMap(EntityManager, _transform); + from = TransformSystem.ToMapCoordinates(fromEffect); dir = ev.Direction; lastUser = hit; } @@ -405,13 +405,13 @@ public sealed partial class GunSystem : SharedGunSystem if (gridUid != fromCoordinates.EntityId && TryComp(gridUid, out TransformComponent? gridXform)) { var (_, gridRot, gridInvMatrix) = TransformSystem.GetWorldPositionRotationInvMatrix(gridXform); - var map = _transform.ToMapCoordinates(fromCoordinates); + var map = TransformSystem.ToMapCoordinates(fromCoordinates); fromCoordinates = new EntityCoordinates(gridUid.Value, Vector2.Transform(map.Position, gridInvMatrix)); angle -= gridRot; } else { - angle -= _transform.GetWorldRotation(fromXform); + angle -= TransformSystem.GetWorldRotation(fromXform); } if (distance >= 1f) From 56412d4b4e47f63154d1744c08dc3f7a3820afeb Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Wed, 16 Apr 2025 21:20:36 +0200 Subject: [PATCH 184/622] Basic Resources Crate (#36419) * init * 1660 * I never webedit Co-authored-by: Tayrtahn --------- Co-authored-by: Tayrtahn --- .../Prototypes/Catalog/Cargo/cargo_materials.yml | 10 ++++++++++ .../Catalog/Fills/Crates/materials.yml | 12 ++++++++++++ .../Sheets/other.rsi/generic_materials.png | Bin 0 -> 7155 bytes .../Objects/Materials/Sheets/other.rsi/meta.json | 3 +++ 4 files changed, 25 insertions(+) create mode 100644 Resources/Textures/Objects/Materials/Sheets/other.rsi/generic_materials.png diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml index 33582fea94..097a11185b 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml @@ -88,6 +88,16 @@ category: cargoproduct-category-name-materials group: market +- type: cargoProduct + id: MaterialBasic + icon: + sprite: Objects/Materials/Sheets/other.rsi + state: generic_materials + product: CrateMaterialBasicResource + cost: 1660 + category: cargoproduct-category-name-materials + group: market + - type: cargoProduct id: MaterialFuelTank icon: diff --git a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml index 3934812ae4..f6eb9a17af 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml @@ -153,6 +153,18 @@ # for some reason, the selector here adds 1 to whatever value it generates, # so this is actually 2-4 +- type: entity + id: CrateMaterialBasicResource + parent: CrateGenericSteel + name: basic sheet crate + description: 30 sheets of steel, glass, and plastic. + components: + - type: StorageFill + contents: + - id: SheetSteel + - id: SheetGlass + - id: SheetPlastic + #- type: entity # id: CrateMaterialHFuelTank # name: fueltank crate diff --git a/Resources/Textures/Objects/Materials/Sheets/other.rsi/generic_materials.png b/Resources/Textures/Objects/Materials/Sheets/other.rsi/generic_materials.png new file mode 100644 index 0000000000000000000000000000000000000000..f0883c35a7d4e2e3ee30afdbca28145829dde5d1 GIT binary patch literal 7155 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Materials/Sheets/other.rsi/meta.json b/Resources/Textures/Objects/Materials/Sheets/other.rsi/meta.json index 6cd21aae79..68dae7e1fe 100644 --- a/Resources/Textures/Objects/Materials/Sheets/other.rsi/meta.json +++ b/Resources/Textures/Objects/Materials/Sheets/other.rsi/meta.json @@ -85,6 +85,9 @@ { "name": "uranium-inhand-right", "directions": 4 + }, + { + "name": "generic_materials" } ] } From be5bbd4dc31d69b3e3bdc332ecca8070e944f4c8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 19:21:45 +0000 Subject: [PATCH 185/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 33c9a83f4c..106f0ef73e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Winkarst-cpu - changes: - - message: The A.P.E. guidebook entry now contains information about Sigma particles - and transformation effects. - type: Tweak - id: 7700 - time: '2024-12-12T14:24:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33558 - author: lzk228 changes: - message: Disabled evac after declaring nuke war is increased from 15 to 25 minutes. @@ -3909,3 +3901,11 @@ id: 8199 time: '2025-04-16T18:21:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36485 +- author: ScarKy0 + changes: + - message: A basic sheet crate can now be ordered for 1660 spesos. It contains 30 + steel, glass and plastic. + type: Add + id: 8200 + time: '2025-04-16T19:20:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36419 From 5d38ae56de87faa4c16c46a5eac7c9a12add597f Mon Sep 17 00:00:00 2001 From: pathetic meowmeow Date: Wed, 16 Apr 2025 15:29:25 -0400 Subject: [PATCH 186/622] Add chatty lathes (#34959) --- .../Components/LatheAnnouncingComponent.cs | 17 ++++++++ Content.Server/Lathe/LatheSystem.cs | 39 +++++++++++++++++++ .../Systems/ResearchSystem.Technology.cs | 4 +- .../Components/TechnologyDatabaseComponent.cs | 2 +- .../Research/Systems/BlueprintSystem.cs | 3 +- .../Research/Systems/SharedResearchSystem.cs | 2 +- Resources/Locale/en-US/lathe/lathesystem.ftl | 2 + .../Entities/Structures/Machines/lathe.yml | 4 ++ 8 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 Content.Server/Lathe/Components/LatheAnnouncingComponent.cs diff --git a/Content.Server/Lathe/Components/LatheAnnouncingComponent.cs b/Content.Server/Lathe/Components/LatheAnnouncingComponent.cs new file mode 100644 index 0000000000..16c30d98eb --- /dev/null +++ b/Content.Server/Lathe/Components/LatheAnnouncingComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Radio; +using Robust.Shared.Prototypes; + +namespace Content.Server.Lathe.Components; + +/// +/// Causes this entity to announce onto the provided channels when it receives new recipes from its server +/// +[RegisterComponent] +public sealed partial class LatheAnnouncingComponent : Component +{ + /// + /// Radio channels to broadcast to when a new set of recipes is received + /// + [DataField(required: true)] + public List> Channels = new(); +} diff --git a/Content.Server/Lathe/LatheSystem.cs b/Content.Server/Lathe/LatheSystem.cs index 68a5228bdf..4851f6b63d 100644 --- a/Content.Server/Lathe/LatheSystem.cs +++ b/Content.Server/Lathe/LatheSystem.cs @@ -8,6 +8,7 @@ using Content.Server.Materials; using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; +using Content.Server.Radio.EntitySystems; using Content.Server.Stack; using Content.Shared.Atmos; using Content.Shared.Chemistry.Components; @@ -20,6 +21,7 @@ using Content.Shared.Emag.Systems; using Content.Shared.Examine; using Content.Shared.Lathe; using Content.Shared.Lathe.Prototypes; +using Content.Shared.Localizations; using Content.Shared.Materials; using Content.Shared.Power; using Content.Shared.ReagentSpeed; @@ -53,6 +55,7 @@ namespace Content.Server.Lathe [Dependency] private readonly SharedSolutionContainerSystem _solution = default!; [Dependency] private readonly StackSystem _stack = default!; [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly RadioSystem _radio = default!; /// /// Per-tick cache @@ -67,6 +70,7 @@ namespace Content.Server.Lathe SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnPowerChanged); SubscribeLocalEvent(OnDatabaseModified); + SubscribeLocalEvent(OnTechnologyDatabaseModified); SubscribeLocalEvent(OnResearchRegistrationChanged); SubscribeLocalEvent(OnLatheQueueRecipeMessage); @@ -364,6 +368,41 @@ namespace Content.Server.Lathe UpdateUserInterfaceState(uid, component); } + private void OnTechnologyDatabaseModified(Entity ent, ref TechnologyDatabaseModifiedEvent args) + { + if (args.NewlyUnlockedRecipes is null) + return; + + if (!TryGetAvailableRecipes(ent.Owner, out var potentialRecipes)) + return; + + var recipeNames = new List(); + foreach (var recipeId in args.NewlyUnlockedRecipes) + { + if (!potentialRecipes.Contains(new(recipeId))) + continue; + + if (!_proto.TryIndex(recipeId, out LatheRecipePrototype? recipe)) + continue; + + var itemName = GetRecipeName(recipe!); + recipeNames.Add(Loc.GetString("lathe-unlock-recipe-radio-broadcast-item", ("item", itemName))); + } + + if (recipeNames.Count == 0) + return; + + var message = Loc.GetString( + "lathe-unlock-recipe-radio-broadcast", + ("items", ContentLocalizationManager.FormatList(recipeNames)) + ); + + foreach (var channel in ent.Comp.Channels) + { + _radio.SendRadioMessage(ent.Owner, message, channel, ent.Owner, escapeMarkup: false); + } + } + private void OnResearchRegistrationChanged(EntityUid uid, LatheComponent component, ref ResearchRegistrationChangedEvent args) { UpdateUserInterfaceState(uid, component); diff --git a/Content.Server/Research/Systems/ResearchSystem.Technology.cs b/Content.Server/Research/Systems/ResearchSystem.Technology.cs index 360985b4b6..0237c8712a 100644 --- a/Content.Server/Research/Systems/ResearchSystem.Technology.cs +++ b/Content.Server/Research/Systems/ResearchSystem.Technology.cs @@ -119,15 +119,17 @@ public sealed partial class ResearchSystem } component.UnlockedTechnologies.Add(technology.ID); + var addedRecipes = new List(); foreach (var unlock in technology.RecipeUnlocks) { if (component.UnlockedRecipes.Contains(unlock)) continue; component.UnlockedRecipes.Add(unlock); + addedRecipes.Add(unlock); } Dirty(uid, component); - var ev = new TechnologyDatabaseModifiedEvent(); + var ev = new TechnologyDatabaseModifiedEvent(addedRecipes); RaiseLocalEvent(uid, ref ev); } diff --git a/Content.Shared/Research/Components/TechnologyDatabaseComponent.cs b/Content.Shared/Research/Components/TechnologyDatabaseComponent.cs index 4f976869f7..a69e4ee9dd 100644 --- a/Content.Shared/Research/Components/TechnologyDatabaseComponent.cs +++ b/Content.Shared/Research/Components/TechnologyDatabaseComponent.cs @@ -54,7 +54,7 @@ public sealed partial class TechnologyDatabaseComponent : Component /// server to all of it's clients. /// [ByRefEvent] -public readonly record struct TechnologyDatabaseModifiedEvent; +public readonly record struct TechnologyDatabaseModifiedEvent(List? NewlyUnlockedRecipes); /// /// Event raised on a database after being synchronized diff --git a/Content.Shared/Research/Systems/BlueprintSystem.cs b/Content.Shared/Research/Systems/BlueprintSystem.cs index 237ff70300..903e529089 100644 --- a/Content.Shared/Research/Systems/BlueprintSystem.cs +++ b/Content.Shared/Research/Systems/BlueprintSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.Research.Prototypes; using Content.Shared.Whitelist; using Robust.Shared.Containers; using Robust.Shared.Prototypes; +using System.Linq; namespace Content.Shared.Research.Systems; @@ -64,7 +65,7 @@ public sealed class BlueprintSystem : EntitySystem _container.Insert(blueprint.Owner, _container.GetContainer(ent, ent.Comp.ContainerId)); - var ev = new TechnologyDatabaseModifiedEvent(); + var ev = new TechnologyDatabaseModifiedEvent(blueprint.Comp.ProvidedRecipes.Select(it => it.Id).ToList()); RaiseLocalEvent(ent, ref ev); return true; } diff --git a/Content.Shared/Research/Systems/SharedResearchSystem.cs b/Content.Shared/Research/Systems/SharedResearchSystem.cs index bca1ae4888..7ed33f7204 100644 --- a/Content.Shared/Research/Systems/SharedResearchSystem.cs +++ b/Content.Shared/Research/Systems/SharedResearchSystem.cs @@ -301,7 +301,7 @@ public abstract class SharedResearchSystem : EntitySystem component.UnlockedRecipes.Add(recipe); Dirty(uid, component); - var ev = new TechnologyDatabaseModifiedEvent(); + var ev = new TechnologyDatabaseModifiedEvent(new List { recipe }); RaiseLocalEvent(uid, ref ev); } } diff --git a/Resources/Locale/en-US/lathe/lathesystem.ftl b/Resources/Locale/en-US/lathe/lathesystem.ftl index 9fa62e0c1e..93e0107f68 100644 --- a/Resources/Locale/en-US/lathe/lathesystem.ftl +++ b/Resources/Locale/en-US/lathe/lathesystem.ftl @@ -1 +1,3 @@ lathe-popup-material-not-used = This material is not used in this machine. +lathe-unlock-recipe-radio-broadcast = This lathe is now capable of producing the following recipes: {$items} +lathe-unlock-recipe-radio-broadcast-item = [bold]{$item}[/bold] diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index cf3bcac302..0d008ed1e1 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -408,6 +408,8 @@ - Sheet - RawMaterial - Ingot + - type: LatheAnnouncing + channels: [Security] - type: entity id: AmmoTechFab @@ -478,6 +480,8 @@ board: MedicalTechFabCircuitboard - type: StealTarget stealGroup: MedicalTechFabCircuitboard + - type: LatheAnnouncing + channels: [Medical] - type: entity parent: BaseLathe From 0cbd7549b2bfa2aec0d7dd05f61d1d49fb1783ec Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 19:30:33 +0000 Subject: [PATCH 187/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 106f0ef73e..0928d1da3d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: lzk228 - changes: - - message: Disabled evac after declaring nuke war is increased from 15 to 25 minutes. - type: Tweak - id: 7701 - time: '2024-12-13T03:10:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33628 - author: LevitatingTree changes: - message: Lizards can now eat the Five Alarm Burger! @@ -3909,3 +3902,11 @@ id: 8200 time: '2025-04-16T19:20:36.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36419 +- author: sowelipililimute + changes: + - message: The medical and security techfabs now announce new recipes that they + can fabricate as they are researched + type: Add + id: 8201 + time: '2025-04-16T19:29:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34959 From 468d1424ecb9ec98b4c3a68caf3cfec101c32100 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 17 Apr 2025 05:39:14 +1000 Subject: [PATCH 188/622] Vending machine popup prediction (#36622) Title. --- .../SharedVendingMachineSystem.Restock.cs | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs index de57189bc7..a5e2a6eccc 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs @@ -16,14 +16,11 @@ public abstract partial class SharedVendingMachineSystem { if (!TryComp(target, out var panel) || !panel.Open) { - if (_net.IsServer) - { - Popup.PopupCursor(Loc.GetString("vending-machine-restock-needs-panel-open", - ("this", uid), - ("user", user), - ("target", target)), - user); - } + Popup.PopupCursor(Loc.GetString("vending-machine-restock-needs-panel-open", + ("this", uid), + ("user", user), + ("target", target)), + user); return false; } @@ -39,11 +36,8 @@ public abstract partial class SharedVendingMachineSystem { if (!component.CanRestock.Contains(machineComponent.PackPrototypeId)) { - if (_net.IsServer) - { - Popup.PopupCursor(Loc.GetString("vending-machine-restock-invalid-inventory", ("this", uid), ("user", user), - ("target", target)), user); - } + Popup.PopupCursor(Loc.GetString("vending-machine-restock-invalid-inventory", ("this", uid), ("user", user), + ("target", target)), user); return false; } @@ -78,13 +72,11 @@ public abstract partial class SharedVendingMachineSystem if (!_doAfter.TryStartDoAfter(doAfterArgs)) return; - if (_net.IsServer) - { - Popup.PopupEntity(Loc.GetString("vending-machine-restock-start", ("this", uid), ("user", args.User), - ("target", target)), - args.User, - PopupType.Medium); - } + Popup.PopupPredicted(Loc.GetString("vending-machine-restock-start", ("this", uid), ("user", args.User), + ("target", target)), + uid, + args.User, + PopupType.Medium); Audio.PlayPredicted(component.SoundRestockStart, uid, args.User); } From 4e60387bd14e0a7b7d7d67cdda912a1c0ccb90d1 Mon Sep 17 00:00:00 2001 From: Nox38 Date: Wed, 16 Apr 2025 12:49:01 -0700 Subject: [PATCH 189/622] Fixed armory power! --- Resources/Maps/box.yml | 1277 ++++++++++++++++++++--------- Resources/Prototypes/Maps/box.yml | 20 +- 2 files changed, 884 insertions(+), 413 deletions(-) diff --git a/Resources/Maps/box.yml b/Resources/Maps/box.yml index 2d46765fad..dde4240082 100644 --- a/Resources/Maps/box.yml +++ b/Resources/Maps/box.yml @@ -4,8 +4,8 @@ meta: engineVersion: 253.0.0 forkId: "" forkVersion: "" - time: 04/15/2025 11:22:33 - entityCount: 28326 + time: 04/16/2025 19:47:10 + entityCount: 28355 maps: - 780 grids: @@ -8310,7 +8310,7 @@ entities: 0,8: 0: 26367 7: 4096 - 2: 32768 + 8: 32768 1,4: 0: 61680 1,5: @@ -8321,7 +8321,7 @@ entities: 0: 64911 1,8: 0: 49373 - 2: 4096 + 8: 4096 2,5: 0: 28799 2,6: @@ -8365,21 +8365,23 @@ entities: 0: 65358 -3,7: 0: 55769 - 7: 1024 + 9: 1024 -3,8: 0: 65421 -2,5: 0: 57599 -2,6: 0: 65356 - 7: 2 + 9: 2 -2,7: 0: 65533 -2,8: 0: 64991 -1,8: 0: 206 - 7: 57376 + 9: 8224 + 10: 16384 + 11: 32768 4,8: 0: 65535 5,4: @@ -8445,7 +8447,7 @@ entities: 0: 65535 -1,9: 0: 61038 - 7: 128 + 8: 128 -1,10: 1: 60928 5: 192 @@ -8456,10 +8458,9 @@ entities: 0: 65518 0,9: 0: 32655 - 7: 16 - 2: 32 - 8: 64 - 9: 32768 + 8: 48 + 12: 64 + 13: 32768 0,10: 5: 240 1: 65280 @@ -8470,7 +8471,7 @@ entities: 0: 65535 1,9: 0: 52733 - 9: 4096 + 13: 4096 1,10: 1: 53504 5: 8192 @@ -9002,7 +9003,7 @@ entities: 0: 65407 9,-2: 0: 57343 - 7: 8192 + 9: 8192 9,-5: 0: 61166 10,-4: @@ -9303,7 +9304,7 @@ entities: 1: 192 5: 49152 3,-17: - 10: 30576 + 14: 30576 4,-16: 1: 240 0: 61440 @@ -9884,7 +9885,7 @@ entities: 0: 255 1: 49152 4,-17: - 11: 30576 + 15: 30576 5,-20: 0: 65535 5,-19: @@ -10467,6 +10468,36 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.14917 + moles: + - 16.99477 + - 63.932716 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.1495 + moles: + - 20.078888 + - 75.53487 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.14975 moles: @@ -10483,10 +10514,40 @@ entities: - 0 - 0 - volume: 2500 - temperature: 293.14923 + temperature: 293.14948 moles: - - 20.078888 - - 75.53487 + - 18.472576 + - 69.49208 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.1492 + moles: + - 18.472576 + - 69.49208 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.149 + moles: + - 18.472576 + - 69.49208 - 0 - 0 - 0 @@ -10632,6 +10693,15 @@ entities: parent: 8364 - proto: ActionToggleInternals entities: + - uid: 10072 + mapInit: true + paused: true + components: + - type: Transform + parent: 9182 + - type: InstantAction + originalIconColor: '#FFFFFFFF' + container: 9182 - uid: 25167 components: - type: Transform @@ -10646,6 +10716,17 @@ entities: - type: InstantAction originalIconColor: '#FFFFFFFF' container: 20121 +- proto: ActionToggleJetpack + entities: + - uid: 10071 + mapInit: true + paused: true + components: + - type: Transform + parent: 9182 + - type: InstantAction + originalIconColor: '#FFFFFFFF' + container: 9182 - proto: ActionToggleLight entities: - uid: 16587 @@ -13906,7 +13987,7 @@ entities: pos: 24.5,16.5 parent: 8364 - type: Door - secondsUntilStateChange: -96621.34 + secondsUntilStateChange: -97804.64 state: Opening - type: DeviceLinkSource lastSignals: @@ -15461,7 +15542,7 @@ entities: pos: 9.5,25.5 parent: 8364 - type: Door - secondsUntilStateChange: -9877.836 + secondsUntilStateChange: -11061.134 state: Opening - type: DeviceLinkSource lastSignals: @@ -16785,6 +16866,8 @@ entities: parent: 8364 - uid: 9415 components: + - type: MetaData + name: Security Breakroom APC - type: Transform rot: -1.5707963267948966 rad pos: 20.5,35.5 @@ -16795,6 +16878,14 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,23.5 parent: 8364 + - uid: 10027 + components: + - type: MetaData + name: Armory APC + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,36.5 + parent: 8364 - uid: 10544 components: - type: MetaData @@ -16863,13 +16954,6 @@ entities: rot: -1.5707963267948966 rad pos: -14.5,-18.5 parent: 8364 - - uid: 11965 - components: - - type: MetaData - name: Warden's Office APC - - type: Transform - pos: 3.5,34.5 - parent: 8364 - uid: 12020 components: - type: MetaData @@ -21465,15 +21549,10 @@ entities: parent: 8364 - proto: BoxFlashbang entities: - - uid: 9388 + - uid: 10066 components: - type: Transform - pos: -2.28955,39.38977 - parent: 8364 - - uid: 9589 - components: - - type: Transform - pos: 21.5,35.5 + pos: 6.4871874,35.49408 parent: 8364 - proto: BoxFolderBlack entities: @@ -21704,11 +21783,6 @@ entities: - type: Transform pos: 16.409477,33.177017 parent: 8364 - - uid: 9389 - components: - - type: Transform - pos: -2.648925,39.67102 - parent: 8364 - proto: BoxingBell entities: - uid: 11158 @@ -21731,25 +21805,25 @@ entities: parent: 8364 - proto: BoxLethalshot entities: - - uid: 4645 + - uid: 9388 components: - type: Transform - pos: -1.2980705,35.389374 + pos: 2.7149048,39.67169 parent: 8364 - - uid: 8641 + - uid: 9518 components: - type: Transform - pos: -1.6730705,35.712288 + pos: 2.7149048,39.41707 parent: 8364 - - uid: 9229 + - uid: 9538 components: - type: Transform - pos: -1.7147372,35.399788 + pos: 2.335275,39.66707 parent: 8364 - - uid: 9233 + - uid: 10029 components: - type: Transform - pos: -1.2668205,35.701874 + pos: 2.335275,39.407806 parent: 8364 - proto: BoxLightbulb entities: @@ -21794,6 +21868,34 @@ entities: - type: Transform pos: 58.505,18.482952 parent: 8364 +- proto: BoxMagazinePistol + entities: + - uid: 10021 + components: + - type: Transform + pos: 5.582965,37.72505 + parent: 8364 +- proto: BoxMagazinePistolPractice + entities: + - uid: 28331 + components: + - type: Transform + pos: 21.65355,36.475 + parent: 8364 +- proto: BoxMagazinePistolSubMachineGunPractice + entities: + - uid: 28333 + components: + - type: Transform + pos: 21.387924,36.2875 + parent: 8364 +- proto: BoxMagazineRiflePractice + entities: + - uid: 28332 + components: + - type: Transform + pos: 21.46605,36.725 + parent: 8364 - proto: BoxMouthSwab entities: - uid: 5468 @@ -21815,6 +21917,13 @@ entities: - type: Transform pos: -13.529548,-15.192467 parent: 8364 +- proto: BoxShotgunPractice + entities: + - uid: 28334 + components: + - type: Transform + pos: 21.596834,35.81875 + parent: 8364 - proto: BoxSterileMask entities: - uid: 5467 @@ -21827,6 +21936,13 @@ entities: - type: Transform pos: 24.405125,-36.239418 parent: 8364 +- proto: BoxStinger + entities: + - uid: 10081 + components: + - type: Transform + pos: 6.9403124,35.540955 + parent: 8364 - proto: BoxSyringe entities: - uid: 7928 @@ -21839,6 +21955,13 @@ entities: - type: Transform pos: 38.5,-59.5 parent: 8364 +- proto: BoxTearGas + entities: + - uid: 10022 + components: + - type: Transform + pos: 6.7996874,35.790955 + parent: 8364 - proto: BoxTrashbag entities: - uid: 27574 @@ -21858,7 +21981,7 @@ entities: - uid: 542 components: - type: Transform - pos: 12.512168,34.618263 + pos: 6.3934374,35.74408 parent: 8364 - proto: BrbSign entities: @@ -23008,6 +23131,11 @@ entities: - type: Transform pos: 25.5,-51.5 parent: 8364 + - uid: 4213 + components: + - type: Transform + pos: -3.5,36.5 + parent: 8364 - uid: 4251 components: - type: Transform @@ -23208,6 +23336,11 @@ entities: - type: Transform pos: -21.5,-76.5 parent: 8364 + - uid: 4990 + components: + - type: Transform + pos: -2.5,36.5 + parent: 8364 - uid: 5069 components: - type: Transform @@ -24583,11 +24716,6 @@ entities: - type: Transform pos: 15.5,26.5 parent: 8364 - - uid: 7768 - components: - - type: Transform - pos: -1.5,32.5 - parent: 8364 - uid: 7770 components: - type: Transform @@ -24663,11 +24791,6 @@ entities: - type: Transform pos: 4.5,37.5 parent: 8364 - - uid: 8547 - components: - - type: Transform - pos: 3.5,33.5 - parent: 8364 - uid: 8557 components: - type: Transform @@ -24728,11 +24851,6 @@ entities: - type: Transform pos: 17.5,20.5 parent: 8364 - - uid: 8589 - components: - - type: Transform - pos: 3.5,32.5 - parent: 8364 - uid: 8590 components: - type: Transform @@ -24763,6 +24881,11 @@ entities: - type: Transform pos: -18.5,41.5 parent: 8364 + - uid: 8641 + components: + - type: Transform + pos: -3.5,29.5 + parent: 8364 - uid: 8651 components: - type: Transform @@ -24793,11 +24916,6 @@ entities: - type: Transform pos: -9.5,27.5 parent: 8364 - - uid: 8680 - components: - - type: Transform - pos: -3.5,29.5 - parent: 8364 - uid: 8681 components: - type: Transform @@ -25143,6 +25261,16 @@ entities: - type: Transform pos: -13.5,23.5 parent: 8364 + - uid: 8770 + components: + - type: Transform + pos: -2.5,31.5 + parent: 8364 + - uid: 8777 + components: + - type: Transform + pos: 14.5,40.5 + parent: 8364 - uid: 8812 components: - type: Transform @@ -25333,6 +25461,11 @@ entities: - type: Transform pos: -23.5,47.5 parent: 8364 + - uid: 9074 + components: + - type: Transform + pos: 14.5,41.5 + parent: 8364 - uid: 9088 components: - type: Transform @@ -25428,15 +25561,15 @@ entities: - type: Transform pos: -20.5,23.5 parent: 8364 - - uid: 9268 + - uid: 9164 components: - type: Transform - pos: 3.5,34.5 + pos: 14.5,37.5 parent: 8364 - - uid: 9288 + - uid: 9193 components: - type: Transform - pos: -3.5,33.5 + pos: 14.5,38.5 parent: 8364 - uid: 9292 components: @@ -25493,21 +25626,6 @@ entities: - type: Transform pos: 14.5,39.5 parent: 8364 - - uid: 9304 - components: - - type: Transform - pos: 15.5,39.5 - parent: 8364 - - uid: 9305 - components: - - type: Transform - pos: 15.5,40.5 - parent: 8364 - - uid: 9306 - components: - - type: Transform - pos: 15.5,38.5 - parent: 8364 - uid: 9307 components: - type: Transform @@ -25603,11 +25721,6 @@ entities: - type: Transform pos: 19.5,35.5 parent: 8364 - - uid: 9336 - components: - - type: Transform - pos: -2.5,30.5 - parent: 8364 - uid: 9337 components: - type: Transform @@ -26213,11 +26326,6 @@ entities: - type: Transform pos: -43.5,10.5 parent: 8364 - - uid: 9998 - components: - - type: Transform - pos: 15.5,41.5 - parent: 8364 - uid: 10003 components: - type: Transform @@ -26228,71 +26336,6 @@ entities: - type: Transform pos: -18.5,23.5 parent: 8364 - - uid: 10020 - components: - - type: Transform - pos: 15.5,42.5 - parent: 8364 - - uid: 10021 - components: - - type: Transform - pos: 14.5,42.5 - parent: 8364 - - uid: 10022 - components: - - type: Transform - pos: 13.5,42.5 - parent: 8364 - - uid: 10023 - components: - - type: Transform - pos: 15.5,37.5 - parent: 8364 - - uid: 10024 - components: - - type: Transform - pos: 16.5,37.5 - parent: 8364 - - uid: 10025 - components: - - type: Transform - pos: 16.5,36.5 - parent: 8364 - - uid: 10026 - components: - - type: Transform - pos: 14.5,37.5 - parent: 8364 - - uid: 10027 - components: - - type: Transform - pos: 13.5,37.5 - parent: 8364 - - uid: 10028 - components: - - type: Transform - pos: 12.5,37.5 - parent: 8364 - - uid: 10029 - components: - - type: Transform - pos: 12.5,36.5 - parent: 8364 - - uid: 10030 - components: - - type: Transform - pos: 11.5,37.5 - parent: 8364 - - uid: 10031 - components: - - type: Transform - pos: 11.5,38.5 - parent: 8364 - - uid: 10032 - components: - - type: Transform - pos: 11.5,40.5 - parent: 8364 - uid: 10033 components: - type: Transform @@ -26403,91 +26446,11 @@ entities: - type: Transform pos: 8.5,41.5 parent: 8364 - - uid: 10065 - components: - - type: Transform - pos: 0.5,34.5 - parent: 8364 - - uid: 10066 - components: - - type: Transform - pos: -0.5,34.5 - parent: 8364 - uid: 10067 components: - type: Transform pos: 4.5,31.5 parent: 8364 - - uid: 10068 - components: - - type: Transform - pos: 5.5,31.5 - parent: 8364 - - uid: 10069 - components: - - type: Transform - pos: 5.5,32.5 - parent: 8364 - - uid: 10070 - components: - - type: Transform - pos: 5.5,30.5 - parent: 8364 - - uid: 10071 - components: - - type: Transform - pos: 3.5,30.5 - parent: 8364 - - uid: 10072 - components: - - type: Transform - pos: 3.5,29.5 - parent: 8364 - - uid: 10073 - components: - - type: Transform - pos: 1.5,30.5 - parent: 8364 - - uid: 10074 - components: - - type: Transform - pos: 1.5,29.5 - parent: 8364 - - uid: 10075 - components: - - type: Transform - pos: 0.5,29.5 - parent: 8364 - - uid: 10076 - components: - - type: Transform - pos: -1.5,30.5 - parent: 8364 - - uid: 10077 - components: - - type: Transform - pos: -1.5,29.5 - parent: 8364 - - uid: 10078 - components: - - type: Transform - pos: -2.5,29.5 - parent: 8364 - - uid: 10079 - components: - - type: Transform - pos: -3.5,30.5 - parent: 8364 - - uid: 10080 - components: - - type: Transform - pos: -2.5,32.5 - parent: 8364 - - uid: 10081 - components: - - type: Transform - pos: -3.5,32.5 - parent: 8364 - uid: 10083 components: - type: Transform @@ -43968,6 +43931,76 @@ entities: - type: Transform pos: 47.5,-28.5 parent: 8364 + - uid: 28342 + components: + - type: Transform + pos: 1.5,36.5 + parent: 8364 + - uid: 28343 + components: + - type: Transform + pos: 1.5,35.5 + parent: 8364 + - uid: 28344 + components: + - type: Transform + pos: 1.5,34.5 + parent: 8364 + - uid: 28345 + components: + - type: Transform + pos: 1.5,33.5 + parent: 8364 + - uid: 28346 + components: + - type: Transform + pos: 1.5,32.5 + parent: 8364 + - uid: 28347 + components: + - type: Transform + pos: 1.5,38.5 + parent: 8364 + - uid: 28348 + components: + - type: Transform + pos: 1.5,39.5 + parent: 8364 + - uid: 28349 + components: + - type: Transform + pos: 1.5,40.5 + parent: 8364 + - uid: 28350 + components: + - type: Transform + pos: 1.5,41.5 + parent: 8364 + - uid: 28351 + components: + - type: Transform + pos: 0.5,41.5 + parent: 8364 + - uid: 28352 + components: + - type: Transform + pos: -0.5,41.5 + parent: 8364 + - uid: 28353 + components: + - type: Transform + pos: -1.5,41.5 + parent: 8364 + - uid: 28354 + components: + - type: Transform + pos: 2.5,41.5 + parent: 8364 + - uid: 28355 + components: + - type: Transform + pos: 3.5,41.5 + parent: 8364 - proto: CableApcStack entities: - uid: 1195 @@ -51459,6 +51492,11 @@ entities: - type: Transform pos: 43.5,-3.5 parent: 8364 + - uid: 4163 + components: + - type: Transform + pos: 0.5,31.5 + parent: 8364 - uid: 4277 components: - type: Transform @@ -52732,7 +52770,7 @@ entities: - uid: 8592 components: - type: Transform - pos: 3.5,34.5 + pos: -0.5,31.5 parent: 8364 - uid: 8597 components: @@ -52844,6 +52882,11 @@ entities: - type: Transform pos: -4.5,28.5 parent: 8364 + - uid: 8680 + components: + - type: Transform + pos: 3.5,29.5 + parent: 8364 - uid: 8750 components: - type: Transform @@ -53174,21 +53217,76 @@ entities: - type: Transform pos: -19.5,23.5 parent: 8364 + - uid: 9167 + components: + - type: Transform + pos: 14.5,42.5 + parent: 8364 + - uid: 9190 + components: + - type: Transform + pos: 14.5,41.5 + parent: 8364 + - uid: 9192 + components: + - type: Transform + pos: 14.5,40.5 + parent: 8364 + - uid: 9197 + components: + - type: Transform + pos: 11.5,40.5 + parent: 8364 + - uid: 9216 + components: + - type: Transform + pos: 12.5,37.5 + parent: 8364 - uid: 9218 components: - type: Transform pos: 7.5,42.5 parent: 8364 + - uid: 9222 + components: + - type: Transform + pos: 11.5,37.5 + parent: 8364 + - uid: 9223 + components: + - type: Transform + pos: 11.5,38.5 + parent: 8364 - uid: 9224 components: - type: Transform pos: 1.5,37.5 parent: 8364 + - uid: 9229 + components: + - type: Transform + pos: 12.5,36.5 + parent: 8364 + - uid: 9233 + components: + - type: Transform + pos: 15.5,37.5 + parent: 8364 + - uid: 9239 + components: + - type: Transform + pos: 13.5,42.5 + parent: 8364 - uid: 9249 components: - type: Transform pos: 2.5,42.5 parent: 8364 + - uid: 9257 + components: + - type: Transform + pos: 16.5,36.5 + parent: 8364 - uid: 9264 components: - type: Transform @@ -53204,16 +53302,56 @@ entities: - type: Transform pos: 1.5,33.5 parent: 8364 + - uid: 9268 + components: + - type: Transform + pos: 16.5,37.5 + parent: 8364 + - uid: 9288 + components: + - type: Transform + pos: 0.5,29.5 + parent: 8364 - uid: 9289 components: - type: Transform - pos: 3.5,33.5 + pos: 1.5,29.5 + parent: 8364 + - uid: 9304 + components: + - type: Transform + pos: -1.5,29.5 + parent: 8364 + - uid: 9305 + components: + - type: Transform + pos: -2.5,29.5 + parent: 8364 + - uid: 9336 + components: + - type: Transform + pos: -3.5,32.5 + parent: 8364 + - uid: 9344 + components: + - type: Transform + pos: -3.5,33.5 parent: 8364 - uid: 9346 components: - type: Transform pos: 2.5,40.5 parent: 8364 + - uid: 9369 + components: + - type: Transform + pos: 1.5,31.5 + parent: 8364 + - uid: 9373 + components: + - type: Transform + pos: -1.5,31.5 + parent: 8364 - uid: 9381 components: - type: Transform @@ -53454,6 +53592,11 @@ entities: - type: Transform pos: 9.5,36.5 parent: 8364 + - uid: 10068 + components: + - type: Transform + pos: 0.5,37.5 + parent: 8364 - uid: 10193 components: - type: Transform @@ -60849,6 +60992,36 @@ entities: - type: Transform pos: 47.5,-28.5 parent: 8364 + - uid: 28330 + components: + - type: Transform + pos: 15.5,42.5 + parent: 8364 + - uid: 28337 + components: + - type: Transform + pos: -0.5,37.5 + parent: 8364 + - uid: 28338 + components: + - type: Transform + pos: -1.5,37.5 + parent: 8364 + - uid: 28339 + components: + - type: Transform + pos: -2.5,37.5 + parent: 8364 + - uid: 28340 + components: + - type: Transform + pos: -2.5,36.5 + parent: 8364 + - uid: 28341 + components: + - type: Transform + pos: -3.5,36.5 + parent: 8364 - proto: CableMVStack entities: - uid: 1697 @@ -67965,6 +68138,12 @@ entities: rot: 1.5707963267948966 rad pos: 4.5,37.5 parent: 8364 + - uid: 9537 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.49284565,32.59999 + parent: 8364 - uid: 9646 components: - type: Transform @@ -72420,25 +72599,25 @@ entities: parent: 8364 - proto: ClothingHeadHelmetRiot entities: - - uid: 9190 + - uid: 7768 components: - type: Transform - pos: 2.7655263,39.62697 + pos: -0.23404753,39.35919 parent: 8364 - - uid: 9193 + - uid: 10026 components: - type: Transform - pos: 2.7655263,39.512383 + pos: -0.24099195,39.553642 parent: 8364 - - uid: 9197 + - uid: 10070 components: - type: Transform - pos: 2.7655263,39.366547 + pos: -0.24099195,39.66475 parent: 8364 - - uid: 10062 + - uid: 10076 components: - type: Transform - pos: 2.7551093,39.762383 + pos: -0.24099195,39.463364 parent: 8364 - proto: ClothingHeadsetEngineering entities: @@ -72618,7 +72797,12 @@ entities: - uid: 7694 components: - type: Transform - pos: 25.591892,35.701836 + pos: 24.58121,37.6 + parent: 8364 + - uid: 10065 + components: + - type: Transform + pos: 24.471834,37.44375 parent: 8364 - proto: ClothingNeckMantleRD entities: @@ -72727,37 +72911,47 @@ entities: parent: 8364 - proto: ClothingOuterArmorReflective entities: - - uid: 9483 + - uid: 10025 components: - type: Transform - pos: 1.6821928,39.418633 + pos: 1.7055252,39.60392 parent: 8364 - uid: 28240 components: - type: Transform - pos: 1.6926093,39.574883 + pos: 1.703789,39.675285 + parent: 8364 + - uid: 28327 + components: + - type: Transform + pos: 1.7055252,39.534477 + parent: 8364 + - uid: 28328 + components: + - type: Transform + pos: 1.7055252,39.458084 parent: 8364 - proto: ClothingOuterArmorRiot entities: - - uid: 9166 + - uid: 8547 components: - type: Transform - pos: 2.3384428,39.68947 + pos: -0.658415,39.35225 parent: 8364 - - uid: 9167 + - uid: 8572 components: - type: Transform - pos: 2.3384428,39.554047 + pos: -0.658415,39.442528 parent: 8364 - - uid: 9216 + - uid: 8589 components: - type: Transform - pos: 2.3488593,39.481133 + pos: -0.66535944,39.51197 parent: 8364 - - uid: 9223 + - uid: 26255 components: - type: Transform - pos: 2.3384428,39.366547 + pos: -0.658415,39.595306 parent: 8364 - proto: ClothingOuterCardborg entities: @@ -72816,6 +73010,36 @@ entities: - type: Transform pos: 66.509186,-76.72045 parent: 8364 +- proto: ClothingOuterHardsuitSecurity + entities: + - uid: 10031 + components: + - type: Transform + parent: 10030 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 10073 + components: + - type: Transform + parent: 8783 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 10075 + components: + - type: Transform + parent: 8825 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 11999 + components: + - type: Transform + parent: 11611 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: ClothingOuterHoodieGrey entities: - uid: 21633 @@ -74049,6 +74273,17 @@ entities: rot: -1.5707963267948966 rad pos: -9.5,-26.5 parent: 8364 + - uid: 10020 + components: + - type: Transform + pos: -0.5,33.5 + parent: 8364 + - uid: 10077 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,34.5 + parent: 8364 - uid: 19297 components: - type: Transform @@ -74071,16 +74306,16 @@ entities: - type: Transform pos: -7.5,17.5 parent: 8364 + - uid: 9166 + components: + - type: Transform + pos: -1.5,33.5 + parent: 8364 - uid: 9205 components: - type: Transform pos: 14.5,41.5 parent: 8364 - - uid: 9222 - components: - - type: Transform - pos: -0.5,33.5 - parent: 8364 - proto: ComputerTechnologyDiskTerminal entities: - uid: 8464 @@ -74533,8 +74768,11 @@ entities: - uid: 8629 components: - type: Transform + anchored: True pos: 3.5,33.5 parent: 8364 + - type: Physics + bodyType: Static - proto: CrateEmergencyRadiation entities: - uid: 19055 @@ -75212,8 +75450,11 @@ entities: - uid: 7339 components: - type: Transform + anchored: True pos: -2.5,37.5 parent: 8364 + - type: Physics + bodyType: Static - proto: CrateServiceJanitorialSupplies entities: - uid: 27563 @@ -84790,10 +85031,10 @@ entities: parent: 8364 - proto: DresserWardenFilled entities: - - uid: 9257 + - uid: 28329 components: - type: Transform - pos: -1.5,33.5 + pos: -2.5,33.5 parent: 8364 - proto: DrinkBeerBottleFull entities: @@ -86126,11 +86367,6 @@ entities: - type: Transform pos: -3.5,15.5 parent: 8364 - - uid: 11609 - components: - - type: Transform - pos: 16.5,30.5 - parent: 8364 - uid: 11642 components: - type: Transform @@ -88194,7 +88430,7 @@ entities: pos: 18.5,-13.5 parent: 8364 - type: Door - secondsUntilStateChange: -3852.347 + secondsUntilStateChange: -5035.644 state: Closing - uid: 13388 components: @@ -88202,7 +88438,7 @@ entities: pos: 18.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -3888.047 + secondsUntilStateChange: -5071.344 state: Closing - uid: 13389 components: @@ -88370,7 +88606,7 @@ entities: pos: -34.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -90809.88 + secondsUntilStateChange: -91993.18 state: Closing - uid: 15010 components: @@ -126802,28 +127038,76 @@ entities: entities: - uid: 9207 components: + - type: MetaData + name: disabler safe (5) - type: Transform anchored: True pos: 1.5,37.5 parent: 8364 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.1465 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - type: Physics bodyType: Static + - type: Label + currentLabel: 5 + - type: NameModifier + baseName: disabler safe - proto: GunSafePistolMk58 entities: - uid: 7751 components: + - type: MetaData + name: mk58 safe (4) - type: Transform anchored: True pos: 2.5,37.5 parent: 8364 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14572 + moles: + - 1.606311 + - 6.042789 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - type: Physics bodyType: Static + - type: Label + currentLabel: 4 + - type: NameModifier + baseName: mk58 safe - proto: GunSafeRifleLecter entities: - - uid: 9373 + - uid: 10023 components: - type: MetaData - desc: A standard-issue Nanotrasen storage unit, containing 3 Lecter combat rifles. + name: lecter safe (3) - type: Transform anchored: True pos: -0.5,37.5 @@ -126834,7 +127118,7 @@ entities: air: volume: 200 immutable: False - temperature: 293.14673 + temperature: 293.1465 moles: - 1.7459903 - 6.568249 @@ -126854,19 +127138,23 @@ entities: showEnts: False occludes: True ents: - - 9376 - 9375 - 9374 + - 9376 paper_label: !type:ContainerSlot showEnts: False occludes: True ent: null + - type: Label + currentLabel: 3 + - type: NameModifier + baseName: lecter safe - proto: GunSafeSubMachineGunDrozd entities: - - uid: 9369 + - uid: 10024 components: - type: MetaData - desc: A standard-issue Nanotrasen storage unit, containing 3 Drozd submachine guns. + name: drozd safe (3) - type: Transform anchored: True pos: 0.5,37.5 @@ -126877,7 +127165,7 @@ entities: air: volume: 200 immutable: False - temperature: 293.14673 + temperature: 293.1465 moles: - 1.7459903 - 6.568249 @@ -126897,13 +127185,17 @@ entities: showEnts: False occludes: True ents: - - 9370 - 9371 - 9372 + - 9370 paper_label: !type:ContainerSlot showEnts: False occludes: True ent: null + - type: Label + currentLabel: 3 + - type: NameModifier + baseName: drozd safe - proto: GyroscopeUnanchored entities: - uid: 25012 @@ -128084,16 +128376,45 @@ entities: parent: 8364 - proto: JetpackSecurityFilled entities: - - uid: 8572 - components: - - type: Transform - pos: -0.68612957,39.73207 - parent: 8364 - uid: 9182 components: - type: Transform - pos: -0.38925457,39.51332 - parent: 8364 + parent: 8783 + - type: GasTank + toggleActionEntity: 10072 + - type: Jetpack + toggleActionEntity: 10071 + - type: Physics + canCollide: False + - type: ActionsContainer + - type: ContainerContainer + containers: + actions: !type:Container + ents: + - 10071 + - 10072 + - type: InsideEntityStorage + - uid: 10032 + components: + - type: Transform + parent: 10030 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 10074 + components: + - type: Transform + parent: 8825 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 11965 + components: + - type: Transform + parent: 11611 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: Jukebox entities: - uid: 28320 @@ -128592,6 +128913,12 @@ entities: linkedPorts: 6419: - Pressed: Open + 25744: + - Pressed: Open + - Pressed: AutoClose + 25747: + - Pressed: Open + - Pressed: AutoClose - uid: 25554 components: - type: MetaData @@ -128604,6 +128931,10 @@ entities: linkedPorts: 6419: - Pressed: Close + 25744: + - Pressed: Close + 25747: + - Pressed: Close - proto: LockableButtonChiefMedicalOfficer entities: - uid: 3809 @@ -129826,8 +130157,11 @@ entities: - uid: 9234 components: - type: Transform + anchored: True pos: -2.5,30.5 parent: 8364 + - type: Physics + bodyType: Static - type: EntityStorage air: volume: 200 @@ -130179,19 +130513,26 @@ entities: - type: Transform pos: -43.5,-12.5 parent: 8364 +- proto: MagazineBoxMagnumPractice + entities: + - uid: 10062 + components: + - type: Transform + pos: 25.61246,35.490623 + parent: 8364 - proto: MagazinePistolSubMachineGun entities: - uid: 9371 components: - type: Transform - parent: 9369 + parent: 10024 - type: Physics canCollide: False - type: InsideEntityStorage - uid: 9372 components: - type: Transform - parent: 9369 + parent: 10024 - type: Physics canCollide: False - type: InsideEntityStorage @@ -130216,14 +130557,14 @@ entities: - uid: 9374 components: - type: Transform - parent: 9373 + parent: 10023 - type: Physics canCollide: False - type: InsideEntityStorage - uid: 9376 components: - type: Transform - parent: 9373 + parent: 10023 - type: Physics canCollide: False - type: InsideEntityStorage @@ -132801,11 +133142,25 @@ entities: rot: -1.5707963267948966 rad pos: 5.5,37.5 parent: 8364 + - type: DeviceLinkSink + invokeCounter: 2 + - type: DeviceLinkSource + linkedPorts: + 11608: + - DoorStatus: Close +- proto: PlasmaWindoorSecureSecurityLocked + entities: + - uid: 11608 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,37.5 + parent: 8364 - type: DeviceLinkSink invokeCounter: 1 - type: DeviceLinkSource linkedPorts: - 26255: + 9517: - DoorStatus: Close - proto: PlasticFlapsAirtightClear entities: @@ -132922,17 +133277,7 @@ entities: enabled: False - type: Physics bodyType: Dynamic - - uid: 9518 - components: - - type: Transform - anchored: False - pos: -2.5,36.5 - parent: 8364 - - type: TriggerOnProximity - enabled: False - - type: Physics - bodyType: Dynamic - - uid: 9566 + - uid: 10028 components: - type: Transform anchored: False @@ -138400,11 +138745,6 @@ entities: - type: Transform pos: 1.5,39.5 parent: 8364 - - uid: 9192 - components: - - type: Transform - pos: 2.5,39.5 - parent: 8364 - uid: 9231 components: - type: Transform @@ -138415,6 +138755,11 @@ entities: - type: Transform pos: 27.5,21.5 parent: 8364 + - uid: 9483 + components: + - type: Transform + pos: 2.5,39.5 + parent: 8364 - uid: 9637 components: - type: Transform @@ -138455,11 +138800,6 @@ entities: - type: Transform pos: 66.5,6.5 parent: 8364 - - uid: 11608 - components: - - type: Transform - pos: -1.5,35.5 - parent: 8364 - uid: 11680 components: - type: Transform @@ -145785,7 +146125,7 @@ entities: - uid: 9316 components: - type: Transform - pos: -2.430175,38.67102 + pos: -2.4926982,39.33291 parent: 8364 - uid: 11753 components: @@ -145895,28 +146235,6 @@ entities: - type: Transform pos: -23.2492,-71.39133 parent: 8364 -- proto: ShellShotgunPractice - entities: - - uid: 8770 - components: - - type: Transform - pos: 25.354076,35.417572 - parent: 8364 - - uid: 9164 - components: - - type: Transform - pos: 25.463451,35.401947 - parent: 8364 - - uid: 9537 - components: - - type: Transform - pos: 25.713451,35.401947 - parent: 8364 - - uid: 9538 - components: - - type: Transform - pos: 25.572826,35.401947 - parent: 8364 - proto: Shovel entities: - uid: 15416 @@ -147215,10 +147533,11 @@ entities: parent: 8364 - proto: SignArmory entities: - - uid: 4990 + - uid: 9306 components: - type: Transform - pos: 4.5,34.5 + rot: 1.5707963267948966 rad + pos: 3.5,34.5 parent: 8364 - proto: SignAtmos entities: @@ -150779,6 +151098,11 @@ entities: - type: Transform pos: 9.5,36.5 parent: 8364 + - uid: 9389 + components: + - type: Transform + pos: 6.5,36.5 + parent: 8364 - uid: 20856 components: - type: Transform @@ -150921,6 +151245,18 @@ entities: - type: Transform pos: -31.5,-43.5 parent: 8364 +- proto: SpeedLoaderMagnumPractice + entities: + - uid: 28335 + components: + - type: Transform + pos: 25.346834,35.803123 + parent: 8364 + - uid: 28336 + components: + - type: Transform + pos: 25.284334,35.553123 + parent: 8364 - proto: SprayBottleSpaceCleaner entities: - uid: 1153 @@ -151794,43 +152130,18 @@ entities: parent: 8364 - proto: SuitStorageSec entities: - - uid: 4163 - components: - - type: Transform - pos: 0.5,35.5 - parent: 8364 - - uid: 4213 - components: - - type: Transform - pos: -0.5,35.5 - parent: 8364 - uid: 8783 components: + - type: MetaData + name: suit storage unit (Double) - type: Transform pos: 3.5,35.5 parent: 8364 - - uid: 8825 - components: - - type: Transform - pos: 4.5,35.5 - parent: 8364 - - uid: 16531 - components: - - type: Transform - pos: -8.5,3.5 - parent: 8364 -- proto: SuitStorageWarden - entities: - - uid: 11999 - components: - - type: Transform - pos: -2.5,33.5 - parent: 8364 - type: EntityStorage air: volume: 200 immutable: False - temperature: 293.14673 + temperature: 293.1465 moles: - 1.7459903 - 6.568249 @@ -151844,6 +152155,165 @@ entities: - 0 - 0 - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 10073 + - 9182 + - type: Label + currentLabel: Double + - type: NameModifier + baseName: suit storage unit + - uid: 8825 + components: + - type: MetaData + name: suit storage unit (Double) + - type: Transform + pos: 4.5,35.5 + parent: 8364 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.1465 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 10075 + - 10074 + - type: Label + currentLabel: Double + - type: NameModifier + baseName: suit storage unit + - uid: 10030 + components: + - type: MetaData + name: suit storage unit (Double) + - type: Transform + pos: -1.5,35.5 + parent: 8364 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.1462 + moles: + - 1.606311 + - 6.042789 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 10031 + - 10032 + - type: Label + currentLabel: Double + - type: NameModifier + baseName: suit storage unit + - uid: 11611 + components: + - type: MetaData + name: suit storage unit (Double) + - type: Transform + pos: -0.5,35.5 + parent: 8364 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14594 + moles: + - 1.606311 + - 6.042789 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 11965 + - 11999 + - type: Label + currentLabel: Double + - type: NameModifier + baseName: suit storage unit + - uid: 16531 + components: + - type: Transform + pos: -8.5,3.5 + parent: 8364 +- proto: SuitStorageWarden + entities: + - uid: 10069 + components: + - type: MetaData + name: suit storage unit (Warden) + - type: Transform + pos: 0.5,35.5 + parent: 8364 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14563 + moles: + - 1.4778061 + - 5.559366 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: Label + currentLabel: Warden + - type: NameModifier + baseName: suit storage unit - proto: SurveillanceCameraCommand entities: - uid: 296 @@ -154519,6 +154989,11 @@ entities: - type: Transform pos: 25.5,32.5 parent: 8364 + - uid: 9589 + components: + - type: Transform + pos: 21.5,36.5 + parent: 8364 - uid: 10561 components: - type: Transform @@ -154554,11 +155029,6 @@ entities: - type: Transform pos: 13.5,30.5 parent: 8364 - - uid: 11611 - components: - - type: Transform - pos: 12.5,34.5 - parent: 8364 - uid: 11612 components: - type: Transform @@ -156257,7 +156727,17 @@ entities: - type: Transform pos: -4.5,40.5 parent: 8364 - - uid: 9239 + - uid: 9566 + components: + - type: Transform + pos: 24.5,37.5 + parent: 8364 + - uid: 9998 + components: + - type: Transform + pos: 23.5,37.5 + parent: 8364 + - uid: 10078 components: - type: Transform pos: 5.5,37.5 @@ -156272,6 +156752,11 @@ entities: - type: Transform pos: 47.5,-10.5 parent: 8364 + - uid: 11609 + components: + - type: Transform + pos: 22.5,37.5 + parent: 8364 - uid: 11640 components: - type: Transform @@ -158575,12 +159060,12 @@ entities: parent: 8364 - proto: VendingMachineSec entities: - - uid: 8777 + - uid: 10079 components: - type: Transform pos: 6.5,40.5 parent: 8364 - - uid: 9074 + - uid: 10080 components: - type: Transform pos: 6.5,38.5 @@ -177625,11 +178110,6 @@ entities: - type: Transform pos: 7.5,35.5 parent: 8364 - - uid: 9344 - components: - - type: Transform - pos: 6.5,35.5 - parent: 8364 - uid: 9407 components: - type: Transform @@ -177705,6 +178185,11 @@ entities: parent: 8364 - proto: WeaponLaserCarbinePractice entities: + - uid: 4645 + components: + - type: Transform + pos: 21.481674,35.209373 + parent: 8364 - uid: 8772 components: - type: Transform @@ -177715,7 +178200,7 @@ entities: - uid: 9375 components: - type: Transform - parent: 9373 + parent: 10023 - type: Physics canCollide: False - type: InsideEntityStorage @@ -177746,7 +178231,7 @@ entities: - uid: 9370 components: - type: Transform - parent: 9369 + parent: 10024 - type: Physics canCollide: False - type: InsideEntityStorage @@ -178362,20 +178847,6 @@ entities: rot: 3.141592653589793 rad pos: 32.5,-19.5 parent: 8364 -- proto: WindoorSecurePlasma - entities: - - uid: 26255 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 5.5,37.5 - parent: 8364 - - type: DeviceLinkSink - invokeCounter: 1 - - type: DeviceLinkSource - linkedPorts: - 9517: - - DoorStatus: Close - proto: WindoorSecureScienceLocked entities: - uid: 2317 diff --git a/Resources/Prototypes/Maps/box.yml b/Resources/Prototypes/Maps/box.yml index 891cab2c84..d98c10a5f6 100644 --- a/Resources/Prototypes/Maps/box.yml +++ b/Resources/Prototypes/Maps/box.yml @@ -16,7 +16,7 @@ emergencyShuttlePath: /Maps/Shuttles/emergency_box.yml - type: StationJobs availableJobs: # 63 jobs total w/o latejoins & interns, 81 jobs total w/ latejoins & interns - #command (7) + #Command (7) Captain: [ 1, 1 ] HeadOfPersonnel: [ 1, 1 ] HeadOfSecurity: [ 1, 1 ] @@ -24,7 +24,7 @@ ChiefEngineer: [ 1, 1 ] ResearchDirector: [ 1, 1 ] Quartermaster: [ 1, 1 ] - #service (14) + #Service (14) Bartender: [ 2, 2 ] Botanist: [ 3, 3 ] Chef: [ 2, 2 ] @@ -33,33 +33,33 @@ Librarian: [ 1, 1 ] Reporter: [ 1, 1 ] ServiceWorker: [ 2, 2 ] - #engineering (8) + #Engineering (8) AtmosphericTechnician: [ 3, 3 ] StationEngineer: [ 5, 5 ] TechnicalAssistant: [ 4, 4 ] #intern, exclude from dept count - #medical (8) + #Medical (8) Chemist: [ 2, 2 ] MedicalDoctor: [ 4, 4 ] Paramedic: [ 1, 1 ] MedicalIntern: [ 4, 4 ] #intern, exclude from dept count Psychologist: [ 1, 1 ] - #science (5) + #Science (5) Scientist: [ 5, 5 ] ResearchAssistant: [ 4, 4 ] #intern, exclude from dept count - #security (9 - 11) + #Security (9 - 11) Warden: [ 1, 1 ] SecurityOfficer: [ 5, 7 ] Detective: [ 1, 1 ] SecurityCadet: [ 2, 4 ] #intern, exclude from dept count Lawyer: [ 2, 2 ] - #supply (6) + #Supply (6) SalvageSpecialist: [ 3, 3 ] CargoTechnician: [ 3, 3 ] - #civilian (3+) + #Civilian (3+) Passenger: [ -1, -1 ] #infinite, not counted Clown: [ 1, 1 ] Mime: [ 1, 1 ] Musician: [ 1, 1 ] - #silicon (3) + #Silicon (3) StationAi: [ 1, 1 ] - Borg: [ 2, 2 ] + Borg: [ 2, 3 ] From aec0edfd64979aeb62ff51f3a1acd56709f2bb2b Mon Sep 17 00:00:00 2001 From: Nox38 Date: Wed, 16 Apr 2025 12:50:27 -0700 Subject: [PATCH 190/622] Miscounted by one --- Resources/Prototypes/Maps/box.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Maps/box.yml b/Resources/Prototypes/Maps/box.yml index d98c10a5f6..a63d48fef7 100644 --- a/Resources/Prototypes/Maps/box.yml +++ b/Resources/Prototypes/Maps/box.yml @@ -15,7 +15,7 @@ - type: StationEmergencyShuttle emergencyShuttlePath: /Maps/Shuttles/emergency_box.yml - type: StationJobs - availableJobs: # 63 jobs total w/o latejoins & interns, 81 jobs total w/ latejoins & interns + availableJobs: # 63 jobs total w/o latejoins & interns, 82 jobs total w/ latejoins & interns #Command (7) Captain: [ 1, 1 ] HeadOfPersonnel: [ 1, 1 ] From 0d70d6bfdfb74702f8df325afabd65f95b65b6b3 Mon Sep 17 00:00:00 2001 From: Linkbro <104574466+Linkbro1@users.noreply.github.com> Date: Wed, 16 Apr 2025 21:26:25 +0100 Subject: [PATCH 191/622] New Sprites for cables (#34955) * initial textures * Makes it have layers because Milon wanted it * Makes it have layers because Milon wanted it * in do NOT understand github * tested, works * Update Content.Client/Power/Visualizers/CableVisualizerComponent.cs Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> * Update Content.Client/Power/Visualizers/CableVisualizerComponent.cs Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> * remove extra newline * EmoGarbage Review - Adjust MV cables to use orange stripes --------- Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Milon Co-authored-by: EmoGarbage404 --- .../Visualizers/CableVisualizerComponent.cs | 5 +- .../Visualizers/CableVisualizerSystem.cs | 2 + .../Entities/Structures/Power/cables.yml | 8 ++- .../Tools/cable-coils.rsi/coilhv-10.png | Bin 201 -> 394 bytes .../Tools/cable-coils.rsi/coilhv-20.png | Bin 270 -> 489 bytes .../Tools/cable-coils.rsi/coilhv-30.png | Bin 373 -> 723 bytes .../Tools/cable-coils.rsi/coilmv-10.png | Bin 201 -> 273 bytes .../Tools/cable-coils.rsi/coilmv-20.png | Bin 270 -> 364 bytes .../Tools/cable-coils.rsi/coilmv-30.png | Bin 356 -> 524 bytes .../cable-coils.rsi/coilmv-equipped-BELT.png | Bin 171 -> 182 bytes .../cable-coils.rsi/coilmv-inhand-left.png | Bin 279 -> 258 bytes .../cable-coils.rsi/coilmv-inhand-right.png | Bin 280 -> 270 bytes .../Power/Cables/hv_cable.rsi/hvcable_4.png | Bin 301 -> 258 bytes .../Power/Cables/mv_cable.rsi/meta.json | 64 ++++++++++++++++++ .../Power/Cables/mv_cable.rsi/mvcable_0.png | Bin 156 -> 154 bytes .../Power/Cables/mv_cable.rsi/mvcable_1.png | Bin 186 -> 154 bytes .../Power/Cables/mv_cable.rsi/mvcable_10.png | Bin 222 -> 184 bytes .../Power/Cables/mv_cable.rsi/mvcable_11.png | Bin 243 -> 223 bytes .../Power/Cables/mv_cable.rsi/mvcable_12.png | Bin 95 -> 115 bytes .../Power/Cables/mv_cable.rsi/mvcable_13.png | Bin 240 -> 207 bytes .../Power/Cables/mv_cable.rsi/mvcable_14.png | Bin 238 -> 207 bytes .../Power/Cables/mv_cable.rsi/mvcable_15.png | Bin 261 -> 263 bytes .../Power/Cables/mv_cable.rsi/mvcable_2.png | Bin 192 -> 160 bytes .../Power/Cables/mv_cable.rsi/mvcable_3.png | Bin 114 -> 127 bytes .../Power/Cables/mv_cable.rsi/mvcable_4.png | Bin 175 -> 138 bytes .../Power/Cables/mv_cable.rsi/mvcable_5.png | Bin 222 -> 178 bytes .../Power/Cables/mv_cable.rsi/mvcable_6.png | Bin 208 -> 176 bytes .../Power/Cables/mv_cable.rsi/mvcable_7.png | Bin 245 -> 220 bytes .../Power/Cables/mv_cable.rsi/mvcable_8.png | Bin 181 -> 143 bytes .../Power/Cables/mv_cable.rsi/mvcable_9.png | Bin 210 -> 175 bytes .../Power/Cables/mv_cable.rsi/mvstripes_0.png | Bin 0 -> 96 bytes .../Power/Cables/mv_cable.rsi/mvstripes_1.png | Bin 0 -> 137 bytes .../Cables/mv_cable.rsi/mvstripes_10.png | Bin 0 -> 180 bytes .../Cables/mv_cable.rsi/mvstripes_11.png | Bin 0 -> 205 bytes .../Cables/mv_cable.rsi/mvstripes_12.png | Bin 0 -> 125 bytes .../Cables/mv_cable.rsi/mvstripes_13.png | Bin 0 -> 192 bytes .../Cables/mv_cable.rsi/mvstripes_14.png | Bin 0 -> 207 bytes .../Cables/mv_cable.rsi/mvstripes_15.png | Bin 0 -> 246 bytes .../Power/Cables/mv_cable.rsi/mvstripes_2.png | Bin 0 -> 136 bytes .../Power/Cables/mv_cable.rsi/mvstripes_3.png | Bin 0 -> 154 bytes .../Power/Cables/mv_cable.rsi/mvstripes_4.png | Bin 0 -> 129 bytes .../Power/Cables/mv_cable.rsi/mvstripes_5.png | Bin 0 -> 171 bytes .../Power/Cables/mv_cable.rsi/mvstripes_6.png | Bin 0 -> 182 bytes .../Power/Cables/mv_cable.rsi/mvstripes_7.png | Bin 0 -> 208 bytes .../Power/Cables/mv_cable.rsi/mvstripes_8.png | Bin 0 -> 130 bytes .../Power/Cables/mv_cable.rsi/mvstripes_9.png | Bin 0 -> 160 bytes 46 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_0.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_1.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_10.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_11.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_12.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_13.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_14.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_15.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_2.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_3.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_4.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_5.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_6.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_7.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_8.png create mode 100644 Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_9.png diff --git a/Content.Client/Power/Visualizers/CableVisualizerComponent.cs b/Content.Client/Power/Visualizers/CableVisualizerComponent.cs index c88d92423b..f6379260cf 100644 --- a/Content.Client/Power/Visualizers/CableVisualizerComponent.cs +++ b/Content.Client/Power/Visualizers/CableVisualizerComponent.cs @@ -3,6 +3,9 @@ namespace Content.Client.Power.Visualizers; [RegisterComponent] public sealed partial class CableVisualizerComponent : Component { - [DataField("statePrefix")] + [DataField] public string? StatePrefix; + + [DataField] + public string? ExtraLayerPrefix; } diff --git a/Content.Client/Power/Visualizers/CableVisualizerSystem.cs b/Content.Client/Power/Visualizers/CableVisualizerSystem.cs index 60fb0d127a..bea15a0602 100644 --- a/Content.Client/Power/Visualizers/CableVisualizerSystem.cs +++ b/Content.Client/Power/Visualizers/CableVisualizerSystem.cs @@ -31,5 +31,7 @@ public sealed class CableVisualizerSystem : EntitySystem mask = WireVisDirFlags.None; args.Sprite.LayerSetState(0, $"{component.StatePrefix}{(int) mask}"); + if (component.ExtraLayerPrefix != null) + args.Sprite.LayerSetState(1, $"{component.ExtraLayerPrefix}{(int) mask}"); } } diff --git a/Resources/Prototypes/Entities/Structures/Power/cables.yml b/Resources/Prototypes/Entities/Structures/Power/cables.yml index 6cb9e3d138..53e2c4a91f 100644 --- a/Resources/Prototypes/Entities/Structures/Power/cables.yml +++ b/Resources/Prototypes/Entities/Structures/Power/cables.yml @@ -115,11 +115,12 @@ description: A medium voltage power cable. components: - type: Sprite - color: Yellow sprite: Structures/Power/Cables/mv_cable.rsi - state: mvcable_0 + layers: + - state: mvcable_0 + color: Yellow + - state: mvstripes_0 - type: Icon - color: Yellow sprite: Structures/Power/Cables/mv_cable.rsi state: mvcable_4 - type: NodeContainer @@ -151,6 +152,7 @@ acts: [ "Destruction" ] - type: CableVisualizer statePrefix: mvcable_ + extraLayerPrefix: mvstripes_ - type: entity id: CableMVUncuttable diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilhv-10.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilhv-10.png index 707aed405cdc7d9a8530467f1b854c4da2bbc9c3..ffa2ed50b7b0850b7fa650fbbb0f8e16a294f976 100644 GIT binary patch delta 367 zcmV-#0g(R50g3~VB!2;OQb$4nuFf3k0003*Nkl4DvCZKUBk!w-uyLRh+ zmM;hI$M+rY0S1G?Fz)0i!RNcI=k3>%^tZU9%Gz zQ9(Aa^;OQX)&ow~pRg1MINfMqWx9sFh08y$Vx$KCLuVJr2K;)G9&XOT^V?8W=K=s= zf)dOZC)4F(0ciI!hN_<5>1lrP*crGc=?a>qZCqEY-AC9JQ4(;)6?yUuQljHHDPs&$ zN^s60r9>1(2!cS{0C@-0=A3igzIq01+lFOX2*dD4g%CrVFc=Ku%{OXWeW2Vp3r_$5 N002ovPDHLkV1kuAs<;3E delta 173 zcmV;e08;;o1IYo9B!7@eL_t(og<}{6qhJ(_f)NiG$q9hviJ~a{bB}-h2hrVoK9X!6 z6QwZ#vOLU)o8ifazhvpB$N@0R`}Tce@YCfaD>Nx`0J*-ViUUBtFLL6e$oCXEfEvE1 z$N?Zax{U0943S*wR{wef>AIEM!~=X b1_lNIj>tdn!iWDr00000NkvXXu0mjfHTFh1 diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilhv-20.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilhv-20.png index 00d5df993d58e3fef74e52aa925d6990a37fd23e..68c140b3359277252559a990838ce40219aef2e4 100644 GIT binary patch delta 463 zcmV;=0WkiK0_g*gB!2;OQb$4nuFf3k0004_Nkl8`LdJs7#Z7P#{}5+4M|;8DQWwRt&7Y1 zj`wnR-}`VEFfuYSGWutwbiw`gOy7k{vaaT)2Dy9sz_HTWx_@hX54{=a$4Jz;U{ADS zyN@dXEPs~T>gx;)bq0#Xq6&flfW!AJtHZ}Xn)GfPYI|uCfSt2vA_5OnmF7DQW#>i` zhwL&C1Oc^L4IuGWCURAvJOBYKY{Coi6*)X00<%QeZN`c z8?EbwDtfQboPW@*gy;w`N|ZyvPBx)6;QKy82+HL$t`~Cm^wBoqRct~Xfz9(qoB;FF zLzHA)q1m~92y}htdhG-vy}eF%62P(2sr~Dh-w9;1S)`NzSeAwB9dr@6h)ozZj_=6$ zz@h>u%v66RkoX@c$$D$c;{;Cba{w%i-TZj-@qE_{u}E_xsh-X-F2_ozcFvv^&_mDUn4GBPqU`T`@B)!g2AA1nX>002ovPDHLk FV1g{}+pGWp delta 242 zcmVAIE1{yG8vwwM_D9O&+bou*#83AU7 zCm;SY_~~+DH8*npYYZ_Kd`v0@DSMBYyw^b5ch_0Itp)=>Px%jY&j7R9J=WRY8l>Kp1^#-8J3dQiT$c z79o&h5VL{@4}raj*ozVodhzB>*pvPSp?|@H1=*qqy)7(-9(veImJoUhgbgi9bkVij z?lhHdJh(Gt(stY8(Y(_)UuN>&_vV`!AVrE4|2u?P$qz3I3x5|{-Es8e_EP}B4gVv0 zCli#l+|2(0!1H(CXXdXgB{M+`0H!YCjpYLXUg{D6pl%H#0MJY8bA|kq0INHW%nP!X zI|3nu#m9qlm@y%X99daF!y!>IpGC_Z0RRkD#OH5dF%<%U6Y_Td*QFws5&?ee5Ci}KS(Z_&)i^;51z6p2^gy|awij|$8mfr*E@5%< z8yyFO0H>#?P!t7@>UD%qQLXKnH-!Q zl}d%P>(#9$TJ8wqnt-+!GLmYuKh#kt zC=}p04qEOAhAN`>bHb4q^Vz9NXs(#gqT1}EZVj1RmpPD0CgPI~RYc1jp?IAqG<6A9 zcO30!%F%wN9MP@XDy_rRB^2{n=%sa`+U!G?Wpp|n5JI47+F}8o=Rr{vW}%^qtN|%n z?g*wX!GHIC_`VNQmskVFQPy(8qqRNZwf;r0ZCgm5fTbLu``tU4usPHjLI?;UOejTs z?jmpkl6J+Lt*qsQx;4bk_U05J6=bL)>eg_n8<2uKhH;B*+r|YkSJ}Z)$Oz*Xk)et> zI114_nLsZsZNT&vT!yli6WU(LIy@u7R6Q`~IZk5M^W1Pqv~lMd0N~8t iT}V9dIZlxxMT$R8U}LfuqlJP10000CSuR9P41W}Y6v)s3Q`8Gehwcj-1cJ?x}^G(($6bi+^$AJvs>0uF+ zN%{WM@ZX!yKXZFI^WN8m`^T+YJ&K(G3E!o2kIT#2a%nORGJg_n0OBN^6;+EnKbtsH zFd`En<5=g(2OD@^e>D&xaTzywGPS%uaYjfKYcH?gWWXV)10;?Uc8SY<5aEd!mKgpU z)d56zb#ZLoK7PlxT0k@}YukgYs9aI|Ob;5MnZrHBPtPt$F665?>=QgKf7bX3`79k0=6mk4hsQ$ z+caLl#sgT!J_%Sz?y`*+u<;yLwjy%@!D3U0Vo2pI#3J*mX=c8+zknbJ!oTBjnv79P zO)c5E&Ys)n9XJB(@bnzvmY&e{ycukPIUE2UuMt70Si8v<=x%zzk85tbn*gn0F{$}5@*eq1Bh(Z@^piNG2^uGudD0FGN5j8V%S7|I>)0JUT< vda7N+0p?G5&tL(3g(nHQxCnwE2>b8`Gq6GB9KuU?00000NkvXXu0mjfboFcC delta 173 zcmV;e08;;v0?7f8B!7@eL_t(og<}{6qhJ(_f)NiG$q9hv%SBQ6=g$5552CxfKay-7 z6QwZ#vOFw|o8ifmzhvpB$N@0R`}#gH`1x^?6`B+|fLvcw#Q`AS7ZveQ%7Kn>qh z025MJ?5L>ls z{i;GJ0Y;|2OIQ(>)NkcJz?!^3pe$6yM@7Xh%N4bOh^ZJRBi}Zu0{|Yx1+G)e z>ka6~Z@2U-{%%M#4lPhgax6KO>Rli#mHg!bK$+RE{K@!10{~DZ9>h|K0RW;R1<-A`HXMiQ-RV1p z{b(;tBN#NGg-YVk>U2dL(p8V`NxO)sNR7)mYM@k_3Hban|BgumeIs)d j_hZ)^^9UG*VHoBIVI7jdpG=L!00000NkvXXu0mjf$7-8W delta 242 zcmVAIE1{yG8vw!(=QIegtY18-rGBV5z zPoDf`@blxuYHnoYYYZ_KdfxxBCM6WkH#zJd8VEQ}j&F|s^JFKf&pgdBl44ZuPI>KnK` z$YPkU@dYzdNHTyNfh`RXOoSjq7?6UM0V%kNO(WLU>STL_GTQ7{Td!6+EvfPsMl05XGij>y7yApigX07*qoM6N<$g423si~s-t diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-30.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-30.png index 56b7c91dd58a9f16885715fdf26750c54507f0e0..b4905627b0d46d590138ffd4b24849b2f3cf413c 100644 GIT binary patch delta 499 zcmVPx$#z{m$R9J=WmA#7FKoo^Pg%zk(F$lM= zQn_~^jT^myn|%P4n?A;*5RTJ(OFh6geu05yU|C4|z=A5ZLQIj?ph78T$NGtEdEI0S zeT^7tH0R8@R~i@@85#M{IM=?o`%cvy=LP)Oy?wo#?u~~Baewv&o#_hTE^+}l>=yud zkzx{*6@ZwEvqo-j^=Sh`;*lTXEmd3mb$l1O9QF&6OjdaTvw3aA8qW)$k^IF5bfzmK zV1(mT0@6I(z$Adk4*_%aBE@}Di*DC0>bbNA-j=}cU%HwE^*BytYj<`|To^;!wJDEH z1Rp^4u03d=TYvLDaWHXPqpMBXO2k_#R-5uTk6qmZABM!c%{D~jhsOlsR1&9>)uv=N z7fzq?-UM`}tGs}3A45Q4<3H>dOaggQyg3j0lj`zM0(RF%+{Bp|b*FcmsL7@C&KhW9 z>phzb=RPU%mWu7#J@!S{xHX;pxor2)Q-ZwUwPD(eukAYLpXLI4aq`HEVPqaH6;IN0Ef#fAUy+$8rOVCA3h4c7iB5sO;w@-iA?Y&x*$vYb;%SQzf z5|?pAK(r|C zbq})aW{cWqde8vP9PTN8dUio_E?>p8PZ)9X$Z2+Rh8!+?Bw7yBblYgUY%-5nn(pHy z20H-vyfBhOlS6+(jf)6t)bb#34xnvdXl~#z8Wd7qL^!$6ZP;sI3?#rCPUd`0u23ix ciWGZx^prw85kG}JY5_^D(1Ysw2`;jfyW_`yYptAZdFuCw1ETH zrIgvx54uGB#Fz4la6a05Z_?kV96&7$KfJaXR_p$JZTn5CkLP>Tr+*d4F6B+kwaIO{ zyUp~T`~08Wd^fM1i1V&Hwqr@`#aJBV?!>U}oXkrgXOE|gV@SoEx3@O(HXDevJXD?( ze!?s>V^iWX4&@1Iw<{Qx0{4VWi)m=dY0iE5U&^O=J;TnO>Wo00AaH4B`L@z^bGJSZ zv-FS{CFaFp+0qUo$V6@I7AlV$7mXi0(mC&= zd6J>1r+0^iaggz4V=sj{k0u?N6rvEUX=!h)zR$?CUR`~EOlP;T>gE*^OQv=kuhlR# z7d>M3Bq*%lYcZoV9|OyLnGKfOS7d>fJ9xS{hFJ6_CrGfCF!ec{Inm_aU?}XO<0>S; zD%j`|C9$wVgvV6D!J{FQtEH@k(_q&E&I3n`FS5E^Ji9Djh>_vw0v6WnDGRfJW-)lW M`njxgN?>dP04TOyx&QzG diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-inhand-right.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-inhand-right.png index 6072367e40fdcb43987c162fca4d136ab64824ca..52b73f761fad247494dd2d6ff6697d50a8945cec 100644 GIT binary patch delta 254 zcmbQi)W`#aJBV?!>U}oXkrg=Y*$=V@SoEx3|2xnhiu+AKrG_ zcHwTxqa(7rx^}Txzs%dj$jz6>UZf}@z2U0OtN*=9iWQR{ywG3*Y6XEAE6aD8=-s?^ z=J|~$pReikd2ciOtZBCL-pjv+ogE&mdKI;Vst0O>Y! Aj{pDw delta 265 zcmeBUn!z+dqMnJFfq~&V`%GUT#Tnoe;`$#5Ua{_7%OJ_nWCavtED7=pW^j0RBMrzY zs0xWFaY-#sF3Kz@$;{7VV5pcA99B?N`u$6A!N;#pw7hk-&Yd|Qydl)!qVa=AI_G^f zPcjts^zN`Q4l=%M?4>a0(WE1jLKK2EE$xlf_ZgYitE=yi>FhRE-Mm6#$<%J+wHk)z zqDRc01ceoREoPMFV_=ytv%ymPiY(A_M^6{W5R2aA1PRs>h8`V`ZOUbhOF53tOfV8q zRNzvZcy@84v^(QjM(#XDcMjES4QdK67=%x>Y+j(i63Z~xpPhlhUXJB!lyi~Y1joK4ksY<+@KSOP|B#mCQhMNj{BQQ hv1@DoP0tiQ3KtMtI~MNzX3+ou002ovPDHLkV1j9^F~0x+ delta 169 zcmV;a09OBk0<8j&F%1M~K}|sb0I`n?{9y%=E?<8Ma7bBm000id000id0mpBsWB>pF zW=TXrR5(xVjY|%IAPhwL304uf|7q>Ci3>5XHsLKM&Ge-;ZNd_iKMKYQ+B%0u#s}+# zuz?skK7_==4v08+(Ao_U XTRRaJQWrv500000NkvXXu0mjfKuJFL diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/meta.json b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/meta.json index 76b5eb294a..5c9442cbce 100644 --- a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/meta.json +++ b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/meta.json @@ -70,6 +70,70 @@ { "name": "mvcable_15" + }, + { + "name": "mvstripes_0" + + }, + { + "name": "mvstripes_1" + + }, + { + "name": "mvstripes_2" + + }, + { + "name": "mvstripes_3" + + }, + { + "name": "mvstripes_4" + + }, + { + "name": "mvstripes_5" + + }, + { + "name": "mvstripes_6" + + }, + { + "name": "mvstripes_7" + + }, + { + "name": "mvstripes_8" + + }, + { + "name": "mvstripes_9" + + }, + { + "name": "mvstripes_10" + + }, + { + "name": "mvstripes_11" + + }, + { + "name": "mvstripes_12" + + }, + { + "name": "mvstripes_13" + + }, + { + "name": "mvstripes_14" + + }, + { + "name": "mvstripes_15" + } ] } diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_0.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_0.png index 47f04f63c27e6ba48863c69b55837183d1cd4eb9..3b0665ee1e34074ca39a95a7628b1f7cb2a992d6 100644 GIT binary patch delta 125 zcmV-@0D}LV0h$4jBz6IFQb$4nuFf3k0000~NklG=GF&$bi}G_CzMh;?cEz-X6`MI hF&_V3L_|d77asiQ6HG<`2k8I+002ovPDHLkV1fnhGrj-- diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_1.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_1.png index bd958a82f3cd57790264660ba101bf7550980c9b..fe2f6702cc9c311e0d7f99dcfa3667011eb07247 100644 GIT binary patch delta 112 zcmV-$0FVE=0h$4jF=w-5) zzNtHTrWz4|00bZa0lK1k(Dv{DkBD;ZN&5w+7E(FD_r{qyF}p|7=sE@f0C)kcE*3rl SUpOZK0000_ zs|)!U6gXT1pWQ$7zkEt>g6kcgd%;tl1RtKP6(4f7I7fP?oihWIKm!AdMzep({lYVIwo4hdXGKq7VBlh4@O1TaS?83{1OPonGxz`i diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_10.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_10.png index 690f9cda8fa42a3481a1145b1cf66ef56c8e57a7..7fb6e6c90d7a3cd0f21e9d8f32512671368ecfc2 100644 GIT binary patch delta 143 zcmV;A0C4}_0k{E>F@JJNL_t(oh3%3-3cw%?1WoB@^P%Lq>7|qirJ-Ql%g#*^ovb?s zA%qYx5)m*>CCjb}tMaMV56QBSEC;%6@02t6OO~@mD%PDHLkV1n=QJ9q#9 delta 181 zcmdnNc#m;{VLeN_qpu?a!^VE@KZ&di3=EtF9+AZi419+{nDKc2iWHz=v8Rh;NQC>_ z$&OqH6nI!B@6)vZG=;zN^V%@QsbaTgAM3JKP!pHkZLu+rc h1B*bzfp<(U>g)6MMBUwzLV$)cc)I$ztaD0e0svFiM4$iw diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_11.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_11.png index 0da1d5e1d1c5cd12d9b018a597f1a6c9e49986d8..e4fc7333e21f41b2203c69f802b308f92a58e6ac 100644 GIT binary patch delta 206 zcmV;<05Sjb0p9_T8Gi-<0047(dh`GQ00DDSM?wIu&K&6g005auL_t(oh3%G04uBvK zLp#RH!hztp<3svl@* zKvjo_HlqoQ+0PfQ8Q9_Sw8q|h06>gUm;!4q^o`&HNh=N^+($nUp^BUaFUhb(PD^m9 zU2`I%sm?0hq>L7-Cn0+ebX`WD+y&EM50WXcXSoTOfC(_z0Ql5~a_Ha@^#A|>07*qo IM6N<$f>ps*q5uE@ delta 226 zcmcc5_?dBnWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx|bfKQ0) z|Ns9pGc)JToeLC@Yl;X2sVfQc3kHfaIB2c>0_1ZRctjR6Fz_7)VaDV6D^h@h37#&F zAr}5`FB%Fp7;v}*a(v&v*}JK2=7!d2<)zW8pXWzuOjDC;-x3$_H7?+r`GR-S6Y7`~ zYndF=?ka1YWmsWQsQoN+R;jJHW9gd18=s$aJW^*W`11Dr|Ez+07l_z@m>H}5gxj&$ SN#HxsG6qjqKbLh*2~7Y=*i%#h diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_12.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_12.png index 02edf964cd3dc2f3711880e8f685277a3990c5a3..1276a93708f7e848313d0c603abbba2e7edd301b 100644 GIT binary patch delta 84 zcmazqo}l8-SRCZ;#IWw1%u5Ca23=1V$B>BDw-+1*860?+46E{9$1|ueo`2+kkqU#% n>}`8xKIlF6G}>ML3#eFr*=9ED+j9#8fNTa&S3j3^P6gTe~DWM4f)i@Qd diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_13.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_13.png index a13a602d9bbb2135af4407f15083e6b5bcc4bb02..af31b7b9c905e353467c0de102959cfd9e62a43e 100644 GIT binary patch delta 190 zcmV;v073uo0nY)D8Gi-<0047(dh`GQ00DDSM?wIu&K&6g004hOItUi!F?z*WM!*qj@6z9A3XUCaD>SJYFu sGygu2B}|en_73PXGV_ delta 223 zcmX@l_0_1ZRctjR6Fz_7)VaDV6D^h@hv7RoD zAr}5``yBZWC~&Zd|M)-ORa`rC^0Lkd_vbCU7jt+!BzepcRgiwXBH;GbABr1-bK4Ip zf7!iRkm=a%t}WA;_W12~wdvS7^`2k+=LOGFGCPky*_wY`^n~b%_JlBosioYGkC|1B Qfi^LCy85}Sb4q9e0Ib(j;Q#;t diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_14.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_14.png index 1579a277ebe9a565723a84f6a702ac96ecf4bd22..9e14127ebb385bef277daf679188acf0f63cb16d 100644 GIT binary patch delta 190 zcmV;v073um0nY)D8Gi-<0047(dh`GQ00DDSM?wIu&K&6g004(ksaVth$g?qJ<=gqpzX`aZ8xD7uw7n~t&|`0c|Rdv sy>j&C6EF`LV#m)np8x_7fB^G=3xoZOB04URApigX07*qoM6N<$g0)IaB>(^b delta 221 zcmX@l_>OUcWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstUx|bfKQ0) z|Ns9pGc)JToeLC@Yl;X2sVfQc3kHfaIB2c>0_1ZRctjR6Fz_7)VaDV6D^h@h(Vi}j zAr}5``yII&40u>}pZ)*;&9PXoELOp=Bf-xvw4LGDdX(8(pq}N(W0!ZV4D;fo*SfCS z<5d)O{xPq^^#i^eQ)+I;ZtiS*>*wga`8uR zkn}MmD4KNsZu*$RKy!&4lBY^3;yJg{E$X7b1%RdFk8DGF0_gyd?DR*zhHU~O687ZW z5+z%$Ui-SaUAGD`Mf$vgKtXu6vDQjNM7?)LE_#8s){yO&?qnlVkMUstRS*KhI^xj* zX5NDAQd|P)j}^=e#F~3kd~1O@ud5HR6G#Ve l=@XNmp1=V(00$r)-~lBaKK;SJW?cXP002ovPDHLkV1fWLYl;8> delta 233 zcmVb zawfnoOH2Szf|)tS$lAOfZdQdZD?kOY-*OCxJ8-ywX|%Rmjo}&&^tvS?CL*(Mf{Og> zBKU!sITMkDtA)6hRLeo%*>j1MupKev)&I>B7Q>NBm1v^fnY5p jr@&gvmw+W;39!Z;A3wq%yGh4x00000NkvXXu0mjfJnd}N diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_2.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_2.png index ee8e0b5dc68b759d674c723b7938ec2a199004f1..8423573dd190c6aa7b9dd1298b26e2a2e62a1533 100644 GIT binary patch delta 118 zcmX@WxPWnjVSbdSi(^Pc>)VNjLJbBSEY15{*$)_ zi;i3e6nI!KUbwBseyUXTq4=&fQUZzhj_oK4VP=R~-ns3z+}iy${AJ%Kb*yX%cge6y zxU=Wgx5Hn!QBDx92wUGAQscAMD88`=4RqLN~5Od*0{9 qUR_|P`tszvYrjfafNGJzhg)prYFvf?g0gRcL_J;oT-G@yGywp+iy`~~ delta 83 zcmb;~nxNum>FMGaQZeW4IYV9s10LpsD{>CYH*_y>Uexz}_uAD`(^T%xefjR{&r%i! b6tLkf(_0<3(zKSGB_MH6S3j3^P6junD3svDMl7^%w?*IS*_+kQHVHV}D7H)9>0000M1MG8>R#nZ(xB*Oje z`Hfr*3LLJ1uk*kD|L#=jy!e8^L0g4SZC7|0KFn3^y1uOH^v)Z1Ur&g3{v7qm@mt4= kKQ8}lyagE;9+am^PgjqgbLRd`4WM}pp00i_>zopr0J<42|@*^plWSLcT` rv(OwY;2ts?0}mL*5D^g((Z~)A1vJ^s$u&6u0000 delta 181 zcmdnQc#m;{VLeN_qpu?a!^VE@KZ&di3=EtF9+AZi419+{nDKc2iWHz=v8Rh;NQC>_ ztKM7(6nI!J+%SF`6sKW*K5MJW1GkLi1KZBr{t?OBBVV=3%<}oF)2Z!!w{!R(2t_h$ z6?Ct9xLb5d+su_ygubcm_`tGMgQu&X%Q~loCIGRVNI?Jq diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_6.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_6.png index 83b583a15d13bc9adf0230dddda07af8675c75e1..146a658848968056ddc891e6073ef09277c2cee9 100644 GIT binary patch delta 134 zcmV;10D1q=0k8p(F@I`FL_t(oh3%Bl3BWK21(R;83puX+Do7zT(q}^8-2mR9A*~TY z2-!@p9PaMEJYYr&4;V>RwLai2k5V)Hoc}8z${+EJ6oLmtBz1Ra!13}65wsNa>bGwo o6_EYq;8eW)vrfPO1~8z48%@_%K%yDNSpWb407*qoM6N<$fXhY2m zr@pWPHMk9R_n{O1d3c;9*^A7hU&e%2vc#={=PTd>3R-0_1ZRctjR6Fz_7)VaDV6D^h@hNuDl_ zAr}5`FCOGNV8Fo~u=fA|^PBaUv-kAGR>t@_%8RUt=+f{yW$@yNNyd@rgzSYjD;roC zql?Z+%vhyzxxsgvqk;9KWb<+5x_7ALs5~-vSJ|Cb(#zi`&6X(uSPmR0sw4S zuViPP7FJay7PwA>wj-aoyZiI-%t(@UGI6$7>UsbGfM0k3?Z+1E?n=8500000NkvXX Hu0mjfoJA`E delta 140 zcmeBY+{!q?u%0E|(btiIVPik{pF~y$1_sUokH}&M2EM}}%y>M1MG8>R%hSa%B*Oje z`HP$f3^-f^C+C(b$Zl7B#GuQm+E`sTuTDdYq2aa7(p#x}zwHexUbHH@FC$)TXZ5m~ rsctT(ANhZN5PP4QfkDP0g<;by*Q$udms^3RGI+ZBvAV2tN@xNACJQq? diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_9.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvcable_9.png index 66273438415da39292cf27c5794fc575fbc55b94..5ec716e43f82de2ce44046faca0bcd5af928bca0 100644 GIT binary patch delta 133 zcmV;00DAw@0j~j&F@9-DL_t(oh3(Nn3cw%`1Hf4N+4Vy{H(pxsV9N@wwUD`MVgv^8 zVrCpU_vV;&(Qga5Ma&Ouu)ya9T%zU&91D<~9_q$M#OwD9XGe5+divv>GXS8Jk|GP7 nz0eiGx71F&DpW*7L_}H@(T`&(7s|jF00000NkvXXu0mjf?W;Q8 delta 169 zcmZ3_c!_a>VLeN_qpu?a!^VE@KZ&di3=EtF9+AZi419+{nDKc2iWHz=x~Gd{NQC>_ zix;^X6nI!K+`OM>zvcW^wQixRfTG?9^QLQZgs(SQEjMH5uWwt=rqBAq?GqWh|DZTe z_lo;}7B{ZA&hN>+JwaGDuEtF4g}2Z|v(T;9o1-eZOfM=OTwb*P$Lau}B@8B?Wc})uc*XMaSfSB*u1QZw;-5D2j067evu6{1-oD!Mpeux#%xb_^)u`GJ}J{@`$3Y)}pi{$0}!X-I1Na z-ub67GR!CM6;`V?^w-RH_>$Bn?tW% zRZ&0*Jyf0NG_6*H&AoH^7lsaNNAM@=ue(_<3j8t>OYCoy=s`njxgN@xNA D?3Yn+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_12.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_12.png new file mode 100644 index 0000000000000000000000000000000000000000..366ef79e584c4613e33138348e3044c862619d51 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}=AJH&ArY-_ z&u$cD5D;N@C{f$o-S{TSNOkS!fo0$?#7iJ}?yo+hnoh!t^s@XOt>BKB!+dZi_v?HWv zv25qOmqcf3acN?vFfET5NUs7}j0Muzer5 oFJHG$@8A9SsRB+Micf-NL_(aE9%M{(2D*a5)78&qol`;+0BQ3=ZvX%Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_14.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_14.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7434c43ca048d616e134cb61c38b5e44543b05 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ot`d^ArY-_ zCvW6Epuoez8>^N)o##ock)-O%32Rh1dh9lF$9Ky8TWjv(D8SNaxUwko(*uk3EhaPe z&cFEVQbAhW&Mp4Vm4&8P&dDk*S{M-RdwsEX4eQOT2OMWU+nJKn#<5Z4L1x>VYRd-h zUr*G$)BCztYEN(DOWN1+jPc5j8?6U=?0<#-XDaECKHut>|MXsH5ztW#p00i_>zopr E04Ot1>;M1& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_15.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_15.png new file mode 100644 index 0000000000000000000000000000000000000000..73e0ed269c0cbe9630c8362066578207304793b9 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}8$4YcLn2z= zPWR?(P~dUlE_{4)M>qQ;y?H&V>pXZIGfsX8z905x%VjMGl>?EF=bFZS^5g8~xyHJM z`SpcG|6Nv}afq?K)Z4o`!``n|KzQrLP~c%Xm{43cBdj)ymz}eHSFpnk_Z=KS-4T}MU(Y`5o4~y4CUc5xeM9vIX4yB4 hMr9B3{ofs6Tr@>&x#faeu0YcmJYD@<);T3K0RX$oD*gZf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_3.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6d51d19b526eaf418dea02ac0e30eb318a9903fa GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}A)YRdArY-_ zuQ+l6Rk>VzQFQOZ>Rnruk2I*g+*7OATCdx%a>q)GqGxIDao=3Na9@Zw`X_&{sVqCf nj-f|(Mz8FN093}>RCd0`GwKWDX6&91G@rrK)z4*}Q$iB}bZj;W literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_4.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_4.png new file mode 100644 index 0000000000000000000000000000000000000000..7a520185f141b719f86394292794b805045f6076 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R})}AhoArY-_ z&n@I-P~c&4nBa3vkLQSKvF{=9_z9A!F6q=@ywlOF|5DG)vAZ SKU)f9GkCiCxvX#|JHb>7Y)zo3d^ zLXzcGhN=L5O>fPvCdQAJXC65UGBLBU>AYZ!bt14;!o-QVfcU4`?JL eNGyBGz);a)_rQy`z0uo3!G&$f2Cu}eb21H;oA)yPVihu0 z^lEt1_P+EW<110M7Kufh&8L;_mK9fekXbaNLHm`_Ri@os8LHC{y?V!3AsuDQa4^-X zZAMF8wPLwr$J94Y{j+D=8r<1_C$?ec|1t+BlNT~K7$ZOW9^BDabQ0()22WQ%mvv4F FO#lK%P$~cb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_8.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_8.png new file mode 100644 index 0000000000000000000000000000000000000000..ef45b5ce15f354aeda24a881f0beb0721551bc3e GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Hl8kyArY;~ z2@mdKI;Vst0FZ+uJ^%m! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_9.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_9.png new file mode 100644 index 0000000000000000000000000000000000000000..0963e111ad532b7704b1121d44c4aa7790dc5748 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}QJyZ2ArY-_ zFKy&?P~>n8{4;m*&Ti(N-IF7;R-4(YIT`F+eq6k!LncG@Ygmx|%%7j{)|@%=R=%R$ z?Z49cI}O*q{fo?b_nmD`6@RtI8PkmRbJMui9A;!-cyNe8Yp04w=y3%dpe+oZu6{1- HoD!M Date: Wed, 16 Apr 2025 20:27:32 +0000 Subject: [PATCH 192/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0928d1da3d..34fcf61145 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: LevitatingTree - changes: - - message: Lizards can now eat the Five Alarm Burger! - type: Fix - id: 7702 - time: '2024-12-13T13:53:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33848 - author: Southbridge changes: - message: Paper documents now support the [mono] tag. @@ -3910,3 +3903,10 @@ id: 8201 time: '2025-04-16T19:29:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34959 +- author: Linkbro1 + changes: + - message: changed MV and HV cable item sprites, changed MV cable structure sprites + type: Tweak + id: 8202 + time: '2025-04-16T20:26:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34955 From a16097fa337dd92775a5f970572cc712b7b67c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciar=C3=A1n=20Walsh?= Date: Wed, 16 Apr 2025 22:14:05 +0100 Subject: [PATCH 193/622] Fix duplicate suit signals (#35918) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Include the suit owner’s UID in suit sensor status updates. * Show a single monitoring entry per crew member * Rewrite sensor collection using a dictionary --- .../CrewMonitoringWindow.xaml.cs | 22 +++++++++++++++++-- .../Medical/SuitSensors/SuitSensorSystem.cs | 6 +++-- .../Medical/SuitSensor/SharedSuitSensor.cs | 5 ++++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs b/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs index 18c54cd231..b3b3508169 100644 --- a/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs +++ b/Content.Client/Medical/CrewMonitoring/CrewMonitoringWindow.xaml.cs @@ -79,10 +79,28 @@ public sealed partial class CrewMonitoringWindow : FancyWindow NoServerLabel.Visible = false; + // Collect one status per user, using the sensor with the most data available. + Dictionary uniqueSensorsMap = new(); + foreach (var sensor in sensors) + { + if (uniqueSensorsMap.TryGetValue(sensor.OwnerUid, out var existingSensor)) + { + // Skip if we already have a sensor with more data for this mob. + if (existingSensor.Coordinates != null && sensor.Coordinates == null) + continue; + + if (existingSensor.DamagePercentage != null && sensor.DamagePercentage == null) + continue; + } + + uniqueSensorsMap[sensor.OwnerUid] = sensor; + } + var uniqueSensors = uniqueSensorsMap.Values.ToList(); + // Order sensor data - var orderedSensors = sensors.OrderBy(n => n.Name).OrderBy(j => j.Job); + var orderedSensors = uniqueSensors.OrderBy(n => n.Name).OrderBy(j => j.Job); var assignedSensors = new HashSet(); - var departments = sensors.SelectMany(d => d.JobDepartments).Distinct().OrderBy(n => n); + var departments = uniqueSensors.SelectMany(d => d.JobDepartments).Distinct().OrderBy(n => n); // Create department labels and populate lists foreach (var department in departments) diff --git a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs index f6e46dd4f8..fa4344cc78 100644 --- a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs +++ b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs @@ -406,7 +406,7 @@ public sealed class SuitSensorSystem : EntitySystem totalDamageThreshold = critThreshold.Value.Int(); // finally, form suit sensor status - var status = new SuitSensorStatus(GetNetEntity(uid), userName, userJob, userJobIcon, userJobDepartments); + var status = new SuitSensorStatus(GetNetEntity(sensor.User.Value), GetNetEntity(uid), userName, userJob, userJobIcon, userJobDepartments); switch (sensor.Mode) { case SuitSensorMode.SensorBinary: @@ -461,6 +461,7 @@ public sealed class SuitSensorSystem : EntitySystem [SuitSensorConstants.NET_JOB_DEPARTMENTS] = status.JobDepartments, [SuitSensorConstants.NET_IS_ALIVE] = status.IsAlive, [SuitSensorConstants.NET_SUIT_SENSOR_UID] = status.SuitSensorUid, + [SuitSensorConstants.NET_OWNER_UID] = status.OwnerUid, }; if (status.TotalDamage != null) @@ -491,13 +492,14 @@ public sealed class SuitSensorSystem : EntitySystem if (!payload.TryGetValue(SuitSensorConstants.NET_JOB_DEPARTMENTS, out List? jobDepartments)) return null; if (!payload.TryGetValue(SuitSensorConstants.NET_IS_ALIVE, out bool? isAlive)) return null; if (!payload.TryGetValue(SuitSensorConstants.NET_SUIT_SENSOR_UID, out NetEntity suitSensorUid)) return null; + if (!payload.TryGetValue(SuitSensorConstants.NET_OWNER_UID, out NetEntity ownerUid)) return null; // try get total damage and cords (optionals) payload.TryGetValue(SuitSensorConstants.NET_TOTAL_DAMAGE, out int? totalDamage); payload.TryGetValue(SuitSensorConstants.NET_TOTAL_DAMAGE_THRESHOLD, out int? totalDamageThreshold); payload.TryGetValue(SuitSensorConstants.NET_COORDINATES, out NetCoordinates? coords); - var status = new SuitSensorStatus(suitSensorUid, name, job, jobIcon, jobDepartments) + var status = new SuitSensorStatus(ownerUid, suitSensorUid, name, job, jobIcon, jobDepartments) { IsAlive = isAlive.Value, TotalDamage = totalDamage, diff --git a/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs b/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs index f48e31756d..f0a552c7ec 100644 --- a/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs +++ b/Content.Shared/Medical/SuitSensor/SharedSuitSensor.cs @@ -7,8 +7,9 @@ namespace Content.Shared.Medical.SuitSensor; [Serializable, NetSerializable] public sealed class SuitSensorStatus { - public SuitSensorStatus(NetEntity suitSensorUid, string name, string job, string jobIcon, List jobDepartments) + public SuitSensorStatus(NetEntity ownerUid, NetEntity suitSensorUid, string name, string job, string jobIcon, List jobDepartments) { + OwnerUid = ownerUid; SuitSensorUid = suitSensorUid; Name = name; Job = job; @@ -18,6 +19,7 @@ public sealed class SuitSensorStatus public TimeSpan Timestamp; public NetEntity SuitSensorUid; + public NetEntity OwnerUid; public string Name; public string Job; public string JobIcon; @@ -55,6 +57,7 @@ public enum SuitSensorMode : byte public static class SuitSensorConstants { + public const string NET_OWNER_UID = "ownerUid"; public const string NET_NAME = "name"; public const string NET_JOB = "job"; public const string NET_JOB_ICON = "jobIcon"; From 705cbe1541af2f34fb026fee947726b5e759a0a4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 21:15:24 +0000 Subject: [PATCH 194/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 34fcf61145..6a3514005c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Southbridge - changes: - - message: Paper documents now support the [mono] tag. - type: Add - id: 7703 - time: '2024-12-13T14:24:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33830 - author: yuitop changes: - message: Anchoring now has higher priority over stashing. @@ -3910,3 +3903,10 @@ id: 8202 time: '2025-04-16T20:26:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34955 +- author: ciaran + changes: + - message: Fixed duplicate crew monitor console entries for crew with tracking implants + type: Fix + id: 8203 + time: '2025-04-16T21:14:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35918 From aec8e7f8d9ecf561fd09878f30e089372860104a Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Wed, 16 Apr 2025 17:33:02 -0400 Subject: [PATCH 195/622] Add self message variants for starting/finishing vending machine restocking (#36633) * Add self message variants for starting/finishing restock * Identity --- Content.Server/VendingMachines/VendingMachineSystem.cs | 6 +++++- .../VendingMachines/SharedVendingMachineSystem.Restock.cs | 7 +++++-- .../vending-machine-restock-component.ftl | 8 +++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index e061398114..bd95c92327 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.DoAfter; using Content.Shared.Emp; +using Content.Shared.IdentityManagement; using Content.Shared.Popups; using Content.Shared.Power; using Content.Shared.Throwing; @@ -15,6 +16,7 @@ using Content.Shared.UserInterface; using Content.Shared.VendingMachines; using Content.Shared.Wall; using Robust.Shared.Audio; +using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -141,7 +143,9 @@ namespace Content.Server.VendingMachines TryRestockInventory(uid, component); - Popup.PopupEntity(Loc.GetString("vending-machine-restock-done", ("this", args.Args.Used), ("user", args.Args.User), ("target", uid)), args.Args.User, PopupType.Medium); + Popup.PopupEntity(Loc.GetString("vending-machine-restock-done-self", ("target", uid)), args.Args.User, args.Args.User, PopupType.Medium); + var othersFilter = Filter.PvsExcept(args.Args.User); + Popup.PopupEntity(Loc.GetString("vending-machine-restock-done-others", ("user", Identity.Entity(args.User, EntityManager)), ("target", uid)), args.Args.User, othersFilter, true, PopupType.Medium); Audio.PlayPvs(restockComponent.SoundRestockDone, uid, AudioParams.Default.WithVolume(-2f).WithVariation(0.2f)); diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs index a5e2a6eccc..20c8f1195a 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs @@ -1,4 +1,5 @@ using Content.Shared.DoAfter; +using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Wires; @@ -72,8 +73,10 @@ public abstract partial class SharedVendingMachineSystem if (!_doAfter.TryStartDoAfter(doAfterArgs)) return; - Popup.PopupPredicted(Loc.GetString("vending-machine-restock-start", ("this", uid), ("user", args.User), - ("target", target)), + var selfMessage = Loc.GetString("vending-machine-restock-start-self", ("target", target)); + var othersMessage = Loc.GetString("vending-machine-restock-start-others", ("user", Identity.Entity(args.User, EntityManager)), ("target", target)); + Popup.PopupPredicted(selfMessage, + othersMessage, uid, args.User, PopupType.Medium); diff --git a/Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl b/Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl index 3d1968604a..49b0305b19 100644 --- a/Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl +++ b/Resources/Locale/en-US/vending-machines/vending-machine-restock-component.ftl @@ -1,4 +1,6 @@ vending-machine-restock-invalid-inventory = { CAPITALIZE(THE($this)) } isn't the right package to restock { THE($target) }. -vending-machine-restock-needs-panel-open = { CAPITALIZE($target) } needs { POSS-ADJ($target) } maintenance panel opened first. -vending-machine-restock-start = { $user } starts restocking { $target }. -vending-machine-restock-done = { $user } finishes restocking { $target }. +vending-machine-restock-needs-panel-open = { CAPITALIZE(THE($target)) } needs { POSS-ADJ($target) } maintenance panel opened first. +vending-machine-restock-start-self = You start restocking { THE($target) }. +vending-machine-restock-start-others = { CAPITALIZE(THE($user)) } starts restocking { THE($target) }. +vending-machine-restock-done-self = You finish restocking { THE($target) }. +vending-machine-restock-done-others = { CAPITALIZE(THE($user)) } finishes restocking { THE($target) }. From f4f9f7ea7b25a6ccd9d65de0266e3a0d73dcbb21 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Wed, 16 Apr 2025 17:51:38 -0400 Subject: [PATCH 196/622] Cleanup warnings in ScreenshotHook (#36637) --- Content.Client/Screenshot/ScreenshotHook.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Content.Client/Screenshot/ScreenshotHook.cs b/Content.Client/Screenshot/ScreenshotHook.cs index 753691a58e..d3cd5791dc 100644 --- a/Content.Client/Screenshot/ScreenshotHook.cs +++ b/Content.Client/Screenshot/ScreenshotHook.cs @@ -1,4 +1,3 @@ -using System; using System.IO; using System.Threading.Tasks; using Content.Client.Viewport; @@ -8,8 +7,6 @@ using Robust.Client.Input; using Robust.Client.State; using Robust.Shared.ContentPack; using Robust.Shared.Input.Binding; -using Robust.Shared.IoC; -using Robust.Shared.Log; using Robust.Shared.Utility; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; @@ -25,8 +22,13 @@ namespace Content.Client.Screenshot [Dependency] private readonly IResourceManager _resourceManager = default!; [Dependency] private readonly IStateManager _stateManager = default!; + private ISawmill _sawmill = default!; + public void Initialize() { + _sawmill = Logger.GetSawmill("screenshot"); + _sawmill.Level = LogLevel.Info; + _inputManager.SetInputCommand(ContentKeyFunctions.TakeScreenshot, InputCmdHandler.FromDelegate(_ => { _clyde.Screenshot(ScreenshotType.Final, Take); @@ -40,7 +42,7 @@ namespace Content.Client.Screenshot } else { - Logger.InfoS("screenshot", "Can't take no-UI screenshot: current state is not GameScreen"); + _sawmill.Info("Can't take no-UI screenshot: current state is not GameScreen"); } })); } @@ -74,16 +76,16 @@ namespace Content.Client.Screenshot screenshot.SaveAsPng(file); }); - Logger.InfoS("screenshot", "Screenshot taken as {0}.png", filename); + _sawmill.Info("Screenshot taken as {0}.png", filename); return; } catch (IOException e) { - Logger.WarningS("screenshot", "Failed to save screenshot, retrying?:\n{0}", e); + _sawmill.Warning("Failed to save screenshot, retrying?:\n{0}", e); } } - Logger.ErrorS("screenshot", "Unable to save screenshot."); + _sawmill.Error("Unable to save screenshot."); } } From 2b845c70c77967502f9d825ba9e68389aab97b23 Mon Sep 17 00:00:00 2001 From: mubururu_ <139181059+muburu@users.noreply.github.com> Date: Wed, 16 Apr 2025 17:14:48 -0500 Subject: [PATCH 197/622] space adder sprite cleanup (#36584) --- .../purple_snake.rsi/dead_purple_snake.png | Bin 1352 -> 523 bytes .../Aliens/Xenos/purple_snake.rsi/meta.json | 68 +++++++++--------- .../Xenos/purple_snake.rsi/purple_snake.png | Bin 15060 -> 4976 bytes 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Resources/Textures/Mobs/Aliens/Xenos/purple_snake.rsi/dead_purple_snake.png b/Resources/Textures/Mobs/Aliens/Xenos/purple_snake.rsi/dead_purple_snake.png index c031d8b92f3d8a71721390c5881343e23eaa69ec..bc678532bb72449010f6eee1e202629c6901e96e 100644 GIT binary patch delta 497 zcmVKWw+|6dOQLX-xPERAlXZT^Hn5Oxfa%!>ioCC(F(H=9%ljj+Cu#L_J&5%>lv8Rj@!V;x)D zv6KR~;zzEs#%4-X=Z=RU?93^#(j6!kAG3WcbDW*Lr~r(;3o8-mdl3NODv?(Iz@K8^ zPfNuI{uHcZYkxej#2qNgf8;9c5aT>vn~Q6ahGB&#P1ti7f+U7YqbD`SEFgr7VZw9w zfQp5xJ*xJ8%!F4av`A+~`(6arF^)GsuuBGKfx?NeF;p67fx?&tPJE5ytq47-7b_5i z9kb^!(qE29qVGkxOKYxtCH_@`~3~u%}KiN@NpED6u91>Ia9}?HJhEr7UPR+ n)jU7K^?q|wO004R=004l4008;_ z004mL004C`008P>0026e000+nl3&F}000EeNklMM@)SWB;2Hl9DAfo6>(1q?@see#gDiU#_VykFvtFIfi7YSw5R2xrdJd2!|`f9|BM9= zs+2uc%cRqDo-;{(e)shexcfCDnVKb;nk^<%v(~p&t2_19+wW6Nc5di%y^&1KDqnBI z`I|Z0{QNgm)0*6!?++jTSDSBesB7%klc2Aol4J|oJbwtlu5H`Mw0<3LD~nhHZj_uQO;4RZN}a2z=3%FCp1hu8x`xCvo+ z(0Vy@&y3JLB(q^j__-y!sRZftoB*ZwJwBA5K7R&=-JxJcERi|<7IKaH3Gd(zL4tf_ z7>?l~G(#ug%Wc1*1bIdC`uuKB#&;RP4OkqEZ72qH9d-zQ34t|wOhh;VVR>Bv$Q-a9 zLjWcb+-cPJ>xK;Yu?u*8sgzF5s&Q_Az_bZdIhJXwdJb(MAY%14Edu6Fgkyq&L1adh z+kXcoiu7#BJ&%=d2%w}Wu-IDlvr8mt&43YrZa1S8GLSgp;0E11S2KyRNW4Cl@mi%z z*G1;esGN7JT?WjFa1U7qEA3*E)UK6ad}4AG=xAi1m|bi&d)%54yaO=gaKAYnGY(~r zBqV`5MLA_b*_~Df7XV2Nh{Y>gy1Y}#cp!#1D;-?$`dEioH+Lk-f$}v$I6g5c zU%G9=7+%!N%@LL*0fw))OE872;>8^}gUQ|fC=n)9G|?ikR*1;DaMs-={5!BTS948;NfBXpuE|v_>ojf9v!j|v zW{yHLRSstzd75$wT9so0I`t(HcZ-ACe3T1TjK)cm5njfSy91gn2uRUK?k}foT#hx1 zoDA|dFSoKgeF@Y5h5X>W-Y?ZXa5ehc;>cA^&5zRr1NEKT;Z>bDw+K(K-`h1ak=Mtk z2|Iw2lG5$FRuV4bj)NE!87=RcLLKH5#+?;U5~PHE+Ofq2Gnc3VTW}U5o%+3nc?g)* z`TqH(@@g^kxeYLE8%uQ#IXy#+761~cPMDV(?%~S1>Sp49)NSXOc&3vSEF8EjgMSC| z5PuGs1N#f#1yXw$T#tL`00N4pd?2wvwy`fRiF`uob3v8+^gisJp8(xzNs|L92(}t% z2*EN8&gHIg+a@OQpBrOlQn0eAQ5<)z?{LWRWgToDOO4A}*O9JxRxsOYKCcvQ<-?yq zEpzoH(e4iFQ6?QJBTBW4ZrijL~|LC6;wFM{utnu4t3yyyPnw&|cu zL~AsOX$t}~v@}lg_Y3BdY4dRqv4kf(m2g$(Jo3_l|&zYXEVDD3hM8#oxB_K}AdvT=3`~a`vjY zY#O1dNXZ)ZCPc=&NcEzV9cLLEXea7G+oBU+l_X4+tkArqY0m7AXJ5 zqVdS9bw>DRLnk;^O{hUvOwrYL1t`;Hz9~*PtIr9_E(Simk*trO8u9dMBkp|}sSpAb z=dpGiqdGX@>Ifhw9Z|PBzfm1gfkz-F8$3W|vNS7sAeG}5v2Ok!lMgy?LgpU!O~^h~ znhKk-J?GwjU{%GyoMS4Tk`DH5ZFK7U(DZin@KO>%kG%i~`;OXtJ`7(_&*jGDuD8Df zUKP`7F1`dd)+OH-{T;beImU*g!j?P`A=|yU(z9P9pIf!S)K<|5e@5PEmyqqmlb#_& z-cKkoun=1rM{Jn40|314ap%VE72A>9FsdV^0Q;Emc{7nA%jBYp|^j% zcYJ4Ux&`_@6*$SNna5^5pmTG&i%y zXmw^cnOL_$ap+tSR?MZKR6yy`+(AY85G+rH;BYt)xhD0zz_NLF;|A?#&A_~u2kjXq z8?MBBGoAJeaHlCO9jtQ!`e+^vzWPx=iKTHwk$8C!c+-5%04o641@OL)8iaYpEYLy4 z1>k$1%m5wU;QgQcI=f>h0GFnQhk6r)iij%TNCDNW&jM-lUob_n{n?Pm*~b7VmAWn; zf%vik06C}4XF0uP?n99uIB{Dl=%2L8?d|TZ`#PVxdSNlCm0lE7~_(KZ@^PsZ@EV^TZ>&LD>57oynyK4^X7I1!U4Rn)8U zb*R*)yl{2c7QH|CaMF+V%;*ebluHh;&)wcB_%356lvlcn&yY2=al!n-tc6cp{%L8s zXu&C2IBz1$vtz-Lsk1%kg)0D8|LL)=I{NZsF&I$8cEpO{l_^b#bSZzggJkfJTef?z zgT1_tW)~k-b$W0+L(8#q!BzmvIF_L!E$?}F`c`0QCn`eMRqe{qki;;76h(Nlp}F9X zbYsKmWenuWbmTp2V348ZjuOBu?&R?ECV0@u4vN&>O?FUg-5b3-p57caSb8&N`TS%@ z(|P#=-8(Uo*y*Vf4hUn}-t#uV+kNzV_po4QV~c4EqkrDf;eW*<*QpF<=b`;EHyYfY zE9FovsBo1J*LrCO6gJi64vy^#_15!;io`}s9>R4+%V#G{y_n>|2?33vODQE|T(f=; zEi?W^*?d0aZc#qN<3a`l4&py0~7g;)@T<}UJWdOM*c)`7$mhR~K!={k*4Mbn|2m-g8VZXu}VF zS9nLNU^Rt*Nnv$DFLQ0DLB#87C@&#^tbGKB+QC90CftC@(B7-xCBgt;=e4*^vC-=s zVXHrY^rVbBQ%Sz;^J;$GojcshQX<41Gan`Ar z@GHQV-`d)NI%~3U`dSBk_$Jj=JRtEMI}ynF z_l~VOdu2iXKT+_XaM(E$`P~!o+)zYonGu}1UTgRn!`-F{$@-IN?6Vl)EnbaQ!XCZe zZSN7kyqjL=C%^NeF7*j7eYy@}LJV;60TfBcUMFC>c?jz;GszX9(KZ2SeEJh^*Zr1y zP07>?KGK@JkrYms}y*_G0k7^gy% z=89FA%zFlSL|sW}ZM{Xp4N7$(2@~D+<4k?WW9kQQBaSPpGr@`@7C-+HD}soXXmcBn zF8*NUiu#C}xqbhp!BcsbH~52prZ<~kbm&d3JO~I==maQ5WwiDueYDW|C1b@11HBj5O1>IN(E)vGn8+=oX{*a-lrg{Ksg5hmS%c3AQEb#Re0-zcM|;JFrISzK1_2nZfQ# z=m#SE&GV1&cdyk-D}i|CR&(lh3%9T})Qw2KJLf=&4m_`s-Q#VHXxXq+-EtJOE>`0_ z7Q>}64eC*jZ0djoQm(loIcx*hf&YhH7}<|iK?z8%03H*!4}Tlk(>%3l8qQW#0_ zbqx$0pM`>ztV_YwU)9m^o7bmY+7CWf^sp{{y+FodPALTYGWKn65IrFD!gQ0YH0}Ya zY~evbz)X;PT6Ydl(32i?x0=(ldaY+eyfw5Me>GxEHq-tvD>ro@V9<0PC^71(cBB~l zf6r(MAcg<%5|})EjvB8RXxT1?rJVRJ_KZ4@c07=uG4&MAa8{nV$;vH)bMk8CP@X?_ zym)(lzQGr3!x|(nerDnHZbvc&P9$s|=tg0M@rD zm19WsxJI8Jr-Vw3wv|zdep*_sASX;9+QV%3oVzGBL8mo{!m-Gy;}UQ6gl^Za+Q0DT zovY}i5t5nL1zS;GVsu06m}EtCNBuo5AAM?tujn^%Nu3R-j-^C*=?eJ!39?HG3F8nb8OS_iG&P*ACW?d71Ca zELj1lIQgRHN>C0JpxRl9vH$OYPImNXu{<`DI^}S~%zW`j%A_q}b@URKJE|erVr)m; z>E(#RW>}*N`d@~T01Ic4?<_X>p{9p72rQ#|E2?t!ePODgM$DGQ`=gR>omR~YFhiE` zpb@Zge*;Q4z9TWb%M5}b^@Mc%7zu`%4+Pw4NrSAOtwHsVtK&9P83C>L&Sv@KYqqk< zN5y7jr+2=uLZjBjMm7Ps)|vbNMUJSh8C|pV^+(0ng8C3ln`raq)!GeyM70)3$(ZBS z+kUU7@JW}aMswt zGhu=Wg13?tW=N&>17iMa-`JUDtHkIlA1QCHN*6b_B`*<`(@Wi4x+ujUW?dsrf*S8^ zJ)ce1$|om>1HbdI?BE-fu!gbnZ!*;a+FuJDipRY2EJ@+IRm>l(Qcg|!Za0yVJ^8XE zu<^h_FZSCj@E18Hre({iUoWL$e7@^jma5t&VFrjy;_J=_^{3nYBw|AS#PU|z&9XD; zepC?{HWdzcEJ`@Cp7BBm{-?xWgJRvnE^QzDE{n1ZL`K}fzf{nM`2n+cqvJ!GUe^0b ze2V3aRropAWq<7m?~;>A1N33lhWq7+?J1$_-{OgygAyvITkk{0oRc^+(I zU244B%j=gF<@()*vhr^^Ipdiol#W&Nfwclc4OlA)w&QWcOitH++5?tTB zF)gW4M95BwqTXEq|BtOYZ$BEP6vfglHNEueCV%R<`TVRLsPgWe_`=_C6>Nb!KC}UU zP?(EdX!h6A3R)$QB4!l&6CYKESnTGP=NOr;YtNylDQFkIf<4pDG4G3nE9t3PGWuv! znt)3jYF8!6&tD&~6Dg~0CV^rKRV=Hf@D&7B`#jbwtYTwbRr=|!u+H53Ky*^NKtvsB z;r*!lpaxa}RN`z{%2@GY4Z;@vEvu2WLN4&m+F9-C7`C%ra4THpg1rb2K12a-8&!4n z)s@|?J~^y;?e=lj3cT*ld~%u*E>EAHODt@fgv zkCMfLz!7h@6bChoZ26PDvK=SB&(c*FOQV*3CBX{c-}?Fj8H4r)o4|v=?O{7L`urLj zr~KUW^w8s?gx#`QpWWxzV#0qflYPDQnq2MZs3X{|WU-_8)14dP1`%^)ZvP8vPot0` z{-BX;j11MZfsF+ok7_g7Nrso|tL?9xcxaZ1_b9+zc=?0vS6&z9-^7l!bf1C`IXtGO zuwsU@)=egrjyi=M704fok(LBOsnQiZ$oRSq>`o0v>v3ik?W12kgR+N3GI8qCl@?P# zc)Xh~w1TB%C~0U8&i}pF*d=48jQ)Cn$wCp2QN%?F#j6p*;-H|5y1j{Qn=$U}4kV2+ s!1KH=*OUF)AH}|x`d@j|gJFTuJ4)hje>I$9U!egOmuyVxj9udX3&NnjzW@LL literal 15060 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 Il&vEF4`sXoH2?qr From 557e5b3a1055049323740d0d8fe6cd7e28a31f77 Mon Sep 17 00:00:00 2001 From: SeamLesss Date: Wed, 16 Apr 2025 15:15:37 -0700 Subject: [PATCH 198/622] Standardize In-hand Sprites for Gloves (#35997) * guh??? * Merge branch 'master' of https://github.com/SeamLesss/space-station-14 * glove inhands * wrong side * attribution hell * slight tweaks --------- Co-authored-by: ScarKy0 --- .../Gloves/Color/black.rsi/inhand-left.png | Bin 205 -> 16598 bytes .../Gloves/Color/black.rsi/inhand-right.png | Bin 214 -> 16598 bytes .../Hands/Gloves/Color/black.rsi/meta.json | 2 +- .../Gloves/Color/color.rsi/inhand-left.png | Bin 218 -> 16598 bytes .../Gloves/Color/color.rsi/inhand-right.png | Bin 225 -> 16598 bytes .../Hands/Gloves/Color/color.rsi/meta.json | 2 +- .../Gloves/Color/yellow.rsi/inhand-left.png | Bin 291 -> 16598 bytes .../Gloves/Color/yellow.rsi/inhand-right.png | Bin 294 -> 16598 bytes .../Hands/Gloves/Color/yellow.rsi/meta.json | 2 +- .../Hands/Gloves/captain.rsi/inhand-left.png | Bin 480 -> 16598 bytes .../Hands/Gloves/captain.rsi/inhand-right.png | Bin 481 -> 16598 bytes .../Hands/Gloves/captain.rsi/meta.json | 2 +- .../Hands/Gloves/combat.rsi/inhand-left.png | Bin 564 -> 16598 bytes .../Hands/Gloves/combat.rsi/inhand-right.png | Bin 567 -> 16598 bytes .../Hands/Gloves/combat.rsi/meta.json | 2 +- .../Gloves/fingerless.rsi/inhand-left.png | Bin 205 -> 16598 bytes .../Gloves/fingerless.rsi/inhand-right.png | Bin 214 -> 16598 bytes .../Hands/Gloves/fingerless.rsi/meta.json | 2 +- .../fingerlessinsuls.rsi/inhand-left.png | Bin 291 -> 16598 bytes .../fingerlessinsuls.rsi/inhand-right.png | Bin 294 -> 16598 bytes .../Gloves/fingerlessinsuls.rsi/meta.json | 28 +++++++++++++++++- .../Hands/Gloves/forensic.rsi/inhand-left.png | Bin 450 -> 16598 bytes .../Gloves/forensic.rsi/inhand-right.png | Bin 451 -> 16598 bytes .../Hands/Gloves/forensic.rsi/meta.json | 2 +- .../Hands/Gloves/hop.rsi/inhand-left.png | Bin 1141 -> 16598 bytes .../Hands/Gloves/hop.rsi/inhand-right.png | Bin 1145 -> 16598 bytes .../Clothing/Hands/Gloves/hop.rsi/meta.json | 2 +- .../Hands/Gloves/janitor.rsi/inhand-left.png | Bin 1287 -> 16598 bytes .../Hands/Gloves/janitor.rsi/inhand-right.png | Bin 1283 -> 16598 bytes .../Hands/Gloves/janitor.rsi/meta.json | 2 +- .../Hands/Gloves/latex.rsi/inhand-left.png | Bin 218 -> 16598 bytes .../Hands/Gloves/latex.rsi/inhand-right.png | Bin 225 -> 16598 bytes .../Clothing/Hands/Gloves/latex.rsi/meta.json | 2 +- .../Hands/Gloves/leather.rsi/inhand-left.png | Bin 437 -> 16598 bytes .../Hands/Gloves/leather.rsi/inhand-right.png | Bin 444 -> 16598 bytes .../Hands/Gloves/leather.rsi/meta.json | 2 +- .../Gloves/mercbattle.rsi/inhand-left.png | Bin 278 -> 16598 bytes .../Gloves/mercbattle.rsi/inhand-right.png | Bin 286 -> 16598 bytes .../Hands/Gloves/mercbattle.rsi/meta.json | 2 +- .../Gloves/mercfingerless.rsi/inhand-left.png | Bin 278 -> 16598 bytes .../mercfingerless.rsi/inhand-right.png | Bin 286 -> 16598 bytes .../Hands/Gloves/mercfingerless.rsi/meta.json | 2 +- .../Hands/Gloves/nitrile.rsi/inhand-left.png | Bin 228 -> 16598 bytes .../Hands/Gloves/nitrile.rsi/inhand-right.png | Bin 232 -> 16598 bytes .../Hands/Gloves/nitrile.rsi/meta.json | 2 +- .../Hands/Gloves/northstar.rsi/meta.json | 2 +- .../Gloves/powerglove.rsi/inhand-left.png | Bin 463 -> 16598 bytes .../Gloves/powerglove.rsi/inhand-right.png | Bin 461 -> 16598 bytes .../Hands/Gloves/powerglove.rsi/meta.json | 2 +- .../Gloves/powerglove.rsi/on-inhand-left.png | Bin 462 -> 16598 bytes .../Gloves/powerglove.rsi/on-inhand-right.png | Bin 458 -> 16598 bytes .../Gloves/robohands.rsi/inhand-left.png | Bin 1249 -> 16598 bytes .../Gloves/robohands.rsi/inhand-right.png | Bin 1264 -> 16598 bytes .../Hands/Gloves/robohands.rsi/meta.json | 2 +- .../spaceninja.rsi/green-inhand-left.png | Bin 403 -> 16598 bytes .../spaceninja.rsi/green-inhand-right.png | Bin 411 -> 16598 bytes .../Gloves/spaceninja.rsi/inhand-left.png | Bin 205 -> 16598 bytes .../Gloves/spaceninja.rsi/inhand-right.png | Bin 214 -> 16598 bytes .../Hands/Gloves/spaceninja.rsi/meta.json | 2 +- .../Gloves/spaceninja.rsi/red-inhand-left.png | Bin 408 -> 16598 bytes .../spaceninja.rsi/red-inhand-right.png | Bin 416 -> 16598 bytes 61 files changed, 45 insertions(+), 19 deletions(-) diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/black.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/black.rsi/inhand-left.png index 8f8953d6350a9eaafc02aae11628dea79f4f41c6..6180b001785aaf8bbfb1763f9c1961b63e74e54e 100644 GIT binary patch literal 16598 zcmeI4K}!Nb6vt=XP;-+Y4I&}>3Y{~wSXmcIB7zV)gtsnX6x2DobmGf# z^3XTv)-ebSI)xp~<_Qyn5G?B(75WdXZyjg;@4erSUf#pgwX&B?%qD~oNx$f>OPi-F z9+j_mJ9{tEM5`sw6%XP~cH00@8p2!H?xfB*=900@8p2!H?xfB*=900@L6kjv#dA-4wF zWBI@NSE}v#~7zzDxL1i(NU$R_1I`w{pwTV z5!)7tcw8v`el_*|tS8{T+3W^M!Ez3jJn3@}Rsf%^)^B|D)HsH&qw8~M8_}TS&;4s{ zLeog{5Cs7c009sf6#`$c*EQ7(Fe))24iEqV5C8!X009sH0T2KI5C8!X009sH0TB2H z1h}h2e<9=W!&)a)ftsl4D{b9!_+bU$dtS#>OCRnodu ze(0+Zwl{(G1emPp>xrv-j@|?|0K=&1>%9ZIe+6jZb{IANVfY+4SU3a$5C8!X=p~SO hs_e?S68$eg?`I+3e@t$kZ`n6Y5Qg^>i7{sy6G61`H`p3Ul!VI>j3Tk{qY%Nu&M(kfZ2SR&NLm#XtZgKP z`3q_x*bA|hG%@ZJ3tJ@Fy^VJl;a#}fV|RAu-RCwbGDFUn%T6*enP7}1-C}-)_c^-a zF@C?>-T&ZSY`f&-*%P~DG5dJ-mXD0=71s_Kvr}|g?5aA!2ZxW`#lrAsbbM@P>U!xd z&Db<^^YfJx%gW_yHEw|h0w4eaAOHd&00JNY0w4eaAOHd&00JNY0wBpmo-BwV{#aYMp+^rXQ?#*QF(xy z&_^EyIt|bDx}}n+V}D9VwG< z*uDcBIQUOm4Yr3RAOHd&00Mdhc2+mOz4tvcw=u@lxpIJ` zY-VoL)BV74Ijyy+bEN=h%3kI8Q?H%_000000092UsxQSe%C9rSukNxl@X6@_5$o>^ pRD2a+^__u=(*f?ZGXMa*^#oHqKHCeptw{g?002ovPDHLkV1n7{Ro4Ij diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/black.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/black.rsi/meta.json index 88e3ebd509..c8396d7835 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/Color/black.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/Color/black.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/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-left.png index 5ec31202f101c65de7de1845def08669fe38bbf8..a662396eabbb2b8d64cbbb52f064d06ede9f1948 100644 GIT binary patch literal 16598 zcmeI)K}!Nb6bJCP1#2o^QZYJ7AD~OeE>3SVUL#znMi0dL_`rgYb~pDijOf< z{a$bGRMpAc$Ym^gq%$(Z`?FW7C%Bzm-6aY~`7r4GVnTHW_Uy%UpfMUBpQh)vg-fC& z+1A|3fnlUlrINY=4FV8=00bZa0SG_<0uX=z1Rwwb2tWV=5a?6ju2^jMIn>iI-SIso z(d(kOdR;4kj`$nU+ujxXH|$$)Lu-Wv_7)@t<8Y*H?t_Z^>aJQ|D9 zR5D5NM1l;}By$#B0hLOnlO!iA*_@l__|i=lpj__c$4ix;nndF`&eE@Z$Crq!Ee0=H z>Gyz+nA!jk7y=N000f3XU?zC@;_L+&hJ26%1Rwwb2tWV=5P$##AOHafKmY;|fB*#k ziGXyKs2kf~&C_lEuKhY{`fig+%p+PTb?SLeVbd*X$v&RP?bP0l+XkKKZQ>w diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/Color/color.rsi/inhand-right.png index f9ea9a377af76d25f865013b47d84c8f3e8e43fe..f008e6163145e0df703dfe2082262fe08336ca8f 100644 GIT binary patch literal 16598 zcmeI4ze~eF6vtl_T5aiKTPjY`S)2tCsDX!o=|52KAz4b=yM#2U@I6RF-@Uu{eV@CV?veAAQZ5#mh!9cC$Y)l?JI&8X zNc`UK9(;&bXuFWh&2#$cJkUS@1V8`;KmY_l00ck)1V8`;KmY_l00ck)1iBD-ESK9|x(34B zcYUAr`alD4qi;xc>6q?MtEK85h#%{7x(hU!Ql2oLNYIq7Q!t2i z^lW(++~Gw3Nvp%u;0^*H00JPOPT=A_nv;j`X6mmsnmE>k_q>pBH^r9e~$6L3)>N zC!R(4T|eNa4!}-(r_J>a@VkD%O&vgIvUdMn0SKagpl@{mc2rbsd+Ba_Ubg`N delta 198 zcmccC$oPh;m^$*i>zScQ>Ox zZ}$%Rs>$qDN&&U$k~03$N<*C)+b?g|i2MoO9lE-iQYW*A;d(LqF*-TEyma4q|0bHH zFj(C>cAP??(@{OJK>z{}fB*y_009U<00Izz00bZa0SG_<0tp2k>t2-b(pZ<-$RCL{ za?DOIy|0)(lXbI^FA6X>@6l7&wel2jF6R&Q#y1&#QpD}W35h^(j+r~q06clUOTDk0 zqcgdc1`vG(S`WXE=yTtt=|xq75ZE|}^LW$w0q-*{PkVh$kf?rApijgKwu~Z z+`Qk@YXOFGf|wKpAOHafKmY;|fB*y_009U<00Izz00ah8K&nRg*X$(55v>#I8@5r? z*V$$(F^(tze=c!Gw-=oJLLGTtgsToQ*YUvy<(bzB!gYHrEg&{XGzS1=6VL z>$L-tYZEkXqBf11ei~yY!ofulfB*y_ASuv(t1YO!3jZ&FP;U3^I$wWn-Emx4tOm`s Gozov$Bfszf delta 277 zcmccC$heqkf&HM)CCGLmIV0) zGdMiEkp|@CRE0#8xTF>*7iAWdWaj5FFjUM54l5`s{r)Am;N#aPTHd-^=gyoD-VkbV z(fGk5o%24LCmD)*dUseD2N_>B_EMPhXws2MAqv4Ojp}XH_v>tp=E7BfooFx1_Y7H7RWbr#TKFHaZ85RcB}1PRu~4Pg!fUdCJr)6;`m zGy@K;bKuBp5-3w`|4W&iI#jUuxDGIvi;8s@`Q71tJ2NyR* z`Y#9y>e5{h2M0&vJxd_agrxDsMEDM_2k+AFefjk+L*CKGVy%?ZM|C2~nPp>1jd|`F zO?_UjZM4*&tyW3~-O&+g+3ooY73o_quWS-!2f3%{_;gqW(_3b>n11aY8kozzpVdE! z#>q4a%R8x5KHqGrE6_jy1V8`;KmY_l00ck)1V8`;KmY_l00ck)1Uv}boa>gyR3gG* z{PlF>{N-7_QcQ3Q<1a9Phx?2*G0CrKliS!I`xJF}xJwp`S|9CER9slh>63kn$n(D9 zo431&Xhb5mM;?Pd4}7=4$kZ1-wlY7KZ?BWR1#Expmwk&hUQS|5O3anJ(0}skeg}wx z00@8p2nZ0Ujj>4kEP#LKM;ECL4B95AT965b3U>XEK00clF9s+yS*@nto;r|5? Wa`1F;GBf?wUtl@2STn8`>igf5BfO3P delta 280 zcmccC$heGYf&HM)CCGLmIV0) zGdMiEkp|@CRE0#8xTF>*7iAWdWaj5FFjUM54l5`s{r)Am;N#aPTHd-^=gyoD-VkbV z(fGk5o%24LCmD)*dUseD2N_>B_EMPhXws2MAqv4Ojp}XH_v>tp=E7BfooFx1_Y7H7RWbr#TKUr!gu5RcB}1PRu~4YwKs8Fuebh-nlG zt5kE{!KApxjpLwig20hg47*=w097PRV02{q)NzP`T|g;?DJ$`S&k08zJ{A#!-2z5Q cM;IB_7c+hrXz%pi0yLSy)78&qol`;+0QLrH0ssI2 diff --git a/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/meta.json index 88e3ebd509..c8396d7835 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/Color/yellow.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/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/captain.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/captain.rsi/inhand-left.png index 1e397d6babc114167e547c2c8b7d4b63bcf93d5f..a5a7efc72555e7224af2ac78f3840dfe286bada8 100644 GIT binary patch literal 16598 zcmeI4Jxc>Y5QZm-CYq4O5EPqJK@ibOu};E;@@xdQwu5MM_~~a3(uX%L5dU4+-_p=?s3^;nSE#WVXnCuvNxMeg@gS;A_^O6eNN0V zzPtS5_k3;RUQGU#OiCw{uaoPu1F_P*o?grmg(7@==}f%h z5-jVm9_zBc?9m}p@cr$zF2}(>KZ&pNRB841D(jxY5C05C8!X009sH0T2KI z5C8!X009sH0T2KI5CDNc5l~Unw+ldqAE|XhE67&W^jqb}I@hnWRo0eWC;Z7V`*GWw zAT0y<@Z-b1^GI|rF^$Mu2>DvLYdI#L}CP>Qw4zSfVeO0{)cCa0-wWFrr u4xf%-zz76D00cllC4tS(VnXO=_RPWvJ-@ delta 455 zcmV;&0XY8FfdSwHkR*Qrb5ch_0Itp)=>Px$nn^@KRCt{2+ObN*KpY0}FUHB-JBSfc ziWP;@$;Ca3xV6w%aOmRXCb;?lT`P#VO#%Kp3A|SQLmif@ca#jCwtiKe;^0~0D#sS0Fb;q&HZ27`ekgm8mJld zjFhrGKfd|G{lf@KDQK;swJsMj?@rp*FUv^-CWE#CfJUPMDJ8Vl$dlOX+$t|mVoxar z0FY8bDTN>i;D>)LcU#Dl*O`}8mSxD3*h_^l#j&gU zm0-IkUF~TiA|fIpA|fIpA|hHZwayRNa-APotYL xK$ZD{S~LKtEyh z`Y%MyL8JYc!g9*)DGo%m_wKkK2Hz7sJs;lp>xb9reYpMkY$_BS3=&aDO)Cr9Il<2^ zzxH~uw(+Q){HvLiLN$Jz-ku+7SGw2JOF5#RFh3=+InBrmSHM|8{uy-nDoU~}n;F~nTF%Eg8G&;f z3D7Aj%9mmkeuz+|QlaYShp61s@AZ6)@b;?h4$zY@k8lO>2>OpNKfeeE^s<2SF#_kc z_2BX~td00bZa0ow)Q2eE6t7r^$xF(3pW009U<00Izz00bZa0SG_< z0uX=z1R%fyR`%zu$T>BSp?$)?0z0}tUpKK^^VCf#e(PrcfZhjSbPHUZ{8|^1M5rn-0%_P0(AF$E~&@6l7HA^di2XVW9z_C7nMiHZ*z1WlYVoswTsDl6m mAOHbZ1vYQ)_*MfMzAu1H6K_{{wt9o1C=aJ5v&!Yn%I-IujHWFB delta 456 zcmV;(0XP2EfdSzIkR*Qrb5ch_0Itp)=>Px$n@L1LRCt{2+ObN*KpY0}FHI+N?;uu0 zDOMCpCl~iF;?_c6!J&(jo8amLbgdwYkDx=x(xq@X1uoB!69?ltNJ6x>CT)c~_>ur5yZ?qD2mk+T*3epK6WRDCEStXq0MkLs06@K7hm;apYb4>=>s%`@3CEsN3IHIbgi;DY z5WufBtyzRs@>hQVp!2u~DJ7(o5JDgwkf)S_5CZS_yGUouuuJ;f8rt&~{$rsoA2j(fX0Iv5BEK+Cz yT<;%Pr0^DSy?`v=y-l|4;FRK_Q=lXNN@l8=@E0000>JJMJg-p6bs)# zQdsy1c7Y?J*jV@iaVNO2#RV>#xuo#F;j+uJ^Pkz@&ZU_pm+R$XI+aNYA<|yS-H^RQ z&u~J1KOUUaWtZ6Ti>_$W=kEEwDrZKHOIxQxjJ?ofy&gU6$;o8JTPq~L25oyWmze+A z6=F_!?#kwwWjRi*CRd<=00@8p2!H?xfB*=900@8p2!H?xfB*=9005R#UfU&49OhqZK3t%ayMB=1HHsu>zn|S4|(QIg?)3(Z?oQJ+Yyb<^Hvf zL$fC^-~!KYW_T3Of)00T2KI iHUhSFaV^Ds`dPx$?ny*JRCr$Pnn6oKK@i91;TJG0q$q?8 z6b*XdLAvw}BItt#QgraxrBmQVQK&;;f~6ExP!PPBg$EWU`F6M2ZU67IymfYFe)FGw z9wwr|pD6JB2>_sgzzLuQ0v7--L9_r`AaDX`fxrcTuK-#AEf9Y=0klBi0>D?`PgF2bq28+AmUh=AafG+Sorxc>n71BI0$iutMYMBRxHg={F#B?U!k5qX0HGOGzBZ zl*{E*45RxAaq|4|yI!|T&DOzIE-hB+oWR03042CtO{ARttHWOrI2hPN$>Z?ba&P?e%Cc zZp>{3UHh!b8w0?XRDP|fs-5;a12{ixMZA~Fe)c}#`ymZn*Ipa|2f+QizEx5e-}kk; z4~DlYVctvEvw`c{XN6#-1+qGK!43disDfk+P=F+T7kqz10WMTQG6pC>lD-SRp#T@E zAQ=M`AW7c^-%x-HRgjDU3Xr7lf^R6mg(^tK00l_WcfmIl;6fE7V}JrA>AT?jUnoFl ze!xorCg%sd0$^i)z#9Oz<_Ek0U~_)J3jj9f2fP4aV*cQ#Pp&rrZ2e~d09#~zITs4> erBb%y`~(ycdPh(*W37t-00005f?WV9h_8jaB=D8EI7L<9sCAT z!NF0S1cySYR1_CK!I=jhWN1k)cfG6dzvG&ayuA0%?~*Qg+{Jn+ACIMCjIp>?FgJLa zp{GB>e=7&aHC{w^i+PjTbYI`!T=JHIqr%n+V?&Sh7*B_{d%Q7vYOUp>pS{WC;_Sox z+zVsV%raLt&kQ4zsaClKE)W0#5C8!X009sH0T2KI5C8!X009sH0T2LzHUv_WX}e8V zS2XMB>v5xeVk+&%JaAhbeaZk9mX_`Dv5~+h^vR5ASrJ)sJ~})oGY_@j z(MJ$I8g{ejPaI2j%=oabD?YGcmOrVz!T`@oWMOT%-v1K|w14Pqba=P*PaC}w`3{oo4I z)4g6L<<M>_As#Ix4K>#Vt0@yloPa>G={BSydWGv2tR=b9)H zq&I!CQ=gprk&~Z~p0B#AH?`dRO5S$gU5cImT$RqI8CO+SPffAE_dH}}*wR-#2^Zdb zKRSG|dCk>VrB?ZKXEsd;*{@PxSW_fbSo$+c|4F9NT+Rl+<;v&3WsAQ0R#hTk=CjR7 z>Mv76yGz|-jjMgta~WgewlKwY=l(C1`%tsN=)EQRzanBBZi2L>_ zswSV+VU2cYopI=uCQgQ^Cu@(iGOr17@@AJ=;Cjz1#^QjN>XwoNj8KVsoHFPVYmP8R z{;O9IY)CzKf2-DOsd7yQ&vW-*X(^SE<9z4dw`~U@OlOy@O1Ta LS?83{#J~UmS~C5A diff --git a/Resources/Textures/Clothing/Hands/Gloves/combat.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/combat.rsi/meta.json index 1ad417f8f1..466cbb11c2 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/combat.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/combat.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by OnsenCapy (NamelessName on Discord)", + "copyright": "Sprited by OnsenCapy (NamelessName on Discord), inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/fingerless.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/fingerless.rsi/inhand-left.png index 8f8953d6350a9eaafc02aae11628dea79f4f41c6..65d8a0b29bf5ca2ee1f38dce2898b51761a0d846 100644 GIT binary patch literal 16598 zcmeI)zfZzI6bJBEe}DpA1QMf5!@%mm=+J74&=3g`7dPYPV4~4PXEy%>W86&~*cp`3 zi8#8MP9`RGYWI3aQo;a9fp^I8ZBj~_>-UvUjxO)g`$oN@r?yf=q&rpnNE|J>uO-Ci z%lXxpI3&($6`Nk^ffDK4-Dh!T{jz#;O_a{cU8BdRO>r`L;~bWgKg;Y11Rwwb2tWV=5P$##AOHafKmY;|fB*y_Fr`4LR0^lOG}dJ*@|R*& zjycHp{g@-C8>S+k6+qW@GEGy-EReY}pL<*349sLQl*{F)*=&Zc>r$`R(`L<=)7~(Q zS!2dt&k7I(!JrV=bd@=t=k;@k^9O|%?Td;BmHdsWau>}H_X7b4KmY;|;1FnE2Nhkqr7oPjykLW z#bPm3)zcq^z_B)gtyM0kqspHCC;*PN32XrW(bFGZJHYXG7==9XIgSU@Bt_?4Z<2e% qSO`D>0uX?JDgp1k@GG)w^1T2|HCDeH2iw_Be`%^yuG{VX)7Brg_;RrT delta 178 zcmV;j08RhafdS0{kR*SUNkl<2`LZ%iQx-N8{mEpKGMNn3>vgZw z=}^1f)?|rE0r;}&cDwy?T-TM27is@!enI{YW0Mc^fEhcWqR#)4r=r`(un>R%1Rwx` zzQEV}&*q>O03;BA00bZa0SG_<0uX=z1Rwwb2tWV=5P*OZfv~ovRLwK-R=G%T>Kl@R ziB!$=Cx9^P2L^QjmSy>>1rT@+o26Uj!^n{fz8u4@9~jgD@LB+d;Z0HpFp{$HG7vx% z^#e-l0E9e}4pk2((X?UDC&~lu5P$##AOL}=1>RCGuPlc$e=oq4a@lTGQjOXNe**zI Lg{u9$cXaa$(nfE| delta 187 zcmV;s07U=RfdSS5kR*SdNklOz4tvcw=u@lxpIJ` zY-VoL)BV74Ijyy+bEN=h%3kI8Q?H%_000000092UsxQSe%C9rSukNxl@X6@_5$o>^ pRD2a+^__u=(*f?ZGXMa*^#oHqKHCeptw{g?002ovPDHLkV1n7{Ro4Ij diff --git a/Resources/Textures/Clothing/Hands/Gloves/fingerless.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/fingerless.rsi/meta.json index e47f13296a..9979997cd6 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/fingerless.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/fingerless.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/54ecdcc05bcaf335489938b1253a2a733ba12271", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/54ecdcc05bcaf335489938b1253a2a733ba12271. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/fingerlessinsuls.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/fingerlessinsuls.rsi/inhand-left.png index 8e8542213fa3db8e812f443ec113ca7d350115ed..82f010226b47a8220628b3e663085115bfc0a50e 100644 GIT binary patch literal 16598 zcmeI)u}Z^07zgk#Dyd%Sq6i`sd<78{u|t%UHWZ79i<`JPX;n}h6+!U@N^x?jIP?Xi zbkNbRjt*{pfeb~6cacCT9g_6BsO29>(}v6cyZmx==pDV?Di<V^mKGhkYozAXY-(A&+ z7Ra&Jcg_vNvRWbhScTgGdqBcBz(6cgmVk(N=Qa#jAH-c%<&Z^_@ehO5d6GIijxlD@tR%2C^Y zNL^R`gg^Y|5Bv5{rphOBhY!`6!1d(&`=~3ozYab_00Izz00c%sVD<4c8>|Hwh5Nxh zKmY;|fB*y_009U<00Izz00bZa0SG|gp9my1rNvQ)b*emgK04;~gY4cTM;%sxX4UkP zoYU92HlY_f)O$4?bIBEy1h%yTzcHt;V{O79=t$={zL=sEOuAl_zM(AyAOHaf kKtPwkbIxeU?2`Il0Hzv?7ss8-&Ec|&bMj@ov9Wjg4e|k%K>z>% delta 277 zcmccC$heqkf&HM)CCGLmIV0) zGdMiEkp|@CRE0#8xTF>*7iAWdWaj5FFjUM54l5`s{r)Am;N#aPTHd-^=gyoD-VkbV z(fGk5o%24LCmD)*dUseD2N_>B_EMPhXws2MAqv4Ojp}XH_v>tp=E7BfooFx1_Y7H7RWbr#TKFHaZ85RcB}1PRu~4Pg!fUdCJr)6;`m zGy@K;bKuBp5-3wkJ zb@trYKkTxdzE>&P)TBD;=E?Fs8_6G(w`)Y^G~YD3x}If&xnpO&m~+QxrsnhZ`^_TJ z0y*~T)~TjhR;$G#@PGgWAOHafKmY;|fB*y_009U<00Izz00aaAkGDo3IP@omc>LfZ&+|-I&PyqEr&{`golx=S0Tx+bRf_`diYIM`l+G;1?g(D*JJW zd`o+`Rj1RdimZ-x4``W|0GNbn&mnqbOUQ~j4ZV_h6hf&c^{009U{ z3UtlO*RU5r@)U$Y00Izz00bZa0SG_<0uX=z1Rwwb2tWV=Y64j;OQn@ZdZ}E*5@&s0 zG}o~4wDSB4Aj|%Nun(YF*OTo97^W^d#&5@PO+NAF1VPd`eE@=~28JVh1qPzOUyP!E zAk{vApDt2nEUhmlQSPksiR!>O1Rwwb2tZ)e0v~604OT;i|1Us7wYdI~TibbS^XZ&o K)qYspJ^un^2AG8a delta 280 zcmccC$heGYf&HM)CCGLmIV0) zGdMiEkp|@CRE0#8xTF>*7iAWdWaj5FFjUM54l5`s{r)Am;N#aPTHd-^=gyoD-VkbV z(fGk5o%24LCmD)*dUseD2N_>B_EMPhXws2MAqv4Ojp}XH_v>tp=E7BfooFx1_Y7H7RWbr#TKUr!gu5RcB}1PRu~4YwKs8Fuebh-nlG zt5kE{!KApxjpLwig20hg47*=w097PRV02{q)NzP`T|g;?DJ$`S&k08zJ{A#!-2z5Q cM;IB_7c+hrXz%pi0yLSy)78&qol`;+0QLrH0ssI2 diff --git a/Resources/Textures/Clothing/Hands/Gloves/fingerlessinsuls.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/fingerlessinsuls.rsi/meta.json index 16c9e9e5e1..e2155c2760 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/fingerlessinsuls.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/fingerlessinsuls.rsi/meta.json @@ -1 +1,27 @@ -{"version": 1, "license": "CC-BY-SA-3.0", "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", "size": {"x": 32, "y": 32}, "states": [{"name": "icon"}, {"name": "equipped-HAND", "directions": 4}, {"name": "inhand-left", "directions": 4}, {"name": "inhand-right", "directions": 4}]} +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HAND", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} + diff --git a/Resources/Textures/Clothing/Hands/Gloves/forensic.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/forensic.rsi/inhand-left.png index 32c0a01435c2ec9f8a7cae9b7eba12167d915c88..485c15c526702b87ee98ba0581baf8482b755311 100644 GIT binary patch literal 16598 zcmeI)KS%;`6bJBUR;J-_MG;P|%{BxLU7_eD$@OPxiD-#vDQswtmS}8B8d@r7Xl)8< zZ)|RemRf`;bi01<;N-vq(R)9Y_@12iivH2@J$_tcM7=-IsCeQy1P(k;s^Q764B^5?-43rO{tTyBWooa`;1PE#pmYB))vt; zS((L+<4D9bD;0GGHV8lf0uX=z1Rwwb2tWV=5P$##AOHafK%heb=TiMZr*YGfKOkCf zS~RUWOm}|sjP0GVZQF5P^gIQe%lYk9)cR`CC!k)h)9R^BT&&dN$~m0JxtuS(4N3;q zYBe{Gi>+3xYWy5J-n?BPcG)csTx?|r&oeupu{&A;y+V7j4 zNjtntPNXAKvOZ)%00IzzK;H@MFYg-OT7bSQ4h2B~0uX=z1Rwwb2tWV=5P$##AOHaf zK;ZuhNHs}Y2}#T&+9_@n+^wE|x8`YluoeTat*xV{A2hYZ+61vDz+EJvz7btL{U88| zwFzRaacLx6IV znYaR5N5`voH{R@M>OHIX;2nb{Q!#6V=2Fi~h2?jiOBd_a3fsu`&Cq=w;>l2EC38}F z{{q$>`F`KH>*W{>qR*YZyLJlGGd6E)R;i^TG3Uki)Yn}|+ZL&xzkbV1-sITct;qpL z_gk=4t6+C5J|7wXWcV_B;r?ZNr6qp#KR8gdpt8>NGR3dFDmiPhUrhrd>0v8|v0SG{#Q-R&vl~jE#K&Nfteh5GS0uX=z1Rwwb2tWV=5P$##AOHaf zK)_a@-3dwCn;jIo)sJ+hSentz`FU&SUiD+`Q+Dp<`T>=70J8jiU1|9=dnq52o15CfNZ~y=R literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|R5J zr;B4q#hkaZ))pOd5OLdod*zCidloSr4ly>JI^F!?%ZkY^*GewP@-S@_YQ8O{75#2f zqrT?-i?e4=o_zLv%Jr|Q*D zseF6d?%N6K`~*lP-lKo}nM*TnM&$p#e^T$~-M{SHs~aLE UvBC2KFjg2mUHx3vIVCg!00;`VumAu6 diff --git a/Resources/Textures/Clothing/Hands/Gloves/forensic.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/forensic.rsi/meta.json index 615c803ae3..dd7bbef87d 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/forensic.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/forensic.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from paradise station at https://github.com/ss220-space/Paradise/blob/e13af16eec39b663112e014901960c89fb09ef8b/icons/obj/clothing/gloves.dmi", + "copyright": "Taken from paradise station at https://github.com/ss220-space/Paradise/blob/e13af16eec39b663112e014901960c89fb09ef8b/icons/obj/clothing/gloves.dmi. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/inhand-left.png index 50f6b0bf38f72026aadea48f76fcebf66254d6cb..db9d5cdab770a3f96c1dfa4f9b6071c001c458e7 100644 GIT binary patch literal 16598 zcmeI)u}cC`90%~9S>9#16oJ){6rHF9qjjw7kid9 zq7WsclXE$bClV@(0H009U<00Izz00bZa0SG_<0uX=z1Rwx`76meikk#U)O7LZ2g~TRK&APA<0{U($nAtp>?7O)8u1 z=e0c{w*bR1tZ-QN$B^?l*KKSZhX4d1009X62&@+;wts5@fC2#sKmY;|fB*y_009U< z00Izz00bZa0SNq?fYc(X+l2pX9JhJY9apiYUpI)|Au*2VO7UrK)Kayk?*t%Gn;-_j zuj808RI3$Gv8L|?AW@qj2B3OP-w8mXHbJabpc8BQDrys)pquXN#G1Z}+JvTW7$-si n0uX>erv!FyclPbEQ~bXGLUTCr9%i+N`xlN&#?sNtsm0B2N7}qc literal 1141 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_);T0(|mmy zw18|5AO?X;!IOa`XMsm#F;KxA5N2eb5_}h^^+;w&L`j6Nk5zJhu3lnFep0GlMQ#CD zmraEgkeQoWlBiITo0C^;Rbi_HR$&EXgM{^!6u?SKvTcNB$#pV*Pp+;%px|I)Re$>-#L_9fj~vtRXvvRLG`&5LX1`K-#m_~+N=rkU?ng-2US8~vL8 z>~)6erzsnIPkwslc+Ku`{F}g6@pD!$-5|E7=FBhS#x-YJiq=`A-@O_!dF%ZTGvg<1 zUEpyn|EqPx`x75FRFzM?uzqKxeSGD&)9K$|^hW*tCzDWgH~!}1WanvL-e>;0ed$*z z!}*WwStYx_+trM@b{D??U4MRN+HH$HQ;hO69&L=hEb;37<$de-|_EVZl2Qe%Z}&n$*PtbEp1!uzwM>`1kbH34%hCBr)6j6 z{(b&yx6OttZ<-kYZ2K3N#prEYRT*Qo)Yd9#ZGFQ3A5;IBtvn>gqL8?-{=ue0-tWBl zkEZ;M4ca<;?RTCfuiqEty^}QfE_6fJ?FB2N07GNF`vdNap^VcRs#7IES>Dst&t;uc GLK6Uyf3VR2 diff --git a/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/inhand-right.png index 79447035348b73609aca01787261a96edace2a07..973b1cce98ccd1de5b24eb7efcce10d77e82d604 100644 GIT binary patch literal 16598 zcmeI)u}cC`90%~96?Q5vMr1YQXloESS|}=#R5Vmmw6z&FxHQz(5MpQQh*ZU0zE_(N_^G@V@a-Q71d++-`cQ@S+_vQDTiCC69e|h?JeNr+5az4(P((QBB96Qaj9p^nUUpt;hdaT{!E+!0SG_<0zD+~9+=)YY5{s^T9^t1AOHaf zKmY;|fB*y_009U<00Izz00g>8!0HRh|7Lb;9O;~P-p@-9B2MVkIHqrk+l6(re!!>$ zI4e&$`VP<*fEV=xMjgOZe3YDg9Bcu2Q9od(4xruLYaBDJ6)+k$Z@s7==vW;<^TcF+ ydr?1tIslm~gticX00eqkVEgv_RZK9?{|n&IL~F-KrPYN=jl0XG3#qHwwcS5==)C*@ literal 1145 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_);T0(|mmy zw18|5AO?X;!IOa`XMsm#F;KxA5N2eb5_}h^^+;w&L`j6Nk5zJhu3lnFep0GlMQ#CD zmraEgkeQoWlBiITo0C^;Rbi_HR$&EXgM{^!6u?SKvTc`|bH3&)~f6-U<%7u`G+AMZ2WoukHXZK&u-Zc4a*v7=9zpGeB`js!SdB;LyrtW3;dQ~)QeZGCvwbSo*K1fSZpZz-X z*}QjR&SG&nX(bgK*SwkcEGGPlzOKopvnMudr2qU9*(hdJly{^_PdlZw&f;}f@U^+? z+Ik}P`r91I|0>z-VIm{6vC_Hupu+zBo*CD#$hd^h`*n0v{l`4=)8+_UArtebD|&Mo{cCnq%R>qV_g*Hd1k z^5sOY2|xS7;lcCy_m*E{|IHlLrg_<9nf{%`Rj+Hmco*(E_WtvSgVexQLoWVfd|bOO=D~#e1y>(m+7@kFv8HBD>yNZ2D>ME(L^2BeWj@XA zo8xS|C*sKR^1?fJ^rRWeezJRgvdL4+a<7fKR9~><7yFuhO4C^xB>x{Qy=5<8{FDEU z$Eo?}Jtbvd{{JXHAzs1eR@x8#2l78Ymn1j}Ff{&mdLaGo9`n*`D}q0Rvc0FPpUXO@ GgeCxeW}_eg diff --git a/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/meta.json index c79b379182..bb79cc4ae6 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/hop.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Drawn by Ubaser", + "copyright": "Drawn by Ubaser. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/inhand-left.png index 21fe32a5c522a2cc3c6c6d5a7849c7cffaadbb0b..cce8c409b8d9578c5e97026ea005e14be70ce5f1 100644 GIT binary patch literal 16598 zcmeI4u}eZx6vof1c-9jk3L%=BT^nt9)f0V4uaE}YqN%o|pyrwy+9g_Q2^#tf5(gV| zZEUWsNl1d%JrAxpD7@@k75Oe)uUzi?&N;txb?_X#+6nS0XW1d5lwa^lYIS+e+UoW3 zsPe8B`=FTjs76(?lV{lnwKI2I*gGLgF7mYK=5|SKCQkjWT;g*&y^x;&C_jG_t&s1n z@19$h>(=Y)1O^Cz00@8p2!H?xfB*=900@8p2!H?xfB*=9z<>lA_f9zAqp=<{p+6PN za?C^R)=$ingB>%WFABhRX2?XA7#HiZzVr}RT+6f~XE|G&hi&V>4%e!76gca?yz%ek zV?4rF3d3+Uno>7`b+jhyONTG|5$I&7*(A=G#E5j19*>T`gs>?M&X`p8wT~t=wKi4| z009sHfr%vW1*xoRl<%a04{5DR!r3Ny93wnC3+LY0Cd;%wS&W0b#DUOABMfYHaPPp zYx=zmOY|m)-GEWl^gF!+g1rg7K*!$WTOjex9NVBeI0~D8@egM~00ck)1dI^4E0xMh bxXAwtAY`DCy>4Dsw*!{*bAk7?v48Okf$p&k literal 1287 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_);T0(|mmy zw18|5AO?X;!IOa`XMsm#F$06fED&ZCw^H21z`&f984^(v;p=0SoS&h?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6 zGOr}DLN~8i8Da>`9GBGM~RsBTId_|A5Z7NlCUU$t=l91qU45Kj08_%qc+?1*r!G zK~5$pWUX=%^U`gVDs)p)(-KQ_N|fx%@^cciN^SHZYEbn;L{W{j(Z^!D4am<{kwK}& z`8lPaP`5KOGqC}O1d1pk{2@9bu3q+g>poTyK6e)E=l0G=_fob24 z%SIobkLGpvlKi(^OyP`8^+8Q`3%Cg>2+r`TY6P z)tgVB+kVdb?a^X1TQIo?{8a7u(i&yke(cM!z4rA}D{uOD-V56nE_%O< zH*|Xb$+-RVkN3Uz<++y-f5684+yD39_+Hf1@U=hrDWM(pY0piO3!f4f++F;n;-nh` gBa46okT}BmdKI;Vst0ML1*4*&oF diff --git a/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/inhand-right.png index 98bf0b33b5bd5b32fa2c701a3ed1c23d4829e735..72de62d258af6c5252460da01d37ffc5c85be7c3 100644 GIT binary patch literal 16598 zcmeI)ze~eF6bJAZm8dC2@COtpT^w8;l@c|j4aF+r;wDbIDGEBfIk*>baw&-DUr;(I z4q{eEXT`nHBF1~wD20?HmnMzy4O~Mnm%H~qxpwFsJzXp1)7qp)L}{~Ntc$bGWk?mT zSG)T!;-qdD^9EI^Olsz^1MpUE~d(?nBb z8jBmpilXbanrMLo0uX=z1Rwwb2tWV=5P$##AOHafKmY;|=pb-+so5PaC8Am;zP=!l zH|rlkn#bN&CO+Q)tgC7Ru_qN|K#niyEbz>zT2@<$FU;2I{+WNLPWHiZG6K(r<(;My zI$G|`w&%Xf6D9gPz!vd2vHG0}o*w}gCCh3-CVd9{#wX%!#U1+b|8&5benq=Arffg| zDOTAWaUTRA009Vi3S{3$Zk@dVo{iA}0uX=z1Rwwb2tWV=5P$##AOHafKmY;|kP(P$ z^(d-wJl6@mP-NEUz4~;!9@RLZ0QjlIwSU0b2f$1BZa}hiQUDwTC*Rf8SRWbicnr~P z1Rq1UH{s-+HF;j2Z@(JNJDGg|ej<^Y0lnBi5ZOKeKT2+GcouMRyB1YlFUE{27xW7O p2tWV=p#&bS>xSr{$o~rvs-wS~A1Y^-zWVvfHD<14+$?RKd;tw!vV#Bs literal 1283 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_);T0(|mmy zw18|5AO?X;!IOa`XMsm#F$06fED&ZCw^H21z`&f984^(v;p=0SoS&h?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6 zGOr}DLN~8i8Da>`9GBGM~RsBTId_|A5Z7NlCUU$t=l91qU45Kj08_%qc+?1*r!G zK~5$pWUX=%^U`gVDs)p)(-KQ_N|fx%@^cciN^SHZYEbn;L{W{j(Z^!D4am<{kwK}& z`8lPaP`5KOGqC}O1d1pk{2@9bu3q+g>poTyK6e)E=l0G=_fob24 z%SIobkLGpvNCi(^OydnP2eSB=b=aI%yc19Kf2L@CkK}*43_5JbKWs9HxOZ|N7&g|e@N}qOibZD|2 z)ZKSJ+jza>g}|k|`uu+0=FDTi5xXJiGmn7Y=NaW^`Bo$?Jgjup*Y)}FSF*MHx9oAR z4v)2=eGOU zz31OvyKY}&-kaYSS-)tWSy?VoI9IFo`*FUdHJx9=4@^Jt-Syb@wXfIhR(cZ6=;8ZWAWv66mvv4FO#q7-p4|Wd diff --git a/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/meta.json index 14008ae27b..96668939bc 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/janitor.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Drawn by Ubaser.", + "copyright": "Drawn by Ubaser. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/latex.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/latex.rsi/inhand-left.png index 5ec31202f101c65de7de1845def08669fe38bbf8..a662396eabbb2b8d64cbbb52f064d06ede9f1948 100644 GIT binary patch literal 16598 zcmeI)K}!Nb6bJCP1#2o^QZYJ7AD~OeE>3SVUL#znMi0dL_`rgYb~pDijOf< z{a$bGRMpAc$Ym^gq%$(Z`?FW7C%Bzm-6aY~`7r4GVnTHW_Uy%UpfMUBpQh)vg-fC& z+1A|3fnlUlrINY=4FV8=00bZa0SG_<0uX=z1Rwwb2tWV=5a?6ju2^jMIn>iI-SIso z(d(kOdR;4kj`$nU+ujxXH|$$)Lu-Wv_7)@t<8Y*H?t_Z^>aJQ|D9 zR5D5NM1l;}By$#B0hLOnlO!iA*_@l__|i=lpj__c$4ix;nndF`&eE@Z$Crq!Ee0=H z>Gyz+nA!jk7y=N000f3XU?zC@;_L+&hJ26%1Rwwb2tWV=5P$##AOHafKmY;|fB*#k ziGXyKs2kf~&C_lEuKhY{`fig+%p+PTb?SLeVbd*X$v&RP?bP0l+XkKKZQ>w diff --git a/Resources/Textures/Clothing/Hands/Gloves/latex.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/latex.rsi/inhand-right.png index f9ea9a377af76d25f865013b47d84c8f3e8e43fe..f008e6163145e0df703dfe2082262fe08336ca8f 100644 GIT binary patch literal 16598 zcmeI4ze~eF6vtl_T5aiKTPjY`S)2tCsDX!o=|52KAz4b=yM#2U@I6RF-@Uu{eV@CV?veAAQZ5#mh!9cC$Y)l?JI&8X zNc`UK9(;&bXuFWh&2#$cJkUS@1V8`;KmY_l00ck)1V8`;KmY_l00ck)1iBD-ESK9|x(34B zcYUAr`alD4qi;xc>6q?MtEK85h#%{7x(hU!Ql2oLNYIq7Q!t2i z^lW(++~Gw3Nvp%u;0^*H00JPOPT=A_nv;j`X6mmsnmE>k_q>pBH^r9e~$6L3)>N zC!R(4T|eNa4!}-(r_J>a@VkD%O&vgIvUdMn0SKagpl@{mc2rbsd+Ba_Ubg`N delta 198 zcmccC$oPecyYZ^AP+!+?y)qqLD;|h@wv3o>AL0 zKifm<^<-uJL2W`yg`7<;KMpUC_SKP&wfy`BQTG);t?Sj}WpyyT=}czBmDYHCAaPG0 zDWXAg?9AMjWu?=ll6nUk1Rwwb2tWV=5P$##AOHafKmY;|fB*y_@JE5nsQQ7HVZp}y}l9xPw2n@6&A^T(3p#=3}NQ6ev2 zH`9NHmN)tfx$OE=M5;NrP9yz*ylUuVysGB+#?Fz2L0{Xr_5#E)akK1Rwwb2tWV=5P$##AOHafKmY;|_~!zqs>MI2 zEzyr?ozNSgWRcX%4BATcBMLA(POhn%eh`4f+61vuIoI^7ujXp{K>*&`0iCr8VgNiq zlQsPy0Ex8;Vz)peYWn`Q1OEPlu5vfdRDxkRyKqd`Uz>RCt{2+Ph8yK^TVNcSXerN<LzcX8+ka?M|^Dh=_=Yh=_=Yh=@eYFJb%= z=C|s1?0GIiJshL%jeDV3BqREt;_HxU?v zsYRkG(zVpuk)o(-xh!Vj009sH0T2KI5C8!X009sH0T2KI5C8!X009vAgFtFt`~cU* zhZ}t%C-HpNoy_)st{Z)}0WjU!asPvI;*s?^eG2+z4i*yBhz%3PqC_)evf06o8~PXm zKMl`SQe=vx0N8*Le5EEc7wkCeGa%UA4$>`9`ECYPdT(BLmJEeL=B2!KFO5-5J0zZ$gwJqZ9og8&GC00@8p2!H?xfB*=900@8p2!H?x zfI#O7IL*wuRn#dz(mbI|u-$~D%#LilQ-0b4z^md{{eV#iP)K^41GJSYx2{eQ^#i{t z@Gm0vZ>J8xs=L*_D*$ZB@A?5ZbpWjbw)VN&0_HrtIX`bT?&ZDNkJ-PMJ{;K!qJ98% t0FIUjlR*FkK;Sbai9PI delta 420 zcmV;V0bBmofdRY&kRyKqgGod|RCt{2+Ph8yK^TVNcM-%0N>mUN4ju|(VQ0ZT*m$iL zHWv0qufSkTOb|7=QBDCt#$q+7K~@ebW4@=`&CKMR**}?Le-IH75fKp)5fKsjB%j0N zbC|!*F{(lNgZ*Ca=e@xPCpde%m`nm5>j0RObDSSbIw8a4|L}j1&tbOH@YI3TMYz0! zOdKBSkXrV}6kRBkU>Xl%l>EWBiJM8t#(Rsk+7J#wwb`2t&}_rbIxt1mFi!qpG>gfk zp!)P|wCmclJ->*Eh=_=Yh=_=Yh*-kr{(-*z0e)=nA9!!5 zu(tOP^z*F>u)Tj^5Z?o^y??+@z;A%<{R4i!Rid`{4@?|{{=bXJfAj)r-VzZJ`qE~98^>vtx z{2^bJeNJk%K77s$Hcdu8E5OWbRLHnW#6`K3&pk#s10$N&iKE5R)iTXTrPusiE^g_% zD#oL#aPoW2bRW-p2fVl2okh}OIfrxdl+Qg_0p4D}z60p0aSV5kJD($4N(SBj+}{H- zGNqh6LLmSF2tZ&^1fDjI7o2AS24ziH2LvDh0SG_<0uX=z1Rwwb2tWV=5P$##{(%5@ zm*_h(jykM;LT8~ediqYbd&^OWwN+lJW-V%FQfJpR-Ak48H$6L`>j|q?y9?ZsXS)Na zr|+D+jGn$1A=M#l`Y2F+uQ@;MV*{WNFUKYIH8 xsQD+DC;|ZpKmY>W1kUP5^Y;6B`o93(=KbQmgY(UsVsW}jhZyNX>Uybk_z4Mqh3x?qcl>f<&A~=j7OP990Cds4GfG-EXa%k$Arjv^SK|k zFO02x->yBcLeTZx=j2s-+qCm@Hu5NR#azFhd;6aHi@J7~dne+1quC}LJ<9n)qH41t&i!lmnJY4{4(L$^Pgg&ebxsLQ03J|a_5c6? diff --git a/Resources/Textures/Clothing/Hands/Gloves/mercbattle.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/mercbattle.rsi/inhand-right.png index f1c3af4ca2d69bdce0aaaaf559bc946cfc4aef3d..a0506ed93885f811f4fd449813c2e630cb3fbda9 100644 GIT binary patch literal 16598 zcmeI)F-yZh6bJB&O4UHR*amcRaM9VxL87FzX|YIgQ51@}I9bs_C&8_tlV89^6bBK9 z;36FyT>K2(ExK4#aH;o@gA5IqTuf8ppV9{IF85x3Njmf$tuL4JhCZP)#tf%mSNPtd z_ehF=UT^O<`7X6t%G<0%uk(k?Gu|>SWKLWj8KcKP>AT|JR9o}1?4-!yyj5m%qzUq9Dk4vH^ wpG3^aP?!J$5P$##;t-gs9e(q9OZ2}0e>DF^bM0%cesoLIIk~cZvsgX;0qA;y*8l(j delta 259 zcmccC$T*K_f=c~UPZ!6K3dXm$HVPgx;9(7L_MXZb(fIfH2`-%pT~dCn*5aE^HWpXv z)!O}h9yvFt%e8@lk%@&vK*0ft(b#t2abdmrw&k~9ovl1u<0uk4E&8SIyp?;O&zv|% zvw>r0?)pvZ&YxbxF;V-I>$!PT*;dF3O#c$|VfE(fuZ2qK=e-zvPJC;*@j2)172E7p zSgn9s`rr-IX1}iLd#a`~xuP;Nk8XeUr#fFkq3OEkn~ByBwHt2!mpoB&-Qd8)f08F0 gES$k^^wapj_;Iq`XC~Qq7Z`xR)78&qol`;+0QHS)MgRZ+ diff --git a/Resources/Textures/Clothing/Hands/Gloves/mercbattle.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/mercbattle.rsi/meta.json index d24811cb10..700c23f8a7 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/mercbattle.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/mercbattle.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "modified sprite from Jackal298 based on the sprite from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e and paradise station https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/clothing/gloves.dmi", + "copyright": "modified sprite from Jackal298 based on the sprite from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e and paradise station https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/clothing/gloves.dmi. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/inhand-left.png index 3e6dd319b4be307238f127fb06af36deddd1f32f..031a703895469ecc70438c16da680f8b0beea110 100644 GIT binary patch literal 16598 zcmeI)u}cC`90%}s6`BX-}O*Q`c1?gl3t>fxFMpwj6Qa zAIjA?cNaM>f00Izz00bZa0SG_<0uX=z1Rwwb2tWV=0R>8>v=eZsuVFIcFZjyr zvs14(@Yyq1HyQC+0k*aiLdIPpE{aR>x!V$Fz__Lj!_j2vZrS#$5;lH5pK^3v6)Oo< zc=5x=939X41bp@T!%5O)Ih%L!6n`#St!}dZ7;?v(3q(v30uX=z1RxMXplaU6ytM!! z!eA%_AOHafKmY;|fB*y_009U<00Izz00bcLHvw7I;@`92$irGF^(H8zrtifb-E-t& zEtOM2^YddcENk2L=v3u=rnLjQo^~3I=fEX-wkLpU`rgIMsOgU*q&!qcr>_F#AJ=Ev zF*X27^xrjoS!)xfp-ntLtD63-@=k=n2?#&{0uX?JWP#O_?uMJ9K>rKCl&agxpOq_} OZwhB+i^k(_>FNjlTXE3< literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=cRgJkLn;{G-ZJECHsE1!xV2SS z{)PCD|HeO@>?qcl>f<&A~=j7OP990Cds4GfG-EXa%k$Arjv^SK|k zFO02x->yBcLeTZx=j2s-+qCm@Hu5NR#azFhd;6aHi@J7~dne+1quC}LJ<9n)qH41t&i!lmnJY4{4(L$^Pgg&ebxsLQ03J|a_5c6? diff --git a/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/inhand-right.png index f1c3af4ca2d69bdce0aaaaf559bc946cfc4aef3d..05819ee096275c472e0347cc504f275403e6ac49 100644 GIT binary patch literal 16598 zcmeI)JxIeq6bJB&N^1k@VjIw@tIp0+C8bS^RYXCzB7!)n=ui-cx(Pbz;OM3}I5-3s z>CnMNT*OTUM~gaG=o;@K*_z}M@=@WRk{;Y0_ul=Qc6mn+=c`3U9+MekieAzdc$=qt zIKkhqHn!h*lUS`3HD=Q5{O;m}_oTK;D?5y(TXakJo0n_6Gr6nJ7Lp%>+3aX;eed~& zu^iL2>BYJv<@3!ZpMeVk5P$##AOHafKmY;|fB*y_009U<00I!O5vbLsOq-#;==PJ} zfS1hM?XH*Uk%}@w`4Ix;8~D{|EcNvdpta%ulBbm~S_nV@0uX>e7y`?w z_kHUuKp5*|O$a~$0uX=z1Rwwb2tWV=5P$##AOHafK)`cl)-RdY3b1G#p+c$CVt(rL zPV3o?g%!uORBo3L_0y+9RawJunib3#odZzSzj((-x2`2{(Wt%v;y6EGodfv#>@tck zat=TQ!S`1n>hlAko&yk(>NO|ox_s2}dhHo~5P$##AOL}W5IB82d*yjl=zjqM%IEv3 SG}n^rH?*8ysA|_UwS!+`*>T?h delta 259 zcmccC$T*K_f=c~UPZ!6K3dXm$HVPgx;9(7L_MXZb(fIfH2`-%pT~dCn*5aE^HWpXv z)!O}h9yvFt%e8@lk%@&vK*0ft(b#t2abdmrw&k~9ovl1u<0uk4E&8SIyp?;O&zv|% zvw>r0?)pvZ&YxbxF;V-I>$!PT*;dF3O#c$|VfE(fuZ2qK=e-zvPJC;*@j2)172E7p zSgn9s`rr-IX1}iLd#a`~xuP;Nk8XeUr#fFkq3OEkn~ByBwHt2!mpoB&-Qd8)f08F0 gES$k^^wapj_;Iq`XC~Qq7Z`xR)78&qol`;+0QHS)MgRZ+ diff --git a/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/meta.json index 0399579abd..c7f9e741b8 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/mercfingerless.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "modified sprite from Jackal298 based on the sprite from tgstation at commit https://github.com/tgstation/tgstation/commit/54ecdcc05bcaf335489938b1253a2a733ba12271 and paradise station https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/clothing/gloves.dmi", + "copyright": "modified sprite from Jackal298 based on the sprite from tgstation at commit https://github.com/tgstation/tgstation/commit/54ecdcc05bcaf335489938b1253a2a733ba12271 and paradise station https://github.com/ParadiseSS13/Paradise/blob/master/icons/obj/clothing/gloves.dmi. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/inhand-left.png index ee69fc8b33ff3a80a029dc0e02082733536847ee..3d31bb99507dcf5865a209186aff9c2dc4d4b988 100644 GIT binary patch literal 16598 zcmeI)ze~eF6bJB&LaNp3Vg>6WIJoH4rJGSwnoumFc5w0sE>0?Ta1wvu;N;*xpdcs? zF3wWKK^G?{2fGML!NtFz-YZ-QQc6tUHB!D;+6&3$-MvrK=^Z_u&1GWIL{tb7a~*q5 z_7=UnO!;}ezEzT)xth(`qC&5;yUSB~rhC&_+!mtmf!@aB#?_iU87a6k=}5UV9v>Vp z=Z{iCj0o4BTG%lR%PJP-2s8*l00Izz00bZa0SG_<0uX=z1Rwwb2tXj9K<50m67W`E zx9N!A;cI4}gT7v#eU1z^Oh7n>g+l8Ca?ie zqAGbEHT`;!9D5Vk0K%y0d-o1_=dXv=l5=6y^uw65C77550uX=z1R4o^&JX3~^(_4_ aK%;SgxRxj_tqdQ&J9LYi&e=E9%LhLZsfO49 delta 201 zcmV;)05<>DfdS+JkR*Qrb5ch_0Itp)=>Px#o=HSORCt{2+OZA7Fc3h|1F=l%tb^MO zkO?vY1JE);+N^*m86XmCn1+TrHj2f21AN)?b-oAy0001h4Z1YsmbyiCX~^ftE0;cO zt!_lbu~eu_L+-~Z)@3f0{IV`{^y9SeNoa8bPNjqQ%M{Ps^-w{w`RVQVURBGTw94><6`>(zgBx6p$Rqj2Aa^N;eRg=0NcF*w$Dl~?><_E00000NkvXXu0mjf DtsYsR diff --git a/Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/inhand-right.png index 0ea62041f0bb17703443d799abcf7f41dacd94bf..6ad4da839e23c1cb50e2224641bf41f2315c2018 100644 GIT binary patch literal 16598 zcmeI)KS%;m90%}s6bgEQ zdcIs@Y>=5oGQXv1iA1Ght-u2U5P$##AOHafKmY;|fB*y_009U<00Izj5lA1Gt1hS7 z;;>A<4ll{yAMd>^_kFEQK4AdTjm9T^zbG#aDWBK7fC~^SY*(phptp|=3=Mn9#1kxQh=$+-L`Gt@TCaE4wa@MN!I{sQTRAJ;PNKJz zax=vO|0%2DrQ+)lfB*y_;4W}DUOch)0=Tcj83;fC0uX=z1Rwwb2tWV=5P$##AOHaf zKtMsj>tt58RkQkV=Y+h#GV^&}&3fmX)u*doGtp!A2;Gk@6toW@@;9MXotFY|&f%T&d69;)Yn*+Y{blPZ zf3FoY`BwB)hC%@dKmY;|Xof)Pl08^;v-E!f8dQHzUyRRvOdL=-GnF$grWSU70SYLI A0RR91 delta 205 zcmV;;05bp9fdS|NkR*Qrb5ch_0Itp)=>Px#qDe$SRCt{2+OZA7Fc1Y$gIFeY)*)>M z$OM^y0caT^ZB{^(3=oMmOqI?O7Q(`b-m5L^+q&+42mk;8000S1*T;Wn$WbI`)AjNE zc*WX3;hUVt+=I(Jg?1RLorI?AV>^stnWr+B?{xxBIftIN>mfyiQ1#a5fD600000NkvXX Hu0mjfDydg| diff --git a/Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/meta.json index 88e3ebd509..c8396d7835 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/nitrile.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/nitrile.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/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/northstar.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/northstar.rsi/meta.json index f2957ffbb2..3d3bd865ea 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/northstar.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/northstar.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/37864/commits/efdef3f1f997d1c0575c36cd31a5db575d1df0ca#diff-a4eb7c89f7231f0aaf0c2f69d730dea56383019f2aa5c6a1d91a82c781b528e6. Modified by hercoyote23 (github) for SS14", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/37864/commits/efdef3f1f997d1c0575c36cd31a5db575d1df0ca#diff-a4eb7c89f7231f0aaf0c2f69d730dea56383019f2aa5c6a1d91a82c781b528e6. Modified by hercoyote23 (github) for SS14, inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/powerglove.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/powerglove.rsi/inhand-left.png index 0b1a1d99d68eebd12dc5475052808dd38839150e..5d93e40b2eb3d54a65e867e2e3fa0733085dd028 100644 GIT binary patch literal 16598 zcmeI)u}cC`90%~RX)|3L^9 zM1wR`Q`8heG(@!25ZC<#<&Z;6e@{)mPtL=;d*Ao`+&TRo?#(5QfIs9XqJSCK=k0xj zH=oyjKUv#+vUlF)grSqguk_i`zI~*9Bfhvr)N#R^cC~)IY9DOdHfLjPubyDA%M<>b z86@f_Q=eYg(X>b;ld-Qrg8&2|009U<00Izz00bZa0SG_<0uX=z1S%AWhErCBUCZjG zBEO}qk(>A;QGnioZc=fV*q?JbU%ItQ29A&P@~vff_a>Gt7Vt2TdhXvzwPI*GqL z=clU;Eb1=`kiCD-O_Il80I8P$@|-W-M1KO=%e%t-_^wGbXO1&pB3nrYKeD_@hO5Yw zoFB3v009UYnC1Tg?EW`2M93N?MV2}>X2wF7yCN{h3iYXwx+ z^xg0z)+UHO0rjZqJJ$|4$9Kc3$+3FW^y@KZO)xPC1Rwwb2$T{Sd;Hq<$J*+WiGZ!F4YH delta 439 zcmV;o0Z9JVfdS70kRyKqmPtfGRCt{2+C59dKmf+^e?%M{M5$7wwL?`Ld>aaaAT4wh zp&!8S;P>#;i0CE=l{kn52csBjOD%1|LERi&;viP*;>+D>)#tZdmgjQ01w-?)lz9@c=T z#b>f9=BM)?dXuL4&+4}|(eoS2&87*?Hc1S$Xw)E+P0^^eoaevF%4gNR_-1De{1AYF zQAnp30BF}Ej*s^|n|Tw)N8t5OYHQ~RfZ(hNzjK+}<@E-q--BLEJ|y9|#dsYK_UhcL~XvhouQ{E*zr9DyHl zS~=+YJgb+HH<=&W{1I^7AL#iFaNQs1`3-=7 h&>t|R{(y*l)g$YbPTcy3dHetX002ovPDHLkV1jbQ-X8z} diff --git a/Resources/Textures/Clothing/Hands/Gloves/powerglove.rsi/inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/powerglove.rsi/inhand-right.png index 1c6d24a4e44fe1f49f9b6cd3f114c2592130835d..a28d67e85e7045488aa466ad149699df37909581 100644 GIT binary patch literal 16598 zcmeI)!ArtW90%~1s}kgyUf%is%`&VD6K= zg#zaL#rEEdxeIJ%HI)p0m9NiAX3yYmW__P%_?9>2e&@Vsb_Nghm2~ie1A)|1-e_>BBf6dB z*Vhr5`EZcCk)1bS56X`Rq%!rk(_mH@n5KOoit=$htgz0wf?7bC^wMQOU-SDfQ8!tYOr+$`EQ zwN{|sq@1@!gDJYb-x%@_xj$g@ThI009U< kz$<}bVQkclmF52ha4F`=ac*W|Hq)$ delta 437 zcmV;m0ZRVXfdS0}kRyKqlu1NERCt{2+PzA{P#DJXe~NT)5T%tOsTrcu!LOkp2%_L9 zf*0UDcpqMk6y1bEr4Ay&!6=4m(P9M$b#riugS6C-Hnqi?1J7?shV#OcaB`MBAR;0n zA|fIpA|kEU*S5m{&d`sj{8pzy$F%{dRqGT>g|=(ssN4LBp9X)ockaTcx6S6T^_t)MK78N2dSxGgWE!&B1pppy z15Qs5WA!=olRwdVNbK#O0N`ER1MnI?GMO7|4lgY&^88X`V>3PnW54+m#Ztj?TpO?K z)3^e7WuKetzzTn^u6Vc&05~okFgl*05?sdSCG?v=(O8^cnZqmloL7!MZSR}wz#7jC zz-7hrmSAWBz)%(KyRZ7ry_QrJD)Hy+_TogZ@$Dp*_lSabyty8>FE{i`Pez-Md*0haq3*Hl zaAcflkThj(Y2W3FMsqp+3KR%H00Izz00bZa0SG_<0uX=z1Rwwb2tc4tf!ORqsm`V~ zHM1jrTTMN;@I|5k14F%J$5Uc|j?3|-izvXvXdm?-pVG?KTPZR!Bl0?M9AoetU%GTi z2F$+{Xp+t;|5=a>OZ?<{@El*dh|Ylg{j+(0p>UUZ+{l47jx~NGF>P(jQ&wvF8#ii4 zOd~e-5P$##AkdNmQ%8?kV=X{S4iJNa00bZa0SG_<0uX=z1Rwwb2tWV=5P-nn6tF8> zTs~Tfenj(x^+;38HHS?9Ay`0+m>s zAT|S)+q7#cYdqw_CMWZGySyc^p}i+FtAZ` zzV;FOnf3k8vmVu~6IgES$*?NC^qcol|GTG6{s-D_Q?EbsoaEhr9USD5P=RJ*He=6@~i`Ju-jozHq}_`#Xsmz%=W zS?mi6WeaQeJimEnwt*ef`ud>T*6s`}>81?t9;-dR?ELnqzMfve^;Mg8eVb%>cDB*I zhQC1}U;cRe_4`xZ9dK~s ze!?yJf@}N*XT$0bRM{Uez5SOl`!B=wn6K=0M+FOR%D>S2rTk!*{e`d65R&2l0{aB7 ezl?%ESFyVodHwd?v)7OT2s~Z=T-G@yGywqk9MA*+ diff --git a/Resources/Textures/Clothing/Hands/Gloves/powerglove.rsi/on-inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/powerglove.rsi/on-inhand-right.png index a9cda6039b6d0eaa6e955d5e9a061382573bfea4..de36d0b76d00ae1d8b54fd3cda7e0552709ecaf6 100644 GIT binary patch literal 16598 zcmeI)KS%;m90%}sY5oI)AREjgqNd2jp{-0#&O_3Of}+8SmX`idL$jMpOSFp)ML}a* z2o==gRM8LwK?Kpz;8N4|UZ5PJJU!1l#jkSS`R?xb``yR8>Gv=-7n9sBuZs}kmLuXk zT?g6Xu+h)6&D~eJvaLrYktpn)zB)OgBhH=3@*W{QH*68^wofe6@k!nT&c3F zC5E-s*VPi0n^;8608DpiWWdBy`Keib_1*QS-4K8P1Rwwb2tWV= z5P$##AOHafKmY;|XtF@Poms8rG%F9cPpGxvb~&#h03+uQ6z2iRlB8?DQWF4cMy_nV zDT9Z{rPg$_e{t3VX9&MP4x(q%wx+oPl`hWc`2$+!0aU8Hd`#0Fpzgz~`}5_&_57~R zqt35qj=Ex*(UUhLXI&^b7y=N000fK@n7q6{r@5l+e*tvLnY1k~h3$SP3nzzT;zejR F`3H+Ddw>7{ delta 434 zcmV;j0ZsnafdR?`kRyKqkx4{BRCt{2+PzA{P#DJXe~LIbh@w&?HA7T7_%##+K`JNS7jtHFP5uNF=&?Y4#;*Jfch zYs60YZvKJxLC3Yp%%$-5c6hkG1Hf@@s&Dsk_S5{*^JK00ze)m0ASgz7lYD zmXFov&`2R_F1GJ{P6qcia1>99R>{A^h_^ z^~VOuu~CM{Cn*J2fBU3e{CfV(N;aIHNrxZrO<{U|5fKp)5fKp)5fPENFugzUwD@5bZd>b$2>m9WiI<%Lwp-=zhWNh|q?tO!3 zn(WL{@yIYzsfP!(0|Nv=00ck)1V8`;KmY_l00ck)1V8`;KmY_lz#{?EG&>%Tx;myq z-{;D*%T3?yw#%K~w&~Cp1uzzg&|)&FB@0-W^`%EZQZPO-L3H;>oT~h`o~u=3P<;;E z=l4_i>6PN8;-GTB&WmQiSG`UNYIU9cWodu~4xV*cUwVjUK%?2DR;fg!9QCPZiNSB5 ztQ56Wb~S1>2}!*gm4L6aO{!cYI9QK$1tlQ`0w4eaAn?Bl9M3G6PA|a!jug>>00@8p z2!H?xfB*=900@8p2!H?xfB*=9z@H+Zqo&_4KnXjdg;K{!9W{MNyLXnbBMQK_td6dl zesAE;vqW!#7yu5OE5&2gH|q8bI9_U;*$&&|zXIF$VoD4E8`oLW?-!gzZ-Q8_z%Xk1 zI(ifOfp)z%jGDfV-UQbHVh?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6 zGOr}DLN~8i8Da>`9GBGM~RsBTId_|A5Z7NlCUU$t=l91qU45Kj08_%qc+?1*r!G zK~5$pWUX=%^U`gVDs)p)(-KQ_N|fv}^D+|iQgm}t(@JdgAqr6qfQX`+Yom|F2{s^) zTSW$?7U$=bf`Z=8$jrnB92_X3h)96wh`_1?SrlDIKt_H^J}^-gWhQ&(m82FG6af<$ z#73xnxK*H=g|Iv{FSEqX2x5ipy*@pN$vsbGA2>nvxpfds>a2(RwhJDk;DSjDbeog)15 z7 zFPa`deNVhDi+%L=;@Bb5Qc}3pz_rK4VC}E*keG192b-rLt|)++E}5%!pg$V+CN|?v9K~R7K#QU zCj0~wD;g7QOe9d?xnn{?19y8K93k(LyS?nr&A#*OUNsZWH*-qB8}$-VK+UAKM4#Ym z-XreU2S@Ls^Xz7o6lwgse7L$0BMXO_?GjP2%9o>FEboiKxnp%BJ@?^?M1o6S%K978 zBB`m>{E5SnNK`7q0u2N}00ck)1V8`;KmY_l00ck)1V8`;KmY_lUG`vDp7pU#)@!uso&er`QWDe^blc6QQNOm> zwL2Z^779cHgi}0Q*7k_BlG`cuZCSRsq$AeJdL>_jIS7CN2!OzB5qP|ft@UdGW-Bs8 z0|Fob0w4eaAOHd&00JNY0w4eaAOHd&00L7(z)XJLjQDY_V<=HNO0b#y{3w6J=Ek+o zzW_|KexP3mpel-`IY3hYIB-6a{#t|n^7F&C&BAeBhu7n5uxvrZC>f>zu)|5$516R~ z7!`PbPPbN|Z#dZ7Q9m%YI)K5zWS;G)A3z;|%nrd81V8`;W|}~#QM?lYX8C^sEDH4d Tw3u9eDc9MZn$D$ek~?R=YXz7+ literal 1264 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|_);T0(|mmy zw18|5AO?X;!IOa`XMsm#F$06fED&ZCw^H21z`$IR84^(v;p=0SoS&h?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6 zGOr}DLN~8i8Da>`9GBGM~RsBTId_|A5Z7NlCUU$t=l91qU45Kj08_%qc+?1*r!G zK~5$pWUX=%^U`gVDs)p)(-KQ_N|fv}^D+|iQgm}t(@JdgAqr6qfQX`+Yom|F2{s^) zTSW$?7U$=bf`Z=8$jrnB92_X3h)96wh`_1?SrlDIKt_H^J}^-gWhQ&(m82FG6af<$ z#73xnxK*H=g|Iv{FSEqX2x5ipzm_H=O!sbGA2Ya{O=1A*3u#!fCbkF2d0W9Zbp(eQLr zm-)sOJmE_^gDjQ{Z#tT<>AL30r$0yUMz%CEFmWg}U=nXQj!3*dS5hAAUOX=vOv*Wb5b#1zd`9v;de%%XO~;vJs!Md*_2lt)(*v4apf)7pT>MG z(ti_C(9+X)dZ`F@E8y1J3%}SKd5h`d9l85ro4-8TZd$d&oH^si*E0v+-k$wF(Qq11 zT0{1^P4lE8pUCRS%m0)8_3`k3Co!DSwskUaWG*KIRbMn33a@8BPl%?; z)E8EdJswRf7Ofc=5P$##AOHafKmY;|fB*y_009U<00IzzfJ1>qBGGbqsjbUY{?;T0=Wrh9 za{j;%e*C5XTC2z$cu3qJ1Rwwb2)GfL7;aSBdjZ_!;93Yk00Izz00bZa0SG_<0uX=z z1Rwwb2teRZ0@7Wg--=7r5$zMUZ&XE3zn$HAl&B*LU>ZhCRZqWj;qA{7dlSR}c;Vd1 ztu)KTdj|eva2>A4zY1L6Nlh^TF0Qht-)nIadlSR}`q9%@u{WU?wC!{K=;`;Prfm>R pga8B}00C73vsZ;BD?82q7eJ`S&E`RJ=5g+sf1K`V03|l#;28f z`)B?yycQ+dqrhMw;n)@~kiAwSdEXbM*w6P1C5jB{lY6G5cHTbD^_R1tD8)6qS5-^J zlWDDK-*WDq_U&C0?;mqq(b!f#;du(9pkqB#%IA;2;>_e9KYSy_aA9_&#dEv0DcApO zYpU^lKBwaS#ATZE^ztXfu2Flxmz_bxbz|MO+-MVD=A|O9c7-W^ie7_bH!TU@Uy&SKO(l+USN&9K=hh_2l8YM^945Be^4(wu>S>r$d# TSWO~VFaUw4tDnm{r-UW|UW}=) diff --git a/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/green-inhand-right.png b/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/green-inhand-right.png index 6ba96d5664c63ffb2b83d30d63d1444bd3da4a88..533109dc9cd4ef8751d8e9415a7bd143691ebdf3 100644 GIT binary patch literal 16598 zcmeI4F-yZh6vtm$X|=V2*ivv1UHt+sl}1TPL$!zqqAo>T#6fEv9GnCPH^DE^O>uB{ zkSZmX!L3;jrBssoiW$x?x zL_AJUA9uu$0^f#ettMFsvULOa@W}$vd$Vcf&)0R<$2wWB-DU}ZfBmG9b!e1{K3grj zetofHeXNu9vhIO3zEV!!umcky;OIYT6*v}5K>!3m00hJc)aNcv%vu1kov;Q05C8!X z009sH0T2KI5C8!X009sH0T2KI5U@$WtL%|maV+zMRvet<=dFBpT6Zf>UjV$UA290x zG*uO<1?U9x_nadDd~m*!uk9Lfe%_15aX21lgGCD>dg*fnfE{{WKj5Sepx438HAeva zs2^~x4!|TKI`SjHU36bR_I||dM=$n*00@8p2)IVzZK^n9IM4C_0t_ff>EST5p4vNO NcUmT|+%6VQe*kn9nIQlG delta 386 zcmccC$T*vMf^t1$lBbJfNX4ADw`~0m8%VG{xE^{mWLd;2ozjk$Cps^$tek9q<1%;2 zV+LCmVfF`1IS(1`N=!`nJjpM0p|{(SUxqHafvjJ`1rGoA>3b5fzJ3bNKL#ZjSY+xs z=|q0I#gTJA=N4a*c4Amy-olfoaL#h$HMWfcyPxD=m#<&5_0s$AA3sc5Y|VDgZ%)Qq zL-#(7t_53d!ZFvTfQq}PJ8{Yk#A zwN&zgt#0X$9_&5-$EM0XP{eCV)Eb-fp^?)rL>-p6JmVy@`>FXVofgki_U5jg`YU|P z%KDZIpM?bxp!MPXyW3jg>;tafyYtlf#aHI}nYr(RIQP~)(2jl^0_5Mn`HBT7Um&ul eUR~)|^F2mx4bFt9qmw-tfWXt$&t;ucLK6TOQMSAQ diff --git a/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/inhand-left.png index 8f8953d6350a9eaafc02aae11628dea79f4f41c6..66574d2b292427a3742762e0ae27803c0d8e6235 100644 GIT binary patch literal 16598 zcmeI)u}cC`90%~98d{nz=@JdmR?vT-c!hEvl1M}l4n?>$RaDU2)*S6EQZ%$TgoT1M z*A^LV1x64NQkdOO5Cjb_@AuN-`{X=1-hF@fK6kpjhx_T2?)Q#*iO6pxV)N!+<89Dw zzMrmbmd%}eHL1s_&ab13;{)@^&_-fuizraw%~4uE$(jc}+s0hn^Xv+RyknDJPuE1_ zWW;6`b{!5)%jeA=Xb^w^1Rwwb2tWV=5P$##AOHafKmY;|fIyc5(P*^Z<*AlVQ<3kq zRM}#u?^?}b&+fXZ$QK0|_W39h4l8*IIG6LK+kj-?NH9n@Z|B61D&MU_vFNay&jWY5 zTy+0=MOrXpH?Hk`(I?=gQXy?3)415SN;VEO25;tazH}1>_^4LtvYeyofKGhZBpT;% z9_Mm?-#32zrGKqeWcEEIE)W6`fB*#S2s|Dxzc$wb*vY}U5P$##AOHafKmY;|fB*y_ z009U<00Izzz@G%9XNi6*E>TBxp0IhLD(3W?*{yqtI-&rEuGdw~>9-EN`B`FZf*1e~ zoM&<$YDMBT1OL&u4%g$a0@v@RrWgPhS2?HOX>by26T|>|F{iI$Z9*q#%g1^#r{9a3 smO;=F0uX=z1XKx31#U}bc9Q=WK&VFceJ8hg7fExR5l_X=W>@xp03k-7MgRZ+ delta 178 zcmV;j08RhafdS0{kR*SUNklg_fpEx-?bL7(uh)B`4=0NkmJygtRnORL~~0H8-?HQc^UuH-v>k ze?Uu1HV3vegal^y3l198yLakc!S~7Y!F#{=`+eWXcenh0c(|0+!ol$%5ry@%x@?RJ z_hG;BeYLS&GX{S?qp8&5&*|;Okufu}m0sN;id48u51W_k#$;euUrYsFpb0OsTI)@Uf?`k_PuvOd-+vS-N3m>v3LnVvuINr~pH%spKn zi$>}3{f78a;M-8CRwXMzwr;@B;iq!+R+{zveDvo8I(29eT{JfRVcI$(R(-QzU>j%s_ z0A16BY6058{5|Ig03V#M!3m00ag`pzxGGH=Jkqe*yXwBssQMD$ItC N*`1!ss@KW2gKu delta 187 zcmV;s07U=RfdSS5kR*SdNklOz4tvcw=u@lxpIJ` zY-VoL)BV74Ijyy+bEN=h%3kI8Q?H%_000000092UsxQSe%C9rSukNxl@X6@_5$o>^ pRD2a+^__u=(*f?ZGXMa*^#oHqKHCeptw{g?002ovPDHLkV1n7{Ro4Ij diff --git a/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/meta.json b/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/meta.json index ca6ed489fe..cd85a5be23 100644 --- a/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/meta.json +++ b/Resources/Textures/Clothing/Hands/Gloves/spaceninja.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/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Inhand sprites by SeamLesss (Github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/red-inhand-left.png b/Resources/Textures/Clothing/Hands/Gloves/spaceninja.rsi/red-inhand-left.png index e1c882d64b11d3f38ecb2beda9c5121da6ed1e75..040af95609943d4b586350a0dbf7396cd38dc309 100644 GIT binary patch literal 16598 zcmeI)KS%;m90%~Xbakkpqd*> zLZPvtrl3C%5rHiYA%WTb0zuH=@_sKJzE94R84P6WI?ULpz@$=HOs z*Lmx7neT^li}&WvHIqujsKT$kv;A%Jh-V?0St9Dn^QK+SAIzEu-OI*k-2Lhdh5UV) z?AjAiFB!3+$*iX7dM;=7K!X4TAOHafKmY;|fB*y_009U<00Izz00f#8h(@E8CQr3= znu>gfrOFmNeU-}=dp6fiMZPG2-{+&jNJPm~z`2|+-8v)#yMsZxem^CCRQYb@3kA(? zJ`ddCbkg1D1?j;lyK!~ri#`Ew#Uia-g?}!#u9A%dJb2FKeCZ|%@KGw!R{t%Xyu^v` znndFq&f{FpZ~MlNzx1!Qip;i$#05eC0uX?J9f6VY=X7-~fSnwi3jqi~00Izz00bZa z0SG_<0uX=z1Rwwb2>eMvdY0(7;u3X4=LxG9s$x#Rnq9k>s3QtsBoY->bNaOduYQ(T zn;-_j1Lv9ChjM{<&A@*&uEX{CtHAY}sVN4)#Z}JfHyWJ8+5|CxR?O+ESewuY+VZhh x%;~qHrezRxga8B}00C73yEo@YW_F7I7eJ^+G`#BB7}$B_I3u2p9S={he*@)WqZ|ML delta 383 zcmccC$T)*}f^t1$yr+v}NX4ADxAgs)4JFtnlsstpNV0v+>;!wf^(f)zqxaBu8lvMcc%W}nyo=1tncKsd9u0}8ZX+) z_R4URPV+UX=lm18pLco%?(fTxEvT>1^1sQV)a00J_)5IHd~qFP`D;do!^zE?boReV z$@sf#(Vvr>bdFZ@C-baZUcJNW7CS?Q{rr;cw_|H=Z_`cNEIB18W0u>|75surneVBs z-+JunLGC@@Ep|#SF3*%wHM+lM)vA!&+b%>MmiV0bY2jCC#q-65=T1IP&tAL7{^<0% zFBX1vK>}aoTkeRdo@8GlW^6BDDnB8r>(7B}B@V0p97u~b)SqZ%zd=;?gZd}tg)`(8 bl)N5@3Z{!*&QXY#W&i?DS3j3^P6vqNI2!NCI z1C2TWO;v?z0h+=5J!c63ADpjbsa7P;&pXjL4#(qcuxLRIZDA189&C9r+R9F1oK1dpBZsq8EEX00ck)1Z*R4vX?v6ou~PK0lE|6uHGfV!GhA;=7;P;>nl zATaDZAowbsgAXuA5EVPqxgnUTCIs^$7RIuat@{(`k>{t{=6ZSV`lc0q0U{zIA|fIp zA|j#{aU9EEXV}NO{H>~s&N=DyAOO(mL9V6(=bTt;gV=~|^0$ANPpq|)Bnh5gGYoQz zp);bj2J$hYD1z1+*DsKp_lf$g#cX4j{EG^BKE0H;XaW(zAh#Ixlf}fNeggOC0RY2u zgEUPWR|&i3R{)Tvsd(>UjKTf%2zO`4008gjH+8$+#bjk!Vm6yWDTSga8c_-Rh=_=Yh=_=Yh=?c*A^&Zu><`!^^!|Zm?af2Jh2B3 Date: Wed, 16 Apr 2025 22:16:44 +0000 Subject: [PATCH 199/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6a3514005c..602f3615df 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: yuitop - changes: - - message: Anchoring now has higher priority over stashing. - type: Tweak - id: 7704 - time: '2024-12-13T23:00:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/31779 - author: Nimfar11 changes: - message: Changes the colour of the Borg binary channel to a different shade of @@ -3910,3 +3903,10 @@ id: 8203 time: '2025-04-16T21:14:05.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35918 +- author: Seam_Less + changes: + - message: Standardized the In-Hand Sprites for all gloves + type: Tweak + id: 8204 + time: '2025-04-16T22:15:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35997 From a23b5fb50296f7bf1e50337666b0a2e4fdd22f5f Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Thu, 17 Apr 2025 00:59:36 +0200 Subject: [PATCH 200/622] add subtype to admin notice (#36640) --- Content.Server/Administration/Logs/AdminLogManager.cs | 7 ++++++- Resources/Locale/en-US/administration/admin-alerts.ftl | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Content.Server/Administration/Logs/AdminLogManager.cs b/Content.Server/Administration/Logs/AdminLogManager.cs index 0df177347a..1d6ff13a5a 100644 --- a/Content.Server/Administration/Logs/AdminLogManager.cs +++ b/Content.Server/Administration/Logs/AdminLogManager.cs @@ -330,7 +330,12 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa var cachedInfo = adminSys.GetCachedPlayerInfo(new NetUserId(id)); if (cachedInfo != null && cachedInfo.Antag) { - logMessage += " [ANTAG: " + cachedInfo.CharacterName + "]"; + var subtype = Loc.GetString(cachedInfo.Subtype ?? cachedInfo.RoleProto.Name); + logMessage = Loc.GetString( + "admin-alert-antag-label", + ("message", logMessage), + ("name", cachedInfo.CharacterName), + ("subtype", subtype)); } } diff --git a/Resources/Locale/en-US/administration/admin-alerts.ftl b/Resources/Locale/en-US/administration/admin-alerts.ftl index dd6ea2d892..931c3766a7 100644 --- a/Resources/Locale/en-US/administration/admin-alerts.ftl +++ b/Resources/Locale/en-US/administration/admin-alerts.ftl @@ -1,3 +1,4 @@ admin-alert-shared-connection = {$player} is sharing a connection with {$otherCount} connected player(s): {$otherList} admin-alert-ipintel-blocked = {$player} was rejected from joining due to their IP having a {TOSTRING($percent, "P2")} confidence of being a VPN/Datacenter. admin-alert-ipintel-warning = {$player} IP has a {TOSTRING($percent, "P2")} confidence of being a VPN/Datacenter. Please watch them. +admin-alert-antag-label = {$message} [ANTAG: {$name}, {$subtype}] From a0672a2ad741264b66df08a7ede2348b7a353a72 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 23:00:43 +0000 Subject: [PATCH 201/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 2b8fe05cb0..73deae9159 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1057,5 +1057,13 @@ Entries: id: 128 time: '2025-04-16T17:04:48.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35359 +- author: Errant + changes: + - message: Antag tags on admin notices now show exactly what kind of antag that + mob is. + type: Tweak + id: 129 + time: '2025-04-16T22:59:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36640 Name: Admin Order: 1 From 31185fbff35402541b28d919916733601df26265 Mon Sep 17 00:00:00 2001 From: Mercer Bray <74152185+DissidentBullet@users.noreply.github.com> Date: Thu, 17 Apr 2025 00:14:28 +0100 Subject: [PATCH 202/622] Added Junkeys (#34121) * Added Junkeys Monkeys can now tote the syndicate Juggernaut suit! With a nifty little sprite. Update meta.json Update Equipped-HELMET-monkey.png Delete Equipped-HELMET-monkey.png Create equipped-HELMET-monkey.png * Update meta.json Credit attributed. * Update meta.json Credited edit. --- .../Clothing/OuterClothing/hardsuits.yml | 3 +++ .../cybersun.rsi/equipped-HELMET-monkey.png | Bin 0 -> 1113 bytes .../Head/Hardsuits/cybersun.rsi/meta.json | 8 ++++++-- .../equipped-OUTERCLOTHING-monkey.png | Bin 0 -> 1647 bytes .../Hardsuits/cybersun.rsi/meta.json | 8 ++++++-- 5 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/equipped-HELMET-monkey.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-monkey.png diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index ba57ef9c53..2c453ad16c 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -682,6 +682,9 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCybersun + - type: Tag + tags: + - MonkeyWearable #Wizard Hardsuit - type: entity diff --git a/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/equipped-HELMET-monkey.png b/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/equipped-HELMET-monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..36824a87443aef00730a00ea0d3c6b448a716401 GIT binary patch literal 1113 zcmaJ=TWHi+7!Fq1p;&Dd)cT;u2;L``$z(bS9osaS+F?7j&Wu`p5Yyze4K+D2Id#(N z;%pZbcPUa4VV7O@O?=TuFQ~NWi#Jpdr7HU1o1zGU2)>Lb<4pCTdLTLH{Cwa4fB)s2 z=p z-iECdRkzM6^x?j2w`?Gr(L)Rq*e+pHRBKz{>c%j{pdSuePKthib&3X-nWA@#SuX3U zaLDQ!^I(3gr(lc?8maZXIKCXD=!##NoI^89g9-!>r|7Su`m()1 zMIHnqBSsA_#)B4#;YG2fCAI~`I6lsDJj)AFUXtT+nd3lp(IlE@4#+vJvl@%sQuGkU zuFSHiBDG9yI71p5LXioXb_XUAZiI!6%{4auf%vxNygJcQWCk2bO&AKnsek{bF>$x?@|(whoxB}s9M0|)j=mV5xpL%Hqj=`Q#E!P3laWTyUYedN z1^+&JH}hwysdV<^Z}XIL-GWm6!&{M?pPHLieO`u+pUbqD{(h40T5=2=Qhi^99JL>!e#_h=V7_K$x76oGH0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json index 107ac8c189..518f3cb650 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from Paradise SS13 at commit https://github.com/ParadiseSS13/Paradise/commit/a67c929b7394f78e7787114457ba42f4df6cc3a1. Vox state by Flareguy for SS14", + "copyright": "Taken from Paradise SS13 at commit https://github.com/ParadiseSS13/Paradise/commit/a67c929b7394f78e7787114457ba42f4df6cc3a1. Vox state by Flareguy for SS14. monkey state made by MercerBray for Ss14", "size": { "x": 32, "y": 32 @@ -17,6 +17,10 @@ { "name": "equipped-HELMET-vox", "directions": 4 + }, + { + "name": "equipped-HELMET-monkey", + "directions": 4 } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-monkey.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..8675a2baeab2f0baf284b43cb8a9ee3020029dd2 GIT binary patch literal 1647 zcmaJ=drVVT96oJ90VfnSiyIHGB|Hbcy@j^4P)ccwty)q_!N&NYj|)`1z1Q|4rADc2 zOPDT;Mr4Z2F*6Ii-7xMc#?b1`JMc}@Avx7 z7n+;}GlM=30szcZDdk#f&-8r(4C?<)^Tr`+`-oKN$vnJ>EH~ItAT{Gg6jEV^VpNM7 z%oS@o(R2V9F&3Sk)TIr8`6v0fv$W$bqf4+C>gAYm8S!oqg9Z3mS7F zOU10WN$J%ZNQT=`h{xt7nK)bo5(wD{k0%gt6Co}KNr5>Cj3g%^LQzVJh{J)#7mJE! zGZ%@p^6c?glqF`BkR&03;qvlwc6l-zw-v*PP$+~sT$syEqCAr96;{&VNV3|aCK%+X z-DI;6qy@J^K1PEPFC)b)D$}g8Oh~xk4FZ_#Kcs_ zei9NAl9iPe5fKp=7YDpRB9ZWTyyQd{pU=0>kG_@~o0gUa4&(z@CfFcRN;sgyq@>e9 z?V?J72pAEH6`LQuJba#!!I(2=j@Rp5c|moUx`jw>P99~xZ-HgY!X5%ZU!ampb&j5) zS_~iH1a!3Xzxu2Dj^$y`E$JC=b9((Y>!MXxa@LjgG}g%J8%Fa6=C-W=y|0qd&;irB zFV=!@FMXXv%h*}TTv;)rPcU-mw6p2{!h~X4{p{00yH{Ksjots@gXN*1dt_U$`Ds*5 z5FKB41H*Szo^GmY-t?>$+)eIll=v_9cNGP?rf<2FK-&>P1FcuX-i(IDJiSr<_h@9p z=edOZHr>)Xvbh@smShCnv(q>lZI$PhTt?%xKudum(CX68YjMxWJo0Nsz{}Vz7y6i+ z))OAEy}|!8&5-=JJ69jH^j?ltw#1LHiY{q5TB%cf5+M`qp{ z=-nA~(xFIy#H@?z=dImG|KsuAS*u-lN&|KUwG@mD8yV~cGaGLdF!!aKk8ba(c)6ph z$yN3uTl-pJ`ubmpV{g`&asqNM)!H3MeUovua^2Hf@;4nRVxk_6wvPvV_0Bk z# Date: Wed, 16 Apr 2025 23:15:34 +0000 Subject: [PATCH 203/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 602f3615df..4fc13817e4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Nimfar11 - changes: - - message: Changes the colour of the Borg binary channel to a different shade of - blue. - type: Tweak - id: 7705 - time: '2024-12-14T16:03:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33841 - author: Litraxx changes: - message: Renamed the Dungeon Master lawset to Game Master lawset @@ -3910,3 +3902,10 @@ id: 8204 time: '2025-04-16T22:15:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35997 +- author: DissidentBullet + changes: + - message: Monkeys can now wear juggernaut suits + type: Add + id: 8205 + time: '2025-04-16T23:14:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34121 From 6ef5f8e2f1f7b4ac1076850370ad3798826be37a Mon Sep 17 00:00:00 2001 From: SpaceRox1244 <138547931+SpaceRox1244@users.noreply.github.com> Date: Wed, 16 Apr 2025 19:35:57 -0400 Subject: [PATCH 204/622] Adds handheld artifact container to cargo orders (#33327) * Adds handheld artifact container * Adds inhands and missing details * Reduces use delay on unlocking and opening hand arti container * Adds handheld arti container to cargo orders * Fixes build error i think * Removes extra whitespace * Adds static price to handheld arti container --- .../Catalog/Cargo/cargo_science.yml | 10 ++ .../Xenoarchaeology/artifact_equipment.yml | 91 +++++++++++++++++- .../Storage/artifact_container.rsi/bounty.png | Bin 0 -> 188 bytes .../artifact_container.rsi/captain.png | Bin 0 -> 188 bytes .../artifact_container.rsi/icon-open.png | Bin 0 -> 632 bytes .../Storage/artifact_container.rsi/icon.png | Bin 0 -> 520 bytes .../artifact_container.rsi/inhand-left.png | Bin 0 -> 593 bytes .../artifact_container.rsi/inhand-right.png | Bin 0 -> 610 bytes .../artifact_container.rsi/invoice.png | Bin 0 -> 188 bytes .../Storage/artifact_container.rsi/locked.png | Bin 0 -> 101 bytes .../Storage/artifact_container.rsi/meta.json | 43 +++++++++ .../Storage/artifact_container.rsi/paper.png | Bin 0 -> 181 bytes .../artifact_container.rsi/unlocked.png | Bin 0 -> 105 bytes 13 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/bounty.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/captain.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/icon-open.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/icon.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/invoice.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/locked.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/meta.json create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/paper.png create mode 100644 Resources/Textures/Objects/Storage/artifact_container.rsi/unlocked.png diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml index cb7f8af822..aa428b7d55 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_science.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_science.yml @@ -8,6 +8,16 @@ category: cargoproduct-category-name-science group: market +- type: cargoProduct + id: HandheldArtifactContainer + icon: + sprite: Objects/Storage/artifact_container.rsi + state: icon + product: HandheldArtifactContainer + cost: 500 + category: cargoproduct-category-name-science + group: market + - type: cargoProduct id: RandomArtifact icon: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml index 27084003ee..46f79e1140 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml @@ -94,7 +94,6 @@ enum.PaperLabelVisuals.Layer: True: { offset: "0.0,0.3125" } False: { offset: "0.0,0.0" } - - type: LockVisuals - type: ItemSlots - type: ContainerContainer @@ -103,3 +102,93 @@ paper_label: !type:ContainerSlot - type: StaticPrice price: 250 + +- type: entity + parent: BaseStorageItem + id: HandheldArtifactContainer + name: handheld artifact container + description: A handheld case used to safely contain and move small artifacts. + components: + - type: Sprite + sprite: Objects/Storage/artifact_container.rsi + state: icon + layers: + - state: icon + map: [ base ] + - state: locked + map: ["enum.LockVisualLayers.Lock"] + shader: unshaded + - type: Storage + maxItemSize: Normal + grid: + - 0,0,1,1 + whitelist: + components: + - Artifact + - type: Item + sprite: Objects/Storage/artifact_container.rsi + size: Huge + - type: MeleeWeapon + damage: + types: + Blunt: 12 + soundHit: + path: "/Audio/Weapons/smash.ogg" + - type: Appearance + - type: AccessReader + access: [["Research"], ["Cargo"]] + - type: Lock + - type: SuppressArtifactContainer + - type: RadiationBlockingContainer + resistance: 5 + - type: EmitSoundOnLand + sound: + path: /Audio/Items/toolbox_drop.ogg + - type: LockVisuals + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: StructuralMetallicStrong + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: PaperLabel + labelSlot: + insertVerbText: Attach Label + ejectVerbText: Remove Label + whitelist: + components: + - Paper + blacklist: + tags: + - Book + - type: GenericVisualizer + visuals: + enum.StorageVisuals.Open: + base: + True: { state: icon-open } + False: { state: icon } + enum.PaperLabelVisuals.HasLabel: + enum.PaperLabelVisuals.Layer: + True: { visible: true } + False: { visible: false } + enum.PaperLabelVisuals.LabelType: + enum.PaperLabelVisuals.Layer: + Paper: { state: paper } + Bounty: { state: bounty } + CaptainsPaper: { state: captain } + Invoice: { state: invoice } + - type: ItemSlots + - type: ContainerContainer + containers: + paper_label: !type:ContainerSlot + storagebase: !type:Container + ents: [] + - type: UseDelay + delay: 0.3 + - type: StaticPrice + price: 250 diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/bounty.png b/Resources/Textures/Objects/Storage/artifact_container.rsi/bounty.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d459eb506aa7d7c3a1ba7b634f8cea3fb15825 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJW=|K#kcigg1PRu~2_ifO2}jf- zW@Z1ApI!0&$>fNu!Aubao+;{*3qLGBXYHQ5TT%iDW)yhV{P{Ea;i+D89(nu!OFECT z$R0R<`rLyYb^damyRsiXe)eyRF28SRQ}=6T9& z%GJndMgnv@Z7eJ2gE&1q2fz`+8|r*oWy2QUzG-1uIRGpxN2AfEUVn+*voTBNmG|wQ zP2Mm7=dv5N&W;_~_Hw-V-s-$ypQ;-xQ6hK0#(li}_`x_4;jeg&M zj+V%ML=`0bKC!|oA#@X(CDWJd+nHJF0d5sUDKG_lJ6oKdoiiQ{JqVfi-@krF8kExX zJBi+l+yemP(GcL;AaM#z!Mpc|fgmy>X2~SGwoZ0!eQAK$2moHQ$s5MXBN7YX2th&D z7)+*r1tj(?02oZB6m++;3%cfO!9l568enf{%l9lJp#H)2|u5OL090ivK5K~%?a zPE{r9gsSGo=OB&{JpH->!10qGsqCc&2m?9HbOE?aEtQ?rDF~CgU(%%DpX(1JTqS-l S5v{QR0000>FC(0x;QvosUf)4 zr4Vp%5d_8A4ss#U+~s_f4$Tk3<(}Wi|DJ%4&wnSts*vNUJrU5ygS|$}0 z^Z9HqaiSAX6GvWyH0l+{fY+BNAUeTxGPXW@IRMD@H>*!lQMu9N8ferj(6ordMBf+z z0EVV%efIKgIc8P7JeQzp5deUuMUc%_kjXrN=md$Y#729f6GSBm05B-r?r-3+Ttzlp zvhw-D6Q+|fqLO5V+71;5R#PBqf@y%7uoDV}0RX3G=iEWR%XbI~$#ZsrV1Hp)JAoMi zw|U+cq7x()6`gLI*~ZmCF_%W)7-2dY?<`JthZo#6u+3ohML0A~4DQ>IUscb3uIE6l z*>VgP3$K zEag8Pc`8E7fz3N&Cj;xya8?^Pjy#2yQ;gsOMsOiyz;zqenl0-f@(QI}eW2G{{lrtd z835pV;fQh}AWU(c0{gk0RMfrFPPff{5pmyZhq#oy-h@6rf6fo5{oRTo2!$R10000< KMNUMnLSTX;GU4?A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/inhand-left.png b/Resources/Textures/Objects/Storage/artifact_container.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..8136557f71a9f6e7750e0fa0e19aaafc04b365c5 GIT binary patch literal 593 zcmV-X0>}2cIl?k*7Kx+XT~#Pmb{W4)_;UPQcD) z4}imsW8U{abGUI#!}I9A`AEa_7)KER&4c{g|8Fq+3Iu0c3DygWlbHzB$;u zte89n!eKb~^;hjK0JU1ZbQ~9tKrpxil8N0u;^rPdd^*is$hht1>T-L-~?;5m`wtns}4CKzi`x|NZ-uaq-u--|`<+jQiWWabArg&2&;(O$^~M zG)aI}FT#ChcR&!li)WR#pS^f#H3VSSi;yt=3b7(Uu0IObv#M0H>o9%9# fm1viV|8M;S%%~!5#v4Cw00000NkvXXu0mjfzbq2P literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/inhand-right.png b/Resources/Textures/Objects/Storage/artifact_container.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..0023c2c3b76e6e842cc452d3e4dccc622c1440ca GIT binary patch literal 610 zcmV-o0-gPdP)%uvRK^-R`hfDiW?f1E3WIT)jDG zyG=az^!baSW4$?G|L_E0Xzn?Hs+KhH;}|Q z2jsnPVC+dSuYCi?1mwMMz&Ho&AD&QIuRQb(0ABZayl)^Xou|oEu1~{QKLNk#(+Yx- wFUY2Ez*MeJ%UDZ^?YLpo7hu||{{G1P0qA}w7mLj^PXGV_07*qoM6N<$f@1n6F8}}l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/invoice.png b/Resources/Textures/Objects/Storage/artifact_container.rsi/invoice.png new file mode 100644 index 0000000000000000000000000000000000000000..b2cb06ac812faa8cf3e62105181af186bb6b4775 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJW=|K#kcigg1PRu~2_ifO2}jgk z#0LG8pZ(+7ys|Z~G#PbvsKgi*2mYvD=D%#)T^cIaLJj$3Um&Gr>mdKI;Vst0A7Pep#T5? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/locked.png b/Resources/Textures/Objects/Storage/artifact_container.rsi/locked.png new file mode 100644 index 0000000000000000000000000000000000000000..890a26f1b266733d35564026f3efd906381638d0 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz9Zwg>kcif|=NNez6nL07Nbar= zm)GJ@%oH_YWMI&{G4q|zeAZc8PVQ#-FqQe)N{-h*V`Sa|^)Yz5`njxgN@xNAothle literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/meta.json b/Resources/Textures/Objects/Storage/artifact_container.rsi/meta.json new file mode 100644 index 0000000000..d350f747a2 --- /dev/null +++ b/Resources/Textures/Objects/Storage/artifact_container.rsi/meta.json @@ -0,0 +1,43 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by SpaceRox1244", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon-open" + }, + { + "name": "locked" + }, + { + "name": "unlocked" + }, + { + "name": "paper" + }, + { + "name": "captain" + }, + { + "name": "bounty" + }, + { + "name": "invoice" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/paper.png b/Resources/Textures/Objects/Storage/artifact_container.rsi/paper.png new file mode 100644 index 0000000000000000000000000000000000000000..86a0b218a20631f461b6f75f22bed13b83e7bf8d GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ8c!F;kcif|mp1Y?D2T9JxEyg< z$%^fFz)PN}jkC?R?*~oO$zMze-HvW%f e2N0}S#T;8Nx9dx|$aSDQ7(8A5T-G@yGywp2W<~}8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Storage/artifact_container.rsi/unlocked.png b/Resources/Textures/Objects/Storage/artifact_container.rsi/unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..c02fe83521cf97918b924b3dab3d074043ab455c GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz15X#nkcif|=MHi*DDbds=({NT zcgO$bbAmfKPO_|IVqnm_v3XPa)5rzEFR$!o_%M~3=N#wdC;mp;fqEG{UHx3vIVCg! E0QXuVr~m)} literal 0 HcmV?d00001 From 8f45639661b4489899078abab3b9142bc6f34892 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 23:37:03 +0000 Subject: [PATCH 205/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4fc13817e4..358c645516 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Litraxx - changes: - - message: Renamed the Dungeon Master lawset to Game Master lawset - type: Fix - id: 7706 - time: '2024-12-16T11:52:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33678 - author: psykana changes: - message: Zombies can now see initial infected @@ -3909,3 +3902,11 @@ id: 8205 time: '2025-04-16T23:14:28.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34121 +- author: SpaceRox1244 + changes: + - message: Cargo can now order handheld artifact containers for transporting small + artifacts. + type: Add + id: 8206 + time: '2025-04-16T23:35:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33327 From bfe739e0af3e3c5a3c84977d2995d7950bdffef0 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Thu, 17 Apr 2025 01:51:00 +0200 Subject: [PATCH 206/622] Hydroponic trays can now be bought (#36630) --- .../Prototypes/Catalog/Cargo/cargo_botany.yml | 10 ++++++++++ .../Prototypes/Catalog/Fills/Crates/botany.yml | 10 ++++++++++ .../Entities/Objects/Devices/flatpack.yml | 16 ++++++++++++++++ .../Devices/flatpack.rsi/hydroponics-tray.png | Bin 0 -> 6615 bytes .../Objects/Devices/flatpack.rsi/meta.json | 5 ++++- 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Objects/Devices/flatpack.rsi/hydroponics-tray.png diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml index 0a24240e7d..c1ef2f1a3f 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_botany.yml @@ -47,3 +47,13 @@ cost: 750 category: cargoproduct-category-name-hydroponics group: market + +- type: cargoProduct + id: HydroponicsTray + icon: + sprite: Structures/Hydroponics/containers.rsi + state: hydrotray3 + product: CrateHydroponicsTray + cost: 750 + category: cargoproduct-category-name-hydroponics + group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/botany.yml b/Resources/Prototypes/Catalog/Fills/Crates/botany.yml index 11ee1eaefa..850b69294e 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/botany.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/botany.yml @@ -92,3 +92,13 @@ - id: WatermelonSeeds - id: PeaSeeds - id: CherrySeeds + +- type: entity + id: CrateHydroponicsTray + parent: CrateHydroponics + name: hydroponics tray crate + description: Contains a hydroponics tray flatpack. + components: + - type: StorageFill + contents: + - id: HydroponicsTrayFlatpack diff --git a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml index fa23947c5c..fe15d88942 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml @@ -250,3 +250,19 @@ components: - type: Flatpack entity: ComputerCrewMonitoring + +- type: entity + parent: BaseFlatpack + id: HydroponicsTrayFlatpack + name: hydroponics tray flatpack + description: A flatpack used for constructing a hydroponics tray. + components: + - type: Flatpack + entity: hydroponicsTray + - type: Sprite + layers: + - state: hydroponics-tray + - type: GuideHelp + guides: + - Botany + - Chemicals diff --git a/Resources/Textures/Objects/Devices/flatpack.rsi/hydroponics-tray.png b/Resources/Textures/Objects/Devices/flatpack.rsi/hydroponics-tray.png new file mode 100644 index 0000000000000000000000000000000000000000..9aad5920d83e2dbe784b6d4deaa63d033ef0f9a8 GIT binary patch literal 6615 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 TXm3HDXn~2gE;fZ50u%llIt3>* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json b/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json index 947aca7a33..ac1e6be151 100644 --- a/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/flatpack.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Created by EmoGarbage404 (github) for SS14, solar-assembly-part taken from tgstation and modified at https://tgstation13.org/wiki/Guide_to_construction#Solar_Panels_and_Trackers, ame-part taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1b7952787c06c21ef1623e494dcfe7cb1f46e041; singularity-generator, tesla-generator, radiation-collector, containment-field-generator, tesla-coil, grounding-rod inner icons made by lzk228; emitter made by pigeonpeas. fax-machine made by moomoobeef, modified by ps3moira", + "copyright": "Created by EmoGarbage404 (github) for SS14, solar-assembly-part taken from tgstation and modified at https://tgstation13.org/wiki/Guide_to_construction#Solar_Panels_and_Trackers, ame-part taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1b7952787c06c21ef1623e494dcfe7cb1f46e041; singularity-generator, tesla-generator, radiation-collector, containment-field-generator, tesla-coil, grounding-rod inner icons made by lzk228; emitter made by pigeonpeas. fax-machine made by moomoobeef, modified by ps3moira. hydroponics-tray modified by ScarKy0 (Github).", "size": { "x": 32, "y": 32 @@ -45,6 +45,9 @@ }, { "name": "fax-machine" + }, + { + "name": "hydroponics-tray" } ] } From 54e7b762e30ad241ea92ecc14a23cb9680dd3dde Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 16 Apr 2025 23:52:07 +0000 Subject: [PATCH 207/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 358c645516..5ba3bc4a18 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: psykana - changes: - - message: Zombies can now see initial infected - type: Add - id: 7707 - time: '2024-12-16T11:53:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33665 - author: Plykiya changes: - message: Bombs like stingers and clustergrenades now trigger when destroyed due @@ -3910,3 +3903,10 @@ id: 8206 time: '2025-04-16T23:35:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33327 +- author: ScarKy0 + changes: + - message: Hydroponics tray flatpacks can now be bought for 750 spesos. + type: Add + id: 8207 + time: '2025-04-16T23:51:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36630 From 5a69877fe7e4fabd07d059523d72e46c63797be3 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Thu, 17 Apr 2025 03:42:22 +0300 Subject: [PATCH 208/622] storedOffset bugfix (#33606) * Update ItemGridPiece.cs * Update SharedItemSystem.cs * Update ItemGridPiece.cs * EmoGarbage Review --------- Co-authored-by: EmoGarbage404 --- .../Systems/Storage/Controls/ItemGridPiece.cs | 8 +++++--- Content.Shared/Item/SharedItemSystem.cs | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs b/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs index f4c4158b5c..92035ba8d9 100644 --- a/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs +++ b/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs @@ -163,14 +163,16 @@ public sealed class ItemGridPiece : Control, IEntityControl } // typically you'd divide by two, but since the textures are half a tile, this is done implicitly - var iconPosition = new Vector2((boundingGrid.Width + 1) * size.X + itemComponent.StoredOffset.X * 2, - (boundingGrid.Height + 1) * size.Y + itemComponent.StoredOffset.Y * 2); + var iconOffset = Location.Rotation.RotateVec(itemComponent.StoredOffset) * 2 * UIScale; + var iconPosition = new Vector2( + (boundingGrid.Width + 1) * size.X + iconOffset.X, + (boundingGrid.Height + 1) * size.Y + iconOffset.Y); var iconRotation = Location.Rotation + Angle.FromDegrees(itemComponent.StoredRotation); if (itemComponent.StoredSprite is { } storageSprite) { var scale = 2 * UIScale; - var offset = (((Box2) boundingGrid).Size - Vector2.One) * size; + var offset = (((Box2) boundingGrid).Size - Vector2.One) * size + iconOffset; var sprite = _entityManager.System().Frame0(storageSprite); var spriteBox = new Box2Rotated(new Box2(0f, sprite.Height * scale, sprite.Width * scale, 0f), -iconRotation, Vector2.Zero); diff --git a/Content.Shared/Item/SharedItemSystem.cs b/Content.Shared/Item/SharedItemSystem.cs index a058cb8658..8ba26fd349 100644 --- a/Content.Shared/Item/SharedItemSystem.cs +++ b/Content.Shared/Item/SharedItemSystem.cs @@ -55,6 +55,20 @@ public abstract class SharedItemSystem : EntitySystem Dirty(uid, component); } + /// + /// Sets the offset used for the item's sprite inside the storage UI. + /// Dirties. + /// + [PublicAPI] + public void SetStoredOffset(EntityUid uid, Vector2i newOffset, ItemComponent? component = null) + { + if (!Resolve(uid, ref component, false)) + return; + + component.StoredOffset = newOffset; + Dirty(uid, component); + } + public void SetHeldPrefix(EntityUid uid, string? heldPrefix, bool force = false, ItemComponent? component = null) { if (!Resolve(uid, ref component, false)) From b41ee53dbdb636bf694f7edcd1040c2dcbdd8c0c Mon Sep 17 00:00:00 2001 From: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Date: Wed, 16 Apr 2025 18:02:41 -0700 Subject: [PATCH 209/622] Cleanup various admin buttons (#36312) cleanup --- .../Administration/UI/AdminUIHelpers.cs | 59 ------------------- .../UI/Bwoink/BwoinkControl.xaml | 7 ++- .../UI/Bwoink/BwoinkControl.xaml.cs | 11 ---- .../UI/Notes/AdminNotesLinePopup.xaml | 5 +- .../UI/Tabs/AdminTab/PlayerActionsWindow.xaml | 5 +- .../Tabs/AdminTab/PlayerActionsWindow.xaml.cs | 10 ---- .../Tabs/ObjectsTab/ObjectsTabEntry.xaml.cs | 10 +--- 7 files changed, 11 insertions(+), 96 deletions(-) delete mode 100644 Content.Client/Administration/UI/AdminUIHelpers.cs diff --git a/Content.Client/Administration/UI/AdminUIHelpers.cs b/Content.Client/Administration/UI/AdminUIHelpers.cs deleted file mode 100644 index 89ab33e931..0000000000 --- a/Content.Client/Administration/UI/AdminUIHelpers.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Threading; -using Content.Client.Stylesheets; -using Robust.Client.UserInterface.Controls; -using Timer = Robust.Shared.Timing.Timer; - -namespace Content.Client.Administration.UI; - -public static class AdminUIHelpers -{ - private static void ResetButton(Button button, ConfirmationData data) - { - data.Cancellation.Cancel(); - button.ModulateSelfOverride = null; - button.Text = data.OriginalText; - } - - public static bool RemoveConfirm(Button button, Dictionary confirmations) - { - if (confirmations.Remove(button, out var data)) - { - ResetButton(button, data); - return true; - } - - return false; - } - - public static void RemoveAllConfirms(Dictionary confirmations) - { - foreach (var (button, confirmation) in confirmations) - { - ResetButton(button, confirmation); - } - - confirmations.Clear(); - } - - public static bool TryConfirm(Button button, Dictionary confirmations) - { - if (RemoveConfirm(button, confirmations)) - return true; - - var data = new ConfirmationData(new CancellationTokenSource(), button.Text); - confirmations[button] = data; - - Timer.Spawn(TimeSpan.FromSeconds(5), () => - { - confirmations.Remove(button); - button.ModulateSelfOverride = null; - button.Text = data.OriginalText; - }, data.Cancellation.Token); - - button.ModulateSelfOverride = StyleNano.ButtonColorCautionDefault; - button.Text = Loc.GetString("admin-player-actions-confirm"); - return false; - } -} - -public readonly record struct ConfirmationData(CancellationTokenSource Cancellation, string? OriginalText); diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml index d53101f68e..2c27fdd2ce 100644 --- a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml +++ b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml @@ -1,6 +1,7 @@  + xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"> @@ -18,9 +19,9 @@ [DataField] public List> DynamicPacks = new(); + // Note that this shouldn't be modified dynamically. + // I.e., this + the static recipies should represent all recipies that the lathe can ever make + // Otherwise the material arbitrage test and/or LatheSystem.GetAllBaseRecipes needs to be updated /// /// The lathe's construction queue @@ -81,15 +84,16 @@ namespace Content.Shared.Lathe public sealed class LatheGetRecipesEvent : EntityEventArgs { public readonly EntityUid Lathe; + public readonly LatheComponent Comp; - public bool getUnavailable; + public bool GetUnavailable; public HashSet> Recipes = new(); - public LatheGetRecipesEvent(EntityUid lathe, bool forced) + public LatheGetRecipesEvent(Entity lathe, bool forced) { - Lathe = lathe; - getUnavailable = forced; + (Lathe, Comp) = lathe; + GetUnavailable = forced; } } diff --git a/Content.Shared/Lathe/SharedLatheSystem.cs b/Content.Shared/Lathe/SharedLatheSystem.cs index ae5519d16c..524d83fd84 100644 --- a/Content.Shared/Lathe/SharedLatheSystem.cs +++ b/Content.Shared/Lathe/SharedLatheSystem.cs @@ -34,6 +34,25 @@ public abstract class SharedLatheSystem : EntitySystem BuildInverseRecipeDictionary(); } + /// + /// Get the set of all recipes that a lathe could possibly ever create (e.g., if all techs were unlocked). + /// + public HashSet> GetAllPossibleRecipes(LatheComponent component) + { + var recipes = new HashSet>(); + foreach (var pack in component.StaticPacks) + { + recipes.UnionWith(_proto.Index(pack).Recipes); + } + + foreach (var pack in component.DynamicPacks) + { + recipes.UnionWith(_proto.Index(pack).Recipes); + } + + return recipes; + } + /// /// Add every recipe in the list of recipe packs to a single hashset. /// From 9b1a7dea1da1086eab0eb2421f53b0a49f3185e4 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:24:47 +0200 Subject: [PATCH 229/622] Geiger counters can now be heard by everyone nearby (#30463) * haha geiger counter go brrrrrrr * move hardcoded values to datafields * syntax cleanup --- .../Radiation/Systems/GeigerSystem.cs | 18 +++--- .../Radiation/Components/GeigerComponent.cs | 18 ++++++ .../Entities/Objects/Devices/geiger.yml | 62 +++++++++---------- 3 files changed, 59 insertions(+), 39 deletions(-) diff --git a/Content.Server/Radiation/Systems/GeigerSystem.cs b/Content.Server/Radiation/Systems/GeigerSystem.cs index 9b6ed31781..6cf17c49c8 100644 --- a/Content.Server/Radiation/Systems/GeigerSystem.cs +++ b/Content.Server/Radiation/Systems/GeigerSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Radiation.Systems; using Robust.Server.Audio; using Robust.Server.GameObjects; using Robust.Server.Player; +using Robust.Shared.Player; namespace Content.Server.Radiation.Systems; @@ -155,16 +156,17 @@ public sealed class GeigerSystem : SharedGeigerSystem if (!component.Sounds.TryGetValue(component.DangerLevel, out var sounds)) return; - if (component.User == null) - return; - - if (!_player.TryGetSessionByEntity(component.User.Value, out var session)) - return; - var sound = _audio.ResolveSound(sounds); - var param = sounds.Params.WithLoop(true).WithVolume(-4f); + var param = sounds.Params.WithLoop(true).WithVolume(component.Volume); - component.Stream = _audio.PlayGlobal(sound, session, param)?.Entity; + if (component.BroadcastAudio) + { + // For some reason PlayPvs sounds quieter even at distance 0, so we need to boost the volume a bit for consistency + param = sounds.Params.WithLoop(true).WithVolume(component.Volume + 1.5f).WithMaxDistance(component.BroadcastRange); + component.Stream = _audio.PlayPvs(sound, uid, param)?.Entity; + } + else if(component.User is not null && _player.TryGetSessionByEntity(component.User.Value, out var session)) + component.Stream = _audio.PlayGlobal(sound, session, param)?.Entity; } public static GeigerDangerLevel RadsToLevel(float rads) diff --git a/Content.Shared/Radiation/Components/GeigerComponent.cs b/Content.Shared/Radiation/Components/GeigerComponent.cs index 71edb70b37..34a262e131 100644 --- a/Content.Shared/Radiation/Components/GeigerComponent.cs +++ b/Content.Shared/Radiation/Components/GeigerComponent.cs @@ -83,6 +83,24 @@ public sealed partial class GeigerComponent : Component /// Played only for current user. /// public EntityUid? Stream; + + /// + /// Mark true if the audio should be heard by everyone around the device + /// + [DataField] + public bool BroadcastAudio = false; + + /// + /// The distance within which the broadcast tone can be heard. + /// + [DataField] + public float BroadcastRange = 4f; + + /// + /// The volume of the warning tone. + /// + [DataField] + public float Volume = -4f; } [Serializable, NetSerializable] diff --git a/Resources/Prototypes/Entities/Objects/Devices/geiger.yml b/Resources/Prototypes/Entities/Objects/Devices/geiger.yml index f8ee24c5c6..518d28f2ee 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/geiger.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/geiger.yml @@ -4,34 +4,34 @@ name: Geiger counter description: A handheld device used for detecting and measuring radiation pulses. components: - - type: Sprite - sprite: Objects/Tools/geiger.rsi - layers: - - state: geiger_base - - state: geiger_on_idle - map: ["enum.GeigerLayers.Screen"] - shader: unshaded - visible: false - - type: Item - sprite: Objects/Tools/geiger.rsi - - type: Geiger - showControl: true - showExamine: true - - type: Appearance - - type: GenericVisualizer - visuals: - enum.GeigerVisuals.IsEnabled: - GeigerLayers.Screen: - True: { visible: True } - False: { visible: False } - enum.GeigerVisuals.DangerLevel: - GeigerLayers.Screen: - None: {state: geiger_on_idle} - Low: {state: geiger_on_low} - Med: {state: geiger_on_med} - High: {state: geiger_on_high} - Extreme: {state: geiger_on_ext} - - type: PhysicalComposition - materialComposition: - Plastic: 100 - + - type: Sprite + sprite: Objects/Tools/geiger.rsi + layers: + - state: geiger_base + - state: geiger_on_idle + map: ["enum.GeigerLayers.Screen"] + shader: unshaded + visible: false + - type: Item + sprite: Objects/Tools/geiger.rsi + - type: Geiger + showControl: true + showExamine: true + broadcastAudio: true + - type: Appearance + - type: GenericVisualizer + visuals: + enum.GeigerVisuals.IsEnabled: + GeigerLayers.Screen: + True: { visible: True } + False: { visible: False } + enum.GeigerVisuals.DangerLevel: + GeigerLayers.Screen: + None: {state: geiger_on_idle} + Low: {state: geiger_on_low} + Med: {state: geiger_on_med} + High: {state: geiger_on_high} + Extreme: {state: geiger_on_ext} + - type: PhysicalComposition + materialComposition: + Plastic: 100 From a46ab100ffc58ea2794c86077898861a70d75561 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 17 Apr 2025 11:25:54 +0000 Subject: [PATCH 230/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0c1140a1f1..ff72829f91 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: Bhijn and Myr - changes: - - message: Admins no longer count towards the playercount cap, meaning you no longer - need to wait for multiple people to leave in order to join after an admin has - joined. - type: Tweak - id: 7713 - time: '2024-12-16T14:19:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33424 - author: dragonryan06 changes: - message: 'New cocktail: the Zombie.' @@ -3907,3 +3898,10 @@ id: 8212 time: '2025-04-17T10:38:00.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32796 +- author: Errant + changes: + - message: Handheld geiger counters can now by heard by everyone nearby. + type: Tweak + id: 8213 + time: '2025-04-17T11:24:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30463 From d8281c7d2d867552c88d9f60dda919206b4fa222 Mon Sep 17 00:00:00 2001 From: Velken <8467292+Velken@users.noreply.github.com> Date: Thu, 17 Apr 2025 08:35:27 -0300 Subject: [PATCH 231/622] New component: change alert level on trigger (#36581) * adds component that lets change alert level on trigger * oops, put stuff on wrong folder * missclick, forgor a file * slarti finds ways to improve code * Apply suggestions from code review --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../AlertLevelChangeOnTriggerComponent.cs | 33 +++++++++++++++++++ Content.Server/AlertLevel/AlertLevelSystem.cs | 14 ++++++++ .../AlertLevelChangeOnTriggerSystem.cs | 27 +++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 Content.Server/AlertLevel/AlertLevelChangeOnTriggerComponent.cs create mode 100644 Content.Server/AlertLevel/Systems/AlertLevelChangeOnTriggerSystem.cs diff --git a/Content.Server/AlertLevel/AlertLevelChangeOnTriggerComponent.cs b/Content.Server/AlertLevel/AlertLevelChangeOnTriggerComponent.cs new file mode 100644 index 0000000000..aa6c5ba2bd --- /dev/null +++ b/Content.Server/AlertLevel/AlertLevelChangeOnTriggerComponent.cs @@ -0,0 +1,33 @@ +using Content.Server.AlertLevel.Systems; + +namespace Content.Server.AlertLevel; +/// +/// This component is for changing the alert level of the station when triggered. +/// +[RegisterComponent, Access(typeof(AlertLevelChangeOnTriggerSystem))] +public sealed partial class AlertLevelChangeOnTriggerComponent : Component +{ + /// + ///The alert level to change to when triggered. + /// + [DataField] + public string Level = "blue"; + + /// + ///Whether to play the sound when the alert level changes. + /// + [DataField] + public bool PlaySound = true; + + /// + ///Whether to say the announcement when the alert level changes. + /// + [DataField] + public bool Announce = true; + + /// + ///Force the alert change. This applies if the alert level is not selectable or not. + /// + [DataField] + public bool Force = false; +} diff --git a/Content.Server/AlertLevel/AlertLevelSystem.cs b/Content.Server/AlertLevel/AlertLevelSystem.cs index 0b49d7e4bf..bc02808e7d 100644 --- a/Content.Server/AlertLevel/AlertLevelSystem.cs +++ b/Content.Server/AlertLevel/AlertLevelSystem.cs @@ -116,6 +116,20 @@ public sealed class AlertLevelSystem : EntitySystem return alert.CurrentDelay; } + /// + /// Get the default alert level for a station entity. + /// Returns an empty string if the station has no alert levels defined. + /// + /// The station entity. + public string GetDefaultLevel(Entity station) + { + if (!Resolve(station.Owner, ref station.Comp) || station.Comp.AlertLevels == null) + { + return string.Empty; + } + return station.Comp.AlertLevels.DefaultLevel; + } + /// /// Set the alert level based on the station's entity ID. /// diff --git a/Content.Server/AlertLevel/Systems/AlertLevelChangeOnTriggerSystem.cs b/Content.Server/AlertLevel/Systems/AlertLevelChangeOnTriggerSystem.cs new file mode 100644 index 0000000000..0c9734b943 --- /dev/null +++ b/Content.Server/AlertLevel/Systems/AlertLevelChangeOnTriggerSystem.cs @@ -0,0 +1,27 @@ +using Content.Server.AlertLevel; +using Content.Server.Explosion.EntitySystems; +using Content.Server.Station.Systems; + +namespace Content.Server.AlertLevel.Systems; + +public sealed class AlertLevelChangeOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly AlertLevelSystem _alertLevelSystem = default!; + [Dependency] private readonly StationSystem _station = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(Entity ent, ref TriggerEvent args) + { + var stationUid = _station.GetOwningStation(ent.Owner); + if (!stationUid.HasValue) + return; + + _alertLevelSystem.SetLevel(stationUid.Value, ent.Comp.Level, ent.Comp.PlaySound, ent.Comp.Announce, ent.Comp.Force); + } +} From a85370cc8147f9a0966d86bbf0e860d0b243d8cb Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 17 Apr 2025 13:38:53 +0200 Subject: [PATCH 232/622] minor MindShieldSystem cleanup (#35905) clean up MindShieldSystem --- Content.Server/Mindshield/MindShieldSystem.cs | 29 +++++++------------ .../Objects/Misc/subdermal_implants.yml | 3 -- Resources/Prototypes/tags.yml | 3 -- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/Content.Server/Mindshield/MindShieldSystem.cs b/Content.Server/Mindshield/MindShieldSystem.cs index 63d6bf097e..89ae090acd 100644 --- a/Content.Server/Mindshield/MindShieldSystem.cs +++ b/Content.Server/Mindshield/MindShieldSystem.cs @@ -4,51 +4,44 @@ using Content.Server.Popups; using Content.Server.Roles; using Content.Shared.Database; using Content.Shared.Implants; -using Content.Shared.Implants.Components; using Content.Shared.Mindshield.Components; using Content.Shared.Revolutionary.Components; -using Content.Shared.Tag; using Robust.Shared.Containers; namespace Content.Server.Mindshield; /// -/// System used for checking if the implanted is a Rev or Head Rev. +/// System used for adding or removing components with a mindshield implant +/// as well as checking if the implanted is a Rev or Head Rev. /// public sealed class MindShieldSystem : EntitySystem { [Dependency] private readonly IAdminLogManager _adminLogManager = default!; [Dependency] private readonly RoleSystem _roleSystem = default!; [Dependency] private readonly MindSystem _mindSystem = default!; - [Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; - [ValidatePrototypeId] - public const string MindShieldTag = "MindShield"; - public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(ImplantCheck); + + SubscribeLocalEvent(OnImplantImplanted); SubscribeLocalEvent(OnImplantDraw); } - /// - /// Checks if the implant was a mindshield or not - /// - public void ImplantCheck(EntityUid uid, SubdermalImplantComponent comp, ref ImplantImplantedEvent ev) + private void OnImplantImplanted(Entity ent, ref ImplantImplantedEvent ev) { - if (_tag.HasTag(ev.Implant, MindShieldTag) && ev.Implanted != null) - { - EnsureComp(ev.Implanted.Value); - MindShieldRemovalCheck(ev.Implanted.Value, ev.Implant); - } + if (ev.Implanted == null) + return; + + EnsureComp(ev.Implanted.Value); + MindShieldRemovalCheck(ev.Implanted.Value, ev.Implant); } /// /// Checks if the implanted person was a Rev or Head Rev and remove role or destroy mindshield respectively. /// - public void MindShieldRemovalCheck(EntityUid implanted, EntityUid implant) + private void MindShieldRemovalCheck(EntityUid implanted, EntityUid implant) { if (HasComp(implanted)) { diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index e071a94988..13b906bbd7 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -343,9 +343,6 @@ components: - type: SubdermalImplant - type: MindShieldImplant - - type: Tag - tags: - - MindShield # Centcomm implants diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index be6746141d..bd3644d53c 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -870,9 +870,6 @@ - type: Tag id: MimeHappyHonk -- type: Tag - id: MindShield - - type: Tag id: MindTransferTarget From 9b7af5dfcfc3aa49a91b1df8fa4edee16c57bd33 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 17 Apr 2025 21:43:16 +1000 Subject: [PATCH 233/622] Fix hunger + thirst mispredicts (#36549) * Fix hunger + thirst mispredicts * Review --- Content.Shared/Nutrition/EntitySystems/HungerSystem.cs | 4 ++++ Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index a8697ffee4..be8f19f98c 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -123,6 +123,7 @@ public sealed class HungerSystem : EntitySystem entity.Comp.LastAuthoritativeHungerChangeTime = _timing.CurTime; entity.Comp.LastAuthoritativeHungerValue = ClampHungerWithinThresholds(entity.Comp, value); DirtyField(entity.Owner, entity.Comp, nameof(HungerComponent.LastAuthoritativeHungerChangeTime)); + DirtyField(entity.Owner, entity.Comp, nameof(HungerComponent.LastAuthoritativeHungerValue)); } private void UpdateCurrentThreshold(EntityUid uid, HungerComponent? component = null) @@ -135,6 +136,7 @@ public sealed class HungerSystem : EntitySystem return; component.CurrentThreshold = calculatedHungerThreshold; + DirtyField(uid, component, nameof(HungerComponent.CurrentThreshold)); DoHungerThresholdEffects(uid, component); } @@ -163,10 +165,12 @@ public sealed class HungerSystem : EntitySystem if (component.HungerThresholdDecayModifiers.TryGetValue(component.CurrentThreshold, out var modifier)) { component.ActualDecayRate = component.BaseDecayRate * modifier; + DirtyField(uid, component, nameof(HungerComponent.ActualDecayRate)); SetAuthoritativeHungerValue((uid, component), GetHunger(component)); } component.LastThreshold = component.CurrentThreshold; + DirtyField(uid, component, nameof(HungerComponent.LastThreshold)); } private void DoContinuousHungerEffects(EntityUid uid, HungerComponent? component = null) diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 2937c48d48..052e73cd1b 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -49,6 +49,8 @@ public sealed class ThirstSystem : EntitySystem component.CurrentThirst = _random.Next( (int) component.ThirstThresholds[ThirstThreshold.Thirsty] + 10, (int) component.ThirstThresholds[ThirstThreshold.Okay] - 1); + + DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst)); } component.NextUpdateTime = _timing.CurTime; component.CurrentThirstThreshold = GetThirstThreshold(component, component.CurrentThirst); @@ -56,6 +58,8 @@ public sealed class ThirstSystem : EntitySystem // TODO: Check all thresholds make sense and throw if they don't. UpdateEffects(uid, component); + DirtyFields(uid, component, null, nameof(ThirstComponent.NextUpdateTime), nameof(ThirstComponent.CurrentThirstThreshold), nameof(ThirstComponent.LastThirstThreshold)); + TryComp(uid, out MovementSpeedModifierComponent? moveMod); _movement.RefreshMovementSpeedModifiers(uid, moveMod); } @@ -103,7 +107,7 @@ public sealed class ThirstSystem : EntitySystem component.ThirstThresholds[ThirstThreshold.OverHydrated] ); - EntityManager.DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst)); + DirtyField(uid, component, nameof(ThirstComponent.CurrentThirst)); } private bool IsMovementThreshold(ThirstThreshold threshold) @@ -164,6 +168,9 @@ public sealed class ThirstSystem : EntitySystem _alerts.ClearAlertCategory(uid, component.ThirstyCategory); } + DirtyField(uid, component, nameof(ThirstComponent.LastThirstThreshold)); + DirtyField(uid, component, nameof(ThirstComponent.ActualDecayRate)); + switch (component.CurrentThirstThreshold) { case ThirstThreshold.OverHydrated: From db40bce58f7844901902a7f15e14cbcd094933ca Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Thu, 17 Apr 2025 07:43:28 -0400 Subject: [PATCH 234/622] SpawnAndDeleteEntityCountTest improvements (#34069) * Minor improvements to SpawnAndDeleteEntityCountTest Assert messages * * Now lists added/removed entities on test failure. * Wrapped entity loop in MultipleAsync so all failing ents are reported. * Removed Multiple wrappers on client/server pairs, as they made result formatting ugly. --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- Content.IntegrationTests/Tests/EntityTest.cs | 114 ++++++++++--------- 1 file changed, 63 insertions(+), 51 deletions(-) diff --git a/Content.IntegrationTests/Tests/EntityTest.cs b/Content.IntegrationTests/Tests/EntityTest.cs index 26365d8d96..3992272b5b 100644 --- a/Content.IntegrationTests/Tests/EntityTest.cs +++ b/Content.IntegrationTests/Tests/EntityTest.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using System.Text; using Robust.Shared; using Robust.Shared.Audio.Components; using Robust.Shared.Configuration; @@ -270,70 +271,81 @@ namespace Content.IntegrationTests.Tests // We consider only non-audio entities, as some entities will just play sounds when they spawn. int Count(IEntityManager ent) => ent.EntityCount - ent.Count(); + IEnumerable Entities(IEntityManager entMan) => entMan.GetEntities().Where(entMan.HasComponent); - foreach (var protoId in protoIds) + await Assert.MultipleAsync(async () => { - // TODO fix ninja - // Currently ninja fails to equip their own loadout. - if (protoId == "MobHumanSpaceNinja") - continue; - - var count = Count(server.EntMan); - var clientCount = Count(client.EntMan); - EntityUid uid = default; - await server.WaitPost(() => uid = server.EntMan.SpawnEntity(protoId, coords)); - await pair.RunTicksSync(3); - - // If the entity deleted itself, check that it didn't spawn other entities - if (!server.EntMan.EntityExists(uid)) + foreach (var protoId in protoIds) { - if (Count(server.EntMan) != count) + // TODO fix ninja + // Currently ninja fails to equip their own loadout. + if (protoId == "MobHumanSpaceNinja") + continue; + + var count = Count(server.EntMan); + var clientCount = Count(client.EntMan); + var serverEntities = new HashSet(Entities(server.EntMan)); + var clientEntities = new HashSet(Entities(client.EntMan)); + EntityUid uid = default; + await server.WaitPost(() => uid = server.EntMan.SpawnEntity(protoId, coords)); + await pair.RunTicksSync(3); + + // If the entity deleted itself, check that it didn't spawn other entities + if (!server.EntMan.EntityExists(uid)) { - Assert.Fail($"Server prototype {protoId} failed on deleting itself"); + Assert.That(Count(server.EntMan), Is.EqualTo(count), $"Server prototype {protoId} failed on deleting itself\n" + + BuildDiffString(serverEntities, Entities(server.EntMan), server.EntMan)); + Assert.That(Count(client.EntMan), Is.EqualTo(clientCount), $"Client prototype {protoId} failed on deleting itself\n" + + $"Expected {clientCount} and found {client.EntMan.EntityCount}.\n" + + $"Server count was {count}.\n" + + BuildDiffString(clientEntities, Entities(client.EntMan), client.EntMan)); + continue; } - if (Count(client.EntMan) != clientCount) - { - Assert.Fail($"Client prototype {protoId} failed on deleting itself\n" + - $"Expected {clientCount} and found {Count(client.EntMan)}.\n" + - $"Server was {count}."); - } - continue; - } + // Check that the number of entities has increased. + Assert.That(Count(server.EntMan), Is.GreaterThan(count), $"Server prototype {protoId} failed on spawning as entity count didn't increase\n" + + BuildDiffString(serverEntities, Entities(server.EntMan), server.EntMan)); + Assert.That(Count(client.EntMan), Is.GreaterThan(clientCount), $"Client prototype {protoId} failed on spawning as entity count didn't increase\n" + + $"Expected at least {clientCount} and found {client.EntMan.EntityCount}. " + + $"Server count was {count}.\n" + + BuildDiffString(clientEntities, Entities(client.EntMan), client.EntMan)); - // Check that the number of entities has increased. - if (Count(server.EntMan) <= count) - { - Assert.Fail($"Server prototype {protoId} failed on spawning as entity count didn't increase"); - } + await server.WaitPost(() => server.EntMan.DeleteEntity(uid)); + await pair.RunTicksSync(3); - if (Count(client.EntMan) <= clientCount) - { - Assert.Fail($"Client prototype {protoId} failed on spawning as entity count didn't increase" + - $"Expected at least {clientCount} and found {Count(client.EntMan)}. " + - $"Server was {count}"); + // Check that the number of entities has gone back to the original value. + Assert.That(Count(server.EntMan), Is.EqualTo(count), $"Server prototype {protoId} failed on deletion: count didn't reset properly\n" + + BuildDiffString(serverEntities, Entities(server.EntMan), server.EntMan)); + Assert.That(client.EntMan.EntityCount, Is.EqualTo(clientCount), $"Client prototype {protoId} failed on deletion: count didn't reset properly:\n" + + $"Expected {clientCount} and found {client.EntMan.EntityCount}.\n" + + $"Server count was {count}.\n" + + BuildDiffString(clientEntities, Entities(client.EntMan), client.EntMan)); } - - await server.WaitPost(() => server.EntMan.DeleteEntity(uid)); - await pair.RunTicksSync(3); - - // Check that the number of entities has gone back to the original value. - if (Count(server.EntMan) != count) - { - Assert.Fail($"Server prototype {protoId} failed on deletion count didn't reset properly"); - } - - if (Count(client.EntMan) != clientCount) - { - Assert.Fail($"Client prototype {protoId} failed on deletion count didn't reset properly:\n" + - $"Expected {clientCount} and found {Count(client.EntMan)}.\n" + - $"Server was {count}."); - } - } + }); await pair.CleanReturnAsync(); } + private static string BuildDiffString(IEnumerable oldEnts, IEnumerable newEnts, IEntityManager entMan) + { + var sb = new StringBuilder(); + var addedEnts = newEnts.Except(oldEnts); + var removedEnts = oldEnts.Except(newEnts); + if (addedEnts.Any()) + sb.AppendLine("Listing new entities:"); + foreach (var addedEnt in addedEnts) + { + sb.AppendLine(entMan.ToPrettyString(addedEnt)); + } + if (removedEnts.Any()) + sb.AppendLine("Listing removed entities:"); + foreach (var removedEnt in removedEnts) + { + sb.AppendLine("\t" + entMan.ToPrettyString(removedEnt)); + } + return sb.ToString(); + } + private static bool HasRequiredDataField(Component component) { foreach (var field in component.GetType().GetFields()) From b1c1cb96b5c91c0134660d735ea554fef536dc70 Mon Sep 17 00:00:00 2001 From: Nikolai Korolev Date: Thu, 17 Apr 2025 12:45:35 +0100 Subject: [PATCH 235/622] Fix auto-updates of RobustToolbox on Windows (#33323) * Fix auto-updates of RobustToolbox on Windows * Also fix hooks * Upgrade version of hooks in git_helper script --- BuildChecker/BuildChecker.csproj | 1 - BuildChecker/git_helper.py | 2 +- BuildChecker/hooks/post-checkout | 8 +------- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/BuildChecker/BuildChecker.csproj b/BuildChecker/BuildChecker.csproj index 4bd7fcf78c..c0a0c9e1f3 100644 --- a/BuildChecker/BuildChecker.csproj +++ b/BuildChecker/BuildChecker.csproj @@ -15,7 +15,6 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild python3 - py -3 {C899FCA4-7037-4E49-ABC2-44DE72487110} net4.7.2 false diff --git a/BuildChecker/git_helper.py b/BuildChecker/git_helper.py index becd4506e8..83c41c3403 100644 --- a/BuildChecker/git_helper.py +++ b/BuildChecker/git_helper.py @@ -10,7 +10,7 @@ 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" +CURRENT_HOOKS_VERSION = "3" QUIET = len(sys.argv) == 2 and sys.argv[1] == "--quiet" diff --git a/BuildChecker/hooks/post-checkout b/BuildChecker/hooks/post-checkout index c5662445c2..f34ffd293d 100755 --- a/BuildChecker/hooks/post-checkout +++ b/BuildChecker/hooks/post-checkout @@ -4,10 +4,4 @@ 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 +python3 git_helper.py --quiet From 05ae563e29d53a857188e429357d2908894d2037 Mon Sep 17 00:00:00 2001 From: eoineoineoin Date: Thu, 17 Apr 2025 12:52:38 +0100 Subject: [PATCH 236/622] Fix exception when telepad system plays beam animations (#33010) Fix exception when order sent to telepad Co-authored-by: Milon --- Content.Client/Cargo/Systems/CargoSystem.Telepad.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs b/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs index 312c4e8019..99f9b34387 100644 --- a/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs +++ b/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs @@ -75,10 +75,9 @@ public sealed partial class CargoSystem switch (state) { case CargoTelepadState.Teleporting: - if (_player.HasRunningAnimation(uid, TelepadBeamKey)) - return; - _player.Stop(uid, player, TelepadIdleKey); - _player.Play((uid, player), CargoTelepadBeamAnimation, TelepadBeamKey); + _player.Stop((uid, player), TelepadIdleKey); + if (!_player.HasRunningAnimation(uid, TelepadBeamKey)) + _player.Play((uid, player), CargoTelepadBeamAnimation, TelepadBeamKey); break; case CargoTelepadState.Unpowered: sprite.LayerSetVisible(CargoTelepadLayers.Beam, false); From f72604bf928a670c071b31eaeddb4fb4e872da01 Mon Sep 17 00:00:00 2001 From: Centronias Date: Thu, 17 Apr 2025 05:33:31 -0700 Subject: [PATCH 237/622] Make tank harness smaller in inventories and craftable at lathes (#35590) * Make tank harness smaller in inventories and craftable at lathes * pr comment --- .../Prototypes/Entities/Clothing/OuterClothing/vests.yml | 4 ++++ Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml | 1 + Resources/Prototypes/Recipes/Lathes/misc.yml | 8 ++++++++ 3 files changed, 13 insertions(+) diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml index 06bdb73a7c..e008fba094 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml @@ -127,3 +127,7 @@ sprite: Clothing/OuterClothing/Vests/tankharness.rsi - type: Clothing sprite: Clothing/OuterClothing/Vests/tankharness.rsi + - type: Item + size: Normal # Make smaller than typical outer clothing + shape: + - 0, 0, 0, 1 diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml b/Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml index cb868aa9c2..3ecd39cc98 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/engineering.yml @@ -16,6 +16,7 @@ - HandheldGPSBasic - TRayScanner - UtilityBelt + - ClothingOuterVestTank - HandheldStationMap - ClothingHeadHatWelding - ClothingHeadHatCone diff --git a/Resources/Prototypes/Recipes/Lathes/misc.yml b/Resources/Prototypes/Recipes/Lathes/misc.yml index d0a9b586c0..27316ed08a 100644 --- a/Resources/Prototypes/Recipes/Lathes/misc.yml +++ b/Resources/Prototypes/Recipes/Lathes/misc.yml @@ -237,3 +237,11 @@ completetime: 3 materials: Plastic: 200 + +- type: latheRecipe + id: ClothingOuterVestTank + result: ClothingOuterVestTank + completetime: 2 + materials: + Cloth: 100 + Steel: 50 From 7be38114130885990b24b9895378435b605aedad Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 17 Apr 2025 12:34:38 +0000 Subject: [PATCH 238/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ff72829f91..fbafbed88a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: dragonryan06 - changes: - - message: 'New cocktail: the Zombie.' - type: Add - id: 7714 - time: '2024-12-16T15:25:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32802 - author: SlamBamActionman changes: - message: Added Holy damage to the Chaplain's bible, holy water and the gohei, @@ -3905,3 +3898,13 @@ id: 8213 time: '2025-04-17T11:24:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30463 +- author: Centronias + changes: + - message: Tank harnesses can be made at lathes, similar to utility belts. + type: Add + - message: Tank harnesses take up a 1x2 space in inventories, half of their previous + 2x2. + type: Tweak + id: 8214 + time: '2025-04-17T12:33:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35590 From 700cb02d5e46ba6f5861e4076f3a0b28e399dc2e Mon Sep 17 00:00:00 2001 From: osjarw <62134478+osjarw@users.noreply.github.com> Date: Thu, 17 Apr 2025 15:42:31 +0300 Subject: [PATCH 239/622] Fix HTN task ordering bug (#32909) * first, bad ordering * fix * Revert "first, bad ordering", recording artifacts This reverts commit 22307675d79b417371775a0558c39781f59423d6. --- Content.Server/NPC/HTN/HTNPlanJob.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Content.Server/NPC/HTN/HTNPlanJob.cs b/Content.Server/NPC/HTN/HTNPlanJob.cs index 9c62f5840a..8a57d52a66 100644 --- a/Content.Server/NPC/HTN/HTNPlanJob.cs +++ b/Content.Server/NPC/HTN/HTNPlanJob.cs @@ -56,16 +56,16 @@ public sealed class HTNPlanJob : Job // hence we'll store it here. var appliedStates = new List?>(); - var tasksToProcess = new Queue(); + var tasksToProcess = new Stack(); var finalPlan = new List(); - tasksToProcess.Enqueue(_rootTask); + tasksToProcess.Push(_rootTask); // How many primitive tasks we've added since last record. var primitiveCount = 0; int tasksProcessed = 0; - while (tasksToProcess.TryDequeue(out var currentTask)) + while (tasksToProcess.TryPop(out var currentTask)) { if (tasksProcessed++ > _rootTask.MaximumTasks) throw new Exception("HTN Planner exceeded maximum tasks"); @@ -161,7 +161,7 @@ public sealed class HTNPlanJob : Job /// /// Goes through each compound task branch and tries to find an appropriate one. /// - private bool TryFindSatisfiedMethod(HTNCompoundTask compoundId, Queue tasksToProcess, NPCBlackboard blackboard, ref int mtrIndex) + private bool TryFindSatisfiedMethod(HTNCompoundTask compoundId, Stack tasksToProcess, NPCBlackboard blackboard, ref int mtrIndex) { var compound = _protoManager.Index(compoundId.Task); @@ -182,9 +182,9 @@ public sealed class HTNPlanJob : Job if (!isValid) continue; - foreach (var task in branch.Tasks) + foreach (var task in branch.Tasks.AsEnumerable().Reverse()) { - tasksToProcess.Enqueue(task); + tasksToProcess.Push(task); } return true; @@ -198,7 +198,7 @@ public sealed class HTNPlanJob : Job /// private void RestoreTolastDecomposedTask( Stack decompHistory, - Queue tasksToProcess, + Stack tasksToProcess, List?> appliedStates, List finalPlan, ref int primitiveCount, @@ -223,7 +223,7 @@ public sealed class HTNPlanJob : Job primitiveCount = lastDecomp.PrimitiveCount; blackboard = lastDecomp.Blackboard; - tasksToProcess.Enqueue(lastDecomp.CompoundTask); + tasksToProcess.Push(lastDecomp.CompoundTask); } /// From e16365d1bf6b1a485c3b637034c24ba611a33cea Mon Sep 17 00:00:00 2001 From: Jacktastic09 <148667265+Jacktastic09@users.noreply.github.com> Date: Thu, 17 Apr 2025 23:43:44 +1000 Subject: [PATCH 240/622] Add Solid Headband (#36650) * Added The Solid Headband, avaliable from hacked clothesmates * Added The Solid Headband, avaliable from hacked clothesmates --- .../Inventories/clothesmate.yml | 1 + .../Entities/Clothing/Head/hats.yml | 11 ++++++++ .../solidheadband.rsi/equipped-HELMET.png | Bin 0 -> 464 bytes .../Head/Hats/solidheadband.rsi/icon.png | Bin 0 -> 366 bytes .../Hats/solidheadband.rsi/inhand-left.png | Bin 0 -> 468 bytes .../Hats/solidheadband.rsi/inhand-right.png | Bin 0 -> 462 bytes .../Head/Hats/solidheadband.rsi/meta.json | 26 ++++++++++++++++++ 7 files changed, 38 insertions(+) create mode 100644 Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 4b5688a46f..8e0f09a287 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -99,4 +99,5 @@ ToyFigurinePassenger: 1 ToyFigurineGreytider: 1 ClothingBackpackSatchelSmugglerUnanchored: 1 + ClothingHeadHatSolidHeadband: 2 # DO NOT ADD MORE, USE UNIFORM DYING diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 6264748293..64d55a2dd9 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -1148,3 +1148,14 @@ sprite: Clothing/Head/Hats/beret_medic.rsi - type: Clothing sprite: Clothing/Head/Hats/beret_medic.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatSolidHeadband + name: solid headband + description: "You'll feel like you're Invisible while wearing this! (DISCLAIMER: DOES NOT ACTUALLY MAKE THE WEARER INVISIBLE)" + components: + - type: Sprite + sprite: Clothing/Head/Hats/solidheadband.rsi + - type: Clothing + sprite: Clothing/Head/Hats/solidheadband.rsi diff --git a/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0b70fb48fb4da4e8242c4527c44717b17c036e GIT binary patch literal 464 zcmV;>0WbcEP)Px$ib+I4RCr$Pnz0SSKnz962o#777=Q*gpk!7`Hh_i!*Z@&5LXeS+tSD0cMR&60 ze5xoh=kND_=j&Dr|8)zWe?;(nc z)T;R5eqP?USdCj)W9xCNLssM^7b+$Jj9pMrL1Pys=IrQ8(qJ!W*vlFA3^f6{q%jFV z4{o`mF9CqmmS`maglOg(I00E95I|OE(YcralvLI_CLpV`=v+(yN-Ap|6Oh$ebS@?U zC6%>~3CQX!Iu{dwlFC}g1Y~scGhW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..439e6ce1a030fb955f6e3cbbd3ae80b86cde629f GIT binary patch literal 366 zcmV-!0g?WRP)Px$C`m*?R9Hvtl)(!@K@i5*4WT5QcyW*-2PX$7f4G}+au9_BJ@1615NG$P)()m|LLKz@&uUc0tf36>1&c^!86-xSC2aCJkVx^{y?KUer1|aTFMt30y z6AcOy!#C&1_r)2& z&_!c$^(X{EULoHOD_cMhLY&TFuPd6C)|2Or9z#{sa~eXE%1lj&2Ke-Y#Mce*7UaFM zRSHG~2q!lo?Y1d?<1OImsU=@+0lCBw+7t#Qu?1mpzH`?Za0DEI8^(pEAp`Ix_W%F@ M07*qoM6N<$f=vdOWB>pF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..a667e3c1f4d31dbf86be91e0405b729429df983b GIT binary patch literal 468 zcmV;_0W1EAP)Px$j!8s8RCr$PnlWy|KoCXO7eGSDqNGCwqoU<-NXID z1=F}{Tj0O8y88sAX8_8qsWSkz>9KU+EijgG)H(!!B575J39wo@ly4>gMbfGc6JWJ+ zDBnx~ilkK?CctXtP`;S}6iKT(On}wOp?os|D3Vrnm;kGlL-}R`P$aGDFacI8hw{w? zph$|2%mw9FI}z^VDILJ(3}c}Qh@z{5zJhy$a>56J zGDOX1Ss?82dNM-^Q%0>29>o_~{=BUzeZKi`cu_h7uh_RS6DOGeUE=SYu^^e zBJRic%h{63|4aSyl6;`~Aw1B;DRj@|B;WX34I*b-e7f%bZGUz0^Ch;7F7t=7QWsjL m1by>h3fgtM<<>LK9}Kn39gZo5OEv)`h{4m<&t;ucLK6Tcoy9u< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/meta.json new file mode 100644 index 0000000000..36f70f342b --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/solidheadband.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprited by Jacktastic09 (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From d1abf36111ae861396914e2c26506bcd867fe04f Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 17 Apr 2025 13:44:51 +0000 Subject: [PATCH 241/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fbafbed88a..7ca98f88b1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Added Holy damage to the Chaplain's bible, holy water and the gohei, - which can be exclusively dealt to spirits. - type: Add - id: 7715 - time: '2024-12-16T15:33:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32755 - author: Vexerot changes: - message: Security Belts and Security Carriers now provide 10% reduced explosion @@ -3908,3 +3900,10 @@ id: 8214 time: '2025-04-17T12:33:31.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35590 +- author: Jacktastic09 + changes: + - message: Added the Solid Headband, available via hacked ClothesMate vending machines + type: Add + id: 8215 + time: '2025-04-17T13:43:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36650 From 6c1b350c12f2fd7ffd78733d60cfc53133506dd6 Mon Sep 17 00:00:00 2001 From: Alexandre Courtin Date: Thu, 17 Apr 2025 16:05:27 +0200 Subject: [PATCH 242/622] Banjo can now be worn on your back. (#34057) * Banjo can now be worn on your back * Added banjo backpack sprite * Reduced banjo backpack sprite size * Added my username to copyright * 2nd try banjo backpack sprite * 3rd banjo backpack sprite * EmoGarbage Review - Adjust Strap Color --------- Co-authored-by: Hoodie Co-authored-by: EmoGarbage404 --- .../Fun/Instruments/instruments_string.yml | 6 ++++++ .../Instruments/banjo.rsi/equipped-BACKPACK.png | Bin 0 -> 983 bytes .../banjo.rsi/equipped-SUITSTORAGE.png | Bin 0 -> 983 bytes .../Objects/Fun/Instruments/banjo.rsi/meta.json | 10 +++++++++- 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Objects/Fun/Instruments/banjo.rsi/equipped-BACKPACK.png create mode 100644 Resources/Textures/Objects/Fun/Instruments/banjo.rsi/equipped-SUITSTORAGE.png diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml index ed1520ff99..f1ba8faf96 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml @@ -184,6 +184,12 @@ - type: Item size: Normal sprite: Objects/Fun/Instruments/banjo.rsi + - type: Clothing + quickEquip: false + slots: + - back + - suitStorage + sprite: Objects/Fun/Instruments/banjo.rsi - type: Tag tags: - StringInstrument diff --git a/Resources/Textures/Objects/Fun/Instruments/banjo.rsi/equipped-BACKPACK.png b/Resources/Textures/Objects/Fun/Instruments/banjo.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000000000000000000000000000000000..204f53416a12cf5ec90f44b21e725257e90a29bc GIT binary patch literal 983 zcmV;|11S87P)Px&kx4{BRCt{2nomd+Q5?s=Gvn%xe|A~ZgA~ddcv(Xhp`^1{FGe@94pB?69;^

x~n@o^E$|)P`kc;jx#R2&uL)Z z{(j&0d%xdrX5Slt!{Kl^#?d>_M{b>!h|epLeDEzAEh04N$Db`=Gr23sX!}O{Haq}j zw!Le=@48^L{Y>-@^br={h6cdrl}Jq8y*}sfHPZBfga-X!@qHv2KvJ5itA8AP0|1)b z4$|f^zxnyR5_$i$i^;d4k!o@~$jq{0YV>_xiImxZm z_`DLi)Nu5^0RWjgtQnJU^GGBxGeM%iBINfPGe;7C?mAzIAU;Ir6^}6eK%d|Jcf#IdC`}4u`|xa5x-J{?S%%w`4d+r12q(y0IA$SqLMc=g$Xa30*{FAxt%vYF5F~KB^2jF36&e z;AkJ!SgHW*s2ZY5{`?_|Dk^qV&1xAO4u`|xa5$V}&0nroe$g62MPx&kx4{BRCt{2nomd+Q5?s=Gvn%xe|A~ZgA~ddcv(Xhp`^1{FGe@94pB?69;^

x~n@o^E$|)P`kc;jx#R2&uL)Z z{(j&0d%xdrX5Slt!{Kl^#?d>_M{b>!h|epLeDEzAEh04N$Db`=Gr23sX!}O{Haq}j zw!Le=@48^L{Y>-@^br={h6cdrl}Jq8y*}sfHPZBfga-X!@qHv2KvJ5itA8AP0|1)b z4$|f^zxnyR5_$i$i^;d4k!o@~$jq{0YV>_xiImxZm z_`DLi)Nu5^0RWjgtQnJU^GGBxGeM%iBINfPGe;7C?mAzIAU;Ir6^}6eK%d|Jcf#IdC`}4u`|xa5x-J{?S%%w`4d+r12q(y0IA$SqLMc=g$Xa30*{FAxt%vYF5F~KB^2jF36&e z;AkJ!SgHW*s2ZY5{`?_|Dk^qV&1xAO4u`|xa5$V}&0nroe$g62M Date: Thu, 17 Apr 2025 14:06:34 +0000 Subject: [PATCH 243/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7ca98f88b1..db2db28a6c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Vexerot - changes: - - message: Security Belts and Security Carriers now provide 10% reduced explosion - damage to contents. - type: Tweak - id: 7716 - time: '2024-12-16T16:27:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33253 - author: goet changes: - message: Spaceshrooms can now be cooked on the electric grill. @@ -3907,3 +3899,10 @@ id: 8215 time: '2025-04-17T13:43:44.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36650 +- author: Hoodie42 + changes: + - message: The banjo can now be worn on the back or suit storage slots. + type: Tweak + id: 8216 + time: '2025-04-17T14:05:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34057 From 8f68d7c7a2a1496f0b0b1469a08851a1b5f9d7da Mon Sep 17 00:00:00 2001 From: mubururu_ <139181059+muburu@users.noreply.github.com> Date: Thu, 17 Apr 2025 16:05:14 -0500 Subject: [PATCH 244/622] random names for space dragons (#36656) * raoooaoaouurrr * forgot to save before initial * title changes * new format who dis * forgot i made 30 --- .../Locale/en-US/datasets/names/dragon.ftl | 30 +++++++++++++++++++ .../en-US/datasets/names/dragon_title.ftl | 30 +++++++++++++++++++ .../random-metadata-formats.ftl | 1 + .../Prototypes/Datasets/Names/dragon.yml | 11 +++++++ .../Entities/Mobs/Player/dragon.yml | 5 ++++ 5 files changed, 77 insertions(+) create mode 100644 Resources/Locale/en-US/datasets/names/dragon.ftl create mode 100644 Resources/Locale/en-US/datasets/names/dragon_title.ftl create mode 100644 Resources/Prototypes/Datasets/Names/dragon.yml diff --git a/Resources/Locale/en-US/datasets/names/dragon.ftl b/Resources/Locale/en-US/datasets/names/dragon.ftl new file mode 100644 index 0000000000..836b1f13b8 --- /dev/null +++ b/Resources/Locale/en-US/datasets/names/dragon.ftl @@ -0,0 +1,30 @@ +names-dragon-dataset-1 = Dayle +names-dragon-dataset-2 = Phlogdor +names-dragon-dataset-3 = Nidir +names-dragon-dataset-4 = Smaoge +names-dragon-dataset-5 = Aldooin +names-dragon-dataset-6 = Wrathalos +names-dragon-dataset-7 = Four-Eyes +names-dragon-dataset-8 = Flamespew +names-dragon-dataset-9 = Daniel +names-dragon-dataset-10 = Blacksmoke +names-dragon-dataset-11 = Spacemaw +names-dragon-dataset-12 = Cyprinidus +names-dragon-dataset-13 = Infernax +names-dragon-dataset-14 = Charrster +names-dragon-dataset-15 = Nebulon +names-dragon-dataset-16 = Stellarinus +names-dragon-dataset-17 = Tinderbreath +names-dragon-dataset-18 = Galaxeus +names-dragon-dataset-19 = Slagjaw +names-dragon-dataset-20 = Volkanus +names-dragon-dataset-21 = Pyronia +names-dragon-dataset-22 = Cosmisse +names-dragon-dataset-23 = Mortalis +names-dragon-dataset-24 = Robustous +names-dragon-dataset-25 = Skalameet +names-dragon-dataset-26 = Finh +names-dragon-dataset-27 = Toastarinus +names-dragon-dataset-28 = Embergill +names-dragon-dataset-29 = Doomwing +names-dragon-dataset-30 = Celesteus diff --git a/Resources/Locale/en-US/datasets/names/dragon_title.ftl b/Resources/Locale/en-US/datasets/names/dragon_title.ftl new file mode 100644 index 0000000000..b6710a601c --- /dev/null +++ b/Resources/Locale/en-US/datasets/names/dragon_title.ftl @@ -0,0 +1,30 @@ +names-dragon-title-dataset-1 = the Dread +names-dragon-title-dataset-2 = the Scorchinator +names-dragon-title-dataset-3 = the Carpmonger +names-dragon-title-dataset-4 = the Invincible +names-dragon-title-dataset-5 = the Destroyer +names-dragon-title-dataset-6 = the Evanescent +names-dragon-title-dataset-7 = the Spicy +names-dragon-title-dataset-8 = the Terrible +names-dragon-title-dataset-9 = the Unstoppable +names-dragon-title-dataset-10 = the Uncouth +names-dragon-title-dataset-11 = the Unquenchable +names-dragon-title-dataset-12 = the Mean +names-dragon-title-dataset-13 = of the West +names-dragon-title-dataset-14 = of the East +names-dragon-title-dataset-15 = of the Stars +names-dragon-title-dataset-16 = the Unremarkable +names-dragon-title-dataset-17 = the Undefeated +names-dragon-title-dataset-18 = the Enraged +names-dragon-title-dataset-19 = the Infuriated +names-dragon-title-dataset-20 = the Odoriferous +names-dragon-title-dataset-21 = the Eternal +names-dragon-title-dataset-22 = the Fell +names-dragon-title-dataset-23 = the Temporary +names-dragon-title-dataset-24 = the Indestructible +names-dragon-title-dataset-25 = the Unpleasant +names-dragon-title-dataset-26 = the Unreasonable +names-dragon-title-dataset-27 = the Ever-Hungry +names-dragon-title-dataset-28 = the Conspicuous +names-dragon-title-dataset-29 = the Pestiferous +names-dragon-title-dataset-30 = the Incinerator diff --git a/Resources/Locale/en-US/random-metadata/random-metadata-formats.ftl b/Resources/Locale/en-US/random-metadata/random-metadata-formats.ftl index 2060315620..fb572b6c7a 100644 --- a/Resources/Locale/en-US/random-metadata/random-metadata-formats.ftl +++ b/Resources/Locale/en-US/random-metadata/random-metadata-formats.ftl @@ -8,6 +8,7 @@ name-format-regal-rat = {$part0} {$part1} name-format-revenant = The {$part0} of {$part1} {$part2} name-format-ninja = {$part0} {$part1} name-format-wizard = {$part0} {$part1} +name-format-dragon = {$part0} {$part1} # " <name>" name-format-nukie-generic = {$part0} {$part1} diff --git a/Resources/Prototypes/Datasets/Names/dragon.yml b/Resources/Prototypes/Datasets/Names/dragon.yml new file mode 100644 index 0000000000..c385605d5f --- /dev/null +++ b/Resources/Prototypes/Datasets/Names/dragon.yml @@ -0,0 +1,11 @@ +- type: localizedDataset + id: NamesDragon + values: + prefix: names-dragon-dataset- + count: 30 + +- type: localizedDataset + id: NamesDragonTitle + values: + prefix: names-dragon-title-dataset- + count: 30 diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index 91d1b95b6e..2c335b8ee4 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -154,6 +154,11 @@ - DoorBumpOpener - type: Puller needsHands: false + - type: RandomMetadata + nameSegments: + - NamesDragon + - NamesDragonTitle + nameFormat: name-format-dragon - type: entity parent: BaseMobDragon From 8f729b01ef1b1fdb021a7bf2ec0cc200b027b92f Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 17 Apr 2025 21:06:23 +0000 Subject: [PATCH 245/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index db2db28a6c..ee7ab3802d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: goet - changes: - - message: Spaceshrooms can now be cooked on the electric grill. - type: Tweak - id: 7717 - time: '2024-12-16T17:53:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/31872 - author: Beck Thompson changes: - message: Figures can now be activated with signals! @@ -3906,3 +3899,10 @@ id: 8216 time: '2025-04-17T14:05:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34057 +- author: muburu + changes: + - message: Space Dragons now have randomly generated names. + type: Add + id: 8217 + time: '2025-04-17T21:05:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36656 From 40a999d6db18b0f28ae85bebf7c34d1feb6e8b31 Mon Sep 17 00:00:00 2001 From: archee1 <archee3@hotmail.co.uk> Date: Fri, 18 Apr 2025 02:15:25 +0100 Subject: [PATCH 246/622] Allowing Cats to walk (#36542) * Adds the ability for Syndicats to walk * Moved walking speed modifier to the base MobCat from MobCatSyndy * Fixes Cak's flipped sprinting/walking speeds --- Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 3 +++ .../Entities/Objects/Consumable/Food/Baked/cake.yml | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 3b56f53dce..a7aca49505 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -2967,6 +2967,9 @@ - type: Tag tags: - VimPilot + - type: MovementSpeedModifier + baseWalkSpeed: 2 + baseSprintSpeed: 4 - type: entity name: calico cat diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index 6b2fe3ef4e..d5bf403d2e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -759,8 +759,8 @@ speechSounds: Cat speechVerb: SmallMob - type: MovementSpeedModifier - baseWalkSpeed : 5 - baseSprintSpeed : 3 + baseWalkSpeed : 3 + baseSprintSpeed : 5 - type: Tag tags: - VimPilot From 4f24b25cf9403b02e07de931f88e051b656f057a Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 01:16:33 +0000 Subject: [PATCH 247/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ee7ab3802d..033eb01f5b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Beck Thompson - changes: - - message: Figures can now be activated with signals! - type: Add - id: 7718 - time: '2024-12-16T18:52:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32769 - author: TheShuEd changes: - message: Christmas anomaly added @@ -3906,3 +3899,13 @@ id: 8217 time: '2025-04-17T21:05:14.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36656 +- author: archee1 + changes: + - message: Cats can walk slowly to avoid slipping on puddles. + type: Tweak + - message: Cak's (cake cats) previously incorrect sprinting and walking speeds have + been corrected + type: Fix + id: 8218 + time: '2025-04-18T01:15:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36542 From e0308d091365ba4b23e74d45c5244b1288f611d5 Mon Sep 17 00:00:00 2001 From: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Date: Fri, 18 Apr 2025 03:23:02 +0200 Subject: [PATCH 248/622] Contraband examine changes (again) (#36032) * g * no one caught it in review, damn --- Content.Shared/Contraband/ContrabandSystem.cs | 19 +++++++----------- .../Examine/ExamineSystemShared.Group.cs | 4 ++-- .../Interface/VerbIcons/ATTRIBUTION.txt | 4 ++-- .../Textures/Interface/VerbIcons/lock-red.svg | 1 + .../VerbIcons/lock-red.svg.192dpi.png | Bin 0 -> 2215 bytes .../VerbIcons/lock-red.svg.192dpi.png.yml | 2 ++ .../Interface/VerbIcons/unlock-green.svg | 1 + .../VerbIcons/unlock-green.svg.192dpi.png | Bin 0 -> 2152 bytes .../VerbIcons/unlock-green.svg.192dpi.png.yml | 2 ++ 9 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 Resources/Textures/Interface/VerbIcons/lock-red.svg create mode 100644 Resources/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png create mode 100644 Resources/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png.yml create mode 100644 Resources/Textures/Interface/VerbIcons/unlock-green.svg create mode 100644 Resources/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png create mode 100644 Resources/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png.yml diff --git a/Content.Shared/Contraband/ContrabandSystem.cs b/Content.Shared/Contraband/ContrabandSystem.cs index bfd7100289..c998875c87 100644 --- a/Content.Shared/Contraband/ContrabandSystem.cs +++ b/Content.Shared/Contraband/ContrabandSystem.cs @@ -84,26 +84,21 @@ public sealed class ContrabandSystem : EntitySystem } } - String carryingMessage; - // either its fully restricted, you have no departments, or your departments dont intersect with the restricted departments + // if it is fully restricted, you're department-less, or your department isn't in the allowed list, you cannot carry it. Otherwise, you can. + var carryingMessage = Loc.GetString("contraband-examine-text-avoid-carrying-around"); + var iconTexture = "/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png"; if (departments.Intersect(component.AllowedDepartments).Any() || jobs.Contains(jobId)) { carryingMessage = Loc.GetString("contraband-examine-text-in-the-clear"); + iconTexture = "/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png"; } - else - { - // otherwise fine to use :tm: - carryingMessage = Loc.GetString("contraband-examine-text-avoid-carrying-around"); - } - var examineMarkup = GetContrabandExamine(departmentExamineMessage, carryingMessage); - _examine.AddDetailedExamineVerb(args, + _examine.AddHoverExamineVerb(args, component, - examineMarkup, Loc.GetString("contraband-examinable-verb-text"), - "/Textures/Interface/VerbIcons/lock.svg.192dpi.png", - Loc.GetString("contraband-examinable-verb-message")); + examineMarkup.ToMarkup(), + iconTexture); } private FormattedMessage GetContrabandExamine(String deptMessage, String carryMessage) diff --git a/Content.Shared/Examine/ExamineSystemShared.Group.cs b/Content.Shared/Examine/ExamineSystemShared.Group.cs index 299d3c4af2..64b70d0af3 100644 --- a/Content.Shared/Examine/ExamineSystemShared.Group.cs +++ b/Content.Shared/Examine/ExamineSystemShared.Group.cs @@ -184,9 +184,9 @@ namespace Content.Shared.Examine /// <summary> /// Adds an icon aligned to the left of examine window that gives you info on hover. /// </summary> - public void AddHoverExamineVerb(GetVerbsEvent<ExamineVerb> verbsEvent, Component component, string hoverMessage, string iconTexture = DefaultIconTexture) + public void AddHoverExamineVerb(GetVerbsEvent<ExamineVerb> verbsEvent, Component component, string verbText, string hoverMessage, string iconTexture = DefaultIconTexture) { - AddDetailedExamineVerb(verbsEvent, component, FormattedMessage.Empty, "", iconTexture, hoverMessage, true); + AddDetailedExamineVerb(verbsEvent, component, FormattedMessage.Empty, verbText, iconTexture, hoverMessage, true); } } } diff --git a/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt b/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt index 1c71df2d5c..bb584a7c20 100644 --- a/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt +++ b/Resources/Textures/Interface/VerbIcons/ATTRIBUTION.txt @@ -2,10 +2,10 @@ All icons are public domain. Pulled mostly from this source https://github.com/apancik/public-domain-icons. -lock.svg by Lorc under CC BY 3.0 +lock.svg and lock-red.svg by Lorc under CC BY 3.0 https://game-icons.net/1x1/lorc/padlock.html -unlock.svg by Delapouite under CC BY 3.0 +unlock.svg and unlock-green by Delapouite under CC BY 3.0 https://game-icons.net/1x1/delapouite/padlock-open.html bubbles.svg by Lorc under CC BY 3.0 diff --git a/Resources/Textures/Interface/VerbIcons/lock-red.svg b/Resources/Textures/Interface/VerbIcons/lock-red.svg new file mode 100644 index 0000000000..ba2546dcab --- /dev/null +++ b/Resources/Textures/Interface/VerbIcons/lock-red.svg @@ -0,0 +1 @@ +<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g class="" style="" transform="translate(0,0)"><path d="M254.28 17.313c-81.048 0-146.624 65.484-146.624 146.406V236h49.594v-69.094c0-53.658 43.47-97.187 97.03-97.187 53.563 0 97.032 44.744 97.032 97.186V236h49.594v-72.28c0-78.856-65.717-146.407-146.625-146.407zM85.157 254.688c-14.61 22.827-22.844 49.148-22.844 76.78 0 88.358 84.97 161.5 191.97 161.5 106.998 0 191.968-73.142 191.968-161.5 0-27.635-8.26-53.95-22.875-76.78H85.155zM254 278.625c22.34 0 40.875 17.94 40.875 40.28 0 16.756-10.6 31.23-25.125 37.376l32.72 98.126h-96.376l32.125-98.125c-14.526-6.145-24.532-20.62-24.532-37.374 0-22.338 17.972-40.28 40.312-40.28z" fill="#8b0000" fill-opacity="1" style="--darkreader-inline-fill: var(--darkreader-background-8b0000, #6f0000);" data-darkreader-inline-fill=""></path></g></svg> \ No newline at end of file diff --git a/Resources/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png b/Resources/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png new file mode 100644 index 0000000000000000000000000000000000000000..0801b8c27900596d86f74a661872328dc27f438e GIT binary patch literal 2215 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png.yml b/Resources/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png.yml new file mode 100644 index 0000000000..5c43e23305 --- /dev/null +++ b/Resources/Textures/Interface/VerbIcons/lock-red.svg.192dpi.png.yml @@ -0,0 +1,2 @@ +sample: + filter: true diff --git a/Resources/Textures/Interface/VerbIcons/unlock-green.svg b/Resources/Textures/Interface/VerbIcons/unlock-green.svg new file mode 100644 index 0000000000..83a61cca34 --- /dev/null +++ b/Resources/Textures/Interface/VerbIcons/unlock-green.svg @@ -0,0 +1 @@ +<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><g class="" style="" transform="translate(0,0)"><path d="M402.6 164.6c0-78.92-65.7-146.47-146.6-146.47-81.1 0-146.6 65.49-146.6 146.47v72.3H159v-69.1c0-53.7 43.4-97.26 97-97.26 53.5 0 97 41.66 97 94.06zm-315.7 91C72.2 278.4 64 304.7 64 332.4c0 88.3 85 161.5 192 161.5s192-73.2 192-161.5c0-27.7-8.3-54-22.9-76.8zm168.8 23.9c22.3 0 40.9 18 40.9 40.3 0 16.8-10.6 31.2-25.1 37.3l32.7 98.2h-96.4l32.1-98.2c-14.5-6.1-24.5-20.6-24.5-37.3 0-22.3 18-40.3 40.3-40.3z" fill="#006400" fill-opacity="1" style="--darkreader-inline-fill: var(--darkreader-background-006400, #005000);" data-darkreader-inline-fill=""></path></g></svg> \ No newline at end of file diff --git a/Resources/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png b/Resources/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png new file mode 100644 index 0000000000000000000000000000000000000000..baad170847fbd103cd17f56f19f6d5a9a9d19d9a GIT binary patch literal 2152 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 S`;KKu156DquqFDW$ln0vh5O?G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png.yml b/Resources/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png.yml new file mode 100644 index 0000000000..5c43e23305 --- /dev/null +++ b/Resources/Textures/Interface/VerbIcons/unlock-green.svg.192dpi.png.yml @@ -0,0 +1,2 @@ +sample: + filter: true From 944aa579072609e57c36ae5f9c0b5f5bf321f010 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 01:24:08 +0000 Subject: [PATCH 249/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 033eb01f5b..c15b2c29f8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Christmas anomaly added - type: Add - - message: Christmas anomaly infection added - type: Add - id: 7719 - time: '2024-12-16T19:23:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33889 - author: chromiumboy changes: - message: Added the atmospheric network monitor. Use these consoles to monitor @@ -3909,3 +3900,13 @@ id: 8218 time: '2025-04-18T01:15:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36542 +- author: Killerqu00 + changes: + - message: Contraband examine icon now shows whether or not you are allowed to possess + the item. + type: Add + - message: Contraband examine activates by hovering instead of clicking. + type: Tweak + id: 8219 + time: '2025-04-18T01:23:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36032 From 2c60d6b27f047c4011be6302f9e96af40e1013ef Mon Sep 17 00:00:00 2001 From: gus <august.eymann@gmail.com> Date: Thu, 17 Apr 2025 18:34:38 -0700 Subject: [PATCH 250/622] RCD Refactor (#34781) * fixed prediction (hopefully), removed caching of prototype, sealed the class, removed any and count * erroneus using statement * removed unused timing, removed obsolete method of getting gridUid * nuked mapgriddata * code cleanup * cleanup * this has to be a string without me rewriting more code than i want to in this moment * kill --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com> --- Content.Client/RCD/AlignRCDConstruction.cs | 10 +- .../RCD/RCDConstructionGhostSystem.cs | 11 +- Content.Shared/RCD/Components/RCDComponent.cs | 16 +- Content.Shared/RCD/RCDEvents.cs | 21 +- Content.Shared/RCD/RCDPrototype.cs | 21 +- Content.Shared/RCD/Systems/RCDSystem.cs | 225 ++++++++---------- 6 files changed, 129 insertions(+), 175 deletions(-) diff --git a/Content.Client/RCD/AlignRCDConstruction.cs b/Content.Client/RCD/AlignRCDConstruction.cs index ef99b01855..fbaf62c83d 100644 --- a/Content.Client/RCD/AlignRCDConstruction.cs +++ b/Content.Client/RCD/AlignRCDConstruction.cs @@ -96,20 +96,22 @@ public sealed class AlignRCDConstruction : PlacementMode if (!_entityManager.TryGetComponent<RCDComponent>(heldEntity, out var rcd)) return false; - // Retrieve the map grid data for the position - if (!_rcdSystem.TryGetMapGridData(position, out var mapGridData)) + var gridUid = _transformSystem.GetGrid(position); + if (!_entityManager.TryGetComponent<MapGridComponent>(gridUid, out var mapGrid)) return false; + var tile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, position); + var posVector = _mapSystem.TileIndicesFor(gridUid.Value, mapGrid, position); // Determine if the user is hovering over a target var currentState = _stateManager.CurrentState; if (currentState is not GameplayStateBase screen) return false; - + var target = screen.GetClickedEntity(_transformSystem.ToMapCoordinates(_unalignedMouseCoords)); // Determine if the RCD operation is valid or not - if (!_rcdSystem.IsRCDOperationStillValid(heldEntity.Value, rcd, mapGridData.Value, target, player.Value, false)) + if (!_rcdSystem.IsRCDOperationStillValid(heldEntity.Value, rcd, gridUid.Value, mapGrid, tile, posVector, target, player.Value, false)) return false; return true; diff --git a/Content.Client/RCD/RCDConstructionGhostSystem.cs b/Content.Client/RCD/RCDConstructionGhostSystem.cs index 792916b892..0b6876005a 100644 --- a/Content.Client/RCD/RCDConstructionGhostSystem.cs +++ b/Content.Client/RCD/RCDConstructionGhostSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.RCD.Systems; using Robust.Client.Placement; using Robust.Client.Player; using Robust.Shared.Enums; +using Robust.Shared.Prototypes; namespace Content.Client.RCD; @@ -14,6 +15,7 @@ public sealed class RCDConstructionGhostSystem : EntitySystem [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly RCDSystem _rcdSystem = default!; [Dependency] private readonly IPlacementManager _placementManager = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; private string _placementMode = typeof(AlignRCDConstruction).Name; private Direction _placementDirection = default; @@ -47,6 +49,7 @@ public sealed class RCDConstructionGhostSystem : EntitySystem return; } + var prototype = _protoManager.Index(rcd.ProtoId); // Update the direction the RCD prototype based on the placer direction if (_placementDirection != _placementManager.Direction) @@ -56,9 +59,7 @@ public sealed class RCDConstructionGhostSystem : EntitySystem } // If the placer has not changed, exit - _rcdSystem.UpdateCachedPrototype(heldEntity.Value, rcd); - - if (heldEntity == placerEntity && rcd.CachedPrototype.Prototype == placerProto) + if (heldEntity == placerEntity && prototype.Prototype == placerProto) return; // Create a new placer @@ -66,9 +67,9 @@ public sealed class RCDConstructionGhostSystem : EntitySystem { MobUid = heldEntity.Value, PlacementOption = _placementMode, - EntityType = rcd.CachedPrototype.Prototype, + EntityType = prototype.Prototype, Range = (int) Math.Ceiling(SharedInteractionSystem.InteractionRange), - IsTile = (rcd.CachedPrototype.Mode == RcdMode.ConstructTile), + IsTile = (prototype.Mode == RcdMode.ConstructTile), UseEditorContext = false, }; diff --git a/Content.Shared/RCD/Components/RCDComponent.cs b/Content.Shared/RCD/Components/RCDComponent.cs index 39bb6fd3e9..1ea3166531 100644 --- a/Content.Shared/RCD/Components/RCDComponent.cs +++ b/Content.Shared/RCD/Components/RCDComponent.cs @@ -33,25 +33,13 @@ public sealed partial class RCDComponent : Component [DataField, AutoNetworkedField] public ProtoId<RCDPrototype> ProtoId { get; set; } = "Invalid"; - /// <summary> - /// A cached copy of currently selected RCD prototype - /// </summary> - /// <remarks> - /// If the ProtoId is changed, make sure to update the CachedPrototype as well - /// </remarks> - [ViewVariables(VVAccess.ReadOnly)] - public RCDPrototype CachedPrototype { get; set; } = default!; - /// <summary> /// The direction constructed entities will face upon spawning /// </summary> [DataField, AutoNetworkedField] public Direction ConstructionDirection { - get - { - return _constructionDirection; - } + get => _constructionDirection; set { _constructionDirection = value; @@ -68,5 +56,5 @@ public sealed partial class RCDComponent : Component /// Contains no position data /// </remarks> [ViewVariables(VVAccess.ReadOnly)] - public Transform ConstructionTransform { get; private set; } = default!; + public Transform ConstructionTransform { get; private set; } } diff --git a/Content.Shared/RCD/RCDEvents.cs b/Content.Shared/RCD/RCDEvents.cs index a15a010277..6871ec178e 100644 --- a/Content.Shared/RCD/RCDEvents.cs +++ b/Content.Shared/RCD/RCDEvents.cs @@ -4,27 +4,16 @@ using Robust.Shared.Serialization; namespace Content.Shared.RCD; [Serializable, NetSerializable] -public sealed class RCDSystemMessage : BoundUserInterfaceMessage +public sealed class RCDSystemMessage(ProtoId<RCDPrototype> protoId) : BoundUserInterfaceMessage { - public ProtoId<RCDPrototype> ProtoId; - - public RCDSystemMessage(ProtoId<RCDPrototype> protoId) - { - ProtoId = protoId; - } + public ProtoId<RCDPrototype> ProtoId = protoId; } [Serializable, NetSerializable] -public sealed class RCDConstructionGhostRotationEvent : EntityEventArgs +public sealed class RCDConstructionGhostRotationEvent(NetEntity netEntity, Direction direction) : EntityEventArgs { - public readonly NetEntity NetEntity; - public readonly Direction Direction; - - public RCDConstructionGhostRotationEvent(NetEntity netEntity, Direction direction) - { - NetEntity = netEntity; - Direction = direction; - } + public readonly NetEntity NetEntity = netEntity; + public readonly Direction Direction = direction; } [Serializable, NetSerializable] diff --git a/Content.Shared/RCD/RCDPrototype.cs b/Content.Shared/RCD/RCDPrototype.cs index 58093bbe87..b00f59f049 100644 --- a/Content.Shared/RCD/RCDPrototype.cs +++ b/Content.Shared/RCD/RCDPrototype.cs @@ -6,10 +6,10 @@ using Robust.Shared.Utility; namespace Content.Shared.RCD; /// <summary> -/// Contains the parameters for a RCD construction / operation +/// Contains the parameters for an RCD construction / operation /// </summary> [Prototype("rcd")] -public sealed partial class RCDPrototype : IPrototype +public sealed class RCDPrototype : IPrototype { [IdDataField] public string ID { get; private set; } = default!; @@ -36,13 +36,13 @@ public sealed partial class RCDPrototype : IPrototype /// Texture path for this prototypes menu icon /// </summary> [DataField, ViewVariables(VVAccess.ReadOnly)] - public SpriteSpecifier? Sprite { get; private set; } = null; + public SpriteSpecifier? Sprite { get; private set; } /// <summary> /// The entity prototype that will be constructed (mode dependent) /// </summary> [DataField, ViewVariables(VVAccess.ReadOnly)] - public string? Prototype { get; private set; } = string.Empty; + public string? Prototype { get; private set; } /// <summary> /// Number of charges consumed when the operation is completed @@ -60,10 +60,10 @@ public sealed partial class RCDPrototype : IPrototype /// The visual effect that plays during this operation /// </summary> [DataField("fx"), ViewVariables(VVAccess.ReadOnly)] - public EntProtoId? Effect { get; private set; } = null; + public EntProtoId? Effect { get; private set; } /// <summary> - /// A list of rules that govern where the entity prototype can be contructed + /// A list of rules that govern where the entity prototype can be constructed /// </summary> [DataField("rules"), ViewVariables(VVAccess.ReadOnly)] public HashSet<RcdConstructionRule> ConstructionRules { get; private set; } = new(); @@ -84,10 +84,7 @@ public sealed partial class RCDPrototype : IPrototype [DataField, ViewVariables(VVAccess.ReadOnly)] public Box2? CollisionBounds { - get - { - return _collisionBounds; - } + get => _collisionBounds; private set { @@ -103,13 +100,13 @@ public sealed partial class RCDPrototype : IPrototype } } - private Box2? _collisionBounds = null; + private Box2? _collisionBounds; /// <summary> /// The polygon shape associated with the prototype CollisionBounds (if set) /// </summary> [ViewVariables(VVAccess.ReadOnly)] - public PolygonShape? CollisionPolygon { get; private set; } = null; + public PolygonShape? CollisionPolygon { get; private set; } /// <summary> /// Governs how the local rotation of the constructed entity will be set diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index a5c2af39ae..83d6660e8e 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -22,16 +22,12 @@ using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Dynamics; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Timing; -using System.Diagnostics.CodeAnalysis; using System.Linq; namespace Content.Shared.RCD.Systems; -[Virtual] -public class RCDSystem : EntitySystem +public sealed class RCDSystem : EntitySystem { - [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; @@ -47,6 +43,7 @@ public class RCDSystem : EntitySystem [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TagSystem _tags = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; private readonly int _instantConstructionDelay = 0; private readonly EntProtoId _instantConstructionFx = "EffectRCDConstruct0"; @@ -74,10 +71,9 @@ public class RCDSystem : EntitySystem private void OnMapInit(EntityUid uid, RCDComponent component, MapInitEvent args) { // On init, set the RCD to its first available recipe - if (component.AvailablePrototypes.Any()) + if (component.AvailablePrototypes.Count > 0) { - component.ProtoId = component.AvailablePrototypes.First(); - UpdateCachedPrototype(uid, component); + component.ProtoId = component.AvailablePrototypes.ElementAt(0); Dirty(uid, component); return; @@ -98,7 +94,6 @@ public class RCDSystem : EntitySystem // Set the current RCD prototype to the one supplied component.ProtoId = args.ProtoId; - UpdateCachedPrototype(uid, component); Dirty(uid, component); } @@ -107,17 +102,16 @@ public class RCDSystem : EntitySystem if (!args.IsInDetailsRange) return; - // Update cached prototype if required - UpdateCachedPrototype(uid, component); + var prototype = _protoManager.Index(component.ProtoId); - var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.SetName))); + var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(prototype.SetName))); - if (component.CachedPrototype.Mode == RcdMode.ConstructTile || component.CachedPrototype.Mode == RcdMode.ConstructObject) + if (prototype.Mode == RcdMode.ConstructTile || prototype.Mode == RcdMode.ConstructObject) { - var name = Loc.GetString(component.CachedPrototype.SetName); + var name = Loc.GetString(prototype.SetName); - if (component.CachedPrototype.Prototype != null && - _protoManager.TryIndex(component.CachedPrototype.Prototype, out var proto)) + if (prototype.Prototype != null && + _protoManager.TryIndex(prototype.Prototype, out var proto)) name = proto.Name; msg = Loc.GetString("rcd-component-examine-build-details", ("name", name)); @@ -133,32 +127,37 @@ public class RCDSystem : EntitySystem var user = args.User; var location = args.ClickLocation; + var prototype = _protoManager.Index(component.ProtoId); // Initial validity checks if (!location.IsValid(EntityManager)) return; - if (!TryGetMapGridData(location, out var mapGridData)) + var gridUid = _transformSystem.GetGrid(location); + + if (!TryComp<MapGridComponent>(gridUid, out var mapGrid)) { _popup.PopupClient(Loc.GetString("rcd-component-no-valid-grid"), uid, user); return; } + var tile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, location); + var position = _mapSystem.TileIndicesFor(gridUid.Value, mapGrid, location); - if (!IsRCDOperationStillValid(uid, component, mapGridData.Value, args.Target, args.User)) + if (!IsRCDOperationStillValid(uid, component, gridUid.Value, mapGrid, tile, position, args.Target, args.User)) return; if (!_net.IsServer) return; // Get the starting cost, delay, and effect from the prototype - var cost = component.CachedPrototype.Cost; - var delay = component.CachedPrototype.Delay; - var effectPrototype = component.CachedPrototype.Effect; + var cost = prototype.Cost; + var delay = prototype.Delay; + var effectPrototype = prototype.Effect; #region: Operation modifiers // Deconstruction modifiers - switch (component.CachedPrototype.Mode) + switch (prototype.Mode) { case RcdMode.Deconstruct: @@ -176,7 +175,7 @@ public class RCDSystem : EntitySystem // Deconstructing a tile else { - var deconstructedTile = _mapSystem.GetTileRef(mapGridData.Value.GridUid, mapGridData.Value.Component, mapGridData.Value.Location); + var deconstructedTile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, location); var protoName = !deconstructedTile.IsSpace() ? _deconstructTileProto : _deconstructLatticeProto; if (_protoManager.TryIndex(protoName, out var deconProto)) @@ -192,7 +191,7 @@ public class RCDSystem : EntitySystem case RcdMode.ConstructTile: // If replacing a tile, make the construction instant - var contructedTile = _mapSystem.GetTileRef(mapGridData.Value.GridUid, mapGridData.Value.Component, mapGridData.Value.Location); + var contructedTile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, location); if (!contructedTile.Tile.IsEmpty) { @@ -206,8 +205,8 @@ public class RCDSystem : EntitySystem #endregion // Try to start the do after - var effect = Spawn(effectPrototype, mapGridData.Value.Location); - var ev = new RCDDoAfterEvent(GetNetCoordinates(mapGridData.Value.Location), component.ConstructionDirection, component.ProtoId, cost, EntityManager.GetNetEntity(effect)); + var effect = Spawn(effectPrototype, location); + var ev = new RCDDoAfterEvent(GetNetCoordinates(location), component.ConstructionDirection, component.ProtoId, cost, EntityManager.GetNetEntity(effect)); var doAfterArgs = new DoAfterArgs(EntityManager, user, delay, ev, uid, target: args.Target, used: uid) { @@ -240,37 +239,53 @@ public class RCDSystem : EntitySystem // Ensure the RCD operation is still valid var location = GetCoordinates(args.Event.Location); - if (!TryGetMapGridData(location, out var mapGridData)) + var gridUid = _transformSystem.GetGrid(location); + + if (!TryComp<MapGridComponent>(gridUid, out var mapGrid)) { args.Cancel(); return; } - if (!IsRCDOperationStillValid(uid, component, mapGridData.Value, args.Event.Target, args.Event.User)) + + var tile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, location); + var position = _mapSystem.TileIndicesFor(gridUid.Value, mapGrid, location); + + if (!IsRCDOperationStillValid(uid, component, gridUid.Value, mapGrid, tile, position, args.Event.Target, args.Event.User)) args.Cancel(); } private void OnDoAfter(EntityUid uid, RCDComponent component, RCDDoAfterEvent args) { - if (args.Cancelled && _net.IsServer) - QueueDel(EntityManager.GetEntity(args.Effect)); + if (args.Cancelled) + { + // Delete the effect entity if the do-after was cancelled (server-side only) + if (_net.IsServer) + QueueDel(EntityManager.GetEntity(args.Effect)); + return; + } - if (args.Handled || args.Cancelled || !_timing.IsFirstTimePredicted) + if (args.Handled) return; args.Handled = true; var location = GetCoordinates(args.Location); - if (!TryGetMapGridData(location, out var mapGridData)) + var gridUid = _transformSystem.GetGrid(location); + + if (!TryComp<MapGridComponent>(gridUid, out var mapGrid)) return; + var tile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, location); + var position = _mapSystem.TileIndicesFor(gridUid.Value, mapGrid, location); + // Ensure the RCD operation is still valid - if (!IsRCDOperationStillValid(uid, component, mapGridData.Value, args.Target, args.User)) + if (!IsRCDOperationStillValid(uid, component, gridUid.Value, mapGrid, tile, position, args.Target, args.User)) return; - // Finalize the operation - FinalizeRCDOperation(uid, component, mapGridData.Value, args.Direction, args.Target, args.User); + // Finalize the operation (this should handle prediction properly) + FinalizeRCDOperation(uid, component, gridUid.Value, mapGrid, tile, position, args.Direction, args.Target, args.User); // Play audio and consume charges _audio.PlayPredicted(component.SuccessSound, uid, args.User); @@ -301,10 +316,9 @@ public class RCDSystem : EntitySystem #region Entity construction/deconstruction rule checks - public bool IsRCDOperationStillValid(EntityUid uid, RCDComponent component, MapGridData mapGridData, EntityUid? target, EntityUid user, bool popMsgs = true) + public bool IsRCDOperationStillValid(EntityUid uid, RCDComponent component, EntityUid gridUid, MapGridComponent mapGrid, TileRef tile, Vector2i position, EntityUid? target, EntityUid user, bool popMsgs = true) { - // Update cached prototype if required - UpdateCachedPrototype(uid, component); + var prototype = _protoManager.Index(component.ProtoId); // Check that the RCD has enough ammo to get the job done TryComp<LimitedChargesComponent>(uid, out var charges); @@ -318,7 +332,7 @@ public class RCDSystem : EntitySystem return false; } - if (_charges.HasInsufficientCharges(uid, component.CachedPrototype.Cost, charges)) + if (_charges.HasInsufficientCharges(uid, prototype.Cost, charges)) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-insufficient-ammo-message"), uid, user); @@ -328,27 +342,31 @@ public class RCDSystem : EntitySystem // Exit if the target / target location is obstructed var unobstructed = (target == null) - ? _interaction.InRangeUnobstructed(user, _mapSystem.GridTileToWorld(mapGridData.GridUid, mapGridData.Component, mapGridData.Position), popup: popMsgs) + ? _interaction.InRangeUnobstructed(user, _mapSystem.GridTileToWorld(gridUid, mapGrid, position), popup: popMsgs) : _interaction.InRangeUnobstructed(user, target.Value, popup: popMsgs); if (!unobstructed) return false; // Return whether the operation location is valid - switch (component.CachedPrototype.Mode) + switch (prototype.Mode) { - case RcdMode.ConstructTile: return IsConstructionLocationValid(uid, component, mapGridData, user, popMsgs); - case RcdMode.ConstructObject: return IsConstructionLocationValid(uid, component, mapGridData, user, popMsgs); - case RcdMode.Deconstruct: return IsDeconstructionStillValid(uid, component, mapGridData, target, user, popMsgs); + case RcdMode.ConstructTile: + case RcdMode.ConstructObject: + return IsConstructionLocationValid(uid, component, gridUid, mapGrid, tile, position, user, popMsgs); + case RcdMode.Deconstruct: + return IsDeconstructionStillValid(uid, tile, target, user, popMsgs); } return false; } - private bool IsConstructionLocationValid(EntityUid uid, RCDComponent component, MapGridData mapGridData, EntityUid user, bool popMsgs = true) + private bool IsConstructionLocationValid(EntityUid uid, RCDComponent component, EntityUid gridUid, MapGridComponent mapGrid, TileRef tile, Vector2i position, EntityUid user, bool popMsgs = true) { + var prototype = _protoManager.Index(component.ProtoId); + // Check rule: Must build on empty tile - if (component.CachedPrototype.ConstructionRules.Contains(RcdConstructionRule.MustBuildOnEmptyTile) && !mapGridData.Tile.Tile.IsEmpty) + if (prototype.ConstructionRules.Contains(RcdConstructionRule.MustBuildOnEmptyTile) && !tile.Tile.IsEmpty) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-must-build-on-empty-tile-message"), uid, user); @@ -357,7 +375,7 @@ public class RCDSystem : EntitySystem } // Check rule: Must build on non-empty tile - if (!component.CachedPrototype.ConstructionRules.Contains(RcdConstructionRule.CanBuildOnEmptyTile) && mapGridData.Tile.Tile.IsEmpty) + if (!prototype.ConstructionRules.Contains(RcdConstructionRule.CanBuildOnEmptyTile) && tile.Tile.IsEmpty) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-cannot-build-on-empty-tile-message"), uid, user); @@ -366,7 +384,7 @@ public class RCDSystem : EntitySystem } // Check rule: Must place on subfloor - if (component.CachedPrototype.ConstructionRules.Contains(RcdConstructionRule.MustBuildOnSubfloor) && !mapGridData.Tile.Tile.GetContentTileDefinition().IsSubFloor) + if (prototype.ConstructionRules.Contains(RcdConstructionRule.MustBuildOnSubfloor) && !tile.Tile.GetContentTileDefinition().IsSubFloor) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-must-build-on-subfloor-message"), uid, user); @@ -375,10 +393,10 @@ public class RCDSystem : EntitySystem } // Tile specific rules - if (component.CachedPrototype.Mode == RcdMode.ConstructTile) + if (prototype.Mode == RcdMode.ConstructTile) { // Check rule: Tile placement is valid - if (!_floors.CanPlaceTile(mapGridData.GridUid, mapGridData.Component, out var reason)) + if (!_floors.CanPlaceTile(gridUid, mapGrid, out var reason)) { if (popMsgs) _popup.PopupClient(reason, uid, user); @@ -387,7 +405,7 @@ public class RCDSystem : EntitySystem } // Check rule: Tiles can't be identical - if (mapGridData.Tile.Tile.GetContentTileDefinition().ID == component.CachedPrototype.Prototype) + if (tile.Tile.GetContentTileDefinition().ID == prototype.Prototype) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-cannot-build-identical-tile"), uid, user); @@ -402,11 +420,11 @@ public class RCDSystem : EntitySystem // Entity specific rules // Check rule: The tile is unoccupied - var isWindow = component.CachedPrototype.ConstructionRules.Contains(RcdConstructionRule.IsWindow); - var isCatwalk = component.CachedPrototype.ConstructionRules.Contains(RcdConstructionRule.IsCatwalk); + var isWindow = prototype.ConstructionRules.Contains(RcdConstructionRule.IsWindow); + var isCatwalk = prototype.ConstructionRules.Contains(RcdConstructionRule.IsCatwalk); _intersectingEntities.Clear(); - _lookup.GetLocalEntitiesIntersecting(mapGridData.GridUid, mapGridData.Position, _intersectingEntities, -0.05f, LookupFlags.Uncontained); + _lookup.GetLocalEntitiesIntersecting(gridUid, position, _intersectingEntities, -0.05f, LookupFlags.Uncontained); foreach (var ent in _intersectingEntities) { @@ -421,17 +439,17 @@ public class RCDSystem : EntitySystem return false; } - if (component.CachedPrototype.CollisionMask != CollisionGroup.None && TryComp<FixturesComponent>(ent, out var fixtures)) + if (prototype.CollisionMask != CollisionGroup.None && TryComp<FixturesComponent>(ent, out var fixtures)) { foreach (var fixture in fixtures.Fixtures.Values) { // Continue if no collision is possible - if (!fixture.Hard || fixture.CollisionLayer <= 0 || (fixture.CollisionLayer & (int) component.CachedPrototype.CollisionMask) == 0) + if (!fixture.Hard || fixture.CollisionLayer <= 0 || (fixture.CollisionLayer & (int) prototype.CollisionMask) == 0) continue; // Continue if our custom collision bounds are not intersected - if (component.CachedPrototype.CollisionPolygon != null && - !DoesCustomBoundsIntersectWithFixture(component.CachedPrototype.CollisionPolygon, component.ConstructionTransform, ent, fixture)) + if (prototype.CollisionPolygon != null && + !DoesCustomBoundsIntersectWithFixture(prototype.CollisionPolygon, component.ConstructionTransform, ent, fixture)) continue; // Collision was detected @@ -446,13 +464,13 @@ public class RCDSystem : EntitySystem return true; } - private bool IsDeconstructionStillValid(EntityUid uid, RCDComponent component, MapGridData mapGridData, EntityUid? target, EntityUid user, bool popMsgs = true) + private bool IsDeconstructionStillValid(EntityUid uid, TileRef tile, EntityUid? target, EntityUid user, bool popMsgs = true) { // Attempt to deconstruct a floor tile if (target == null) { // The tile is empty - if (mapGridData.Tile.Tile.IsEmpty) + if (tile.Tile.IsEmpty) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-nothing-to-deconstruct-message"), uid, user); @@ -461,7 +479,7 @@ public class RCDSystem : EntitySystem } // The tile has a structure sitting on it - if (_turf.IsTileBlocked(mapGridData.Tile, CollisionGroup.MobMask)) + if (_turf.IsTileBlocked(tile, CollisionGroup.MobMask)) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-tile-obstructed-message"), uid, user); @@ -470,7 +488,7 @@ public class RCDSystem : EntitySystem } // The tile cannot be destroyed - var tileDef = (ContentTileDefinition) _tileDefMan[mapGridData.Tile.Tile.TypeId]; + var tileDef = (ContentTileDefinition) _tileDefMan[tile.Tile.TypeId]; if (tileDef.Indestructible) { @@ -501,25 +519,27 @@ public class RCDSystem : EntitySystem #region Entity construction/deconstruction - private void FinalizeRCDOperation(EntityUid uid, RCDComponent component, MapGridData mapGridData, Direction direction, EntityUid? target, EntityUid user) + private void FinalizeRCDOperation(EntityUid uid, RCDComponent component, EntityUid gridUid, MapGridComponent mapGrid, TileRef tile, Vector2i position, Direction direction, EntityUid? target, EntityUid user) { if (!_net.IsServer) return; - if (component.CachedPrototype.Prototype == null) + var prototype = _protoManager.Index(component.ProtoId); + + if (prototype.Prototype == null) return; - switch (component.CachedPrototype.Mode) + switch (prototype.Mode) { case RcdMode.ConstructTile: - _mapSystem.SetTile(mapGridData.GridUid, mapGridData.Component, mapGridData.Position, new Tile(_tileDefMan[component.CachedPrototype.Prototype].TileId)); - _adminLogger.Add(LogType.RCD, LogImpact.High, $"{ToPrettyString(user):user} used RCD to set grid: {mapGridData.GridUid} {mapGridData.Position} to {component.CachedPrototype.Prototype}"); + _mapSystem.SetTile(gridUid, mapGrid, position, new Tile(_tileDefMan[prototype.Prototype].TileId)); + _adminLogger.Add(LogType.RCD, LogImpact.High, $"{ToPrettyString(user):user} used RCD to set grid: {gridUid} {position} to {prototype.Prototype}"); break; case RcdMode.ConstructObject: - var ent = Spawn(component.CachedPrototype.Prototype, _mapSystem.GridTileToLocal(mapGridData.GridUid, mapGridData.Component, mapGridData.Position)); + var ent = Spawn(prototype.Prototype, _mapSystem.GridTileToLocal(gridUid, mapGrid, position)); - switch (component.CachedPrototype.Rotation) + switch (prototype.Rotation) { case RcdRotation.Fixed: Transform(ent).LocalRotation = Angle.Zero; @@ -532,7 +552,7 @@ public class RCDSystem : EntitySystem break; } - _adminLogger.Add(LogType.RCD, LogImpact.High, $"{ToPrettyString(user):user} used RCD to spawn {ToPrettyString(ent)} at {mapGridData.Position} on grid {mapGridData.GridUid}"); + _adminLogger.Add(LogType.RCD, LogImpact.High, $"{ToPrettyString(user):user} used RCD to spawn {ToPrettyString(ent)} at {position} on grid {gridUid}"); break; case RcdMode.Deconstruct: @@ -540,9 +560,9 @@ public class RCDSystem : EntitySystem if (target == null) { // Deconstruct tile (either converts the tile to lattice, or removes lattice) - var tile = (mapGridData.Tile.Tile.GetContentTileDefinition().ID != "Lattice") ? new Tile(_tileDefMan["Lattice"].TileId) : Tile.Empty; - _mapSystem.SetTile(mapGridData.GridUid, mapGridData.Component, mapGridData.Position, tile); - _adminLogger.Add(LogType.RCD, LogImpact.High, $"{ToPrettyString(user):user} used RCD to set grid: {mapGridData.GridUid} tile: {mapGridData.Position} open to space"); + var tileDef = (tile.Tile.GetContentTileDefinition().ID != "Lattice") ? new Tile(_tileDefMan["Lattice"].TileId) : Tile.Empty; + _mapSystem.SetTile(gridUid, mapGrid, position, tileDef); + _adminLogger.Add(LogType.RCD, LogImpact.High, $"{ToPrettyString(user):user} used RCD to set grid: {gridUid} tile: {position} open to space"); } else { @@ -559,28 +579,6 @@ public class RCDSystem : EntitySystem #region Utility functions - public bool TryGetMapGridData(EntityCoordinates location, [NotNullWhen(true)] out MapGridData? mapGridData) - { - mapGridData = null; - var gridUid = _transform.GetGrid(location); - - if (!TryComp<MapGridComponent>(gridUid, out var mapGrid)) - { - location = location.AlignWithClosestGridTile(1.75f, EntityManager); - gridUid = _transform.GetGrid(location); - - // Check if we got a grid ID the second time round - if (!TryComp(gridUid, out mapGrid)) - return false; - } - - var tile = _mapSystem.GetTileRef(gridUid.Value, mapGrid, location); - var position = _mapSystem.TileIndicesFor(gridUid.Value, mapGrid, location); - mapGridData = new MapGridData(gridUid.Value, mapGrid, location, tile, position); - - return true; - } - private bool DoesCustomBoundsIntersectWithFixture(PolygonShape boundingPolygon, Transform boundingTransform, EntityUid fixtureOwner, Fixture fixture) { var entXformComp = Transform(fixtureOwner); @@ -589,50 +587,26 @@ public class RCDSystem : EntitySystem return boundingPolygon.ComputeAABB(boundingTransform, 0).Intersects(fixture.Shape.ComputeAABB(entXform, 0)); } - public void UpdateCachedPrototype(EntityUid uid, RCDComponent component) - { - if (component.ProtoId.Id != component.CachedPrototype?.Prototype) - component.CachedPrototype = _protoManager.Index(component.ProtoId); - } - #endregion } -public struct MapGridData -{ - public EntityUid GridUid; - public MapGridComponent Component; - public EntityCoordinates Location; - public TileRef Tile; - public Vector2i Position; - - public MapGridData(EntityUid gridUid, MapGridComponent component, EntityCoordinates location, TileRef tile, Vector2i position) - { - GridUid = gridUid; - Component = component; - Location = location; - Tile = tile; - Position = position; - } -} - [Serializable, NetSerializable] public sealed partial class RCDDoAfterEvent : DoAfterEvent { [DataField(required: true)] - public NetCoordinates Location { get; private set; } = default!; + public NetCoordinates Location { get; private set; } [DataField] - public Direction Direction { get; private set; } = default!; + public Direction Direction { get; private set; } [DataField] - public ProtoId<RCDPrototype> StartingProtoId { get; private set; } = default!; + public ProtoId<RCDPrototype> StartingProtoId { get; private set; } [DataField] public int Cost { get; private set; } = 1; [DataField("fx")] - public NetEntity? Effect { get; private set; } = null; + public NetEntity? Effect { get; private set; } private RCDDoAfterEvent() { } @@ -645,5 +619,8 @@ public sealed partial class RCDDoAfterEvent : DoAfterEvent Effect = effect; } - public override DoAfterEvent Clone() => this; + public override DoAfterEvent Clone() + { + return this; + } } From fb912b3d5cdffeee6674b494780e900f4e866036 Mon Sep 17 00:00:00 2001 From: mjarduk <66081585+mjarduk@users.noreply.github.com> Date: Fri, 18 Apr 2025 04:59:41 +0300 Subject: [PATCH 251/622] Added the ability to refuel torches (and other expendable lights) (#36209) * Added expendable light source refueling. Also fixed it to use the name modifier system so attributes like glue show up. * Removed a duplicate line of code. * Replaced TryGetComponent with TryComp, changed a variable name to be a little more clear. * Removed the removed field "spentDesc" in flares and glowsticks * Fixed to comply with slarticodefast's review. Name modifiers don't work yet (fixing that tmr) * Fixed the localization!!!! :DDDD --- .../EntitySystems/ExpendableLightSystem.cs | 54 ++++++++++++++++--- .../SharedExpendableLightComponent.cs | 43 ++++++++------- .../components/expendable-light-component.ftl | 14 +---- .../Entities/Objects/Misc/torch.yml | 4 +- .../Entities/Objects/Tools/flare.yml | 2 - .../Entities/Objects/Tools/glowstick.yml | 2 - 6 files changed, 73 insertions(+), 46 deletions(-) diff --git a/Content.Server/Light/EntitySystems/ExpendableLightSystem.cs b/Content.Server/Light/EntitySystems/ExpendableLightSystem.cs index 7aacf3e7ad..393f564b2f 100644 --- a/Content.Server/Light/EntitySystems/ExpendableLightSystem.cs +++ b/Content.Server/Light/EntitySystems/ExpendableLightSystem.cs @@ -1,10 +1,14 @@ using Content.Server.Light.Components; +using Content.Server.Stack; using Content.Shared.Clothing.Components; using Content.Shared.Clothing.EntitySystems; using Content.Shared.IgnitionSource; +using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Item; using Content.Shared.Light.Components; +using Content.Shared.NameModifier.EntitySystems; +using Content.Shared.Stacks; using Content.Shared.Tag; using Content.Shared.Verbs; using JetBrains.Annotations; @@ -23,7 +27,8 @@ namespace Content.Server.Light.EntitySystems [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly StackSystem _stackSystem = default!; + [Dependency] private readonly NameModifierSystem _nameModifier = default!; private static readonly ProtoId<TagPrototype> TrashTag = "Trash"; @@ -34,6 +39,8 @@ namespace Content.Server.Light.EntitySystems SubscribeLocalEvent<ExpendableLightComponent, ComponentInit>(OnExpLightInit); SubscribeLocalEvent<ExpendableLightComponent, UseInHandEvent>(OnExpLightUse); SubscribeLocalEvent<ExpendableLightComponent, GetVerbsEvent<ActivationVerb>>(AddIgniteVerb); + SubscribeLocalEvent<ExpendableLightComponent, InteractUsingEvent>(OnInteractUsing); + SubscribeLocalEvent<ExpendableLightComponent, RefreshNameModifiersEvent>(OnRefreshNameModifiers); } public override void Update(float frameTime) @@ -59,7 +66,7 @@ namespace Content.Server.Light.EntitySystems { case ExpendableLightState.Lit: component.CurrentState = ExpendableLightState.Fading; - component.StateExpiryTime = component.FadeOutDuration; + component.StateExpiryTime = (float)component.FadeOutDuration.TotalSeconds; UpdateVisualizer(ent); @@ -68,9 +75,7 @@ namespace Content.Server.Light.EntitySystems default: case ExpendableLightState.Fading: component.CurrentState = ExpendableLightState.Dead; - var meta = MetaData(ent); - _metaData.SetEntityName(ent, Loc.GetString(component.SpentName), meta); - _metaData.SetEntityDescription(ent, Loc.GetString(component.SpentDesc), meta); + _nameModifier.RefreshNameModifiers(ent.Owner); _tagSystem.AddTag(ent, TrashTag); @@ -104,15 +109,47 @@ namespace Content.Server.Light.EntitySystems RaiseLocalEvent(ent, ref ignite); component.CurrentState = ExpendableLightState.Lit; - component.StateExpiryTime = component.GlowDuration; UpdateSounds(ent); UpdateVisualizer(ent); + } + return true; + } - return true; + private void OnInteractUsing(EntityUid uid, ExpendableLightComponent component, ref InteractUsingEvent args) + { + if (args.Handled) + return; + + if (!TryComp(args.Used, out StackComponent? stack)) + return; + + if (stack.StackTypeId != component.RefuelMaterialID) + return; + + if (component.StateExpiryTime + component.RefuelMaterialTime.TotalSeconds >= component.RefuelMaximumDuration.TotalSeconds) + return; + + if (component.CurrentState is ExpendableLightState.Dead) + { + component.CurrentState = ExpendableLightState.BrandNew; + component.StateExpiryTime = (float)component.RefuelMaterialTime.TotalSeconds; + + _nameModifier.RefreshNameModifiers(uid); + _stackSystem.SetCount(args.Used, stack.Count - 1, stack); + UpdateVisualizer((uid, component)); + return; } - return false; + component.StateExpiryTime += (float)component.RefuelMaterialTime.TotalSeconds; + _stackSystem.SetCount(args.Used, stack.Count - 1, stack); + args.Handled = true; + } + + private void OnRefreshNameModifiers(Entity<ExpendableLightComponent> entity, ref RefreshNameModifiersEvent args) + { + if (entity.Comp.CurrentState is ExpendableLightState.Dead) + args.AddModifier("expendable-light-spent-prefix"); } private void UpdateVisualizer(Entity<ExpendableLightComponent> ent, AppearanceComponent? appearance = null) @@ -171,6 +208,7 @@ namespace Content.Server.Light.EntitySystems } component.CurrentState = ExpendableLightState.BrandNew; + component.StateExpiryTime = (float)component.GlowDuration.TotalSeconds; EntityManager.EnsureComponent<PointLightComponent>(uid); } diff --git a/Content.Shared/Light/Components/SharedExpendableLightComponent.cs b/Content.Shared/Light/Components/SharedExpendableLightComponent.cs index 001794880a..ad7a0edc4e 100644 --- a/Content.Shared/Light/Components/SharedExpendableLightComponent.cs +++ b/Content.Shared/Light/Components/SharedExpendableLightComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Stacks; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Light.Components; @@ -9,34 +11,37 @@ public abstract partial class SharedExpendableLightComponent : Component { [ViewVariables(VVAccess.ReadOnly)] - public ExpendableLightState CurrentState { get; set; } + public ExpendableLightState CurrentState; - [DataField("turnOnBehaviourID")] - public string TurnOnBehaviourID { get; set; } = string.Empty; + [DataField] + public string TurnOnBehaviourID = string.Empty; - [DataField("fadeOutBehaviourID")] - public string FadeOutBehaviourID { get; set; } = string.Empty; + [DataField] + public string FadeOutBehaviourID = string.Empty; - [DataField("glowDuration")] - public float GlowDuration { get; set; } = 60 * 15f; + [DataField] + public TimeSpan GlowDuration = TimeSpan.FromSeconds(60 * 15f); - [DataField("fadeOutDuration")] - public float FadeOutDuration { get; set; } = 60 * 5f; + [DataField] + public TimeSpan FadeOutDuration = TimeSpan.FromSeconds(60 * 5f); - [DataField("spentDesc")] - public string SpentDesc { get; set; } = string.Empty; + [DataField] + public ProtoId<StackPrototype>? RefuelMaterialID; - [DataField("spentName")] - public string SpentName { get; set; } = string.Empty; + [DataField] + public TimeSpan RefuelMaterialTime = TimeSpan.FromSeconds(15f); - [DataField("litSound")] - public SoundSpecifier? LitSound { get; set; } + [DataField] + public TimeSpan RefuelMaximumDuration = TimeSpan.FromSeconds(60 * 15f * 2); - [DataField("loopedSound")] - public SoundSpecifier? LoopedSound { get; set; } + [DataField] + public SoundSpecifier? LitSound; - [DataField("dieSound")] - public SoundSpecifier? DieSound { get; set; } = null; + [DataField] + public SoundSpecifier? LoopedSound; + + [DataField] + public SoundSpecifier? DieSound; } [Serializable, NetSerializable] diff --git a/Resources/Locale/en-US/light/components/expendable-light-component.ftl b/Resources/Locale/en-US/light/components/expendable-light-component.ftl index 4cd07599b9..affc52920c 100644 --- a/Resources/Locale/en-US/light/components/expendable-light-component.ftl +++ b/Resources/Locale/en-US/light/components/expendable-light-component.ftl @@ -1,14 +1,2 @@ expendable-light-start-verb = Start Light - -expendable-light-spent-flare-name = spent flare -expendable-light-spent-flare-desc = It looks like this flare has burnt out. What a bummer. - -expendable-light-burnt-torch-name = burnt torch -expendable-light-burnt-torch-desc = It looks like this torch has burnt out. What a bummer. - -expendable-light-spent-green-glowstick-name = spent green glowstick -expendable-light-spent-red-glowstick-name = spent red glowstick -expendable-light-spent-purple-glowstick-name = spent purple glowstick -expendable-light-spent-yellow-glowstick-name = spent purple glowstick -expendable-light-spent-blue-glowstick-name = spent blue glowstick -expendable-light-spent-glowstick-desc = It looks like this glowstick has stopped glowing. How tragic. \ No newline at end of file +expendable-light-spent-prefix = spent {$baseName} diff --git a/Resources/Prototypes/Entities/Objects/Misc/torch.yml b/Resources/Prototypes/Entities/Objects/Misc/torch.yml index 50e8f65890..da4886912c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/torch.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/torch.yml @@ -5,9 +5,9 @@ description: A torch fashioned from some wood. components: - type: ExpendableLight - spentName: expendable-light-burnt-torch-name - spentDesc: expendable-light-burnt-torch-desc + refuelMaterialID: WoodPlank glowDuration: 100 + refuelMaximumDuration: 205 fadeOutDuration: 4 iconStateSpent: torch_spent turnOnBehaviourID: turn_on diff --git a/Resources/Prototypes/Entities/Objects/Tools/flare.yml b/Resources/Prototypes/Entities/Objects/Tools/flare.yml index d36f67d00d..34c233921e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/flare.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/flare.yml @@ -10,8 +10,6 @@ - Trash - type: SpaceGarbage - type: ExpendableLight - spentName: expendable-light-spent-flare-name - spentDesc: expendable-light-spent-flare-desc glowDuration: 225 fadeOutDuration: 15 iconStateOn: flare_unlit diff --git a/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml b/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml index 3081f60989..c577cd8e58 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml @@ -6,8 +6,6 @@ components: - type: SpaceGarbage - type: ExpendableLight - spentName: expendable-light-spent-green-glowstick-name - spentDesc: expendable-light-spent-glowstick-desc glowDuration: 900 # time in seconds glowColorLit: "#00FF00" fadeOutDuration: 300 From 1af3c599c5e771758bcef99425f2ac54edfbd1d0 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 02:00:48 +0000 Subject: [PATCH 252/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c15b2c29f8..b8710ece1f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: chromiumboy - changes: - - message: Added the atmospheric network monitor. Use these consoles to monitor - the network of pipes that supply the crew with a breathable atmosphere - type: Add - id: 7720 - time: '2024-12-17T03:53:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32294 - author: TheShuEd changes: - message: Added new map Gate @@ -3910,3 +3902,13 @@ id: 8219 time: '2025-04-18T01:23:02.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36032 +- author: mjarduk + changes: + - message: Torches can now be refueled. + type: Tweak + - message: Burnt torches/glowsticks names' can now display if they're glued, cluwnified, + etc. + type: Fix + id: 8220 + time: '2025-04-18T01:59:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36209 From 57bbf76ec6a6acf2609c9e4e1a4e3fa8a4c165b6 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 17 Apr 2025 22:06:29 -0400 Subject: [PATCH 253/622] Fix inability to engage with economic Cargonia (#36668) Fix inability to engage with cargo supremacy --- .../Cargo/Systems/CargoSystem.Funds.cs | 5 ++-- .../Cargo/Systems/CargoSystem.Orders.cs | 4 +-- .../Cargo/Systems/CargoSystem.Shuttle.cs | 4 +-- Content.Server/Cargo/Systems/CargoSystem.cs | 15 ++++++++++- Content.Server/Delivery/DeliverySystem.cs | 2 +- Content.Shared/Cargo/SharedCargoSystem.cs | 26 ++++++------------- 6 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Funds.cs b/Content.Server/Cargo/Systems/CargoSystem.Funds.cs index 7990fbce1c..d64c467664 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Funds.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Funds.cs @@ -39,8 +39,7 @@ public sealed partial class CargoSystem } ent.Comp.NextAccountActionTime = Timing.CurTime + ent.Comp.AccountActionDelay; - Dirty(ent); - UpdateBankAccount((station, bank), -args.Amount, CreateAccountDistribution(ent.Comp.Account, bank)); + UpdateBankAccount((station, bank), -args.Amount, ent.Comp.Account, dirty: false); _audio.PlayPvs(ApproveSound, ent); var tryGetIdentityShortInfoEvent = new TryGetIdentityShortInfoEvent(ent, args.Actor); @@ -65,7 +64,7 @@ public sealed partial class CargoSystem else { var otherAccount = _protoMan.Index(args.Account.Value); - UpdateBankAccount((station, bank), args.Amount, CreateAccountDistribution(args.Account.Value, bank)); + UpdateBankAccount((station, bank), args.Amount, args.Account.Value); if (!_emag.CheckFlag(ent, EmagType.Interaction)) { diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index ef9a601a89..f89f1b0e8f 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -51,7 +51,7 @@ namespace Content.Server.Cargo.Systems return; _audio.PlayPvs(ApproveSound, uid); - UpdateBankAccount((stationUid.Value, bank), (int) price, CreateAccountDistribution(component.Account, bank)); + UpdateBankAccount((stationUid.Value, bank), (int) price, component.Account); QueueDel(args.Used); args.Handled = true; } @@ -203,7 +203,7 @@ namespace Content.Server.Cargo.Systems $"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] on account {component.Account} with balance at {accountBalance}"); orderDatabase.Orders[component.Account].Remove(order); - UpdateBankAccount((station.Value, bank), -cost, CreateAccountDistribution(component.Account, bank)); + UpdateBankAccount((station.Value, bank), -cost, component.Account); UpdateOrders(station.Value); } diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index 84319ab793..aaa14d196f 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -334,13 +334,13 @@ public sealed partial class CargoSystem if (!SellPallets(gridUid, out var goods)) return; - var baseDistribution = CreateAccountDistribution(bankAccount.PrimaryAccount, bankAccount, bankAccount.PrimaryCut); + var baseDistribution = CreateAccountDistribution((station, bankAccount)); foreach (var (_, sellComponent, value) in goods) { Dictionary<ProtoId<CargoAccountPrototype>, double> distribution; if (sellComponent != null) { - distribution = new Dictionary<ProtoId<CargoAccountPrototype>, double>() + distribution = new Dictionary<ProtoId<CargoAccountPrototype>, double> { { sellComponent.OverrideAccount, bankAccount.PrimaryCut }, { bankAccount.PrimaryAccount, 1.0 - bankAccount.PrimaryCut }, diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs index 646625d5d8..d0ec138e4e 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.cs @@ -75,13 +75,26 @@ public sealed partial class CargoSystem : SharedCargoSystem UpdateBounty(); } + public void UpdateBankAccount( + Entity<StationBankAccountComponent?> ent, + int balanceAdded, + ProtoId<CargoAccountPrototype> account, + bool dirty = true) + { + UpdateBankAccount( + ent, + balanceAdded, + new Dictionary<ProtoId<CargoAccountPrototype>, double> { {account, 1} }, + dirty: dirty); + } + /// <summary> /// Adds or removes funds from the <see cref="StationBankAccountComponent"/>. /// </summary> /// <param name="ent">The station.</param> /// <param name="balanceAdded">The amount of funds to add or remove.</param> /// <param name="accountDistribution">The distribution between individual <see cref="CargoAccountPrototype"/>.</param> - /// <param name="dirty">Whether to mark the bank accoujnt component as dirty.</param> + /// <param name="dirty">Whether to mark the bank account component as dirty.</param> [PublicAPI] public void UpdateBankAccount( Entity<StationBankAccountComponent?> ent, diff --git a/Content.Server/Delivery/DeliverySystem.cs b/Content.Server/Delivery/DeliverySystem.cs index 91dff3b855..329e3d11ed 100644 --- a/Content.Server/Delivery/DeliverySystem.cs +++ b/Content.Server/Delivery/DeliverySystem.cs @@ -76,7 +76,7 @@ public sealed partial class DeliverySystem : SharedDeliverySystem _cargo.UpdateBankAccount( (ent.Comp.RecipientStation.Value, account), ent.Comp.SpesoReward, - _cargo.CreateAccountDistribution(account.PrimaryAccount, account, account.PrimaryCut)); + _cargo.CreateAccountDistribution((ent.Comp.RecipientStation.Value, account))); } public override void Update(float frameTime) diff --git a/Content.Shared/Cargo/SharedCargoSystem.cs b/Content.Shared/Cargo/SharedCargoSystem.cs index 8f76f77888..84633073b5 100644 --- a/Content.Shared/Cargo/SharedCargoSystem.cs +++ b/Content.Shared/Cargo/SharedCargoSystem.cs @@ -1,4 +1,3 @@ -using System.Linq; using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Prototypes; using Robust.Shared.Prototypes; @@ -36,30 +35,21 @@ public abstract class SharedCargoSystem : EntitySystem } /// <summary> - /// For a station, creates a distribution between one "primary" account and the other accounts. - /// The primary account receives the majority cut specified, with the remaining accounts getting cuts - /// distributed through the remaining amount, based on <see cref="StationBankAccountComponent.RevenueDistribution"/> + /// For a station, creates a distribution between one the bank's account and the other accounts. + /// The primary account receives the majority percentage listed on the bank account, with the remaining + /// funds distributed to all accounts based on <see cref="StationBankAccountComponent.RevenueDistribution"/> /// </summary> - public Dictionary<ProtoId<CargoAccountPrototype>, double> CreateAccountDistribution( - ProtoId<CargoAccountPrototype> primary, - StationBankAccountComponent stationBank, - double primaryCut = 1.0) + public Dictionary<ProtoId<CargoAccountPrototype>, double> CreateAccountDistribution(Entity<StationBankAccountComponent> stationBank) { var distribution = new Dictionary<ProtoId<CargoAccountPrototype>, double> { - { primary, primaryCut } + { stationBank.Comp.PrimaryAccount, stationBank.Comp.PrimaryCut } }; - var remaining = 1.0 - primaryCut; + var remaining = 1.0 - stationBank.Comp.PrimaryCut; - var allAccountPercentages = new Dictionary<ProtoId<CargoAccountPrototype>, double>(stationBank.RevenueDistribution); - allAccountPercentages.Remove(primary); - var weightsSum = allAccountPercentages.Values.Sum(); - - foreach (var (account, percentage) in allAccountPercentages) + foreach (var (account, percentage) in stationBank.Comp.RevenueDistribution) { - var adjustedPercentage = percentage / weightsSum; - - distribution.Add(account, remaining * adjustedPercentage); + distribution.Add(account, remaining * percentage); } return distribution; } From 5e10bd91e32fc115f142d9589f8daa24405a4856 Mon Sep 17 00:00:00 2001 From: Ethan_k <eknowles27@dtechhs.org> Date: Thu, 17 Apr 2025 19:08:39 -0700 Subject: [PATCH 254/622] Remove clone of dragon faction (#36667) PLEASE WORK --- Resources/Prototypes/ai_factions.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/ai_factions.yml b/Resources/Prototypes/ai_factions.yml index 994855fa24..2045287f95 100644 --- a/Resources/Prototypes/ai_factions.yml +++ b/Resources/Prototypes/ai_factions.yml @@ -56,7 +56,6 @@ - Xeno - AllHostile - Wizard - - Dragon - type: npcFaction id: SimpleNeutral From e1a21728e79436fd5ce60e7277d1d1841a4af57e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 18 Apr 2025 12:11:31 +1000 Subject: [PATCH 255/622] Storage fixes (#36533) * Storage fixes - Add size event. - Fix reclaim not running always. * Block the toggles * Standardise and popup explaining * Disable item toggles in bags * Fix verb popping up even if we can't activate * Conflicts * Validate * Stop drags if source closes * Really fixes * Real fix * Revert this --- .../Systems/Storage/StorageUIController.cs | 28 +++++++-- Content.Shared/Item/ItemSizeChangedEvent.cs | 10 ++++ .../Components/ItemToggleComponent.cs | 17 +++++- .../Components/ItemToggleSizeComponent.cs | 8 +-- .../Item/ItemToggle/ItemToggleSystem.cs | 54 ++++++++++++++--- Content.Shared/Item/SharedItemSystem.cs | 12 ++-- .../EntitySystems/SharedStorageSystem.cs | 58 +++++++++++++++++-- Resources/Locale/en-US/items/toggle.ftl | 2 + 8 files changed, 160 insertions(+), 29 deletions(-) create mode 100644 Content.Shared/Item/ItemSizeChangedEvent.cs diff --git a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs index f0c8cfeb21..ca2bc5729b 100644 --- a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs +++ b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs @@ -269,12 +269,19 @@ public sealed class StorageUIController : UIController, IOnSystemChanged<Storage var position = targetStorage.GetMouseGridPieceLocation(dragEnt, dragLoc); var newLocation = new ItemStorageLocation(DraggingRotation, position); - EntityManager.RaisePredictiveEvent(new StorageSetItemLocationEvent( - EntityManager.GetNetEntity(draggingGhost.Entity), - EntityManager.GetNetEntity(sourceStorage), - newLocation)); + if (!_storage.ItemFitsInGridLocation(dragEnt, sourceStorage, newLocation)) + { + window.Reclaim(control.Location, control); + } + else + { + EntityManager.RaisePredictiveEvent(new StorageSetItemLocationEvent( + EntityManager.GetNetEntity(draggingGhost.Entity), + EntityManager.GetNetEntity(sourceStorage), + newLocation)); - window.Reclaim(newLocation, control); + window.Reclaim(newLocation, control); + } } // Dragging to new storage else if (targetStorage?.StorageEntity != null && targetStorage != window) @@ -336,6 +343,17 @@ public sealed class StorageUIController : UIController, IOnSystemChanged<Storage if (DraggingGhost == null) return false; + var player = _player.LocalEntity; + + // If the attached storage is closed then stop dragging + if (player == null || + !_storage.TryGetStorageLocation(DraggingGhost.Entity, out var container, out _, out _) || + !_ui.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, player.Value)) + { + DraggingGhost.Orphan(); + return false; + } + SetDraggingRotation(); return true; } diff --git a/Content.Shared/Item/ItemSizeChangedEvent.cs b/Content.Shared/Item/ItemSizeChangedEvent.cs new file mode 100644 index 0000000000..b7c7d0b858 --- /dev/null +++ b/Content.Shared/Item/ItemSizeChangedEvent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Item; + +/// <summary> +/// Raised directed on an entity when its item size / shape changes. +/// </summary> +[ByRefEvent] +public struct ItemSizeChangedEvent(EntityUid Entity) +{ + public EntityUid Entity = Entity; +} diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs index 110ae80626..cb6470f5d6 100644 --- a/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs @@ -78,13 +78,18 @@ public sealed partial class ItemToggleComponent : Component [ByRefEvent] public record struct ItemToggleActivateAttemptEvent(EntityUid? User) { + /// <summary> + /// Should we silently fail. + /// </summary> + public bool Silent = false; + public bool Cancelled = false; public readonly EntityUid? User = User; /// <summary> /// Pop-up that gets shown to users explaining why the attempt was cancelled. /// </summary> - public string? Popup { get; set; } + public string? Popup; } /// <summary> @@ -93,8 +98,18 @@ public record struct ItemToggleActivateAttemptEvent(EntityUid? User) [ByRefEvent] public record struct ItemToggleDeactivateAttemptEvent(EntityUid? User) { + /// <summary> + /// Should we silently fail. + /// </summary> + public bool Silent = false; + public bool Cancelled = false; public readonly EntityUid? User = User; + + /// <summary> + /// Pop-up that gets shown to users explaining why the attempt was cancelled. + /// </summary> + public string? Popup; } /// <summary> diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleSizeComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleSizeComponent.cs index b7b47a0732..2870f9ef01 100644 --- a/Content.Shared/Item/ItemToggle/Components/ItemToggleSizeComponent.cs +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleSizeComponent.cs @@ -15,24 +15,24 @@ public sealed partial class ItemToggleSizeComponent : Component /// <summary> /// Item's size when activated /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public ProtoId<ItemSizePrototype>? ActivatedSize = null; /// <summary> /// Item's shape when activated /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public List<Box2i>? ActivatedShape = null; /// <summary> /// Item's size when deactivated. If none is mentioned, it uses the item's default size instead. /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public ProtoId<ItemSizePrototype>? DeactivatedSize = null; /// <summary> /// Item's shape when deactivated. If none is mentioned, it uses the item's default shape instead. /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public List<Box2i>? DeactivatedShape = null; } diff --git a/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs b/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs index f6752a67f6..819975ecda 100644 --- a/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs +++ b/Content.Shared/Item/ItemToggle/ItemToggleSystem.cs @@ -76,6 +76,23 @@ public sealed class ItemToggleSystem : EntitySystem var user = args.User; + if (ent.Comp.Activated) + { + var ev = new ItemToggleActivateAttemptEvent(args.User); + RaiseLocalEvent(ent.Owner, ref ev); + + if (ev.Cancelled) + return; + } + else + { + var ev = new ItemToggleDeactivateAttemptEvent(args.User); + RaiseLocalEvent(ent.Owner, ref ev); + + if (ev.Cancelled) + return; + } + args.Verbs.Add(new ActivationVerb() { Text = !ent.Comp.Activated ? Loc.GetString(ent.Comp.VerbToggleOn) : Loc.GetString(ent.Comp.VerbToggleOff), @@ -133,15 +150,20 @@ public sealed class ItemToggleSystem : EntitySystem if (comp.Activated) return true; - if (!comp.Predictable && _netManager.IsClient) - return true; - var attempt = new ItemToggleActivateAttemptEvent(user); RaiseLocalEvent(uid, ref attempt); - if (!comp.Predictable) predicted = false; + if (!comp.Predictable) + predicted = false; + + if (!predicted && _netManager.IsClient) + return false; + if (attempt.Cancelled) { + if (attempt.Silent) + return false; + if (predicted) _audio.PlayPredicted(comp.SoundFailToActivate, uid, user); else @@ -159,7 +181,6 @@ public sealed class ItemToggleSystem : EntitySystem } Activate((uid, comp), predicted, user); - return true; } @@ -176,16 +197,31 @@ public sealed class ItemToggleSystem : EntitySystem if (!comp.Activated) return true; - if (!comp.Predictable && _netManager.IsClient) - return true; + if (!comp.Predictable) + predicted = false; var attempt = new ItemToggleDeactivateAttemptEvent(user); RaiseLocalEvent(uid, ref attempt); - if (attempt.Cancelled) + if (!predicted && _netManager.IsClient) return false; - if (!comp.Predictable) predicted = false; + if (attempt.Cancelled) + { + if (attempt.Silent) + return false; + + if (attempt.Popup != null && user != null) + { + if (predicted) + _popup.PopupClient(attempt.Popup, uid, user.Value); + else + _popup.PopupEntity(attempt.Popup, uid, user.Value); + } + + return false; + } + Deactivate((uid, comp), predicted, user); return true; } diff --git a/Content.Shared/Item/SharedItemSystem.cs b/Content.Shared/Item/SharedItemSystem.cs index 8ba26fd349..18a98c7a0c 100644 --- a/Content.Shared/Item/SharedItemSystem.cs +++ b/Content.Shared/Item/SharedItemSystem.cs @@ -39,20 +39,24 @@ public abstract class SharedItemSystem : EntitySystem public void SetSize(EntityUid uid, ProtoId<ItemSizePrototype> size, ItemComponent? component = null) { - if (!Resolve(uid, ref component, false)) + if (!Resolve(uid, ref component, false) || component.Size == size) return; component.Size = size; Dirty(uid, component); + var ev = new ItemSizeChangedEvent(uid); + RaiseLocalEvent(uid, ref ev, broadcast: true); } public void SetShape(EntityUid uid, List<Box2i>? shape, ItemComponent? component = null) { - if (!Resolve(uid, ref component, false)) + if (!Resolve(uid, ref component, false) || component.Shape == shape) return; component.Shape = shape; Dirty(uid, component); + var ev = new ItemSizeChangedEvent(uid); + RaiseLocalEvent(uid, ref ev, broadcast: true); } /// <summary> @@ -236,6 +240,7 @@ public abstract class SharedItemSystem : EntitySystem { // Set the deactivated shape to the default item's shape before it gets changed. itemToggleSize.DeactivatedShape ??= new List<Box2i>(GetItemShape(item)); + Dirty(uid, itemToggleSize); SetShape(uid, itemToggleSize.ActivatedShape, item); } @@ -243,6 +248,7 @@ public abstract class SharedItemSystem : EntitySystem { // Set the deactivated size to the default item's size before it gets changed. itemToggleSize.DeactivatedSize ??= item.Size; + Dirty(uid, itemToggleSize); SetSize(uid, (ProtoId<ItemSizePrototype>) itemToggleSize.ActivatedSize, item); } } @@ -258,7 +264,5 @@ public abstract class SharedItemSystem : EntitySystem SetSize(uid, (ProtoId<ItemSizePrototype>) itemToggleSize.DeactivatedSize, item); } } - - Dirty(uid, item); } } diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 3bf51f7957..e9ed89f560 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -16,6 +16,7 @@ using Content.Shared.Interaction; using Content.Shared.Interaction.Components; using Content.Shared.Inventory; using Content.Shared.Item; +using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Lock; using Content.Shared.Materials; using Content.Shared.Placeable; @@ -146,13 +147,13 @@ public abstract class SharedStorageSystem : EntitySystem SubscribeLocalEvent<StorageComponent, BoundUserInterfaceMessageAttempt>(OnBoundUIAttempt); SubscribeLocalEvent<StorageComponent, BoundUIOpenedEvent>(OnBoundUIOpen); SubscribeLocalEvent<StorageComponent, LockToggledEvent>(OnLockToggled); - SubscribeLocalEvent<MetaDataComponent, StackCountChangedEvent>(OnStackCountChanged); - SubscribeLocalEvent<StorageComponent, EntInsertedIntoContainerMessage>(OnEntInserted); SubscribeLocalEvent<StorageComponent, EntRemovedFromContainerMessage>(OnEntRemoved); SubscribeLocalEvent<StorageComponent, ContainerIsInsertingAttemptEvent>(OnInsertAttempt); - SubscribeLocalEvent<StorageComponent, AreaPickupDoAfterEvent>(OnDoAfter); + SubscribeLocalEvent<StorageComponent, GotReclaimedEvent>(OnReclaimed); + + SubscribeLocalEvent<MetaDataComponent, StackCountChangedEvent>(OnStackCountChanged); SubscribeAllEvent<OpenNestedStorageEvent>(OnStorageNested); SubscribeAllEvent<StorageTransferItemEvent>(OnStorageTransfer); @@ -161,7 +162,7 @@ public abstract class SharedStorageSystem : EntitySystem SubscribeAllEvent<StorageInsertItemIntoLocationEvent>(OnInsertItemIntoLocation); SubscribeAllEvent<StorageSaveItemLocationEvent>(OnSaveItemLocation); - SubscribeLocalEvent<StorageComponent, GotReclaimedEvent>(OnReclaimed); + SubscribeLocalEvent<ItemSizeChangedEvent>(OnItemSizeChanged); CommandBinds.Builder .Bind(ContentKeyFunctions.OpenBackpack, InputCmdHandler.FromDelegate(HandleOpenBackpack, handle: false)) @@ -173,6 +174,21 @@ public abstract class SharedStorageSystem : EntitySystem UpdatePrototypeCache(); } + private void OnItemSizeChanged(ref ItemSizeChangedEvent ev) + { + var itemEnt = new Entity<ItemComponent?>(ev.Entity, null); + + if (!TryGetStorageLocation(itemEnt, out var container, out var storage, out var loc)) + { + return; + } + + if (!ItemFitsInGridLocation((itemEnt.Owner, itemEnt.Comp), (container.Owner, storage), loc)) + { + ContainerSystem.Remove(itemEnt.Owner, container, force: true); + } + } + private void OnNestedStorageCvar(bool obj) { NestedStorage = obj; @@ -322,6 +338,25 @@ public abstract class SharedStorageSystem : EntitySystem args.Verbs.Add(verb); } + /// <summary> + /// Tries to get the storage location of an item. + /// </summary> + public bool TryGetStorageLocation(Entity<ItemComponent?> itemEnt, [NotNullWhen(true)] out BaseContainer? container, out StorageComponent? storage, out ItemStorageLocation loc) + { + loc = default; + storage = null; + + if (!ContainerSystem.TryGetContainingContainer(itemEnt, out container) || + !TryComp(container.Owner, out storage) || + !_itemQuery.Resolve(itemEnt, ref itemEnt.Comp, false)) + { + return false; + } + + loc = storage.StoredItems[itemEnt]; + return true; + } + public void OpenStorageUI(EntityUid uid, EntityUid actor, StorageComponent? storageComp = null, bool silent = true) { // Handle recursively opening nested storages. @@ -719,14 +754,23 @@ public abstract class SharedStorageSystem : EntitySystem private void OnStorageTransfer(StorageTransferItemEvent msg, EntitySessionEventArgs args) { - if (!TryGetEntity(msg.ItemEnt, out var itemEnt)) + if (!TryGetEntity(msg.ItemEnt, out var itemUid) || !TryComp(itemUid, out ItemComponent? itemComp)) return; var localPlayer = args.SenderSession.AttachedEntity; + var itemEnt = new Entity<ItemComponent?>(itemUid.Value, itemComp); - if (!TryComp(localPlayer, out HandsComponent? handsComp) || !_sharedHandsSystem.TryPickup(localPlayer.Value, itemEnt.Value, handsComp: handsComp, animate: false)) + // Validate the source storage + if (!TryGetStorageLocation(itemEnt, out var container, out _, out _) || + !ValidateInput(args, GetNetEntity(container.Owner), out _, out _)) + { + return; + } + + if (!TryComp(localPlayer, out HandsComponent? handsComp) || !_sharedHandsSystem.TryPickup(localPlayer.Value, itemEnt, handsComp: handsComp, animate: false)) return; + // Validate the target storage if (!ValidateInput(args, msg.StorageEnt, msg.ItemEnt, out var player, out var storage, out var item, held: true)) return; @@ -1525,6 +1569,8 @@ public abstract class SharedStorageSystem : EntitySystem } } + + private void HandleOpenBackpack(ICommonSession? session) { HandleToggleSlotUI(session, "back"); diff --git a/Resources/Locale/en-US/items/toggle.ftl b/Resources/Locale/en-US/items/toggle.ftl index bcf5c161a6..7f5dfea7c6 100644 --- a/Resources/Locale/en-US/items/toggle.ftl +++ b/Resources/Locale/en-US/items/toggle.ftl @@ -1,2 +1,4 @@ item-toggle-activate = Activate item-toggle-deactivate = Deactivate + +item-toggle-size-fail = Doesn't fit. From 5e96f16f4349ba14016fe99c21b83c421bc7f0f2 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 02:12:37 +0000 Subject: [PATCH 256/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b8710ece1f..1cebf2ad1b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Added new map Gate - type: Add - id: 7721 - time: '2024-12-17T10:06:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32032 - author: pcaessayrs changes: - message: Anomaly hosts keep their anomaly when turning into a zombie. @@ -3912,3 +3905,11 @@ id: 8220 time: '2025-04-18T01:59:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36209 +- author: metalgearsloth + changes: + - message: Toggleable items such as stunbatons and eswords can no longer be toggled + in storage. + type: Tweak + id: 8221 + time: '2025-04-18T02:11:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36533 From a70f513c0fd31028121c9a0c1b92e6252171ff50 Mon Sep 17 00:00:00 2001 From: AL-S? <99600368+cryals@users.noreply.github.com> Date: Fri, 18 Apr 2025 05:14:23 +0300 Subject: [PATCH 257/622] Update README.md (#33528) * Update README.md * New edits, new links * I returned everything to a more standard appearance. You can say now it's just updating links(= * Last minor change * Update README.md Removed the "---" --------- Co-authored-by: Vasilis <vasilis@pikachu.systems> --- README.md | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 279f94663b..400c25c6f9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -<p align="center"> <img alt="Space Station 14" width="880" height="300" src="https://raw.githubusercontent.com/space-wizards/asset-dump/de329a7898bb716b9d5ba9a0cd07f38e61f1ed05/github-logo.svg" /></p> +<div class="header" align="center"> +<img alt="Space Station 14" width="880" height="300" src="https://raw.githubusercontent.com/space-wizards/asset-dump/de329a7898bb716b9d5ba9a0cd07f38e61f1ed05/github-logo.svg"> +</div> Space Station 14 is a remake of SS13 that runs on [Robust Toolbox](https://github.com/space-wizards/RobustToolbox), our homegrown engine written in C#. @@ -8,31 +10,50 @@ If you want to host or create content for SS14, this is the repo you need. It co ## Links -[Website](https://spacestation14.io/) | [Discord](https://discord.ss14.io/) | [Forum](https://forum.spacestation14.io/) | [Steam](https://store.steampowered.com/app/1255460/Space_Station_14/) | [Standalone Download](https://spacestation14.io/about/nightlies/) +<div class="header" align="center"> + +[Website](https://spacestation14.com/) | [Discord](https://discord.ss14.io/) | [Forum](https://forum.spacestation14.com/) | [Mastodon](https://mastodon.gamedev.place/@spacestation14) | [Lemmy](https://lemmy.spacestation14.com/) | [Patreon](https://www.patreon.com/spacestation14) | [Steam](https://store.steampowered.com/app/1255460/Space_Station_14/) | [Standalone Download](https://spacestation14.com/about/nightlies/) + +</div> ## Documentation/Wiki -Our [docs site](https://docs.spacestation14.io/) has documentation on SS14s content, engine, game design and more. We also have lots of resources for new contributors to the project. +Our [docs site](https://docs.spacestation14.com/) has documentation on SS14's content, engine, game design, and more. +Additionally, see these resources for license and attribution information: +- [Robust Generic Attribution](https://docs.spacestation14.com/en/specifications/robust-generic-attribution.html) +- [Robust Station Image](https://docs.spacestation14.com/en/specifications/robust-station-image.html) + +We also have lots of resources for new contributors to the project. ## Contributing We are happy to accept contributions from anybody. Get in Discord if you want to help. We've got a [list of issues](https://github.com/space-wizards/space-station-14-content/issues) that need to be done and anybody can pick them up. Don't be afraid to ask for help either! Just make sure your changes and pull requests are in accordance with the [contribution guidelines](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html). -We are not currently accepting translations of the game on our main repository. If you would like to translate the game into another language consider creating a fork or contributing to a fork. +We are not currently accepting translations of the game on our main repository. If you would like to translate the game into another language, consider creating a fork or contributing to a fork. ## Building -1. Clone this repo. -2. Run `RUN_THIS.py` to init submodules and download the engine. -3. Compile the solution. +1. Clone this repo: +```shell +git clone https://github.com/space-wizards/space-station-14.git +``` +2. Go to the project folder and run `RUN_THIS.py` to initialize the submodules and load the engine: +```shell +cd space-station-14 +python RUN_THIS.py +``` +3. Compile the solution: + +Build the server using `dotnet build`. [More detailed instructions on building the project.](https://docs.spacestation14.com/en/general-development/setup.html) ## License -All code for the content repository is licensed under [MIT](https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT). +All code for the content repository is licensed under the [MIT license](https://github.com/space-wizards/space-station-14/blob/master/LICENSE.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/space-wizards/space-station-14/blob/master/Resources/Textures/Objects/Tools/crowbar.rsi/meta.json). +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 copyright specified in the metadata file. For example, see the [metadata for a crowbar](https://github.com/space-wizards/space-station-14/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. +> [!NOTE] +> 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. From c3e43a78f330dfb34b1f1b5c0fc4b2e6c2c0a0af Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 17 Apr 2025 22:15:31 -0400 Subject: [PATCH 258/622] Fix another storedSprite bug (#36662) --- .../UserInterface/Systems/Storage/Controls/ItemGridPiece.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs b/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs index 92035ba8d9..d07db112c8 100644 --- a/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs +++ b/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs @@ -172,14 +172,16 @@ public sealed class ItemGridPiece : Control, IEntityControl if (itemComponent.StoredSprite is { } storageSprite) { var scale = 2 * UIScale; - var offset = (((Box2) boundingGrid).Size - Vector2.One) * size + iconOffset; var sprite = _entityManager.System<SpriteSystem>().Frame0(storageSprite); + var sizeDifference = ((boundingGrid.Size + Vector2i.One) * _centerTexture.Size * 2 - sprite.Size) * UIScale; + var spriteBox = new Box2Rotated(new Box2(0f, sprite.Height * scale, sprite.Width * scale, 0f), -iconRotation, Vector2.Zero); var root = spriteBox.CalcBoundingBox().BottomLeft; var pos = PixelPosition * 2 + (Parent?.GlobalPixelPosition ?? Vector2.Zero) - + offset; + + sizeDifference + + iconOffset; handle.SetTransform(pos, iconRotation); var box = new UIBox2(root, root + sprite.Size * scale); From 8ff7767c853a74633c24bf0d81af7d225afc50a9 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Fri, 18 Apr 2025 04:32:03 +0200 Subject: [PATCH 259/622] Allow clown mime and borg customize names (#35170) * Allow clown mime and borg customize name * how * uh * 3 * good commit --- .../Station/Systems/StationSpawningSystem.cs | 23 +++++++++++-------- .../Prototypes/Loadouts/role_loadouts.yml | 10 ++++---- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Content.Server/Station/Systems/StationSpawningSystem.cs b/Content.Server/Station/Systems/StationSpawningSystem.cs index a77716eddf..d9c80c19dd 100644 --- a/Content.Server/Station/Systems/StationSpawningSystem.cs +++ b/Content.Server/Station/Systems/StationSpawningSystem.cs @@ -162,6 +162,17 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem profile = HumanoidCharacterProfile.RandomWithSpecies(speciesId); } + if (profile != null) + { + _humanoidSystem.LoadProfile(entity.Value, profile); + _metaSystem.SetEntityName(entity.Value, profile.Name); + + if (profile.FlavorText != "" && _configurationManager.GetCVar(CCVars.FlavorText)) + { + AddComp<DetailExaminableComponent>(entity.Value).Content = profile.FlavorText; + } + } + if (loadout != null) { EquipRoleLoadout(entity.Value, loadout, roleProto!); @@ -176,17 +187,9 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem var gearEquippedEv = new StartingGearEquippedEvent(entity.Value); RaiseLocalEvent(entity.Value, ref gearEquippedEv); - if (profile != null) + if (prototype != null && TryComp<MetaDataComponent>(entity.Value, out var metaData)) { - if (prototype != null) - SetPdaAndIdCardData(entity.Value, profile.Name, prototype, station); - - _humanoidSystem.LoadProfile(entity.Value, profile); - _metaSystem.SetEntityName(entity.Value, profile.Name); - if (profile.FlavorText != "" && _configurationManager.GetCVar(CCVars.FlavorText)) - { - AddComp<DetailExaminableComponent>(entity.Value).Content = profile.FlavorText; - } + SetPdaAndIdCardData(entity.Value, metaData.EntityName, prototype, station); } DoJobSpecials(job, entity.Value); diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index c2e154798b..a304adeb3a 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -26,10 +26,10 @@ - GroupSpeciesBreathTool # Silicons -#- type: roleLoadout -# id: JobBorg -# nameDataset: roleloadout doesn't support both so need to update that first. -# canCustomizeName: true +- type: roleLoadout + id: JobBorg + nameDataset: NamesBorg + canCustomizeName: true - type: roleLoadout id: JobStationAi @@ -159,6 +159,7 @@ - type: roleLoadout id: JobClown + canCustomizeName: true groups: - GroupTankHarness - ClownHead @@ -172,6 +173,7 @@ - type: roleLoadout id: JobMime + canCustomizeName: true groups: - GroupTankHarness - MimeHead From 2a3171a59dd8ecc37b719a6015594d430e65f62a Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 02:33:09 +0000 Subject: [PATCH 260/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1cebf2ad1b..3e946c904e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: pcaessayrs - changes: - - message: Anomaly hosts keep their anomaly when turning into a zombie. - type: Tweak - id: 7722 - time: '2024-12-17T11:56:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33867 - author: TiniestShark changes: - message: Adds in-hand sprites to the Anomaly Scanner. @@ -3913,3 +3906,10 @@ id: 8221 time: '2025-04-18T02:11:31.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36533 +- author: lzk228 + changes: + - message: Borgs, clowns and mimes now can choose a custom name in loadouts. + type: Tweak + id: 8222 + time: '2025-04-18T02:32:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35170 From 4d457db9e91096e4635f2704841b1764e5f2106c Mon Sep 17 00:00:00 2001 From: T-Stalker <43253663+DogZeroX@users.noreply.github.com> Date: Thu, 17 Apr 2025 23:38:34 -0300 Subject: [PATCH 261/622] Add Experiment plushie (#36663) * Plushie * Add to fills and fix license * minor spelling issue --- Resources/Audio/Items/Toys/arf.ogg | Bin 0 -> 9970 bytes Resources/Audio/Items/Toys/attributions.yml | 5 ++ .../Prototypes/Catalog/Fills/Crates/fun.yml | 3 +- .../Prototypes/Entities/Objects/Fun/toys.yml | 56 ++++++++++++++++++ .../expiplush.rsi/expi-equipped-HELMET.png | Bin 0 -> 897 bytes .../Fun/expiplush.rsi/expi-inhand-left.png | Bin 0 -> 858 bytes .../Fun/expiplush.rsi/expi-inhand-right.png | Bin 0 -> 858 bytes .../Objects/Fun/expiplush.rsi/expi.png | Bin 0 -> 1000 bytes .../Objects/Fun/expiplush.rsi/meta.json | 26 ++++++++ 9 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 Resources/Audio/Items/Toys/arf.ogg create mode 100644 Resources/Textures/Objects/Fun/expiplush.rsi/expi-equipped-HELMET.png create mode 100644 Resources/Textures/Objects/Fun/expiplush.rsi/expi-inhand-left.png create mode 100644 Resources/Textures/Objects/Fun/expiplush.rsi/expi-inhand-right.png create mode 100644 Resources/Textures/Objects/Fun/expiplush.rsi/expi.png create mode 100644 Resources/Textures/Objects/Fun/expiplush.rsi/meta.json diff --git a/Resources/Audio/Items/Toys/arf.ogg b/Resources/Audio/Items/Toys/arf.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4d29017a10e202837306e9bd74f2ace4a0579083 GIT binary patch literal 9970 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\wv?B`8OU3J6Wrs~B6-y5a7cJBM|r-N4eYw_ni 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 F{eOFU8@T`g literal 0 HcmV?d00001 diff --git a/Resources/Audio/Items/Toys/attributions.yml b/Resources/Audio/Items/Toys/attributions.yml index cd767ff3d6..2dd0ce9ede 100644 --- a/Resources/Audio/Items/Toys/attributions.yml +++ b/Resources/Audio/Items/Toys/attributions.yml @@ -92,3 +92,8 @@ license: "CC0-1.0" copyright: "Created by xprospero for ss14" source: "https://github.com/space-wizards/space-station-14/blob/master/Resources/Audio/Items/Toys/rubber_chicken_3.ogg" + +- files: ["arf.ogg"] + license: "CC0-1.0" + copyright: "Created by Orsoniks, from the game Casualties Unknown" + source: "https://orsonik.itch.io/scav-prototype" diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml index a345ed724b..af57a565a6 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml @@ -10,6 +10,7 @@ - id: PlushieNuke - id: PlushieSlime - id: PlushieSnake + - id: PlushieExperiment - !type:GroupSelector children: - id: PlushieLizard @@ -72,7 +73,7 @@ amount: !type:ConstantNumberSelector value: 3 -- type: entity +- type: entity id: CrateFunSharkPlushieBulk parent: CrateGenericSteel name: bulk soft toy shark crate diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 0c037d93a6..05dd5ce309 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -362,6 +362,62 @@ - Payload - PlushieLizard +- type: entity + parent: BasePlushie + id: PlushieExperiment #Arf! + name: experiment plushie + description: A plushie of a canid of sorts, it yearns to be detonated on a landmine. + components: + - type: Sprite + sprite: Objects/Fun/expiplush.rsi + state: expi + - type: Item + inhandVisuals: + left: + - state: expi-inhand-left + shader: shaded + right: + - state: expi-inhand-right + shader: shaded + heldPrefix: plushielizard + - type: EmitSoundOnUse + sound: + path: /Audio/Items/Toys/arf.ogg + - type: EmitSoundOnLand + sound: + path: /Audio/Items/Toys/arf.ogg + - type: EmitSoundOnActivate + sound: + path: /Audio/Items/Toys/arf.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/arf.ogg + - type: EmitSoundOnCollide + sound: + path: /Audio/Items/Toys/arf.ogg + - type: Food + requiresSpecialDigestion: true + useSound: + path: /Audio/Items/Toys/arf.ogg + - type: MeleeWeapon + wideAnimationRotation: 180 + soundHit: + path: /Audio/Items/Toys/arf.ogg + - type: Tag + tags: + - ClothMade + - Payload + - type: Clothing + clothingVisuals: + head: + - state: expi-equipped-HELMET + shader: shaded + quickEquip: false + sprite: Objects/Fun/toys.rsi + equippedPrefix: expi + slots: + - HEAD + - type: entity parent: PlushieLizard id: PlushieRainbowLizard #Weh but gay diff --git a/Resources/Textures/Objects/Fun/expiplush.rsi/expi-equipped-HELMET.png b/Resources/Textures/Objects/Fun/expiplush.rsi/expi-equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..fafecd67e4ff9e0b00901c219f19de531f970689 GIT binary patch literal 897 zcmV-{1AhF8P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0{lrtK~#8N?V7)j z5<wKl=PW275Fls*2@M4el2B1;Yo(2ip}mg8#6&Cq2)!7sZLZS7#?Hn<8)*>=Izj?L z6S#yx0R`qew_h`E_^~tIE?n+?lF95F7T)*0d9!SG_Cz^QC=}M2Ovba6nog%`I2=0t zmMi6QdF>slUa#lu+xm+PK9NXxBTCKZ^GK6`;N$VQip64Txm>EnV&R;GTV5ZSkB!Hw z-|u_YC9p9b1!nL7J#4cgY_Lwi?YnnWDwWc+-tBgE4;$lAFq_SEkC`6~2D%3v51neY zx-rw+#;+R8bUvTgEtkvvJ&vRT>h=1%-EMDOYZ%Apo*631WKykGD^)6$bPwB=z!#26 zrLyjHI(yF#dY%jB`oFliP?O0-WwTk8PN$tOhM@=z0|bvi5jen_FBXgXm}C6hCJ9zc z;QNcGk(Br*-amSv&YKT);0&ID0|adwJP4cs1dl8IA(BAfzkmMHfpg}u9Pm#-T<!&~ z%@SY|p1k>_?eTc5dvh7MB*6MU;85Iq_3i`}fWXmk<sXeky6oRJ8s1qq09*{eHedd; z3}L(82MB^72!bF8f*=TjAPB+@!}=-eu4iv9Pi0-WN)3Terc>;`06dN5F>!q~Z3A>{ z@@wh>L3IRrEDopGgg^t>hoi&S_v@<FYUv(hyJqKqVeqC;fH7{9Q)f^eff9ghV&f5w zn~><yo_}lMtr7ix07Zlee83lc!Z&r8+R%blfOWaD8sLN#0bqkDmH>LcZ)&pjzxQN+ zDY5jKZ4!3ieoS2mp0CXC8bJ2x+PMVa1OcO&88?H+IFk}3rY2~CCPGbU{t5K6H9Opl z1lW)?0|qQNIEZ@o34NnCbphBPo?X7Ug*`>=Eo#HZPT|}NKmGhg+sLTx-%M0+rcI4_ zrvPjV9&B9#W(Ax#o4O~*7Ci84qGrUviL{1aM0U|?wc1hd!kQYX(>ZuQ_`x4%XGfoa zP&FQN@Z>sZ6a+yK1VIo4K@bE%5QKxF)E{k=$pi13V(I_@01jnXNoGw=04e|g00;m8 X000000Mb*F00000NkvXXu0mjf;X{ig literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/expiplush.rsi/expi-inhand-left.png b/Resources/Textures/Objects/Fun/expiplush.rsi/expi-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..92a2a36e97abd18fdafd7ef425ee523bcda0b99b GIT binary patch literal 858 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qt-3`|!&T^vIy;@-~M-!J4Sa-3b`$4m!~AOR;G zj<$jc8IC$z45EI>N8HFrO)ixZmge^6Ucb#qY@1qH_>3DdkEaQ6bGEW7Hukm1KYae` z``tIGk<StW+4^>W_dIcC&&<SUdn-Si-Q3=kDA9&M>%`<Dvy`WL&7A1rvdwSh)hzDU z&x$OA!#eY}YtK5n?AzbU)Rny@R=P<WC9XOz6!<&m)S}$4iElDY7FFJMSj~9q>8F{C z0@mDrfBF1N#tdgWx&Eat9dYZ;&Ev(T%QptCOz~SDEXdcs)P>`)!I6{Q&mWz<o*cOT z`uSMn*=J`>KH2i>WJ=JM+qqhaJoC@1YfU|M?EC7Y%u#E_G;=?`ejNSr%@6CV3zxj& z65(RK{Qmpohi^{3cI#$Wcu{I4t7(~PA;WbdG@K!#kl`SI+XmrYH_v_Iat*#on{Rx{ zF%xcdXgF12<5wQD)TTk^uSEL%<-wH;o^nOFZ8&i9k=)_E4_^h@us?~9vs+Xsk-rcq z_g1sP_p!^vPX}IqomA9r&fURT?B*c-Y5xA%j}9NMR@pp{%W5k7t$#8H^(1&M-EG%y zF7KD`IP`VOj*nl?9@<quUntGmNN~Mf{bDnowg>|Wo@sWLdO8LN`WGt;r>adh>^`b= zHFdktmt>h^x1XPW_xJF=pZ@Lb>v$RpH(8p`N5lv)cFYd{+nW>9X#2V(j_*+4wI?su zZ7@1}PGnA(cX~r=WQJ&UE<@<Fmw)dXJypD;vA^(xUwqhhC#8u8s?xKS4znzNP-<0| zx9-3_cE{!7Yfd>?7v?hjzAn|4sB`A<%kb4#=SrB&KOdYWdtcQ=s(0(R2U=_gwiaw> zC@R$|TWWK_+?8RcO9cy`x2Sx`4kLz1Gq3Ya5=qcglIw5xlh--zv^wJTl{E_6PhT!; zN_c+8Y5%@j?>jr|7o2hWZ+^S)%jyQkYiFI}t=@1gu6xRJz~FzEKs`g={yfhUYo4tI irh2~A2+uTMUj{88n*)eJ;8O5p5asFW=d#Wzp$Pz$YkThi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/expiplush.rsi/expi-inhand-right.png b/Resources/Textures/Objects/Fun/expiplush.rsi/expi-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..049898a237bf5b2e603d1d4a97d5e02899ff0f5a GIT binary patch literal 858 zcmV-g1Eu_lP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0@X=GK~#8N?V3HT z5<w8hhmVBM1VRuJa-kwvAS5<aT9{b8&eFol%AOcY3mX#?eT|KkTG(1!XlyKeS6G0A zNGPmGpd;ZUK;Y!R+@1>$!WoIMIKSlH-YyGo{&Tal$<7hOFbu;m48t%C!!QiP{9kzN zmh$<$W#0<={XVtZZRc}c$z(ECG#a&gOPbB5qsxmw5FZYQ2^WaR<760yxYr%%m`o-@ zlhmj_Y~cWSWH=lWE=-h^%jK1*&<)r>7!2$l(R4Z$8r29`3GrMmXT7;|MmL_n#Fy<+ zBK(NY=c8)1dh|=8R4Q4s*^DBQ2z9$%N~Kbw1%AJuTCLWK24@LCJnkQS_)I@uKf$fQ zG)?MsI(APlq<FM&NFWfPLZM)(OTh7l%mYY%n5Ytq#l*NS5rCxE>-FrBCFAj!FuuM7 zL<9f~VvQsc37XI66buGMtCM&DJ7F*ER&_uZ^r_;3;{b#P!UXGG?gl_7@e=6-3G_hM z`-gXhPJ37&9I#mPR^@s@O!9h{K0&C!W4ei#z;2oK!K<@dRR7r~=!9M|xWEyIK}>k` z?xX0#5y%Cj(dbg<)Bz;*P$(qUK9&G@cJDT&`hM(koAuyJ#bVLQX0u{fxHvy|b_d;1 z?S~%d+NlK--c~BkBwfWzRQsVzcRdWlFbu;m48t%C!!XP~aCO+JR#Mi_)pf_I3v5GH zjMQ4eDY4T5c;Yx)$E8+|PlcTh0B{1%)?eKGT``udS6WUESvkf9v1(Oift5@q|EU9T zzHi^|1=mS%TjjW3uWOwY|JZoLFsyVsEpkGm(Kv{BL_w`qyY#=+H(E^7bY+{X9DvZr zkE4|lfcI_=#U}9pbxeR<wYF5ZveN;ZD#v(Z#N#>0!`}(SU%8f|tM?zfGSJl|IN{5u z@AUNRH_<=V%CSt4+alzzz%Fp?mE(Qy5G%;7(C%tqIc6AU0nsn*G;K+&ade3Q000hU kSV?A0O#mtY000O800000007cclK=n!07*qoM6N<$g0E+SXaE2J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/expiplush.rsi/expi.png b/Resources/Textures/Objects/Fun/expiplush.rsi/expi.png new file mode 100644 index 0000000000000000000000000000000000000000..0bedfe8f40a1719a82158fc355593b6960fbeb56 GIT binary patch literal 1000 zcmV<E0~h>>P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D17k@<K~z{r?N(h# zlTjFcx9QYPosMN=AWq59sdy0%qPhqo%Ak@KT`AEIltDpwTSVPRh}BimMUoZ;5p-8b z-9%UGrlGq?aMPQKbN;)j^XKIA`km!!+xKZ0L_TnM&pF@O_dM^<dB4#P{(I;YyJfgs zE}=|madD9b2M0Ix&MgZ7F$fC^3TSzGnfHVc6pcn{XlO|Ddp9lMS7ML?I$io#_4oIu zeYhzBl6+-lg|f1;C^t8k!(Lcen3%%?3kwTuv7VfqB){LEl1sCIii!%M*Xzk@wI-3x z&(AYic6K(O%gf7S3m`gD2y7}5dc|r2$U%T`OHYBEoE(~&nc+D|Axa99BCt*cgJLt{ z^UZ7GOJpj^I|<Z*6cmrgnGgdJ!n5h=Y2Hs)m|7wr8lOH_ravLQ>^$Tquh&bSJx-1U z2thtKH^*amcvy#_{OmWV3i#f27sZzpa+z0<0}h9S4mfu698p5isS!)43OL#RlC8`m z20R6J)t2x8tS%d$86O{~P$;CixK$6L`awD}GC~av4N3PMx$eGlf~qgxp}M*{CO4bS zWHcH%?@LQds!d5%KzVt&$j{GLR_pg#LZ$*hzKe>AnAl)2a4l#_f$9MOQGmC=Mlk^L z4ML;^#fNzy5YY5qK=VNfr_;$wR##VfZMWOmLLkVIE}zf0Jp$_M>qRUUqvGP?q@Dm$ z2tbRrSS&O#F`-$6=1vH5kfI%@1G*t{k8?PWy+>zHCqCDyph-YgRh5w8g_rPFdMz!y z2EySm@1YpW%F4vEfgs(#d?u|3O#(nZJ3C8LQ|s**)ell>M@L7w77+e5QZ7uS%49OJ zkVbbc-8z0GrHG6IYHDf(2IlzW+HAJOS5G!3^oP>YQtI@0cpnyP0R7-?+d2Bw>!W+` zKc=jSjD=EJSt(w$w$jy}o`mNZxbqMMi~j|f10C+8)aLEwsEmz`aZ>`G96L<jXqapk zGhOKDPU6fM0d%t1K$spkH**Rikx1eL)7RIh3kHKaoB<)oO?yk&%8m%!-oKCHb|bmX zB^30BcyA+AuL=rDnWpV*8_xjpik?4MO|QNN==Jp`>izJIZoGM?%J)ZD%e}zBt!cm1 z#G+7q4?U++7T~s_tF1*m_}ipA_(wtX1I~KsMs30%D*ylh4rN$LW=%~1DgXcg2mk;8 W00000(o>TF0000<MNUMnLSTZl8o1j4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/expiplush.rsi/meta.json b/Resources/Textures/Objects/Fun/expiplush.rsi/meta.json new file mode 100644 index 0000000000..deaad8855a --- /dev/null +++ b/Resources/Textures/Objects/Fun/expiplush.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Made by Orsoniks (rivey0 on discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "expi" + }, + { + "name": "expi-inhand-left", + "directions": 4 + }, + { + "name": "expi-inhand-right", + "directions": 4 + }, + { + "name": "expi-equipped-HELMET", + "directions": 4 + } + ] +} \ No newline at end of file From 638187c2538841de38c739fcd877fd998e52ed34 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 02:39:40 +0000 Subject: [PATCH 262/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3e946c904e..06ca914177 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TiniestShark - changes: - - message: Adds in-hand sprites to the Anomaly Scanner. - type: Add - id: 7723 - time: '2024-12-17T13:35:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33427 - author: chromiumboy changes: - message: Holopads are now available, allowing you to communicate holographically @@ -3913,3 +3906,10 @@ id: 8222 time: '2025-04-18T02:32:03.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35170 +- author: DogZeroX + changes: + - message: Added Experiment plushie from the game Scav Prototype! + type: Add + id: 8223 + time: '2025-04-18T02:38:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36663 From e1a115025709eb755f0f00dc3530eebc74027d37 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Fri, 18 Apr 2025 05:41:27 +0200 Subject: [PATCH 263/622] Allow fire extinguishers and sprays to push grids you are standing on (#31754) * allow fire extinguishers and sprays to push grids * add cvar and reduce pushback * EmoGarbage Review - Resolve Conflicts * Ensure grid parenting --------- Co-authored-by: EmoGarbage404 <retron404@gmail.com> --- .../Fluids/Components/SprayComponent.cs | 6 ++-- .../Fluids/EntitySystems/SpraySystem.cs | 29 +++++++++++++++++-- Content.Shared/CCVar/CCVars.Shuttle.cs | 12 ++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Content.Server/Fluids/Components/SprayComponent.cs b/Content.Server/Fluids/Components/SprayComponent.cs index e5362eb4e9..128fdecfa7 100644 --- a/Content.Server/Fluids/Components/SprayComponent.cs +++ b/Content.Server/Fluids/Components/SprayComponent.cs @@ -32,10 +32,10 @@ public sealed partial class SprayComponent : Component /// <summary> /// How much the player is pushed back for each spray. /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField] - public float PushbackAmount = 2f; + [DataField] + public float PushbackAmount = 5f; - [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + [DataField(required: true)] [Access(typeof(SpraySystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends public SoundSpecifier SpraySound { get; private set; } = default!; } diff --git a/Content.Server/Fluids/EntitySystems/SpraySystem.cs b/Content.Server/Fluids/EntitySystems/SpraySystem.cs index a1f195bf43..d8da0cde3d 100644 --- a/Content.Server/Fluids/EntitySystems/SpraySystem.cs +++ b/Content.Server/Fluids/EntitySystems/SpraySystem.cs @@ -3,14 +3,16 @@ using Content.Server.Chemistry.EntitySystems; using Content.Server.Fluids.Components; using Content.Server.Gravity; using Content.Server.Popups; +using Content.Shared.CCVar; +using Content.Shared.Chemistry.EntitySystems; using Content.Shared.FixedPoint; using Content.Shared.Fluids; using Content.Shared.Interaction; using Content.Shared.Timing; using Content.Shared.Vapor; -using Content.Shared.Chemistry.EntitySystems; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; using Robust.Shared.Physics.Components; using Robust.Shared.Prototypes; using System.Numerics; @@ -30,6 +32,9 @@ public sealed class SpraySystem : EntitySystem [Dependency] private readonly VaporSystem _vapor = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + + private float _gridImpulseMultiplier; public override void Initialize() { @@ -37,6 +42,7 @@ public sealed class SpraySystem : EntitySystem SubscribeLocalEvent<SprayComponent, AfterInteractEvent>(OnAfterInteract); SubscribeLocalEvent<SprayComponent, UserActivateInWorldEvent>(OnActivateInWorld); + Subs.CVar(_cfg, CCVars.GridImpulseMultiplier, UpdateGridMassMultiplier, true); } private void OnActivateInWorld(Entity<SprayComponent> entity, ref UserActivateInWorldEvent args) @@ -51,6 +57,11 @@ public sealed class SpraySystem : EntitySystem Spray(entity, args.User, targetMapPos); } + private void UpdateGridMassMultiplier(float value) + { + _gridImpulseMultiplier = value; + } + private void OnAfterInteract(Entity<SprayComponent> entity, ref AfterInteractEvent args) { if (args.Handled) @@ -156,7 +167,21 @@ public sealed class SpraySystem : EntitySystem if (TryComp<PhysicsComponent>(user, out var body)) { if (_gravity.IsWeightless(user, body)) - _physics.ApplyLinearImpulse(user, -impulseDirection.Normalized() * entity.Comp.PushbackAmount, body: body); + { + // push back the player + _physics.ApplyLinearImpulse(user, -impulseDirection * entity.Comp.PushbackAmount, body: body); + } + else + { + // push back the grid the player is standing on + var userTransform = Transform(user); + if (userTransform.GridUid == userTransform.ParentUid) + { + // apply both linear and angular momentum depending on the player position + // multiply by a cvar because grid mass is currently extremely small compared to all other masses + _physics.ApplyLinearImpulse(userTransform.GridUid.Value, -impulseDirection * _gridImpulseMultiplier * entity.Comp.PushbackAmount, userTransform.LocalPosition); + } + } } } diff --git a/Content.Shared/CCVar/CCVars.Shuttle.cs b/Content.Shared/CCVar/CCVars.Shuttle.cs index 74d3bf8cfb..47fc816c05 100644 --- a/Content.Shared/CCVar/CCVars.Shuttle.cs +++ b/Content.Shared/CCVar/CCVars.Shuttle.cs @@ -182,4 +182,16 @@ public sealed partial class CCVars /// </summary> public static readonly CVarDef<int> EmergencyShuttleAutoCallExtensionTime = CVarDef.Create("shuttle.auto_call_extension_time", 45, CVar.SERVERONLY); + + /// <summary> + /// Impulse multiplier for player interactions that move grids (other than shuttle thrusters, gyroscopes and grid collisons). + /// At the moment this only affects the pushback in SpraySystem. + /// A higher value means grids have a lower effective mass and therefore will get pushed stronger. + /// A value of 0 will disable pushback. + /// The default has been chosen such that a one tile grid roughly equals 2/3 Urist masses. + /// TODO: Make grid mass a sane number so we can get rid of this. + /// At the moment they have a very low mass of roughly 0.48 kg per tile independent of any walls or anchored objects on them. + /// </summary> + public static readonly CVarDef<float> GridImpulseMultiplier = + CVarDef.Create("shuttle.grid_impulse_multiplier", 0.01f, CVar.SERVERONLY); } From 424f1531423f8dd4b0997a88aaed64df23ae7323 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 03:42:33 +0000 Subject: [PATCH 264/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 06ca914177..5e34673873 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: chromiumboy - changes: - - message: Holopads are now available, allowing you to communicate holographically - with the rest of the crew - type: Add - id: 7724 - time: '2024-12-17T19:18:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32711 - author: Golinth changes: - message: AMEs larger than 2 cores now produce more power, instead of less. @@ -3913,3 +3905,11 @@ id: 8223 time: '2025-04-18T02:38:34.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36663 +- author: slarticodefast + changes: + - message: Fire extinguishers and sprays now allow you to push the grids you are + standing on when you have magboots on. + type: Add + id: 8224 + time: '2025-04-18T03:41:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31754 From 7d2ef2bd47b38f067e68c73bf9dd74801dfe9606 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 18 Apr 2025 13:45:48 +1000 Subject: [PATCH 265/622] Action charges refactor (#33993) * Action charges refactor - Fixes the slight godmoding of baseactioncomponent. - Gets back 1ms of server time. * chorg * Remove FrameUpdate * Fixes * More fixes * Combine * Fixes * Updates * weh * Last fixes * weh * Fix naughty * YAML fixes * This one too * Merge conflicts * This thing * Review * Fix this as well * Icon fix * weh * Review * Review * seamless * Review --- Content.Client/Actions/ActionsSystem.cs | 31 +-- Content.Client/Charges/ChargesSystem.cs | 52 ++++ .../Charges/Systems/ChargesSystem.cs | 5 - .../Systems/Actions/ActionUIController.cs | 6 +- .../Systems/Actions/Controls/ActionButton.cs | 22 +- Content.Server/Charges/ChargesSystem.cs | 8 + .../Components/AutoRechargeComponent.cs | 27 -- .../Charges/Systems/ChargesSystem.cs | 53 ---- Content.Server/Flash/FlashSystem.cs | 8 +- Content.Shared/Actions/BaseActionComponent.cs | 24 -- Content.Shared/Actions/SharedActionsSystem.cs | 148 +---------- .../Components/AutoRechargeComponent.cs | 19 ++ .../Components/LimitedChargesComponent.cs | 29 +- .../Charges/Systems/SharedChargesSystem.cs | 251 +++++++++++++----- Content.Shared/Emag/Systems/EmagSystem.cs | 10 +- Content.Shared/Magic/SpellbookSystem.cs | 10 +- .../Ninja/Systems/DashAbilitySystem.cs | 4 +- .../Ninja/Systems/EnergyKatanaSystem.cs | 1 + .../RCD/Components/RCDAmmoComponent.cs | 2 +- Content.Shared/RCD/Systems/RCDAmmoSystem.cs | 7 +- Content.Shared/RCD/Systems/RCDSystem.cs | 17 +- Resources/Prototypes/Actions/types.yml | 12 +- .../Entities/Objects/Misc/fluff_lights.yml | 1 - .../Entities/Objects/Tools/lantern.yml | 1 - .../Entities/Objects/Tools/tools.yml | 4 +- .../Entities/Objects/Weapons/Melee/sword.yml | 1 - .../Entities/Objects/Weapons/security.yml | 2 - Resources/Prototypes/Magic/animate_spell.yml | 3 +- .../Prototypes/Magic/projectile_spells.yml | 4 - Resources/Prototypes/Magic/staves.yml | 3 +- 30 files changed, 366 insertions(+), 399 deletions(-) create mode 100644 Content.Client/Charges/ChargesSystem.cs delete mode 100644 Content.Client/Charges/Systems/ChargesSystem.cs create mode 100644 Content.Server/Charges/ChargesSystem.cs delete mode 100644 Content.Server/Charges/Components/AutoRechargeComponent.cs delete mode 100644 Content.Server/Charges/Systems/ChargesSystem.cs create mode 100644 Content.Shared/Charges/Components/AutoRechargeComponent.cs diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index 5f0a8e1f2f..0302739816 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -1,6 +1,7 @@ using System.IO; using System.Linq; using Content.Shared.Actions; +using Content.Shared.Charges.Systems; using JetBrains.Annotations; using Robust.Client.Player; using Robust.Shared.ContentPack; @@ -22,6 +23,7 @@ namespace Content.Client.Actions { public delegate void OnActionReplaced(EntityUid actionId); + [Dependency] private readonly SharedChargesSystem _sharedCharges = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IResourceManager _resources = default!; [Dependency] private readonly ISerializationManager _serialization = default!; @@ -51,29 +53,6 @@ namespace Content.Client.Actions SubscribeLocalEvent<EntityWorldTargetActionComponent, ComponentHandleState>(OnEntityWorldTargetHandleState); } - public override void FrameUpdate(float frameTime) - { - base.FrameUpdate(frameTime); - - var worldActionQuery = EntityQueryEnumerator<WorldTargetActionComponent>(); - while (worldActionQuery.MoveNext(out var uid, out var action)) - { - UpdateAction(uid, action); - } - - var instantActionQuery = EntityQueryEnumerator<InstantActionComponent>(); - while (instantActionQuery.MoveNext(out var uid, out var action)) - { - UpdateAction(uid, action); - } - - var entityActionQuery = EntityQueryEnumerator<EntityTargetActionComponent>(); - while (entityActionQuery.MoveNext(out var uid, out var action)) - { - UpdateAction(uid, action); - } - } - private void OnInstantHandleState(EntityUid uid, InstantActionComponent component, ref ComponentHandleState args) { if (args.Current is not InstantActionComponentState state) @@ -127,9 +106,6 @@ namespace Content.Client.Actions component.Toggled = state.Toggled; component.Cooldown = state.Cooldown; component.UseDelay = state.UseDelay; - component.Charges = state.Charges; - component.MaxCharges = state.MaxCharges; - component.RenewCharges = state.RenewCharges; component.Container = EnsureEntity<T>(state.Container, uid); component.EntityIcon = EnsureEntity<T>(state.EntityIcon, uid); component.CheckCanInteract = state.CheckCanInteract; @@ -152,7 +128,8 @@ namespace Content.Client.Actions if (!ResolveActionData(actionId, ref action)) return; - action.IconColor = action.Charges < 1 ? action.DisabledIconColor : action.OriginalIconColor; + // TODO: Decouple this. + action.IconColor = _sharedCharges.GetCurrentCharges(actionId.Value) == 0 ? action.DisabledIconColor : action.OriginalIconColor; base.UpdateAction(actionId, action); if (_playerManager.LocalEntity != action.AttachedEntity) diff --git a/Content.Client/Charges/ChargesSystem.cs b/Content.Client/Charges/ChargesSystem.cs new file mode 100644 index 0000000000..2c7e0536cd --- /dev/null +++ b/Content.Client/Charges/ChargesSystem.cs @@ -0,0 +1,52 @@ +using Content.Client.Actions; +using Content.Shared.Actions; +using Content.Shared.Charges.Components; +using Content.Shared.Charges.Systems; + +namespace Content.Client.Charges; + +public sealed class ChargesSystem : SharedChargesSystem +{ + [Dependency] private readonly ActionsSystem _actions = default!; + + private Dictionary<EntityUid, int> _lastCharges = new(); + private Dictionary<EntityUid, int> _tempLastCharges = new(); + + public override void Update(float frameTime) + { + // Technically this should probably be in frameupdate but no one will ever notice a tick of delay on this. + base.Update(frameTime); + + if (!_timing.IsFirstTimePredicted) + return; + + // Update recharging actions. Server doesn't actually care about this and it's a waste of performance, actions are immediate. + var query = AllEntityQuery<AutoRechargeComponent, LimitedChargesComponent>(); + + while (query.MoveNext(out var uid, out var recharge, out var charges)) + { + BaseActionComponent? actionComp = null; + + if (!_actions.ResolveActionData(uid, ref actionComp, logError: false)) + continue; + + var current = GetCurrentCharges((uid, charges, recharge)); + + if (!_lastCharges.TryGetValue(uid, out var last) || current != last) + { + _actions.UpdateAction(uid, actionComp); + } + + _tempLastCharges[uid] = current; + } + + _lastCharges.Clear(); + + foreach (var (uid, value) in _tempLastCharges) + { + _lastCharges[uid] = value; + } + + _tempLastCharges.Clear(); + } +} diff --git a/Content.Client/Charges/Systems/ChargesSystem.cs b/Content.Client/Charges/Systems/ChargesSystem.cs deleted file mode 100644 index 9170ac5e94..0000000000 --- a/Content.Client/Charges/Systems/ChargesSystem.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Content.Shared.Charges.Systems; - -namespace Content.Client.Charges.Systems; - -public sealed class ChargesSystem : SharedChargesSystem { } diff --git a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs index d020a71359..a4157517ce 100644 --- a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs +++ b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs @@ -12,6 +12,7 @@ using Content.Client.UserInterface.Systems.Actions.Widgets; using Content.Client.UserInterface.Systems.Actions.Windows; using Content.Client.UserInterface.Systems.Gameplay; using Content.Shared.Actions; +using Content.Shared.Charges.Systems; using Content.Shared.Input; using Robust.Client.GameObjects; using Robust.Client.Graphics; @@ -42,9 +43,9 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS [Dependency] private readonly IOverlayManager _overlays = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; - [Dependency] private readonly IEntityManager _entMan = default!; [Dependency] private readonly IInputManager _input = default!; + [UISystemDependency] private readonly SharedChargesSystem _sharedCharges = default!; [UISystemDependency] private readonly ActionsSystem? _actionsSystem = default; [UISystemDependency] private readonly InteractionOutlineSystem? _interactionOutline = default; [UISystemDependency] private readonly TargetOutlineSystem? _targetOutline = default; @@ -173,7 +174,6 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS // Is the action currently valid? if (!action.Enabled - || action is { Charges: 0, RenewCharges: false } || action.Cooldown.HasValue && action.Cooldown.Value.End > _timing.CurTime) { // The user is targeting with this action, but it is not valid. Maybe mark this click as @@ -483,7 +483,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS continue; } - var button = new ActionButton(_entMan, _spriteSystem, this) {Locked = true}; + var button = new ActionButton(EntityManager, _spriteSystem, this) {Locked = true}; button.ActionPressed += OnWindowActionPressed; button.ActionUnpressed += OnWindowActionUnPressed; button.ActionFocusExited += OnWindowActionFocusExisted; diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs index 0d12d87171..9e7ef6be4d 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs @@ -4,6 +4,8 @@ using Content.Client.Actions.UI; using Content.Client.Cooldown; using Content.Client.Stylesheets; using Content.Shared.Actions; +using Content.Shared.Charges.Components; +using Content.Shared.Charges.Systems; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.UserInterface; @@ -22,10 +24,13 @@ public sealed class ActionButton : Control, IEntityControl private IEntityManager _entities; private SpriteSystem? _spriteSys; private ActionUIController? _controller; + private SharedChargesSystem _sharedChargesSys; private bool _beingHovered; private bool _depressed; private bool _toggled; + private int _lastCharges; + public BoundKeyFunction? KeyBind { set @@ -65,6 +70,7 @@ public sealed class ActionButton : Control, IEntityControl _entities = entities; _spriteSys = spriteSys; + _sharedChargesSys = _entities.System<SharedChargesSystem>(); _controller = controller; MouseFilter = MouseFilterMode.Pass; @@ -194,14 +200,22 @@ public sealed class ActionButton : Control, IEntityControl var name = FormattedMessage.FromMarkupPermissive(Loc.GetString(metadata.EntityName)); var decr = FormattedMessage.FromMarkupPermissive(Loc.GetString(metadata.EntityDescription)); + FormattedMessage? chargesText = null; - if (_action is { Charges: not null }) + // TODO: Don't touch this use an event make callers able to add their own shit for actions or I kill you. + if (_entities.TryGetComponent(ActionId, out LimitedChargesComponent? actionCharges)) { - var charges = FormattedMessage.FromMarkupPermissive(Loc.GetString($"Charges: {_action.Charges.Value.ToString()}/{_action.MaxCharges.ToString()}")); - return new ActionAlertTooltip(name, decr, charges: charges); + var charges = _sharedChargesSys.GetCurrentCharges((ActionId.Value, actionCharges, null)); + chargesText = FormattedMessage.FromMarkupPermissive(Loc.GetString($"Charges: {charges.ToString()}/{actionCharges.MaxCharges}")); + + if (_entities.TryGetComponent(ActionId, out AutoRechargeComponent? autoRecharge)) + { + var chargeTimeRemaining = _sharedChargesSys.GetNextRechargeTime((ActionId.Value, actionCharges, autoRecharge)); + chargesText.AddText(Loc.GetString($"{Environment.NewLine}Time Til Recharge: {chargeTimeRemaining}")); + } } - return new ActionAlertTooltip(name, decr); + return new ActionAlertTooltip(name, decr, charges: chargesText); } protected override void ControlFocusExited() diff --git a/Content.Server/Charges/ChargesSystem.cs b/Content.Server/Charges/ChargesSystem.cs new file mode 100644 index 0000000000..6883dcb03d --- /dev/null +++ b/Content.Server/Charges/ChargesSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Charges.Systems; + +namespace Content.Server.Charges; + +public sealed class ChargesSystem : SharedChargesSystem +{ + +} diff --git a/Content.Server/Charges/Components/AutoRechargeComponent.cs b/Content.Server/Charges/Components/AutoRechargeComponent.cs deleted file mode 100644 index 165b181dcb..0000000000 --- a/Content.Server/Charges/Components/AutoRechargeComponent.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Content.Server.Charges.Systems; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; - -namespace Content.Server.Charges.Components; - -/// <summary> -/// Something with limited charges that can be recharged automatically. -/// Requires LimitedChargesComponent to function. -/// </summary> -// TODO: no reason this cant be predicted and server system deleted -[RegisterComponent, AutoGenerateComponentPause] -[Access(typeof(ChargesSystem))] -public sealed partial class AutoRechargeComponent : Component -{ - /// <summary> - /// The time it takes to regain a single charge - /// </summary> - [DataField("rechargeDuration"), ViewVariables(VVAccess.ReadWrite)] - public TimeSpan RechargeDuration = TimeSpan.FromSeconds(90); - - /// <summary> - /// The time when the next charge will be added - /// </summary> - [DataField("nextChargeTime", customTypeSerializer: typeof(TimeOffsetSerializer))] - [AutoPausedField] - public TimeSpan NextChargeTime; -} diff --git a/Content.Server/Charges/Systems/ChargesSystem.cs b/Content.Server/Charges/Systems/ChargesSystem.cs deleted file mode 100644 index 974928ee4b..0000000000 --- a/Content.Server/Charges/Systems/ChargesSystem.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Content.Server.Charges.Components; -using Content.Shared.Charges.Components; -using Content.Shared.Charges.Systems; -using Content.Shared.Examine; -using Robust.Shared.Timing; - -namespace Content.Server.Charges.Systems; - -public sealed class ChargesSystem : SharedChargesSystem -{ - [Dependency] private readonly IGameTiming _timing = default!; - - public override void Update(float frameTime) - { - base.Update(frameTime); - - var query = EntityQueryEnumerator<LimitedChargesComponent, AutoRechargeComponent>(); - while (query.MoveNext(out var uid, out var charges, out var recharge)) - { - if (charges.Charges == charges.MaxCharges || _timing.CurTime < recharge.NextChargeTime) - continue; - - AddCharges(uid, 1, charges); - recharge.NextChargeTime = _timing.CurTime + recharge.RechargeDuration; - } - } - - protected override void OnExamine(EntityUid uid, LimitedChargesComponent comp, ExaminedEvent args) - { - base.OnExamine(uid, comp, args); - - // only show the recharging info if it's not full - if (!args.IsInDetailsRange || comp.Charges == comp.MaxCharges || !TryComp<AutoRechargeComponent>(uid, out var recharge)) - return; - - var timeRemaining = Math.Round((recharge.NextChargeTime - _timing.CurTime).TotalSeconds); - args.PushMarkup(Loc.GetString("limited-charges-recharging", ("seconds", timeRemaining))); - } - - public override void AddCharges(EntityUid uid, int change, LimitedChargesComponent? comp = null) - { - if (!Query.Resolve(uid, ref comp, false)) - return; - - var startRecharge = comp.Charges == comp.MaxCharges; - base.AddCharges(uid, change, comp); - - // if a charge was just used from full, start the recharge timer - // TODO: probably make this an event instead of having le server system that just does this - if (change < 0 && startRecharge && TryComp<AutoRechargeComponent>(uid, out var recharge)) - recharge.NextChargeTime = _timing.CurTime + recharge.RechargeDuration; - } -} diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index 60c09efaea..f904678821 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -29,7 +29,7 @@ namespace Content.Server.Flash { [Dependency] private readonly AppearanceSystem _appearance = default!; [Dependency] private readonly AudioSystem _audio = default!; - [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly SharedChargesSystem _sharedCharges = default!; [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; @@ -86,15 +86,15 @@ namespace Content.Server.Flash return false; TryComp<LimitedChargesComponent>(uid, out var charges); - if (_charges.IsEmpty(uid, charges)) + if (_sharedCharges.IsEmpty((uid, charges))) return false; - _charges.UseCharge(uid, charges); + _sharedCharges.TryUseCharge((uid, charges)); _audio.PlayPvs(comp.Sound, uid); comp.Flashing = true; _appearance.SetData(uid, FlashVisuals.Flashing, true); - if (_charges.IsEmpty(uid, charges)) + if (_sharedCharges.IsEmpty((uid, charges))) { _appearance.SetData(uid, FlashVisuals.Burnt, true); _tag.AddTag(uid, TrashTag); diff --git a/Content.Shared/Actions/BaseActionComponent.cs b/Content.Shared/Actions/BaseActionComponent.cs index 25b36df2af..05abe30f24 100644 --- a/Content.Shared/Actions/BaseActionComponent.cs +++ b/Content.Shared/Actions/BaseActionComponent.cs @@ -86,24 +86,6 @@ public abstract partial class BaseActionComponent : Component /// </summary> [DataField("useDelay")] public TimeSpan? UseDelay; - /// <summary> - /// Convenience tool for actions with limited number of charges. Automatically decremented on use, and the - /// action is disabled when it reaches zero. Does NOT automatically remove the action from the action bar. - /// However, charges will regenerate if <see cref="RenewCharges"/> is enabled and the action will not disable - /// when charges reach zero. - /// </summary> - [DataField("charges")] public int? Charges; - - /// <summary> - /// The max charges this action has. If null, this is set automatically from <see cref="Charges"/> on mapinit. - /// </summary> - [DataField] public int? MaxCharges; - - /// <summary> - /// If enabled, charges will regenerate after a <see cref="Cooldown"/> is complete - /// </summary> - [DataField("renewCharges")]public bool RenewCharges; - /// <summary> /// The entity that contains this action. If the action is innate, this may be the user themselves. /// This should almost always be non-null. @@ -209,9 +191,6 @@ public abstract class BaseActionComponentState : ComponentState public bool Toggled; public (TimeSpan Start, TimeSpan End)? Cooldown; public TimeSpan? UseDelay; - public int? Charges; - public int? MaxCharges; - public bool RenewCharges; public NetEntity? Container; public NetEntity? EntityIcon; public bool CheckCanInteract; @@ -243,9 +222,6 @@ public abstract class BaseActionComponentState : ComponentState Toggled = component.Toggled; Cooldown = component.Cooldown; UseDelay = component.UseDelay; - Charges = component.Charges; - MaxCharges = component.MaxCharges; - RenewCharges = component.RenewCharges; CheckCanInteract = component.CheckCanInteract; CheckConsciousness = component.CheckConsciousness; ClientExclusive = component.ClientExclusive; diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 30f1af8465..e4aa44cf54 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -21,14 +21,14 @@ namespace Content.Shared.Actions; public abstract class SharedActionsSystem : EntitySystem { [Dependency] protected readonly IGameTiming GameTiming = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; - [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; - [Dependency] private readonly ActionContainerSystem _actionContainer = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; public override void Initialize() { @@ -69,47 +69,9 @@ public abstract class SharedActionsSystem : EntitySystem SubscribeAllEvent<RequestPerformActionEvent>(OnActionRequest); } - public override void Update(float frameTime) - { - base.Update(frameTime); - - var worldActionQuery = EntityQueryEnumerator<WorldTargetActionComponent>(); - while (worldActionQuery.MoveNext(out var uid, out var action)) - { - if (IsCooldownActive(action) || !ShouldResetCharges(action)) - continue; - - ResetCharges(uid, dirty: true); - } - - var instantActionQuery = EntityQueryEnumerator<InstantActionComponent>(); - while (instantActionQuery.MoveNext(out var uid, out var action)) - { - if (IsCooldownActive(action) || !ShouldResetCharges(action)) - continue; - - ResetCharges(uid, dirty: true); - } - - var entityActionQuery = EntityQueryEnumerator<EntityTargetActionComponent>(); - while (entityActionQuery.MoveNext(out var uid, out var action)) - { - if (IsCooldownActive(action) || !ShouldResetCharges(action)) - continue; - - ResetCharges(uid, dirty: true); - } - } - private void OnActionMapInit(EntityUid uid, BaseActionComponent component, MapInitEvent args) { component.OriginalIconColor = component.IconColor; - - if (component.Charges == null) - return; - - component.MaxCharges ??= component.Charges.Value; - Dirty(uid, component); } private void OnActionShutdown(EntityUid uid, BaseActionComponent component, ComponentShutdown args) @@ -312,68 +274,6 @@ public abstract class SharedActionsSystem : EntitySystem Dirty(actionId.Value, action); } - public void SetCharges(EntityUid? actionId, int? charges) - { - if (!TryGetActionData(actionId, out var action) || - action.Charges == charges) - { - return; - } - - action.Charges = charges; - UpdateAction(actionId, action); - Dirty(actionId.Value, action); - } - - public int? GetCharges(EntityUid? actionId) - { - if (!TryGetActionData(actionId, out var action)) - return null; - - return action.Charges; - } - - public void AddCharges(EntityUid? actionId, int addCharges) - { - if (!TryGetActionData(actionId, out var action) || action.Charges == null || addCharges < 1) - return; - - action.Charges += addCharges; - UpdateAction(actionId, action); - Dirty(actionId.Value, action); - } - - public void RemoveCharges(EntityUid? actionId, int? removeCharges) - { - if (!TryGetActionData(actionId, out var action) || action.Charges == null) - return; - - if (removeCharges == null) - action.Charges = removeCharges; - else - action.Charges -= removeCharges; - - if (action.Charges is < 0) - action.Charges = null; - - UpdateAction(actionId, action); - Dirty(actionId.Value, action); - } - - public void ResetCharges(EntityUid? actionId, bool update = false, bool dirty = false) - { - if (!TryGetActionData(actionId, out var action)) - return; - - action.Charges = action.MaxCharges; - - if (update) - UpdateAction(actionId, action); - - if (dirty) - Dirty(actionId.Value, action); - } - private void OnActionsGetState(EntityUid uid, ActionsComponent component, ref ComponentGetState args) { args.State = new ActionsComponentState(GetNetEntitySet(component.Actions)); @@ -416,6 +316,10 @@ public abstract class SharedActionsSystem : EntitySystem if (!action.Enabled) return; + var curTime = GameTiming.CurTime; + if (IsCooldownActive(action, curTime)) + return; + // check for action use prevention // TODO: make code below use this event with a dedicated component var attemptEv = new ActionAttemptEvent(user); @@ -423,14 +327,6 @@ public abstract class SharedActionsSystem : EntitySystem if (attemptEv.Cancelled) return; - var curTime = GameTiming.CurTime; - if (IsCooldownActive(action, curTime)) - return; - - // TODO: Replace with individual charge recovery when we have the visuals to aid it - if (action is { Charges: < 1, RenewCharges: true }) - ResetCharges(actionEnt, true, true); - BaseActionEvent? performEvent = null; if (action.CheckConsciousness && !_actionBlockerSystem.CanConsciouslyPerformAction(user)) @@ -705,16 +601,8 @@ public abstract class SharedActionsSystem : EntitySystem var dirty = toggledBefore != action.Toggled; - if (action.Charges != null) - { - dirty = true; - action.Charges--; - if (action is { Charges: 0, RenewCharges: false }) - action.Enabled = false; - } - action.Cooldown = null; - if (action is { UseDelay: not null, Charges: null or < 1 }) + if (action is { UseDelay: not null}) { dirty = true; action.Cooldown = (curTime, curTime + action.UseDelay.Value); @@ -1014,8 +902,6 @@ public abstract class SharedActionsSystem : EntitySystem if (!action.Enabled) return false; - if (action.Charges.HasValue && action.Charges <= 0) - return false; var curTime = GameTiming.CurTime; if (action.Cooldown.HasValue && action.Cooldown.Value.End > curTime) @@ -1125,15 +1011,9 @@ public abstract class SharedActionsSystem : EntitySystem /// <summary> /// Checks if the action has a cooldown and if it's still active /// </summary> - protected bool IsCooldownActive(BaseActionComponent action, TimeSpan? curTime = null) + public bool IsCooldownActive(BaseActionComponent action, TimeSpan? curTime = null) { - curTime ??= GameTiming.CurTime; // TODO: Check for charge recovery timer return action.Cooldown.HasValue && action.Cooldown.Value.End > curTime; } - - protected bool ShouldResetCharges(BaseActionComponent action) - { - return action is { Charges: < 1, RenewCharges: true }; - } } diff --git a/Content.Shared/Charges/Components/AutoRechargeComponent.cs b/Content.Shared/Charges/Components/AutoRechargeComponent.cs new file mode 100644 index 0000000000..704783056c --- /dev/null +++ b/Content.Shared/Charges/Components/AutoRechargeComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Charges.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Charges.Components; + +/// <summary> +/// Something with limited charges that can be recharged automatically. +/// Requires LimitedChargesComponent to function. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedChargesSystem))] +public sealed partial class AutoRechargeComponent : Component +{ + /// <summary> + /// The time it takes to regain a single charge + /// </summary> + [DataField, AutoNetworkedField] + public TimeSpan RechargeDuration = TimeSpan.FromSeconds(90); +} diff --git a/Content.Shared/Charges/Components/LimitedChargesComponent.cs b/Content.Shared/Charges/Components/LimitedChargesComponent.cs index 6973ffbe72..ff926fc158 100644 --- a/Content.Shared/Charges/Components/LimitedChargesComponent.cs +++ b/Content.Shared/Charges/Components/LimitedChargesComponent.cs @@ -1,24 +1,27 @@ using Content.Shared.Charges.Systems; using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Charges.Components; -[RegisterComponent, NetworkedComponent] -[Access(typeof(SharedChargesSystem))] -[AutoGenerateComponentState] +/// <summary> +/// Specifies the attached action has discrete charges, separate to a cooldown. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedChargesSystem))] public sealed partial class LimitedChargesComponent : Component { - /// <summary> - /// The maximum number of charges - /// </summary> - [DataField("maxCharges"), ViewVariables(VVAccess.ReadWrite)] - [AutoNetworkedField] - public int MaxCharges = 3; + [DataField, AutoNetworkedField] + public int LastCharges; /// <summary> - /// The current number of charges + /// The max charges this action has. /// </summary> - [DataField("charges"), ViewVariables(VVAccess.ReadWrite)] - [AutoNetworkedField] - public int Charges = 3; + [DataField, AutoNetworkedField, Access(Other = AccessPermissions.Read)] + public int MaxCharges = 1; + + /// <summary> + /// Last time charges was changed. Used to derive current charges. + /// </summary> + [DataField(customTypeSerializer:typeof(TimeOffsetSerializer)), AutoNetworkedField] + public TimeSpan LastUpdate; } diff --git a/Content.Shared/Charges/Systems/SharedChargesSystem.cs b/Content.Shared/Charges/Systems/SharedChargesSystem.cs index 7f95ef184e..2eb05f8bfc 100644 --- a/Content.Shared/Charges/Systems/SharedChargesSystem.cs +++ b/Content.Shared/Charges/Systems/SharedChargesSystem.cs @@ -1,103 +1,232 @@ +using Content.Shared.Actions.Events; using Content.Shared.Charges.Components; using Content.Shared.Examine; +using JetBrains.Annotations; +using Robust.Shared.Timing; namespace Content.Shared.Charges.Systems; public abstract class SharedChargesSystem : EntitySystem { - protected EntityQuery<LimitedChargesComponent> Query; + [Dependency] protected readonly IGameTiming _timing = default!; + + /* + * Despite what a bunch of systems do you don't need to continuously tick linear number updates and can just derive it easily. + */ public override void Initialize() { base.Initialize(); - Query = GetEntityQuery<LimitedChargesComponent>(); - SubscribeLocalEvent<LimitedChargesComponent, ExaminedEvent>(OnExamine); + + SubscribeLocalEvent<LimitedChargesComponent, ActionAttemptEvent>(OnChargesAttempt); + SubscribeLocalEvent<LimitedChargesComponent, MapInitEvent>(OnChargesMapInit); + SubscribeLocalEvent<LimitedChargesComponent, ActionPerformedEvent>(OnChargesPerformed); } - protected virtual void OnExamine(EntityUid uid, LimitedChargesComponent comp, ExaminedEvent args) + private void OnExamine(EntityUid uid, LimitedChargesComponent comp, ExaminedEvent args) { if (!args.IsInDetailsRange) return; - using (args.PushGroup(nameof(LimitedChargesComponent))) + var rechargeEnt = new Entity<LimitedChargesComponent?, AutoRechargeComponent?>(uid, comp, null); + var charges = GetCurrentCharges(rechargeEnt); + using var _ = args.PushGroup(nameof(LimitedChargesComponent)); + + args.PushMarkup(Loc.GetString("limited-charges-charges-remaining", ("charges", charges))); + if (charges == comp.MaxCharges) { - args.PushMarkup(Loc.GetString("limited-charges-charges-remaining", ("charges", comp.Charges))); - if (comp.Charges == comp.MaxCharges) - { - args.PushMarkup(Loc.GetString("limited-charges-max-charges")); - } + args.PushMarkup(Loc.GetString("limited-charges-max-charges")); + } + + // only show the recharging info if it's not full + if (charges == comp.MaxCharges || !TryComp<AutoRechargeComponent>(uid, out var recharge)) + return; + + rechargeEnt.Comp2 = recharge; + var timeRemaining = GetNextRechargeTime(rechargeEnt); + args.PushMarkup(Loc.GetString("limited-charges-recharging", ("seconds", timeRemaining.TotalSeconds.ToString("F1")))); + } + + private void OnChargesAttempt(Entity<LimitedChargesComponent> ent, ref ActionAttemptEvent args) + { + if (args.Cancelled) + return; + + var charges = GetCurrentCharges((ent.Owner, ent.Comp, null)); + + if (charges <= 0) + { + args.Cancelled = true; } } - /// <summary> - /// Tries to add a number of charges. If it over or underflows it will be clamped, wasting the extra charges. - /// </summary> - public virtual void AddCharges(EntityUid uid, int change, LimitedChargesComponent? comp = null) + private void OnChargesPerformed(Entity<LimitedChargesComponent> ent, ref ActionPerformedEvent args) { - if (!Query.Resolve(uid, ref comp, false)) + AddCharges((ent.Owner, ent.Comp), -1); + } + + private void OnChargesMapInit(Entity<LimitedChargesComponent> ent, ref MapInitEvent args) + { + // If nothing specified use max. + if (ent.Comp.LastCharges == 0) + { + ent.Comp.LastCharges = ent.Comp.MaxCharges; + } + // If -1 used then we don't want any. + else if (ent.Comp.LastCharges < 0) + { + ent.Comp.LastCharges = 0; + } + + ent.Comp.LastUpdate = _timing.CurTime; + Dirty(ent); + } + + [Pure] + public bool HasCharges(Entity<LimitedChargesComponent?> action, int charges) + { + var current = GetCurrentCharges(action); + + return current >= charges; + } + + /// <summary> + /// Adds the specified charges. Does not reset the accumulator. + /// </summary> + public void AddCharges(Entity<LimitedChargesComponent?> action, int addCharges) + { + if (addCharges == 0) return; - var old = comp.Charges; - comp.Charges = Math.Clamp(comp.Charges + change, 0, comp.MaxCharges); - if (comp.Charges != old) - Dirty(uid, comp); + action.Comp ??= EnsureComp<LimitedChargesComponent>(action.Owner); + + // 1. If we're going FROM max then set lastupdate to now (so it doesn't instantly recharge). + // 2. If we're going TO max then also set lastupdate to now. + // 3. Otherwise don't modify it. + // No idea if we go to 0 but future problem. + + var lastCharges = GetCurrentCharges(action); + var charges = lastCharges + addCharges; + + if (lastCharges == charges) + return; + + if (charges == action.Comp.MaxCharges || lastCharges == action.Comp.MaxCharges) + { + action.Comp.LastUpdate = _timing.CurTime; + } + + action.Comp.LastCharges = Math.Clamp(action.Comp.LastCharges + addCharges, 0, action.Comp.MaxCharges); + Dirty(action); } - /// <summary> - /// Gets the limited charges component and returns true if there are no charges. Will return false if there is no limited charges component. - /// </summary> - public bool IsEmpty(EntityUid uid, LimitedChargesComponent? comp = null) + public bool TryUseCharge(Entity<LimitedChargesComponent?> entity) { - // can't be empty if there are no limited charges - if (!Query.Resolve(uid, ref comp, false)) + return TryUseCharges(entity, 1); + } + + public bool TryUseCharges(Entity<LimitedChargesComponent?> entity, int amount) + { + var current = GetCurrentCharges(entity); + + if (current < amount) + { return false; + } - return comp.Charges <= 0; - } - - /// <summary> - /// Uses a single charge. Must check IsEmpty beforehand to prevent using with 0 charge. - /// </summary> - public void UseCharge(EntityUid uid, LimitedChargesComponent? comp = null) - { - AddCharges(uid, -1, comp); - } - - /// <summary> - /// Checks IsEmpty and uses a charge if it isn't empty. - /// </summary> - public bool TryUseCharge(Entity<LimitedChargesComponent?> ent) - { - if (!Query.Resolve(ent, ref ent.Comp, false)) - return true; - - if (IsEmpty(ent, ent.Comp)) - return false; - - UseCharge(ent, ent.Comp); + AddCharges(entity, -amount); return true; } - /// <summary> - /// Gets the limited charges component and returns true if the number of charges remaining is less than the specified value. - /// Will return false if there is no limited charges component. - /// </summary> - public bool HasInsufficientCharges(EntityUid uid, int requiredCharges, LimitedChargesComponent? comp = null) + [Pure] + public bool IsEmpty(Entity<LimitedChargesComponent?> entity) { - // can't be empty if there are no limited charges - if (!Resolve(uid, ref comp, false)) - return false; - - return comp.Charges < requiredCharges; + return GetCurrentCharges(entity) == 0; } /// <summary> - /// Uses up a specified number of charges. Must check HasInsufficentCharges beforehand to prevent using with insufficient remaining charges. + /// Resets action charges to MaxCharges. /// </summary> - public virtual void UseCharges(EntityUid uid, int chargesUsed, LimitedChargesComponent? comp = null) + public void ResetCharges(Entity<LimitedChargesComponent?> action) { - AddCharges(uid, -chargesUsed, comp); + if (!Resolve(action.Owner, ref action.Comp, false)) + return; + + var charges = GetCurrentCharges((action.Owner, action.Comp, null)); + + if (charges == action.Comp.MaxCharges) + return; + + action.Comp.LastCharges = action.Comp.MaxCharges; + action.Comp.LastUpdate = _timing.CurTime; + Dirty(action); + } + + public void SetCharges(Entity<LimitedChargesComponent?> action, int value) + { + action.Comp ??= EnsureComp<LimitedChargesComponent>(action.Owner); + + var adjusted = Math.Clamp(value, 0, action.Comp.MaxCharges); + + if (action.Comp.LastCharges == adjusted) + { + return; + } + + action.Comp.LastCharges = adjusted; + action.Comp.LastUpdate = _timing.CurTime; + Dirty(action); + } + + /// <summary> + /// The next time a charge will be considered to be filled. + /// </summary> + /// <returns>0 timespan if invalid or no charges to generate.</returns> + [Pure] + public TimeSpan GetNextRechargeTime(Entity<LimitedChargesComponent?, AutoRechargeComponent?> entity) + { + if (!Resolve(entity.Owner, ref entity.Comp1, ref entity.Comp2, false)) + { + return TimeSpan.Zero; + } + + // Okay so essentially we need to get recharge time to full, then modulus that by the recharge timer which should be the next tick. + var fullTime = ((entity.Comp1.MaxCharges - entity.Comp1.LastCharges) * entity.Comp2.RechargeDuration) + entity.Comp1.LastUpdate; + var timeRemaining = fullTime - _timing.CurTime; + + if (timeRemaining < TimeSpan.Zero) + { + return TimeSpan.Zero; + } + + var nextChargeTime = timeRemaining.TotalSeconds % entity.Comp2.RechargeDuration.TotalSeconds; + return TimeSpan.FromSeconds(nextChargeTime); + } + + /// <summary> + /// Derives the current charges of an entity. + /// </summary> + [Pure] + public int GetCurrentCharges(Entity<LimitedChargesComponent?, AutoRechargeComponent?> entity) + { + if (!Resolve(entity.Owner, ref entity.Comp1, false)) + { + // I'm all in favor of nullable ints however null-checking return args against comp nullability is dodgy + // so we get this. + return -1; + } + + var calculated = 0; + + if (Resolve(entity.Owner, ref entity.Comp2, false) && entity.Comp2.RechargeDuration.TotalSeconds != 0.0) + { + calculated = (int)((_timing.CurTime - entity.Comp1.LastUpdate).TotalSeconds / entity.Comp2.RechargeDuration.TotalSeconds); + } + + return Math.Clamp(entity.Comp1.LastCharges + calculated, + 0, + entity.Comp1.MaxCharges); } } diff --git a/Content.Shared/Emag/Systems/EmagSystem.cs b/Content.Shared/Emag/Systems/EmagSystem.cs index 9626f17719..7aa4303471 100644 --- a/Content.Shared/Emag/Systems/EmagSystem.cs +++ b/Content.Shared/Emag/Systems/EmagSystem.cs @@ -21,7 +21,7 @@ namespace Content.Shared.Emag.Systems; public sealed class EmagSystem : EntitySystem { [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly SharedChargesSystem _sharedCharges = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; @@ -61,8 +61,8 @@ public sealed class EmagSystem : EntitySystem if (_tag.HasTag(target, ent.Comp.EmagImmuneTag)) return false; - TryComp<LimitedChargesComponent>(ent, out var charges); - if (_charges.IsEmpty(ent, charges)) + Entity<LimitedChargesComponent?> chargesEnt = ent.Owner; + if (_sharedCharges.IsEmpty(chargesEnt)) { _popup.PopupClient(Loc.GetString("emag-no-charges"), user, user); return false; @@ -80,8 +80,8 @@ public sealed class EmagSystem : EntitySystem _adminLogger.Add(LogType.Emag, LogImpact.High, $"{ToPrettyString(user):player} emagged {ToPrettyString(target):target} with flag(s): {ent.Comp.EmagType}"); - if (charges != null && emaggedEvent.Handled) - _charges.UseCharge(ent, charges); + if (emaggedEvent.Handled) + _sharedCharges.TryUseCharge(chargesEnt); if (!emaggedEvent.Repeatable) { diff --git a/Content.Shared/Magic/SpellbookSystem.cs b/Content.Shared/Magic/SpellbookSystem.cs index ce1628bacb..39fa16f622 100644 --- a/Content.Shared/Magic/SpellbookSystem.cs +++ b/Content.Shared/Magic/SpellbookSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Actions; +using Content.Shared.Charges.Systems; using Content.Shared.DoAfter; using Content.Shared.Interaction.Events; using Content.Shared.Magic.Components; @@ -9,6 +10,7 @@ namespace Content.Shared.Magic; public sealed class SpellbookSystem : EntitySystem { + [Dependency] private readonly SharedChargesSystem _sharedCharges = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; @@ -30,11 +32,7 @@ public sealed class SpellbookSystem : EntitySystem if (spell == null) continue; - int? charge = charges; - if (_actions.GetCharges(spell) != null) - charge = _actions.GetCharges(spell); - - _actions.SetCharges(spell, charge < 0 ? null : charge); + _sharedCharges.SetCharges(spell.Value, charges); ent.Comp.Spells.Add(spell.Value); } } @@ -75,7 +73,7 @@ public sealed class SpellbookSystem : EntitySystem { EntityUid? actionId = null; if (_actions.AddAction(args.Args.User, ref actionId, id)) - _actions.SetCharges(actionId, charges < 0 ? null : charges); + _sharedCharges.SetCharges(actionId.Value, charges); } } diff --git a/Content.Shared/Ninja/Systems/DashAbilitySystem.cs b/Content.Shared/Ninja/Systems/DashAbilitySystem.cs index cd8f7da768..c02d6cfd9a 100644 --- a/Content.Shared/Ninja/Systems/DashAbilitySystem.cs +++ b/Content.Shared/Ninja/Systems/DashAbilitySystem.cs @@ -22,7 +22,7 @@ public sealed class DashAbilitySystem : EntitySystem { [Dependency] private readonly ActionContainerSystem _actionContainer = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly SharedChargesSystem _sharedCharges = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; @@ -79,7 +79,7 @@ public sealed class DashAbilitySystem : EntitySystem return; } - if (!_charges.TryUseCharge(uid)) + if (!_sharedCharges.TryUseCharge(uid)) { _popup.PopupClient(Loc.GetString("dash-ability-no-charges", ("item", uid)), user, user); return; diff --git a/Content.Shared/Ninja/Systems/EnergyKatanaSystem.cs b/Content.Shared/Ninja/Systems/EnergyKatanaSystem.cs index 281b97a648..c2425b9264 100644 --- a/Content.Shared/Ninja/Systems/EnergyKatanaSystem.cs +++ b/Content.Shared/Ninja/Systems/EnergyKatanaSystem.cs @@ -28,6 +28,7 @@ public sealed class EnergyKatanaSystem : EntitySystem private void OnCheckDash(Entity<EnergyKatanaComponent> ent, ref CheckDashEvent args) { + // Just use a whitelist fam if (!_ninja.IsNinja(args.User)) args.Cancelled = true; } diff --git a/Content.Shared/RCD/Components/RCDAmmoComponent.cs b/Content.Shared/RCD/Components/RCDAmmoComponent.cs index 4135b606e2..2c0c6bcabc 100644 --- a/Content.Shared/RCD/Components/RCDAmmoComponent.cs +++ b/Content.Shared/RCD/Components/RCDAmmoComponent.cs @@ -11,6 +11,6 @@ public sealed partial class RCDAmmoComponent : Component /// How many charges are contained in this ammo cartridge. /// Can be partially transferred into an RCD, until it is empty then it gets deleted. /// </summary> - [DataField("charges"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public int Charges = 30; } diff --git a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs index 9cb3c26485..eb770f2898 100644 --- a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs +++ b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs @@ -10,7 +10,7 @@ namespace Content.Shared.RCD.Systems; public sealed class RCDAmmoSystem : EntitySystem { - [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly SharedChargesSystem _sharedCharges = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly IGameTiming _timing = default!; @@ -41,9 +41,10 @@ public sealed class RCDAmmoSystem : EntitySystem !TryComp<LimitedChargesComponent>(target, out var charges)) return; + var current = _sharedCharges.GetCurrentCharges((target, charges)); var user = args.User; args.Handled = true; - var count = Math.Min(charges.MaxCharges - charges.Charges, comp.Charges); + var count = Math.Min(charges.MaxCharges - current, comp.Charges); if (count <= 0) { _popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-full"), target, user); @@ -51,7 +52,7 @@ public sealed class RCDAmmoSystem : EntitySystem } _popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-refilled"), target, user); - _charges.AddCharges(target, count, charges); + _sharedCharges.AddCharges(target, count); comp.Charges -= count; Dirty(uid, comp); diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index 83d6660e8e..2025f2f3cc 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -33,7 +33,7 @@ public sealed class RCDSystem : EntitySystem [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; [Dependency] private readonly FloorTileSystem _floors = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly SharedChargesSystem _sharedCharges = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; @@ -43,7 +43,6 @@ public sealed class RCDSystem : EntitySystem [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TagSystem _tags = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; private readonly int _instantConstructionDelay = 0; private readonly EntProtoId _instantConstructionFx = "EffectRCDConstruct0"; @@ -133,7 +132,7 @@ public sealed class RCDSystem : EntitySystem if (!location.IsValid(EntityManager)) return; - var gridUid = _transformSystem.GetGrid(location); + var gridUid = _transform.GetGrid(location); if (!TryComp<MapGridComponent>(gridUid, out var mapGrid)) { @@ -239,7 +238,7 @@ public sealed class RCDSystem : EntitySystem // Ensure the RCD operation is still valid var location = GetCoordinates(args.Event.Location); - var gridUid = _transformSystem.GetGrid(location); + var gridUid = _transform.GetGrid(location); if (!TryComp<MapGridComponent>(gridUid, out var mapGrid)) { @@ -272,7 +271,7 @@ public sealed class RCDSystem : EntitySystem var location = GetCoordinates(args.Location); - var gridUid = _transformSystem.GetGrid(location); + var gridUid = _transform.GetGrid(location); if (!TryComp<MapGridComponent>(gridUid, out var mapGrid)) return; @@ -289,7 +288,7 @@ public sealed class RCDSystem : EntitySystem // Play audio and consume charges _audio.PlayPredicted(component.SuccessSound, uid, args.User); - _charges.UseCharges(uid, args.Cost); + _sharedCharges.AddCharges(uid, -args.Cost); } private void OnRCDconstructionGhostRotationEvent(RCDConstructionGhostRotationEvent ev, EntitySessionEventArgs session) @@ -321,10 +320,10 @@ public sealed class RCDSystem : EntitySystem var prototype = _protoManager.Index(component.ProtoId); // Check that the RCD has enough ammo to get the job done - TryComp<LimitedChargesComponent>(uid, out var charges); + var charges = _sharedCharges.GetCurrentCharges(uid); // Both of these were messages were suppose to be predicted, but HasInsufficientCharges wasn't being checked on the client for some reason? - if (_charges.IsEmpty(uid, charges)) + if (charges == 0) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-no-ammo-message"), uid, user); @@ -332,7 +331,7 @@ public sealed class RCDSystem : EntitySystem return false; } - if (_charges.HasInsufficientCharges(uid, prototype.Cost, charges)) + if (prototype.Cost > charges) { if (popMsgs) _popup.PopupClient(Loc.GetString("rcd-component-insufficient-ammo-message"), uid, user); diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index b1c68f9d0e..e1da9bcf1f 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -93,8 +93,9 @@ name: Break Free description: Activating your freedom implant will free you from any hand restraints components: + - type: LimitedCharges + maxCharges: 3 - type: InstantAction - charges: 3 checkCanInteract: false itemIconStyle: BigAction priority: -20 @@ -121,9 +122,10 @@ name: Activate EMP description: Triggers a small EMP pulse around you components: + - type: LimitedCharges + maxCharges: 3 - type: InstantAction checkCanInteract: false - charges: 3 useDelay: 5 itemIconStyle: BigAction priority: -20 @@ -137,9 +139,10 @@ name: SCRAM! description: Randomly teleports you within a large distance. components: + - type: LimitedCharges + maxCharges: 2 - type: InstantAction checkCanInteract: false - charges: 2 useDelay: 5 itemIconStyle: BigAction priority: -20 @@ -155,8 +158,9 @@ components: - type: ConfirmableAction popup: dna-scrambler-action-popup + - type: LimitedCharges + maxCharges: 1 - type: InstantAction - charges: 1 itemIconStyle: BigAction priority: -20 icon: diff --git a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml index 9b27ad0bc6..a6ab09699f 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml @@ -159,7 +159,6 @@ - type: Flash - type: LimitedCharges maxCharges: 3 - charges: 3 - type: AutoRecharge rechargeDuration: 30 - type: MeleeWeapon diff --git a/Resources/Prototypes/Entities/Objects/Tools/lantern.yml b/Resources/Prototypes/Entities/Objects/Tools/lantern.yml index 89101e34ff..f5ea2e6f27 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lantern.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lantern.yml @@ -88,7 +88,6 @@ - type: Flash - type: LimitedCharges maxCharges: 15 - charges: 15 - type: MeleeWeapon damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index 11f40764b7..d84dec120a 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -320,7 +320,6 @@ - Deconstruct - type: LimitedCharges maxCharges: 30 - charges: 30 - type: Sprite sprite: Objects/Tools/rcd.rsi state: icon @@ -351,7 +350,7 @@ suffix: Empty components: - type: LimitedCharges - charges: 0 + lastCharges: -1 - type: entity id: RCDRecharging @@ -362,7 +361,6 @@ components: - type: LimitedCharges maxCharges: 20 - charges: 20 - type: AutoRecharge rechargeDuration: 10 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 44e98538ad..a87f380646 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -89,7 +89,6 @@ - type: DashAbility - type: LimitedCharges maxCharges: 3 - charges: 3 - type: AutoRecharge rechargeDuration: 20 - type: Clothing diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 59889ce649..ff54af9518 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -147,7 +147,6 @@ - type: Flash - type: LimitedCharges maxCharges: 5 - charges: 5 - type: MeleeWeapon wideAnimationRotation: 180 damage: @@ -183,7 +182,6 @@ components: - type: LimitedCharges maxCharges: 2 - charges: 2 - type: entity name: portable flasher diff --git a/Resources/Prototypes/Magic/animate_spell.yml b/Resources/Prototypes/Magic/animate_spell.yml index a9609c4f8a..d36afb49d9 100644 --- a/Resources/Prototypes/Magic/animate_spell.yml +++ b/Resources/Prototypes/Magic/animate_spell.yml @@ -3,9 +3,10 @@ name: Animate description: Bring an inanimate object to life! components: + - type: LimitedCharges + maxCharges: 5 - type: EntityTargetAction useDelay: 0 - charges: 5 itemIconStyle: BigAction whitelist: components: diff --git a/Resources/Prototypes/Magic/projectile_spells.yml b/Resources/Prototypes/Magic/projectile_spells.yml index 71bbc096c5..eee8b1fc8a 100644 --- a/Resources/Prototypes/Magic/projectile_spells.yml +++ b/Resources/Prototypes/Magic/projectile_spells.yml @@ -30,8 +30,6 @@ description: Fires a fireball, but faster! components: - type: WorldTargetAction - useDelay: 10 - renewCharges: true itemIconStyle: BigAction checkCanAccess: false raiseOnUser: true @@ -52,8 +50,6 @@ description: The fastest fireball in the west! components: - type: WorldTargetAction - useDelay: 8 - renewCharges: true itemIconStyle: BigAction checkCanAccess: false raiseOnUser: true diff --git a/Resources/Prototypes/Magic/staves.yml b/Resources/Prototypes/Magic/staves.yml index 0582899495..8bfb30b887 100644 --- a/Resources/Prototypes/Magic/staves.yml +++ b/Resources/Prototypes/Magic/staves.yml @@ -59,9 +59,10 @@ - type: entity id: ActionRgbLight components: + - type: LimitedCharges + maxCharges: 25 - type: EntityTargetAction whitelist: { components: [ PointLight ] } - charges: 25 sound: /Audio/Magic/blink.ogg event: !type:ChangeComponentsSpellEvent toAdd: From fa24960445e9bac27bf4689f035f0504a72d874a Mon Sep 17 00:00:00 2001 From: J <billsmith116@gmail.com> Date: Fri, 18 Apr 2025 03:47:17 +0000 Subject: [PATCH 266/622] Storage warnings cleanup (#36196) * Storage warnings cleanup * Setting audio params on component --- .../Storage/Components/CursedEntityStorageComponent.cs | 4 ++-- .../Storage/EntitySystems/BluespaceLockerSystem.cs | 7 ++++--- .../Storage/EntitySystems/CursedEntityStorageSystem.cs | 7 +++---- .../Storage/EntitySystems/EntityStorageSystem.cs | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Content.Server/Storage/Components/CursedEntityStorageComponent.cs b/Content.Server/Storage/Components/CursedEntityStorageComponent.cs index 8a56ecc78e..5f387135d7 100644 --- a/Content.Server/Storage/Components/CursedEntityStorageComponent.cs +++ b/Content.Server/Storage/Components/CursedEntityStorageComponent.cs @@ -5,6 +5,6 @@ namespace Content.Server.Storage.Components; [RegisterComponent] public sealed partial class CursedEntityStorageComponent : Component { - [DataField("cursedSound")] - public SoundSpecifier CursedSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg"); + [DataField] + public SoundSpecifier CursedSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg", AudioParams.Default.WithVariation(0.125f)); } diff --git a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs index 3a88bf3910..de5ab7a6ca 100644 --- a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs +++ b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs @@ -17,6 +17,7 @@ using Robust.Shared.Random; using Robust.Shared.Timing; using Robust.Shared.Prototypes; using Content.Server.Shuttles.Components; +using Robust.Shared.Physics; namespace Content.Server.Storage.EntitySystems; @@ -163,11 +164,11 @@ public sealed class BluespaceLockerSystem : EntitySystem return false; if (lockerComponent.PickLinksFromSameMap && - link.ToCoordinates().GetMapId(EntityManager) != locker.ToCoordinates().GetMapId(EntityManager)) + _transformSystem.GetMapId(link.ToCoordinates()) != _transformSystem.GetMapId(locker.ToCoordinates())) return false; if (lockerComponent.PickLinksFromStationGrids && - !HasComp<StationMemberComponent>(link.ToCoordinates().GetGridUid(EntityManager))) + !HasComp<StationMemberComponent>(_transformSystem.GetGrid(link.ToCoordinates()))) return false; if (lockerComponent.PickLinksFromResistLockers && @@ -392,7 +393,7 @@ public sealed class BluespaceLockerSystem : EntitySystem switch (component.BehaviorProperties.DestroyType) { case BluespaceLockerDestroyType.Explode: - _explosionSystem.QueueExplosion(uid.ToCoordinates().ToMap(EntityManager, _transformSystem), + _explosionSystem.QueueExplosion(_transformSystem.ToMapCoordinates(uid.ToCoordinates()), ExplosionSystem.DefaultExplosionPrototypeId, 4, 1, 2, uid, maxTileBreak: 0); goto case BluespaceLockerDestroyType.Delete; case BluespaceLockerDestroyType.Delete: diff --git a/Content.Server/Storage/EntitySystems/CursedEntityStorageSystem.cs b/Content.Server/Storage/EntitySystems/CursedEntityStorageSystem.cs index 9b65daf461..4e1d0647ee 100644 --- a/Content.Server/Storage/EntitySystems/CursedEntityStorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/CursedEntityStorageSystem.cs @@ -1,10 +1,9 @@ -using System.Linq; using Content.Server.Storage.Components; -using Content.Shared.Audio; using Content.Shared.Storage.Components; -using Robust.Shared.Random; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; +using Robust.Shared.Random; +using System.Linq; namespace Content.Server.Storage.EntitySystems; @@ -50,6 +49,6 @@ public sealed class CursedEntityStorageSystem : EntitySystem _entityStorage.AddToContents(entity, lockerEnt); } - _audio.PlayPvs(component.CursedSound, uid, AudioHelpers.WithVariation(0.125f, _random)); + _audio.PlayPvs(component.CursedSound, uid); } } diff --git a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs index 8b31f598d0..27d84de28c 100644 --- a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs @@ -139,7 +139,7 @@ public sealed class EntityStorageSystem : SharedEntityStorageSystem private TileRef? GetOffsetTileRef(EntityUid uid, EntityStorageComponent component) { - var targetCoordinates = new EntityCoordinates(uid, component.EnteringOffset).ToMap(EntityManager, TransformSystem); + var targetCoordinates = TransformSystem.ToMapCoordinates(new EntityCoordinates(uid, component.EnteringOffset)); if (_map.TryFindGridAt(targetCoordinates, out var gridId, out var grid)) { From 3676bf36178d76904f7de6605a04af28c8c1f274 Mon Sep 17 00:00:00 2001 From: Spessmann <156740760+Spessmann@users.noreply.github.com> Date: Thu, 17 Apr 2025 20:47:43 -0700 Subject: [PATCH 267/622] Removed the periodic table from the poster spawner (#36402) removed the periodic table from the legit/any poster spawner --- .../Prototypes/Entities/Markers/Spawners/Random/posters.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml index 2a1988d8ad..103278d896 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml @@ -147,7 +147,6 @@ - PosterLegitJustAWeekAway - PosterLegitSecWatch - PosterLegitVacation - - PosterLegitPeriodicTable - PosterLegitRenault - PosterLegitNTTGC - PosterLegitSafetyMothDelam From f404ea039d3c4ebc0e41714ae5ddb14c8fdd9a82 Mon Sep 17 00:00:00 2001 From: Andrew Montagne <andrew@montagne.uk> Date: Fri, 18 Apr 2025 04:49:36 +0100 Subject: [PATCH 268/622] Adds Test & Integration Test commands to the Visual Studio Code configuration (#32705) Adds the test commands to the vscode configuration. --- .vscode/tasks.json | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1e95fb41b0..7f4efc8c9a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -32,6 +32,50 @@ "/consoleloggerparameters:'ForceNoAlign;NoSummary'" ], "problemMatcher": "$msCompile" + }, + { + "label": "test", + "command": "dotnet", + "type": "shell", + "args": [ + "test", + "--no-build", + "--configuration", + "DebugOpt", + "Content.Tests/Content.Tests.csproj", + "--", + "NUnit.ConsoleOut=0" + ], + "group": { + "kind": "test" + }, + "presentation": { + "reveal": "silent" + }, + "problemMatcher": "$msCompile" + }, + { + "label": "integration-test", + "command": "dotnet", + "type": "shell", + "args": [ + "test", + "--no-build", + "--configuration", + "DebugOpt", + "Content.IntegrationTests/Content.IntegrationTests.csproj", + "--", + "NUnit.ConsoleOut=0", + "NUnit.MapWarningTo=Failed.ConsoleOut=0", + "NUnit.MapWarningTo=Failed" + ], + "group": { + "kind": "test" + }, + "presentation": { + "reveal": "silent" + }, + "problemMatcher": "$msCompile" } ] } From 44435a42efae8e497bc59064bb17fd67636c2bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= <ss.adasts@gmail.com> Date: Thu, 17 Apr 2025 22:52:04 -0500 Subject: [PATCH 269/622] Reorganize security lathe recipes, add category filters (#35594) * split * touchup * touchup * double check * minor rename --- .../Locale/en-US/lathe/lathe-categories.ftl | 7 +- Resources/Prototypes/Recipes/Lathes/ammo.yml | 490 +++++++++++ .../Prototypes/Recipes/Lathes/categories.yml | 21 +- .../Prototypes/Recipes/Lathes/security.yml | 771 ++++-------------- 4 files changed, 693 insertions(+), 596 deletions(-) create mode 100644 Resources/Prototypes/Recipes/Lathes/ammo.yml diff --git a/Resources/Locale/en-US/lathe/lathe-categories.ftl b/Resources/Locale/en-US/lathe/lathe-categories.ftl index c6e300e008..8c118e51ad 100644 --- a/Resources/Locale/en-US/lathe/lathe-categories.ftl +++ b/Resources/Locale/en-US/lathe/lathe-categories.ftl @@ -1,6 +1,6 @@ # Generic -lathe-category-ammo = Ammo lathe-category-circuitry = Circuitry +lathe-category-clothing = Clothing lathe-category-lights = Lights lathe-category-mechs = Mechs lathe-category-parts = Parts @@ -13,6 +13,11 @@ lathe-category-food = Food lathe-category-chemicals = Chemicals lathe-category-materials = Materials +# Sec +lathe-category-ammo = Ammo +lathe-category-boxes = Boxes +lathe-category-magazines = Magazines + # Uniform lathe-category-bedsheets = Bedsheets lathe-category-carpets = Carpets diff --git a/Resources/Prototypes/Recipes/Lathes/ammo.yml b/Resources/Prototypes/Recipes/Lathes/ammo.yml new file mode 100644 index 0000000000..908395a1e8 --- /dev/null +++ b/Resources/Prototypes/Recipes/Lathes/ammo.yml @@ -0,0 +1,490 @@ +# Base prototypes + +- type: latheRecipe + abstract: true + id: BaseAmmoRecipe + categories: + - Ammo + completetime: 5 + +- type: latheRecipe + abstract: true + parent: BaseAmmoRecipe + id: BaseAmmoBoxRecipe + categories: + - Ammo + - Boxes + +- type: latheRecipe + abstract: true + id: BaseEmptyAmmoRecipe + categories: + - Magazines + completetime: 1 + +## Recipes + +# .20 Rifle +- type: latheRecipe + parent: BaseEmptyAmmoRecipe + id: MagazineRifleEmpty + result: MagazineRifleEmpty + materials: + Steel: 25 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineRifle + result: MagazineRifle + materials: + Steel: 475 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineRifleIncendiary + result: MagazineRifleIncendiary + materials: + Steel: 25 + Plastic: 450 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineRiflePractice + result: MagazineRiflePractice + materials: + Steel: 175 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineRifleUranium + result: MagazineRifleUranium + materials: + Steel: 25 + Plastic: 300 + Uranium: 300 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxRifle + result: MagazineBoxRifle + materials: + Steel: 750 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxRifleIncendiary + result: MagazineBoxRifleIncendiary + materials: + Plastic: 750 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxRiflePractice + result: MagazineBoxRiflePractice + materials: + Steel: 250 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxRifleUranium + result: MagazineBoxRifleUranium + materials: + Plastic: 500 + Uranium: 500 + +# .30 Rifle +- type: latheRecipe + parent: BaseEmptyAmmoRecipe + id: MagazineLightRifleEmpty + result: MagazineLightRifleEmpty + materials: + Steel: 25 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineLightRifle + result: MagazineLightRifle + materials: + Steel: 565 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineLightRifleIncendiary + result: MagazineLightRifleIncendiary + materials: + Steel: 25 + Plastic: 540 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineLightRiflePractice + result: MagazineLightRiflePractice + materials: + Steel: 205 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineLightRifleUranium + result: MagazineLightRifleUranium + materials: + Steel: 25 + Plastic: 360 + Uranium: 360 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxLightRifle + result: MagazineBoxLightRifle + materials: + Steel: 900 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxLightRifleIncendiary + result: MagazineBoxLightRifleIncendiary + materials: + Plastic: 900 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxLightRiflePractice + result: MagazineBoxLightRiflePractice + materials: + Steel: 300 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxLightRifleUranium + result: MagazineBoxLightRifleUranium + materials: + Plastic: 600 + Uranium: 600 + +# .35 Auto +- type: latheRecipe + parent: BaseEmptyAmmoRecipe + id: MagazinePistolEmpty + result: MagazinePistolEmpty + materials: + Steel: 25 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistol + result: MagazinePistol + materials: + Steel: 145 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistolIncendiary + result: MagazinePistolIncendiary + materials: + Steel: 25 + Plastic: 120 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistolPractice + result: MagazinePistolPractice + materials: + Steel: 85 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistolUranium + result: MagazinePistolUranium + materials: + Steel: 25 + Plastic: 65 + Uranium: 120 + +- type: latheRecipe + parent: BaseEmptyAmmoRecipe + id: MagazinePistolSubMachineGunEmpty + result: MagazinePistolSubMachineGunEmpty + materials: + Steel: 30 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistolSubMachineGun + result: MagazinePistolSubMachineGun + materials: + Steel: 300 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistolSubMachineGunIncendiary + result: MagazinePistolSubMachineGunIncendiary + materials: + Steel: 25 + Plastic: 275 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistolSubMachineGunUranium + result: MagazinePistolSubMachineGunUranium + materials: + Steel: 25 + Plastic: 250 + Uranium: 250 + +- type: latheRecipe + parent: BaseEmptyAmmoRecipe + id: MagazinePistolSubMachineGunTopMountedEmpty + result: MagazinePistolSubMachineGunTopMountedEmpty + materials: + Steel: 30 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazinePistolSubMachineGunTopMounted + result: MagazinePistolSubMachineGunTopMounted + materials: + Steel: 300 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxPistol + result: MagazineBoxPistol + materials: + Steel: 600 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxPistolIncendiary + result: MagazineBoxPistolIncendiary + materials: + Plastic: 600 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxPistolPractice + result: MagazineBoxPistolPractice + materials: + Steel: 300 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxPistolUranium + result: MagazineBoxPistolUranium + materials: + Plastic: 300 + Uranium: 600 + +# .45 Magnum +- type: latheRecipe + parent: BaseEmptyAmmoRecipe + id: SpeedLoaderMagnumEmpty + result: SpeedLoaderMagnumEmpty + materials: + Steel: 50 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: SpeedLoaderMagnum + result: SpeedLoaderMagnum + materials: + Steel: 190 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: SpeedLoaderMagnumIncendiary + result: SpeedLoaderMagnumIncendiary + materials: + Steel: 50 + Plastic: 150 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: SpeedLoaderMagnumPractice + result: SpeedLoaderMagnumPractice + materials: + Steel: 90 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: SpeedLoaderMagnumUranium + result: SpeedLoaderMagnumUranium + materials: + Steel: 50 + Plastic: 150 + Uranium: 110 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxMagnum + result: MagazineBoxMagnum + materials: + Steel: 240 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxMagnumIncendiary + result: MagazineBoxMagnumIncendiary + materials: + Plastic: 240 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxMagnumPractice + result: MagazineBoxMagnumPractice + materials: + Steel: 60 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: MagazineBoxMagnumUranium + result: MagazineBoxMagnumUranium + materials: + Plastic: 240 + Uranium: 180 + +# .50 Shell +- type: latheRecipe + parent: BaseEmptyAmmoRecipe + id: MagazineShotgunEmpty + result: MagazineShotgunEmpty + materials: + Steel: 50 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineShotgun + result: MagazineShotgun + materials: + Steel: 240 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineShotgunIncendiary + result: MagazineShotgunIncendiary + materials: + Steel: 100 + Plastic: 190 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineShotgunBeanbag + result: MagazineShotgunBeanbag + materials: + Steel: 150 + Plastic: 140 + +- type: latheRecipe + parent: BaseAmmoRecipe + id: MagazineShotgunSlug + result: MagazineShotgunSlug + materials: + Steel: 190 + Plastic: 100 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxLethalshot + result: BoxLethalshot + materials: + Steel: 320 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxShotgunIncendiary + result: BoxShotgunIncendiary + materials: + Steel: 80 + Plastic: 320 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxShotgunPractice + result: BoxShotgunPractice + materials: + Steel: 80 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxShotgunUranium + result: BoxShotgunUranium + materials: + Plastic: 320 + Uranium: 240 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxBeanbag + result: BoxBeanbag + materials: + Steel: 160 + Plastic: 240 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxShotgunSlug + result: BoxShotgunSlug + materials: + Steel: 240 + Plastic: 160 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxShellTranquilizer + result: BoxShellTranquilizer + materials: + Plastic: 240 + Steel: 160 + Glass: 80 + Plasma: 160 + Silver: 80 + +- type: latheRecipe + parent: BaseAmmoBoxRecipe + id: BoxShotgunFlare + result: BoxShotgunFlare + materials: + Steel: 80 + Plastic: 80 + +# Encampment ammo +- type: latheRecipe + id: MagazineGrenadeEmpty + result: MagazineGrenadeEmpty + categories: + - Magazines + completetime: 3 + materials: + Steel: 150 + Plastic: 50 + +- type: latheRecipe + id: GrenadeEMP + result: GrenadeEMP + categories: + - Ammo + completetime: 3 + materials: + Steel: 150 + Plastic: 100 + Glass: 20 + +- type: latheRecipe + id: GrenadeBlast + result: GrenadeBlast + categories: + - Ammo + completetime: 3 + materials: + Steel: 450 + Plastic: 300 + Gold: 150 + +- type: latheRecipe + id: GrenadeFlash + result: GrenadeFlash + categories: + - Ammo + completetime: 3 + materials: + Steel: 150 + Plastic: 100 + Glass: 20 diff --git a/Resources/Prototypes/Recipes/Lathes/categories.yml b/Resources/Prototypes/Recipes/Lathes/categories.yml index 486d8a090d..b0b607adb5 100644 --- a/Resources/Prototypes/Recipes/Lathes/categories.yml +++ b/Resources/Prototypes/Recipes/Lathes/categories.yml @@ -1,12 +1,12 @@ # Generic -- type: latheCategory - id: Ammo - name: lathe-category-ammo - - type: latheCategory id: Circuitry name: lathe-category-circuitry +- type: latheCategory + id: Clothing + name: lathe-category-clothing + - type: latheCategory id: Lights name: lathe-category-lights @@ -44,6 +44,19 @@ id: Materials name: lathe-category-materials +# Sec +- type: latheCategory + id: Ammo + name: lathe-category-ammo + +- type: latheCategory + id: Boxes + name: lathe-category-boxes + +- type: latheCategory + id: Magazines + name: lathe-category-magazines + # Uniform printer - type: latheCategory id: Bedsheets diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index 864edcba6e..5a04fb7396 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -1,14 +1,39 @@ # Base prototypes +- type: latheRecipe + abstract: true + id: BaseShieldRecipe + categories: + - Tools + completetime: 4 + +- type: latheRecipe + abstract: true + id: BaseTargetRecipe + categories: + - Tools + completetime: 5 + applyMaterialDiscount: false # ingredients dropped when destroyed + materials: + Steel: 500 + - type: latheRecipe abstract: true id: BaseWeaponRecipe categories: - Weapons + +- type: latheRecipe + abstract: true + parent: BaseWeaponRecipe + id: BaseWeaponRecipeMelee completetime: 2 - materials: - Steel: 300 - Plastic: 300 + +- type: latheRecipe + abstract: true + parent: BaseWeaponRecipe + id: BaseWeaponRecipePractice + completetime: 4 - type: latheRecipe abstract: true @@ -18,51 +43,168 @@ - type: latheRecipe abstract: true - id: BaseAmmoRecipe + parent: BaseWeaponRecipe + id: BaseWeaponRecipeSidearm + completetime: 6 + +## Recipes + +# Clothing +- type: latheRecipe + id: ClothingBackpackElectropack + result: ClothingBackpackElectropack categories: - - Ammo - completetime: 5 + - Clothing + completetime: 4 + materials: + Steel: 500 + Plastic: 250 + Cloth: 500 - type: latheRecipe - abstract: true - parent: BaseAmmoRecipe - id: BaseEmptyAmmoRecipe - completetime: 1 - -# Recipes + id: ClothingEyesHudSecurity + result: ClothingEyesHudSecurity + categories: + - Clothing + completetime: 2 + materials: + Steel: 300 + Glass: 200 - type: latheRecipe + id: PortableRecharger + result: PortableRecharger + categories: + - Clothing + completetime: 15 + materials: + Steel: 2000 + Uranium: 2000 + Plastic: 1000 + Plasma: 500 + Glass: 500 + +# Shields +- type: latheRecipe + parent: BaseShieldRecipe + id: RiotShield + result: RiotShield + materials: + Steel: 400 + Glass: 400 + +- type: latheRecipe + parent: BaseShieldRecipe + id: TelescopicShield + result: TelescopicShield + materials: + Steel: 300 + Glass: 800 + +# Targets +- type: latheRecipe + parent: BaseTargetRecipe + id: TargetHuman + result: TargetHuman + +- type: latheRecipe + parent: BaseTargetRecipe + id: TargetClown + result: TargetClown + +- type: latheRecipe + parent: BaseTargetRecipe + id: TargetSyndicate + result: TargetSyndicate + +# Tools +- type: latheRecipe + parent: BaseToolRecipe id: Handcuffs result: Handcuffs - completetime: 2 materials: Steel: 300 - type: latheRecipe + parent: BaseToolRecipe id: Zipties result: Zipties - completetime: 2 materials: Plastic: 200 - type: latheRecipe - parent: BaseWeaponRecipe + parent: BaseToolRecipe + id: ForensicPad + result: ForensicPad + completetime: 4 + materials: + Plastic: 100 + +- type: latheRecipe + parent: BaseToolRecipe + id: HoloprojectorSecurity + result: HoloprojectorSecurityEmpty + materials: + Steel: 300 + Glass: 50 + Plastic: 50 + +- type: latheRecipe + parent: BaseToolRecipe + id: Flash + result: Flash + materials: + Glass: 100 + Plastic: 200 + Steel: 100 + +## Weapons + +# Melee +- type: latheRecipe + parent: BaseWeaponRecipeMelee id: Stunbaton result: Stunbaton + materials: + Steel: 300 + Plastic: 300 - type: latheRecipe - parent: BaseWeaponRecipe + parent: BaseWeaponRecipeMelee id: Truncheon result: Truncheon + materials: + Steel: 300 + Plastic: 300 - type: latheRecipe - parent: BaseWeaponRecipe + parent: BaseWeaponRecipeMelee id: CombatKnife result: CombatKnife materials: Steel: 250 Plastic: 100 +# Practice weapons +- type: latheRecipe + parent: BaseWeaponRecipePractice + id: WeaponDisablerPractice + result: WeaponDisablerPractice + materials: + Steel: 500 + Glass: 100 + Plastic: 200 + +- type: latheRecipe + parent: BaseWeaponRecipePractice + id: WeaponLaserCarbinePractice + result: WeaponLaserCarbinePractice + materials: + Steel: 1800 + Glass: 400 + Plastic: 250 + +# Long Guns - type: latheRecipe parent: BaseWeaponRecipeLong id: WeaponLaserCarbine @@ -90,16 +232,6 @@ Plastic: 750 Gold: 500 -- type: latheRecipe - parent: BaseWeaponRecipeLong - id: WeaponTemperatureGun - result: WeaponTemperatureGun - materials: - Steel: 2000 - Glass: 500 - Plastic: 500 - Gold: 500 - - type: latheRecipe parent: BaseWeaponRecipeLong id: WeaponXrayCannon @@ -111,540 +243,27 @@ Gold: 100 - type: latheRecipe - id: ClothingBackpackElectropack - result: ClothingBackpackElectropack - completetime: 4 - materials: - Steel: 500 - Plastic: 250 - Cloth: 500 - -- type: latheRecipe - id: ForensicPad - result: ForensicPad - completetime: 4 - materials: - Plastic: 100 - -- type: latheRecipe - id: ClothingEyesHudSecurity - result: ClothingEyesHudSecurity - completetime: 2 - materials: - Steel: 300 - Glass: 200 - -- type: latheRecipe - id: HoloprojectorSecurity - result: HoloprojectorSecurityEmpty - completetime: 2 - materials: - Steel: 300 - Glass: 50 - Plastic: 50 - -- type: latheRecipe - id: RiotShield - result: RiotShield - completetime: 4 - materials: - Steel: 400 - Glass: 400 - -- type: latheRecipe - id: TelescopicShield - result: TelescopicShield - completetime: 4 - materials: - Steel: 300 - Glass: 800 - -- type: latheRecipe - id: Flash - result: Flash - completetime: 2 - materials: - Glass: 100 - Plastic: 200 - Steel: 100 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: BoxShellTranquilizer - result: BoxShellTranquilizer - materials: - Plastic: 240 - Steel: 160 - Glass: 80 - Plasma: 160 - Silver: 80 - -- type: latheRecipe - id: TargetHuman - result: TargetHuman - completetime: 5 - applyMaterialDiscount: false # ingredients dropped when destroyed - materials: - Steel: 500 - -- type: latheRecipe - parent: TargetHuman - id: TargetClown - result: TargetClown - -- type: latheRecipe - parent: TargetHuman - id: TargetSyndicate - result: TargetSyndicate - -- type: latheRecipe - parent: BaseEmptyAmmoRecipe - id: MagazinePistolEmpty - result: MagazinePistolEmpty - materials: - Steel: 25 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistol - result: MagazinePistol - materials: - Steel: 145 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistolPractice - result: MagazinePistolPractice - materials: - Steel: 85 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistolUranium - result: MagazinePistolUranium - materials: - Steel: 25 - Plastic: 65 - Uranium: 120 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistolIncendiary - result: MagazinePistolIncendiary - materials: - Steel: 25 - Plastic: 120 - -- type: latheRecipe - parent: BaseEmptyAmmoRecipe - id: MagazinePistolSubMachineGunEmpty - result: MagazinePistolSubMachineGunEmpty - materials: - Steel: 30 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistolSubMachineGun - result: MagazinePistolSubMachineGun - materials: - Steel: 300 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistolSubMachineGunUranium - result: MagazinePistolSubMachineGunUranium - materials: - Steel: 25 - Plastic: 250 - Uranium: 250 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistolSubMachineGunIncendiary - result: MagazinePistolSubMachineGunIncendiary - materials: - Steel: 25 - Plastic: 275 - -- type: latheRecipe - parent: BaseEmptyAmmoRecipe - id: MagazinePistolSubMachineGunTopMountedEmpty - result: MagazinePistolSubMachineGunTopMountedEmpty - materials: - Steel: 30 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazinePistolSubMachineGunTopMounted - result: MagazinePistolSubMachineGunTopMounted - materials: - Steel: 300 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxPistol - result: MagazineBoxPistol - materials: - Steel: 600 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxMagnum - result: MagazineBoxMagnum - materials: - Steel: 240 - -- type: latheRecipe - parent: BaseEmptyAmmoRecipe - id: MagazineRifleEmpty - result: MagazineRifleEmpty - materials: - Steel: 25 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineRifle - result: MagazineRifle - materials: - Steel: 475 - - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineRiflePractice - result: MagazineRiflePractice - materials: - Steel: 175 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineRifleUranium - result: MagazineRifleUranium - materials: - Steel: 25 - Plastic: 300 - Uranium: 300 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineRifleIncendiary - result: MagazineRifleIncendiary - materials: - Steel: 25 - Plastic: 450 - -- type: latheRecipe - parent: BaseEmptyAmmoRecipe - id: MagazineLightRifleEmpty - result: MagazineLightRifleEmpty - materials: - Steel: 25 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineLightRifle - result: MagazineLightRifle - materials: - Steel: 565 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineLightRiflePractice - result: MagazineLightRiflePractice - materials: - Steel: 205 - - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineLightRifleUranium - result: MagazineLightRifleUranium - materials: - Steel: 25 - Plastic: 360 - Uranium: 360 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineLightRifleIncendiary - result: MagazineLightRifleIncendiary - materials: - Steel: 25 - Plastic: 540 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxRifle - result: MagazineBoxRifle - materials: - Steel: 750 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxLightRifle - result: MagazineBoxLightRifle - materials: - Steel: 900 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: BoxLethalshot - result: BoxLethalshot - materials: - Steel: 320 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: BoxBeanbag - result: BoxBeanbag - materials: - Steel: 160 - Plastic: 240 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: BoxShotgunSlug - result: BoxShotgunSlug - materials: - Steel: 240 - Plastic: 160 - -- type: latheRecipe - parent: BaseEmptyAmmoRecipe - id: SpeedLoaderMagnumEmpty - result: SpeedLoaderMagnumEmpty - materials: - Steel: 50 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: SpeedLoaderMagnum - result: SpeedLoaderMagnum - materials: - Steel: 190 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: SpeedLoaderMagnumPractice - result: SpeedLoaderMagnumPractice - materials: - Steel: 90 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: SpeedLoaderMagnumUranium - result: SpeedLoaderMagnumUranium - materials: - Steel: 50 - Plastic: 150 - Uranium: 110 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: SpeedLoaderMagnumIncendiary - result: SpeedLoaderMagnumIncendiary - materials: - Steel: 50 - Plastic: 150 - -- type: latheRecipe - parent: BaseEmptyAmmoRecipe - id: MagazineShotgunEmpty - result: MagazineShotgunEmpty - materials: - Steel: 50 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineShotgun - result: MagazineShotgun - materials: - Steel: 240 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineShotgunBeanbag - result: MagazineShotgunBeanbag - materials: - Steel: 150 - Plastic: 140 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineShotgunSlug - result: MagazineShotgunSlug - materials: - Steel: 190 - Plastic: 100 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineShotgunIncendiary - result: MagazineShotgunIncendiary - materials: - Steel: 100 - Plastic: 190 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxPistolIncendiary - result: MagazineBoxPistolIncendiary - materials: - Plastic: 600 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxMagnumIncendiary - result: MagazineBoxMagnumIncendiary - materials: - Plastic: 240 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxLightRifleIncendiary - result: MagazineBoxLightRifleIncendiary - materials: - Plastic: 900 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxRifleIncendiary - result: MagazineBoxRifleIncendiary - materials: - Plastic: 750 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: BoxShotgunFlare - result: BoxShotgunFlare - materials: - Steel: 80 - Plastic: 80 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: BoxShotgunIncendiary - result: BoxShotgunIncendiary - materials: - Steel: 80 - Plastic: 320 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxPistolPractice - result: MagazineBoxPistolPractice - materials: - Steel: 300 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxMagnumPractice - result: MagazineBoxMagnumPractice - materials: - Steel: 60 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxLightRiflePractice - result: MagazineBoxLightRiflePractice - materials: - Steel: 300 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxRiflePractice - result: MagazineBoxRiflePractice - materials: - Steel: 250 - -- type: latheRecipe - parent: BaseWeaponRecipe - id: WeaponLaserCarbinePractice - result: WeaponLaserCarbinePractice - completetime: 6 - materials: - Steel: 1800 - Glass: 400 - Plastic: 250 - -- type: latheRecipe - parent: BaseWeaponRecipe - id: WeaponDisablerPractice - result: WeaponDisablerPractice - completetime: 4 - materials: - Steel: 500 - Glass: 100 - Plastic: 200 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: BoxShotgunPractice - result: BoxShotgunPractice - materials: - Steel: 80 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxPistolUranium - result: MagazineBoxPistolUranium - materials: - Plastic: 300 - Uranium: 600 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxMagnumUranium - result: MagazineBoxMagnumUranium - materials: - Plastic: 240 - Uranium: 180 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxLightRifleUranium - result: MagazineBoxLightRifleUranium - materials: - Plastic: 600 - Uranium: 600 - -- type: latheRecipe - parent: BaseAmmoRecipe - id: MagazineBoxRifleUranium - result: MagazineBoxRifleUranium + parent: BaseWeaponRecipeLong + id: WeaponTemperatureGun + result: WeaponTemperatureGun materials: + Steel: 2000 + Glass: 500 Plastic: 500 - Uranium: 500 + Gold: 500 +# Sidearms - type: latheRecipe - parent: BaseAmmoRecipe - id: BoxShotgunUranium - result: BoxShotgunUranium - materials: - Plastic: 320 - Uranium: 240 - -- type: latheRecipe - parent: BaseWeaponRecipe - id: WeaponFlareGunSecurity - result: WeaponFlareGunSecurity - completetime: 6 - materials: - Plastic: 100 - Steel: 400 - -- type: latheRecipe - parent: BaseWeaponRecipe + parent: BaseWeaponRecipeSidearm id: WeaponDisabler result: WeaponDisabler - completetime: 6 materials: Steel: 300 Glass: 200 Plastic: 200 - type: latheRecipe - parent: WeaponDisabler + parent: BaseWeaponRecipeSidearm id: WeaponDisablerSMG result: WeaponDisablerSMG materials: @@ -653,47 +272,17 @@ Plastic: 500 - type: latheRecipe - id: MagazineGrenadeEmpty - result: MagazineGrenadeEmpty - completetime: 3 - materials: - Steel: 150 - Plastic: 50 - -- type: latheRecipe - id: GrenadeEMP - result: GrenadeEMP - completetime: 3 - materials: - Steel: 150 - Plastic: 100 - Glass: 20 - -- type: latheRecipe - id: GrenadeBlast - result: GrenadeBlast - completetime: 3 - materials: - Steel: 450 - Plastic: 300 - Gold: 150 - -- type: latheRecipe - id: GrenadeFlash - result: GrenadeFlash - completetime: 3 - materials: - Steel: 150 - Plastic: 100 - Glass: 20 - -- type: latheRecipe - id: PortableRecharger - result: PortableRecharger - completetime: 15 + parent: BaseWeaponRecipeSidearm + id: WeaponLaserSvalinn + result: WeaponLaserSvalinn materials: Steel: 2000 - Uranium: 2000 - Plastic: 1000 - Plasma: 500 - Glass: 500 + Gold: 500 + +- type: latheRecipe + parent: BaseWeaponRecipeSidearm + id: WeaponFlareGunSecurity + result: WeaponFlareGunSecurity + materials: + Plastic: 100 + Steel: 400 From 0da27d3371daf365a02c10373ae0dddf4cd8df46 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 03:53:11 +0000 Subject: [PATCH 270/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5e34673873..d416d6e756 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Golinth - changes: - - message: AMEs larger than 2 cores now produce more power, instead of less. - type: Tweak - id: 7725 - time: '2024-12-17T23:56:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32825 - author: ArtisticRoomba, AugustSun changes: - message: New Advanced SMES, an SMES with a 16 MJ capacity. It can be researched @@ -3913,3 +3906,10 @@ id: 8224 time: '2025-04-18T03:41:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/31754 +- author: aada + changes: + - message: Filter categories added to the security techfab. + type: Add + id: 8225 + time: '2025-04-18T03:52:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35594 From 725522c183b232ab59915ba7a4321b29dcc037b2 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Thu, 17 Apr 2025 23:55:09 -0400 Subject: [PATCH 271/622] Partial cleanup of ExplosionSystem (#36098) * Cleanup warnings in ExplosionSystem.TileFill * Formatting in ExplosionSystem.TileFill * Cleanup warning in ExplosionSystem * Formatting for ExplosionSystem * Switch from MapChangedEvent to MapRemovedEvent * Fix 1 warning in ExplosionSystem.Processing * Fix 1 warning in ExplosionSystem.Visuals * Fix 1 warning in ExplosionSystem.GridMap * Fix 2 warnings in ExplosionSystem.Airtight * Clear _grids --- .../EntitySystems/ExplosionSystem.Airtight.cs | 4 +-- .../EntitySystems/ExplosionSystem.GridMap.cs | 2 +- .../ExplosionSystem.Processing.cs | 9 ++---- .../EntitySystems/ExplosionSystem.TileFill.cs | 30 ++++++++++++------- .../EntitySystems/ExplosionSystem.Visuals.cs | 2 +- .../EntitySystems/ExplosionSystem.cs | 8 ++--- 6 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs index 6fa553bc8b..adc2e14f69 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Airtight.cs @@ -69,7 +69,7 @@ public sealed partial class ExplosionSystem query ??= EntityManager.GetEntityQuery<AirtightComponent>(); var damageQuery = EntityManager.GetEntityQuery<DamageableComponent>(); var destructibleQuery = EntityManager.GetEntityQuery<DestructibleComponent>(); - var anchoredEnumerator = grid.GetAnchoredEntitiesEnumerator(tile); + var anchoredEnumerator = _mapSystem.GetAnchoredEntitiesEnumerator(gridId, grid, tile); while (anchoredEnumerator.MoveNext(out var uid)) { @@ -105,7 +105,7 @@ public sealed partial class ExplosionSystem if (!TryComp<MapGridComponent>(transform.GridUid, out var grid)) return; - UpdateAirtightMap(transform.GridUid.Value, grid, grid.CoordinatesToTile(transform.Coordinates)); + UpdateAirtightMap(transform.GridUid.Value, grid, _mapSystem.CoordinatesToTile(transform.GridUid.Value, grid, transform.Coordinates)); } /// <summary> diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs index 3be64e1776..3b63750ff6 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs @@ -258,7 +258,7 @@ public sealed partial class ExplosionSystem { var neighbourIndex = tileRef.GridIndices + NeighbourVectors[i]; - if (grid.TryGetTileRef(neighbourIndex, out var neighbourTile) && !neighbourTile.Tile.IsEmpty) + if (_mapSystem.TryGetTileRef(ev.Entity, grid, neighbourIndex, out var neighbourTile) && !neighbourTile.Tile.IsEmpty) { var oppositeDirection = (NeighborFlag) (1 << ((i + 4) % 8)); edges[neighbourIndex] = edges.GetValueOrDefault(neighbourIndex) | oppositeDirection; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index 8ea2d5dfd9..3f2a0ea2da 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -67,13 +67,10 @@ public sealed partial class ExplosionSystem private List<EntityUid> _anchored = new(); - private void OnMapChanged(MapChangedEvent ev) + private void OnMapRemoved(MapRemovedEvent ev) { // If a map was deleted, check the explosion currently being processed belongs to that map. - if (ev.Created) - return; - - if (_activeExplosion?.Epicenter.MapId != ev.Map) + if (_activeExplosion?.Epicenter.MapId != ev.MapId) return; QueueDel(_activeExplosion.VisualEnt); @@ -718,7 +715,7 @@ sealed class Explosion if (spaceData != null) { - var mapUid = mapMan.GetMapEntityId(epicenter.MapId); + var mapUid = mapSystem.GetMap(epicenter.MapId); _explosionData.Add(new() { diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs index 43cc45beac..05608cda40 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs @@ -1,7 +1,6 @@ using System.Linq; using System.Numerics; using Content.Shared.Administration; -using Content.Shared.Explosion; using Content.Shared.Explosion.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -15,6 +14,11 @@ namespace Content.Server.Explosion.EntitySystems; public sealed partial class ExplosionSystem { + /// <summary> + /// A list of grids to be reused by <see cref="GetLocalGrids"/> to avoid allocating twice for each call. + /// </summary> + private List<Entity<MapGridComponent>> _grids = []; + /// <summary> /// This is the main explosion generating function. /// </summary> @@ -48,7 +52,7 @@ public sealed partial class ExplosionSystem // get the epicenter tile indices if (_mapManager.TryFindGridAt(epicenter, out var gridUid, out var candidateGrid) && - candidateGrid.TryGetTileRef(candidateGrid.WorldToTile(epicenter.Position), out var tileRef) && + _mapSystem.TryGetTileRef(gridUid, candidateGrid, _mapSystem.WorldToTile(gridUid, candidateGrid, epicenter.Position), out var tileRef) && !tileRef.Tile.IsEmpty) { epicentreGrid = gridUid; @@ -57,14 +61,15 @@ public sealed partial class ExplosionSystem else if (referenceGrid != null) { // reference grid defines coordinate system that the explosion in space will use - initialTile = Comp<MapGridComponent>(referenceGrid.Value).WorldToTile(epicenter.Position); + var gridComp = Comp<MapGridComponent>(referenceGrid.Value); + initialTile = _mapSystem.WorldToTile(referenceGrid.Value, gridComp, epicenter.Position); } else { // this is a space-based explosion that (should) not touch any grids. initialTile = new Vector2i( - (int) Math.Floor(epicenter.Position.X / DefaultTileSize), - (int) Math.Floor(epicenter.Position.Y / DefaultTileSize)); + (int)Math.Floor(epicenter.Position.X / DefaultTileSize), + (int)Math.Floor(epicenter.Position.Y / DefaultTileSize)); } // Main data for the exploding tiles in space and on various grids @@ -88,7 +93,7 @@ public sealed partial class ExplosionSystem var spaceAngle = Angle.Zero; if (referenceGrid != null) { - var xform = Transform(Comp<MapGridComponent>(referenceGrid.Value).Owner); + var xform = Transform(referenceGrid.Value); (_, spaceAngle, spaceMatrix) = _transformSystem.GetWorldPositionRotationMatrix(xform); } @@ -130,7 +135,7 @@ public sealed partial class ExplosionSystem // These variables keep track of the total intensity we have distributed List<int> tilesInIteration = new() { 1 }; - List<float> iterationIntensity = new() {stepSize}; + List<float> iterationIntensity = new() { stepSize }; var totalTiles = 1; var remainingIntensity = totalIntensity - stepSize; @@ -276,7 +281,9 @@ public sealed partial class ExplosionSystem // diameter x diameter sized box, use a smaller box with radius sized sides: var box = Box2.CenteredAround(epicenter.Position, new Vector2(radius, radius)); - foreach (var grid in _mapManager.FindGridsIntersecting(epicenter.MapId, box)) + _grids.Clear(); + _mapManager.FindGridsIntersecting(epicenter.MapId, box, ref _grids); + foreach (var grid in _grids) { if (TryComp(grid.Owner, out PhysicsComponent? physics) && physics.Mass > mass) { @@ -296,14 +303,15 @@ public sealed partial class ExplosionSystem radius *= 4; box = Box2.CenteredAround(epicenter.Position, new Vector2(radius, radius)); - var mapGrids = _mapManager.FindGridsIntersecting(epicenter.MapId, box).ToList(); - var grids = mapGrids.Select(x => x.Owner).ToList(); + _grids.Clear(); + _mapManager.FindGridsIntersecting(epicenter.MapId, box, ref _grids); + var grids = _grids.Select(x => x.Owner).ToList(); if (referenceGrid != null) return (grids, referenceGrid, radius); // We still don't have are reference grid. So lets also look in the enlarged region - foreach (var grid in mapGrids) + foreach (var grid in _grids) { if (TryComp(grid.Owner, out PhysicsComponent? physics) && physics.Mass > mass) { diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs index 57323e4de7..eb789eb0c6 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs @@ -57,7 +57,7 @@ public sealed partial class ExplosionSystem // Light, sound & visuals may extend well beyond normal PVS range. In principle, this should probably still be // restricted to something like the same map, but whatever. - _pvsSys.AddGlobalOverride(GetNetEntity(explosionEntity)); + _pvsSys.AddGlobalOverride(explosionEntity); var appearance = AddComp<AppearanceComponent>(explosionEntity); _appearance.SetData(explosionEntity, ExplosionAppearanceData.Progress, 1, appearance); diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 6bf237f46f..2aeefeb46c 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -94,7 +94,7 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem SubscribeLocalEvent<RoundRestartCleanupEvent>(OnReset); // Handled by ExplosionSystem.Processing.cs - SubscribeLocalEvent<MapChangedEvent>(OnMapChanged); + SubscribeLocalEvent<MapRemovedEvent>(OnMapRemoved); // handled in ExplosionSystemAirtight.cs SubscribeLocalEvent<AirtightComponent, DamageChangedEvent>(OnAirtightDamaged); @@ -155,12 +155,12 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem // Override the explosion intensity if optional arguments were provided. if (radius != null) - totalIntensity ??= RadiusToIntensity((float) radius, explosive.IntensitySlope, explosive.MaxIntensity); + totalIntensity ??= RadiusToIntensity((float)radius, explosive.IntensitySlope, explosive.MaxIntensity); totalIntensity ??= explosive.TotalIntensity; QueueExplosion(uid, explosive.ExplosionType, - (float) totalIntensity, + (float)totalIntensity, explosive.IntensitySlope, explosive.MaxIntensity, explosive.TileBreakScale, @@ -332,7 +332,7 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem private Explosion? SpawnExplosion(QueuedExplosion queued) { var pos = queued.Epicenter; - if (!_mapManager.MapExists(pos.MapId)) + if (!_mapSystem.MapExists(pos.MapId)) return null; var results = GetExplosionTiles(pos, queued.Proto.ID, queued.TotalIntensity, queued.Slope, queued.MaxTileIntensity); From e00e2ba407cbcebb0712d01d689361e42c0695d7 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Fri, 18 Apr 2025 00:01:46 -0400 Subject: [PATCH 272/622] Add `PopupPredictedCursor` and fix doubled popups on vending machines (#36655) * Add PopupCursorPredicted method * Fix doubled popups on vending machine restock failures * Rename to match existing pattern --- Content.Client/Popups/PopupSystem.cs | 10 ++++++++++ Content.Server/Popups/PopupSystem.cs | 10 ++++++++++ Content.Shared/Popups/SharedPopupSystem.cs | 14 +++++++++++++- .../SharedVendingMachineSystem.Restock.cs | 4 ++-- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index b0a3d9b21e..725568344d 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -173,6 +173,16 @@ namespace Content.Client.Popups PopupCursor(message, type); } + public override void PopupPredictedCursor(string? message, ICommonSession recipient, PopupType type = PopupType.Small) + { + PopupCursor(message, recipient, type); + } + + public override void PopupPredictedCursor(string? message, EntityUid recipient, PopupType type = PopupType.Small) + { + PopupCursor(message, recipient, type); + } + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, Filter filter, bool replayRecord, PopupType type = PopupType.Small) { PopupCoordinates(message, coordinates, type); diff --git a/Content.Server/Popups/PopupSystem.cs b/Content.Server/Popups/PopupSystem.cs index 9338d81b92..aec4dbbfb3 100644 --- a/Content.Server/Popups/PopupSystem.cs +++ b/Content.Server/Popups/PopupSystem.cs @@ -35,6 +35,16 @@ namespace Content.Server.Popups RaiseNetworkEvent(new PopupCursorEvent(message, type), actor.PlayerSession); } + public override void PopupPredictedCursor(string? message, ICommonSession recipient, PopupType type = PopupType.Small) + { + // Do nothing, since the client already predicted the popup. + } + + public override void PopupPredictedCursor(string? message, EntityUid recipient, PopupType type = PopupType.Small) + { + // Do nothing, since the client already predicted the popup. + } + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, Filter filter, bool replayRecord, PopupType type = PopupType.Small) { if (message == null) diff --git a/Content.Shared/Popups/SharedPopupSystem.cs b/Content.Shared/Popups/SharedPopupSystem.cs index 66f901c59f..b57ed6659e 100644 --- a/Content.Shared/Popups/SharedPopupSystem.cs +++ b/Content.Shared/Popups/SharedPopupSystem.cs @@ -32,6 +32,18 @@ namespace Content.Shared.Popups /// <param name="type">Used to customize how this popup should appear visually.</param> public abstract void PopupCursor(string? message, EntityUid recipient, PopupType type = PopupType.Small); + /// <summary> + /// Variant of <see cref="PopupCursor(string?, ICommonSession, PopupType)"/> for use with prediction. + /// The local client will show the popup to the recipient. Does nothing on the server. + /// </summary> + public abstract void PopupPredictedCursor(string? message, ICommonSession recipient, PopupType type = PopupType.Small); + + /// <summary> + /// Variant of <see cref="PopupCursor(string?, EntityUid, PopupType)"/> for use with prediction. + /// The local client will show the popup to the recipient. Does nothing on the server. + /// </summary> + public abstract void PopupPredictedCursor(string? message, EntityUid recipient, PopupType type = PopupType.Small); + /// <summary> /// Shows a popup at a world location to every entity in PVS range. /// </summary> @@ -60,7 +72,7 @@ namespace Content.Shared.Popups /// <summary> /// Variant of <see cref="PopupCoordinates(string, EntityCoordinates, PopupType)"/> for use with prediction. The local client will - /// the popup to the recipient, and the server will show it to every other player in PVS range. If recipient is null, the local + /// the popup to the recipient, and the server will show it to every other player in PVS range. If recipient is null, the local // client will do nothing and the server will show the message to every player in PVS range. /// </summary> public abstract void PopupPredictedCoordinates(string? message, EntityCoordinates coordinates, EntityUid? recipient, PopupType type = PopupType.Small); diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs index 20c8f1195a..00355dedff 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs @@ -17,7 +17,7 @@ public abstract partial class SharedVendingMachineSystem { if (!TryComp<WiresPanelComponent>(target, out var panel) || !panel.Open) { - Popup.PopupCursor(Loc.GetString("vending-machine-restock-needs-panel-open", + Popup.PopupPredictedCursor(Loc.GetString("vending-machine-restock-needs-panel-open", ("this", uid), ("user", user), ("target", target)), @@ -37,7 +37,7 @@ public abstract partial class SharedVendingMachineSystem { if (!component.CanRestock.Contains(machineComponent.PackPrototypeId)) { - Popup.PopupCursor(Loc.GetString("vending-machine-restock-invalid-inventory", ("this", uid), ("user", user), + Popup.PopupPredictedCursor(Loc.GetString("vending-machine-restock-invalid-inventory", ("this", uid), ("user", user), ("target", target)), user); return false; From 7d81d63aa01472ce59af33100cb3628d7bc3acbb Mon Sep 17 00:00:00 2001 From: Fildrance <fildrance@gmail.com> Date: Fri, 18 Apr 2025 07:50:15 +0300 Subject: [PATCH 273/622] fix: return deconstruct to the top level option of radial menu (#36486) feat: now RCD can have recepies that are placed on the top level of radial menu - 'Main' category name is reserved for this Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru> --- .../RCD/RCDMenuBoundUserInterface.cs | 25 +++++++++++++++++-- Resources/Prototypes/RCD/rcd.yml | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Content.Client/RCD/RCDMenuBoundUserInterface.cs b/Content.Client/RCD/RCDMenuBoundUserInterface.cs index d599c324e1..c001b7ec70 100644 --- a/Content.Client/RCD/RCDMenuBoundUserInterface.cs +++ b/Content.Client/RCD/RCDMenuBoundUserInterface.cs @@ -4,6 +4,7 @@ using Content.Shared.RCD; using Content.Shared.RCD.Components; using JetBrains.Annotations; using Robust.Client.UserInterface; +using Robust.Shared.Collections; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -13,6 +14,8 @@ namespace Content.Client.RCD; [UsedImplicitly] public sealed class RCDMenuBoundUserInterface : BoundUserInterface { + private const string TopLevelActionCategory = "Main"; + private static readonly Dictionary<string, (string Tooltip, SpriteSpecifier Sprite)> PrototypesGroupingInfo = new Dictionary<string, (string Tooltip, SpriteSpecifier Sprite)> { @@ -48,12 +51,24 @@ public sealed class RCDMenuBoundUserInterface : BoundUserInterface _menu.OpenOverMouseScreenPosition(); } - private IEnumerable<RadialMenuNestedLayerOption> ConvertToButtons(HashSet<ProtoId<RCDPrototype>> prototypes) + private IEnumerable<RadialMenuOption> ConvertToButtons(HashSet<ProtoId<RCDPrototype>> prototypes) { Dictionary<string, List<RadialMenuActionOption>> buttonsByCategory = new(); + ValueList<RadialMenuActionOption> topLevelActions = new(); foreach (var protoId in prototypes) { var prototype = _prototypeManager.Index(protoId); + if (prototype.Category == TopLevelActionCategory) + { + var topLevelActionOption = new RadialMenuActionOption<RCDPrototype>(HandleMenuOptionClick, prototype) + { + Sprite = prototype.Sprite, + ToolTip = GetTooltip(prototype) + }; + topLevelActions.Add(topLevelActionOption); + continue; + } + if (!PrototypesGroupingInfo.TryGetValue(prototype.Category, out var groupInfo)) continue; @@ -71,7 +86,7 @@ public sealed class RCDMenuBoundUserInterface : BoundUserInterface list.Add(actionOption); } - var models = new RadialMenuNestedLayerOption[buttonsByCategory.Count]; + var models = new RadialMenuOption[buttonsByCategory.Count + topLevelActions.Count]; var i = 0; foreach (var (key, list) in buttonsByCategory) { @@ -84,6 +99,12 @@ public sealed class RCDMenuBoundUserInterface : BoundUserInterface i++; } + foreach (var action in topLevelActions) + { + models[i] = action; + i++; + } + return models; } diff --git a/Resources/Prototypes/RCD/rcd.yml b/Resources/Prototypes/RCD/rcd.yml index f476f06dc4..5fb5356f91 100644 --- a/Resources/Prototypes/RCD/rcd.yml +++ b/Resources/Prototypes/RCD/rcd.yml @@ -6,7 +6,7 @@ - type: rcd id: Deconstruct name: rcd-component-deconstruct - category: WallsAndFlooring + category: Main sprite: /Textures/Interface/Radial/RCD/deconstruct.png mode: Deconstruct prototype: EffectRCDDeconstructPreview From f7d925d9724c4c6fe5f396f9dc3cca31068e64af Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 04:51:22 +0000 Subject: [PATCH 274/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d416d6e756..774f425b24 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ArtisticRoomba, AugustSun - changes: - - message: New Advanced SMES, an SMES with a 16 MJ capacity. It can be researched - at Industrial T2, Advanced Powercells. - type: Add - id: 7726 - time: '2024-12-17T23:58:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33757 - author: Allen, lzk228 changes: - message: Made Gun Safes a craftable object (10 steel, 5 lv cable, 10 plasteel) @@ -3913,3 +3905,10 @@ id: 8225 time: '2025-04-18T03:52:05.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35594 +- author: Fildrance + changes: + - message: returned deconstruct to the top level option on RCD + type: Fix + id: 8226 + time: '2025-04-18T04:50:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36486 From ab1bcfe3918751cad0d49ec4c6a150f8e17b78b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ciar=C3=A1n=20Walsh?= <github@ciaranwal.sh> Date: Fri, 18 Apr 2025 08:42:59 +0100 Subject: [PATCH 275/622] Implement client-side theming for OutputPanel scroll-down button. (#35913) * Implement client-side theming for OutputPanel scroll-down button. * Use OutputPanel constant for button class name * Remove unused string * Enable scroll button for ChatBox * Update RobustToolbox * Update to merged RT version --- Content.Client/Stylesheets/StyleNano.cs | 16 ++++ .../Systems/Chat/Widgets/ChatBox.xaml | 2 +- .../Nano/rounded_button_half_bordered.svg | 75 ++++++++++++++++++ ...rounded_button_half_bordered.svg.96dpi.png | Bin 0 -> 292 bytes 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Interface/Nano/rounded_button_half_bordered.svg create mode 100644 Resources/Textures/Interface/Nano/rounded_button_half_bordered.svg.96dpi.png diff --git a/Content.Client/Stylesheets/StyleNano.cs b/Content.Client/Stylesheets/StyleNano.cs index 55e7ec0949..40d256813e 100644 --- a/Content.Client/Stylesheets/StyleNano.cs +++ b/Content.Client/Stylesheets/StyleNano.cs @@ -344,6 +344,16 @@ namespace Content.Client.Stylesheets chatFilterButton.SetPatchMargin(StyleBox.Margin.All, 5); chatFilterButton.SetPadding(StyleBox.Margin.All, 2); + var outputPanelScrollDownButtonTex = resCache.GetTexture("/Textures/Interface/Nano/rounded_button_half_bordered.svg.96dpi.png"); + var outputPanelScrollDownButton = new StyleBoxTexture + { + Texture = outputPanelScrollDownButtonTex, + }; + outputPanelScrollDownButton.SetPatchMargin(StyleBox.Margin.All, 5); + outputPanelScrollDownButton.SetPadding(StyleBox.Margin.All, 2); + outputPanelScrollDownButton.SetPadding(StyleBox.Margin.Top, 0); + outputPanelScrollDownButton.SetPadding(StyleBox.Margin.Bottom, 0); + var smallButtonTex = resCache.GetTexture("/Textures/Interface/Nano/button_small.svg.96dpi.png"); var smallButtonBase = new StyleBoxTexture { @@ -1307,6 +1317,7 @@ namespace Content.Client.Stylesheets { new StyleProperty(Button.StylePropertyStyleBox, chatChannelButton), }), + // chat filter button new StyleRule(new SelectorElement(typeof(ContainerButton), new[] {StyleClassChatFilterOptionButton}, null, null), new[] { @@ -1329,6 +1340,11 @@ namespace Content.Client.Stylesheets new StyleProperty(Control.StylePropertyModulateSelf, ButtonColorDisabled), }), + // output panel scroll button + Element<Button>() + .Class(OutputPanel.StyleClassOutputPanelScrollDownButton) + .Prop(Button.StylePropertyStyleBox, outputPanelScrollDownButton), + // OptionButton new StyleRule(new SelectorElement(typeof(OptionButton), null, null, null), new[] { diff --git a/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml b/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml index 36cdce8598..31cf35bfbd 100644 --- a/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml +++ b/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml @@ -10,7 +10,7 @@ <PanelContainer Name="ChatWindowPanel" Access="Public" HorizontalExpand="True" VerticalExpand="True" StyleClasses="StyleNano.StyleClassChatPanel"> <BoxContainer Orientation="Vertical" SeparationOverride="4" HorizontalExpand="True" VerticalExpand="True"> - <OutputPanel Name="Contents" HorizontalExpand="True" VerticalExpand="True" Margin="8 8 8 4" /> + <OutputPanel Name="Contents" HorizontalExpand="True" VerticalExpand="True" Margin="8 8 8 4" ShowScrollDownButton="True" /> <controls:ChatInputBox HorizontalExpand="True" Name="ChatInput" Access="Public" Margin="2"/> </BoxContainer> </PanelContainer> diff --git a/Resources/Textures/Interface/Nano/rounded_button_half_bordered.svg b/Resources/Textures/Interface/Nano/rounded_button_half_bordered.svg new file mode 100644 index 0000000000..a583f3db89 --- /dev/null +++ b/Resources/Textures/Interface/Nano/rounded_button_half_bordered.svg @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="32" + height="32" + viewBox="0 0 32 32" + fill="none" + version="1.1" + id="svg4" + sodipodi:docname="rounded_button_half_bordered.svg" + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" + inkscape:export-filename="C:\ss14\space-station-14\Resources\Textures\Interface\Nano\rounded_button_half_bordered.svg.96dpi.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + <metadata + id="metadata10"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs8"> + <clipPath id="round-corner"> + <rect x="0" y="0" width="32" height="32" rx="5" ry="5" /> + </clipPath> + </defs> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="2560" + inkscape:window-height="1377" + id="namedview6" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="11.136932" + inkscape:cx="15.825633" + inkscape:cy="16.930202" + inkscape:window-x="1912" + inkscape:window-y="-8" + inkscape:window-maximized="1" + inkscape:current-layer="svg4" + inkscape:document-rotation="0" + inkscape:pagecheckerboard="true" /> + <rect + x="0" + y="0" + width="32" + height="50" + rx="5" + fill="#ffffff" + id="rect2" + style="stroke:#cfcfcf;stroke-opacity:1;fill:#ffffff;fill-opacity:1" + /> +</svg> \ No newline at end of file diff --git a/Resources/Textures/Interface/Nano/rounded_button_half_bordered.svg.96dpi.png b/Resources/Textures/Interface/Nano/rounded_button_half_bordered.svg.96dpi.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8b1d08abc2dd20444562d11e19c92fa3516b16 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4j!ywFfJby(BP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprVbQE{-7)t#2=F<UM2{(3<!> z$4_P7j%6ioCs;Hi8wF=JFiI#)vvJgVp)08(eAGliF(YG=$#?w^`zEhDVafeGX89B= zrKF`>^%xVB(=ui)bMN^$FR1IWh1{)ew&Jz-%Y#k@Up5Jiy<Yt0pNNydVS_tG=YAim zuHSm?-88BHPB9FE;=BJCC-*qGFezz?$Je{ML{A7h_o?9jk||CR*?(l2B@QsK88k5R gBrt%PYxpXdraUxo?vu2S0y>_-)78&qol`;+0JVc@p8x;= literal 0 HcmV?d00001 From 812e9c24b2f822f0a55d21b8d98a9e5215450a53 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 18 Apr 2025 17:43:12 +1000 Subject: [PATCH 276/622] Revert this cl (#36675) I forgor the procedure but if doesn't work i'm gonna be mad. --- Resources/Changelog/Changelog.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 774f425b24..b802b8a601 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -3868,14 +3868,6 @@ id: 8220 time: '2025-04-18T01:59:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36209 -- author: metalgearsloth - changes: - - message: Toggleable items such as stunbatons and eswords can no longer be toggled - in storage. - type: Tweak - id: 8221 - time: '2025-04-18T02:11:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/36533 - author: lzk228 changes: - message: Borgs, clowns and mimes now can choose a custom name in loadouts. From 8d1cd9a3aa2ccb44ed929d61be0297c97afc08cf Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 07:44:06 +0000 Subject: [PATCH 277/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b802b8a601..e62fc3e462 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -3904,3 +3904,10 @@ id: 8226 time: '2025-04-18T04:50:15.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36486 +- author: ciaran + changes: + - message: Added a button to scroll back to the bottom of the chat box + type: Add + id: 8227 + time: '2025-04-18T07:43:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35913 From 42cb3ccb5b7c6c71baf3a7a3abbdbb8d28910621 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Fri, 18 Apr 2025 03:44:29 -0400 Subject: [PATCH 278/622] StationEvent Toolshed Command fixes. (#32200) * toolshed makes me want to take a long walk off a short pier. * fuck it everything is in seconds. * catch rounding error * reviews * lsprobtheoretical to mins * Git please. * Git Please. * GIT PLEASE. * unchange file * take2 * empty line? * new new lines? * idk 1000 commits I guess * spacius maximus --- .../BasicStationEventSchedulerSystem.cs | 41 ++++++++++++------- .../StationEvents/EventManagerSystem.cs | 13 ++++-- .../en-US/commands/toolshed-commands.ftl | 10 ++--- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs b/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs index a3c2440fe9..06289618f7 100644 --- a/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs +++ b/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs @@ -10,6 +10,7 @@ using JetBrains.Annotations; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.TypeParsers; using Robust.Shared.Utility; namespace Content.Server.StationEvents @@ -94,7 +95,7 @@ namespace Content.Server.StationEvents /// to even exist) so I think it's fine. /// </remarks> [CommandImplementation("simulate")] - public IEnumerable<(string, float)> Simulate(EntityPrototype eventScheduler, int rounds, int playerCount, float roundEndMean, float roundEndStdDev) + public IEnumerable<(string, float)> Simulate([CommandArgument] Prototype<EntityPrototype> eventSchedulerProto, [CommandArgument] int rounds, [CommandArgument] int playerCount, [CommandArgument] float roundEndMean, [CommandArgument] float roundEndStdDev) { _stationEvent ??= GetSys<EventManagerSystem>(); _entityTable ??= GetSys<EntityTableSystem>(); @@ -108,6 +109,8 @@ namespace Content.Server.StationEvents occurrences.Add(ev.Key.ID, 0); } + eventSchedulerProto.Deconstruct(out EntityPrototype eventScheduler); + if (!eventScheduler.TryGetComponent<BasicStationEventSchedulerComponent>(out var basicScheduler, _compFac)) { return occurrences.Select(p => (p.Key, (float)p.Value)).OrderByDescending(p => p.Item2); @@ -118,7 +121,7 @@ namespace Content.Server.StationEvents for (var i = 0; i < rounds; i++) { var curTime = TimeSpan.Zero; - var randomEndTime = _random.NextGaussian(roundEndMean, roundEndStdDev) * 60; // *60 = minutes to seconds + var randomEndTime = _random.NextGaussian(roundEndMean, roundEndStdDev); // Its in minutes, should probably be a better time format once we get that in toolshed like [hh:mm:ss] if (randomEndTime <= 0) continue; @@ -127,14 +130,13 @@ namespace Content.Server.StationEvents // sim an event curTime += TimeSpan.FromSeconds(compMinMax.Next(_random)); - if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, out var selectedEvents)) + var available = _stationEvent.AvailableEvents(false, playerCount, curTime); + if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, available, out var selectedEvents)) { continue; // doesnt break because maybe the time is preventing events being available. } - var available = _stationEvent.AvailableEvents(false, playerCount, curTime); - var plausibleEvents = new Dictionary<EntityPrototype, StationEventComponent>(available.Intersect(selectedEvents)); // C# makes me sad - var ev = _stationEvent.FindEvent(plausibleEvents); + var ev = _stationEvent.FindEvent(selectedEvents); if (ev == null) continue; @@ -146,15 +148,18 @@ namespace Content.Server.StationEvents } [CommandImplementation("lsprob")] - public IEnumerable<(string, float)> LsProb(EntityPrototype eventScheduler) + public IEnumerable<(string, float)> LsProb([CommandArgument] Prototype<EntityPrototype> eventSchedulerProto) { _compFac ??= IoCManager.Resolve<IComponentFactory>(); _stationEvent ??= GetSys<EventManagerSystem>(); + eventSchedulerProto.Deconstruct(out EntityPrototype eventScheduler); + if (!eventScheduler.TryGetComponent<BasicStationEventSchedulerComponent>(out var basicScheduler, _compFac)) yield break; - if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, out var events)) + var available = _stationEvent.AvailableEvents(); + if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, available, out var events)) yield break; var totalWeight = events.Sum(x => x.Value.Weight); // Well this shit definitely isnt correct now, and I see no way to make it correct. @@ -165,19 +170,24 @@ namespace Content.Server.StationEvents } } - [CommandImplementation("lsprobtime")] - public IEnumerable<(string, float)> LsProbTime(EntityPrototype eventScheduler, float time) + [CommandImplementation("lsprobtheoretical")] + public IEnumerable<(string, float)> LsProbTime([CommandArgument] Prototype<EntityPrototype> eventSchedulerProto, [CommandArgument] int playerCount, [CommandArgument] float time) { _compFac ??= IoCManager.Resolve<IComponentFactory>(); _stationEvent ??= GetSys<EventManagerSystem>(); + eventSchedulerProto.Deconstruct(out EntityPrototype eventScheduler); + if (!eventScheduler.TryGetComponent<BasicStationEventSchedulerComponent>(out var basicScheduler, _compFac)) yield break; - if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, out var untimedEvents)) + var timemins = time * 60; + var theoryTime = TimeSpan.Zero + TimeSpan.FromSeconds(timemins); + var available = _stationEvent.AvailableEvents(false, playerCount, theoryTime); + if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, available, out var untimedEvents)) yield break; - var events = untimedEvents.Where(pair => pair.Value.EarliestStart <= time).ToList(); + var events = untimedEvents.Where(pair => pair.Value.EarliestStart <= timemins).ToList(); var totalWeight = events.Sum(x => x.Value.Weight); // same subsetting issue as lsprob. @@ -188,15 +198,18 @@ namespace Content.Server.StationEvents } [CommandImplementation("prob")] - public float Prob(EntityPrototype eventScheduler, string eventId) + public float Prob([CommandArgument] Prototype<EntityPrototype> eventSchedulerProto, [CommandArgument] string eventId) { _compFac ??= IoCManager.Resolve<IComponentFactory>(); _stationEvent ??= GetSys<EventManagerSystem>(); + eventSchedulerProto.Deconstruct(out EntityPrototype eventScheduler); + if (!eventScheduler.TryGetComponent<BasicStationEventSchedulerComponent>(out var basicScheduler, _compFac)) return 0f; - if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, out var events)) + var available = _stationEvent.AvailableEvents(); + if (!_stationEvent.TryBuildLimitedEvents(basicScheduler.ScheduledGameRules, available, out var events)) return 0f; var totalWeight = events.Sum(x => x.Value.Weight); // same subsetting issue as lsprob. diff --git a/Content.Server/StationEvents/EventManagerSystem.cs b/Content.Server/StationEvents/EventManagerSystem.cs index a66499d0aa..6585fe3248 100644 --- a/Content.Server/StationEvents/EventManagerSystem.cs +++ b/Content.Server/StationEvents/EventManagerSystem.cs @@ -55,7 +55,10 @@ public sealed class EventManagerSystem : EntitySystem /// </summary> public void RunRandomEvent(EntityTableSelector limitedEventsTable) { - if (!TryBuildLimitedEvents(limitedEventsTable, out var limitedEvents)) + var availableEvents = AvailableEvents(); // handles the player counts and individual event restrictions. + // Putting this here only makes any sense in the context of the toolshed commands in BasicStationEventScheduler. Kill me. + + if (!TryBuildLimitedEvents(limitedEventsTable, availableEvents, out var limitedEvents)) { Log.Warning("Provided event table could not build dict!"); return; @@ -80,12 +83,14 @@ public sealed class EventManagerSystem : EntitySystem /// <summary> /// Returns true if the provided EntityTableSelector gives at least one prototype with a StationEvent comp. /// </summary> - public bool TryBuildLimitedEvents(EntityTableSelector limitedEventsTable, out Dictionary<EntityPrototype, StationEventComponent> limitedEvents) + public bool TryBuildLimitedEvents( + EntityTableSelector limitedEventsTable, + Dictionary<EntityPrototype, StationEventComponent> availableEvents, + out Dictionary<EntityPrototype, StationEventComponent> limitedEvents + ) { limitedEvents = new Dictionary<EntityPrototype, StationEventComponent>(); - var availableEvents = AvailableEvents(); // handles the player counts and individual event restrictions - if (availableEvents.Count == 0) { Log.Warning("No events were available to run!"); diff --git a/Resources/Locale/en-US/commands/toolshed-commands.ftl b/Resources/Locale/en-US/commands/toolshed-commands.ftl index 51f0745b3d..3a620b049b 100644 --- a/Resources/Locale/en-US/commands/toolshed-commands.ftl +++ b/Resources/Locale/en-US/commands/toolshed-commands.ftl @@ -43,11 +43,11 @@ command-description-stations-largestgrid = command-description-stations-rerollBounties = Clears all the current bounties for the station and gets a new selection. command-description-stationevent-lsprob = - Lists the probability of different station events occuring out of the entire pool. -command-description-stationevent-lsprobtime = - Lists the probability of different station events occuring based on the specified length of a round. + Given a BasicStationEventScheduler prototype, lists the probability of different station events occuring out of the entire pool with current conditions. +command-description-stationevent-lsprobtheoretical = + Given a BasicStationEventScheduler prototype, player count, and round time, lists the probability of different station events occuring based on the specified number of players and round time. command-description-stationevent-prob = - Returns the probability of a single station event occuring out of the entire pool. + Given a BasicStationEventScheduler prototype and an event prototype, returns the probability of a single station event occuring out of the entire pool with current conditions. command-description-admins-active = Returns a list of active admins. command-description-admins-all = @@ -83,7 +83,7 @@ command-description-mind-control = command-description-addaccesslog = Adds an access log to this entity. Do note that this bypasses the log's default limit and pause check. command-description-stationevent-simulate = - Simulates N number of rounds in which events will occur and prints the occurrences of every event after. + Given a BasicStationEventScheduler prototype, N Rounds, N Players, mean round end, and stddev of round end, Simulates N number of rounds in which events will occur and prints the occurrences of every event after. command-description-xenoartifact-list = List all EntityUids of spawned artifacts. command-description-xenoartifact-printMatrix = From 90359e407c3a0766c7b16d6e3f32d4e8e0702e57 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 07:45:35 +0000 Subject: [PATCH 279/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 73deae9159..c6fda76519 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1065,5 +1065,13 @@ Entries: id: 129 time: '2025-04-16T22:59:36.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36640 +- author: IProduceWidgets + changes: + - message: stationevent toolshed commands should now work again to provide event + statistics. + type: Fix + id: 130 + time: '2025-04-18T07:44:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32200 Name: Admin Order: 1 From cca5a88be49eff694b4c673af79f5243f3a79471 Mon Sep 17 00:00:00 2001 From: osjarw <62134478+osjarw@users.noreply.github.com> Date: Fri, 18 Apr 2025 11:16:26 +0300 Subject: [PATCH 280/622] Make HTN constantly replanning optional (#33023) Make constant replanning optional And apply it to our most expensive NPCs --- Content.Server/NPC/HTN/HTNComponent.cs | 3 +++ Content.Server/NPC/HTN/HTNSystem.cs | 4 ++-- Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 2 ++ Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml | 1 + Resources/Prototypes/Entities/Mobs/NPCs/space.yml | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Content.Server/NPC/HTN/HTNComponent.cs b/Content.Server/NPC/HTN/HTNComponent.cs index 788a347638..43b8a70785 100644 --- a/Content.Server/NPC/HTN/HTNComponent.cs +++ b/Content.Server/NPC/HTN/HTNComponent.cs @@ -37,6 +37,9 @@ public sealed partial class HTNComponent : NPCComponent [ViewVariables(VVAccess.ReadWrite)] public float PlanAccumulator = 0f; + [DataField] + public bool ConstantlyReplan = true; + [ViewVariables] public HTNPlanJob? PlanningJob = null; diff --git a/Content.Server/NPC/HTN/HTNSystem.cs b/Content.Server/NPC/HTN/HTNSystem.cs index ce4b248a0d..89b4ae7786 100644 --- a/Content.Server/NPC/HTN/HTNSystem.cs +++ b/Content.Server/NPC/HTN/HTNSystem.cs @@ -328,7 +328,7 @@ public sealed class HTNSystem : EntitySystem component.PlanAccumulator -= frameTime; // We'll still try re-planning occasionally even when we're updating in case new data comes in. - if (component.PlanAccumulator <= 0f) + if ((component.ConstantlyReplan || component.Plan is null) && component.PlanAccumulator <= 0f) { RequestPlan(component); } @@ -462,7 +462,7 @@ public sealed class HTNSystem : EntitySystem if (component.PlanningJob != null) return; - component.PlanAccumulator += component.PlanCooldown; + component.PlanAccumulator = component.PlanCooldown; var cancelToken = new CancellationTokenSource(); var branchTraversal = component.Plan?.BranchTraversalRecord; diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index a7aca49505..22f818d56b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -332,6 +332,7 @@ - type: Item size: Tiny - type: HTN + constantlyReplan: false rootTask: task: MouseCompound - type: Physics @@ -1681,6 +1682,7 @@ factions: - Mouse - type: HTN + constantlyReplan: false rootTask: task: MouseCompound - type: Physics diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml index dcc8c4fbb8..c7279801f0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml @@ -70,6 +70,7 @@ factions: - SimpleHostile - type: HTN + constantlyReplan: false rootTask: task: GoliathCompound blackboard: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 4ae6813963..9ed92709ea 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -405,6 +405,7 @@ factions: - Mouse - type: HTN + constantlyReplan: false rootTask: task: MouseCompound - type: Physics From 644cce2b9f26534fdedb95524de0b02aa22fd688 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 18 Apr 2025 18:45:56 +1000 Subject: [PATCH 281/622] Revert "Fix auto-updates of RobustToolbox on Windows" (#36671) Revert "Fix auto-updates of RobustToolbox on Windows (#33323)" This reverts commit b1c1cb96b5c91c0134660d735ea554fef536dc70. --- BuildChecker/BuildChecker.csproj | 1 + BuildChecker/git_helper.py | 2 +- BuildChecker/hooks/post-checkout | 8 +++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/BuildChecker/BuildChecker.csproj b/BuildChecker/BuildChecker.csproj index c0a0c9e1f3..4bd7fcf78c 100644 --- a/BuildChecker/BuildChecker.csproj +++ b/BuildChecker/BuildChecker.csproj @@ -15,6 +15,7 @@ https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <Python>python3</Python> + <Python Condition="'$(OS)'=='Windows_NT' Or '$(OS)'=='Windows'">py -3</Python> <ProjectGuid>{C899FCA4-7037-4E49-ABC2-44DE72487110}</ProjectGuid> <TargetFramework>net4.7.2</TargetFramework> <RestorePackages>false</RestorePackages> diff --git a/BuildChecker/git_helper.py b/BuildChecker/git_helper.py index 83c41c3403..becd4506e8 100644 --- a/BuildChecker/git_helper.py +++ b/BuildChecker/git_helper.py @@ -10,7 +10,7 @@ from typing import List SOLUTION_PATH = Path("..") / "SpaceStation14.sln" # If this doesn't match the saved version we overwrite them all. -CURRENT_HOOKS_VERSION = "3" +CURRENT_HOOKS_VERSION = "2" QUIET = len(sys.argv) == 2 and sys.argv[1] == "--quiet" diff --git a/BuildChecker/hooks/post-checkout b/BuildChecker/hooks/post-checkout index f34ffd293d..c5662445c2 100755 --- a/BuildChecker/hooks/post-checkout +++ b/BuildChecker/hooks/post-checkout @@ -4,4 +4,10 @@ gitroot=`git rev-parse --show-toplevel` cd "$gitroot/BuildChecker" -python3 git_helper.py --quiet +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 From e4f3d1909415cd867e1088d924f221a65cfe7378 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 18 Apr 2025 19:28:22 +1000 Subject: [PATCH 282/622] Make MappingDataNode use string keys (#36111) * MappingDataNode string keys * a * poke --- .../TileAtmosCollectionSerializer.cs | 6 +++--- Content.Server/Maps/MapMigrationSystem.cs | 8 +++---- Content.Server/NPC/NPCBlackboardSerializer.cs | 8 +++---- .../Prototypes/BodyPrototypeSerializer.cs | 21 ++++--------------- .../Containers/ContainerFillComponent.cs | 4 +--- .../DecalGridChunkCollectionTypeSerializer.cs | 6 +++--- 6 files changed, 19 insertions(+), 34 deletions(-) diff --git a/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs b/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs index 5b30d65e48..900c3cb60c 100644 --- a/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs +++ b/Content.Server/Atmos/Serialization/TileAtmosCollectionSerializer.cs @@ -25,7 +25,7 @@ public sealed partial class TileAtmosCollectionSerializer : ITypeSerializer<Dict SerializationHookContext hookCtx, ISerializationContext? context = null, ISerializationManager.InstantiationDelegate<Dictionary<Vector2i, TileAtmosphere>>? instanceProvider = null) { - node.TryGetValue(new ValueDataNode("version"), out var versionNode); + node.TryGetValue("version", out var versionNode); var version = ((ValueDataNode?) versionNode)?.AsInt() ?? 1; Dictionary<Vector2i, TileAtmosphere> tiles = new(); @@ -59,7 +59,7 @@ public sealed partial class TileAtmosCollectionSerializer : ITypeSerializer<Dict var dataNode = (MappingDataNode) node["data"]; var chunkSize = serializationManager.Read<int>(dataNode["chunkSize"], hookCtx, context); - dataNode.TryGetValue(new ValueDataNode("uniqueMixes"), out var mixNode); + dataNode.TryGet("uniqueMixes", out var mixNode); var unique = mixNode == null ? null : serializationManager.Read<List<GasMixture>?>(mixNode, hookCtx, context); if (unique != null) @@ -67,7 +67,7 @@ public sealed partial class TileAtmosCollectionSerializer : ITypeSerializer<Dict var tileNode = (MappingDataNode) dataNode["tiles"]; foreach (var (chunkNode, valueNode) in tileNode) { - var chunkOrigin = serializationManager.Read<Vector2i>(chunkNode, hookCtx, context); + var chunkOrigin = serializationManager.Read<Vector2i>(tileNode.GetKeyNode(chunkNode), hookCtx, context); var chunk = serializationManager.Read<TileAtmosChunk>(valueNode, hookCtx, context); foreach (var (mix, data) in chunk.Data) diff --git a/Content.Server/Maps/MapMigrationSystem.cs b/Content.Server/Maps/MapMigrationSystem.cs index 3341034a35..e04cfa1793 100644 --- a/Content.Server/Maps/MapMigrationSystem.cs +++ b/Content.Server/Maps/MapMigrationSystem.cs @@ -33,7 +33,7 @@ public sealed class MapMigrationSystem : EntitySystem return; // Verify that all of the entries map to valid entity prototypes. - foreach (var node in mappings.Values) + foreach (var node in mappings.Children.Values) { var newId = ((ValueDataNode) node).Value; if (!string.IsNullOrEmpty(newId) && newId != "null") @@ -66,13 +66,13 @@ public sealed class MapMigrationSystem : EntitySystem foreach (var (key, value) in mappings) { - if (key is not ValueDataNode keyNode || value is not ValueDataNode valueNode) + if (value is not ValueDataNode valueNode) continue; if (string.IsNullOrWhiteSpace(valueNode.Value) || valueNode.Value == "null") - ev.DeletedPrototypes.Add(keyNode.Value); + ev.DeletedPrototypes.Add(key); else - ev.RenamedPrototypes.Add(keyNode.Value, valueNode.Value); + ev.RenamedPrototypes.Add(key, valueNode.Value); } } } diff --git a/Content.Server/NPC/NPCBlackboardSerializer.cs b/Content.Server/NPC/NPCBlackboardSerializer.cs index 56db17a0a7..a7c36dc6a5 100644 --- a/Content.Server/NPC/NPCBlackboardSerializer.cs +++ b/Content.Server/NPC/NPCBlackboardSerializer.cs @@ -23,11 +23,11 @@ public sealed class NPCBlackboardSerializer : ITypeReader<NPCBlackboard, Mapping foreach (var data in node) { - var key = data.Key.ToYamlNode().AsString(); + var key = data.Key; if (data.Value.Tag == null) { - validated.Add(new ErrorNode(data.Key, $"Unable to validate {key}'s type")); + validated.Add(new ErrorNode(node.GetKeyNode(key), $"Unable to validate {key}'s type")); continue; } @@ -35,7 +35,7 @@ public sealed class NPCBlackboardSerializer : ITypeReader<NPCBlackboard, Mapping if (!reflection.TryLooseGetType(typeString, out var type)) { - validated.Add(new ErrorNode(data.Key, $"Unable to find type for {typeString}")); + validated.Add(new ErrorNode(node.GetKeyNode(key), $"Unable to find type for {typeString}")); continue; } @@ -60,7 +60,7 @@ public sealed class NPCBlackboardSerializer : ITypeReader<NPCBlackboard, Mapping foreach (var data in node) { - var key = data.Key.ToYamlNode().AsString(); + var key = data.Key; if (data.Value.Tag == null) throw new NullReferenceException($"Found null tag for {key}"); diff --git a/Content.Shared/Body/Prototypes/BodyPrototypeSerializer.cs b/Content.Shared/Body/Prototypes/BodyPrototypeSerializer.cs index ae09976704..338e6c8ab8 100644 --- a/Content.Shared/Body/Prototypes/BodyPrototypeSerializer.cs +++ b/Content.Shared/Body/Prototypes/BodyPrototypeSerializer.cs @@ -40,12 +40,6 @@ public sealed class BodyPrototypeSerializer : ITypeReader<BodyPrototype, Mapping { foreach (var (key, value) in organsNode) { - if (key is not ValueDataNode) - { - nodes.Add(new ErrorNode(key, $"Key is not a value data node")); - continue; - } - if (value is not ValueDataNode organ) { nodes.Add(new ErrorNode(value, $"Value is not a value data node")); @@ -91,12 +85,6 @@ public sealed class BodyPrototypeSerializer : ITypeReader<BodyPrototype, Mapping foreach (var (key, value) in slots) { - if (key is not ValueDataNode) - { - nodes.Add(new ErrorNode(key, $"Key is not a value data node")); - continue; - } - if (value is not MappingDataNode slot) { nodes.Add(new ErrorNode(value, $"Slot is not a mapping data node")); @@ -128,10 +116,9 @@ public sealed class BodyPrototypeSerializer : ITypeReader<BodyPrototype, Mapping var slotNodes = node.Get<MappingDataNode>("slots"); var allConnections = new Dictionary<string, (string? Part, HashSet<string>? Connections, Dictionary<string, string>? Organs)>(); - foreach (var (keyNode, valueNode) in slotNodes) + foreach (var (slotId, valueNode) in slotNodes) { - var slotId = ((ValueDataNode) keyNode).Value; - var slot = ((MappingDataNode) valueNode); + var slot = (MappingDataNode) valueNode; string? part = null; if (slot.TryGet<ValueDataNode>("part", out var value)) @@ -155,9 +142,9 @@ public sealed class BodyPrototypeSerializer : ITypeReader<BodyPrototype, Mapping { organs = new Dictionary<string, string>(); - foreach (var (organKeyNode, organValueNode) in slotOrgansNode) + foreach (var (organKey, organValueNode) in slotOrgansNode) { - organs.Add(((ValueDataNode) organKeyNode).Value, ((ValueDataNode) organValueNode).Value); + organs.Add(organKey, ((ValueDataNode) organValueNode).Value); } } diff --git a/Content.Shared/Containers/ContainerFillComponent.cs b/Content.Shared/Containers/ContainerFillComponent.cs index 7ce5fa8850..aa8c98fd1f 100644 --- a/Content.Shared/Containers/ContainerFillComponent.cs +++ b/Content.Shared/Containers/ContainerFillComponent.cs @@ -49,13 +49,11 @@ public sealed class ContainerFillSerializer : ITypeValidator<Dictionary<string, foreach (var (key, val) in node.Children) { - var keyVal = serializationManager.ValidateNode<string>(key, context); - var listVal = (val is SequenceDataNode seq) ? ListSerializer.Validate(serializationManager, seq, dependencies, context) : new ErrorNode(val, "ContainerFillComponent prototypes must be a sequence/list"); - mapping.Add(keyVal, listVal); + mapping.Add(new ValidatedValueNode(node.GetKeyNode(key)), listVal); } return new ValidatedMappingNode(mapping); diff --git a/Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs b/Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs index ae4c89c970..f2f9e89603 100644 --- a/Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs +++ b/Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs @@ -29,7 +29,7 @@ namespace Content.Shared.Decals IDependencyCollection dependencies, SerializationHookContext hookCtx, ISerializationContext? context = null, ISerializationManager.InstantiationDelegate<DecalGridChunkCollection>? _ = default) { - node.TryGetValue(new ValueDataNode("version"), out var versionNode); + node.TryGetValue("version", out var versionNode); var version = ((ValueDataNode?) versionNode)?.AsInt() ?? 1; Dictionary<Vector2i, DecalChunk> dictionary; uint nextIndex = 0; @@ -49,7 +49,7 @@ namespace Content.Shared.Decals foreach (var (decalUidNode, decalData) in deckNodes) { - var dUid = serializationManager.Read<uint>(decalUidNode, hookCtx, context); + var dUid = uint.Parse(decalUidNode, CultureInfo.InvariantCulture); var coords = serializationManager.Read<Vector2>(decalData, hookCtx, context); var chunkOrigin = SharedMapSystem.GetChunkIndices(coords, SharedDecalSystem.ChunkSize); @@ -132,7 +132,7 @@ namespace Content.Shared.Decals { var decal = decalLookup[uid]; // Inline coordinates - decks.Add(serializationManager.WriteValue(uid, alwaysWrite, context), serializationManager.WriteValue(decal.Coordinates, alwaysWrite, context)); + decks.Add(uid.ToString(), serializationManager.WriteValue(decal.Coordinates, alwaysWrite, context)); } lookupNode.Add("decals", decks); From 259ac00c29e6cef4aae0df276cbf07393a8a778a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 18 Apr 2025 19:30:50 +1000 Subject: [PATCH 283/622] Update submodule to 254.0.0 (#36681) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 6f28c396cf..b146b1b82c 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 6f28c396cf18682856e3af78bfc57fff34180724 +Subproject commit b146b1b82cda98f9445e7a9e2146e569e6cf4197 From 14cdb0adf7a81e6aeffddeea05a4aef62c3e46f6 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Fri, 18 Apr 2025 08:09:49 -0400 Subject: [PATCH 284/622] Improve messages for pointing at items in inventories (#36252) * Show different messages for pointing at items in someone's inventory * Improve search for inventory (requires engine PR) * Add comments explaining each GetString * Better loc ids * Add comment about using innermost inventory * Swap conditions for named variables * Remove POSS-NOUN uses * Add missing THE --- .../Pointing/EntitySystems/PointingSystem.cs | 68 +++++++++++++++++-- .../pointing/pointing-system.ftl | 5 ++ 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index 23c70d78f4..e12cb24ca7 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Ghost; using Content.Shared.IdentityManagement; using Content.Shared.Input; using Content.Shared.Interaction; +using Content.Shared.Inventory; using Content.Shared.Mind; using Content.Shared.Pointing; using Content.Shared.Popups; @@ -16,6 +17,7 @@ using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Configuration; +using Robust.Shared.Containers; using Robust.Shared.Enums; using Robust.Shared.GameStates; using Robust.Shared.Input.Binding; @@ -36,6 +38,7 @@ namespace Content.Server.Pointing.EntitySystems [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly SharedMindSystem _minds = default!; @@ -208,15 +211,66 @@ namespace Content.Server.Pointing.EntitySystems { var pointedName = Identity.Entity(pointed, EntityManager); - selfMessage = player == pointed - ? Loc.GetString("pointing-system-point-at-self") - : Loc.GetString("pointing-system-point-at-other", ("other", pointedName)); + EntityUid? containingInventory = null; + // Search up through the target's containing containers until we find an inventory + var inventoryQuery = GetEntityQuery<InventoryComponent>(); + foreach (var container in _container.GetContainingContainers(pointed)) + { + if (inventoryQuery.HasComp(container.Owner)) + { + // We want the innermost inventory, since that's the "owner" of the item + containingInventory = container.Owner; + break; + } + } - viewerMessage = player == pointed - ? Loc.GetString("pointing-system-point-at-self-others", ("otherName", playerName), ("other", playerName)) - : Loc.GetString("pointing-system-point-at-other-others", ("otherName", playerName), ("other", pointedName)); + var pointingAtSelf = player == pointed; - viewerPointedAtMessage = Loc.GetString("pointing-system-point-at-you-other", ("otherName", playerName)); + // Are we in a mob's inventory? + if (containingInventory != null) + { + var item = pointed; + var itemName = Identity.Entity(item, EntityManager); + + // Target the pointing at the item's holder + pointed = containingInventory.Value; + pointedName = Identity.Entity(pointed, EntityManager); + var pointingAtOwnItem = player == pointed; + + if (pointingAtOwnItem) + { + // You point at your item + selfMessage = Loc.GetString("pointing-system-point-in-own-inventory-self", ("item", itemName)); + // Urist McPointer points at his item + viewerMessage = Loc.GetString("pointing-system-point-in-own-inventory-others", ("item", itemName), ("pointer", playerName)); + } + else + { + // You point at Urist McHands' item + selfMessage = Loc.GetString("pointing-system-point-in-other-inventory-self", ("item", itemName), ("wearer", pointedName)); + // Urist McPointer points at Urist McWearer's item + viewerMessage = Loc.GetString("pointing-system-point-in-other-inventory-others", ("item", itemName), ("pointer", playerName), ("wearer", pointedName)); + // Urist McPointer points at your item + viewerPointedAtMessage = Loc.GetString("pointing-system-point-in-other-inventory-target", ("item", itemName), ("pointer", playerName)); + } + } + else + { + selfMessage = pointingAtSelf + // You point at yourself + ? Loc.GetString("pointing-system-point-at-self") + // You point at Urist McTarget + : Loc.GetString("pointing-system-point-at-other", ("other", pointedName)); + + viewerMessage = pointingAtSelf + // Urist McPointer points at himself + ? Loc.GetString("pointing-system-point-at-self-others", ("otherName", playerName), ("other", playerName)) + // Urist McPointer points at Urist McTarget + : Loc.GetString("pointing-system-point-at-other-others", ("otherName", playerName), ("other", pointedName)); + + // Urist McPointer points at you + viewerPointedAtMessage = Loc.GetString("pointing-system-point-at-you-other", ("otherName", playerName)); + } var ev = new AfterPointedAtEvent(pointed); RaiseLocalEvent(player, ref ev); diff --git a/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl b/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl index be7b6196b2..edd8440db6 100644 --- a/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl +++ b/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl @@ -7,4 +7,9 @@ pointing-system-point-at-self-others = {CAPITALIZE(THE($otherName))} points at { pointing-system-point-at-other-others = {CAPITALIZE(THE($otherName))} points at {THE($other)}. pointing-system-point-at-you-other = {CAPITALIZE(THE($otherName))} points at you. pointing-system-point-at-tile = You point at the {$tileName}. +pointing-system-point-in-own-inventory-self = You point at your {$item}. +pointing-system-point-in-own-inventory-others = {CAPITALIZE(THE($pointer))} points at {THE($pointer)}'s {$item}. +pointing-system-point-in-other-inventory-self = You point at {THE($wearer)}'s {$item}. +pointing-system-point-in-other-inventory-target = {CAPITALIZE(THE($pointer))} points at your {$item}. +pointing-system-point-in-other-inventory-others = {CAPITALIZE(THE($pointer))} points at {THE($wearer)}'s {$item}. pointing-system-other-point-at-tile = {CAPITALIZE(THE($otherName))} points at the {$tileName}. From c30728a1f1fc4ddaf85e4f22e73ee771e3c5c758 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 12:10:56 +0000 Subject: [PATCH 285/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e62fc3e462..69ab678fa7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Allen, lzk228 - changes: - - message: Made Gun Safes a craftable object (10 steel, 5 lv cable, 10 plasteel) - type: Add - id: 7727 - time: '2024-12-18T11:26:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32694 - author: MilenVolf changes: - message: Clicking on a buckled mob now unbuckles it, rather than hugging/petting @@ -3911,3 +3904,11 @@ id: 8227 time: '2025-04-18T07:43:00.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35913 +- author: Tayrtahn + changes: + - message: The popup when pointing at an item in a character's inventory now mentions + that character. + type: Tweak + id: 8228 + time: '2025-04-18T12:09:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36252 From 80ec149955a3f1681ab4cceb70f8e1fc2688485d Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 18 Apr 2025 14:24:39 +0200 Subject: [PATCH 286/622] setgamepreset command rework (take two) (#30812) * gameticker.gamepreset namespace * setgamepreset now has a finite duration * comments, cleanup --- .../Commands/SetGamePresetCommand.cs | 17 +- .../GameTicking/GameTicker.GamePreset.cs | 331 ++++++++++-------- .../GameTicking/GameTicker.RoundFlow.cs | 3 + .../GameTicking/GameTicker.Spawning.cs | 1 + .../game-ticking/set-game-preset-command.ftl | 8 +- 5 files changed, 200 insertions(+), 160 deletions(-) diff --git a/Content.Server/GameTicking/Commands/SetGamePresetCommand.cs b/Content.Server/GameTicking/Commands/SetGamePresetCommand.cs index 83736bd92b..78e2b452b7 100644 --- a/Content.Server/GameTicking/Commands/SetGamePresetCommand.cs +++ b/Content.Server/GameTicking/Commands/SetGamePresetCommand.cs @@ -2,6 +2,7 @@ using Content.Server.Administration; using Content.Server.GameTicking.Presets; using Content.Shared.Administration; +using Linguini.Shared.Util; using Robust.Shared.Console; using Robust.Shared.Prototypes; @@ -19,9 +20,9 @@ namespace Content.Server.GameTicking.Commands public void Execute(IConsoleShell shell, string argStr, string[] args) { - if (args.Length != 1) + if (!args.Length.InRange(1, 2)) { - shell.WriteError(Loc.GetString("shell-wrong-arguments-number-need-specific", ("properAmount", 1), ("currentAmount", args.Length))); + shell.WriteError(Loc.GetString("shell-need-between-arguments", ("lower", 1), ("upper", 2), ("currentAmount", args.Length))); return; } @@ -33,8 +34,16 @@ namespace Content.Server.GameTicking.Commands return; } - ticker.SetGamePreset(preset); - shell.WriteLine(Loc.GetString("set-game-preset-preset-set", ("preset", preset.ID))); + var rounds = 1; + + if (args.Length == 2 && !int.TryParse(args[1], out rounds)) + { + shell.WriteError(Loc.GetString("set-game-preset-optional-argument-not-integer")); + return; + } + + ticker.SetGamePreset(preset, false, rounds); + shell.WriteLine(Loc.GetString("set-game-preset-preset-set-finite", ("preset", preset.ID), ("rounds", rounds.ToString()))); } public CompletionResult GetCompletion(IConsoleShell shell, string[] args) diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index d1a8b062c4..14985051e7 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -1,208 +1,233 @@ -using Content.Server.GameTicking.Presets; -using Content.Server.Maps; -using Content.Shared.CCVar; -using JetBrains.Annotations; -using Robust.Shared.Player; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading.Tasks; +using Content.Server.GameTicking.Presets; +using Content.Server.Maps; +using Content.Shared.CCVar; +using Content.Shared.Mobs.Systems; +using JetBrains.Annotations; +using Robust.Shared.Player; -namespace Content.Server.GameTicking +namespace Content.Server.GameTicking; + +public sealed partial class GameTicker { - public sealed partial class GameTicker + [Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!; + + public const float PresetFailedCooldownIncrease = 30f; + + /// <summary> + /// The selected preset that will be used at the start of the next round. + /// </summary> + public GamePresetPrototype? Preset { get; private set; } + + /// <summary> + /// The preset that's currently active. + /// </summary> + public GamePresetPrototype? CurrentPreset { get; private set; } + + /// <summary> + /// Countdown to the preset being reset to the server default. + /// </summary> + public int? ResetCountdown; + + private bool StartPreset(ICommonSession[] origReadyPlayers, bool force) { - public const float PresetFailedCooldownIncrease = 30f; + var startAttempt = new RoundStartAttemptEvent(origReadyPlayers, force); + RaiseLocalEvent(startAttempt); - /// <summary> - /// The selected preset that will be used at the start of the next round. - /// </summary> - public GamePresetPrototype? Preset { get; private set; } + if (!startAttempt.Cancelled) + return true; - /// <summary> - /// The preset that's currently active. - /// </summary> - public GamePresetPrototype? CurrentPreset { get; private set; } + var presetTitle = CurrentPreset != null ? Loc.GetString(CurrentPreset.ModeTitle) : string.Empty; - private bool StartPreset(ICommonSession[] origReadyPlayers, bool force) + void FailedPresetRestart() { - var startAttempt = new RoundStartAttemptEvent(origReadyPlayers, force); - RaiseLocalEvent(startAttempt); - - if (!startAttempt.Cancelled) - return true; - - var presetTitle = CurrentPreset != null ? Loc.GetString(CurrentPreset.ModeTitle) : string.Empty; - - void FailedPresetRestart() - { - SendServerMessage(Loc.GetString("game-ticker-start-round-cannot-start-game-mode-restart", - ("failedGameMode", presetTitle))); - RestartRound(); - DelayStart(TimeSpan.FromSeconds(PresetFailedCooldownIncrease)); - } + SendServerMessage(Loc.GetString("game-ticker-start-round-cannot-start-game-mode-restart", + ("failedGameMode", presetTitle))); + RestartRound(); + DelayStart(TimeSpan.FromSeconds(PresetFailedCooldownIncrease)); + } if (_cfg.GetCVar(CCVars.GameLobbyFallbackEnabled)) { var fallbackPresets = _cfg.GetCVar(CCVars.GameLobbyFallbackPreset).Split(","); var startFailed = true; - foreach (var preset in fallbackPresets) + foreach (var preset in fallbackPresets) + { + ClearGameRules(); + SetGamePreset(preset); + AddGamePresetRules(); + StartGamePresetRules(); + + startAttempt.Uncancel(); + RaiseLocalEvent(startAttempt); + + if (!startAttempt.Cancelled) { - ClearGameRules(); - SetGamePreset(preset); - AddGamePresetRules(); - StartGamePresetRules(); - - startAttempt.Uncancel(); - RaiseLocalEvent(startAttempt); - - if (!startAttempt.Cancelled) - { - _chatManager.SendAdminAnnouncement( - Loc.GetString("game-ticker-start-round-cannot-start-game-mode-fallback", - ("failedGameMode", presetTitle), - ("fallbackMode", Loc.GetString(preset)))); - RefreshLateJoinAllowed(); - startFailed = false; - break; - } - } - - if (startFailed) - { - FailedPresetRestart(); - return false; + _chatManager.SendAdminAnnouncement( + Loc.GetString("game-ticker-start-round-cannot-start-game-mode-fallback", + ("failedGameMode", presetTitle), + ("fallbackMode", Loc.GetString(preset)))); + RefreshLateJoinAllowed(); + startFailed = false; + break; } } - else + if (startFailed) { FailedPresetRestart(); return false; } - - return true; } + else + { + FailedPresetRestart(); + return false; + } + + return true; + } + private void InitializeGamePreset() { SetGamePreset(LobbyEnabled ? _cfg.GetCVar(CCVars.GameLobbyDefaultPreset) : "sandbox"); } - public void SetGamePreset(GamePresetPrototype? preset, bool force = false) + public void SetGamePreset(GamePresetPrototype? preset, bool force = false, int? resetDelay = null) + { + // Do nothing if this game ticker is a dummy! + if (DummyTicker) + return; + + if (resetDelay is not null) { - // Do nothing if this game ticker is a dummy! - if (DummyTicker) - return; + ResetCountdown = resetDelay.Value; + // Reset counter is checked and changed at the end of each round + // So if the game is in the lobby, the first requested round will happen before the check, and we need one less check + if (CurrentPreset is null) + ResetCountdown = resetDelay.Value -1; + } - Preset = preset; - ValidateMap(); - UpdateInfoText(); + Preset = preset; + ValidateMap(); + UpdateInfoText(); - if (force) + if (force) + { + StartRound(true); + } + } + + public void SetGamePreset(string preset, bool force = false) + { + var proto = FindGamePreset(preset); + if(proto != null) + SetGamePreset(proto, force); + } + + public GamePresetPrototype? FindGamePreset(string preset) + { + if (_prototypeManager.TryIndex(preset, out GamePresetPrototype? presetProto)) + return presetProto; + + foreach (var proto in _prototypeManager.EnumeratePrototypes<GamePresetPrototype>()) + { + foreach (var alias in proto.Alias) { - StartRound(true); + if (preset.Equals(alias, StringComparison.InvariantCultureIgnoreCase)) + return proto; } } - public void SetGamePreset(string preset, bool force = false) - { - var proto = FindGamePreset(preset); - if(proto != null) - SetGamePreset(proto, force); - } + return null; + } - public GamePresetPrototype? FindGamePreset(string preset) - { - if (_prototypeManager.TryIndex(preset, out GamePresetPrototype? presetProto)) - return presetProto; + public bool TryFindGamePreset(string preset, [NotNullWhen(true)] out GamePresetPrototype? prototype) + { + prototype = FindGamePreset(preset); - foreach (var proto in _prototypeManager.EnumeratePrototypes<GamePresetPrototype>()) - { - foreach (var alias in proto.Alias) - { - if (preset.Equals(alias, StringComparison.InvariantCultureIgnoreCase)) - return proto; - } - } - - return null; - } - - public bool TryFindGamePreset(string preset, [NotNullWhen(true)] out GamePresetPrototype? prototype) - { - prototype = FindGamePreset(preset); - - return prototype != null; - } - - public bool IsMapEligible(GameMapPrototype map) - { - if (Preset == null) - return true; - - if (Preset.MapPool == null || !_prototypeManager.TryIndex<GameMapPoolPrototype>(Preset.MapPool, out var pool)) - return true; - - return pool.Maps.Contains(map.ID); - } - - private void ValidateMap() - { - if (Preset == null || _gameMapManager.GetSelectedMap() is not { } map) - return; - - if (Preset.MapPool == null || - !_prototypeManager.TryIndex<GameMapPoolPrototype>(Preset.MapPool, out var pool)) - return; - - if (pool.Maps.Contains(map.ID)) - return; - - _gameMapManager.SelectMapRandom(); - } - - [PublicAPI] - private bool AddGamePresetRules() - { - if (DummyTicker || Preset == null) - return false; - - CurrentPreset = Preset; - foreach (var rule in Preset.Rules) - { - AddGameRule(rule); - } + return prototype != null; + } + public bool IsMapEligible(GameMapPrototype map) + { + if (Preset == null) return true; + + if (Preset.MapPool == null || !_prototypeManager.TryIndex<GameMapPoolPrototype>(Preset.MapPool, out var pool)) + return true; + + return pool.Maps.Contains(map.ID); + } + + private void ValidateMap() + { + if (Preset == null || _gameMapManager.GetSelectedMap() is not { } map) + return; + + if (Preset.MapPool == null || + !_prototypeManager.TryIndex<GameMapPoolPrototype>(Preset.MapPool, out var pool)) + return; + + if (pool.Maps.Contains(map.ID)) + return; + + _gameMapManager.SelectMapRandom(); + } + + [PublicAPI] + private bool AddGamePresetRules() + { + if (DummyTicker || Preset == null) + return false; + + CurrentPreset = Preset; + foreach (var rule in Preset.Rules) + { + AddGameRule(rule); } - public void StartGamePresetRules() + return true; + } + + private void TryResetPreset() + { + if (ResetCountdown is null || ResetCountdown-- > 0) + return; + + InitializeGamePreset(); + ResetCountdown = null; + } + + public void StartGamePresetRules() + { + // May be touched by the preset during init. + var rules = new List<EntityUid>(GetAddedGameRules()); + foreach (var rule in rules) { - // May be touched by the preset during init. - var rules = new List<EntityUid>(GetAddedGameRules()); - foreach (var rule in rules) - { - StartGameRule(rule); - } + StartGameRule(rule); } + } private void IncrementRoundNumber() { var playerIds = _playerGameStatuses.Keys.Select(player => player.UserId).ToArray(); var serverName = _cfg.GetCVar(CCVars.AdminLogsServerName); - // TODO FIXME AAAAAAAAAAAAAAAAAAAH THIS IS BROKEN - // Task.Run as a terrible dirty workaround to avoid synchronization context deadlock from .Result here. - // This whole setup logic should be made asynchronous so we can properly wait on the DB AAAAAAAAAAAAAH - var task = Task.Run(async () => - { - var server = await _dbEntryManager.ServerEntity; - return await _db.AddNewRound(server, playerIds); - }); + // TODO FIXME AAAAAAAAAAAAAAAAAAAH THIS IS BROKEN + // Task.Run as a terrible dirty workaround to avoid synchronization context deadlock from .Result here. + // This whole setup logic should be made asynchronous so we can properly wait on the DB AAAAAAAAAAAAAH + var task = Task.Run(async () => + { + var server = await _dbEntryManager.ServerEntity; + return await _db.AddNewRound(server, playerIds); + }); - _taskManager.BlockWaitOnTask(task); - RoundId = task.GetAwaiter().GetResult(); - } + _taskManager.BlockWaitOnTask(task); + RoundId = task.GetAwaiter().GetResult(); } } diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 0e8f8bda1e..5d5e68441d 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -647,6 +647,9 @@ namespace Content.Server.GameTicking if (_serverUpdates.RoundEnded()) return; + // Check if the GamePreset needs to be reset + TryResetPreset(); + _sawmill.Info("Restarting round!"); SendServerMessage(Loc.GetString("game-ticker-restart-round")); diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 26242925aa..624bf35afe 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -4,6 +4,7 @@ using System.Numerics; using Content.Server.Administration.Managers; using Content.Server.Administration.Systems; using Content.Server.GameTicking.Events; +using Content.Server.Ghost; using Content.Server.Spawners.Components; using Content.Server.Speech.Components; using Content.Server.Station.Components; diff --git a/Resources/Locale/en-US/game-ticking/set-game-preset-command.ftl b/Resources/Locale/en-US/game-ticking/set-game-preset-command.ftl index 46049643cb..323d83aeba 100644 --- a/Resources/Locale/en-US/game-ticking/set-game-preset-command.ftl +++ b/Resources/Locale/en-US/game-ticking/set-game-preset-command.ftl @@ -1,5 +1,7 @@ -set-game-preset-command-description = Sets the game preset for the current round. -set-game-preset-command-help-text = setgamepreset <id> +set-game-preset-command-description = Sets the game preset for the specified number of upcoming rounds. +set-game-preset-command-help-text = setgamepreset <id> [number of rounds, defaulting to 1] +set-game-preset-optional-argument-not-integer = If argument 2 is provided it must be a number. set-game-preset-preset-error = Unable to find game preset "{$preset}" -set-game-preset-preset-set = Set game preset to "{$preset}" +#set-game-preset-preset-set = Set game preset to "{$preset}" +set-game-preset-preset-set-finite = Set game preset to "{$preset}" for the next {$rounds} rounds. From f017b7dbaf240a4d69e35e41b28e3fffdcfcce0d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 12:25:45 +0000 Subject: [PATCH 287/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index c6fda76519..473531c58f 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1073,5 +1073,17 @@ Entries: id: 130 time: '2025-04-18T07:44:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32200 +- author: Errant + changes: + - message: The setgamepreset command no longer changes the preset permanently. When + used with only one parameter (for the preset to be used), it will make that + change for the next round that starts. The optional second parameter can specify + the number of upcoming rounds that will use the specified preset. If you want + to change the game preset permanently, set an arbitrarily high number as the + second parameter, or preferably just modify the game.defaultpreset cvar + type: Tweak + id: 131 + time: '2025-04-18T12:24:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30812 Name: Admin Order: 1 From a9720f214963f4cc3fb54f62bbcc01f791e3346f Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Fri, 18 Apr 2025 14:26:47 +0200 Subject: [PATCH 288/622] Fix powered lights electrocuting you despite having insulated gloves V2 (#36686) fix light insulation --- Content.Server/Electrocution/ElectrocutionSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index c7adb311d3..0059a8b427 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -188,7 +188,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem if (_meleeWeapon.GetDamage(args.Used, args.User).Empty) return; - DoCommonElectrocution(args.User, uid, component.UnarmedHitShock, component.UnarmedHitStun, false); + TryDoElectrocution(args.User, uid, component.UnarmedHitShock, component.UnarmedHitStun, false); } private void OnElectrifiedInteractUsing(EntityUid uid, ElectrifiedComponent electrified, InteractUsingEvent args) From f2232e2ffb113bb9fbb2e4fb30dee54d44f0840c Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 12:27:55 +0000 Subject: [PATCH 289/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 69ab678fa7..8348e1a999 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: MilenVolf - changes: - - message: Clicking on a buckled mob now unbuckles it, rather than hugging/petting - it. - type: Fix - id: 7728 - time: '2024-12-18T14:26:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33635 - author: SlamBamActionman changes: - message: Slimes no longer deal Cellular damage. @@ -3912,3 +3904,11 @@ id: 8228 time: '2025-04-18T12:09:49.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36252 +- author: slarticodefast + changes: + - message: Punching lights while wearing insulated gloves will no longer electrocute + you. + type: Fix + id: 8229 + time: '2025-04-18T12:26:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36686 From e838667d8700989ed3e979ae43a2e9f6efb80ed4 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 18 Apr 2025 22:57:23 +1000 Subject: [PATCH 290/622] Predict blocking examine + fix blocking breaking persistence (#36619) * Predict blocking examine No idea why this was blocked. * Fix blocking * remove nullcheck that made no sense * predict popups --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Content.Shared/Blocking/BlockingSystem.cs | 94 ++++++++----------- .../Blocking/Components/BlockingComponent.cs | 16 ++-- 2 files changed, 45 insertions(+), 65 deletions(-) diff --git a/Content.Shared/Blocking/BlockingSystem.cs b/Content.Shared/Blocking/BlockingSystem.cs index 594d1baf6c..c920fde13b 100644 --- a/Content.Shared/Blocking/BlockingSystem.cs +++ b/Content.Shared/Blocking/BlockingSystem.cs @@ -13,13 +13,9 @@ using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Toggleable; using Content.Shared.Verbs; -using Robust.Shared.Network; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.Shared.Blocking; @@ -35,8 +31,6 @@ public sealed partial class BlockingSystem : EntitySystem [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly ExamineSystemShared _examine = default!; - [Dependency] private readonly INetManager _net = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; public override void Initialize() { @@ -156,61 +150,53 @@ public sealed partial class BlockingSystem : EntitySystem var msgUser = Loc.GetString("action-popup-blocking-user", ("shield", shieldName)); var msgOther = Loc.GetString("action-popup-blocking-other", ("blockerName", blockerName), ("shield", shieldName)); - if (component.BlockingToggleAction != null) + //Don't allow someone to block if they're not parented to a grid + if (xform.GridUid != xform.ParentUid) { - //Don't allow someone to block if they're not parented to a grid - if (xform.GridUid != xform.ParentUid) - { - CantBlockError(user); - return false; - } + CantBlockError(user); + return false; + } - // Don't allow someone to block if they're not holding the shield - if(!_handsSystem.IsHolding(user, item, out _)) - { - CantBlockError(user); - return false; - } + // Don't allow someone to block if they're not holding the shield + if (!_handsSystem.IsHolding(user, item, out _)) + { + CantBlockError(user); + return false; + } - //Don't allow someone to block if someone else is on the same tile - var playerTileRef = xform.Coordinates.GetTileRef(); - if (playerTileRef != null) + //Don't allow someone to block if someone else is on the same tile + var playerTileRef = xform.Coordinates.GetTileRef(); + if (playerTileRef != null) + { + var intersecting = _lookup.GetLocalEntitiesIntersecting(playerTileRef.Value, 0f); + var mobQuery = GetEntityQuery<MobStateComponent>(); + foreach (var uid in intersecting) { - var intersecting = _lookup.GetLocalEntitiesIntersecting(playerTileRef.Value, 0f); - var mobQuery = GetEntityQuery<MobStateComponent>(); - foreach (var uid in intersecting) + if (uid != user && mobQuery.HasComponent(uid)) { - if (uid != user && mobQuery.HasComponent(uid)) - { - TooCloseError(user); - return false; - } + TooCloseError(user); + return false; } } - - //Don't allow someone to block if they're somehow not anchored. - _transformSystem.AnchorEntity(user, xform); - if (!xform.Anchored) - { - CantBlockError(user); - return false; - } - _actionsSystem.SetToggled(component.BlockingToggleActionEntity, true); - if (_gameTiming.IsFirstTimePredicted) - { - _popupSystem.PopupEntity(msgOther, user, Filter.PvsExcept(user), true); - if(_gameTiming.InPrediction) - _popupSystem.PopupEntity(msgUser, user, user); - } } + //Don't allow someone to block if they're somehow not anchored. + _transformSystem.AnchorEntity(user, xform); + if (!xform.Anchored) + { + CantBlockError(user); + return false; + } + _actionsSystem.SetToggled(component.BlockingToggleActionEntity, true); + _popupSystem.PopupPredicted(msgUser, msgOther, user, user); + if (TryComp<PhysicsComponent>(user, out var physicsComponent)) { _fixtureSystem.TryCreateFixture(user, component.Shape, BlockingComponent.BlockFixtureID, hard: true, - collisionLayer: (int) CollisionGroup.WallLayer, + collisionLayer: (int)CollisionGroup.WallLayer, body: physicsComponent); } @@ -223,13 +209,13 @@ public sealed partial class BlockingSystem : EntitySystem private void CantBlockError(EntityUid user) { var msgError = Loc.GetString("action-popup-blocking-user-cant-block"); - _popupSystem.PopupEntity(msgError, user, user); + _popupSystem.PopupClient(msgError, user, user); } private void TooCloseError(EntityUid user) { var msgError = Loc.GetString("action-popup-blocking-user-too-close"); - _popupSystem.PopupEntity(msgError, user, user); + _popupSystem.PopupClient(msgError, user, user); } /// <summary> @@ -255,8 +241,7 @@ public sealed partial class BlockingSystem : EntitySystem //If the component blocking toggle isn't null, grab the users SharedBlockingUserComponent and PhysicsComponent //then toggle the action to false, unanchor the user, remove the hard fixture //and set the users bodytype back to their original type - if (component.BlockingToggleAction != null && TryComp<BlockingUserComponent>(user, out var blockingUserComponent) - && TryComp<PhysicsComponent>(user, out var physicsComponent)) + if (TryComp<BlockingUserComponent>(user, out var blockingUserComponent) && TryComp<PhysicsComponent>(user, out var physicsComponent)) { if (xform.Anchored) _transformSystem.Unanchor(user, xform); @@ -264,12 +249,7 @@ public sealed partial class BlockingSystem : EntitySystem _actionsSystem.SetToggled(component.BlockingToggleActionEntity, false); _fixtureSystem.DestroyFixture(user, BlockingComponent.BlockFixtureID, body: physicsComponent); _physics.SetBodyType(user, blockingUserComponent.OriginalBodyType, body: physicsComponent); - if (_gameTiming.IsFirstTimePredicted) - { - _popupSystem.PopupEntity(msgOther, user, Filter.PvsExcept(user), true); - if(_gameTiming.InPrediction) - _popupSystem.PopupEntity(msgUser, user, user); - } + _popupSystem.PopupPredicted(msgUser, msgOther, user, user); } component.IsBlocking = false; @@ -313,7 +293,7 @@ public sealed partial class BlockingSystem : EntitySystem private void OnVerbExamine(EntityUid uid, BlockingComponent component, GetVerbsEvent<ExamineVerb> args) { - if (!args.CanInteract || !args.CanAccess || !_net.IsServer) + if (!args.CanInteract || !args.CanAccess) return; var fraction = component.IsBlocking ? component.ActiveBlockFraction : component.PassiveBlockFraction; diff --git a/Content.Shared/Blocking/Components/BlockingComponent.cs b/Content.Shared/Blocking/Components/BlockingComponent.cs index f869c20679..126b64a459 100644 --- a/Content.Shared/Blocking/Components/BlockingComponent.cs +++ b/Content.Shared/Blocking/Components/BlockingComponent.cs @@ -16,13 +16,13 @@ public sealed partial class BlockingComponent : Component /// <summary> /// The entity that's blocking /// </summary> - [ViewVariables, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntityUid? User; /// <summary> /// Is it currently blocking? /// </summary> - [ViewVariables, AutoNetworkedField] + [DataField, AutoNetworkedField] public bool IsBlocking; /// <summary> @@ -33,7 +33,7 @@ public sealed partial class BlockingComponent : Component /// <summary> /// The shape of the blocking fixture that will be dynamically spawned /// </summary> - [DataField("shape"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public IPhysShape Shape = new PhysShapeCircle(0.5f); /// <summary> @@ -48,8 +48,8 @@ public sealed partial class BlockingComponent : Component [DataField("activeBlockModifier", required: true)] public DamageModifierSet ActiveBlockDamageModifier = default!; - [DataField("blockingToggleAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))] - public string BlockingToggleAction = "ActionToggleBlock"; + [DataField] + public EntProtoId BlockingToggleAction = "ActionToggleBlock"; [DataField, AutoNetworkedField] public EntityUid? BlockingToggleActionEntity; @@ -57,7 +57,7 @@ public sealed partial class BlockingComponent : Component /// <summary> /// The sound to be played when you get hit while actively blocking /// </summary> - [DataField("blockSound")] public SoundSpecifier BlockSound = + [DataField] public SoundSpecifier BlockSound = new SoundPathSpecifier("/Audio/Weapons/block_metal1.ogg") { Params = AudioParams.Default.WithVariation(0.25f) @@ -67,13 +67,13 @@ public sealed partial class BlockingComponent : Component /// Fraction of original damage shield will take instead of user /// when not blocking /// </summary> - [DataField("passiveBlockFraction"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float PassiveBlockFraction = 0.5f; /// <summary> /// Fraction of original damage shield will take instead of user /// when blocking /// </summary> - [DataField("activeBlockFraction"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float ActiveBlockFraction = 1.0f; } From 3f9895cb38d0b2e1468ef2035076fe9ec4071f89 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Fri, 18 Apr 2025 15:37:58 +0200 Subject: [PATCH 291/622] Slightly tweak base funding allocations. (#36688) init --- .../Cargo/Components/StationBankAccountComponent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs index e320ef8aab..701238926b 100644 --- a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs +++ b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs @@ -45,10 +45,10 @@ public sealed partial class StationBankAccountComponent : Component { { "Cargo", 0.00 }, { "Engineering", 0.25 }, - { "Medical", 0.30 }, + { "Medical", 0.25 }, { "Science", 0.15 }, { "Security", 0.20 }, - { "Service", 0.10 }, + { "Service", 0.15 }, }; /// <summary> From bfba10b96e6e2a7cf3284ccfbb031671482e4e1b Mon Sep 17 00:00:00 2001 From: Minemoder5000 <minemoder50000@gmail.com> Date: Fri, 18 Apr 2025 08:12:26 -0600 Subject: [PATCH 292/622] Disable point light on rainbow weed (#36479) * botanists can no longer destroy the lighting engine * unshaded --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Objects/Specific/Hydroponics/leaves.yml | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml index 06f2974305..3ef9e99cd2 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/leaves.yml @@ -65,7 +65,7 @@ - Smokable - type: Item size: Tiny - + - type: entity name: rainbow cannabis leaves parent: LeavesCannabis @@ -73,14 +73,18 @@ description: "Is it supposed to be glowing like that...?" components: - type: Sprite - sprite: Objects/Specific/Hydroponics/rainbow_cannabis.rsi + layers: + - sprite: Objects/Specific/Hydroponics/rainbow_cannabis.rsi + state: produce + shader: unshaded - type: Produce seedId: rainbowCannabis - - type: PointLight - radius: 1.5 - energy: 2 - - type: RgbLightController - cycleRate: 0.6 + # disabled because 50 morbillion point lights still break the lighting engine + #- type: PointLight + # radius: 1.5 + # energy: 2 + #- type: RgbLightController + # cycleRate: 0.6 - type: SolutionContainerManager solutions: food: @@ -250,4 +254,4 @@ tags: - Smokable - type: Item - size: Tiny \ No newline at end of file + size: Tiny From d068075c81d94660e3d5aa0b98d01dd222e2bc30 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 14:13:32 +0000 Subject: [PATCH 293/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8348e1a999..02c06aabbc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Slimes no longer deal Cellular damage. - type: Tweak - id: 7729 - time: '2024-12-18T15:05:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33104 - author: Redbookcase changes: - message: Standardized Mercenary gear's contraband status. @@ -3912,3 +3905,10 @@ id: 8229 time: '2025-04-18T12:26:48.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36686 +- author: Minemoder + changes: + - message: Rainbow Cannabis Leaves no longer emit light due to a renderer limitation. + type: Remove + id: 8230 + time: '2025-04-18T14:12:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36479 From a89af44f5691baa89f43571d996ea110667db174 Mon Sep 17 00:00:00 2001 From: J <billsmith116@gmail.com> Date: Fri, 18 Apr 2025 14:28:40 +0000 Subject: [PATCH 294/622] Weapons warnings cleanup (#36164) * Weapons warnings cleanup * Changes to audio on Reflection stuff --- .../Weapons/Melee/MeleeThrowOnHitSystem.cs | 4 ---- .../SharedGunSystem.ChamberMagazine.cs | 2 +- .../Weapons/Ranged/Systems/SharedGunSystem.cs | 7 +++--- .../Weapons/Reflect/ReflectComponent.cs | 10 ++++----- .../Weapons/Reflect/ReflectSystem.cs | 22 ++++++++++--------- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs index bc95be926a..035432ef85 100644 --- a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs @@ -1,12 +1,9 @@ -using Content.Shared.Construction.Components; using Content.Shared.Stunnable; using Content.Shared.Throwing; using Content.Shared.Timing; using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Events; -using Robust.Shared.Physics; using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; using System.Numerics; namespace Content.Shared.Weapons.Melee; @@ -17,7 +14,6 @@ namespace Content.Shared.Weapons.Melee; public sealed class MeleeThrowOnHitSystem : EntitySystem { [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly UseDelaySystem _delay = default!; [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs index 3060e2c1a9..39014d8248 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs @@ -184,7 +184,7 @@ public abstract partial class SharedGunSystem // The problem is client will dump the cartridge on the ground and the new server state // won't correspond due to randomness so looks weird // but we also need to always take it from the chamber or else ammocount won't be correct. - TransformSystem.DetachParentToNull(chambered.Value, Transform(chambered.Value)); + TransformSystem.DetachEntity(chambered.Value, Transform(chambered.Value)); } UpdateAmmoCount(uid); diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index ac6f27f7e9..8ed9e4949e 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -27,6 +27,7 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Network; +using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; using Robust.Shared.Prototypes; @@ -462,7 +463,7 @@ public abstract partial class SharedGunSystem : EntitySystem var coordinates = xform.Coordinates; coordinates = coordinates.Offset(offsetPos); - TransformSystem.SetLocalRotation(xform, Random.NextAngle()); + TransformSystem.SetLocalRotation(entity, Random.NextAngle(), xform); TransformSystem.SetCoordinates(entity, xform, coordinates); // decides direction the casing ejects and only when not cycling @@ -510,8 +511,8 @@ public abstract partial class SharedGunSystem : EntitySystem public void CauseImpulse(EntityCoordinates fromCoordinates, EntityCoordinates toCoordinates, EntityUid user, PhysicsComponent userPhysics) { - var fromMap = fromCoordinates.ToMapPos(EntityManager, TransformSystem); - var toMap = toCoordinates.ToMapPos(EntityManager, TransformSystem); + var fromMap = TransformSystem.ToMapCoordinates(fromCoordinates).Position; + var toMap = TransformSystem.ToMapCoordinates(toCoordinates).Position; var shotDirection = (toMap - fromMap).Normalized(); const float impulseStrength = 25.0f; diff --git a/Content.Shared/Weapons/Reflect/ReflectComponent.cs b/Content.Shared/Weapons/Reflect/ReflectComponent.cs index 8418c1f3ef..703d8904dc 100644 --- a/Content.Shared/Weapons/Reflect/ReflectComponent.cs +++ b/Content.Shared/Weapons/Reflect/ReflectComponent.cs @@ -13,20 +13,20 @@ public sealed partial class ReflectComponent : Component /// <summary> /// What we reflect. /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField("reflects")] + [ViewVariables(VVAccess.ReadWrite), DataField] public ReflectType Reflects = ReflectType.Energy | ReflectType.NonEnergy; /// <summary> /// Probability for a projectile to be reflected. /// </summary> - [DataField("reflectProb"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public float ReflectProb = 0.25f; - [DataField("spread"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public Angle Spread = Angle.FromDegrees(45); - [DataField("soundOnReflect")] - public SoundSpecifier? SoundOnReflect = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/laser_sear_wall.ogg"); + [DataField] + public SoundSpecifier? SoundOnReflect = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/laser_sear_wall.ogg", AudioParams.Default.WithVariation(0.05f)); } [Flags] diff --git a/Content.Shared/Weapons/Reflect/ReflectSystem.cs b/Content.Shared/Weapons/Reflect/ReflectSystem.cs index 8be5f1be1f..3d3ded99ce 100644 --- a/Content.Shared/Weapons/Reflect/ReflectSystem.cs +++ b/Content.Shared/Weapons/Reflect/ReflectSystem.cs @@ -118,11 +118,7 @@ public sealed class ReflectSystem : EntitySystem var newRot = rotation.RotateVec(locRot.ToVec()); _transform.SetLocalRotation(projectile, newRot.ToAngle()); - if (_netManager.IsServer) - { - _popup.PopupEntity(Loc.GetString("reflect-shot"), user); - _audio.PlayPvs(reflect.SoundOnReflect, user, AudioHelpers.WithVariation(0.05f, _random)); - } + PlayAudioAndPopup(reflect, user); if (Resolve(projectile, ref projectileComp, false)) { @@ -154,6 +150,16 @@ public sealed class ReflectSystem : EntitySystem } } + private void PlayAudioAndPopup(ReflectComponent reflect, EntityUid user) + { + // Can probably be changed for prediction + if (_netManager.IsServer) + { + _popup.PopupEntity(Loc.GetString("reflect-shot"), user); + _audio.PlayPvs(reflect.SoundOnReflect, user); + } + } + private bool TryReflectHitscan( EntityUid user, EntityUid reflector, @@ -172,11 +178,7 @@ public sealed class ReflectSystem : EntitySystem return false; } - if (_netManager.IsServer) - { - _popup.PopupEntity(Loc.GetString("reflect-shot"), user); - _audio.PlayPvs(reflect.SoundOnReflect, user, AudioHelpers.WithVariation(0.05f, _random)); - } + PlayAudioAndPopup(reflect, user); var spread = _random.NextAngle(-reflect.Spread / 2, reflect.Spread / 2); newDirection = -spread.RotateVec(direction); From 73f3016758d0cd7c07a41e74ad1c09edca727ce7 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Fri, 18 Apr 2025 12:10:12 -0400 Subject: [PATCH 295/622] sec holobarrier charge increase (#34473) more charges --- .../Prototypes/Entities/Objects/Devices/holoprojectors.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml b/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml index 64efe77c7c..e8061c5913 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml @@ -119,7 +119,7 @@ components: - type: HolosignProjector signProto: HolosignSecurity - chargeUse: 120 + chargeUse: 90 - type: Sprite sprite: Objects/Devices/Holoprojectors/security.rsi state: icon From 45fdf5cf4d08f1d425800040579118a7aab381c2 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 16:11:19 +0000 Subject: [PATCH 296/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 02c06aabbc..700237983d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Redbookcase - changes: - - message: Standardized Mercenary gear's contraband status. - type: Tweak - id: 7730 - time: '2024-12-18T15:13:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33647 - author: ArtisticRoomba changes: - message: New plushie, named "drazil plushie". Based on an inverted lizard plushie. @@ -3912,3 +3905,10 @@ id: 8230 time: '2025-04-18T14:12:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36479 +- author: IProduceWidgets + changes: + - message: Holobarrier projectors are now more power efficient. + type: Tweak + id: 8231 + time: '2025-04-18T16:10:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34473 From c155740ac589574fa7c97019bcf546512f67780a Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Fri, 18 Apr 2025 12:28:24 -0400 Subject: [PATCH 297/622] Cleanup warnings in SimpleRadialMenu (#36690) --- .../Controls/SimpleRadialMenu.xaml.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs index 15c8065a44..31d7eab340 100644 --- a/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs +++ b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs @@ -11,7 +11,7 @@ using Robust.Client.Input; namespace Content.Client.UserInterface.Controls; [GenerateTypedNameReferences] -public partial class SimpleRadialMenu : RadialMenu +public sealed partial class SimpleRadialMenu : RadialMenu { private EntityUid? _attachMenuToEntity; @@ -147,7 +147,7 @@ public partial class SimpleRadialMenu : RadialMenu Close(); }; } - + return button; } @@ -232,21 +232,21 @@ public partial class SimpleRadialMenu : RadialMenu public abstract class RadialMenuOption { public string? ToolTip { get; init; } - + public SpriteSpecifier? Sprite { get; init; } public Color? BackgroundColor { get; set; } public Color? HoverBackgroundColor { get; set; } } -public class RadialMenuActionOption(Action onPressed) : RadialMenuOption +public abstract class RadialMenuActionOption(Action onPressed) : RadialMenuOption { public Action OnPressed { get; } = onPressed; } -public class RadialMenuActionOption<T>(Action<T> onPressed, T data) +public sealed class RadialMenuActionOption<T>(Action<T> onPressed, T data) : RadialMenuActionOption(onPressed: () => onPressed(data)); -public class RadialMenuNestedLayerOption(IReadOnlyCollection<RadialMenuOption> nested, float containerRadius = 100) +public sealed class RadialMenuNestedLayerOption(IReadOnlyCollection<RadialMenuOption> nested, float containerRadius = 100) : RadialMenuOption { public float? ContainerRadius { get; } = containerRadius; @@ -254,7 +254,7 @@ public class RadialMenuNestedLayerOption(IReadOnlyCollection<RadialMenuOption> n public IReadOnlyCollection<RadialMenuOption> Nested { get; } = nested; } -public class SimpleRadialMenuSettings +public sealed class SimpleRadialMenuSettings { /// <summary> /// Default container draw radius. Is going to be further affected by per sector increment. From 4585a17744b80aadc8fc10fc4560ed67839e3e9d Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Sat, 19 Apr 2025 04:42:50 +1200 Subject: [PATCH 298/622] Remove egg-plant from MegaSeed Servitor (#36579) remove eggy --- .../Prototypes/Catalog/VendingMachines/Inventories/seeds.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml index 44d0678956..719693804f 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/seeds.yml @@ -15,7 +15,6 @@ CornSeeds: 5 CottonSeeds: 5 EggplantSeeds: 5 - EggySeeds: 5 GalaxythistleSeeds: 3 GarlicSeeds: 3 GrapeSeeds: 5 From 5d3ea9d1b56ce53add6d30aa266e04581021e82c Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 16:43:57 +0000 Subject: [PATCH 299/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 700237983d..4ff3da2f05 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: New plushie, named "drazil plushie". Based on an inverted lizard plushie. - It can be rarely found in maints lockers. Hew! - type: Add - - message: New reagent, Juice that makes you Hew. It can be made from juicing inverted - lizard plushies. Hew! - type: Add - id: 7731 - time: '2024-12-18T16:31:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33776 - author: FairlySadPanda August-Sun Eric156 changes: - message: Smite Cranberry is now available wherever lemon-lime soda is sold, just @@ -3912,3 +3901,11 @@ id: 8231 time: '2025-04-18T16:10:12.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34473 +- author: K-Dynamic + changes: + - message: Removed egg-plant from MegaSeed Servitor. (Egg-plant seeds can still + be obtained by mutation or exotic seed crate.) + type: Remove + id: 8232 + time: '2025-04-18T16:42:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36579 From 370a3a7fa31cd6e12cd77abf25f32f899024164e Mon Sep 17 00:00:00 2001 From: YoungThug <ramialanbagy@gmail.com> Date: Fri, 18 Apr 2025 10:05:11 -0700 Subject: [PATCH 300/622] Grammar Consistency In All Instances of 'S (#36422) * Bacchusdlajsnwajdoks * FSP CHANGE --- Resources/Locale/en-US/cargo/bounties.ftl | 2 +- .../en-US/reagents/meta/consumable/drink/alcohol.ftl | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Locale/en-US/cargo/bounties.ftl b/Resources/Locale/en-US/cargo/bounties.ftl index 3a68bc07c5..f5705b0e3a 100644 --- a/Resources/Locale/en-US/cargo/bounties.ftl +++ b/Resources/Locale/en-US/cargo/bounties.ftl @@ -79,7 +79,7 @@ bounty-description-carrot-fries = Night sight can mean life or death! A shipment bounty-description-carp = Admiral Pavlov has gone on strike ever since Central Command confiscated her "pet." She is demanding a space carp as a replacement, dead or alive. bounty-description-clown-costume = Due to a recent issue at a space carp petting zoo, we've unfortunately lost Bonobobonobo the Clown. Send us a new costume so the kids can see him once more. bounty-description-corn = After the recent destruction of Space Ohio, our corn imports are down 80%. Send us some so we can make up for it. -bounty-description-crayon = Dr Jones' kid ate all our crayons again. Please send us yours. +bounty-description-crayon = Dr Jones's kid ate all our crayons again. Please send us yours. bounty-description-cuban-carp = To celebrate the birth of Castro XXVII, ship one cuban carp to CentComm. bounty-description-donk-pocket = Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentComm immediately. bounty-description-donut = CentComm's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale. diff --git a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl index 3e2719cc0a..962f0898b1 100644 --- a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl +++ b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl @@ -304,23 +304,23 @@ reagent-desc-espresso-martini = To wake you up and wind you down. Garnished with reagent-name-mayojito = mayojito reagent-desc-mayojito = An affront to god and man. Do not drink it. -reagent-name-mimeosa = mimeosa +reagent-name-mimeosa = mimeosa reagent-desc-mimeosa = It has an orange tang so sour you just can't describe it. reagent-name-mimosa = mimosa reagent-desc-mimosa = Perfect for a lively brunch out with the girls. -reagent-name-moscow-mule = moscow mule +reagent-name-moscow-mule = moscow mule reagent-desc-moscow-mule = A surpsingly strong and refreshing mixed drink, served in an iconic copper mug. reagent-name-the-sun-also-rises = the sun also rises reagent-desc-the-sun-also-rises = A strong cocktail mixed into a murky blend. A secret favorite of tortured authors. -reagent-name-whiskey-sour = whiskey sour +reagent-name-whiskey-sour = whiskey sour reagent-desc-whiskey-sour = What's the secret ingredient? Eggs. It's eggs. reagent-name-zombiecocktail = Zombie reagent-desc-zombiecocktail = It gets in your head. Your he-eyeh-ead. -reagent-name-bacchus-blessing = bacchus' blessing +reagent-name-bacchus-blessing = bacchus's blessing reagent-desc-bacchus-blessing = You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...? From 98f91498838cd70d37f956e591ff94f5a1d3e365 Mon Sep 17 00:00:00 2001 From: Centronias <me@centronias.com> Date: Fri, 18 Apr 2025 10:12:37 -0700 Subject: [PATCH 301/622] Add inhand sprites for the drink shaker (#36382) * Add inhand sprites for the drink shaker * Update Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/meta.json oop that's not actually their discord name * Co-Authored-By: Failed <158702813+failed5@users.noreply.github.com> --- .../Consumable/Drinks/drinks_special.yml | 2 ++ .../Drinks/shaker.rsi/inhand-left.png | Bin 0 -> 373 bytes .../Drinks/shaker.rsi/inhand-right.png | Bin 0 -> 409 bytes .../Consumable/Drinks/shaker.rsi/meta.json | 23 +++++++++++++++++- 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/inhand-right.png diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml index 930cf81757..24e7d1b0e9 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml @@ -27,6 +27,8 @@ - type: Sprite sprite: Objects/Consumable/Drinks/shaker.rsi state: icon + - type: Item + sprite: Objects/Consumable/Drinks/shaker.rsi - type: UserInterface interfaces: enum.TransferAmountUiKey.Key: diff --git a/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/inhand-left.png b/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..0973675986a4a994f3d837d34a2bdeea479fd9ef GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zMLk^{Ln`LH zy|uBo#XyAR!p+O2547$uGYYZ(nIJXi0-vZwfd@O^i$=aVJK5q()F=7owO?iW%q0=o z+-cL$0S0%@H%m?{cJo@vc)+5sf8Tq1qvH3oC8q^t#a>@{?N{}S>D+#rrtfX%6mL0W z8^x&D66SSq*E)uVATHJN`N3X}91G8W_R(&vVs1-pDCXN5R`GtL4!5fCf%tdZa`n^S z)dpTJTb8+~Mm6l5al6O?yDt}2FU*MSHr%GXDY@tDnHM+P|1xc#QrtGv)HvJndH-1v zK{(jCve?Gb_TUY^fcW<Ny&K&vav9gy9?Ilqu&8c1ZPWMfJLg{^);VeR2aerPj(Nm( zXWBMqB_PoM!I(a$&*s{qus&dD@ufz1ruq6ZXaU(AKnwzxf+vG0Pgg&ebxsLQ0Ecvs AY5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/inhand-right.png b/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..69952d23433b8681579e8037ffd77d46a9051769 GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zEj?WvLn`LH zy|uBo#Xx}d!v5v28?^2)Gfv_z@ZeS1;>^k?6T~oyxvGHu+=_$ZcVC5B8Lr{y+w(i# zC1K6_#EvuuB`~P6H-FjiUGCgY7KYs0_hv1#v<X=^XU+UejL&0&ycVun_5SqHMRSi@ zPJgxQ*e0FXo4Z&$4DD>nW2d(z?uZfGwa(kn?aXJM2ZrCJHZnwIGdP5XMoeQ>Y_UIL zGws^1dBK{kg)&FW?Updt-j9Emoxjm^dqhLJ-tI2vPf^*E4b|S(eeCNoJQ?*n<e0DQ zhiiMj8yr(f_W5*gzHEA^XJlsw9QaKzb<)aAcTn<cuMfU-u0bW+L@e2bgYmP?{c^T% zeBa_XSuI#Hm(eqfeTtc0{A63%x~WPjf0^ukFSiuRbnCKxXD%w>^LKG^`NFi1!A7n( nW$Cg2UtoyxrABzB`T8<w0ofct3<8&eCxa+YS3j3^P6<r_cW<7g literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/meta.json index db0ac608ed..e45363fe68 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/shaker.rsi/meta.json @@ -1 +1,22 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "icon taken from https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi ; inhand sprites made by Failed (Discord: greetings_)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From e796b833413d8db9adaa0a140b14451ae1bdddf5 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 17:13:44 +0000 Subject: [PATCH 302/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4ff3da2f05..d2357ed2d9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: FairlySadPanda August-Sun Eric156 - changes: - - message: Smite Cranberry is now available wherever lemon-lime soda is sold, just - for the holidays. This includes a certain jolly anomaly. - type: Add - id: 7732 - time: '2024-12-19T00:11:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33922 - author: Crotalus, ArtisticRoomba changes: - message: Battery levels of applicable devices are now shown in the Power Monitoring @@ -3909,3 +3901,10 @@ id: 8232 time: '2025-04-18T16:42:50.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36579 +- author: Failed, Centronias + changes: + - message: The drink shaker now has in-hand sprites + type: Tweak + id: 8233 + time: '2025-04-18T17:12:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36382 From f833c5675aafa6b12bcbbe88d4c3b8dbb1e29bab Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Fri, 18 Apr 2025 13:37:56 -0400 Subject: [PATCH 303/622] Update filing cabinet inventories (#36185) * Entity tables, more folders, 1984 whitelist. * add easter eggs * oops typo * undent * adjust ranges * absolute instead of relative prob * woops forgot to 1984 a selector --- .../Structures/Storage/filing_cabinets.yml | 67 ++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml index 70c7647fcc..e8856923e3 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml @@ -1,3 +1,42 @@ +- type: entityTable + id: FilingCabinetFillTable + table: !type:AllSelector + children: + - !type:GroupSelector + rolls: !type:RangeNumberSelector + range: 2, 4 + children: + - id: BoxFolderBlue + - id: BoxFolderRed + - id: BoxFolderYellow + - id: BoxFolderWhite + - id: BoxFolderGrey + - id: BoxFolderBlack + - !type:GroupSelector + rolls: !type:RangeNumberSelector + range: 0, 3 + children: + - id: Paper + - id: PaperOffice + - !type:GroupSelector + prob: .3 + rolls: !type:ConstantNumberSelector + value: 2 + children: + - id: Pen + - !type:GroupSelector + prob: 0.15 + children: + - !type:AllSelector + weight: 0.2 + children: + - id: RubberStampApproved + - id: RubberStampDenied + - id: RubberStampGreytide + weight: 0.1 + - id: LuxuryPen + - id: NanoTaskCartridge + - type: entity parent: [ BaseStructureDynamic, BaseBagOpenClose ] id: BaseFilingCabinet @@ -9,11 +48,6 @@ grid: - 0,0,9,3 maxItemSize: Normal - whitelist: - tags: - - Document - - Folder - - Write - type: Sprite sprite: Structures/Storage/cabinets.rsi noRot: true @@ -126,25 +160,10 @@ id: BaseBureaucraticStorageFill suffix: Filled components: - - type: StorageFill - contents: - - id: Pen - prob: 0.5 - - id: PaperOffice - amount: 1 - maxAmount: 3 - - id: BoxFolderBlue - orGroup: Folder - - id: BoxFolderRed - orGroup: Folder - - id: BoxFolderYellow - orGroup: Folder - - id: BoxFolderWhite - orGroup: Folder - - id: BoxFolderGrey - orGroup: Folder - - id: BoxFolderBlack - orGroup: Folder + - type: EntityTableContainerFill + containers: + storagebase: !type:NestedSelector + tableId: FilingCabinetFillTable - type: entity parent: [BaseBureaucraticStorageFill, filingCabinet] From 4c7ad688660ae2dcd09cf4f3fa692d7c3542e370 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 17:39:03 +0000 Subject: [PATCH 304/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d2357ed2d9..2674a3e7dd 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Crotalus, ArtisticRoomba - changes: - - message: Battery levels of applicable devices are now shown in the Power Monitoring - Console! - type: Add - id: 7733 - time: '2024-12-19T00:46:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33854 - author: TytosB changes: - message: 'added new mid pop map: loop' @@ -3908,3 +3900,10 @@ id: 8233 time: '2025-04-18T17:12:37.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36382 +- author: IProduceWidgets + changes: + - message: filing cabinets no longer have whitelists. + type: Tweak + id: 8234 + time: '2025-04-18T17:37:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36185 From dbf1363195fab09863c06228b9ed0fb4d8f54286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= <ss.adasts@gmail.com> Date: Fri, 18 Apr 2025 14:52:12 -0500 Subject: [PATCH 305/622] Increase base amount of egg in egg-plant (#36693) --- Resources/Prototypes/Hydroponics/seeds.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Hydroponics/seeds.yml b/Resources/Prototypes/Hydroponics/seeds.yml index 68524b15ff..55cec210af 100644 --- a/Resources/Prototypes/Hydroponics/seeds.yml +++ b/Resources/Prototypes/Hydroponics/seeds.yml @@ -932,8 +932,8 @@ idealHeat: 298 chemicals: Egg: - Min: 1 - Max: 10 + Min: 4 + Max: 12 PotencyDivisor: 10 - type: seed From 862a704ab0ea09b33e3cdf138e7034cb294c14f8 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 19:53:18 +0000 Subject: [PATCH 306/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2674a3e7dd..62e6a49322 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TytosB - changes: - - message: 'added new mid pop map: loop' - type: Add - id: 7734 - time: '2024-12-19T09:38:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33697 - author: Centronias changes: - message: Fixed a bug where the B input on logic gates would get stuck in a high @@ -3907,3 +3900,10 @@ id: 8234 time: '2025-04-18T17:37:56.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36185 +- author: aada + changes: + - message: Egg-plants now have 6 reagent per egg at 20 potency, up from 3. + type: Tweak + id: 8235 + time: '2025-04-18T19:52:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36693 From 5285eac44355ab8d74661826a2995a440b380ba0 Mon Sep 17 00:00:00 2001 From: Nox <nebulousnox38@gmail.com> Date: Fri, 18 Apr 2025 12:56:57 -0700 Subject: [PATCH 307/622] Agent -> Corpsman (#34627) --- .../Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl | 2 +- Resources/Prototypes/Entities/Clothing/Eyes/hud.yml | 4 ++-- Resources/Prototypes/Entities/Objects/Devices/pda.yml | 2 +- Resources/Prototypes/Entities/Objects/Tools/decoys.yml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl index dcb061a692..92acfb2bfb 100644 --- a/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-nukeops.ftl @@ -31,5 +31,5 @@ nukeops-not-enough-ready-players = Not enough players readied up for the game! T nukeops-no-one-ready = No players readied up! Can't start Nukeops. nukeops-role-commander = Commander -nukeops-role-agent = Agent +nukeops-role-agent = Corpsman nukeops-role-operator = Operator diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml index ac8360f31d..98fb8fdded 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml @@ -210,8 +210,8 @@ - type: entity parent: [ClothingEyesBase, ShowSecurityIcons, BaseSyndicateContraband] id: ClothingEyesHudSyndicateAgent - name: syndicate agent visor - description: The Syndicate Agent's professional heads-up display, designed for quick diagnosis of their team's status. + name: syndicate medical visor + description: The Syndicate Corpsman's professional heads-up display, designed for quick diagnosis of their team's status. components: - type: Sprite sprite: Clothing/Eyes/Hud/syndagent.rsi diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index d1ac45387f..1f52c154c7 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -1436,7 +1436,7 @@ - type: entity parent: BaseMedicalPDA id: SyndiAgentPDA - name: syndicate agent PDA + name: syndicate corpsman PDA description: For those days when healing normal syndicates aren't enough, try healing nuclear operatives instead! components: - type: Pda diff --git a/Resources/Prototypes/Entities/Objects/Tools/decoys.yml b/Resources/Prototypes/Entities/Objects/Tools/decoys.yml index a13c2eef9f..bea8c61cb9 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/decoys.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/decoys.yml @@ -81,8 +81,8 @@ - type: entity parent: BaseDecoy id: BalloonAgent - name: agent balloon - description: Upon closer inspection, this Syndicate agent is actually a balloon. + name: corpsman balloon + description: Upon closer inspection, this Syndicate corpsman is actually a balloon. components: - type: Sprite sprite: Objects/Tools/Decoys/agent_decoy.rsi From 9a05bf138dd65ec3ec0da42ab16b7253c91acd3f Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 19:58:03 +0000 Subject: [PATCH 308/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 62e6a49322..11beaaf23c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Centronias - changes: - - message: Fixed a bug where the B input on logic gates would get stuck in a high - state - type: Fix - id: 7735 - time: '2024-12-19T11:31:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33792 - author: Plykiya changes: - message: Cargo armor crate now correctly indicates that it contains bulletproof @@ -3907,3 +3899,10 @@ id: 8235 time: '2025-04-18T19:52:12.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36693 +- author: Nox38 + changes: + - message: Nuclear operative agent is renamed to nuclear operative corpsman. + type: Tweak + id: 8236 + time: '2025-04-18T19:56:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34627 From 69f8fe393fcac54b110e78346885610814d02917 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Fri, 18 Apr 2025 16:06:27 -0400 Subject: [PATCH 309/622] Remove redundant admin flag check in AdminVerbSystem.Tools (#36122) * Remove redundant admin flag check * Formatting --- .../Systems/AdminVerbSystem.Tools.cs | 639 +++++++++--------- 1 file changed, 318 insertions(+), 321 deletions(-) diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index f598c8cf0b..8b0a24d902 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -65,343 +65,340 @@ public sealed partial class AdminVerbSystem if (!_adminManager.HasAdminFlag(player, AdminFlags.Admin)) return; - if (_adminManager.HasAdminFlag(player, AdminFlags.Admin)) + if (TryComp<DoorBoltComponent>(args.Target, out var bolts)) { - if (TryComp<DoorBoltComponent>(args.Target, out var bolts)) + Verb bolt = new() { - Verb bolt = new() - { - Text = bolts.BoltsDown ? "Unbolt" : "Bolt", - Category = VerbCategory.Tricks, - Icon = bolts.BoltsDown - ? new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/unbolt.png")) - : new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/bolt.png")), - Act = () => - { - _door.SetBoltsDown((args.Target, bolts), !bolts.BoltsDown); - }, - Impact = LogImpact.Medium, - Message = Loc.GetString(bolts.BoltsDown - ? "admin-trick-unbolt-description" - : "admin-trick-bolt-description"), - Priority = (int) (bolts.BoltsDown ? TricksVerbPriorities.Unbolt : TricksVerbPriorities.Bolt), - }; - args.Verbs.Add(bolt); - } - - if (TryComp<AirlockComponent>(args.Target, out var airlockComp)) - { - Verb emergencyAccess = new() - { - Text = airlockComp.EmergencyAccess ? "Emergency Access Off" : "Emergency Access On", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/emergency_access.png")), - Act = () => - { - _airlockSystem.SetEmergencyAccess((args.Target, airlockComp), !airlockComp.EmergencyAccess); - }, - Impact = LogImpact.Medium, - Message = Loc.GetString(airlockComp.EmergencyAccess - ? "admin-trick-emergency-access-off-description" - : "admin-trick-emergency-access-on-description"), - Priority = (int) (airlockComp.EmergencyAccess ? TricksVerbPriorities.EmergencyAccessOff : TricksVerbPriorities.EmergencyAccessOn), - }; - args.Verbs.Add(emergencyAccess); - } - - if (HasComp<DamageableComponent>(args.Target)) - { - Verb rejuvenate = new() - { - Text = "Rejuvenate", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/rejuvenate.png")), - Act = () => - { - _rejuvenate.PerformRejuvenate(args.Target); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-rejuvenate-description"), - Priority = (int) TricksVerbPriorities.Rejuvenate, - }; - args.Verbs.Add(rejuvenate); - } - - if (!HasComp<GodmodeComponent>(args.Target)) - { - Verb makeIndestructible = new() - { - Text = "Make Indestructible", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/plus.svg.192dpi.png")), - Act = () => - { - _sharedGodmodeSystem.EnableGodmode(args.Target); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-make-indestructible-description"), - Priority = (int) TricksVerbPriorities.MakeIndestructible, - }; - args.Verbs.Add(makeIndestructible); - } - else - { - Verb makeVulnerable = new() - { - Text = "Make Vulnerable", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/plus.svg.192dpi.png")), - Act = () => - { - _sharedGodmodeSystem.DisableGodmode(args.Target); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-make-vulnerable-description"), - Priority = (int) TricksVerbPriorities.MakeVulnerable, - }; - args.Verbs.Add(makeVulnerable); - } - - if (TryComp<BatteryComponent>(args.Target, out var battery)) - { - Verb refillBattery = new() - { - Text = "Refill Battery", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/fill_battery.png")), - Act = () => - { - _batterySystem.SetCharge(args.Target, battery.MaxCharge, battery); - }, - Impact = LogImpact.Medium, - Message = Loc.GetString("admin-trick-refill-battery-description"), - Priority = (int) TricksVerbPriorities.RefillBattery, - }; - args.Verbs.Add(refillBattery); - - Verb drainBattery = new() - { - Text = "Drain Battery", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/drain_battery.png")), - Act = () => - { - _batterySystem.SetCharge(args.Target, 0, battery); - }, - Impact = LogImpact.Medium, - Message = Loc.GetString("admin-trick-drain-battery-description"), - Priority = (int) TricksVerbPriorities.DrainBattery, - }; - args.Verbs.Add(drainBattery); - - Verb infiniteBattery = new() - { - Text = "Infinite Battery", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/infinite_battery.png")), - Act = () => - { - var recharger = EnsureComp<BatterySelfRechargerComponent>(args.Target); - recharger.AutoRecharge = true; - recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill. - recharger.AutoRechargePause = false; // No delay. - }, - Impact = LogImpact.Medium, - Message = Loc.GetString("admin-trick-infinite-battery-object-description"), - Priority = (int) TricksVerbPriorities.InfiniteBattery, - }; - args.Verbs.Add(infiniteBattery); - } - - if (TryComp<AnchorableComponent>(args.Target, out var anchor)) - { - Verb blockUnanchor = new() - { - Text = "Block Unanchoring", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/anchor.svg.192dpi.png")), - Act = () => - { - RemComp(args.Target, anchor); - }, - Impact = LogImpact.Medium, - Message = Loc.GetString("admin-trick-block-unanchoring-description"), - Priority = (int) TricksVerbPriorities.BlockUnanchoring, - }; - args.Verbs.Add(blockUnanchor); - } - - if (TryComp<GasTankComponent>(args.Target, out var tank)) - { - Verb refillInternalsO2 = new() - { - Text = "Refill Internals Oxygen", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/oxygen.rsi"), "icon"), - Act = () => - { - RefillGasTank(args.Target, Gas.Oxygen, tank); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-internals-refill-oxygen-description"), - Priority = (int) TricksVerbPriorities.RefillOxygen, - }; - args.Verbs.Add(refillInternalsO2); - - Verb refillInternalsN2 = new() - { - Text = "Refill Internals Nitrogen", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/red.rsi"), "icon"), - Act = () => - { - RefillGasTank(args.Target, Gas.Nitrogen, tank); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-internals-refill-nitrogen-description"), - Priority = (int) TricksVerbPriorities.RefillNitrogen, - }; - args.Verbs.Add(refillInternalsN2); - - Verb refillInternalsPlasma = new() - { - Text = "Refill Internals Plasma", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/plasma.rsi"), "icon"), - Act = () => - { - RefillGasTank(args.Target, Gas.Plasma, tank); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-internals-refill-plasma-description"), - Priority = (int) TricksVerbPriorities.RefillPlasma, - }; - args.Verbs.Add(refillInternalsPlasma); - } - - if (HasComp<InventoryComponent>(args.Target)) - { - Verb refillInternalsO2 = new() - { - Text = "Refill Internals Oxygen", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/oxygen.rsi"), "icon"), - Act = () => RefillEquippedTanks(args.User, Gas.Oxygen), - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-internals-refill-oxygen-description"), - Priority = (int) TricksVerbPriorities.RefillOxygen, - }; - args.Verbs.Add(refillInternalsO2); - - Verb refillInternalsN2 = new() - { - Text = "Refill Internals Nitrogen", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/red.rsi"), "icon"), - Act = () =>RefillEquippedTanks(args.User, Gas.Nitrogen), - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-internals-refill-nitrogen-description"), - Priority = (int) TricksVerbPriorities.RefillNitrogen, - }; - args.Verbs.Add(refillInternalsN2); - - Verb refillInternalsPlasma = new() - { - Text = "Refill Internals Plasma", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/plasma.rsi"), "icon"), - Act = () => RefillEquippedTanks(args.User, Gas.Plasma), - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-internals-refill-plasma-description"), - Priority = (int) TricksVerbPriorities.RefillPlasma, - }; - args.Verbs.Add(refillInternalsPlasma); - } - - Verb sendToTestArena = new() - { - Text = "Send to test arena", + Text = bolts.BoltsDown ? "Unbolt" : "Bolt", Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), - + Icon = bolts.BoltsDown + ? new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/unbolt.png")) + : new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/bolt.png")), Act = () => { - var (mapUid, gridUid) = _adminTestArenaSystem.AssertArenaLoaded(player); - _transformSystem.SetCoordinates(args.Target, new EntityCoordinates(gridUid ?? mapUid, Vector2.One)); + _door.SetBoltsDown((args.Target, bolts), !bolts.BoltsDown); }, Impact = LogImpact.Medium, - Message = Loc.GetString("admin-trick-send-to-test-arena-description"), - Priority = (int) TricksVerbPriorities.SendToTestArena, + Message = Loc.GetString(bolts.BoltsDown + ? "admin-trick-unbolt-description" + : "admin-trick-bolt-description"), + Priority = (int)(bolts.BoltsDown ? TricksVerbPriorities.Unbolt : TricksVerbPriorities.Bolt), }; - args.Verbs.Add(sendToTestArena); + args.Verbs.Add(bolt); + } - var activeId = FindActiveId(args.Target); - - if (activeId is not null) + if (TryComp<AirlockComponent>(args.Target, out var airlockComp)) + { + Verb emergencyAccess = new() { - Verb grantAllAccess = new() + Text = airlockComp.EmergencyAccess ? "Emergency Access Off" : "Emergency Access On", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/emergency_access.png")), + Act = () => { - Text = "Grant All Access", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "centcom"), - Act = () => - { - GiveAllAccess(activeId.Value); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-grant-all-access-description"), - Priority = (int) TricksVerbPriorities.GrantAllAccess, - }; - args.Verbs.Add(grantAllAccess); + _airlockSystem.SetEmergencyAccess((args.Target, airlockComp), !airlockComp.EmergencyAccess); + }, + Impact = LogImpact.Medium, + Message = Loc.GetString(airlockComp.EmergencyAccess + ? "admin-trick-emergency-access-off-description" + : "admin-trick-emergency-access-on-description"), + Priority = (int)(airlockComp.EmergencyAccess ? TricksVerbPriorities.EmergencyAccessOff : TricksVerbPriorities.EmergencyAccessOn), + }; + args.Verbs.Add(emergencyAccess); + } - Verb revokeAllAccess = new() - { - Text = "Revoke All Access", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "default"), - Act = () => - { - RevokeAllAccess(activeId.Value); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-revoke-all-access-description"), - Priority = (int) TricksVerbPriorities.RevokeAllAccess, - }; - args.Verbs.Add(revokeAllAccess); - } - - if (HasComp<AccessComponent>(args.Target)) + if (HasComp<DamageableComponent>(args.Target)) + { + Verb rejuvenate = new() { - Verb grantAllAccess = new() + Text = "Rejuvenate", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/rejuvenate.png")), + Act = () => { - Text = "Grant All Access", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "centcom"), - Act = () => - { - GiveAllAccess(args.Target); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-grant-all-access-description"), - Priority = (int) TricksVerbPriorities.GrantAllAccess, - }; - args.Verbs.Add(grantAllAccess); + _rejuvenate.PerformRejuvenate(args.Target); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-rejuvenate-description"), + Priority = (int)TricksVerbPriorities.Rejuvenate, + }; + args.Verbs.Add(rejuvenate); + } - Verb revokeAllAccess = new() + if (!HasComp<GodmodeComponent>(args.Target)) + { + Verb makeIndestructible = new() + { + Text = "Make Indestructible", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/plus.svg.192dpi.png")), + Act = () => { - Text = "Revoke All Access", - Category = VerbCategory.Tricks, - Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "default"), - Act = () => - { - RevokeAllAccess(args.Target); - }, - Impact = LogImpact.Extreme, - Message = Loc.GetString("admin-trick-revoke-all-access-description"), - Priority = (int) TricksVerbPriorities.RevokeAllAccess, - }; - args.Verbs.Add(revokeAllAccess); - } + _sharedGodmodeSystem.EnableGodmode(args.Target); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-make-indestructible-description"), + Priority = (int)TricksVerbPriorities.MakeIndestructible, + }; + args.Verbs.Add(makeIndestructible); + } + else + { + Verb makeVulnerable = new() + { + Text = "Make Vulnerable", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/plus.svg.192dpi.png")), + Act = () => + { + _sharedGodmodeSystem.DisableGodmode(args.Target); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-make-vulnerable-description"), + Priority = (int)TricksVerbPriorities.MakeVulnerable, + }; + args.Verbs.Add(makeVulnerable); + } + + if (TryComp<BatteryComponent>(args.Target, out var battery)) + { + Verb refillBattery = new() + { + Text = "Refill Battery", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/fill_battery.png")), + Act = () => + { + _batterySystem.SetCharge(args.Target, battery.MaxCharge, battery); + }, + Impact = LogImpact.Medium, + Message = Loc.GetString("admin-trick-refill-battery-description"), + Priority = (int)TricksVerbPriorities.RefillBattery, + }; + args.Verbs.Add(refillBattery); + + Verb drainBattery = new() + { + Text = "Drain Battery", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/drain_battery.png")), + Act = () => + { + _batterySystem.SetCharge(args.Target, 0, battery); + }, + Impact = LogImpact.Medium, + Message = Loc.GetString("admin-trick-drain-battery-description"), + Priority = (int)TricksVerbPriorities.DrainBattery, + }; + args.Verbs.Add(drainBattery); + + Verb infiniteBattery = new() + { + Text = "Infinite Battery", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/infinite_battery.png")), + Act = () => + { + var recharger = EnsureComp<BatterySelfRechargerComponent>(args.Target); + recharger.AutoRecharge = true; + recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill. + recharger.AutoRechargePause = false; // No delay. + }, + Impact = LogImpact.Medium, + Message = Loc.GetString("admin-trick-infinite-battery-object-description"), + Priority = (int)TricksVerbPriorities.InfiniteBattery, + }; + args.Verbs.Add(infiniteBattery); + } + + if (TryComp<AnchorableComponent>(args.Target, out var anchor)) + { + Verb blockUnanchor = new() + { + Text = "Block Unanchoring", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/anchor.svg.192dpi.png")), + Act = () => + { + RemComp(args.Target, anchor); + }, + Impact = LogImpact.Medium, + Message = Loc.GetString("admin-trick-block-unanchoring-description"), + Priority = (int)TricksVerbPriorities.BlockUnanchoring, + }; + args.Verbs.Add(blockUnanchor); + } + + if (TryComp<GasTankComponent>(args.Target, out var tank)) + { + Verb refillInternalsO2 = new() + { + Text = "Refill Internals Oxygen", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/oxygen.rsi"), "icon"), + Act = () => + { + RefillGasTank(args.Target, Gas.Oxygen, tank); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-internals-refill-oxygen-description"), + Priority = (int)TricksVerbPriorities.RefillOxygen, + }; + args.Verbs.Add(refillInternalsO2); + + Verb refillInternalsN2 = new() + { + Text = "Refill Internals Nitrogen", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/red.rsi"), "icon"), + Act = () => + { + RefillGasTank(args.Target, Gas.Nitrogen, tank); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-internals-refill-nitrogen-description"), + Priority = (int)TricksVerbPriorities.RefillNitrogen, + }; + args.Verbs.Add(refillInternalsN2); + + Verb refillInternalsPlasma = new() + { + Text = "Refill Internals Plasma", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/plasma.rsi"), "icon"), + Act = () => + { + RefillGasTank(args.Target, Gas.Plasma, tank); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-internals-refill-plasma-description"), + Priority = (int)TricksVerbPriorities.RefillPlasma, + }; + args.Verbs.Add(refillInternalsPlasma); + } + + if (HasComp<InventoryComponent>(args.Target)) + { + Verb refillInternalsO2 = new() + { + Text = "Refill Internals Oxygen", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/oxygen.rsi"), "icon"), + Act = () => RefillEquippedTanks(args.User, Gas.Oxygen), + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-internals-refill-oxygen-description"), + Priority = (int)TricksVerbPriorities.RefillOxygen, + }; + args.Verbs.Add(refillInternalsO2); + + Verb refillInternalsN2 = new() + { + Text = "Refill Internals Nitrogen", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/red.rsi"), "icon"), + Act = () => RefillEquippedTanks(args.User, Gas.Nitrogen), + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-internals-refill-nitrogen-description"), + Priority = (int)TricksVerbPriorities.RefillNitrogen, + }; + args.Verbs.Add(refillInternalsN2); + + Verb refillInternalsPlasma = new() + { + Text = "Refill Internals Plasma", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Tanks/plasma.rsi"), "icon"), + Act = () => RefillEquippedTanks(args.User, Gas.Plasma), + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-internals-refill-plasma-description"), + Priority = (int)TricksVerbPriorities.RefillPlasma, + }; + args.Verbs.Add(refillInternalsPlasma); + } + + Verb sendToTestArena = new() + { + Text = "Send to test arena", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")), + + Act = () => + { + var (mapUid, gridUid) = _adminTestArenaSystem.AssertArenaLoaded(player); + _transformSystem.SetCoordinates(args.Target, new EntityCoordinates(gridUid ?? mapUid, Vector2.One)); + }, + Impact = LogImpact.Medium, + Message = Loc.GetString("admin-trick-send-to-test-arena-description"), + Priority = (int)TricksVerbPriorities.SendToTestArena, + }; + args.Verbs.Add(sendToTestArena); + + var activeId = FindActiveId(args.Target); + + if (activeId is not null) + { + Verb grantAllAccess = new() + { + Text = "Grant All Access", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "centcom"), + Act = () => + { + GiveAllAccess(activeId.Value); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-grant-all-access-description"), + Priority = (int)TricksVerbPriorities.GrantAllAccess, + }; + args.Verbs.Add(grantAllAccess); + + Verb revokeAllAccess = new() + { + Text = "Revoke All Access", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "default"), + Act = () => + { + RevokeAllAccess(activeId.Value); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-revoke-all-access-description"), + Priority = (int)TricksVerbPriorities.RevokeAllAccess, + }; + args.Verbs.Add(revokeAllAccess); + } + + if (HasComp<AccessComponent>(args.Target)) + { + Verb grantAllAccess = new() + { + Text = "Grant All Access", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "centcom"), + Act = () => + { + GiveAllAccess(args.Target); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-grant-all-access-description"), + Priority = (int)TricksVerbPriorities.GrantAllAccess, + }; + args.Verbs.Add(grantAllAccess); + + Verb revokeAllAccess = new() + { + Text = "Revoke All Access", + Category = VerbCategory.Tricks, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Misc/id_cards.rsi"), "default"), + Act = () => + { + RevokeAllAccess(args.Target); + }, + Impact = LogImpact.Extreme, + Message = Loc.GetString("admin-trick-revoke-all-access-description"), + Priority = (int)TricksVerbPriorities.RevokeAllAccess, + }; + args.Verbs.Add(revokeAllAccess); } if (TryComp<StackComponent>(args.Target, out var stack)) From dd35318a871eefce133bfe7a290a0b470ccfcadb Mon Sep 17 00:00:00 2001 From: Minemoder5000 <minemoder50000@gmail.com> Date: Fri, 18 Apr 2025 15:41:30 -0600 Subject: [PATCH 310/622] Fix slime hand gradient not showing on the opposite side of the body (#36543) fix gradient color not showing on other side of body --- .../slime_parts.rsi/gradient_l_hand.png | Bin 359 -> 693 bytes .../slime_parts.rsi/gradient_r_hand.png | Bin 371 -> 701 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Mobs/Customization/slime_parts.rsi/gradient_l_hand.png b/Resources/Textures/Mobs/Customization/slime_parts.rsi/gradient_l_hand.png index 3e947f387e5c9983e8d611d141c8b70f17322f4c..d33a4660b68df9f48e603663f8ab53d7d8b8e7a9 100644 GIT binary patch delta 670 zcmV;P0%85<0<{H@BYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iKeVM(9qb_D zkfA!+MMWG-6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|E;uQ=NQwVT z3N2zhIPS;0dyl(!fVWj+is6p~ifZbaWJ1UnR)xST{1`+(f`15!%+ONV#T;D6*F8LZ zy^HZI_j7-a0l8=}z#|aHnWme>8^p7lrp9@nIKnETOngo}snZ3CAGt0${KmO#vzKQ^ z^jv11I6^FxdsymWR?!vW8RDp{sFd%`J1leF;;hsftaDHP!f;Vt$#R|M7?M~*3TX(C z&_ES6n26D;l7C_#L;DFA|ETRxlS?936^tAUs6&Bh`@#R<ceh4qddf)(CxE^e%la4x z0=q!FX<6ULmeoE1e9yp@+V$64z}zS4&8`+b0*1DMi|ei??E#lNz{ry(>Y^?AXnIQ} z;QfrgsQ?V$0--ghx6VFJAAlTnwR{5{90C(%%3gPQcYm<Aw|~!c`uhPXVRDHT77J?t z000JJOGiWi*Z=_lB?<sBmjD0&32;bRa{vGf6951U69E94oEQKA00(qQO+^Rk1P%!a zJBQd<`v3p{vPnciRCwC$+93{vKn#W9igopKg28cq<^uH?6s(`5juRAx+)XwEEF}M@ zM!hC4sehV^000000000@%&g4wTq2^FS!vCRh%%02bJi!XqXSb)Ii<9}o3oZ>$*THR zRe3}K?w-4@lXYFi-J7%ezL#m5^3&EJ%q;Gf1poj5000000001oIqM()+q{+=f>Z7T zt}I}mr>atGmA@C@?w1yD^}M^TT@1s(4FLcE02h9+0T@+U*s75ijQ{`u07*qoM6N<$ Ef@|0%mjD0& literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TR^ zr;B4q#hkad47-{GMBE-48_eCSec_z!3$|mt>CCsHZ&>b4Se`KV<H3k!9R7*-{`_wg zkk<d@I!Wof@JF783N{BDW`%i-0_Pbz(ix5zGdz-H_{dZ6^}xE<a+ULfr>WN7zie_g z{LGqN>m=J6Yws^k+xx1h;qkL>h7Z*;w%N0mDV^T*{_#=SSiTK9-hy_2OJffgep$0> zmBjIl50>e%TgYARe|)ia-tqd>Ype5q3hnun^nTYz<NsV3R$_BW!;$X0iXL(bZv<Mt zZ?HEw|M~WFb$)>|j-+$`au4n(-q_Z=E%*LEZQII*fHQmt_cL^yMDj!(LwdSr21i1c R6)@x&JYD@<);T3K0RXmglH~vZ diff --git a/Resources/Textures/Mobs/Customization/slime_parts.rsi/gradient_r_hand.png b/Resources/Textures/Mobs/Customization/slime_parts.rsi/gradient_r_hand.png index f7a86f47887d409596642f5ea6757e1b03a536fd..743b1a6ad7fccd55ac6810b0c684077b615789f8 100644 GIT binary patch delta 678 zcmV;X0$Kg@0=)&0BYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iKeVM(9qb_D zkfA!+MMWG-6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|E;uQ=NQwVT z3N2zhIPS;0dyl(!fVWj+is6p~ifZbaWJ1UnR)xST{1`+(f`15!%+ONV#T;D6*F8LZ zy^HZI_j7-a0l8=}z#|aHnWme>8^p7lrp9@nIKnETOngo}snZ3CAGt0${KmO#vzKQ^ z^jv11I6^FxdsymWR?!vW8RDp{sFd%`J1leF;;hsftaDHP!f;Vt$#R|M7?M~*3TX(C z&_ES6n26D;l7C_#L;DFA|ETRxlS?936^tAUs6&Bh`@#R<ceh4qddf)(CxE^e%la4x z0=q!FX<6ULmeoE1e9yp@+V$64z}zS4&8`+b0*1DMi|ei??E#lNz{ry(>Y^?AXnIQ} z;QfrgsQ?V$0--ghx6VFJAAlTnwR{5{90C(%%3gPQcYm<Aw|~!c`uhPXVRDHT77J?t z000JJOGiWi*Z=_lB?<sBmjD0&32;bRa{vGf6951U69E94oEQKA00(qQO+^Rk1P%!b z6PZAx!T<mOx=BPqRCwC$+A$7;Fbsv^sA6aH34H&NT);a!^aO8%3%E<^NQ;Chk^XOC zNJyTHn1Ae200000004lGh^U!ar)jDYQCrD8j$_TtpE7rQi)QBUXEPsd%RJAso7wZ* z{>R>;Bwv=r`@VNc-a-K+xg<BUa!Tfi$cV_se%<CW0{{R300000006j|qy6`@?>_s? z?&u5ay81RRaP{24*8Bf!0ZJ*`078*;X#s9CqaQE~1O0aZ001=Z1=lWMb4X;ddH?_b M07*qoM6N<$f>}~61^@s6 delta 345 zcmdnX`k85hay<iQfk$L90|Va?5N4dJ%_q&kz^Ll!;uumf=k2YHxy=C*t`CznWra$7 z96TNQxmy}fGHqa#o!Kynb<X!i3a%5G4o;1K_g6|;GI~G11lK+8M=}hBd<_=t4s)0l z&M^u+XXq$qIAY20Nan$dvxPGEZ*5DB6uVZs^!2Xrc`<Y9El(TGT9!C#+2xu1%u`Y$ zYxhp-s(n^)VbzAeb=&?YHWXZWJUu{!^|Q_7CX3>lwXdzt#ms$MFQG8UZhL{(-S4?V z8_vt{--u7M+sm=+)8YNQjW)k$g4u_|84%$ezZzGczdt|d?o)=_+d_X=HBPz4`{&uj z{Rj3jJS@KI@k)>V#qWP+Jcn)1e^!y7`~S-YR|B^P^FPEQ4E3`+z@GEhb<4_6mqHnU Nz|+;wWt~$(699W>ml*&6 From 14d9a35116ed5a7ddc17debc2985456aebe7439f Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Fri, 18 Apr 2025 23:01:52 +0100 Subject: [PATCH 311/622] ciggie sounds (#32426) * add sounds * change _active to BurningComponent * play sound when lighting and snuffing a cigar * network it * mono * attribution * doc --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Nutrition/EntitySystems/SmokingSystem.cs | 35 +++++++----------- .../Nutrition/Components/SmokableComponent.cs | 13 +++++++ Content.Shared/Smoking/BurningComponent.cs | 12 ++++++ Resources/Audio/Effects/attributions.yml | 5 +++ Resources/Audio/Effects/cig_light.ogg | Bin 0 -> 17354 bytes Resources/Audio/Effects/cig_snuff.ogg | Bin 0 -> 9397 bytes 6 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 Content.Shared/Smoking/BurningComponent.cs create mode 100644 Resources/Audio/Effects/cig_light.ogg create mode 100644 Resources/Audio/Effects/cig_snuff.ogg diff --git a/Content.Server/Nutrition/EntitySystems/SmokingSystem.cs b/Content.Server/Nutrition/EntitySystems/SmokingSystem.cs index d2074a3d82..b3ef8bff69 100644 --- a/Content.Server/Nutrition/EntitySystems/SmokingSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SmokingSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Nutrition.Components; using Content.Shared.Smoking; using Content.Shared.Temperature; using Robust.Server.GameObjects; +using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using System.Linq; using Content.Shared.Atmos; @@ -30,6 +31,7 @@ namespace Content.Server.Nutrition.EntitySystems [Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly ClothingSystem _clothing = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedItemSystem _items = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -39,11 +41,6 @@ namespace Content.Server.Nutrition.EntitySystems private float _timer; - /// <summary> - /// We keep a list of active smokables, because iterating all existing smokables would be dumb. - /// </summary> - private readonly HashSet<EntityUid> _active = new(); - public override void Initialize() { SubscribeLocalEvent<SmokableComponent, IsHotEvent>(OnSmokableIsHotEvent); @@ -65,7 +62,7 @@ namespace Content.Server.Nutrition.EntitySystems public void SetSmokableState(EntityUid uid, SmokableState state, SmokableComponent? smokable = null, AppearanceComponent? appearance = null, ClothingComponent? clothing = null) { - if (!Resolve(uid, ref smokable, ref appearance, ref clothing)) + if (!Resolve(uid, ref smokable, ref appearance, ref clothing) || smokable.State == state) return; smokable.State = state; @@ -83,17 +80,17 @@ namespace Content.Server.Nutrition.EntitySystems if (state == SmokableState.Lit) { + EnsureComp<BurningComponent>(uid); + _audio.PlayPvs(smokable.LightSound, uid); var igniteEvent = new IgnitedEvent(); RaiseLocalEvent(uid, ref igniteEvent); - - _active.Add(uid); } else { - var igniteEvent = new ExtinguishedEvent(); - RaiseLocalEvent(uid, ref igniteEvent); - - _active.Remove(uid); + RemComp<BurningComponent>(uid); + _audio.PlayPvs(smokable.SnuffSound, uid); + var extinguishEvent = new ExtinguishedEvent(); + RaiseLocalEvent(uid, ref extinguishEvent); } } @@ -104,7 +101,7 @@ namespace Content.Server.Nutrition.EntitySystems private void OnSmokableShutdownEvent(Entity<SmokableComponent> entity, ref ComponentShutdown args) { - _active.Remove(entity); + RemComp<BurningComponent>(entity); } private void OnSmokeableEquipEvent(Entity<SmokableComponent> entity, ref GotEquippedEvent args) @@ -122,18 +119,12 @@ namespace Content.Server.Nutrition.EntitySystems if (_timer < UpdateTimer) return; - // TODO Use an "active smoke" component instead, EntityQuery over that. - foreach (var uid in _active.ToArray()) + var query = EntityQueryEnumerator<BurningComponent, SmokableComponent>(); + while (query.MoveNext(out var uid, out _, out var smokable)) { - if (!TryComp(uid, out SmokableComponent? smokable)) - { - _active.Remove(uid); - continue; - } - if (!_solutionContainerSystem.TryGetSolution(uid, smokable.Solution, out var soln, out var solution)) { - _active.Remove(uid); + SetSmokableState(uid, SmokableState.Unlit, smokable); continue; } diff --git a/Content.Shared/Nutrition/Components/SmokableComponent.cs b/Content.Shared/Nutrition/Components/SmokableComponent.cs index e5cbd27242..28e84dc190 100644 --- a/Content.Shared/Nutrition/Components/SmokableComponent.cs +++ b/Content.Shared/Nutrition/Components/SmokableComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.FixedPoint; using Content.Shared.Smoking; +using Robust.Shared.Audio; using Robust.Shared.GameStates; namespace Content.Shared.Nutrition.Components @@ -32,5 +33,17 @@ namespace Content.Shared.Nutrition.Components public string LitPrefix = "lit"; [DataField("unlitPrefix")] public string UnlitPrefix = "unlit"; + + /// <summary> + /// Sound played when lighting this smokable. + /// </summary> + [DataField] + public SoundSpecifier? LightSound = new SoundPathSpecifier("/Audio/Effects/cig_light.ogg"); + + /// <summary> + /// Sound played when this smokable is extinguished or runs out. + /// </summary> + [DataField] + public SoundSpecifier? SnuffSound = new SoundPathSpecifier("/Audio/Effects/cig_snuff.ogg"); } } diff --git a/Content.Shared/Smoking/BurningComponent.cs b/Content.Shared/Smoking/BurningComponent.cs new file mode 100644 index 0000000000..bbb9765174 --- /dev/null +++ b/Content.Shared/Smoking/BurningComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Smoking; + +/// <summary> +/// Marker component used to track active burning objects. +/// </summary> +/// <remarks> +/// Right now only smoking uses this, but flammable could use it as well in the future. +/// </remarks> +[RegisterComponent, NetworkedComponent] +public sealed partial class BurningComponent : Component; diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index add8884a7d..9cfaa54122 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -241,3 +241,8 @@ copyright: 'created by Vrymaa on Freesound and modified by Chaboricks' license: "CC0-1.0" source: https://freesound.org/people/Vrymaa/sounds/785128/ + +- files: ["cig_light.ogg", "cig_snuff.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Created by mattroks101 for Bee Station. cig_snuff converted to mono" + source: "https://github.com/BeeStation/BeeStation-Hornet/pull/29" diff --git a/Resources/Audio/Effects/cig_light.ogg b/Resources/Audio/Effects/cig_light.ogg new file mode 100644 index 0000000000000000000000000000000000000000..48aef9c344a427bbf72127bc253ef6e2d0eb68c6 GIT binary patch literal 17354 zcmajG1y~);vM#(9?!hg%FC2oq2Y1(C!3j=qhv4q+?oNVBu;A_lmmtAHko-fwea_zh zx%WADX!_~t>aOaleygXtXO@zMg&GJ7^snn)>YoClh{pq%1nl;~$;8U}r3&o-`Cm=k z!G8;FV5OIy|9!pme4(Vt6Ck5A{rUf0BhddaA_nN%Rt}cTN=_DJwpJ#Zf7z4Ckg>C} za<g)=v%hcy!~WA4A||d01|a}7Z1QA-{!?)pAP_nT^o|OGmiS%<Qk;}e=aH5q{Zbla z4Npr7AH+9}VjKFejEut!2Lyrv`O_iB6z<DdPw-mc)5bXE@meYJl#;<msBG~f_TA8! z+Ltty*w{}%s1Z<gU_pQ-M5M_>uvK3&lTYNK_&^p$<TOlPn&pH<UzQh$#6C<GB+q_S zl&HveR8|<ncTCqbC5Ft@G$Sj|Hm_+~(+Owb?L5JIkoB(&@vk0az*xlK2+YvM5MJ1S zf|R5=0j&N}iwxuss0n%-k1bP=JyuWjZJJ8yC!-1$=kyy%HFX6I;Bqz4ax-6ab6s@v z(Mb!@YxB`*3(;E&F}Mpc#t;2h`sK5E_mcjqP6h_$QSzqjKnf@b3%>IfKnI6bL4nL( zOhSg3Kmkc8lqq>{U1OEmVp-W@H`c&7)`0T22{4N=FQWnFS!I;`AL+eLiuwOLiC7NP zgG2yZesv`J>PRK2O7+!=5&o}*he5!cil{OUI&r*p=J@I?0Hn7r5+h0S->&6f{nsSC zOgji9!bUXcNHhXiLzQXPiBrp2aM4*|5irGzMgI3I;4fYPMaZ+?r&#+VyoodZYZiZi zEq*?NILbegfCiuPcgZrQGOoVyqGjymm1Ael_J*rx(zchUW&WK(+X;dlU@jq}>4SOc zQyI<^GAJ3v|CBs1GvTYtXMj3_gDkWm0%M?^)l3F_`LZ_9S7$0?zpNb_D1|3w(l)oN z|HJQJuqZdon&{=-26}|AWZJYN8UUqxv#hgkh%a^j6FwrqycsXy4`m0E`NY7PV3U`S zCz80tq9x|B4MU1ZqGP0F%Y&3v322L50{?1G1_A}6|3&eCWq+ak4~mNtBIrly8pqkk z7+<og{t3R5x_)$V6gB|GjGO?9qnr10oNIWcZHk*0bQy}1RAnK>|9BKIsbpqxqHqL% zog_5PX%tclc*TEC+y&Jn2J!TNq{&Mn6-;U%O|vtpy%E$<*U)ma(@Aw*Z4EJ4a@}0? z*<6e^!VCSM!1`~`0Rc`E{MRRwOrqGnW(6sVA^tPL|K&N3*k9v`M&haD8mJUz7{C4G zP`cun#*$RwP*B4$n8tCP#Wh#sGMMEwpVcs*cQapZG1qJL(P{aY!~Ekmn~Sdh;W;lZ zLctreBb@;AZ_ml2i}}tILn)I$rISG8kzx^^QJ$W2R9=AeKRm}WqBJd{^i#yarx?2M z6sz!ziuMBA(VCNv|7ZGd&w1-a1th?8B%P@K!*hDrh{OSJYG72j`bS5>X~3W^l6e0) z0U%IM9E#lEbwov#X<n6cUX@8hUGRVR7=Sv@p)kt<7&aLMA^?FXfk_TVk8p|;vlrAx zVB4pH&F6*7AHWYTMSp|Bi%Q`VCrT^WmcZMOa<!#Oha({$6iv+?Lx$Q{qA#<@g8(dh zFd!8W$e(SPZ2;eCLS`gSVuB4ZJ877gwm5M{2Evqr{{})`f@!*wRX8IvQj~-*7m;0r zX&PP)bOONx|H%1MaX4TRY!Ju<MHLAWlB7BT*^g5lW!ocCmE|qXQk&pKAPyd7gUb#= zhZGa3O+da91&@pFWd%)%(t$u^Jz(HpjE=)h5`<0*+H#<pOyrQmrk2B!oWwR?#8OyH z=J>|JsiLkihNUsDuCa=%pwU9DfTf^tt*(J3sez+0o1&o6Y&XeazO1gXj;k@>V!n#& ztCixq`9?tpxLp9Ku8S!?MhkWZY5!uSfc=*hm&RfXr;3Y)iiWw4x`vLMxz3%2)`E{5 zKvh#%#?jDd(OAB*(@62zcF{1<GGD&a(82Z9TMXI0_1VUM;k-ES3Q&y~%#B-JH|eZ0 ztgH*lDl+IQD#|Nb>?&%i^$HFv3Mxh$EGlZMMjL7?Yiv&dYE4;117k%6V`W3tLj~hW zOIbxn^=Ly~W=-Wu%Q<pC<4K1@MNLg*!|4mPqxxjX@uY**y96>;QhD4_-qB%y(&0GX zVn<Y1aoj~e)>k*$aDLLk(&S36qT#xpWU!+J=wWB%o}+gc(qPBmUHvc$FqrwpJNbdA z9q86*{~D+px?&JE=7}k`$N)xKQJq;)dD39d&|h^TrlR3vkZiumZJ>i^zsVh=w-{Ye zaoj;a)&&S+TO0a7^qG~&V3i9XWH(eJ`<M>jAx_$?4mm#X?cBN+)}kPOjRmj)e!< zs7O9J1C&1x7z9UtfUSm3KS<_+u6j&Xq|OFM?yM*~NR*^3YfYXsM?XZS9wRfHm53>8 z2}zn!h0iZmmbJ-GT2QsAFPSs>K~{t-YsHi_qibD0G^ZPdVT#UvP-HeCgIL`3LI7AD z<Q1Wb$rcx3%gHinjsrk0oDr2SFTzxlDQ^Z?6&K;k$+ERz>)Ep{5CJ`kF!f|0L)dC| zOhXxzLu3G}kr&~AW$dLT0j$!45@cnolM__Ovl3re1;xn9Kw1)H<$+Pj%GQUd>e{j` zWU1P60;2+0CCJ(`4e9F1H@l+iBL5v#b+e|8b@dP+oVplaPPV=o*T$Z0pHSAS`bBv8 zAg*2vAY9Fcvt+^gg`j6AxRBv2TfH!+8VwLk?K<Z(yw3kia}#T(p#_ub7vc2v$q9h) z{T1CP-lQ25fK`HO6wpJ@w!I|98X#n-MmF!SINNgG&goXY$dCh`5YDmfH=4kz;|~oI z@kcbzds#wW+*b6H>V%9Hy3;r>J)+n+FKxM#ych(cF)oTg-8{hyfebG2B2X9O%F#0o zYT7^`fEG+Z-0|0K;S|CL!APh&h#(2Ti-*X7bq9{17(ZwVzX;nDouU{Yn3rN~Q^2<P z&S+xv1f~<BbdX?WS$aqax~vR!F%Z%s5dra>?NpLB5ip>C){%E8CMay7WG?FL^ccbN zvb5y^fJLia0Vos?j_X=iH!X=EREI3E%TWVRcwaq`rpo{VodN?o{kx7(gW}*pBKU=X zTwV)wlX2cdA`W0>Bnn2OAIb_s6GOlOh5<aQ#(9AZT?`-q@m_uqkQFD*ybx4nkH~;J zNU_TcAxRYp1fq8UBBDAKGv~ngJYda)0(rcwnX<g_`AJfcA+n?dRX`k|Qn?cfV7o!h z7ebQmDH#9_TTVB009He~;<D9)+BP-h#S11?oQnX6oA)zpWC4QBw{{R{4Hh0$2mM-- zixwY|p2O^~68>a>8Kc-ju}vb_4zk1%AcJW@j8lUD5_$j+*_Zeu3LpTtLjZyIfaoR5 za*p|TVDj%0;{Qd7av;va&;*{=L-?-|{)x(^F#q0~+Wsp@Py6TgKVtTONALezNzbMl zfZTs(Adzk)c+emC*P3s6AcV+_FFK;50fAnB8Zcrw;^0uoVNozJJ^A9YymZt6N+1vb zK7dCj>B^=%tE$pd7pJ@|9do*}OaO0q>f!}eYd{JgLUGgFi>M`0X-M&cZX^@na<ag! zNfc+OD$rzb$)t*{Xhs$APkhrVz=3pafT7zkL7Ep#qM8Bw11rRWNhIfjE;4A#-T~w< zUFR5@T-4Y%z4dpl$$?;7?60+7HU_G|T;#o=g<L`wK-CLI$b*4t_@^#7?!W8M`40Yp z767P&f7&G}i~WTbLOxIjAqGH3_qRk1lo0<3;QoR!7!wHPk^s*C)Foj8GX92lNvbc1 z1WfZn_zTs)B}DQUbNy{h{!ibRSP+0H^vfztc}P__N@2^f-3P5~IV=nEM*)Exm#j}9 z3&UiCS-~lC!EsLLCd?SB5xj5f&7}zj@#mA+im}yHZ4R?cqEwW!O=a2otCBQj>EZ)t zoT{4L#(_N~83KqEo%~IJ2pAiG7!VW;0|DjL^-Qtp!@%rfvLm4&eGPV=v4RGn2M?pf zf6_+5#Ht7=FyRAf>%SX@_eY72Zi+-cWbc7BSaT%{CW9gWGzi9y^AEzZ|M(qMsjU~0 zPqG;8@0NE91R?=}5>Uw~C^C3s&|+W3p~qt+U?yTE0q_NZ>cIZ5K>k#)pFVwhA5+-B z15G7i7F;y23q$>v{E{Ic{IgYo`CI<imRR~9^2?U^MGQIx2@@R?Gs8gl6de^cGuy=I zK<^+O9UTiJGc_~o$k^z_^u_`;4Gl9Z8x7qlqe_1q3<a2-xPz2EpG}VIR`YUwjC|#Q zamA5uqMIketYB8>&FC33g(DXDk&4q2#^*!f?sTusf^^vV)t<wTm7*9N*HpCTkRQ(- zRPgtVvPOx_t4kB3ztOMhASLnRQba92QGNX-C%IEcjS|1M8(fLJKA7IKnOU(T=YH*M zKYyF%ir^U%_2$7pZ7VPo{`PUMIm$3Pm<`eTQQ5>*mIqcuV);+kX@`P>wePmyZ&f`m zj~~(#$||$Nd&&V!WyH$_HiwNpCI=49x}-Q@a=!Y2Un(5ubkt21uG|@Vom8-V8w1OO zXN0w`76UQ8^@Y%~UfFrEQ$?d>Rdf+Sz6rq{+#e+ow2Al2@$e7~?EImchFGTHsx(d< z7;G)0iPd(dKgyB{8(~l3b^0JwJYVUqn#ZT=XVfFPrr#K6C2hcTeMX{Zp#%Aba7g}f zEH)dYCnqG?as^+C%!C?*m{n)Pf(X=I3(4n7S5fIEjMkTawybuhk4%j<Gu9|{gU5K` zHp)`xKCBRdp@@smxC;}ra3sWf`M5so#xLeP@>yD<dtx=CO+-?0jDKoM-4CT2Q#@0% zh5GdC3g!}$*g(aejN_)45z0`pN!a2xUV;RB`Qsz&Cdg}Ktq7%3*qy_`u~l<uG%9hP zDy{~3V2ZlTv>172_S6Jx-r@dYJ-2Z-O`vPX36v57Q<1VZI?X{E6CV2Y=bGWrV8BMm z2NA7K8H;8vDd@VO%bdYuF5l+*T?5~>)yL<@_gCjsvq;HT1G--I4qQJ@*x%N|d1*m3 zWm0&h`Oh{5Os=zn)?;kpVHAJbQL?L3HpH)g?6l!O08{U6naD+z)4cW0pQ#xkKWgaC z=BOCXr=L+x7pggg>aG4m(Q0q+l{y9u@<Op)h`&X7dTUjaFoIKk7rOoFIjdL2kBoNW z+~EhjE3=U`YY4lT0y|ND*q;_jT<-=PPRkuev`FwH*-apEA$@VtG|jC1p~J<_PS$c~ z^F>S1gK4>d(fdQDXA+gby&}*x8FBzr5605xdBz~*x`(e{KC9D02+kU~ANzR_jHWpe zi&v0gh$E@}l_T#|otgdPMR@xRV@e$Z4W&}DJT;Q^DnI<js&-*Te59&nyIrL)82&Z( z1XUF9v$L55_r#SSYV8O@JBpR0_7yREn3QAQ();1=c?|SOG)9StS;3aYmn|ek)9QP( zWo)3ce{yQOt>>+Sdmr0E$mHJ<HMnG*!t&aG(2g4H86qL`*h77h9w>1So-Gp~wCv%D zsj>BFFhP=rR2=hkm*=*U^{Af)?FT6-{!!d7k#SCGXB1yfs<6m}q5f<`^!At%)*Q2& zy*vrE1>vXKdkjvrpG<+6nNPH$Cq$`a(@g}f)vC?UYQt-TjdyYtnA5U@X9LD}Gvbpa zUZPT0ySX0gvt!Me+vD+&*)Au{b>clm`0haSYURc#S1L;5LkGxEQ{+m-{m05G8R;i& z&kW*UucOh%CrKaA@EuuKth0Fy=btUqZqc;_hQPid11ho{JX>m*s9#U*>d8bEN_@=a z#>nCPE%a(a*23(TvUHzWOK79Z>ziwy#BLlr9)IzEx`)7qL?u#xaQBsiCvO-`LoEKJ z;I06DkgZE;Bb$>-V6pKDBh>?otlDRPeLt)s%=FFMIj0$82H9v^;mLLpMR=jJF1?nz z`5$dHQw_1p<Mq!9=ORnNHSVt-2WwNrBupZ#TV^hozekr^z&1}!iUqQGgKORldJWH0 zGI8-DV{YqSuxma9+G)g_+Zpv$u`aqPK>LQkOi07P3v797cRA+2=Ce$!QBdbiSI4en z^U?f(_tWobGB#+se^0|^a(3UbQeEd@RHA!@!=dXSdKOLhBc~k~IY-2UTrpjqM-khi zmJrI2j=b83ZogX>%o?ZNL+RSerz*<|x7u(l)YFTv_uSu}=2#sIhde&Fs=@D2hdtr% z(I+AVG3-&bKXAGd$PP-385Lhj2-y$H$GpjNyB-={^PJ5;R#g$wkU9k^s>C}tE5A~h zrZ(1vnS8|ijJymV0R=2wFe8t}E>h@%L{x+^`fXOc{?@BM^(i>?KzFyf_uiC0Of#M@ zk4no+Ye(HVq)3I<zr;sEzBm=*@(T)8DQ~(v+Ru(|Y2#7rd~=(@(T&R@5O8{}6M0F* z8-rrzAp8LNa;xLF;6<2V|MQpmumY`SpUv94AfMPU5=ZHFBdZnTd7eLAUq@}r3|aA9 z{uBii?JH^8{KTH_{UG9`EV*ovbf<!6+-%dj7Q7lNoy6!WHxpU^=FIta3B@u6M-y$1 z%dL60GmefUNvx7Zlcemyln^c7#=i@Rc95L>O+0uwI$%@&#Kc#@VQ+nJ@wRKDwxc-; z-uDb=x6W?5ZKmEQ74h2)->)m^YVlagSl68DUg{rc5ex%<GT=K7{ct$rv`6y>oDSj! z>o!}$n0*ZoTjsO*cuuv|aGXO6PkA8@8OYHGQ#>L+Unuj)u7?Z}Bz}#r0me-V{0C<I zk{XUKc*%6_=A`ZLEb+H*T`Ps(o8WTb7b+muFzfKXP5hl^B`pe-i2AZ5ye%=K!5P4% zRQEw={^jO4v2kb+<+?mJ+vl2=x>ljCrdeGTi3qe~3!&1Nny6;pZ|Er_v-XpGBdfD4 zs1;j!Stt5Iu5sZ+tSP=4_7uO?oC`%v!t!Pr9*QL$-<vAhh4}bXek#A}&)teDA6lHD zs>G5y^dpsAQMJs-Xc}*KF_gbk#qKC|hv{9Z4cT0|@O_WTcec=II1T5HU)3GkqKP$d z*F?2bZtvcr_Ep5jqpj}8h73TKQyO+nGL5*!w6BC3TNZUh?Zn@ij4n`tugS(75y!*? zRt;{xed2o*@U-Wp&iTlccQL$5Vnh0MiI(>M#8$`cCd28-QIY~s42wU)jV!x^7a#Gq z*Y~37V^iZ*z+)$LT)L3H3v!svk|hKXzb7T;47TI*K|QJad~K%xO}pt;W%BQ-Y}Ht8 zX--A`YE#bf($@+cqsBWX*Hn?@L7pzruzl+%I4r2I4h*E1z7P~xGHh#Oan?W9thB+8 z5{J84mU?^s7~UrYc@FLtCZT7-H6ef8qT58$Bo+6YDpO%LawAvLLmF=Gvbxh>E9-u* zHc>w^_U4b-=lZPM(hp%&sWhUQ#c46gM2R0dCf_x)<C~#}ytaDIQ$Dv*JRrge)?j%O zY#}y_O`HZD+ZaY5F?<gTn3Ql8rlYVKpFqXQa262l=dj_9iZtaSTL1NVLPb1zWJh)D zU;)W(!k&ibm9-w_CwUCth(3c})n7-$x5`5^!?p0G4#J|Sc^Su_oy7+!;s|Y&&aK}< zY@1A}NzzE32dF4sr-<}~NjNl>r-SVHG*1c~b(J0N_DcBgHafLFe>VE^S<t+-b)3zj zgi(pg`6QzR?2PN|86ScHeaB;78#5jKWnialOG_V~)V8#?ZldCV;`6E9duTA!?2^_K zdi-t1T!=srXV+kI>zeuix-gfg7<FpMRFx;~kf3WUKlQI|OB81@#U?BbaNP~J92YT6 zi9ND=;`GB9)OQUZCkK~vVxkmztY-U=QQ@K7tyZ*@ggQdEUxXBT$0<sc=qKA|gd_E^ zlrF&Pq%QCj1VvIOa2m-AUa4?FNmlCvUpSibUR;Q08j@rXv=$k*uM{d)bF<*p%GJPg zrgXTJOI5i~c5sd7#(JG)8eA-&e1NOr;Eosc`t8TmtPqjqB2>4(Kfd|eCp%+({;+`b ziGXQdcar}YbdV*PS^$MG0#E#5S$lZobk*2B=l*y4!;oR-{b<}&UgEPMm_pImQld3r z5!r#m=8R}-U@WB0-oTl8@ZJ5jFny0zHE|m#jFCx0>A^muNup#fv?du#G0sUAc<QNR zJ#WJ$yh0A!f#U$Fhm_*5E8a&yDZXy$-XHJux;p5eT({cqv{UfiZ+w6D@O<r2-AJqb zE_xe=n#1C2n;~XN!H!qKNOY3Z8Jf)HAhnzo8-}3?eM6wIOV0|<S-FLgu~FzMiSS~} zS1*^%yS`IwA$_*}Ieh}WV(C99WV!R=*Fl?HcUW_b=jZN1ES^XN{#sZ%;l6BYxgNdm z8Z5A!o{Lb_q;phoNGc%Ap45$Mu52-i?bz+n92cvuGdSlXlT>6V8c(~&#vf3-LgtY0 z1w)X(Y<YKeMQC#%pxgI%VoLFEgAQM9WP1EKUR-ARGuC~#x!AZebQ3wUy+x^(zbNJW zTEpfXgy?g_o)P<CSz3L`r>=gSErA@K>qY8Eg4GgdFM3TdaDV&$PykJwYaM-4BC7rl z29qg6^8_){o6zC_mC1gjuIZV&?e^)bI_uRqi$x6caN8>z%|2{g@)7;-5EEb7k_y_E zkr*D#C6$k6X2BPC;dgm8@DTwug#BxhT$whML}+iuxcMqs<UueSIC2>LkpgI#FF<3j z$|{o^K*mh@s?kb-1>ZM&)Z}8~Vg+K>&sgy#KOatQ*$Hx1)mmiMXTS41TN|cP#pEQy zWbj?98~!b1#c>o;!bU(`s+970hNjqq8wt^y1y48fM`4ce4l-f*XDYaZ35}p-OZY{j z9K%d+j60gSa6S1wE=1m0*s0UmCg47GBp7Q2o;@X=l^u;nJyjE6S+aVWxZ;8kswVdQ z#Kb6hLxvlxer%R9ycJ3Q!Er~;5XRMd_xdaX%CqRtdPx;*_~ks@rG&G!k}$@~D@!t2 zrBx%Ep2|jl66l5GUFziTbX%}HVJ98@LL2g>)8TBaKajNsXLMg9rLR5ZDjJlpd)V(j zc*OBP?EHBp@bP2lbW3bJ{ncL76J-rP9sRFP${ik93}p?sKVua$#`#6#RZeRaHDNm0 z5Ap7!<bJh&#H%dii#ZM!tc4k@)r8QD_K4|~$GcCFDhh<w(igE6au;;7(|tCF5I;Tz zTr!GPe*!m!LMWP{)_IbpkrbC@vbyO|y-cS;d^YGws!d8Y5azwcE}p*`cvA8fuKO!Z zs!{u6*5Ha+GJ+tC$;f*m5F-vJHV6JzRXZFR)zZ{f1h2ycpE2A*Hv+PhBbLK(^`RAB zEfO}496kayib16bDZ30f=wJmO^Q(4w@-Q9(Nk}ua@g3D~mqB%yU2Jz~O4Z=Krc+mZ zi8hCafH*AZ2(B5fiaQI90DhdG))rCA_n<j+BT+$4|8UlGEUV$>#c$h5w%#pPqUTCE zXNNqFbxY9mw+ug`xKlcxbq!KLyZA=iw@N7zVp`7hpuH~{{JhnbiU)79cSeIc8l8r| z>aK`5;nfG#)R`e2b`ey7)Cp>3awrLqumjFAgJhq*PH#>>e$*A7_<qSc{xnYYkWrUZ zwxns61B>>4JoW}f1^kF!s|p7bFvxMvkB_+Qj(3HUkS&3-$7ogG7Li}3^xGqONgEn; ziZ2J5q>I2A&*tvODjc{sTHOyyIl3i{>U`Rk#U9sgwO)F!ab^hh&w+w}(7z89pn)RZ zz0R#LBMUPd3)A@6w{H_86STnb0Xq{5D=X_PBakz*P_wWxQPa^<v$3*3=%`s)fU1{z zDk^3cR(4i478V$SvAl0gTF7HUpgo63x6Ywni_fR00<?+l+)1rFE+!(KQ)fP(_E_V8 z^LPMl3v;NgXhx3Eyl{>LT%HmXObXI1cERDp0`$TK7W~%ONwp6rhoXi7Ovd%_*ZA(@ z)nF>3#zhR*=X=xEg~)L7quGVa?5Xph*k_q3^50K+0ZAE^gXL5kfWPC^lHG#*ZJG$l zvi<h$S7u6HDYD@0n>z`#dsj)dhGDX$_C09%36~VA)cZ)DXoGCYeahnD3hT>J_YFWt ztQKak`=yKoy1aRLVh!D0*xQ8A!QZo|>&U53*Z-sq+<6m3LM9!UJ}Kuvkj=C|+$d@- z%jQZx7A&-%M+opP=(Nwx^~;%j<IPk5`4*Is+>{;XZH1Hc6TB04y6W)S2`(8#&lu*T zr;Dr*;PNrVkC)#(lF7z2A<9U|(9ePpes;BpS=vC=ya1lU`B<jPNe1N}%u%ARY3vd` z`u)azdeF<Rw)%&Ptf0u$^@oh_viPr3W^nq4Z1RnG5UmPLWoVRfo2AR5>ZE=<<hG7? zNNlaAlaqHTbb%Kmb$-Ax`-Tq{B$m`AtmKs=x=?>qkz&$}9A<VBP=8S6o<^G#JFSK4 zHTp5Rv4p`|+MM^j15Imkp9J-c^7JPtCuAH9VG{?lXp^Am1tPI(Rv}UA@+g4AKK^!U zaQ&mbQQOVs(V+LdD1VZ$hHpzai@PkVSTes(LQ{0%1ZAi`3NeRYvD-}#m_ZEj6)V_G z3@BP8%c!)(?<|=7(qzy?P$8WE%S`h|9;_Iu{{30Q9vt~e{Oe@HR)u6}Zh%+dPEWUe zowjIszW;pvxlHo#uhaKA*hhM>zpvnDKS_^=l0Jl=pk04Bx#3_kzSW*u<%OC@uvZMz zEy3_^1@Q!`d9AIiq*fI4En&j?CKFMlQ@!hf=7}sHm}CTx);7tzsNf@Ak44!zK5YH@ zRtvw|&-X3&axc~|jNe)RLuZ<M&IkJa$&jGABJ?4uc;;xIM%~Y8h0iIaYRkJCj71#Z zK6s;2ORjF+>Xp|2%4FM<i^>#Q??w-${yNV0gJ+#PD?QL*U&3PtCgcn07Q#DK9g&2x z(fM<EIT+R+(kKdbi1%ShUS6_yCuLElnr43@w>rK)tCJrzPxnC80v<~sZ6RtYXGF>j zf)|R7Q(E!KU}6vwRkr!6AsA3b>XUFFm{iJPX~_b^pR1a_7PF8OI_7k5ef81xv7sbK zh;`WWaneelb`|%{&CX7uL_w=2CFkP%g4V24d4cya?1Htn>hG!G=qSH`+Q6#mh}8KK zw<2ToWO~$x9L(M9TqZ8g%HEirbNP06?IY#vmJ{a=S0mXFIsJJ3T3-Uf8ee9xU*Q5s zWEMe<*)8RLWaPlo_P(JAly0NMB28#MTI*O3yoo+sN3kB=U^oKdNb?QW_)-rFzTz(C zhPig$E$%`9HHCZS@fO%Hc`dH=4@yJeEBpzYet5Egii$%{UH-wmDtG4~`|h-*Z$h3} zsi}6RvnB*XYdSw#7dSlLjZc3+Z2J@aBLtlXam3tJNq=)bU`N)LW#NyU21PpwS=xZ5 zk67`QXBIA9n!DF``hq5*85R3eXC)cVQ9`FBQx6GxnU3iK;-}JVoz!Q88&a(+FnH<0 zen0gAk--D@mCGJGrdaxlTc!N8PV2!UId({OUSiGc7?&~Pb5i5wR@!vyj<<vtp`yTw zRL_GSU6S~o>?W1~6o^EVsKf+JCg86%u=UH%mq5wCo}Q^T%V8WO$4&dTtIP9h)!W45 z<JQv-5o4)B`Gb{K;ig9TjTCBIU1#|!AtLhck@f+;LMgaj(Q*1ixPq1q3(WNuR{UhO zkIJ<d9qCbOWO(pSRCLheIDW?4sR!f@GN}xQjDoWRRLBvNI3vPrM41N8laaF^(A41S zmul{GeYh?BkxfI=IZ^i*G`T0XtupsdacMu&TAFay-__n>@hkWocQ+iFD-+asjw#%3 z{QQKB1WO2V3n41f{*I7D)~Ol<pK~&7Tr^EMl}g-iE?AhH58C@fEbz|8dh_F@v+0)R zBgIXg)hd;~)x3+PGkx>tTa;opq>AU5s!^J-k?r`0DJBl3)#l5=H{RY~?oESUDLYy_ zg~jJJsVc4?X$Tc-YaUxfghu4@L6>5G!{S`07qWxw-QksovLIG!M!oB~M93auy_-}V zVxV^0e&9(@;v&Vpy4Q7P*e+p;F^M{Is90${EKvE=6xtG7&|2q!yWrg%JisQ#m@mdr zAK+3ddJb|ytyKw~F@}?2x5eGYJhS(%b3wJ?d$qV<=qDBHVDhoQQcG5_7p#vlCT>1p z{W|JfnK8_G`-Sm$M1rG-u%RLU;#DFsoL1T7c|BqQ#4++7R+D$<oLV5bkl1x8a%`3Q zi64<CY#K!=DGIgTcMLx(z!Dg8;n8Ay(x0#1qf&lcY{>N#M}Czdg~MIJVEp`Qdz&V* z`-TKWg;P7fnxk(l?s6<H!uKKDXyZ%02PLoIq0uJ+#Zt7{@4Xbte>zCz6}XzSn@Q!P zt)R_t+$p8<Y=a#(ztZ*RF2p`JG+gmpAyXRL*WN70u+;`ftt~!~CCy28<u)V25WBxo zQqT0Cfm<gnF5O$9KNra4waV>sVJwy#-1<06DFL6t?X_6lMYPEu97l{z;0}H;Nz>U{ z@-raI?&m&nw&EWaf<}|Nu&sG~Sc@^7lu>rVJ6bO(W+k;-+J#BN88dxFB?-5E+)2Cl zm~E0O*rq7o9k{WQ+sA!O7X_g(Td77S^vgfuc_<OC6994GxT}%qCDgNia24U(DS2S8 zPg7&!ZjSpX7;jw1urr(d_4W4jwDL;-LWFqz6apwAWL%tvfVu~sk)*H5<pjKL#e-i- zkLc0$CKO7QQlRZVM`qWsSr1L|l>#w=&_$1Nru}}x=NVnCUx!bUFsCC<Zr{;prQ$g1 z)$_iM8KVw>yLi_oQmGG~p}g?KN=~VQxxJnARF>X_WLbpy8F{UCZ*&LqZoji^(OEqx zn=b<y#Sf4vS((Q!M{~V*c0sbqtMAb@nMXN^(<=GIzh|VWgBo4SM~rXmK)}kxd`hUn z>&>el`e!r^=7i%0DkoCdA@wfMw6%AzSTp78bT{J<R7{X9hLHvs<iE(^5C$!5*jdqE z-s|Gcd-wTyOUtwQNu(PUmD}qV*D$+^`6_%9PUNQ+IkRMkL3hL=XETbb=+|l2LVcH& z!{QqSiPx9gS|={ZqC?CM+Elm(upnC;clJq)p1uYaZ2ig2^vW-89&Ln<crK=&d7ttA z3~g6@su||J{Gza0-yN-IAr5lEaep&81VYUDC@ex#Tl3a*`8D22?t!XbtB8Gz=H(8T zyYL(iR=VwI>d+J7d<TpRP9%mN6jj^%T<L=!cPDaJPE+23F&k$dn{2{SyKj@CQn9{S z(2l2`cEXnug5(L@-zsUd_BB69@cEJQ{B%iZV2hYl?|hdzzbd&M=_`JmY<RHT%)L@& z{Ms`NB##=2!H;P<Wq$g)2O;f>fzn5uVTp6U#Zj{Y(@ztZls2%kfK#3zGF&jBNO?u& zMsQRovnJ}~UhkU11vmBC>QJDQpEMA`D0#hR%y<4G9SQ72OoZdEdMiU;P#o_!E(~&? zutB@=x3maiT1rAj%jvJ>`K(btGm5*GSG5Dp!S=Kw4K09CTP!H<4|gSmJu`K7k@Y20 zqqr_g_;EqP;atzwSk2JkdNvj(b}v@ijTE^GLk<SDKb}p#k$Nl8*l`4cyDg-2WuCnr zbdORWj`Jqa&ngin31iG(EIBH9(dbqMy{0$dUKCGfM7dD10nS5*KCZs6;o%3taH}93 z3~H^U0KD?MB?f6~Y40cA`96DW!eSgXtBohD22&wimg_7*Z7wh)fqNboRYyqwcsoo@ zueUpyjIw4+EnM-a5$;!hhgxl<6mxS_bpm9Uocj`*J@3e_{EOYM{eKi`Y1F>#5#KlE z{oy~kRI0$Vzw%;TUuto7{H0K~1S-OCXL|)gMLX4_OpJB@u%{V*#Q8MGkDR18m+W&5 zaVuHRIXx-w>|*QP{mED23%11>%g;Fn^~@3OT8<KYTTD1Hd*FJ{@e~A8s^JRv_J=UO z7gCAv;<5%&ZC!B%QZQnzMh<%LI()!SZ=a9vP;7OKa<#GtR$M(A-KpB#TrY-(DvOqs zmXM=Rfwz?J!Y#kNx&6_L;M-05Wje)4!B#j0E~MfaQ?Bw!{l?l|I1?%f1DTFYG|-u2 zH8@^=TV_rlnc!(l_T$EKasRPf*qiF@K>j8ud4gK*92|0w0P$N?N!_&eyE~^>@Mu$) zXQ!S9O+W7E_Gw=;TMB#)N|dW|C(hIac@rZS|6mhAHJ)A^-hJx+s%4Sdu;Uc|YiIl; z8ZW+^9@;W|8&86FN3_Gl9TYk!7{guUwLkXImk<6f&%V!BKOFyXco^nfIX}OdZ8EsS z(98F+;?^|y@$nmH#r!b=C<-T1MG1k5yz#0_oR4K~qt$*i<H{n@Ey!;xvvb3EK~ z-Zuwtdm|!+uN)1VpjLJ=F4#($X%kNwwl*<zyo|T%uEVo1nndU=T=r>u=neeV?OXuH z3CbKF0SeF@ee$bB<3RRZpv(S)r+r!)8$l@3nHrLsy#aec#PRQ521@UrCp342W|W&? zMsm4ygLqa*m2kH^SiLU;;vTa^*P&n2mOZV@__6EBItZuxo$;#XlBnKk?U)QGi@=>h zDX1ta$$D8n>1xl3<#T<bt$LT+hP_snOVbewsqKucZe6C!khNrPF9{5&2nRV&aCBcx z?>2^G{O<eI($DBCWXByI@BL|~VlUKo>w;0|pRZ0^_hVSz(twjNB*7drx$kD9j5(Hm zdA>{JC2*|s$w~=uhCJo--1XT776=fbx=%}iU`yV^O7&b=?2|Vxkeq$Gz&Us*lqbw7 z{W5~ood9|ylM7$BBu8;R?Yf{l_~uHycCdbpgE7#NspVjsxf|&~x4n8;d&@9%lnYh^ zQ{fny24;d_Tb`6B#<iGHkPc>3?CV43Gmi<)9F|Jdp)=R01^JR0VAE<DYjlBw{90)x zkOU~jCyG&#l;8LLFpg;pM(^)St-IE}h^vlIeTOx^sMUpJRkmbw(d@urBBi&CqvVE? za!ReL(c%<$x>GZ`xwvZa61UItMNU?2*0wqG|2)69GilGlCzkgThQTrF7mQB7z#PuL zOE0?Gmo;g#sA54YyR);3#(8>F-4`>tI;1x&x3Nx#Pv>JKG{YH#ne_hwgC+Rh=tw=- z{kgfQ`E-1@@uXvCX=7;f=I&jA=+ds-dl=P#o+i@;dnkPjcSp)$y&xJqpFX}<zH4m` zEmmFCR)Wid4{vfrpKG*|4B60AjDDiBWDgd`!=vET_V*Twwm9@`1j^^!TGTrCCoU_I z*sjMZz#5bkLOqpy<yRxBamTl1TBNIj{?{?X(7%rvUcP785mnA$2hI&x#-?VbMkYt8 zX<z<W+1OYZfdd8BN#KhGHkRpW8X6ipS{iELd|`Tmj+up-ilDXu#_Su_?3WLSqaOU1 zd`u)Q6;wiz$inN|B17I%M}}C2Cf}`WcI9e<lR)z1k)P~9heIA-Z~0<7{oH&fHXO)@ zU@Kd1J@{hVNKEZ!vvZ#%4&h>66=^f5Bg^B+1%yc#aZK(0Jn(mV{xE)F#^cj=PbSIw z@x-$;SX-Y{*PTc@XL_qwJQpJYq>nR(J_#;*$M_q6&!N+(eU8hV76`iZTW&~%4HF-& z+IKZIV7pUoY1_0+yo+Evl8Ji6ej><iQ8FD}zvGF)TW(b3n2ON|$IHfz04Jfc!8e}v zoNS`Svfb<W$#UMd3mFpXtFX3R(w*8M&aCP?{v;{*ZcJ-ilNz=(lE)CY-IwiSa#7N% z)GhEfKPKa}d^6Gk-b%QM-8n96xc`g9-f$I^gr+8>W@RzAtjQDUL=DPVL+RVRlQX_@ zCa$$!hN}wEqYt^R=v3@zf&6ZWmpgJ8k8R)vCDYk}(PtcKqPXgvRwh<ap8S&wctnHt zH1!E}$I`L2(_9d+%iN7NQy2Yd+;ez1zcGRqWv5pzgPG3>>p*vTTzt3iC)c(~yzv#O zT+_*9bofNmX>r6z(B0x1K3dG3Y+JS6ZL#jpUQDEoAGso0X$bRbO<<<8+TyoatF44L zxSFz#<$P8u?R9UC`YODKd~H}Dt!El#FmI$v5m9(tI4GBOCuJ$rcd__#?@gHyKrOeD z*$UBta{^_3t|+3`Lxb+a)N3k<cb?TTOFB18dW3ifZToVJq260*7QhcL2x#xy3mnYv zVSTD;7=u)KGdf^=lgAm<kt#&I!4@4Mk<>iOiH6D^#mNgO%KRs0a%WerS4&UAYVLly zxg3`}3;7ZhZ<^{UVn4QCJ2}#0qSP5fxCgq~)Zu0WJVlq&IO4N^BXHC*qpNEzdCw$% ziyfCwA6+n)qhaZ59<uy%{_%}ezRg>P592cP@&aC-738aXpHl)jGSeUbBx^#Bp(s&) zRWSLynN_=<;Fv8dg?KzCE8^-obr)Yc_I`PG5lUv7@OPbe(iOeIZjwm1s)16^SZ+4f z#@iveZ9B1IfJ#~}deI2jY>uFd+y_rX!*TnAhAQf^nxrhn!AmVGkMoURT^#BfF?3oV zxw<D@CW`m&k2Py&iX8Ph8m~iS!V}h9_I#2cE?fz)p1*$PP`b5m?mj9}oW`A_bciP3 zAZrs*9>X5U)Q^Qww=?_hGZm7e^tGtO>9<+mOg8znhHghcpS8<CiGK8@i#Y4=69h&5 zu_ltEz_0H8{Y!vbWujFg8vWRRCGgSA!7Da#5rt%fa@UU7sbzB|2!`e%!5`Tm^Dt!9 z<m$%a^K94!M#jeU3*w~M!wFzM_Bu>x+M;t17R_rm?KMrITx@O!*t}9STFv<#yLYx_ zJX$+9<CQas5*#PHXj~a7C#ZDgVQPKxEim|WyOp@4)PKb?MPe(=t<70sb|MDy1qBO^ zOB!JjE^yJx&>dYoJ!iqlKCD%7&B^U(H6)_*#LGgX!0-LG(v-2lQBv@h3(6citehQ{ z<47`$$cBcedh<_u$-B%mf3HC^Ts^p^Qf+2IeadFh^|Qx!mZ<rT5CUv=@V8TqN;)5U zrfNG7A)ttIFjX+rHr|DQVU>6tsDeH@a;|G3396;S_4j*1g*PGaVOoEVNK0nS_H)_n zg0_vbg;#|6jGOFav4f*YtM|Tt>M%Hdc*|*tA}Q@LBtl#5G)c_9Nu5GF=wxAxp~WsB zZKjc4?paAW;ls|{X&5O&0L|bVV~1>pO%rPE1TkID(FulQ#UJ(-PZ$2YWa4n3LwN?H zTl<bIL&sqCH?vq+<h;SDV)Ge`OiwnXUeRFYv9n(?)!q^_UlGwC(j<HK6?Nwg)%&B? zb}1-OO7b|C{Bapn;4A2lWZ&IPE!e@^O$js=5{<?nUcbxxqf!>fxjNsxPQSy8$H!bI zN4|Ns<G@PfD>gigUW|o2#-LlcERF9iM59OfMX6%6d)g1zf{8`*Y`hk(M5B_woj{9w z9Z;y?#=4gAN*aZyb^1!Qb(?c|6XY2hvL?C#oxYApcDWrwV=BBd5XrlJRK_eZtJqlq z>mDgH%fJY@3$yQh^!e>SM62ddP&$|T4IU*|EC1jwIxzYyeUp7xCG#drO1Opn^%CeB zyOxp)iPKpBGeJL@*m3d?rZ;+(b=ek(lf)^8LWdjH&fgy>PqE#hOdFxF`ZzP~<cRi4 zSX#1ERT@f#p5#71gDjh=u&sjf`DY1F@r@W&_*m=GO2OGkIVDh`7?Sa7#h#dKiaR)G zNLm*YXaq#(z+;q^5{W}<H{!|+x)3J9qc*XL$}jC;Cah6k_*TlMHLC$VZs#=-0kTTJ zWg1$Gq)`Ae{;%_)@$zB!qK$}Ip?Z%vMLaB$<LXtuYa(|{H<WkVbv`(s5PUB`Jij?Y zP6vLuWzo_)v@d&_wMRY76O92fBd#3=jf%(7+mb@f@ZQ~|0&g_(C47C4n%(%$>vM2l z{l=r4@9MP({CIn<Js<`yB0x^lWS4fxS>Oxc@HTQ2%;eSP>WcQh&k>Rt$9w&X@=kl1 zJcm9)zjD&&{>KS~_!NJ$-p7&Xt@dkm(u#PQ)kydB4Pk=oIGqseifq5SmUbVm(*uct zN3rCg^NFKj9S|eInCSz|MYQP+2KxXDO?xWe7gr_Hw-$?%Il>LIgr$>Yzq^Z^k={yw z+5Cn-4^}4_Q_E4|>FE%jxp%Y8B<d12IN^NUKe<V-W^^{t{3-YZ>;v(O5s&#rfg^=l zWl_2~jChUQvfb%T;VQ2M8JhCgv!b86iOP!nh3>Rbo;ebup^&m@<?(EI&?(tiWR9AD zUkghC#h0H`3t**s;{;j1uDQ=M2m8O|actw0q@q0g`sxIC4hc>`0yyqdU~CkJw60Gs zXK3T?0+&H2_cPwf&U#JCKEY4fKM<bZ??o7z_N}=`rpp&Y10QIBb1-`Z^u0RcKzmax zsBDC8-&+_H-Jb1*N+-t`ran6r9VH%(pJvysk;gcqCnS%v(s+oVUdZ+y2JlkW5Vy?p zqL;~5M&UV$srAGp7>Hjr89&>SAI$n1dXjBUGwWu)VuV-pN)^Y7pU`3TmA>_z3RFYr zUwO>vmV6dj^I>Q{`I5OW!s-A!uM*F>>?yRq(%G-NoW+~6(F}?}FbGFFXJelp{LTJ* zBTFdIIQ;4}@amk3rMC3vJKQFvcb$vPeY}ff4ZB6XZ?UyEIN8a*jS`-yOc$05$jHt2 zxV>{37-~!5dd14iXE%bZNuYbA#ArHI_!@~Pd$RWk>Ji<j|A(G*XHNs~A=TsBwU>6k z6W8zQIT?#?UzIEV)j?nWG$OcNe0OI=Irf3o_ZjbjP4QJP3ste_q@2Adbv?z79k|nv zH8MaA2)W%wl<3N#2-_d}D6*?_6|DC6=ZmK^{-oOwTu73iV5>qr0=ET?2}m80Y(dxr zMqdRPWR)-0T|d;N{OOYOGCqYY{34-<qGv$m9&XPK3KafYa-V^8F2aYpBdDtMh+iui zNZ8ZI_8Zql`jESEv0ZjZeTRvks+gtk<K7!@GiqAi^#NCCt+O2a)mpG;^0*j{qcU61 zTipw?ePx9Bai}N_(|DNzZRMUA%x1w&?-jwLAK11`8;`$io*1!A+sbv#8R9eK4fQF; zrI=dpaHG+2HnLICMjz#ajb!*A3+h#|e-!NcBlfXv>VMu^e>j>a-TyI8>ZrxrEV*r} zg4^8t!HakOfn`0Nm_LBOs#K4~r6tr+w{&rl(_uPt;cOzl!qG!L(TDVNpjkn|j{6g$ z%4@GlxeN(bdEM<ags#Z<Byq(mt2O)KWBspOtCl6FQAwuvG{82W1}3eKKyJz7vWy-* z92ek1crKc(w*&;pWT>T9;Z&hXh5jK9li3Cj?lk=>R{J-)$0<#68}^2n{o>&T*$y#J zH8I?}R(6}#QmG~3zXQw%rh0$(B0?9_*<%Wow^~28l)wMH)R4#X+APJ@hb2I+o`Zii zW#z7M0S4JXHO?9v6RsbFLU3>KFv&B#%fN9CBTp>aMQ`3UBt2cB?fYv6YDzr~lYQI| z;eF#6b6spvQy*$_CG90HpY2E9RAiA1n7C*{lHBlCyh=~9Wdqj}T`8~_KBGXvU<ju* z!KWdF5x#l{qX(66AO`uPHps%@tP#SC&0JN9t~>o~0XoGtin2gZ4R2Cf8V`+kFnu^8 z9B<v|3k~94mL9QF*!UnG-hd1ZJOMED)X26^zbS`fTnrwOJC`x=*q8Qq8<e5&Q&f3) zaj1??020S2L#t-k2l%;Gp(uOL+E%_s_^{sFec#-C@@f@3ny<vGKJP{YVWZZ5f}<Ki z=zpJtkN9~NFO5-w!BWM*Rk^md*724nr)@=JwyXqnjb4jsB}WhG>&-+<t-IU2v8`!Z ztz5r>xr4`R!z`%T5fT!~Km~A1Z7W?Ms~zRsWBKk^wsbB}#f+Hwx6oNjPo~m^D$BmH z5coABxo`_{%bA|~2UySkIg3{@<VM_k-PO%^Llb)?le^y19<)l-&sE!ViwQ|szzbBP z$v_aDew~u~%-IsO#R7EYT0uwoMCq}?(XOk$iInU{(vyT(hUg{!3C(K|6+xu(WahlI z_QbM<>c|zX+rs_YS)UBaRoPRcTKw1`eP9n&PP^94`!Jn?WPS=nz;`6cx8dIO!bg#& z<sQ{RGGw8LA~b4j3zA$wJ-Blw6VbEfwab^sJ`?N@uKjTfx1ko5D_;~PQn*U2hOuZ2 za8~fz7bRQw?C>V~s?bzFe(#w$yp%ppxh@!08*-y>%h`~dOdU$ecbt4p8tnPNHQ)cF zC+x8`s0!NbWRuuEf5oZiGQ=$(MOi3ed90WvQjmQe^{ew$_+_HV81)iK*OkrkhzE7& zH$|dQmfz1j392sEkxTMEEU|fo3iz!ix$(H2o&k#@Wzt_Oh}CRGUg9As8mma_E$EM| zwI9RP0%2ARHPj8I^%TJ8lM1orj+58Un;l#YtoL86*~iDIA62;~BHx#9-xrUD=E<pf zpd5V0dA(WuC$GfZFxlmj_A>o!#_5_h_44=5*YRm<0Rw%Mt(wh*$)Qw%C8ghZx(g|q z#=UNb5s2>NF-v7mPyJu^nF(^_bg7SpV9%7z(wWhgCX9O8gyWD<NVYk~?1E>s*lQ<R zyGk|(%B!f4CiF1U6{SA=voJIKV(z;6=E13YvIkPpGTgTT$reIWA=VZzgEdjs%9lY> z7v6HCCZTn75ViZI_l~x;R;sDDMvpRb(}F<kv>9!HA+gfi><MH3YxJA88hmJf2pa3n zRTGb8{KY49+^MOEF*KIsbBYyN7;GG)y&Nf6#Iw5C?FrJIr}QJ>O7>{S{Av5@(pF2C z2~w=>JhwG%#8Ts{tP6cgH756Z_?x(_R;iZqM6j=M3$g-sJ%wV*&x>IxJ7TRWbgJQF zu~oPE3KQ~9(BIPr7=fjKpEdwLya$!Q9!H?k(y=i!Lx2w%#;3sGYwWQ?E-Fs;l5d&w zy$Hh(j=~z%REGrne8`pIb2nzYcsVzVLa$y^5zFz!&9G(3Zh3WpqPC2U?bm-Npccz6 zNq?_m%CDZ3op@6$`dJ=0(|%H)Dl@4YXM3QJ3!P*Z;`nH7ZM|+oILe$=Vs*JC>W3cJ zZAvhj*7nEiPrDmEv_6izXg_N)9qYMG(bdjm<w;6*ZfP;!-Gm3PUw_w!2b00Y>=_{! z`HPN78UrZc83xYbgivl1b#l*ad;5H_P|RigQJQFfm1wyPvz}C>U#Un!ZHa2`a1G62 zeu`ZilJG5qmgnFY(?1SIbncVIiQSUdwJY_pxy#<G>SF5C&Tu_D9MCD<nCR-eIGmW; z57F|!&U+(qocSnm6+%Dkyc+Vsw-nu~h@ntTgH7`7d!q-1LR<@41r0mobRo69X}$k` z4XI!Agg^hVO2OjJ`9{NH^hD9^jEoVVpH5dFgBDChj$99~Itt}^yGmPi^>k*>-*(NR zH@u#dYq%P&{S*fOezq}OfapOK0lS26<ruWmyql5Ygn{-E92;}sNkACG#Trm=eeJ_* zt%-tdlrH9Fci$+yoDcqHoN)uaSN&>3K)*-p0cTnutR5vJm2-XgnRo;TO9R(VDx(l% z<5~Y*6d5#a6B&*^K8C`NEj4x2L5h`0p~UKF(Rezq45F|NvxyuuHh#@%BI|o(!h{hz zjuNz>I`3a2>wI)))A8uwiCBa<VU=GiAFk_uv!3^CRMy2?CwHZ<M%4r$#v_bnHA<nj zbdB=4_gnYEcISJnV<C9UENFa4n1BPmEz7ch%Hf1@f^Yr`&1K8gqphJb2K?GjgfX3Q zs5f!l?>q)La!>WOvgm9Yvs*b&e>fR`P++_xTXSuDo$5F@-WG#X5=OF^YjA6^H=QG3 z{vlIgH8=U8(aDc%mSs9JgFuA>{deW$Zt5K4EpPPFpWtNtm^vrow?r4@#O5yNUwh#- zQrCpP3lbc8B{T^nq=XHlUP$Yb2p4wVf8r*++^2N%(_As)No*|Ii+`cNo%sonWyUD2 UJgAsr|D&==u<2?UgogJ20YH53*#H0l literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/cig_snuff.ogg b/Resources/Audio/Effects/cig_snuff.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b97cd5c42652088fb7fe5d560c70cca8235ef464 GIT binary patch literal 9397 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 J?n`-`{|CX=3P%6{ literal 0 HcmV?d00001 From ba6d8f5376f630ab170cc2a76a40ea340a8dab2d Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 18 Apr 2025 18:21:01 -0400 Subject: [PATCH 312/622] Cargo Funds Exception (#36694) --- Content.Shared/Cargo/SharedCargoSystem.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Cargo/SharedCargoSystem.cs b/Content.Shared/Cargo/SharedCargoSystem.cs index 84633073b5..8925ce0de1 100644 --- a/Content.Shared/Cargo/SharedCargoSystem.cs +++ b/Content.Shared/Cargo/SharedCargoSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Cargo.Prototypes; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Timing; +using Robust.Shared.Utility; namespace Content.Shared.Cargo; @@ -49,7 +50,8 @@ public abstract class SharedCargoSystem : EntitySystem foreach (var (account, percentage) in stationBank.Comp.RevenueDistribution) { - distribution.Add(account, remaining * percentage); + var existing = distribution.GetOrNew(account); + distribution[account] = existing + remaining * percentage; } return distribution; } From 3fc9bcbbbe9eead5cf0d65c9ab7ddc4c06916e71 Mon Sep 17 00:00:00 2001 From: Milon <milonpl.git@proton.me> Date: Sat, 19 Apr 2025 00:23:01 +0200 Subject: [PATCH 313/622] remove Session from MindComponent (#34753) * yummy * fix tests --- .../Tests/Minds/MindTests.Helpers.cs | 5 +- .../Tests/Minds/MindTests.ReconnectTests.cs | 2 +- .../Administration/Commands/AGhostCommand.cs | 7 ++- .../Administration/Systems/AdminSystem.cs | 4 +- .../Anomaly/Effects/InnerBodyAnomalySystem.cs | 15 +++-- .../Antag/AntagSelectionSystem.API.cs | 4 +- Content.Server/Chat/Managers/ChatManager.cs | 8 ++- .../Cloning/CloningConsoleSystem.cs | 2 +- .../GameTicking/GameTicker.Player.cs | 8 +-- .../Rules/RevolutionaryRuleSystem.cs | 16 ++--- .../GameTicking/Rules/ZombieRuleSystem.cs | 12 ++-- Content.Server/Ghost/GhostSystem.cs | 12 ++-- Content.Server/Ghost/ReturnToBodyEui.cs | 14 +++-- Content.Server/Medical/DefibrillatorSystem.cs | 7 ++- Content.Server/Mind/MindSystem.cs | 59 ++++++++----------- .../PlayTimeTrackingSystem.cs | 2 +- Content.Server/Roles/Jobs/JobSystem.cs | 4 +- Content.Server/Roles/RoleSystem.cs | 4 +- Content.Server/Silicons/Borgs/BorgSystem.cs | 12 ++-- .../Traitor/Systems/AutoTraitorSystem.cs | 7 ++- .../Zombies/ZombieSystem.Transform.cs | 8 ++- .../Cryostorage/SharedCryostorageSystem.cs | 15 +++-- Content.Shared/Mind/MindComponent.cs | 8 --- Content.Shared/Mind/SharedMindSystem.cs | 25 ++++---- Content.Shared/Roles/SharedRoleSystem.cs | 23 +++++--- 25 files changed, 149 insertions(+), 134 deletions(-) diff --git a/Content.IntegrationTests/Tests/Minds/MindTests.Helpers.cs b/Content.IntegrationTests/Tests/Minds/MindTests.Helpers.cs index b12c90e16e..cebbed8ee8 100644 --- a/Content.IntegrationTests/Tests/Minds/MindTests.Helpers.cs +++ b/Content.IntegrationTests/Tests/Minds/MindTests.Helpers.cs @@ -130,14 +130,14 @@ public sealed partial class MindTests ActorComponent actor = default!; Assert.Multiple(() => { - Assert.That(player, Is.EqualTo(mind.Session), "Player session does not match mind session"); + Assert.That(player.UserId, Is.EqualTo(mind.UserId), "Player UserId does not match mind UserId"); Assert.That(entMan.System<MindSystem>().GetMind(player.UserId), Is.EqualTo(mindId)); Assert.That(player.AttachedEntity, Is.EqualTo(mind.CurrentEntity), "Player is not attached to the mind's current entity."); Assert.That(entMan.EntityExists(mind.OwnedEntity), "The mind's current entity does not exist"); Assert.That(mind.VisitingEntity == null || entMan.EntityExists(mind.VisitingEntity), "The minds visited entity does not exist."); Assert.That(entMan.TryGetComponent(mind.CurrentEntity, out actor)); }); - Assert.That(actor.PlayerSession, Is.EqualTo(mind.Session)); + Assert.That(actor.PlayerSession.UserId, Is.EqualTo(mind.UserId)); return (mindId, mind); } @@ -161,7 +161,6 @@ public sealed partial class MindTests { Assert.That(player.Status, Is.EqualTo(SessionStatus.Disconnected)); Assert.That(mind.UserId, Is.Not.Null); - Assert.That(mind.Session, Is.Null); }); } diff --git a/Content.IntegrationTests/Tests/Minds/MindTests.ReconnectTests.cs b/Content.IntegrationTests/Tests/Minds/MindTests.ReconnectTests.cs index a1fccfb68d..db87797553 100644 --- a/Content.IntegrationTests/Tests/Minds/MindTests.ReconnectTests.cs +++ b/Content.IntegrationTests/Tests/Minds/MindTests.ReconnectTests.cs @@ -67,7 +67,7 @@ public sealed partial class MindTests Assert.Multiple(() => { Assert.That(entMan.Deleted(entity)); - Assert.That(mind.Comp.OwnedEntity, Is.Null); + Assert.That(mind.Comp.OwnedEntity, Is.Not.EqualTo(entity)); }); // Reconnect diff --git a/Content.Server/Administration/Commands/AGhostCommand.cs b/Content.Server/Administration/Commands/AGhostCommand.cs index 6acaadbf83..09c8d0eb50 100644 --- a/Content.Server/Administration/Commands/AGhostCommand.cs +++ b/Content.Server/Administration/Commands/AGhostCommand.cs @@ -8,6 +8,7 @@ using Content.Shared.Mind; using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Console; +using Robust.Shared.Player; namespace Content.Server.Administration.Commands; @@ -15,7 +16,7 @@ namespace Content.Server.Administration.Commands; public sealed class AGhostCommand : LocalizedCommands { [Dependency] private readonly IEntityManager _entities = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly ISharedPlayerManager _playerManager = default!; public override string Command => "aghost"; public override string Help => "aghost"; @@ -104,8 +105,8 @@ public sealed class AGhostCommand : LocalizedCommands // TODO: Remove duplication between all this and "GamePreset.OnGhostAttempt()"... if (!string.IsNullOrWhiteSpace(mind.CharacterName)) metaDataSystem.SetEntityName(ghost, mind.CharacterName); - else if (!string.IsNullOrWhiteSpace(mind.Session?.Name)) - metaDataSystem.SetEntityName(ghost, mind.Session.Name); + else if (!string.IsNullOrWhiteSpace(player.Name)) + metaDataSystem.SetEntityName(ghost, player.Name); mindSystem.Visit(mindId, ghost, mind); } diff --git a/Content.Server/Administration/Systems/AdminSystem.cs b/Content.Server/Administration/Systems/AdminSystem.cs index 0868157f6e..b9916bc5b2 100644 --- a/Content.Server/Administration/Systems/AdminSystem.cs +++ b/Content.Server/Administration/Systems/AdminSystem.cs @@ -153,9 +153,7 @@ public sealed class AdminSystem : EntitySystem private void OnRoleEvent(RoleEvent ev) { - var session = _minds.GetSession(ev.Mind); - - if (!ev.RoleTypeUpdate || session == null) + if (!ev.RoleTypeUpdate || !_playerManager.TryGetSessionById(ev.Mind.UserId, out var session)) return; UpdatePlayerList(session); diff --git a/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs b/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs index b647e026e3..ff644ad3e0 100644 --- a/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Popups; using Content.Shared.Whitelist; using Robust.Shared.Audio.Systems; using Robust.Shared.Physics.Events; +using Robust.Shared.Player; using Robust.Shared.Prototypes; namespace Content.Server.Anomaly.Effects; @@ -26,6 +27,7 @@ public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly BodySystem _body = default!; [Dependency] private readonly IChatManager _chat = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly JitteringSystem _jitter = default!; [Dependency] private readonly MindSystem _mind = default!; @@ -102,7 +104,7 @@ public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem if (ent.Comp.StartMessage is not null && _mind.TryGetMind(ent, out _, out var mindComponent) && - mindComponent.Session != null) + _player.TryGetSessionById(mindComponent.UserId, out var session)) { var message = Loc.GetString(ent.Comp.StartMessage); var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); @@ -111,7 +113,7 @@ public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem wrappedMessage, default, false, - mindComponent.Session.Channel, + session.Channel, _messageColor); _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); @@ -137,7 +139,8 @@ public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem private void OnSeverityChanged(Entity<InnerBodyAnomalyComponent> ent, ref AnomalySeverityChangedEvent args) { - if (!_mind.TryGetMind(ent, out _, out var mindComponent) || mindComponent.Session == null) + if (!_mind.TryGetMind(ent, out _, out var mindComponent) || + !_player.TryGetSessionById(mindComponent.UserId, out var session)) return; var message = string.Empty; @@ -172,7 +175,7 @@ public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem wrappedMessage, default, false, - mindComponent.Session.Channel, + session.Channel, _messageColor); _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); @@ -214,7 +217,7 @@ public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem if (ent.Comp.EndMessage is not null && _mind.TryGetMind(ent, out _, out var mindComponent) && - mindComponent.Session != null) + _player.TryGetSessionById(mindComponent.UserId, out var session)) { var message = Loc.GetString(ent.Comp.EndMessage); var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); @@ -223,7 +226,7 @@ public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem wrappedMessage, default, false, - mindComponent.Session.Channel, + session.Channel, _messageColor); diff --git a/Content.Server/Antag/AntagSelectionSystem.API.cs b/Content.Server/Antag/AntagSelectionSystem.API.cs index 93b5fa6136..975c802eed 100644 --- a/Content.Server/Antag/AntagSelectionSystem.API.cs +++ b/Content.Server/Antag/AntagSelectionSystem.API.cs @@ -264,10 +264,10 @@ public sealed partial class AntagSelectionSystem if (!_mind.TryGetMind(entity, out _, out var mindComponent)) return; - if (mindComponent.Session == null) + if (!_playerManager.TryGetSessionById(mindComponent.UserId, out var session)) return; - SendBriefing(mindComponent.Session, briefing, briefingColor, briefingSound); + SendBriefing(session, briefing, briefingColor, briefingSound); } /// <summary> diff --git a/Content.Server/Chat/Managers/ChatManager.cs b/Content.Server/Chat/Managers/ChatManager.cs index c86ff802ce..535ca8658d 100644 --- a/Content.Server/Chat/Managers/ChatManager.cs +++ b/Content.Server/Chat/Managers/ChatManager.cs @@ -44,6 +44,7 @@ internal sealed partial class ChatManager : IChatManager [Dependency] private readonly INetConfigurationManager _netConfigManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly PlayerRateLimitManager _rateLimitManager = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; /// <summary> /// The maximum length a player-sent message can be sent @@ -179,7 +180,12 @@ internal sealed partial class ChatManager : IChatManager var adminSystem = _entityManager.System<AdminSystem>(); var antag = mind.UserId != null && (adminSystem.GetCachedPlayerInfo(mind.UserId.Value)?.Antag ?? false); - SendAdminAlert($"{mind.Session?.Name}{(antag ? " (ANTAG)" : "")} {message}"); + // We shouldn't be repeating this but I don't want to touch any more chat code than necessary + var playerName = mind.UserId is { } userId && _player.TryGetSessionById(userId, out var session) + ? session.Name + : "Unknown"; + + SendAdminAlert($"{playerName}{(antag ? " (ANTAG)" : "")} {message}"); } public void SendHookOOC(string sender, string message) diff --git a/Content.Server/Cloning/CloningConsoleSystem.cs b/Content.Server/Cloning/CloningConsoleSystem.cs index 39eac842f0..b5cf2dbb8a 100644 --- a/Content.Server/Cloning/CloningConsoleSystem.cs +++ b/Content.Server/Cloning/CloningConsoleSystem.cs @@ -165,7 +165,7 @@ namespace Content.Server.Cloning if (!_mindSystem.TryGetMind(body.Value, out var mindId, out var mind)) return; - if (mind.UserId.HasValue == false || mind.Session == null) + if (mind.UserId.HasValue == false || !_playerManager.ValidSessionId(mind.UserId.Value)) return; if (_cloningPodSystem.TryCloning(cloningPodUid, body.Value, (mindId, mind), cloningPod, scannerComp.CloningFailChanceMultiplier)) diff --git a/Content.Server/GameTicking/GameTicker.Player.cs b/Content.Server/GameTicking/GameTicker.Player.cs index 2c3dcaba43..63821d9251 100644 --- a/Content.Server/GameTicking/GameTicker.Player.cs +++ b/Content.Server/GameTicking/GameTicker.Player.cs @@ -32,11 +32,8 @@ namespace Content.Server.GameTicking { if (args.NewStatus != SessionStatus.Disconnected) { - mind.Session = session; _pvsOverride.AddSessionOverride(mindId.Value, session); } - - DebugTools.Assert(mind.Session == session); } DebugTools.Assert(session.GetMind() == mindId); @@ -126,10 +123,9 @@ namespace Content.Server.GameTicking case SessionStatus.Disconnected: { _chatManager.SendAdminAnnouncement(Loc.GetString("player-leave-message", ("name", args.Session.Name))); - if (mind != null) + if (mindId != null) { - _pvsOverride.ClearOverride(GetNetEntity(mindId!.Value)); - mind.Session = null; + _pvsOverride.RemoveSessionOverride(mindId.Value, session); } _userDb.ClientDisconnected(session); diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index 9ec932b06f..311e78d009 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -28,6 +28,7 @@ using Content.Shared.Zombies; using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Content.Shared.Cuffs.Components; +using Robust.Shared.Player; namespace Content.Server.GameTicking.Rules; @@ -36,19 +37,20 @@ namespace Content.Server.GameTicking.Rules; /// </summary> public sealed class RevolutionaryRuleSystem : GameRuleSystem<RevolutionaryRuleComponent> { - [Dependency] private readonly IAdminLogManager _adminLogManager = default!; [Dependency] private readonly AntagSelectionSystem _antag = default!; [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; [Dependency] private readonly EuiManager _euiMan = default!; + [Dependency] private readonly IAdminLogManager _adminLogManager = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly NpcFactionSystem _npcFaction = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly RoleSystem _role = default!; - [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly RoundEndSystem _roundEnd = default!; + [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly StationSystem _stationSystem = default!; - [Dependency] private readonly IGameTiming _timing = default!; //Used in OnPostFlash, no reference to the rule component is available public readonly ProtoId<NpcFactionPrototype> RevolutionaryNpcFaction = "Revolutionary"; @@ -165,8 +167,8 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem<RevolutionaryRuleCo _role.MindAddRole(mindId, "MindRoleRevolutionary"); } - if (mind?.Session != null) - _antag.SendBriefing(mind.Session, Loc.GetString("rev-role-greeting"), Color.Red, revComp.RevStartSound); + if (mind is { UserId: not null } && _player.TryGetSessionById(mind.UserId, out var session)) + _antag.SendBriefing(session, Loc.GetString("rev-role-greeting"), Color.Red, revComp.RevStartSound); } //TODO: Enemies of the revolution @@ -228,7 +230,7 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem<RevolutionaryRuleCo _popup.PopupEntity(Loc.GetString("rev-break-control", ("name", Identity.Entity(uid, EntityManager))), uid); _adminLogManager.Add(LogType.Mind, LogImpact.Medium, $"{ToPrettyString(uid)} was deconverted due to all Head Revolutionaries dying."); - if (!_mind.TryGetMind(uid, out var mindId, out _, mc)) + if (!_mind.TryGetMind(uid, out var mindId, out var mind, mc)) continue; // remove their antag role @@ -236,7 +238,7 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem<RevolutionaryRuleCo // make it very obvious to the rev they've been deconverted since // they may not see the popup due to antag and/or new player tunnel vision - if (_mind.TryGetSession(mindId, out var session)) + if (_player.TryGetSessionById(mind.UserId, out var session)) _euiMan.OpenEui(new DeconvertedEui(), session); } return true; diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index bb76721340..a38940c667 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -25,13 +25,14 @@ public sealed class ZombieRuleSystem : GameRuleSystem<ZombieRuleComponent> { [Dependency] private readonly AntagSelectionSystem _antag = default!; [Dependency] private readonly ChatSystem _chat = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly SharedRoleSystem _roles = default!; [Dependency] private readonly RoundEndSystem _roundEnd = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; [Dependency] private readonly StationSystem _station = default!; - [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly ZombieSystem _zombie = default!; public override void Initialize() @@ -95,9 +96,10 @@ public sealed class ZombieRuleSystem : GameRuleSystem<ZombieRuleComponent> { var meta = MetaData(survivor); var username = string.Empty; - if (_mindSystem.TryGetMind(survivor, out _, out var mind) && mind.Session != null) + if (_mindSystem.TryGetMind(survivor, out _, out var mind) && + _player.TryGetSessionById(mind.UserId, out var session)) { - username = mind.Session.Name; + username = session.Name; } args.AddLine(Loc.GetString("zombie-round-end-user-was-survivor", diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index df4d998128..0cccab64b6 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -53,7 +53,7 @@ namespace Content.Server.Ghost [Dependency] private readonly MindSystem _minds = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; @@ -364,7 +364,7 @@ namespace Content.Server.Ghost private IEnumerable<GhostWarp> GetPlayerWarps(EntityUid except) { - foreach (var player in _playerManager.Sessions) + foreach (var player in _player.Sessions) { if (player.AttachedEntity is not {Valid: true} attached) continue; @@ -484,8 +484,8 @@ namespace Content.Server.Ghost // However, that should rarely happen. if (!string.IsNullOrWhiteSpace(mind.Comp.CharacterName)) _metaData.SetEntityName(ghost, mind.Comp.CharacterName); - else if (!string.IsNullOrWhiteSpace(mind.Comp.Session?.Name)) - _metaData.SetEntityName(ghost, mind.Comp.Session.Name); + else if (mind.Comp.UserId is { } userId && _player.TryGetSessionById(userId, out var session)) + _metaData.SetEntityName(ghost, session.Name); if (mind.Comp.TimeOfDeath.HasValue) { @@ -530,9 +530,9 @@ namespace Content.Server.Ghost if (mind.PreventGhosting && !forced) { - if (mind.Session != null) // Logging is suppressed to prevent spam from ghost attempts caused by movement attempts + if (_player.TryGetSessionById(mind.UserId, out var session)) // Logging is suppressed to prevent spam from ghost attempts caused by movement attempts { - _chatManager.DispatchServerMessage(mind.Session, Loc.GetString("comp-mind-ghosting-prevented"), + _chatManager.DispatchServerMessage(session, Loc.GetString("comp-mind-ghosting-prevented"), true); } diff --git a/Content.Server/Ghost/ReturnToBodyEui.cs b/Content.Server/Ghost/ReturnToBodyEui.cs index 77b143f7df..50664b30d1 100644 --- a/Content.Server/Ghost/ReturnToBodyEui.cs +++ b/Content.Server/Ghost/ReturnToBodyEui.cs @@ -2,19 +2,22 @@ using Content.Server.EUI; using Content.Shared.Eui; using Content.Shared.Ghost; using Content.Shared.Mind; +using Robust.Shared.Network; +using Robust.Shared.Player; namespace Content.Server.Ghost; public sealed class ReturnToBodyEui : BaseEui { private readonly SharedMindSystem _mindSystem; + private readonly ISharedPlayerManager _player; + private readonly NetUserId? _userId; - private readonly MindComponent _mind; - - public ReturnToBodyEui(MindComponent mind, SharedMindSystem mindSystem) + public ReturnToBodyEui(MindComponent mind, SharedMindSystem mindSystem, ISharedPlayerManager player) { - _mind = mind; _mindSystem = mindSystem; + _player = player; + _userId = mind.UserId; } public override void HandleMessage(EuiMessageBase msg) @@ -28,7 +31,8 @@ public sealed class ReturnToBodyEui : BaseEui return; } - _mindSystem.UnVisit(_mind.Session); + if (_userId is { } userId && _player.TryGetSessionById(userId, out var session)) + _mindSystem.UnVisit(session); Close(); } diff --git a/Content.Server/Medical/DefibrillatorSystem.cs b/Content.Server/Medical/DefibrillatorSystem.cs index ba272c92f5..94d62641ce 100644 --- a/Content.Server/Medical/DefibrillatorSystem.cs +++ b/Content.Server/Medical/DefibrillatorSystem.cs @@ -36,12 +36,13 @@ public sealed class DefibrillatorSystem : EntitySystem [Dependency] private readonly DoAfterSystem _doAfter = default!; [Dependency] private readonly ElectrocutionSystem _electrocution = default!; [Dependency] private readonly EuiManager _euiManager = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly ItemToggleSystem _toggle = default!; - [Dependency] private readonly RottingSystem _rotting = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly RottingSystem _rotting = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; @@ -212,13 +213,13 @@ public sealed class DefibrillatorSystem : EntitySystem } if (_mind.TryGetMind(target, out _, out var mind) && - mind.Session is { } playerSession) + _player.TryGetSessionById(mind.UserId, out var playerSession)) { session = playerSession; // notify them they're being revived. if (mind.CurrentEntity != target) { - _euiManager.OpenEui(new ReturnToBodyEui(mind, _mind), session); + _euiManager.OpenEui(new ReturnToBodyEui(mind, _mind, _player), session); } } else diff --git a/Content.Server/Mind/MindSystem.cs b/Content.Server/Mind/MindSystem.cs index 0d3c0c750c..5601f19e58 100644 --- a/Content.Server/Mind/MindSystem.cs +++ b/Content.Server/Mind/MindSystem.cs @@ -69,7 +69,7 @@ public sealed class MindSystem : SharedMindSystem TransferTo(mindId, null, createGhost: false, mind: mind); DebugTools.AssertNull(mind.OwnedEntity); - if (!component.GhostOnShutdown || mind.Session == null || _gameTicker.RunLevel == GameRunLevel.PreRoundLobby) + if (!component.GhostOnShutdown || _gameTicker.RunLevel == GameRunLevel.PreRoundLobby) return; var ghost = _ghosts.SpawnGhost((mindId, mind), uid); @@ -93,16 +93,6 @@ public sealed class MindSystem : SharedMindSystem return false; } - public ICommonSession? GetSession(MindComponent mind) - { - return mind.Session; - } - - public bool TryGetSession(MindComponent mind, [NotNullWhen(true)] out ICommonSession? session) - { - return (session = GetSession(mind)) != null; - } - public override void WipeAllMinds() { base.WipeAllMinds(); @@ -144,10 +134,10 @@ public sealed class MindSystem : SharedMindSystem // Do this AFTER the entity changes above as this will fire off a player-detached event // which will run ghosting twice. - if (GetSession(mind) is { } session) + if (_players.TryGetSessionById(mind.UserId, out var session)) _players.SetAttachedEntity(session, entity); - Log.Info($"Session {mind.Session?.Name} visiting entity {entity}."); + Log.Info($"Session {session?.Name} visiting entity {entity}."); } public override void UnVisit(EntityUid mindId, MindComponent? mind = null) @@ -162,17 +152,19 @@ public sealed class MindSystem : SharedMindSystem RemoveVisitingEntity(mindId, mind); - if (mind.Session == null || mind.Session.AttachedEntity == mind.VisitingEntity) + if (mind.UserId == null || !_players.TryGetSessionById(mind.UserId.Value, out var session)) + return; + + if (session.AttachedEntity == mind.VisitingEntity) return; var owned = mind.OwnedEntity; - if (GetSession(mind) is { } session) - _players.SetAttachedEntity(session, owned); + _players.SetAttachedEntity(session, owned); if (owned.HasValue) { _adminLogger.Add(LogType.Mind, LogImpact.Low, - $"{mind.Session.Name} returned to {ToPrettyString(owned.Value)}"); + $"{session.Name} returned to {ToPrettyString(owned.Value)}"); } } @@ -199,7 +191,8 @@ public sealed class MindSystem : SharedMindSystem if (TryComp<ActorComponent>(entity.Value, out var actor)) { // Happens when transferring to your currently visited entity. - if (actor.PlayerSession != mind.Session) + if (!_players.TryGetSessionByEntity(entity.Value, out var session) || + mind.UserId == null || actor.PlayerSession != session ) { throw new ArgumentException("Visit target already has a session.", nameof(entity)); } @@ -253,12 +246,12 @@ public sealed class MindSystem : SharedMindSystem } // Player is CURRENTLY connected. - var session = GetSession(mind); - if (session != null && !alreadyAttached && mind.VisitingEntity == null) + if (mind.UserId != null && _players.TryGetSessionById(mind.UserId.Value, out var userSession) + && !alreadyAttached && mind.VisitingEntity == null) { - _players.SetAttachedEntity(session, entity, true); - DebugTools.Assert(session.AttachedEntity == entity, $"Failed to attach entity."); - Log.Info($"Session {session.Name} transferred to entity {entity}."); + _players.SetAttachedEntity(userSession, entity, true); + DebugTools.Assert(userSession.AttachedEntity == entity, "Failed to attach entity."); + Log.Info($"Session {userSession.Name} transferred to entity {entity}."); } if (entity != null) @@ -288,18 +281,18 @@ public sealed class MindSystem : SharedMindSystem return; Dirty(mindId, mind); - var netMind = GetNetEntity(mindId); - _pvsOverride.ClearOverride(netMind); + if (userId != null && !_players.TryGetPlayerData(userId.Value, out _)) { Log.Error($"Attempted to set mind user to invalid value {userId}"); return; } - if (mind.Session != null) + // Clear any existing entity attachment + if (_players.TryGetSessionById(mind.UserId, out var oldSession)) { - _players.SetAttachedEntity(GetSession(mind), null); - mind.Session = null; + _players.SetAttachedEntity(oldSession, null); + _pvsOverride.RemoveSessionOverride(mindId, oldSession); } if (mind.UserId != null) @@ -311,10 +304,7 @@ public sealed class MindSystem : SharedMindSystem } if (userId == null) - { - DebugTools.AssertNull(mind.Session); return; - } if (UserMinds.TryGetValue(userId.Value, out var oldMindId) && TryComp(oldMindId, out MindComponent? oldMind)) @@ -333,11 +323,10 @@ public sealed class MindSystem : SharedMindSystem if (_players.GetPlayerData(userId.Value).ContentData() is { } data) data.Mind = mindId; - if (_players.TryGetSessionById(userId.Value, out var ret)) + if (_players.TryGetSessionById(userId.Value, out var session)) { - mind.Session = ret; - _pvsOverride.AddSessionOverride(mindId, ret); - _players.SetAttachedEntity(ret, mind.CurrentEntity); + _pvsOverride.AddSessionOverride(mindId, session); + _players.SetAttachedEntity(session, mind.CurrentEntity); } } diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index b8c0d3f450..9f4b6599b8 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -123,7 +123,7 @@ public sealed class PlayTimeTrackingSystem : EntitySystem private void OnRoleEvent(RoleEvent ev) { - if (_minds.TryGetSession(ev.Mind, out var session)) + if (_playerManager.TryGetSessionById(ev.Mind.UserId, out var session)) _tracking.QueueRefreshTrackers(session); } diff --git a/Content.Server/Roles/Jobs/JobSystem.cs b/Content.Server/Roles/Jobs/JobSystem.cs index 28cfbe76b5..3603225dfb 100644 --- a/Content.Server/Roles/Jobs/JobSystem.cs +++ b/Content.Server/Roles/Jobs/JobSystem.cs @@ -4,6 +4,7 @@ using Content.Server.Mind; using Content.Shared.Mind; using Content.Shared.Roles; using Content.Shared.Roles.Jobs; +using Robust.Shared.Player; namespace Content.Server.Roles.Jobs; @@ -14,6 +15,7 @@ public sealed class JobSystem : SharedJobSystem { [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly MindSystem _mind = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly RoleSystem _roles = default!; public override void Initialize() @@ -42,7 +44,7 @@ public sealed class JobSystem : SharedJobSystem if (args.Silent) return; - if (!_mind.TryGetSession(mindId, out var session)) + if (!_player.TryGetSessionById(component.UserId, out var session)) return; if (!MindTryGetJob(mindId, out var prototype)) diff --git a/Content.Server/Roles/RoleSystem.cs b/Content.Server/Roles/RoleSystem.cs index 278ac48579..6cbd039c73 100644 --- a/Content.Server/Roles/RoleSystem.cs +++ b/Content.Server/Roles/RoleSystem.cs @@ -46,7 +46,7 @@ public sealed class RoleSystem : SharedRoleSystem public void RoleUpdateMessage(MindComponent mind) { - if (mind.Session is null) + if (!Player.TryGetSessionById(mind.UserId, out var session)) return; if (!_proto.TryIndex(mind.RoleType, out var proto)) @@ -55,8 +55,6 @@ public sealed class RoleSystem : SharedRoleSystem var roleText = Loc.GetString(proto.Name); var color = proto.Color; - var session = mind.Session; - //TODO add audio? Would need to be optional so it does not play on role changes that already come with their own audio // _audio.PlayGlobal(Sound, session); diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index d8fa1f300b..82e247cb0b 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -54,7 +54,7 @@ public sealed partial class BorgSystem : SharedBorgSystem [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; - + [Dependency] private readonly ISharedPlayerManager _player = default!; [ValidatePrototypeId<JobPrototype>] public const string BorgJobId = "Borg"; @@ -110,9 +110,10 @@ public sealed partial class BorgSystem : SharedBorgSystem if (component.BrainEntity == null && brain != null && _whitelistSystem.IsWhitelistPassOrNull(component.BrainWhitelist, used)) { - if (_mind.TryGetMind(used, out _, out var mind) && mind.Session != null) + if (_mind.TryGetMind(used, out _, out var mind) && + _player.TryGetSessionById(mind.UserId, out var session)) { - if (!CanPlayerBeBorged(mind.Session)) + if (!CanPlayerBeBorged(session)) { Popup.PopupEntity(Loc.GetString("borg-player-not-allowed"), used, args.User); return; @@ -245,10 +246,11 @@ public sealed partial class BorgSystem : SharedBorgSystem container.ID != chassisComponent.BrainContainerId) return; - if (!_mind.TryGetMind(uid, out var mindId, out var mind) || mind.Session == null) + if (!_mind.TryGetMind(uid, out var mindId, out var mind) || + !_player.TryGetSessionById(mind.UserId, out var session)) return; - if (!CanPlayerBeBorged(mind.Session)) + if (!CanPlayerBeBorged(session)) { Popup.PopupEntity(Loc.GetString("borg-player-not-allowed-eject"), uid); Container.RemoveEntity(containerEnt, uid); diff --git a/Content.Server/Traitor/Systems/AutoTraitorSystem.cs b/Content.Server/Traitor/Systems/AutoTraitorSystem.cs index d5a4db591a..3343fec7ab 100644 --- a/Content.Server/Traitor/Systems/AutoTraitorSystem.cs +++ b/Content.Server/Traitor/Systems/AutoTraitorSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Antag; using Content.Server.Traitor.Components; using Content.Shared.Mind.Components; +using Robust.Shared.Player; using Robust.Shared.Prototypes; namespace Content.Server.Traitor.Systems; @@ -11,6 +12,7 @@ namespace Content.Server.Traitor.Systems; public sealed class AutoTraitorSystem : EntitySystem { [Dependency] private readonly AntagSelectionSystem _antag = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; public override void Initialize() { @@ -21,6 +23,9 @@ public sealed class AutoTraitorSystem : EntitySystem private void OnMindAdded(EntityUid uid, AutoTraitorComponent comp, MindAddedMessage args) { - _antag.ForceMakeAntag<AutoTraitorComponent>(args.Mind.Comp.Session, comp.Profile); + if (!_player.TryGetSessionById(args.Mind.Comp.UserId, out var session)) + return; + + _antag.ForceMakeAntag<AutoTraitorComponent>(session, comp.Profile); } } diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index a7a22c4175..7be4570160 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -35,7 +35,9 @@ using Content.Shared.Prying.Components; using Content.Shared.Traits.Assorted; using Robust.Shared.Audio.Systems; using Content.Shared.Ghost.Roles.Components; +using Content.Shared.Roles; using Content.Shared.Tag; +using Robust.Shared.Player; using Robust.Shared.Prototypes; namespace Content.Server.Zombies; @@ -61,6 +63,8 @@ public sealed partial class ZombieSystem [Dependency] private readonly NPCSystem _npc = default!; [Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly NameModifierSystem _nameMod = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; private static readonly ProtoId<TagPrototype> InvalidForGlobalSpawnSpellTag = "InvalidForGlobalSpawnSpell"; private static readonly ProtoId<TagPrototype> CannotSuicideTag = "CannotSuicide"; @@ -234,8 +238,8 @@ public sealed partial class ZombieSystem _npc.SleepNPC(target, htn); //He's gotta have a mind - var hasMind = _mind.TryGetMind(target, out var mindId, out _); - if (hasMind && _mind.TryGetSession(mindId, out var session)) + var hasMind = _mind.TryGetMind(target, out var mindId, out var mind); + if (hasMind && mind != null && _player.TryGetSessionById(mind.UserId, out var session)) { //Zombie role for player manifest _role.MindAddRole(mindId, "MindRoleZombie", mind: null, silent: true); diff --git a/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs b/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs index f6b7a34785..e17a0a9167 100644 --- a/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs +++ b/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Mobs.Systems; using Robust.Shared.Configuration; using Robust.Shared.Containers; using Robust.Shared.Map; +using Robust.Shared.Player; using Robust.Shared.Timing; namespace Content.Shared.Bed.Cryostorage; @@ -17,13 +18,14 @@ namespace Content.Shared.Bed.Cryostorage; /// </summary> public abstract class SharedCryostorageSystem : EntitySystem { - [Dependency] protected readonly ISharedAdminLogManager AdminLog = default!; - [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly ISharedPlayerManager _player = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] protected readonly IGameTiming Timing = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] protected readonly ISharedAdminLogManager AdminLog = default!; [Dependency] protected readonly SharedMindSystem Mind = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; protected EntityUid? PausedMap { get; private set; } @@ -123,7 +125,8 @@ public abstract class SharedCryostorageSystem : EntitySystem if (args.Dragged == args.User) return; - if (!Mind.TryGetMind(args.Dragged, out _, out var mindComp) || mindComp.Session?.AttachedEntity != args.Dragged) + if (!_player.TryGetSessionByEntity(args.Dragged, out var session) || + session.AttachedEntity != args.Dragged) return; args.CanDrop = false; diff --git a/Content.Shared/Mind/MindComponent.cs b/Content.Shared/Mind/MindComponent.cs index 3b2b934478..7864d61a8c 100644 --- a/Content.Shared/Mind/MindComponent.cs +++ b/Content.Shared/Mind/MindComponent.cs @@ -113,12 +113,4 @@ public sealed partial class MindComponent : Component /// </summary> [DataField] public LocId? Subtype; - - /// <summary> - /// The session of the player owning this mind. - /// Can be null, in which case the player is currently not logged in. - /// </summary> - [ViewVariables, Access(typeof(SharedMindSystem), typeof(SharedGameTicker))] - // TODO remove this after moving IPlayerManager functions to shared - public ICommonSession? Session { get; set; } } diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs index 1b1fcabc98..ab17a4221e 100644 --- a/Content.Shared/Mind/SharedMindSystem.cs +++ b/Content.Shared/Mind/SharedMindSystem.cs @@ -26,6 +26,7 @@ public abstract partial class SharedMindSystem : EntitySystem [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedObjectivesSystem _objectives = default!; [Dependency] private readonly SharedPlayerSystem _player = default!; + [Dependency] private readonly ISharedPlayerManager _playerManager = default!; [Dependency] private readonly MetaDataSystem _metadata = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; @@ -153,23 +154,31 @@ public abstract partial class SharedMindSystem : EntitySystem if (!mindContainer.ShowExamineInfo || !args.IsInDetailsRange) return; - // TODO predict we can't right now because session stuff isnt networked + // TODO: Move this out of the SharedMindSystem into its own comp and predict it if (_net.IsClient) return; var dead = _mobState.IsDead(uid); - var hasUserId = CompOrNull<MindComponent>(mindContainer.Mind)?.UserId; - var hasSession = CompOrNull<MindComponent>(mindContainer.Mind)?.Session; + var mind = CompOrNull<MindComponent>(mindContainer.Mind); + var hasUserId = mind?.UserId; + var hasActiveSession = hasUserId != null && _playerManager.ValidSessionId(hasUserId.Value); + + // Scenarios: + // 1. Dead + No User ID: Entity is permanently dead with no player ever attached + // 2. Dead + Has User ID + No Session: Player died and disconnected + // 3. Dead + Has Session: Player is dead but still connected + // 4. Alive + No User ID: Entity was never controlled by a player + // 5. Alive + No Session: Player disconnected while alive (SSD) if (dead && hasUserId == null) args.PushMarkup($"[color=mediumpurple]{Loc.GetString("comp-mind-examined-dead-and-irrecoverable", ("ent", uid))}[/color]"); - else if (dead && hasSession == null) + else if (dead && !hasActiveSession) args.PushMarkup($"[color=yellow]{Loc.GetString("comp-mind-examined-dead-and-ssd", ("ent", uid))}[/color]"); else if (dead) args.PushMarkup($"[color=red]{Loc.GetString("comp-mind-examined-dead", ("ent", uid))}[/color]"); else if (hasUserId == null) args.PushMarkup($"[color=mediumpurple]{Loc.GetString("comp-mind-examined-catatonic", ("ent", uid))}[/color]"); - else if (hasSession == null) + else if (!hasActiveSession) args.PushMarkup($"[color=yellow]{Loc.GetString("comp-mind-examined-ssd", ("ent", uid))}[/color]"); } @@ -460,12 +469,6 @@ public abstract partial class SharedMindSystem : EntitySystem return false; } - public bool TryGetSession(EntityUid? mindId, [NotNullWhen(true)] out ICommonSession? session) - { - session = null; - return TryComp(mindId, out MindComponent? mind) && (session = mind.Session) != null; - } - /// <summary> /// Gets a mind from uid and/or MindContainerComponent. Used for null checks. /// </summary> diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index 83ef6cbf23..0407251414 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -10,6 +10,7 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Configuration; using Robust.Shared.Map; +using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -18,12 +19,13 @@ namespace Content.Shared.Roles; public abstract class SharedRoleSystem : EntitySystem { - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly IConfigurationManager _cfg = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; - [Dependency] private readonly SharedMindSystem _minds = default!; - [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] protected readonly ISharedPlayerManager Player = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedMindSystem _minds = default!; private JobRequirementOverridePrototype? _requirementOverride; @@ -256,7 +258,7 @@ public abstract class SharedRoleSystem : EntitySystem Dirty(mind, comp); // Update player character window - if (_minds.TryGetSession(mind, out var session)) + if (Player.TryGetSessionById(comp.UserId, out var session)) RaiseNetworkEvent(new MindRoleTypeChangedEvent(), session.Channel); else { @@ -589,8 +591,11 @@ public abstract class SharedRoleSystem : EntitySystem /// </summary> public void MindPlaySound(EntityUid mindId, SoundSpecifier? sound, MindComponent? mind = null) { - if (Resolve(mindId, ref mind) && mind.Session != null) - _audio.PlayGlobal(sound, mind.Session); + if (!Resolve(mindId, ref mind)) + return; + + if (Player.TryGetSessionById(mind.UserId, out var session)) + _audio.PlayGlobal(sound, session); } // TODO ROLES Change to readonly. From 615584e7e4bc7498854552b9e78f7f4d17c1826f Mon Sep 17 00:00:00 2001 From: Ilya246 <57039557+Ilya246@users.noreply.github.com> Date: Sat, 19 Apr 2025 02:45:20 +0400 Subject: [PATCH 314/622] extend hotbar hotkeys to 20 keys via shift (#33872) shift+ keys in hotbar --- Content.Shared/Input/ContentKeyFunctions.cs | 13 +++++- .../en-US/escape-menu/ui/options-menu.ftl | 20 ++++++++++ Resources/keybinds.yml | 40 +++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index 863d9da970..76f30646b0 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -87,11 +87,22 @@ namespace Content.Shared.Input public static readonly BoundKeyFunction Hotbar7 = "Hotbar7"; public static readonly BoundKeyFunction Hotbar8 = "Hotbar8"; public static readonly BoundKeyFunction Hotbar9 = "Hotbar9"; + public static readonly BoundKeyFunction HotbarShift0 = "HotbarShift0"; + public static readonly BoundKeyFunction HotbarShift1 = "HotbarShift1"; + public static readonly BoundKeyFunction HotbarShift2 = "HotbarShift2"; + public static readonly BoundKeyFunction HotbarShift3 = "HotbarShift3"; + public static readonly BoundKeyFunction HotbarShift4 = "HotbarShift4"; + public static readonly BoundKeyFunction HotbarShift5 = "HotbarShift5"; + public static readonly BoundKeyFunction HotbarShift6 = "HotbarShift6"; + public static readonly BoundKeyFunction HotbarShift7 = "HotbarShift7"; + public static readonly BoundKeyFunction HotbarShift8 = "HotbarShift8"; + public static readonly BoundKeyFunction HotbarShift9 = "HotbarShift9"; public static BoundKeyFunction[] GetHotbarBoundKeys() => new[] { - Hotbar1, Hotbar2, Hotbar3, Hotbar4, Hotbar5, Hotbar6, Hotbar7, Hotbar8, Hotbar9, Hotbar0 + Hotbar1, Hotbar2, Hotbar3, Hotbar4, Hotbar5, Hotbar6, Hotbar7, Hotbar8, Hotbar9, Hotbar0, + HotbarShift1, HotbarShift2, HotbarShift3, HotbarShift4, HotbarShift5, HotbarShift6, HotbarShift7, HotbarShift8, HotbarShift9, HotbarShift0 }; public static readonly BoundKeyFunction Vote0 = "Vote0"; diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 95c002b745..357f551bc4 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -227,6 +227,16 @@ ui-options-function-hotbar7 = Hotbar slot 7 ui-options-function-hotbar8 = Hotbar slot 8 ui-options-function-hotbar9 = Hotbar slot 9 ui-options-function-hotbar0 = Hotbar slot 0 +ui-options-function-hotbarshift1 = Hotbar slot Shift+1 +ui-options-function-hotbarshift2 = Hotbar slot Shift+2 +ui-options-function-hotbarshift3 = Hotbar slot Shift+3 +ui-options-function-hotbarshift4 = Hotbar slot Shift+4 +ui-options-function-hotbarshift5 = Hotbar slot Shift+5 +ui-options-function-hotbarshift6 = Hotbar slot Shift+6 +ui-options-function-hotbarshift7 = Hotbar slot Shift+7 +ui-options-function-hotbarshift8 = Hotbar slot Shift+8 +ui-options-function-hotbarshift9 = Hotbar slot Shift+9 +ui-options-function-hotbarshift0 = Hotbar slot Shift+0 ui-options-function-loadout1 = Hotbar Loadout 1 ui-options-function-loadout2 = Hotbar Loadout 2 ui-options-function-loadout3 = Hotbar Loadout 3 @@ -237,6 +247,16 @@ ui-options-function-loadout7 = Hotbar Loadout 7 ui-options-function-loadout8 = Hotbar Loadout 8 ui-options-function-loadout9 = Hotbar Loadout 9 ui-options-function-loadout0 = Hotbar Loadout 0 +ui-options-function-loadoutshift1 = Hotbar Loadout Shift+1 +ui-options-function-loadoutshift2 = Hotbar Loadout Shift+2 +ui-options-function-loadoutshift3 = Hotbar Loadout Shift+3 +ui-options-function-loadoutshift4 = Hotbar Loadout Shift+4 +ui-options-function-loadoutshift5 = Hotbar Loadout Shift+5 +ui-options-function-loadoutshift6 = Hotbar Loadout Shift+6 +ui-options-function-loadoutshift7 = Hotbar Loadout Shift+7 +ui-options-function-loadoutshift8 = Hotbar Loadout Shift+8 +ui-options-function-loadoutshift9 = Hotbar Loadout Shift+9 +ui-options-function-loadoutshift0 = Hotbar Loadout Shift+0 ui-options-function-shuttle-strafe-up = Strafe up ui-options-function-shuttle-strafe-right = Strafe right diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 3b8158b7c7..8d4df5b92f 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -554,6 +554,46 @@ binds: - function: Hotbar9 type: State key: Num9 +- function: HotbarShift0 + type: State + key: Num0 + mod1: Shift +- function: HotbarShift1 + type: State + key: Num1 + mod1: Shift +- function: HotbarShift2 + type: State + key: Num2 + mod1: Shift +- function: HotbarShift3 + type: State + key: Num3 + mod1: Shift +- function: HotbarShift4 + type: State + key: Num4 + mod1: Shift +- function: HotbarShift5 + type: State + key: Num5 + mod1: Shift +- function: HotbarShift6 + type: State + key: Num6 + mod1: Shift +- function: HotbarShift7 + type: State + key: Num7 + mod1: Shift +- function: HotbarShift8 + type: State + key: Num8 + mod1: Shift +- function: HotbarShift9 + type: State + key: Num9 + mod1: Shift - function: MappingUnselect type: State key: MouseRight From fbf7dd9fba6a17e11acfd75c6e729e9df98615d9 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 22:46:29 +0000 Subject: [PATCH 315/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 11beaaf23c..9724f962e7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: Cargo armor crate now correctly indicates that it contains bulletproof - vests. - type: Fix - id: 7736 - time: '2024-12-19T17:21:28.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33414 - author: Piras314 changes: - message: Removed the nuke song "Clearly Nuclear" on request of the author. @@ -3906,3 +3898,11 @@ id: 8236 time: '2025-04-18T19:56:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34627 +- author: Ilya246 + changes: + - message: The actions hotbar now has up to 10 more hotkeys accessible through the + shift key. + type: Add + id: 8237 + time: '2025-04-18T22:45:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33872 From b96fa3dcfafab6c5a722fc49f14919ad07c67f51 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sat, 19 Apr 2025 00:52:09 +0200 Subject: [PATCH 316/622] Fix space wind layer removal (#33888) * Fix space wind layer removal * apply review * Update MovedByPressureComponent.cs * remove this --- .../AtmosphereSystem.HighPressureDelta.cs | 16 ++++++++++++---- .../Atmos/Components/MovedByPressureComponent.cs | 6 ++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index 6a5b07bb17..cdf7018e23 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -56,11 +56,15 @@ namespace Content.Server.Atmos.EntitySystems _physics.SetBodyStatus(uid, body, BodyStatus.OnGround); } - if (TryComp<FixturesComponent>(uid, out var fixtures)) + if (TryComp<FixturesComponent>(uid, out var fixtures) + && TryComp<MovedByPressureComponent>(uid, out var component)) { foreach (var (id, fixture) in fixtures.Fixtures) { - _physics.AddCollisionMask(uid, id, fixture, (int) CollisionGroup.TableLayer, manager: fixtures); + if (component.TableLayerRemoved.Contains(id)) + { + _physics.AddCollisionMask(uid, id, fixture, (int)CollisionGroup.TableLayer, manager: fixtures); + } } } } @@ -80,9 +84,13 @@ namespace Content.Server.Atmos.EntitySystems foreach (var (id, fixture) in fixtures.Fixtures) { - _physics.RemoveCollisionMask(uid, id, fixture, (int) CollisionGroup.TableLayer, manager: fixtures); + // Mark fixtures that have TableLayer removed + if ((fixture.CollisionMask & (int)CollisionGroup.TableLayer) != 0) + { + component.TableLayerRemoved.Add(id); + _physics.RemoveCollisionMask(uid, id, fixture, (int)CollisionGroup.TableLayer, manager: fixtures); + } } - // TODO: Make them dynamic type? Ehh but they still want movement so uhh make it non-predicted like weightless? // idk it's hard. diff --git a/Content.Shared/Atmos/Components/MovedByPressureComponent.cs b/Content.Shared/Atmos/Components/MovedByPressureComponent.cs index 8a4e2c6d4c..67647daa80 100644 --- a/Content.Shared/Atmos/Components/MovedByPressureComponent.cs +++ b/Content.Shared/Atmos/Components/MovedByPressureComponent.cs @@ -27,5 +27,11 @@ public sealed partial class MovedByPressureComponent : Component [ViewVariables(VVAccess.ReadWrite)] public int LastHighPressureMovementAirCycle { get; set; } = 0; + + /// <summary> + /// Used to remember which fixtures we have to remove the table mask from and give it back accordingly + /// </summary> + [DataField] + public HashSet<string> TableLayerRemoved = new(); } From 646baebea9fa1245960680728fee5bd4e1d1a335 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 22:53:16 +0000 Subject: [PATCH 317/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9724f962e7..84b76acf91 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Piras314 - changes: - - message: Removed the nuke song "Clearly Nuclear" on request of the author. - type: Remove - id: 7737 - time: '2024-12-20T14:35:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33971 - author: VlaDOS1408 changes: - message: The Communication Console UI is now resizable. @@ -3906,3 +3899,11 @@ id: 8237 time: '2025-04-18T22:45:20.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33872 +- author: lzk228 + changes: + - message: Fixed breaking small mobs (e.g. mice) mask after getting into an air + flow. + type: Fix + id: 8238 + time: '2025-04-18T22:52:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33888 From 44b8b3e5ce4614a2395b72a63e6a09b57a11ef36 Mon Sep 17 00:00:00 2001 From: YoungThug <ramialanbagy@gmail.com> Date: Fri, 18 Apr 2025 16:19:04 -0700 Subject: [PATCH 318/622] New Speech Indicators for species that don't have any. (#36126) * DionaAndGingerbread * DionaSpeechTweaks * FixGingerbread * IfYourReadingThisYouMatter --- .../Entities/Mobs/Species/diona.yml | 2 + .../Entities/Mobs/Species/gingerbread.yml | 2 + Resources/Prototypes/typing_indicator.yml | 10 +++++ .../Textures/Effects/speech.rsi/diona0.png | Bin 0 -> 537 bytes .../Textures/Effects/speech.rsi/diona1.png | Bin 0 -> 297 bytes .../Textures/Effects/speech.rsi/diona2.png | Bin 0 -> 282 bytes .../Effects/speech.rsi/gingerbread0.png | Bin 0 -> 450 bytes .../Effects/speech.rsi/gingerbread1.png | Bin 0 -> 231 bytes .../Effects/speech.rsi/gingerbread2.png | Bin 0 -> 219 bytes .../Textures/Effects/speech.rsi/meta.json | 36 +++++++++++++++++- 10 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Effects/speech.rsi/diona0.png create mode 100644 Resources/Textures/Effects/speech.rsi/diona1.png create mode 100644 Resources/Textures/Effects/speech.rsi/diona2.png create mode 100644 Resources/Textures/Effects/speech.rsi/gingerbread0.png create mode 100644 Resources/Textures/Effects/speech.rsi/gingerbread1.png create mode 100644 Resources/Textures/Effects/speech.rsi/gingerbread2.png diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 5ae09c4d82..1e39eaec76 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -92,6 +92,8 @@ Male: UnisexDiona Female: UnisexDiona Unsexed: UnisexDiona + - type: TypingIndicator + proto: diona - type: BodyEmotes soundsId: DionaBodyEmotes - type: IgnoreKudzu diff --git a/Resources/Prototypes/Entities/Mobs/Species/gingerbread.yml b/Resources/Prototypes/Entities/Mobs/Species/gingerbread.yml index 003eeb8c50..cc4b506dc8 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/gingerbread.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/gingerbread.yml @@ -42,6 +42,8 @@ - MobMask layer: - MobLayer + - type: TypingIndicator + proto: gingerbread - type: Inventory femaleDisplacements: jumpsuit: diff --git a/Resources/Prototypes/typing_indicator.yml b/Resources/Prototypes/typing_indicator.yml index 7271770ef5..295af30d16 100644 --- a/Resources/Prototypes/typing_indicator.yml +++ b/Resources/Prototypes/typing_indicator.yml @@ -48,3 +48,13 @@ id: slime typingState: slime0 offset: 0, 0.125 + +- type: typingIndicator + id: gingerbread + typingState: gingerbread0 + offset: 0, 0.125 + +- type: typingIndicator + id: diona + typingState: diona0 + offset: 0, 0.125 diff --git a/Resources/Textures/Effects/speech.rsi/diona0.png b/Resources/Textures/Effects/speech.rsi/diona0.png new file mode 100644 index 0000000000000000000000000000000000000000..c833b9bbdd6a2ba91c54e135609da8dcf65a2599 GIT binary patch literal 537 zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px$(Md!>RCr$PTES_<KoFEj1Hv5y0)B^pAyv46Kw3yCZo!ZSTty&Y@(u*jfl&h? z;RGvW=?-7;>>UH6=h@!bo0+?n*=?K1^ZfGo8<zLGw>I{<_gYE(VS@oMw%Pf5>U-A` zQWJk9z!ZPlt_Ss}&+Fl{_1e4%Pz(Re;$f2y-D)A|`^Q&vbGvds5;gEg0)q0J`@5u@ z0|~(i*V;Yx`&#%Sz!b?<!0RqB{BGMf{h^B<Lyx;C+X2V^G$iF!8ZQapg+CGyl>PZW zHL-iZ`}|uasDZzD515ugBg313>9Hz}AHCHrA+x170rLZ25<gkirb&2~zf@T)h3{6^ zz1|nlaYX={QMPz;0GndyeB}T%qipfy05-+Y`N{!kM%m)Y0c?t)^OXb8jIza(1K1Qp z=PL)G8D)zn2gDRB*`KeCulWG$%2?Y=^8uO<h~MMh-Jwg(Q7`=L?yy$^|838s%j|*x z>(9^o^hQ9b`G9#IUijG#@aoU!I=~BG^8r={ZStdZf4(-p<^yW?=WFBZ&k(w<vc;1F z*c3zOD+iz%Ws4^VuqlSlR}Mfk$`(%!U{eg8uN;78lr5edz@`{FUpWBHC|f)^fK4%U bzJKcGzEI*r5TO77002ovPDHLkV1fVu^&9*n literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/diona1.png b/Resources/Textures/Effects/speech.rsi/diona1.png new file mode 100644 index 0000000000000000000000000000000000000000..bcea111c491a831c55c11dab1d2c4f86c5e68761 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}k33x*Ln7Rh zQw}ga;@0`!+#>F0ajwI6-mIhqZU?cX%{;L()2+N@SjrjB95?*;D&f9zv#NBy(WOI0 z6J#|Uc{Ux1aNs!Xy!_n##Dp-BMV?a*$TED|IddV`jUvYX{0YAfyD{!acIabhWl=rY z>#HBeen6y2hN+n4u53e&<q1av_5f?$2Rw`=>~sEp;FB@9a&A@udqd5)@BggXBCH(x z^rKkqZNwGWwTsMJEZd&(Irz^tU_V&I2Gky7)g<HC{f7Os$<@!ME1w=&!R+RoV8Vh% du-ULMBrGXcY+B)D2=pz3r>mdKI;Vst1_0+&W_$nu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/diona2.png b/Resources/Textures/Effects/speech.rsi/diona2.png new file mode 100644 index 0000000000000000000000000000000000000000..dd40a2ea3a890bc789cca024cdc0c197182b4581 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S3F%DLn7Rh zQw}ga;@0`!+#>F0ajwI6-mIhqZU?cX%{;L()2+N@SjrjB95?*;D&f9zv#NBy(WOI0 z6J#|Uc{Ux1aNs!Xy!_n##Dp-BMV?a*$TED|IddV`og&8n{5<kzTnBzCxHmX8O?q%_ zS@{PmhPzug2rMXzQm|q<S69JaCcJgC+8suP`G5ER?_;!-J>b+B_L2WQ>xqM1b9fW` z7Vc!e@L2kpLd3ZRyO}3=yH8NgnD{qg-m<EFYFp<>lpe_7=xIYI8rm5cvLBZy3Z`9t Q4fG#_r>mdKI;Vst02$_Pa{vGU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/gingerbread0.png b/Resources/Textures/Effects/speech.rsi/gingerbread0.png new file mode 100644 index 0000000000000000000000000000000000000000..39be04648d3b1976e9f7c01d9226fed8f543950b GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zt2|vCLn`9l z&f3U($U%U`*N4+Dvzbf4RABOiKvqdkLsJE<1-wDi9e6e!i7wbyxMh2J(#d-V-&dCZ z`TwFWY-apr6aU|9*1eut+a^{0x_)njcAf3p>i64j$!YNmOZ=M4nEdD{?-ov-TFC&R zG}VN!;?JW?@9W&Pa~AxNX__pU^!od@?dNk>yy1AkdSO<;F}Yv%-@iMxEN66fQTVFP zZ?TqBF1=x6vuITPC59`V`lt37DR>F3v2tNJ{ZnI?5~=J1Y7g(uPk;TouHo&uzS`L* z-ubLP`O0s#bq=S--=B9M2gyEv&Bvk7w5CpS@fX(v0p{1%F>8EpFJpM`9komT!)upi zzZu`Z_59AfNahY>>5Kgg2d;z!cQu3*GIohFG6V<vYBB{KWz`5{Ves)aUCQAhD!w2> tkio$8>J%k~(3plKS0oL8tC`|@@`M6TdU+fHMhSzbtDnm{r-UX31^~LfwhaIP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/gingerbread1.png b/Resources/Textures/Effects/speech.rsi/gingerbread1.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ab1a0aefb054fe5a4b88a951f1932076301519 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}3p`yMLn7Rh zQyiH6=iB}5*HhEgJ=>w@rfb)AP~r4;KmDTyx2-qNZVc;dux7YfG_|!|a*vapfzP9F zt=4T}eFt7K%vh_?ey4LgYw^o>4SUwlW;bJ*Q0qTkfFaUoL8pM&`x7?>rYUEL{#UU6 z_$)u7gJ%YF!bPXmMhyuZ0jswhPUkz@6_F%s|El4lfCO(N2Eo8E)4*5p3`@B_(5(!f Mu6{1-oD!NC02?z>G5`Po literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/gingerbread2.png b/Resources/Textures/Effects/speech.rsi/gingerbread2.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf41c4212fc1392f2acefb0275b221e35e9ccc2 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Q#@T9Ln7Rh zQyiH6=iB}5*HhEgJ=>w@rfb)AP~r4;KmDTyx2-qNZVc;dux7YhG_|!|^4*c!hh&|# z-Ff2J7aV84>#Xqpby}O}oqb=rnI`x$&*Dgob3NC#LB?_Q1NNJp=Jki2QVz&4bc;nz zWn^(~h*~OZSDX=cMCkR8K=z)t0~s6`1OvmgL{G(}SW!cu`xrc3{an^LB{VSr0OuG@ A-T(jq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/meta.json b/Resources/Textures/Effects/speech.rsi/meta.json index 98dd3b2060..17cf95079d 100644 --- a/Resources/Textures/Effects/speech.rsi/meta.json +++ b/Resources/Textures/Effects/speech.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github) | Spider sprites made by PixelTheKermit (Github) | Lizard sprites made by AmalgoMyte (Github)", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github) | Spider sprites made by PixelTheKermit (Github) | Lizard sprites made by AmalgoMyte (Github) | Diona and Gingerbread sprites made by YoungThugSS14 (Github)", "states": [ { "name": "alien0", @@ -125,6 +125,40 @@ { "name": "default2" }, + { + "name": "diona0", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.4 + ] + ] + }, + { + "name": "diona1" + }, + { + "name": "diona2" + }, + { + "name": "gingerbread0", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.4 + ] + ] + }, + { + "name": "gingerbread1" + }, + { + "name": "gingerbread2" + }, { "name": "guardian0", "delays": [ From 280a21733ed5de52358db709a23dc08aa63bbc74 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 23:20:11 +0000 Subject: [PATCH 319/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 84b76acf91..268642a450 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: VlaDOS1408 - changes: - - message: The Communication Console UI is now resizable. - type: Fix - id: 7738 - time: '2024-12-20T16:17:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33655 - author: RatIRL changes: - message: Added All-Hostile ballistic turret. @@ -3907,3 +3900,10 @@ id: 8238 time: '2025-04-18T22:52:09.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33888 +- author: YoungThugSS14 + changes: + - message: The Diona and Gingerbread species now get unique typing indicators + type: Add + id: 8239 + time: '2025-04-18T23:19:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36126 From 5a1dd9de422684f1ef64a286bc52b6bd7e11bbdb Mon Sep 17 00:00:00 2001 From: Skye <57879983+Rainbeon@users.noreply.github.com> Date: Fri, 18 Apr 2025 19:26:44 -0400 Subject: [PATCH 320/622] Fix Speedloader Partial Reload (#32396) --- .../Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs index 2c0204d946..38f427429f 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs @@ -130,7 +130,7 @@ public partial class SharedGunSystem return false; } - for (var i = Math.Min(ev.Ammo.Count - 1, component.Capacity - 1); i >= 0; i--) + for (var i = 0; i < component.Capacity; i++) { var index = (component.CurrentIndex + i) % component.Capacity; From 4547da96605fe298a953f0d45652fb1000fb4fd3 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 23:27:51 +0000 Subject: [PATCH 321/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 268642a450..f491491794 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: RatIRL - changes: - - message: Added All-Hostile ballistic turret. - type: Add - id: 7739 - time: '2024-12-20T20:34:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33970 - author: Beck Thompson changes: - message: Defibrillator cooldowns are now clearly visible. @@ -3907,3 +3900,15 @@ id: 8239 time: '2025-04-18T23:19:05.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36126 +- author: Rainbeon + changes: + - message: Fixed Revolvers not correctly reloading from Speedloaders when the Revolver + is partially loaded. + type: Fix + - message: Speedloaders will now prioritize loading the active and upcoming chambers + in a Revolver when the Speedloader is only partially filled, rather than the + ones farthest away. + type: Fix + id: 8240 + time: '2025-04-18T23:26:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32396 From 3957bbb97d7cd59ce32d9aff736ab52954b0c095 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sat, 19 Apr 2025 01:34:59 +0200 Subject: [PATCH 322/622] Updated air scrubber and air vent sprites. (#34223) * vents * slower animation * formatting fix * scrubber --- .../Atmospherics/scrubber.rsi/meta.json | 163 ++++++++++++++---- .../Atmospherics/scrubber.rsi/scrub_off.png | Bin 1002 -> 1213 bytes .../Atmospherics/scrubber.rsi/scrub_on.png | Bin 20683 -> 6218 bytes .../Atmospherics/scrubber.rsi/scrub_purge.png | Bin 7441 -> 6204 bytes .../Atmospherics/scrubber.rsi/scrub_wide.png | Bin 10949 -> 6620 bytes .../Piping/Atmospherics/vent.rsi/meta.json | 136 +++++++++++---- .../Piping/Atmospherics/vent.rsi/vent_in.png | Bin 1595 -> 4224 bytes .../Atmospherics/vent.rsi/vent_lockout.png | Bin 1302 -> 1195 bytes .../Piping/Atmospherics/vent.rsi/vent_off.png | Bin 1117 -> 1221 bytes .../Piping/Atmospherics/vent.rsi/vent_out.png | Bin 2926 -> 4296 bytes .../Atmospherics/vent.rsi/vent_passive.png | Bin 2958 -> 853 bytes .../Atmospherics/vent.rsi/vent_welded.png | Bin 1958 -> 1845 bytes 12 files changed, 232 insertions(+), 67 deletions(-) diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json index 191aa398a9..88eeace3d8 100644 --- a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json @@ -1,34 +1,133 @@ { - "version":1, - "size":{ - "x":32, - "y":32 - }, - "license":"CC-BY-SA-3.0", - "copyright":"Taken from https://github.com/tgstation/tgstation at commit 57cd1d59ca019dd0e7811ac451f295f818e573da", - "states":[ - { - "name":"scrub_off", - "directions": 4 - }, - { - "name":"scrub_welded", - "directions": 4 - }, - { - "name":"scrub_on", - "directions": 4, - "delays": [[0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08], [0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08], [0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08], [0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08]] - }, - { - "name": "scrub_purge", - "directions": 4, - "delays": [[0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]] - }, - { - "name": "scrub_wide", - "directions": 4, - "delays": [[0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]] - } - ] + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/32742/commits/44820f5b6e2c864a35bfad448e0a9437f01ad2e2", + "states": [ + { + "name": "scrub_off", + "directions": 4 + }, + { + "name": "scrub_welded", + "directions": 4 + }, + { + "name": "scrub_on", + "directions": 4, + "delays": [ + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ], + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ], + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ], + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ] + ] + }, + { + "name": "scrub_purge", + "directions": 4, + "delays": [ + [ + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06 + ], + [ + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06 + ], + [ + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06 + ], + [ + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06 + ] + ] + }, + { + "name": "scrub_wide", + "directions": 4, + "delays": [ + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ], + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ], + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ], + [ + 0.10, + 0.10, + 0.10, + 0.10, + 0.10, + 0.10 + ] + ] + } + ] } diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_off.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_off.png index efc173d893669b4ff418f61ae32ccd3d92ffd3fd..8f7e5e6782be6beba8daa6b5cb702bafd38ea77e 100644 GIT binary patch delta 1194 zcmV;b1XcU$2fYc9BYyx1a7bBm000ie000ie0hKEb8vp<VZ%IT!RCt{2n!QroKoEr2 zRSwA^F$sxDATbF!Bqre%Om3b9=kN+7IDwo5Cy?NT1SgP_pYPjJtL9Xa_D3uKl+;yM zcRJl|&-9K)tDSl8CXQJEH*w4YxQSyHAmzvV`}+%hetms)>woL(^}BF;d;89fgyZAm zAphm%WfFh1064$1vr`|p8L+Xj!P{aC5pe$S@UT9<zrT08ySw$f!6HS3C;{X=&c409 z`FDWhPft(&wY9b7zpIQaDuSGc7l+{!mOTCiKlW5&M2ip<z&a1{&&Nmq{g;yy|DBF` z|G2&F4Z+x@F@KBHaBPE|zrMbX=0}9(xu{9#6~H==y5Fy^>T_#rYwqFUVdeK2N`#oO z93+BuK9xT<5<3NG&OFL~+S_wK?(XW}*yQu|^wftU=a~u4$%q^gY}gOw?-L<-37{z9 z#S0Pu$<itR`NQTW#@6J3-zp~z1+zIOe^3A=Jn-%8%zqofcaQ=E!kAyr&ny44iE0S! zIF|q5;Gq7#i{C~_7di!i#5!-ua2^8X28_A6xmgi~8DaL?#)yG3ej7i0vagT7%Lj{2 z0T@^>!bxOGJZ<X$E6Os5C>v)9U~XwaeuaCJU*q&eV=w~vGlPi)15mha6=t(EiAdw* zKoP)9Hh=l$ScqT3^&uDm2yk(JzH*LmBkV-3@Z%b_C=me&(8VuNbXhj}tq)xYCP7HF z*Z|y$m=R@RKmx*05|oT6br;Cxk4b=_SAc45@52crL@tugM@Qa3j&%#d2o^4l^?5dM zB!{1cQVco;s1^@?F#-w13~Iy7CLn+jES|J3$A6IAm0<P11w!WXlP|JYg20NPgk%8; z2~l9CFiOkUq0a(VgcSZ*=Rq(BFbEGe7@=FDk_yKdWgkL@&U_P$!-GxrfYr&*XCfrU zc@XtDteI$g9tZY%FX_BsBN6Bp2o&x@it`|PLqsCzSnGu5YOA#Kf<&<VC3d8ew#3GA zE`JtH=X5CydG44uMcu?P3*aV>SpYY2%mTQHV-~<o9J2s!;z$x;jQV^E#^_Io7GSLU zd@OJt{+E{*f7~U2ODxSt34rr*R<#1b*5~=nkb-Cztn-%N_9tjZsA}R^6x$JkT+WB; z^Qz*O6v2ug(;om*L<sf=XhSrmKF_vT34al+^C|oY6DvY*e}KX+r#`RUVK=ZpKr^4p z4`M{<jR0M9IrVwdr7;M({3?ru5X=EX>hmSg$FJ&78-KHC(uJ)4fY|!{*!=<I0Qlim zfz<Mk)*qk*G}-<D4g9b42dF&u$NB>lZV*8JxB3G@{Ru_-0~p|c><=i`CC2rhQ-7b2 zZBPh-D9{Qpm7o5G=3=RdV1Ixbq*LqjkeBEW$n8%Mf06zGb&ST==e2w-)gPdKgB1Q4 z=Rs6|fHRR`OViE%0EJyFc?_%w&2I57{_5^gu0OzvVAln}*5^w*FIW+@ye`$B5WOK1 zQ=d<5PDsI6{Rv51Vq?_jQ!vI((<8ho>L!j^05@^W0=S9eH`U;qlz%spd;kCd07*qo IM6N<$f`qm|p#T5? delta 981 zcmV;`11kKz3F-%sBYy+2Nkl<Zc%1E;F>l*O7=|C$od|F^psYA>5N~k^Gx1;;@L+rK zV59~AMS;!%@|!vqC^QL$mN<hK54I`LT23BrpuvFyk=p`gaCEIvNVaK-9dz#|9mVJF z(|sTK@m_Fpa&mIoTy4Gd2U(WQ0Lrqo--Tfaz+f<V@%{d9{(p}z0heWo5CSPBp6A&y zV+=|u4h{}xVHmC@5bNSU>%uI{W<m(kG{qQ0(==37MP1hjAqav1-}mu6k37$*>w2X@ zSSSC<9gt<&Y=3{>-aH5bs;XjgTQHtzc6TCsty0QP5}2(b2<ztm@DyAKVd0b8g1f0g zO38Sl0T@p-Qh!SBri#gJL7wM$o`(>^=Id(~zi$500F-4(nx+;$o@j=n3!0|k?DP<T zv(rPGreQd`U_8-w5^0(~DpYOM1%F`xvMie=NrEwkAP9(}f417^^H20+$=T^4{aEt( z{F5DvqKF^}FvgH1N$XwE6@O_BNYj-2`+KUY;_bUV3xAtW=Iy&Znx?UzkB(39eIKQi z{r&m*d7Jfj#$OnKvMiZSzw+hFL&5p;ufI7vJ>=;41OVUnxw*cw6YIwhc{m(h*urGY zPp#9SEB?|N08rPpEjYu`1$R^R2!3;Yh41?o4iAN?uIp9{@0$N)0E7@WqVt?<n#RKC z+i;$f0DrqX5kiPo3+|e~Fa^ReB#yVazYhR-|I4p5O=EMgA4?0rn<}){937wV@xvZU zDS{xN*V{(xu+_r5;x8?Nd7dMs1mNcS%5E`$ek{4UzM>yXwAPF#n(^ch`!D&vPoC$k z7T+a*VG0ZegRP<{@H~&Is?b{7v7_S?n{#(lWq%73fYzF-s_;CIq9|HF5_iR4x&y*6 zv=0??MNx$B`}W@$jxPB4VUM%ZL$ucHyh-fC%e+f#t1kFUi{M}|*sALqV+?7UvhyaP zA4`-{wlMAPL@1@`$I`-$F)L|^y5K+A41K@Jqi$@jpL^k>Zmieqt-KptH~-m_ocH5N zl7B4h$BUw1-R}cd&ENPpLQYOjPEJlvPEJlvP8+F>?*?1>1JX2QI{j+L;&_`p&pY!6 ztdj5i0ndRue}MA`IDf!q`U9ktw&1impO;c{d3o7p{r}<jW6AHot)9QsAK-Z&N~zZ8 z^Sxg0RsMi3_|6~j)CC*u511DqXm>tuj818NK-v|5X%SRPz3O~^UX0qR3%>IQEE{zG z0Ot>I{s60gpU*Gq$Gh?etdhU+Z-ktjoSdATHdx;Pxa0vevn7qZ00000NkvXXu0mjf Du-Wmf diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_on.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_on.png index 9bc5d8c0bf341e5ecd829e77a0e1b8f689be12cb..bdef533ae36dd9ff691ee057dd48a3444f6c1093 100644 GIT binary patch literal 6218 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 M;E@AGR%asr3%w$v8vp<R literal 20683 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 NE?>J;a?#?!{{!f+=`#QT diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_purge.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_purge.png index 75ba6d6de046aae288fa21c5aa213a07c35a64a6..6bbc79c31b2b608934a9acc0380951052ecde90b 100644 GIT binary patch literal 6204 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 Ul2s)9cYuJIiRGz$qido60X#*jkN^Mx literal 7441 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 JEWCgU`(G|XNS^=z diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_wide.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_wide.png index 087777a888b4e36294cf5c6e2b17f25d92bc1031..c7fd087c81d7f95f779b5626e7f086dc8f2313e4 100644 GIT binary patch literal 6620 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 WbuYi0g#WG)usm*atlZo+{Qm$+I5~^} literal 10949 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 diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json index 74e1688748..d22d006684 100644 --- a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json @@ -1,37 +1,103 @@ { - "version":1, - "size":{ - "x":32, - "y":32 - }, - "license":"CC-BY-SA-3.0", - "copyright":"Taken from https://github.com/BeeStation/BeeStation-Hornet at commit 4ccd79de285e79e504308bcd6fa5908d6b7685f7", - "states":[ - { - "name":"vent_passive", - "directions" : 4 - }, - { - "name":"vent_off", - "directions" : 4 - }, - { - "name":"vent_welded", - "directions" : 4 - }, - { - "name":"vent_out", - "directions" : 4, - "delays":[ [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ] ] - }, - { - "name":"vent_in", - "directions" : 4, - "delays":[ [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ] ] - }, - { - "name":"vent_lockout", - "directions" : 4 - } - ] + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/32742/commits/44820f5b6e2c864a35bfad448e0a9437f01ad2e2", + "states": [ + { + "name": "vent_passive", + "directions": 4 + }, + { + "name": "vent_off", + "directions": 4 + }, + { + "name": "vent_welded", + "directions": 4 + }, + { + "name": "vent_out", + "directions": 4, + "delays": [ + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ], + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ], + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ], + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ] + ] + }, + { + "name": "vent_in", + "directions": 4, + "delays": [ + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ], + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ], + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ], + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05 + ] + ] + }, + { + "name": "vent_lockout", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_in.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_in.png index cf1b050c0246a699f147b5c266fe21f404b4f2fe..17a740920f85f7902cdbd0bc8edebb1044023ad6 100644 GIT binary patch literal 4224 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 DsvmDi literal 1595 zcmY*a3pmqj82^ux4Q13iIl@pO!#qz%bj*ebDO5riA@@rZ$&zNail|gt(q&st&!J@N zI4p#@9TcJxl4CBJ>)giJ^54#X)v4z^&-cCG<$b^3@ArPs_q^X_Pj}}vDq1Q40IYF! zaoi7$WO+v@LAD+r*a84b3a*a!Uc~!?`$s%Jh60!TwTxA^WSi<~Zat`#S>hHEV3Kw_ z;(=k2o0SPGu{;xGfn>km6DX|xrS6fIN*D{R(mh)dZrjvR5rY<;+DWxjy@vQz@N^;G zM_;pl=4$ow?2fa51493Tx`Rv9o6x0}@$vB|65oBOZkZR#Nif&idgX+Yu-%ILk9qRx z(<tD2%ZMI=G6@67n_VaBBW<w?!gfPmoI=4<Q*5B<rK(`Gny&kZ)ucW?-9^Vt3-mwl zYJ5G-67^BBGX}P}p@@!{dG_gqJWSu!&c!>TqoS)<sP(o}Xl+XzAsjqmWM`g3HEm%@ zKQ#CaGeZtF(x%ggftBX&FotvW+0|{G5S4L;g1!1P$>Bx`Uk#t(=xL0)-i~gc@9)<| zP&|d@Ji6>MNZr)8Y&|mG6GG!cfkQ2p$){#G`t3M1d-d6c4|yW@1x(8Mc=*VEWxzdH zv19%qy`6pkPzvZfF+M{?XjW+KH2rxePJi(Aqp^}5D5u)6Y^Ubpsj{Mtohu8o>4Tpd zGl&jv`(dLu*v2Xj0>R#QyfX?Yl~vKB$Wz<a*J9)2fooxh@!TWvNaoEwYR7F-(hH{j z_8~7iz$Wk6l;!Ro92uhAo(#p7RF_l3xk6R`t=MUH(}ZPsu<Y<y6RhSyN{h0EZ_&WV z*^m{BTQ!Bz9KLBX&MK3guNz6gWKd`$TPk0Lo{BO~ovF{63o50Y?WTF~gG`G?c<sUN zpLn?|C85#=-`<?$e5toM?7gh8m3m<D`F-GqCt~iT(M`DQVMl+eS%~V9S7}w`ihJiE zY_pJ-+2=X}9T#s*dYX-f^2LdQ*jD7_y!;i|z6)M+Sbv_s?KHz#78e1lnLF#k?O~7P zxNWKLuXRgliU$CqPf~uBA{iN$%iCky(4IwlBDNujo%i8J-QE<$irYG5B*UQP2Op&@ z!y2-2-cggl;S*|rr#VeM^Y4<A;EQ$EB>3`6yQ{WjKPlN*ftC>~*0B_kB`a}{gROU2 zRS?MQz{PWLENEtA_vg{Z#zBp)Uh}}uvR^bkTv*rai%o-y1Z%geWqF$B*lyswVkfNT zyuvPJR*y_B0rr!z<&M^P{IT^;8YxB9rBza|H;e~H*;Jw=TI2bpwVtR|LZOhJ<M4ik zC-bfK;>Vj2a<y@%y8NU32Hy0s?`XO)e)AV_IilwRS{8kms5|kgr5YPNfrL@?^m+>i zc*ivueYy$fbt;Q1FNDWxQuI2j)bsfMFM54^q@{)Dt3MTjZD9lM;<mTEIc+=c+VDg( zmCj?zII|e<x&=%epJqXrU&N#W(d;JJ@NOnr%$G`{NWx>aQP4|ZzTOV*4!{k@bVz7+ zR)2Nvtxi&!`t{Px9!wx<^o2clZBK#Jn@#POa?Sy+H=l8R8m6*0^y+NICf09ut*fh} z2!Kldx$=!&=_|~|MBGo0(wwztOcKr{4ARFd4kQvJUS%(>!WappZA+s@lsg_@%E1pq zQJGQV5b+>jM)x3)n;?vQbWK{aQ1k9%0tlFYeuuOp03ZOhq%k-XO(p>n*ciM_otKp_ zU(|~h6g$3#e4UU5&`w$N7pDY9k$^<D*nSd%MvB||7!1U5yu2L!;72H%RBr4U5-%v0 z$W`bHsa*^bfSzv)3jae2Ax(M6=@%5CHums8dM0|nA(=pzYgzsAo5JrpIMB|30R$o! zikMg$uHwUspj_~utm0Eh2I=De^XqRen2ia@9DRrEkgFiJA`hoXV9Cu^Sr2n15K=L8 zRE`aFAem`jLFLy#R-FThat4d&ZwkL(Lr)BpZf3IF$wccF@UoWfqD!D$map?#LGfih g{<?4ZN9gn`Mj9k-GE3c534IEHtCPDU%OQaBFIKS+>Hq)$ diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_lockout.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_lockout.png index bf0b9c928eec6d868a5de6bcbfc05e05e547f4eb..b32003c69875377f1c74b926270c3bb17a93c7d0 100644 GIT binary patch delta 1176 zcmV;J1ZVq}3abf_BYyx1a7bBm000ie000ie0hKEb8vp<VT}ebiRCt{2o9{~$K^VuM ze!K}nk&Esi13AR%jY3DB`433-CN+8`LM6Tsd}k5V3ttpO`7RKVQV?H7dcCReA5hOw zx(KY0!${$b4zU;Z%51+2bIdNcv$JzE3f+8QnPYc$zdO&&?0?KW&m57(VzF4Nmm{K! z?d|RRl?u$y&kHp~bar-Dte?qbg!;#WE}-zKRH`EJSS&{Iczi$XCCY)qcXV`Aq+ci$ zXlrY0UsMT!24L*$?9kNIRAlkt;bBT75|qp3BHzn{Lf}~{`o&@~G+(FzzJ6Jy?ygRX zor+0|7k?G${eQc+bnEsV>3f2}b5!+P(`})7Lk*B!`rsZTPoI>|4c)sRm>>Cu#$UL< zbr_%$eJut^w_c+9`g;1dwpKdV-`^LQANf#Y8yg#;;xd@l7aCxFeVtNGd(N-#G&-Jf z&)w+mqPBFa`<t%`{(OFSh2l-_2q5(mLE!#M^zr^-1b==VF$y#`Hq!R?HvQZxxV0eD z57GZ%{d4CpP%@cxKZ2^GKub#t<@0&>I}}y_bUZ<Ib#=7nv<T5Ca8&fL+S*z-oqBYJ zl8Id!cls7PAe8%<bJHfrP&jZN`H&xA6sQDtzp6fae-WYI0MPqz)2#v4_n4Id(uGBG zYX{f!g@2-xA1$CpsnELg(E?-;wg3iS1F-bvwzT^~0O`zZrc^V04d}w8e${^igk1oI zKU=%$97M_Hw0mwbyF{;NW=nb4_{^Ul=($Mr_p|fz5+xOY!k=`WlWJ1Xr%n2?9j+m4 z0ayzxWf!Hb&tSEHiO}5KoN^1mT3~YGrLsOILVwH4%jzuv@H4Tn85qOVOfagx_L*SV z42)rFCTK!G)BsnmUQ=F;=|EM#x3^a+pU?nU&toz&HZ~Ud1$2O=FqX7~gM-F2gdeAa z@W_ZbY>$-1VzF2(7K_DVvHZ7G{c2FSKLB1?e{cigDtLSO^H{gTf$7{+?orD71EB8@ zaepJ+1#d4O^gsw74%~)@hO+v~K0zjqP&52;a8Dst2XAlQ=kkU3c5-61ln<U9U6CQb zKD@msFb}-fOW8sxAKdaXk)hDQ2;5P85CXtY|Dfl$C*`jr)#VZ^r;j+r$lx(g>erXu z)FBlaf=e1+SER}2o36l%H-9|o==6#wpMOqF>Pr~_@GfZxJR6<!q^2>YFKqw@A~1mW z!vn<U4+7o#kqy9yr4WH(l-smm0^RzN4Zv7f%(}q`1R)LsUHZxf;N$babj_R6k8A+e z_xwZCL7`h;xdmWT0>rUd;V{spFKqxm4$t6+AJe0NDgBB@0l@km`wE*zx4u#rz<=;_ zcc8<QGW_GS33Td982|#XG*WCo!I!u1`Uy{(|Mbd}PbVhzLk)m9yMM^R2Be|qd!CfP zj#TGj$ghu;-s9;SPpYaPx<LX<N^CV@+f9Pj<5;4$rW;E6WVWiyfF&`u+OX|5!Ttzr q$!U+gEvM@LF=DY;EEY=@^ACczMiHO=TqtM&0000<MNUMnLSTZeO+^_1 delta 1283 zcmV+e1^oJ}36=_wBYy<lNkl<Zc%1E8L1^1n82+5DhT<(oIV7UICPYx2HrOu2hiql0 z#Uy4MCJAFb_0-EKJq>!;ZI@m;20N9oOHb>im$ZboIKen%j0Kv&V&g4lps?jJ6hmj6 z))W#F?-1UL)I_qRNP2AccabeU>HGCPz4uH1`$DZ&3!RJ}(SHGmMpppQ0f<Id0MP-6 z#(QQ5LZJ|Hxg1Xsnx@&ls4UC;_x${P$Zc?5@mpm&Qvq_hTx)D>3;>|2DkMp=9RL6* zio$-j+=$>MKLAsHQvn#trFG;BD~`wkAe$LSJdt#KUeNrO0;sAAN~z<UDVNqkDMjS{ z4{V<!ir-WKO@GrMNfIhmib|D285%SkpMCiF#Pe?7y1{!aHgd_)*cHLwb_k5d2nZpF zL?y%I^4<M!Oasqm#z84<cWGPjo8MA^dcDqjfT?=<;(0`)Q2@X%tH1NMZ2y%+oVV>C zkdI%~0fOK+6(B}-aWi)SAcfkt20{qpiKL+ydZT$vOn+wie@)X+F0ErUM$kVX<Ic<h zew^RM%a_h>+-rVU0`x}CV3?f6$c48kE*pCR0DsID7xKtlzlOOdPcbt+#oMG)eHbR^ z&>K19{O$wfZ#xG7N8^yq#B7%R<kQda;`uWaic7fqaT>K(bx+5C5d5|TVB=7)bfLI} z7tf!85PyPvVdYq^PN(|p-=RQ$Qvr6G``Dy=*w_m59;m&l<MS_W001T?vshd>9D{5e zvN1?0#l}_`n{*F5&3#ul9TdN*096{sgSj3QmsbG*>8l^%=bx6*Xf*KKAAcVO+Gqg4 zvHg`Q1(1TKg<S~{6u;#VkR-{Fhnf0T(D#BQNq??igo5I4I|u0B#O{9o!-;Kf-!cZK ze-k?`{N^_mfaP0#58VCgOItzfXJUQcc7mYzEuR2IQP6zz`ovk*P7sQsU~O&9(Ro4h zw;clUMAFq)o$h=5RPdYMv|7?B6(LIj{x7f+pyP|8T>(S~AR1i(L<b-mT>(S~AR1i( zM1Kb$8eIWI2Ot_9FM#Feu-VsGjO-ff?K{nVROwOe&F`;4FZmt&1M2lUZsra!OwRJQ zn{*Ek=6Vck_<s2V-0<VH{s2l3>vE$p!mF(#7vAzV8(U!%msk1m(HKGV&1=v60e<pZ z&H<{bB41bmAp`*UwzjQd_E8DTtN&p3QGW@wZOw3;Emo+i>guM0<ZtT_01nGi%FrMp zQ3=Y>Ak;tqLZwPU2r+E+?N|-(wEh6U`E6%`*@urI%QAi~l@U)Q@$J2@`6I@*ZY#hd z`5mXhMxy~)mNEC_Dc>i{GA>^{@0i>TyykZ-09$^VnVv$qw9fZ4(}Lgdn&0({P=BGg z#0^Y(n0a@+hFAQq1Xx_i^YwXVQqbE~{DznOjs^HIbqN!bSr9__`n=wz;y1kJw=KX) z3y_2mWUgOxP3{DK@w>_b4Dm#g&&EM!0WbMoWdZ%m#mw{+G))UM3wX(I%Ok|Vh*|n! zKHh9*99I%?XqtBHQS}mj@VE5`ynIUpfUmvlx9qsS-MiOuf}r@@`UCW41GeoSkhu#h zo$ABJRv48kHMH}}AK*8?ZGQl>n=l9FFgeHDY|=ddDM*sU+j;E|@QdG-Kj6Ps5pv}Z t=oEB(QM4<7=m12cD}d+#M5E&c_!sU&0|$7TVR!%l002ovPDHLkV1iqXa%cbm diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_off.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_off.png index 6208c59db793f9026125288653ea9d2ffe249a05..8380b47e7c595a9d1bef7978146457b112ec41dd 100644 GIT binary patch delta 1202 zcmV;j1Wo(h2*nAIBYyx1a7bBm000ie000ie0hKEb8vp<VcS%G+RCt{2TDwjgK@`1_ z(j#ybyP!apr6d&vicS0jD2XTxq(#a@baV)%bQwkY04qvG9dLn?$Und<6;&QWh=Rh7 zVj;eOa3)-9yk5`D&SNQdk7SLtJG*D*+@06G_bz1|xd4=L<bMKC#*qu4x>>K+uUrZC z_V(`BKHF$CocY`BwvvCW0O<VO+?*46p-`Y=v3R9xL>$ohg@pwt{%*HRy<YE1Wd!XI zxV*fit*x!Z<jrQ2N~IDVA0Lwo&<VWDhQHtMYwKwR`1SJ#EiW~waIauY-v8UDZ(qOA z%U7?-6?l&=e}A<$udS;U;PB|X_<eZ)Zg6d5^X=IBsJHR)llbpL02h8Q0@SLHX?l8^ zexIBSuC1-T8CxIqV6pS_bMk@E{7M1N&dvrFV5}@J(R{5c{>zpax_)DU2M-^S3$7<G zC;t1zl9od$z~tm4EiNw7pI%p3fyW_RBWej;$M}QQ(0}=Ix$HCv;`!CpRWT1G<wxhy ze%(Z<6kuXvf-WvDMyvqvXNHD7nXid!vPB?(>necfPft&+_+dD-Uk9U|Adf?~0958N zhI0Ra#64I<zUK=e`HcjSEg)v&N=1;e1-5tEBhR>we^-8d0VYrifK3n}TY$$O{<B5o zu_#*rn|~M=@bk9(+<q050$}{_?(T~JFIJXCd2o0{pSO1gb$ES_UWdgnfw=(VpLd~2 z`2mx!Kq<h?%*@C-JXM$)QatWDTjBaVL7h&AY=P%_1+d{q`<+$+K;DVzc3_N9JHe#< z-gkn!9T+3jPA~+&R)D9^o?D;Be8869bpBBafPeEmHY2T8i*5s01u%x!*Vlt_j1>S* z1UNHX&+|6U5PlBM4043dBc=QTY#Z+jF77l_<W5n_IC23f<H!Y|j3XC-GLBpT$~bZX zDC1BHkVbr7g*5ULl=%U(v$Mh<5P6}9*vQv$ZifRCKD-!M=Ldj4>eEBG4iO(Y=mGC9 z9Dlg*0mkuL=Lax3Le22Y!9B&^UUXOnyti;*ay@u*qT(e5KOg0Xw-+6j0q-^6=g^#& z$PnC7@Uh{=@Xeu=JIW=%_fg_GAD*N*e#9zu{4j`#C&_3ML;wO_S2!L~?jIZuHHb^O zo==42H(mwcl4h?gM`WU9NQB}~ybK}&gMT1IRB6QL(|~XO!~!7vBu8KvNKQb5WJ`sB zZ+`2I5XK>b5162C1HSmJ1(4(O7=xiLABsP*06g|E^KyJXP59=w{sNGcfX@%<DZZDz zH2IAMVC8uh2IS=@^ePaF-)R*9c<k{k92&m)t%d+EKSO1uBL0Wi35Mi15;I)C6L zN1lPX+}Qj-Cgpm*5RzXj04FNSgh)c<{2MtBM{ba>`~bWMr$PDsIO%Z~8kaZ=MESjB zi{nU%R1;1&;S9{^c^pFEJkIq@$W4GFF;Z<f-G(zzqy7jO3jT<sX*tULfa@aGBQvgZ zao24_+&4~?SbpRz#N{o-C1g3}2P>ozpI0G`{Dj;oN*PBk0A(Dx0F-h30}z6R(yp-u QJOBUy07*qoM6N<$f~fj9OaK4? delta 1097 zcmV-P1h)Id3Ec>gBYy-WNkl<Zc%1E;L2DaF7>3`LKn`vq_TpW_V8cRC6C)|GJva#o z3Bnd>F}4ZG56GqDSjeHbUV3Q><QQ_v56C46MhUVJGA<=Pc%hb1iYP3!3}tKxLQQh; zDLt5PGHXez-PP{upm{DM?ab`E`_0bG?#v5lG#ZU&dif$KbAM%J<rDoDLWDl4Wm)p~ z#>PgV#-#O61&KS30|4+m4~Aicz5oEQZJU06iW7va^oIt3Xf^jytM5h<2Y^a>5rtwY za=one0|VfB9ysTbZ>H7U2j?6!U!4hEXHxn@10aNeVHjw4INBW!dw$NB|M=;%f%Wd+ zyDM8P|Mi7PeSdcn`Xjr*LY{#!hMAn<8(bd#^3%`@uap<TIUjZEP^7IN7=UiKD_ek~ zdhz@@<Z?Lxz?;24Wm!6YsaTL@XHBdBq!GwMKQI6^3LhQ_Fvd_QmVB*nHdn*aaz*|Z zLZH>$$3mWA*0kU_4yx5^*!!J`eqaC&4o(9=Un>BRkAK<LW)0<=H}L$$ORTT0`l3(u z<C2B`$T0x;+z)9arcw6Rx8LFQt19Y^ZCt%}9f$9_iT3|2^g{)JT0o6-y|Inguc}~- zp;q7Ro2$p||5@n=2Ea6r!1?DEIDFT|?K^h?087giY;7L*LF$Lp2dM>2^C;@QX09I? z0M~WV*nimr09?O%1;78cgI=$Pw}1UB%ly~t0YKmJc4z!<kcEC=01U(M&BGM^Ak<bc z3?uf7P*(aQ#{l(B?7^ca1IygM=f5!ZO>A7!)*l)Gns3z>c<{sbp)Oh-iPd>K3R&p~ zJ^{9E<Ku_-14r2~7h&5rT-S|MFKhjgU7%1b#ee#$Q@+Q?B5nPtUlG!1G#ZUYqtR$I znyF;!zXl`w1G?QV9LMo(I+*4WT-WvO;iu&fNLoLXKY;V&b-9H+8@SraIndbIllcpI zhL0cKC*}`GQ~%4LOwaRBtM7s_1^_ZWJP>H??D<kPpEfHz&x>}q6VM;&4*-srrR@1R z%zxwz*z<Gn{{9E;4hLh*m#XDx4R2h3K-&6&Pk_qfr_W$n7XE0qP$-u0>(4*RM~u?A zE5MV~4;=ua*XzNuEIfblQXaD`3m4Cyi!2_8r1c{QfVQ93*H+PL?#tt3T1cCu^&<y> zs5iEyfk|bUcPD9*(vKB@t<9R;pC^-oYJXQrn<Vuk2jKEI7qGNk0b@+=&#N|-v`Jb& zbN~izKr+TqzIh|Icofpok2MPrg<?sL##zn+N$SU%1=N>|^|e(9Au^o>lGG375h6&K zrXTY0R?3UGR4hOU(f6n(NgDbi{Q)P10LZ;}HKlyD+{yDqAuIin{s7f%K<TV$NkSJE zrR@&)l}pMWkhXqke*oD{$botCdmK3S^ia8^{Q+s|PyLFJMx)VaG*is~ftjj!5{q<R P00000NkvXXu0mjfCuJRr diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_out.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_out.png index e038706b0e43c0aa10a935bb90a0ea0ebcb6b88f..67890d4be28175861544e307599e49cd43eb7d5d 100644 GIT binary patch literal 4296 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 AH~;_u literal 2926 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 b<gV%NX^PjbY{I?-bu@r+Jn2wnkG=grYz^Y% diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_passive.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_passive.png index 5ff27ef75900113079d1b41fd15a9f7bec222ff1..9c732a4e7a7c2622a04a6d110345e3cdcbc7f973 100644 GIT binary patch delta 823 zcmV-71IYZ27u5!kD}N5e000ie0hKEb8vp<U2T4RhRCt{2o4u+UK@`U)A-%|6qJ@Rn zB&jSU_Xb};l3-!d3(2j02Oq=Q7qE~d=mQ8zDyt-oSXgMtB0hn+f8oF|tn;l4ch3(l zb8%<(KXYbxKF*vKf?*hjDK1ZR7u)UjF;rl&SZFnL^m@Hu{eQ`1qSb$P?gAR$YPEvI zlOz$9O66#(L>6d#r_%}2-)^^Jx7!_cop9Cw#Nlud<MG&8d^jA6YPBks%cXN!88ia- z^3hMz)R@m`fIq)~iH{$8BDqPd#nXSO`1bXS`1JYSy39FnA7B03yEn$XMgx5R@$>ZO zLkt6i=tnWY-GA+CQLELQdtkHKSm)1EUu%H%dL7gQFJ8X#Dn~pFUP1cLD^+72tpUpA zvgmfZ;_q&2-3w%WG``Vj1Py{H-|zQN<B+R98jt#$212a?N~Mz6@AqE400V^10w}*) zt-SQnaj3ru;}`&3-ou#h|26cj4B-0&#KQLput948EPsN4Zx3J*69Sd@)u;OF&>8^m z|8zP%{qNcX$d3Um1ib&W3iX)@Y@PzG0qXU7&^-LGpAfUz%(|Qk%Dc<}sy^x;Gz$P; z2^M)J2;RPX@4Xv~fv>*p_@gxd_VZYbj7B5p3d8`j0N&xjU~n-Ft)t=^9vK~Zd!!hK zVHk#C7=MOg9xa964Qk^9n$70PAE4aubYdg_j(s~EnDF6c;2j?TebuLj<2s!9$cG;A z{=$I^A7GZgcYFYe<ER;aIk>0D+lvOvz<Ub^Cgp=CM>U=+R9@AGw-*hTf%lrOBgMId z&B@SHQwF%B;FANCqM_7aO6BWFW4Xk#^l?^+27k+`s&5<AVKe|Bha{zHg(y|?#p06s zRt7LtD0YLdsqbZg#{?T7?+WA%8zAor<P94j?+WA%8^EU!j-RvAYY|i5$^fbmoxQ8+ zr3`XOePet81uDuy2tuUz8#xX~u29U)5O#y|{jt-dC^Sm33sm)OqQ%edlh1uG;Ibb_ zd@un5C1ZXs;Np+K@ALUw>l7*c7b6VAFbq>*{sU6Z86Nb0d1(Lu002ovPDHLkV1lx? Bkd6QV literal 2958 zcmcguYitx%6rO?+3O14$k)Vdj)CY#n&U<!dWaY72=n|GTrICUGy*qQK9lAR+%uIK; z1$hV<{Y5A$N}vd8d_)i=JhT`piCQ0tFG3U)_@SY`jg*8E6TP#q7PF;Q)J<k*=FYk2 z`_8%FIrlzZw_t9?xXI%%46BINMC#FfrhkpS9{s;!tT=;i<#x?t7sJNi<X>gjw(XP9 z*tbSQqt_Uluc%fs05mHO1DT|atTAl*jEoJ`7U<z|*kqU?;+L*t1a4>{Vv!J|V|Exe z8#V0?T-d&#L2YkQWsR6|A3i;!AO}h40X&mTn68ou5m~<qdiIAY0?(RwEg@o-4~RF$ z>hQ4TKwJ#aq)O8)9+U%&$nzpyg|jqEQ?x)aEXjxp%_~e0&;JO7=4iT7ADNTKLT@3W z+4F3LqSEPfAk76Vr-@=@S*B=~Vp$SdkZzmlfedN7l?4wG=&FukdxmA=zDE$ZTD=f~ znC3!A+C{gfn@<x;7?lAw#RO<Sq^zN)7VYd-Cy@o$R0<|w5}KZiY?-31-E4W5+iVTt zy7>7D0F>HTtcX#POEOu6aJ}jj3L~G8lGbiRn+>UY=vu9g3ae9yW@RB7*Q<vE`5eJ? zWS*UDD`5u$&vF_pD^XbGx<b4-%LG__>LSC`th9TNkCvYRBfx_p0xdaD(jv)94GgES zv_dn}XjY-=oN3I`485(SDW?eB6{bjU8t}ld#+s_=mXic1TSgKzLCQ9p2)wukO4v$R z4gyB(xWVJmaJbH~bR&U2xb<^q<I(D{$jBlhA7HX{V=*Oax*jl97>$Go6l=gRG({I= zAt(wmsd7P%j0-$R0$z)g41f#`Rh8!%y)Zvwsja?#{Q0?3(kvDE7@!vn>S8<|43c6{ zlt?k_P0~41P#IPe1t`I|R`6Eq7^s>-Vz5`AmFBb3;yfdA3@OXBOa^(LC1pmJNr6)( zEv^Gm6m`F5vNBX^3>U3&TfPbx!WH?agn?(3rvTNjs1Tw0YJiAAZrCW5kC7nf=ck(? za(We&<X~J&_tL<Dvzk!uhE*XoBzenBL1z$s8#n+pGU&J=LU*hrUQ`V3SvaumgrNdI za4KbL`DRgEDq=_+7o@J9BFIUCtn)lli>8qh$4exDL7fyO9mr4wI<F$h<YF(GB2J-& zLUsI;6y<%Z&A@DeXd9reAs9U<^D@gpQerik6h$78vLNuJq{%>#fE<?uR6kb@W}wvn z<6zWb6)?=A`?@HKWay-6&@l#SV6e`L6!5I#{vEtw6*sab^}jC?<!{lsc0>KO6Xo6` zxlGRSt24WcDJ6T(2sMbdH3fCtVh{dX-7=4FU2E6%`$jhKL1&f15IO+)kHwQ0dMTdW zpouEgK_|0{)k{xfSXpf}GOHnT>ZfO7<Bro4Hm=0pJ~-y(&fVi%&mQQT^j5O3d^3Ki ze@EhSdAM7-@F=xE)w$j^CFh3hkq}$E=9V+B8QZpRT5;Q!%8wTA*!`~Zowcm)x7Vw7 zK7C%kch%nSpTK%wn36o#f28a4{*K!}XesMnvgUBv=A%pBv-Y3(<ouH_{yrHC^#!Tk zuIESH+4u0&2V3W1eV=U-C;Z&~=H5>)eZ6i8cJgvpMen5(KdwEta_gwxT_2Z!(K7R$ z<*Awd0@mI;_tuxbTsIMW^`cz%)#yt%pS$kYJ9?_R`NyWLt=w?;*c{7&|M}}rUpSIp zK6}hvtInRfv3bwVZ+d!`b$r-y;E=bW>f&>q+YfJ@cXDFqvj<mqO#9)FUGFb_;Em%? sU0z(#ldfI72W#vdJ>aSYj&%P~OsI|Q+jw+e%r}fyFNo}&{m>(S0!xn73;+NC diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_welded.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_welded.png index b45ae1cb5fc160d9dc9635397c8cd049b0e6a306..0ecc5b4c9cd6d85d2552a81664729f424ec6b3c7 100644 GIT binary patch delta 1831 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 Vulc<VO6mXr002ovPDHLkV1kpRe1rf1 delta 1945 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 From 667bda28dff4dac9ec46434db038b24bdabf5147 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 23:36:05 +0000 Subject: [PATCH 323/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f491491794..b4c7676377 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Beck Thompson - changes: - - message: Defibrillator cooldowns are now clearly visible. - type: Tweak - id: 7740 - time: '2024-12-20T21:26:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/31251 - author: J C Denton changes: - message: Syndicate and NanoTrasen NPCs and turrets are now hostile to Dragons @@ -3912,3 +3905,10 @@ id: 8240 time: '2025-04-18T23:26:44.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32396 +- author: ScarKy0 + changes: + - message: Changed the air vent and scrubber sprites. + type: Tweak + id: 8241 + time: '2025-04-18T23:34:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34223 From f8ff7aee92cbd9a681cc5628c077fc4e75bf34e3 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 18 Apr 2025 19:43:17 -0400 Subject: [PATCH 324/622] Local Material Silo (#36492) * Material Silo * fix board, fix copyright * a bit of review.... for the vibe.... * a tiny bit of review * 4 spaced * sloths no good very tiny nitpick * fix ui flickers * oops * slightly lower range * Sloth Review --------- Co-authored-by: ScarKy0 <scarky0@onet.eu> --- Content.Client/Lathe/UI/LatheMenu.xaml | 17 +- Content.Client/Materials/OreSiloSystem.cs | 6 + .../Materials/UI/MaterialStorageControl.xaml | 7 +- .../UI/MaterialStorageControl.xaml.cs | 8 +- .../Materials/UI/OreSiloBoundUserInterface.cs | 34 ++++ Content.Client/Materials/UI/OreSiloMenu.xaml | 42 +++++ .../Materials/UI/OreSiloMenu.xaml.cs | 64 +++++++ .../Materials/MaterialStorageSystem.cs | 10 +- Content.Server/Materials/OreSiloSystem.cs | 119 +++++++++++++ Content.Server/Pinpointer/NavMapSystem.cs | 9 +- .../Materials/MaterialStorageComponent.cs | 18 ++ .../OreSilo/OreSiloClientComponent.cs | 18 ++ .../Materials/OreSilo/OreSiloComponent.cs | 55 ++++++ .../Materials/OreSilo/SharedOreSiloSystem.cs | 168 ++++++++++++++++++ .../Materials/SharedMaterialStorageSystem.cs | 153 ++++++++++++---- .../Locale/en-US/lathe/ui/lathe-menu.ftl | 1 + Resources/Locale/en-US/materials/silo.ftl | 10 ++ .../Catalog/Cargo/cargo_materials.yml | 10 ++ .../Catalog/Fills/Crates/materials.yml | 16 ++ .../Circuitboards/Machine/production.yml | 13 ++ .../Structures/Machines/anomaly_equipment.yml | 1 + .../Structures/Machines/flatpacker.yml | 1 + .../Entities/Structures/Machines/lathe.yml | 7 + .../Entities/Structures/Machines/silo.yml | 61 +++++++ .../Structures/Machines/silo.rsi/meta.json | 40 +++++ .../Machines/silo.rsi/overlay_active.png | Bin 0 -> 336 bytes .../Structures/Machines/silo.rsi/silo.png | Bin 0 -> 1097 bytes .../Machines/silo.rsi/silo_active.png | Bin 0 -> 1888 bytes 28 files changed, 842 insertions(+), 46 deletions(-) create mode 100644 Content.Client/Materials/OreSiloSystem.cs create mode 100644 Content.Client/Materials/UI/OreSiloBoundUserInterface.cs create mode 100644 Content.Client/Materials/UI/OreSiloMenu.xaml create mode 100644 Content.Client/Materials/UI/OreSiloMenu.xaml.cs create mode 100644 Content.Server/Materials/OreSiloSystem.cs create mode 100644 Content.Shared/Materials/OreSilo/OreSiloClientComponent.cs create mode 100644 Content.Shared/Materials/OreSilo/OreSiloComponent.cs create mode 100644 Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs create mode 100644 Resources/Locale/en-US/materials/silo.ftl create mode 100644 Resources/Prototypes/Entities/Structures/Machines/silo.yml create mode 100644 Resources/Textures/Structures/Machines/silo.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/silo.rsi/overlay_active.png create mode 100644 Resources/Textures/Structures/Machines/silo.rsi/silo.png create mode 100644 Resources/Textures/Structures/Machines/silo.rsi/silo_active.png diff --git a/Content.Client/Lathe/UI/LatheMenu.xaml b/Content.Client/Lathe/UI/LatheMenu.xaml index d5e3573148..28b79254c0 100644 --- a/Content.Client/Lathe/UI/LatheMenu.xaml +++ b/Content.Client/Lathe/UI/LatheMenu.xaml @@ -127,12 +127,17 @@ HorizontalExpand="True" Orientation="Vertical"> <Label Text="{Loc 'lathe-menu-materials-title'}" Margin="5 5 5 5" HorizontalAlignment="Center"/> - <BoxContainer - Orientation="Vertical" - VerticalExpand="True" - HorizontalExpand="True"> - <ui:MaterialStorageControl Name="MaterialsList" SizeFlagsStretchRatio="8"/> - </BoxContainer> + <PanelContainer VerticalExpand="True"> + <PanelContainer.PanelOverride> + <gfx:StyleBoxFlat BackgroundColor="#1B1B1E" /> + </PanelContainer.PanelOverride> + <BoxContainer + Orientation="Vertical" + VerticalExpand="True" + HorizontalExpand="True"> + <ui:MaterialStorageControl Name="MaterialsList" SizeFlagsStretchRatio="8"/> + </BoxContainer> + </PanelContainer> </BoxContainer> </BoxContainer> diff --git a/Content.Client/Materials/OreSiloSystem.cs b/Content.Client/Materials/OreSiloSystem.cs new file mode 100644 index 0000000000..076a546d37 --- /dev/null +++ b/Content.Client/Materials/OreSiloSystem.cs @@ -0,0 +1,6 @@ +using Content.Shared.Materials.OreSilo; + +namespace Content.Client.Materials; + +/// <inheritdoc/> +public sealed class OreSiloSystem : SharedOreSiloSystem; diff --git a/Content.Client/Materials/UI/MaterialStorageControl.xaml b/Content.Client/Materials/UI/MaterialStorageControl.xaml index 2be0f40aa5..d7503a61f3 100644 --- a/Content.Client/Materials/UI/MaterialStorageControl.xaml +++ b/Content.Client/Materials/UI/MaterialStorageControl.xaml @@ -2,7 +2,10 @@ SizeFlagsStretchRatio="8" HorizontalExpand="True" VerticalExpand="True"> - <BoxContainer Name="MaterialList" Orientation="Vertical"> - <Label Name="NoMatsLabel" Text="{Loc 'lathe-menu-no-materials-message'}" Align="Center"/> + <BoxContainer Orientation="Vertical" VerticalExpand="True"> + <BoxContainer Name="MaterialList" Orientation="Vertical" VerticalExpand="True"> + <Label Name="NoMatsLabel" Text="{Loc 'lathe-menu-no-materials-message'}" HorizontalAlignment="Center" VerticalAlignment="Center" VerticalExpand="True"/> + </BoxContainer> + <Label Name="SiloLinkedLabel" Text="{Loc 'lathe-menu-silo-linked-message'}" StyleClasses="LabelSubText" Visible="False" HorizontalAlignment="Center"/> </BoxContainer> </ScrollContainer> diff --git a/Content.Client/Materials/UI/MaterialStorageControl.xaml.cs b/Content.Client/Materials/UI/MaterialStorageControl.xaml.cs index 3cf1792c14..fd698d890f 100644 --- a/Content.Client/Materials/UI/MaterialStorageControl.xaml.cs +++ b/Content.Client/Materials/UI/MaterialStorageControl.xaml.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Shared.Materials; +using Content.Shared.Materials.OreSilo; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; @@ -15,6 +16,7 @@ namespace Content.Client.Materials.UI; public sealed partial class MaterialStorageControl : ScrollContainer { [Dependency] private readonly IEntityManager _entityManager = default!; + private readonly MaterialStorageSystem _materialStorage; private EntityUid? _owner; @@ -24,6 +26,8 @@ public sealed partial class MaterialStorageControl : ScrollContainer { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + + _materialStorage = _entityManager.System<MaterialStorageSystem>(); } public void SetOwner(EntityUid owner) @@ -45,7 +49,8 @@ public sealed partial class MaterialStorageControl : ScrollContainer } var canEject = materialStorage.CanEjectStoredMaterials; - var mats = materialStorage.Storage; + var mats = _materialStorage.GetStoredMaterials((_owner.Value, materialStorage)); + if (_currentMaterials.Equals(mats)) return; @@ -89,5 +94,6 @@ public sealed partial class MaterialStorageControl : ScrollContainer _currentMaterials = mats; NoMatsLabel.Visible = MaterialList.ChildCount == 1; + SiloLinkedLabel.Visible = _entityManager.TryGetComponent<OreSiloClientComponent>(_owner.Value, out var client) && client.Silo != null; } } diff --git a/Content.Client/Materials/UI/OreSiloBoundUserInterface.cs b/Content.Client/Materials/UI/OreSiloBoundUserInterface.cs new file mode 100644 index 0000000000..32eed56d80 --- /dev/null +++ b/Content.Client/Materials/UI/OreSiloBoundUserInterface.cs @@ -0,0 +1,34 @@ +using Content.Shared.Materials.OreSilo; +using JetBrains.Annotations; +using Robust.Client.UserInterface; + +namespace Content.Client.Materials.UI; + +[UsedImplicitly] +public sealed class OreSiloBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) +{ + [ViewVariables] + private OreSiloMenu? _menu; + + protected override void Open() + { + base.Open(); + + _menu = this.CreateWindow<OreSiloMenu>(); + _menu.SetEntity(Owner); + + _menu.OnClientEntryPressed += netEnt => + { + SendPredictedMessage(new ToggleOreSiloClientMessage(netEnt)); + }; + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (state is not OreSiloBuiState msg) + return; + _menu?.Update(msg); + } +} diff --git a/Content.Client/Materials/UI/OreSiloMenu.xaml b/Content.Client/Materials/UI/OreSiloMenu.xaml new file mode 100644 index 0000000000..3a8e0ef48a --- /dev/null +++ b/Content.Client/Materials/UI/OreSiloMenu.xaml @@ -0,0 +1,42 @@ +<controls:FancyWindow xmlns="https://spacestation14.io" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client" + xmlns:ui="clr-namespace:Content.Client.Materials.UI" + Title="{Loc 'ore-silo-ui-title'}" + MinSize="400 260" + SetSize="400 460"> + <BoxContainer Orientation="Vertical" + HorizontalExpand="True" + VerticalExpand="True" + Margin="10 10 10 10"> + <BoxContainer VerticalExpand="True" + HorizontalExpand="True" + Orientation="Vertical" + SizeFlagsStretchRatio="3"> + <Label Text="{Loc 'ore-silo-ui-label-clients'}" Margin="5 5 5 5" HorizontalAlignment="Center" StyleClasses="LabelKeyText"/> + <PanelContainer VerticalExpand="True"> + <PanelContainer.PanelOverride> + <graphics:StyleBoxFlat BackgroundColor="#1B1B1E" /> + </PanelContainer.PanelOverride> + <ItemList Name="ClientList" SelectMode="Button" VerticalExpand="True"/> + </PanelContainer> + </BoxContainer> + <BoxContainer VerticalExpand="True" + HorizontalExpand="True" + Orientation="Vertical" + SizeFlagsStretchRatio="2"> + <Label Text="{Loc 'ore-silo-ui-label-mats'}" Margin="5 5 5 5" HorizontalAlignment="Center" StyleClasses="LabelKeyText"/> + <PanelContainer VerticalExpand="True"> + <PanelContainer.PanelOverride> + <graphics:StyleBoxFlat BackgroundColor="#1B1B1E" /> + </PanelContainer.PanelOverride> + <BoxContainer + Orientation="Vertical" + VerticalExpand="True" + HorizontalExpand="True"> + <ui:MaterialStorageControl Name="Materials"/> + </BoxContainer> + </PanelContainer> + </BoxContainer> + </BoxContainer> +</controls:FancyWindow> diff --git a/Content.Client/Materials/UI/OreSiloMenu.xaml.cs b/Content.Client/Materials/UI/OreSiloMenu.xaml.cs new file mode 100644 index 0000000000..69d1fa328e --- /dev/null +++ b/Content.Client/Materials/UI/OreSiloMenu.xaml.cs @@ -0,0 +1,64 @@ +using System.Linq; +using Content.Client.UserInterface.Controls; +using Content.Shared.Materials.OreSilo; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.Materials.UI; + +[GenerateTypedNameReferences] +public sealed partial class OreSiloMenu : FancyWindow +{ + public event Action<NetEntity>? OnClientEntryPressed; + + public OreSiloMenu() + { + RobustXamlLoader.Load(this); + + ClientList.OnItemSelected += args => + { + var item = ClientList[args.ItemIndex]; + // a little bit of null suppression makes me feel great! :-) + OnClientEntryPressed?.Invoke((NetEntity) item.Metadata!); + }; + } + + public void SetEntity(EntityUid uid) + { + Materials.SetOwner(uid); + } + + public void Update(OreSiloBuiState state) + { + var items = new List<ItemList.Item>(); + var orderedClients = state.Clients.OrderBy(t => t.Item3).ThenBy(t => t.Item1.Id); + foreach (var (ent, _, _) in orderedClients) + { + items.Add(new ItemList.Item(ClientList) + { + Metadata = ent + }); + } + + ClientList.SetItems(items, + (item1, item2) => + { + var ent1 = (NetEntity) item1.Metadata!; + var ent2 = (NetEntity) item2.Metadata!; + return ent1.CompareTo(ent2); + }); + + var entTextDict = state.Clients.Select(t => (t.Item1, t.Item2)).ToDictionary(); + using var enumerator = ClientList.GetEnumerator(); + while (enumerator.MoveNext()) + { + if (enumerator.Current.Metadata is not NetEntity ent) + continue; + + if (entTextDict.TryGetValue(ent, out var text)) + enumerator.Current.Text = text; + } + } +} + diff --git a/Content.Server/Materials/MaterialStorageSystem.cs b/Content.Server/Materials/MaterialStorageSystem.cs index 8c50d5fe9a..3a462dd4d5 100644 --- a/Content.Server/Materials/MaterialStorageSystem.cs +++ b/Content.Server/Materials/MaterialStorageSystem.cs @@ -102,14 +102,18 @@ public sealed class MaterialStorageSystem : SharedMaterialStorageSystem if (!base.TryInsertMaterialEntity(user, toInsert, receiver, storage, material, composition)) return false; _audio.PlayPvs(storage.InsertingSound, receiver); - _popup.PopupEntity(Loc.GetString("machine-insert-item", ("user", user), ("machine", receiver), - ("item", toInsert)), receiver); + _popup.PopupEntity(Loc.GetString("machine-insert-item", + ("user", user), + ("machine", receiver), + ("item", toInsert)), + receiver); QueueDel(toInsert); // Logging TryComp<StackComponent>(toInsert, out var stack); var count = stack?.Count ?? 1; - _adminLogger.Add(LogType.Action, LogImpact.Low, + _adminLogger.Add(LogType.Action, + LogImpact.Low, $"{ToPrettyString(user):player} inserted {count} {ToPrettyString(toInsert):inserted} into {ToPrettyString(receiver):receiver}"); return true; } diff --git a/Content.Server/Materials/OreSiloSystem.cs b/Content.Server/Materials/OreSiloSystem.cs new file mode 100644 index 0000000000..87e6db16cf --- /dev/null +++ b/Content.Server/Materials/OreSiloSystem.cs @@ -0,0 +1,119 @@ +using Content.Server.Pinpointer; +using Content.Shared.IdentityManagement; +using Content.Shared.Materials.OreSilo; +using Robust.Server.GameStates; +using Robust.Shared.Player; + +namespace Content.Server.Materials; + +/// <inheritdoc/> +public sealed class OreSiloSystem : SharedOreSiloSystem +{ + [Dependency] private readonly EntityLookupSystem _entityLookup = default!; + [Dependency] private readonly NavMapSystem _navMap = default!; + [Dependency] private readonly PvsOverrideSystem _pvsOverride = default!; + [Dependency] private readonly SharedUserInterfaceSystem _userInterface = default!; + + private const float OreSiloPreloadRangeSquared = 225f; // ~1 screen + + private readonly HashSet<Entity<OreSiloClientComponent>> _clientLookup = new(); + private readonly HashSet<(NetEntity, string, string)> _clientInformation = new(); + private readonly HashSet<EntityUid> _silosToAdd = new(); + private readonly HashSet<EntityUid> _silosToRemove = new(); + + protected override void UpdateOreSiloUi(Entity<OreSiloComponent> ent) + { + if (!_userInterface.IsUiOpen(ent.Owner, OreSiloUiKey.Key)) + return; + _clientLookup.Clear(); + _clientInformation.Clear(); + + var xform = Transform(ent); + + // Sneakily uses override with TComponent parameter + _entityLookup.GetEntitiesInRange(xform.Coordinates, ent.Comp.Range, _clientLookup); + + foreach (var client in _clientLookup) + { + // don't show already-linked clients. + if (client.Comp.Silo is not null) + continue; + + var netEnt = GetNetEntity(client); + var name = Identity.Name(client, EntityManager); + var beacon = _navMap.GetNearestBeaconString(client.Owner, onlyName: true); + + var txt = Loc.GetString("ore-silo-ui-itemlist-entry", + ("name", name), + ("beacon", beacon), + ("linked", ent.Comp.Clients.Contains(client)), + ("inRange", true)); + + _clientInformation.Add((netEnt, txt, beacon)); + } + + // Get all clients of this silo, including those out of range. + foreach (var client in ent.Comp.Clients) + { + var netEnt = GetNetEntity(client); + var name = Identity.Name(client, EntityManager); + var beacon = _navMap.GetNearestBeaconString(client, onlyName: true); + var inRange = CanTransmitMaterials((ent, ent), client); + + var txt = Loc.GetString("ore-silo-ui-itemlist-entry", + ("name", name), + ("beacon", beacon), + ("linked", ent.Comp.Clients.Contains(client)), + ("inRange", inRange)); + + _clientInformation.Add((netEnt, txt, beacon)); + } + + _userInterface.SetUiState(ent.Owner, OreSiloUiKey.Key, new OreSiloBuiState(_clientInformation)); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + // Solving an annoying problem: we need to send the silo to people who are near the silo so that + // Things don't start wildly mispredicting. We do this as cheaply as possible via grid-based local-pos checks. + // Sloth okay-ed this in the interim until a better solution comes around. + + var actorQuery = EntityQueryEnumerator<ActorComponent, TransformComponent>(); + while (actorQuery.MoveNext(out _, out var actorComp, out var actorXform)) + { + _silosToAdd.Clear(); + _silosToRemove.Clear(); + + var clientQuery = EntityQueryEnumerator<OreSiloClientComponent, TransformComponent>(); + while (clientQuery.MoveNext(out _, out var clientComp, out var clientXform)) + { + if (clientComp.Silo == null) + continue; + + // We limit it to same-grid checks only for peak perf + if (actorXform.GridUid != clientXform.GridUid) + continue; + + if ((actorXform.LocalPosition - clientXform.LocalPosition).LengthSquared() <= OreSiloPreloadRangeSquared) + { + _silosToAdd.Add(clientComp.Silo.Value); + } + else + { + _silosToRemove.Add(clientComp.Silo.Value); + } + } + + foreach (var toRemove in _silosToRemove) + { + _pvsOverride.RemoveSessionOverride(toRemove, actorComp.PlayerSession); + } + foreach (var toAdd in _silosToAdd) + { + _pvsOverride.AddSessionOverride(toAdd, actorComp.PlayerSession); + } + } + } +} diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs index da9ab20a39..3ab0e8eff1 100644 --- a/Content.Server/Pinpointer/NavMapSystem.cs +++ b/Content.Server/Pinpointer/NavMapSystem.cs @@ -436,12 +436,12 @@ public sealed partial class NavMapSystem : SharedNavMapSystem /// to the position of <paramref name="ent"/> from the nearest beacon. /// </summary> [PublicAPI] - public string GetNearestBeaconString(Entity<TransformComponent?> ent) + public string GetNearestBeaconString(Entity<TransformComponent?> ent, bool onlyName = false) { if (!Resolve(ent, ref ent.Comp)) return Loc.GetString("nav-beacon-pos-no-beacons"); - return GetNearestBeaconString(_transformSystem.GetMapCoordinates(ent, ent.Comp)); + return GetNearestBeaconString(_transformSystem.GetMapCoordinates(ent, ent.Comp), onlyName); } /// <summary> @@ -449,11 +449,14 @@ public sealed partial class NavMapSystem : SharedNavMapSystem /// to <paramref name="coordinates"/> from the nearest beacon. /// </summary> - public string GetNearestBeaconString(MapCoordinates coordinates) + public string GetNearestBeaconString(MapCoordinates coordinates, bool onlyName = false) { if (!TryGetNearestBeacon(coordinates, out var beacon, out var pos)) return Loc.GetString("nav-beacon-pos-no-beacons"); + if (onlyName) + return beacon.Value.Comp.Text!; + var gridOffset = Angle.Zero; if (_mapManager.TryFindGridAt(pos.Value, out var grid, out _)) gridOffset = Transform(grid).LocalRotation; diff --git a/Content.Shared/Materials/MaterialStorageComponent.cs b/Content.Shared/Materials/MaterialStorageComponent.cs index 7d8dd5c749..1911b3de6f 100644 --- a/Content.Shared/Materials/MaterialStorageComponent.cs +++ b/Content.Shared/Materials/MaterialStorageComponent.cs @@ -75,6 +75,24 @@ public enum MaterialStorageVisuals : byte Inserting } +/// <summary> +/// Collects all the materials stored on a <see cref="MaterialStorageComponent"/> +/// </summary> +/// <param name="Entity">The entity holding all these materials</param> +/// <param name="Materials">A dictionary of all materials held</param> +/// <param name="LocalOnly">An optional specifier. Non-local sources (silo, etc.) should not add materials when this is false.</param> +[ByRefEvent] +public readonly record struct GetStoredMaterialsEvent(Entity<MaterialStorageComponent> Entity, Dictionary<ProtoId<MaterialPrototype>, int> Materials, bool LocalOnly); + +/// <summary> +/// After using materials, removes them from storage. +/// </summary> +/// <param name="Entity">The entity that held the materials and is being used up</param> +/// <param name="Materials">A dictionary of the difference of materials left.</param> +/// <param name="LocalOnly">An optional specifier. Non-local sources (silo, etc.) should not consume materials when this is false.</param> +[ByRefEvent] +public readonly record struct ConsumeStoredMaterialsEvent(Entity<MaterialStorageComponent> Entity, Dictionary<ProtoId<MaterialPrototype>, int> Materials, bool LocalOnly); + /// <summary> /// event raised on the materialStorage when a material entity is inserted into it. /// </summary> diff --git a/Content.Shared/Materials/OreSilo/OreSiloClientComponent.cs b/Content.Shared/Materials/OreSilo/OreSiloClientComponent.cs new file mode 100644 index 0000000000..ff43c9c05a --- /dev/null +++ b/Content.Shared/Materials/OreSilo/OreSiloClientComponent.cs @@ -0,0 +1,18 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Materials.OreSilo; + +/// <summary> +/// An entity with <see cref="MaterialStorageComponent"/> that interfaces with an <see cref="OreSiloComponent"/>. +/// Used for tracking the connected silo. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedOreSiloSystem))] +public sealed partial class OreSiloClientComponent : Component +{ + /// <summary> + /// The silo that this client pulls materials from. + /// </summary> + [DataField, AutoNetworkedField] + public EntityUid? Silo; +} diff --git a/Content.Shared/Materials/OreSilo/OreSiloComponent.cs b/Content.Shared/Materials/OreSilo/OreSiloComponent.cs new file mode 100644 index 0000000000..45c86b1845 --- /dev/null +++ b/Content.Shared/Materials/OreSilo/OreSiloComponent.cs @@ -0,0 +1,55 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Materials.OreSilo; + +/// <summary> +/// Provides additional materials to linked clients across long distances. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedOreSiloSystem))] +public sealed partial class OreSiloComponent : Component +{ + /// <summary> + /// The <see cref="OreSiloClientComponent"/> that are connected to this silo. + /// </summary> + [DataField, AutoNetworkedField] + public HashSet<EntityUid> Clients = new(); + + /// <summary> + /// The maximum distance you can be to the silo and still receive transmission. + /// </summary> + /// <remarks> + /// Default value should be big enough to span a single large department. + /// </remarks> + [DataField, AutoNetworkedField] + public float Range = 20f; +} + +[Serializable, NetSerializable] +public sealed class OreSiloBuiState : BoundUserInterfaceState +{ + public readonly HashSet<(NetEntity, string, string)> Clients; + + public OreSiloBuiState(HashSet<(NetEntity, string, string)> clients) + { + Clients = clients; + } +} + +[Serializable, NetSerializable] +public sealed class ToggleOreSiloClientMessage : BoundUserInterfaceMessage +{ + public readonly NetEntity Client; + + public ToggleOreSiloClientMessage(NetEntity client) + { + Client = client; + } +} + +[Serializable, NetSerializable] +public enum OreSiloUiKey : byte +{ + Key +} diff --git a/Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs b/Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs new file mode 100644 index 0000000000..729a710065 --- /dev/null +++ b/Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs @@ -0,0 +1,168 @@ +using Content.Shared.Power.EntitySystems; +using JetBrains.Annotations; +using Robust.Shared.Utility; + +namespace Content.Shared.Materials.OreSilo; + +public abstract class SharedOreSiloSystem : EntitySystem +{ + [Dependency] private readonly SharedMaterialStorageSystem _materialStorage = default!; + [Dependency] private readonly SharedPowerReceiverSystem _powerReceiver = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + private EntityQuery<OreSiloClientComponent> _clientQuery; + + /// <inheritdoc/> + public override void Initialize() + { + SubscribeLocalEvent<OreSiloComponent, ToggleOreSiloClientMessage>(OnToggleOreSiloClient); + SubscribeLocalEvent<OreSiloComponent, ComponentShutdown>(OnSiloShutdown); + Subs.BuiEvents<OreSiloComponent>(OreSiloUiKey.Key, + subs => + { + subs.Event<BoundUIOpenedEvent>(OnBoundUIOpened); + }); + + + SubscribeLocalEvent<OreSiloClientComponent, GetStoredMaterialsEvent>(OnGetStoredMaterials); + SubscribeLocalEvent<OreSiloClientComponent, ConsumeStoredMaterialsEvent>(OnConsumeStoredMaterials); + SubscribeLocalEvent<OreSiloClientComponent, ComponentShutdown>(OnClientShutdown); + + _clientQuery = GetEntityQuery<OreSiloClientComponent>(); + } + + private void OnToggleOreSiloClient(Entity<OreSiloComponent> ent, ref ToggleOreSiloClientMessage args) + { + var client = GetEntity(args.Client); + + if (!_clientQuery.TryComp(client, out var clientComp)) + return; + + if (ent.Comp.Clients.Contains(client)) // remove client + { + clientComp.Silo = null; + Dirty(client, clientComp); + ent.Comp.Clients.Remove(client); + Dirty(ent); + + UpdateOreSiloUi(ent); + } + else // add client + { + if (!CanTransmitMaterials((ent, ent), client)) + return; + + var clientMats = _materialStorage.GetStoredMaterials(client, true); + var inverseMats = new Dictionary<string, int>(); + foreach (var (mat, amount) in clientMats) + { + inverseMats.Add(mat, -amount); + } + _materialStorage.TryChangeMaterialAmount(client, inverseMats, localOnly: true); + _materialStorage.TryChangeMaterialAmount(ent.Owner, clientMats); + + ent.Comp.Clients.Add(client); + Dirty(ent); + clientComp.Silo = ent; + Dirty(client, clientComp); + + UpdateOreSiloUi(ent); + } + } + + private void OnBoundUIOpened(Entity<OreSiloComponent> ent, ref BoundUIOpenedEvent args) + { + UpdateOreSiloUi(ent); + } + + private void OnSiloShutdown(Entity<OreSiloComponent> ent, ref ComponentShutdown args) + { + foreach (var client in ent.Comp.Clients) + { + if (!_clientQuery.TryComp(client, out var comp)) + continue; + + comp.Silo = null; + Dirty(client, comp); + } + } + + protected virtual void UpdateOreSiloUi(Entity<OreSiloComponent> ent) + { + + } + + private void OnGetStoredMaterials(Entity<OreSiloClientComponent> ent, ref GetStoredMaterialsEvent args) + { + if (args.LocalOnly) + return; + + if (ent.Comp.Silo is not { } silo) + return; + + if (!CanTransmitMaterials(silo, ent)) + return; + + var materials = _materialStorage.GetStoredMaterials(silo); + + foreach (var (mat, amount) in materials) + { + // Don't supply materials that they don't usually have access to. + if (!_materialStorage.IsMaterialWhitelisted((args.Entity, args.Entity), mat)) + continue; + + var existing = args.Materials.GetOrNew(mat); + args.Materials[mat] = existing + amount; + } + } + + private void OnConsumeStoredMaterials(Entity<OreSiloClientComponent> ent, ref ConsumeStoredMaterialsEvent args) + { + if (args.LocalOnly) + return; + + if (ent.Comp.Silo is not { } silo || !TryComp<MaterialStorageComponent>(silo, out var materialStorage)) + return; + + if (!CanTransmitMaterials(silo, ent)) + return; + + foreach (var (mat, amount) in args.Materials) + { + if (!_materialStorage.TryChangeMaterialAmount(silo, mat, amount, materialStorage)) + continue; + args.Materials[mat] = 0; + } + } + + private void OnClientShutdown(Entity<OreSiloClientComponent> ent, ref ComponentShutdown args) + { + if (!TryComp<OreSiloComponent>(ent.Comp.Silo, out var silo)) + return; + + silo.Clients.Remove(ent); + Dirty(ent.Comp.Silo.Value, silo); + UpdateOreSiloUi((ent.Comp.Silo.Value, silo)); + } + + /// <summary> + /// Checks if a given client fulfills the criteria to link/receive materials from an ore silo. + /// </summary> + [PublicAPI] + public bool CanTransmitMaterials(Entity<OreSiloComponent?> silo, EntityUid client) + { + if (!Resolve(silo, ref silo.Comp)) + return false; + + if (!_powerReceiver.IsPowered(silo.Owner)) + return false; + + if (_transform.GetGrid(client) != _transform.GetGrid(silo.Owner)) + return false; + + if (!_transform.InRange(silo.Owner, client, silo.Comp.Range)) + return false; + + return true; + } +} diff --git a/Content.Shared/Materials/SharedMaterialStorageSystem.cs b/Content.Shared/Materials/SharedMaterialStorageSystem.cs index 2544aacadd..2fc03dd997 100644 --- a/Content.Shared/Materials/SharedMaterialStorageSystem.cs +++ b/Content.Shared/Materials/SharedMaterialStorageSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Shared.Interaction; using Content.Shared.Interaction.Components; -using Content.Shared.Mobs; using Content.Shared.Stacks; using Content.Shared.Whitelist; using JetBrains.Annotations; @@ -58,16 +57,22 @@ public abstract class SharedMaterialStorageSystem : EntitySystem } /// <summary> - /// Gets the volume of a specified material contained in this storage. + /// Gets all the materials stored on this entity /// </summary> - /// <param name="uid"></param> - /// <param name="material"></param> - /// <param name="component"></param> - /// <returns>The volume of the material</returns> - [PublicAPI] - public int GetMaterialAmount(EntityUid uid, MaterialPrototype material, MaterialStorageComponent? component = null) + /// <param name="ent"></param> + /// <param name="localOnly">Include only materials held "locally", as determined by event subscribers</param> + /// <returns></returns> + public Dictionary<ProtoId<MaterialPrototype>, int> GetStoredMaterials(Entity<MaterialStorageComponent?> ent, bool localOnly = false) { - return GetMaterialAmount(uid, material.ID, component); + if (!Resolve(ent, ref ent.Comp, false)) + return new(); + + // clone so we don't modify by accident. + var mats = new Dictionary<ProtoId<MaterialPrototype>, int>(ent.Comp.Storage); + var ev = new GetStoredMaterialsEvent((ent, ent.Comp), mats, localOnly); + RaiseLocalEvent(ent, ref ev, true); + + return ev.Materials; } /// <summary> @@ -76,12 +81,27 @@ public abstract class SharedMaterialStorageSystem : EntitySystem /// <param name="uid"></param> /// <param name="material"></param> /// <param name="component"></param> + /// <param name="localOnly"></param> /// <returns>The volume of the material</returns> - public int GetMaterialAmount(EntityUid uid, string material, MaterialStorageComponent? component = null) + [PublicAPI] + public int GetMaterialAmount(EntityUid uid, MaterialPrototype material, MaterialStorageComponent? component = null, bool localOnly = false) + { + return GetMaterialAmount(uid, material.ID, component, localOnly); + } + + /// <summary> + /// Gets the volume of a specified material contained in this storage. + /// </summary> + /// <param name="uid"></param> + /// <param name="material"></param> + /// <param name="component"></param> + /// <param name="localOnly"></param> + /// <returns>The volume of the material</returns> + public int GetMaterialAmount(EntityUid uid, string material, MaterialStorageComponent? component = null, bool localOnly = false) { if (!Resolve(uid, ref component)) return 0; //you have nothing - return component.Storage.GetValueOrDefault(material, 0); + return GetStoredMaterials((uid, component), localOnly).GetValueOrDefault(material, 0); } /// <summary> @@ -89,26 +109,43 @@ public abstract class SharedMaterialStorageSystem : EntitySystem /// </summary> /// <param name="uid"></param> /// <param name="component"></param> + /// <param name="localOnly"></param> /// <returns>The volume of all materials in the storage</returns> - public int GetTotalMaterialAmount(EntityUid uid, MaterialStorageComponent? component = null) + public int GetTotalMaterialAmount(EntityUid uid, MaterialStorageComponent? component = null, bool localOnly = false) { if (!Resolve(uid, ref component)) return 0; - return component.Storage.Values.Sum(); + return GetStoredMaterials((uid, component), localOnly).Values.Sum(); } + // TODO: Revisit this if we ever decide to do things with storage limits. As it stands, the feature is unused. /// <summary> /// Tests if a specific amount of volume will fit in the storage. /// </summary> /// <param name="uid"></param> /// <param name="volume"></param> /// <param name="component"></param> + /// <param name="localOnly"></param> /// <returns>If the specified volume will fit</returns> - public bool CanTakeVolume(EntityUid uid, int volume, MaterialStorageComponent? component = null) + public bool CanTakeVolume(EntityUid uid, int volume, MaterialStorageComponent? component = null, bool localOnly = false) { if (!Resolve(uid, ref component)) return false; - return component.StorageLimit == null || GetTotalMaterialAmount(uid, component) + volume <= component.StorageLimit; + return component.StorageLimit == null || GetTotalMaterialAmount(uid, component, true) + volume <= component.StorageLimit; + } + + /// <summary> + /// Checks if a certain material prototype is supported by this entity. + /// </summary> + public bool IsMaterialWhitelisted(Entity<MaterialStorageComponent?> ent, ProtoId<MaterialPrototype> material) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + if (ent.Comp.MaterialWhiteList == null) + return true; + + return ent.Comp.MaterialWhiteList.Contains(material); } /// <summary> @@ -118,8 +155,9 @@ public abstract class SharedMaterialStorageSystem : EntitySystem /// <param name="materialId"></param> /// <param name="volume"></param> /// <param name="component"></param> + /// <param name="localOnly"></param> /// <returns>If the amount can be changed</returns> - public bool CanChangeMaterialAmount(EntityUid uid, string materialId, int volume, MaterialStorageComponent? component = null) + public bool CanChangeMaterialAmount(EntityUid uid, string materialId, int volume, MaterialStorageComponent? component = null, bool localOnly = false) { if (!Resolve(uid, ref component)) return false; @@ -127,10 +165,10 @@ public abstract class SharedMaterialStorageSystem : EntitySystem if (!CanTakeVolume(uid, volume, component)) return false; - if (component.MaterialWhiteList == null ? false : !component.MaterialWhiteList.Contains(materialId)) + if (!IsMaterialWhitelisted((uid, component), materialId)) return false; - var amount = component.Storage.GetValueOrDefault(materialId); + var amount = GetMaterialAmount(uid, materialId, component, localOnly); return amount + volume >= 0; } @@ -140,14 +178,24 @@ public abstract class SharedMaterialStorageSystem : EntitySystem /// <param name="entity"></param> /// <param name="materials"></param> /// <returns>If the amount can be changed</returns> - public bool CanChangeMaterialAmount(Entity<MaterialStorageComponent?> entity, Dictionary<string,int> materials) + /// <param name="localOnly"></param> + public bool CanChangeMaterialAmount(Entity<MaterialStorageComponent?> entity, Dictionary<string,int> materials, bool localOnly = false) { if (!Resolve(entity, ref entity.Comp)) return false; + var inVolume = materials.Values.Sum(); + var stored = GetStoredMaterials((entity, entity.Comp), localOnly); + + if (!CanTakeVolume(entity, inVolume, entity.Comp)) + return false; + foreach (var (material, amount) in materials) { - if (!CanChangeMaterialAmount(entity, material, amount, entity.Comp)) + if (!IsMaterialWhitelisted(entity, material)) + return false; + + if (stored.GetValueOrDefault(material) + amount < 0) return false; } @@ -163,16 +211,27 @@ public abstract class SharedMaterialStorageSystem : EntitySystem /// <param name="volume"></param> /// <param name="component"></param> /// <param name="dirty"></param> + /// <param name="localOnly"></param> /// <returns>If it was successful</returns> - public bool TryChangeMaterialAmount(EntityUid uid, string materialId, int volume, MaterialStorageComponent? component = null, bool dirty = true) + public bool TryChangeMaterialAmount(EntityUid uid, string materialId, int volume, MaterialStorageComponent? component = null, bool dirty = true, bool localOnly = false) { if (!Resolve(uid, ref component)) return false; - if (!CanChangeMaterialAmount(uid, materialId, volume, component)) + + if (!CanChangeMaterialAmount(uid, materialId, volume, component, localOnly)) return false; + var changeEv = new ConsumeStoredMaterialsEvent((uid, component), new() {{materialId, volume}}, localOnly); + RaiseLocalEvent(uid, ref changeEv); + var remaining = changeEv.Materials.Values.First(); + var existing = component.Storage.GetOrNew(materialId); - existing += volume; + + var localUpperLimit = component.StorageLimit == null ? int.MaxValue : component.StorageLimit.Value - existing; + var localLowerLimit = -existing; + var localChange = Math.Clamp(remaining, localLowerLimit, localUpperLimit); + + existing += localChange; if (existing == 0) component.Storage.Remove(materialId); @@ -191,23 +250,54 @@ public abstract class SharedMaterialStorageSystem : EntitySystem /// Changes the amount of a specific material in the storage. /// Still respects the filters in place. /// </summary> - /// <param name="entity"></param> - /// <param name="materials"></param> /// <returns>If the amount can be changed</returns> - public bool TryChangeMaterialAmount(Entity<MaterialStorageComponent?> entity, Dictionary<string,int> materials) + public bool TryChangeMaterialAmount(Entity<MaterialStorageComponent?> entity, Dictionary<string, int> materials, bool localOnly = false) + { + return TryChangeMaterialAmount(entity, materials.Select(p => (new ProtoId<MaterialPrototype>(p.Key), p.Value)).ToDictionary(), localOnly); + } + + /// <summary> + /// Changes the amount of a specific material in the storage. + /// Still respects the filters in place. + /// </summary> + /// <returns>If the amount can be changed</returns> + public bool TryChangeMaterialAmount( + Entity<MaterialStorageComponent?> entity, + Dictionary<ProtoId<MaterialPrototype>, int> materials, + bool localOnly = false) { if (!Resolve(entity, ref entity.Comp)) return false; - if (!CanChangeMaterialAmount(entity, materials)) - return false; - foreach (var (material, amount) in materials) { - if (!TryChangeMaterialAmount(entity, material, amount, entity.Comp, false)) + if (!CanChangeMaterialAmount(entity, material, amount, entity)) return false; } + var changeEv = new ConsumeStoredMaterialsEvent((entity, entity.Comp), materials, localOnly); + RaiseLocalEvent(entity, ref changeEv); + + foreach (var (material, remaining) in changeEv.Materials) + { + var existing = entity.Comp.Storage.GetOrNew(material); + + var localUpperLimit = entity.Comp.StorageLimit == null ? int.MaxValue : entity.Comp.StorageLimit.Value - existing; + var localLowerLimit = -existing; + var localChange = Math.Clamp(remaining, localLowerLimit, localUpperLimit); + + existing += localChange; + + if (existing == 0) + entity.Comp.Storage.Remove(material); + else + entity.Comp.Storage[material] = existing; + + } + + var ev = new MaterialAmountChangedEvent(); + RaiseLocalEvent(entity, ref ev); + Dirty(entity, entity.Comp); return true; } @@ -221,6 +311,7 @@ public abstract class SharedMaterialStorageSystem : EntitySystem /// <param name="volume">The stored material volume to set the storage to.</param> /// <param name="component">The storage component on <paramref name="uid"/>. Resolved automatically if not given.</param> /// <returns>True if it was successful (enough space etc).</returns> + [PublicAPI] public bool TrySetMaterialAmount( EntityUid uid, string materialId, @@ -268,7 +359,7 @@ public abstract class SharedMaterialStorageSystem : EntitySystem totalVolume += vol * multiplier; } - if (!CanTakeVolume(receiver, totalVolume, storage)) + if (!CanTakeVolume(receiver, totalVolume, storage, localOnly: true)) return false; foreach (var (mat, vol) in composition.MaterialComposition) diff --git a/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl b/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl index 907baf4ffc..076a70447c 100644 --- a/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl +++ b/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl @@ -25,6 +25,7 @@ lathe-menu-material-amount-missing = { $amount -> *[other] {NATURALFIXED($amount, 2)} {MAKEPLURAL($unit)} of {$material} ([color=red]{NATURALFIXED($missingAmount, 2)} {MAKEPLURAL($unit)} missing[/color]) } lathe-menu-no-materials-message = No materials loaded. +lathe-menu-silo-linked-message = Silo Linked lathe-menu-fabricating-message = Fabricating... lathe-menu-materials-title = Materials lathe-menu-queue-title = Build Queue diff --git a/Resources/Locale/en-US/materials/silo.ftl b/Resources/Locale/en-US/materials/silo.ftl new file mode 100644 index 0000000000..32d7de8b2e --- /dev/null +++ b/Resources/Locale/en-US/materials/silo.ftl @@ -0,0 +1,10 @@ +ore-silo-ui-title = Material Silo +ore-silo-ui-label-clients = Machines +ore-silo-ui-label-mats = Materials +ore-silo-ui-itemlist-entry = {$linked -> + [true] {"[Linked] "} + *[False] {""} +} {$name} ({$beacon}) {$inRange -> + [true] {""} + *[false] (Out of Range) +} diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml index 097a11185b..35830900a8 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml @@ -98,6 +98,16 @@ category: cargoproduct-category-name-materials group: market +- type: cargoProduct + id: MaterialSilo + icon: + sprite: Structures/Machines/silo.rsi + state: silo + product: CrateMaterialSilo + cost: 5000 + category: cargoproduct-category-name-materials + group: market + - type: cargoProduct id: MaterialFuelTank icon: diff --git a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml index f6eb9a17af..80c6311f13 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml @@ -153,6 +153,22 @@ # for some reason, the selector here adds 1 to whatever value it generates, # so this is actually 2-4 +- type: entity + id: CrateMaterialSilo + parent: CrateGenericSteel + name: material silo crate + description: A package including all the materials to create a material silo. + components: + - type: StorageFill + contents: + - id: MaterialSiloMachineCircuitboard + - id: SheetSteel1 + amount: 5 + - id: MatterBinStockPart + amount: 4 + - id: CableApcStack1 + amount: 2 + - type: entity id: CrateMaterialBasicResource parent: CrateGenericSteel diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 812b495ee9..48af55da3f 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -1005,6 +1005,19 @@ Manipulator: 1 Steel: 1 +- type: entity + id: MaterialSiloMachineCircuitboard + parent: BaseMachineCircuitboard + name: material silo machine board + components: + - type: Sprite + state: supply + - type: MachineBoard + prototype: MachineMaterialSilo + stackRequirements: + MatterBin: 4 + Cable: 1 + - type: entity id: OreProcessorMachineCircuitboard parent: BaseMachineCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml index 1761f176da..6ef8f7262f 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml @@ -270,6 +270,7 @@ - Sheet materialWhiteList: - Plasma + - type: OreSiloClient - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml b/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml index 78f1504003..f7f1bcba1b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml @@ -44,6 +44,7 @@ - Sheet - RawMaterial - Ingot + - type: OreSiloClient - type: AmbientSound enabled: false volume: 5 diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 0d008ed1e1..3b4b9cf5d2 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -112,6 +112,7 @@ - Sheet - RawMaterial - Ingot + - type: OreSiloClient - type: Lathe idleState: icon runningState: building @@ -184,6 +185,7 @@ - Sheet - RawMaterial - Ingot + - type: OreSiloClient - type: Lathe idleState: icon runningState: building @@ -273,6 +275,7 @@ - Sheet - RawMaterial - Ingot + - type: OreSiloClient - type: RequireProjectileTarget - type: entity @@ -321,6 +324,7 @@ - Sheet - RawMaterial - Ingot + - type: OreSiloClient - type: GuideHelp guides: - Robotics @@ -408,6 +412,7 @@ - Sheet - RawMaterial - Ingot + - type: OreSiloClient - type: LatheAnnouncing channels: [Security] @@ -443,6 +448,7 @@ - Sheet - RawMaterial - Ingot + - type: OreSiloClient - type: entity id: MedicalTechFab @@ -480,6 +486,7 @@ board: MedicalTechFabCircuitboard - type: StealTarget stealGroup: MedicalTechFabCircuitboard + - type: OreSiloClient - type: LatheAnnouncing channels: [Medical] diff --git a/Resources/Prototypes/Entities/Structures/Machines/silo.yml b/Resources/Prototypes/Entities/Structures/Machines/silo.yml new file mode 100644 index 0000000000..31bfe42572 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Machines/silo.yml @@ -0,0 +1,61 @@ +- type: entity + id: MachineMaterialSilo + parent: [ BaseMachinePowered, ConstructibleMachine ] + name: material silo + description: An advanced machine, capable of using bluespace technology to transmit materials to nearby machines. + components: + - type: Sprite + sprite: Structures/Machines/silo.rsi + layers: + - state: silo + map: [ "base" ] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.PowerDeviceVisuals.Powered: + base: + True: { state: silo_active } + False: { state: silo } + - type: OreSilo + - type: MaterialStorage + whitelist: + tags: + - Sheet + - Ingot + - type: ActivatableUI + key: enum.OreSiloUiKey.Key + - type: ActivatableUIRequiresPower + - type: UserInterface + interfaces: + enum.OreSiloUiKey.Key: + type: OreSiloBoundUserInterface + - type: Machine + board: MaterialSiloMachineCircuitboard + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.4,-0.4,0.4,0.4" + density: 190 + mask: + - MachineMask + layer: + - MachineLayer + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:ChangeConstructionNodeBehavior + node: machineFrame + - !type:DoActsBehavior + acts: ["Destruction"] + - type: WiresVisuals + - type: WiresPanel + - type: StaticPrice + price: 1500 diff --git a/Resources/Textures/Structures/Machines/silo.rsi/meta.json b/Resources/Textures/Structures/Machines/silo.rsi/meta.json new file mode 100644 index 0000000000..aa78616897 --- /dev/null +++ b/Resources/Textures/Structures/Machines/silo.rsi/meta.json @@ -0,0 +1,40 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/d74b67828394a9842578279a6b8ab2955bb08216. Created by MrDoomBringer (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "silo" + }, + { + "name": "silo_active", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "overlay_active", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Machines/silo.rsi/overlay_active.png b/Resources/Textures/Structures/Machines/silo.rsi/overlay_active.png new file mode 100644 index 0000000000000000000000000000000000000000..0a06e45676e51e077b0d35b277127ea486a80662 GIT binary patch literal 336 zcmV-W0k8gvP)<h;3K|Lk000e1NJLTq002M$003YJ1^@s6t;KZc00001b5ch_0Itp) z=>Px$3Q0skRCt{2+aXTGKokJbzX`#iP-HCz#Tf_}Kx2?ANKmUd018EdK(0Y^flbeV z!r(Tf3dJhS;K+&z+iubhY2TBRw!bs;Tl4=!0000mK9k(w)5k^1jnAep+3Wu@Uo6w% ze#GZ@#QoKIqx<`ezt{GGZ8e>Asra40+%6d~r1<}y3>Z5Z00000001x+*-FXl!*#Yk ze|q!Sy0TK$DIFg~ynjWU9Zh=g57?&j{(z>F9;~WPX|+zNs#A7XhaR8OJ5V}4rFWoo ze4xD5+V>9t0000G5k2$=?4r;3o%aWnKDv5xdHcJVZ_jt*?p4Sc{NZUCu!Rf&IyGM` ii<YK0{{a91n|=U<wz?mK<Djen0000<MNUMnLSTaU5|c6j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/silo.rsi/silo.png b/Resources/Textures/Structures/Machines/silo.rsi/silo.png new file mode 100644 index 0000000000000000000000000000000000000000..45fe37ac5fa420d75ab5129671fb3c05c72125c4 GIT binary patch literal 1097 zcmV-P1h)H$P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000ie z000ie0hKEb8vp<U`$<GWRCt`tS6gUQM;QK6gyzb+(X1z?tBEEmT1&On2+BT$Xxl{A zTfi4V`{Ip#s3;mN6-l6|C{b9U?TbM~w8WT(8fg*5=z|x$Un*wf#%|ZF8)I^6l17O= zJ^$>^$((a$<9hE0hkxdunf<=`=by_C!+Xa6TR?e<M|;r^96Q;Z^2P;l;!@9SWIKl& z{%z+~Q@@Iw$7HnE5n>ZS<U~vm$qALk4wHzwj%-v+oy@D+tB5cO7>b-QYE&+2yt!D{ zc*pP+jw?XmUJ%n`LS9-#(n(0<gaVxq7!*JesVt6(5Mj-qM8XUKG+_E*IHib@0}bDN zg@wD1+uC^))V_aM-TOtU*euPJceV}7y$f)x@fS8xQG`^0Z2hgM@lG;wA<;637_BH+ zv2+P)4<9l4lZpUe|F?lxT7nCu<*~wi-<uau`*Q=fRIW4mdY|<(d-Kj8=<{tr&QE?; z-@MX??*$R3&R;Uh`D5I8{$U0SJ;CX8BC0-;3s~^wTy5alQ|8E3Mxbh2O+v-n<K!}g z!(pTBNKZqyBMa@p7Q<Is=4E!ytQp$ba~D$#0aol^T_Ppe)NqY$#b7+yX!e_b_2b{_ zZ;d`{LJx58<4Mx-Cz={<KAV8{NGFm7?F4xJ=vWzF21h1Nmw13^)aXOUHAnpJ7+OGT z>M-oRqCy6%IKB-lc?5Ruv5k?D4k<v<ljhI+ZRqM&;T-NT+5G&EOnq4d;zH=6B7}w6 z6OxKRptTi+<Hs9L8M!ZTA9cF8pm5lTmlB7n{>^Nj%awctqK|}5AHYW5S)svSHx{&^ z#3Zz0*<vp)-?)tnSFR_F0KX?p0tmf&14SY;D}ybAqNFiDS>-GhfJh{QmxUMseolzn z)etacViDRxf1&3|FCvf=DJ}&Yw^SMR2|`=FemQn_ceC<D{kLeQ;=#lrlA8n&x#zP_ z(R}GD)-GR$9sVC}g9A@mrNa99`;jar7Zu`mOTaE5-#wV&ME>=nGUVjBS)DGU_1|qZ z+ILmQ$~+0vFCH=p>FMdi%xRyn_W|WV|Cw6mryMy@Z$6An5g6kd$;w2&?`RV?`c|<z zkrS!a_NraTy89cVZVz0cX6X!xoD<WRFaiV$KL?56%RoXNK5S=YvQ#G#S$dtwH+`Oo zeWBPm;jy6+5s?oCCZMCMJ0&18T-RG$u*I`N0b;<9<RN5|@^skZ(iXj_U9XKx4~ zw1wMKrWB21@3!haKd>^-i~6SDS&q;$iB@bAQQ#h}1w#*vNKl#k$VvqeZnfNF#Pm^F z|HNiCkjN9YNys6Rax1pm?gCK+62RJK-G<g#iejuj>3e`g;2q(;|2zH<;?&_Rq!Oia P00000NkvXXu0mjf?0yDu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/silo.rsi/silo_active.png b/Resources/Textures/Structures/Machines/silo.rsi/silo_active.png new file mode 100644 index 0000000000000000000000000000000000000000..f25218b2d2d559043f83795c79652f1302485f08 GIT binary patch literal 1888 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 aLi`UQu4W_jnSeq70000<MNUMnLSTX*>W|t0 literal 0 HcmV?d00001 From 297a9a8762bcc37ad08a2e4ba79acb0d5e03aa21 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Fri, 18 Apr 2025 23:44:24 +0000 Subject: [PATCH 325/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b4c7676377..33b0a69a7a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: J C Denton - changes: - - message: Syndicate and NanoTrasen NPCs and turrets are now hostile to Dragons - and Carps - type: Tweak - id: 7741 - time: '2024-12-20T21:38:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32515 - author: lzk228 changes: - message: Item's tool function now shows on examine. @@ -3912,3 +3904,11 @@ id: 8241 time: '2025-04-18T23:34:59.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34223 +- author: EmoGarbage404 + changes: + - message: Added the material silo. This machine allows nearby machines to share + a pool of resources, cutting down on micromanagement. + type: Add + id: 8242 + time: '2025-04-18T23:43:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36492 From 37f16c3abdcfa79e2952df4ef5b9bc0bd9fe2f50 Mon Sep 17 00:00:00 2001 From: OneZerooo0 <172208291+OneZerooo0@users.noreply.github.com> Date: Fri, 18 Apr 2025 20:04:44 -0400 Subject: [PATCH 326/622] Modular Grenades now fit in security belts/carriers (#34169) * Added PayloadCase component to secbelt whitelist * Replaced PayloadCase type whitelist with a tag * fucking hell * Add HandGrenade tag to all grenades Grenades are so unbelievably cooked right now. I've counted about 4 separate baseitems that they inherit from whenever they feel like it. Why? They're all the same. --------- Co-authored-by: Milon <milonpl.git@proton.me> Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- Resources/Prototypes/Entities/Clothing/Belt/belts.yml | 1 + .../Entities/Objects/Weapons/Throwable/grenades.yml | 7 +++++++ .../Objects/Weapons/Throwable/projectile_grenades.yml | 3 +++ .../Objects/Weapons/Throwable/scattering_grenades.yml | 3 +++ Resources/Prototypes/tags.yml | 3 +++ 5 files changed, 17 insertions(+) diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index efae094765..27cd2921b8 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -481,6 +481,7 @@ - MagazineMagnum - CombatKnife - Truncheon + - HandGrenade components: - Stunbaton - FlashOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 8be5b5f8aa..ebfdf184f7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -35,6 +35,9 @@ enum.ConstructionVisuals.Layer: Primed: { state: primed } Unprimed: { state: icon } + - type: Tag + tags: + - HandGrenade - type: entity name: explosive grenade @@ -83,6 +86,7 @@ - Antagonists - type: Tag tags: + - HandGrenade - GrenadeFlashBang - type: entity @@ -312,6 +316,9 @@ map: [ "enum.ConstructionVisuals.Layer" ] - type: Item size: Small + - type: Tag + tags: + - HandGrenade - type: PayloadCase - type: Construction graph: ModularGrenadeGraph diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml index 6a111ef1c8..41fad224c4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml @@ -25,6 +25,9 @@ enum.ConstructionVisuals.Layer: Primed: { state: primed } Unprimed: { state: icon } + - type: Tag + tags: + - HandGrenade - type: entity parent: [ProjectileGrenadeBase, BaseSecurityContraband] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml index 38fde5c540..a3087f1f9e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml @@ -18,6 +18,9 @@ behaviors: - !type:TriggerBehavior - type: ScatteringGrenade + - type: Tag + tags: + - HandGrenade - type: entity parent: [ScatteringGrenadeBase, BaseSecurityContraband] diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index bd3644d53c..910c24b303 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -641,6 +641,9 @@ - type: Tag id: Handcuffs +- type: Tag + id: HandGrenade + - type: Tag id: HappyHonk From 181bb27797b2f54315178b79de7bafad5d4e3499 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 00:05:50 +0000 Subject: [PATCH 327/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 33b0a69a7a..a5fda209ff 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: lzk228 - changes: - - message: Item's tool function now shows on examine. - type: Add - id: 7742 - time: '2024-12-20T22:15:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32436 - author: Pinkbat5 changes: - message: Diona can now chirp. @@ -3912,3 +3905,10 @@ id: 8242 time: '2025-04-18T23:43:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36492 +- author: Onezero0 + changes: + - message: Modular Grenades can now fit inside Security belts and carriers. + type: Tweak + id: 8243 + time: '2025-04-19T00:04:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34169 From a6741e42c13dc1fbd717264e389074b4fa33bbe7 Mon Sep 17 00:00:00 2001 From: Jajsha <101492056+Zap527@users.noreply.github.com> Date: Fri, 18 Apr 2025 20:11:28 -0400 Subject: [PATCH 328/622] Un-Hardcode water evaporation & mopping behavior (#33399) * Un-harcode slipperiness * Make it actually work * Prettyfy * Cleanup GetEvaporatingReagents * Fix mopping with space lube + wrong solutions in absorbance * Remove LINQ and rename parameters * Change evaporation speed to fixedpoint2 * Add evaporating speed functionality * Remove unused imports * Swap around reagent evaporation speed and puddle evaporation speed. --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- .../Fluids/EntitySystems/AbsorbentSystem.cs | 22 +++++----- .../EntitySystems/PuddleSystem.Evaporation.cs | 10 +++-- .../Chemistry/Reagent/ReagentPrototype.cs | 17 ++++++-- .../Fluids/Components/EvaporationComponent.cs | 4 +- .../Fluids/SharedPuddleSystem.Evaporation.cs | 43 +++++++++++++++++-- Content.Shared/Fluids/SharedPuddleSystem.cs | 2 +- .../Reagents/Consumable/Drink/drinks.yml | 2 + 7 files changed, 76 insertions(+), 24 deletions(-) diff --git a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs index 56e039a700..cb3cae10af 100644 --- a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs +++ b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs @@ -57,14 +57,14 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem var oldProgress = component.Progress.ShallowClone(); component.Progress.Clear(); - var water = solution.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagents); - if (water > FixedPoint2.Zero) + var mopReagent = solution.GetTotalPrototypeQuantity(_puddleSystem.GetAbsorbentReagents(solution)); + if (mopReagent > FixedPoint2.Zero) { - component.Progress[solution.GetColorWithOnly(_prototype, PuddleSystem.EvaporationReagents)] = water.Float(); + component.Progress[solution.GetColorWithOnly(_prototype, _puddleSystem.GetAbsorbentReagents(solution))] = mopReagent.Float(); } - var otherColor = solution.GetColorWithout(_prototype, PuddleSystem.EvaporationReagents); - var other = (solution.Volume - water).Float(); + var otherColor = solution.GetColorWithout(_prototype, _puddleSystem.GetAbsorbentReagents(solution)); + var other = (solution.Volume - mopReagent).Float(); if (other > 0f) { @@ -180,7 +180,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem } // Prioritize transferring non-evaporatives if absorbent has any - var contaminants = _solutionContainerSystem.SplitSolutionWithout(absorbentSoln, transferAmount, PuddleSystem.EvaporationReagents); + var contaminants = _solutionContainerSystem.SplitSolutionWithout(absorbentSoln, transferAmount, _puddleSystem.GetAbsorbentReagents(absorbentSoln.Comp.Solution)); if (contaminants.Volume > 0) { _solutionContainerSystem.TryAddSolution(refillableSoln, contaminants); @@ -205,7 +205,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem Entity<SolutionComponent> absorbentSoln, Entity<SolutionComponent> refillableSoln) { - var contaminantsFromAbsorbent = _solutionContainerSystem.SplitSolutionWithout(absorbentSoln, component.PickupAmount, PuddleSystem.EvaporationReagents); + var contaminantsFromAbsorbent = _solutionContainerSystem.SplitSolutionWithout(absorbentSoln, component.PickupAmount, _puddleSystem.GetAbsorbentReagents(absorbentSoln.Comp.Solution)); var absorbentSolution = absorbentSoln.Comp.Solution; if (contaminantsFromAbsorbent.Volume == FixedPoint2.Zero && absorbentSolution.AvailableVolume == FixedPoint2.Zero) @@ -222,7 +222,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem absorbentSolution.AvailableVolume; var refillableSolution = refillableSoln.Comp.Solution; - var waterFromRefillable = refillableSolution.SplitSolutionWithOnly(waterPulled, PuddleSystem.EvaporationReagents); + var waterFromRefillable = refillableSolution.SplitSolutionWithOnly(waterPulled, _puddleSystem.GetAbsorbentReagents(refillableSoln.Comp.Solution)); _solutionContainerSystem.UpdateChemicals(refillableSoln); if (waterFromRefillable.Volume == FixedPoint2.Zero && contaminantsFromAbsorbent.Volume == FixedPoint2.Zero) @@ -284,7 +284,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem // Check if we have any evaporative reagents on our absorber to transfer var absorberSolution = absorberSoln.Comp.Solution; - var available = absorberSolution.GetTotalPrototypeQuantity(PuddleSystem.EvaporationReagents); + var available = absorberSolution.GetTotalPrototypeQuantity(_puddleSystem.GetAbsorbentReagents(absorberSolution)); // No material if (available == FixedPoint2.Zero) @@ -296,8 +296,8 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem var transferMax = absorber.PickupAmount; var transferAmount = available > transferMax ? transferMax : available; - var puddleSplit = puddleSolution.SplitSolutionWithout(transferAmount, PuddleSystem.EvaporationReagents); - var absorberSplit = absorberSolution.SplitSolutionWithOnly(puddleSplit.Volume, PuddleSystem.EvaporationReagents); + var puddleSplit = puddleSolution.SplitSolutionWithout(transferAmount, _puddleSystem.GetAbsorbentReagents(puddleSolution)); + var absorberSplit = absorberSolution.SplitSolutionWithOnly(puddleSplit.Volume, _puddleSystem.GetAbsorbentReagents(absorberSolution)); // Do tile reactions first var transform = Transform(target); diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs index d78950b1d5..f92504e74c 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs @@ -1,4 +1,5 @@ using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; using Content.Shared.FixedPoint; using Content.Shared.Fluids.Components; @@ -20,7 +21,7 @@ public sealed partial class PuddleSystem return; } - if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero) + if (solution.GetTotalPrototypeQuantity(GetEvaporatingReagents(solution)) > FixedPoint2.Zero) { var evaporation = AddComp<EvaporationComponent>(uid); evaporation.NextTick = _timing.CurTime + EvaporationCooldown; @@ -45,8 +46,11 @@ public sealed partial class PuddleSystem if (!_solutionContainerSystem.ResolveSolution(uid, puddle.SolutionName, ref puddle.Solution, out var puddleSolution)) continue; - var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds; - puddleSolution.SplitSolutionWithOnly(reagentTick, EvaporationReagents); + foreach ((string evaporatingReagent, FixedPoint2 evaporatingSpeed) in GetEvaporationSpeeds(puddleSolution)) + { + var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds * evaporatingSpeed; + puddleSolution.SplitSolutionWithOnly(reagentTick, evaporatingReagent); + } // Despawn if we're done if (puddleSolution.Volume == FixedPoint2.Zero) diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 84cdb47494..cfca682e9b 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -1,5 +1,6 @@ using System.Collections.Frozen; using System.Linq; +using Content.Shared.FixedPoint; using System.Text.Json.Serialization; using Content.Shared.Administration.Logs; using Content.Shared.Body.Prototypes; @@ -7,14 +8,12 @@ using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reaction; using Content.Shared.EntityEffects; using Content.Shared.Database; -using Content.Shared.FixedPoint; using Content.Shared.Nutrition; using Robust.Shared.Audio; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array; using Robust.Shared.Utility; @@ -105,6 +104,18 @@ namespace Content.Shared.Chemistry.Reagent [DataField] public bool Slippery; + /// <summary> + /// The speed at which the reagent evaporates over time. + /// </summary> + [DataField] + public FixedPoint2 EvaporationSpeed = FixedPoint2.Zero; + + /// <summary> + /// If this reagent can be used to mop up other reagents. + /// </summary> + [DataField] + public bool Absorbent = false; + /// <summary> /// How easily this reagent becomes fizzy when aggitated. /// 0 - completely flat, 1 - fizzes up when nudged. @@ -206,7 +217,7 @@ namespace Content.Shared.Chemistry.Reagent .ToDictionary(x => x.Key, x => x.Item2); if (proto.PlantMetabolisms.Count > 0) { - PlantMetabolisms = new List<string> (proto.PlantMetabolisms + PlantMetabolisms = new List<string>(proto.PlantMetabolisms .Select(x => x.GuidebookEffectDescription(prototype, entSys)) .Where(x => x is not null) .Select(x => x!) diff --git a/Content.Shared/Fluids/Components/EvaporationComponent.cs b/Content.Shared/Fluids/Components/EvaporationComponent.cs index 5545bd7be5..9b46629439 100644 --- a/Content.Shared/Fluids/Components/EvaporationComponent.cs +++ b/Content.Shared/Fluids/Components/EvaporationComponent.cs @@ -18,8 +18,8 @@ public sealed partial class EvaporationComponent : Component public TimeSpan NextTick = TimeSpan.Zero; /// <summary> - /// How much evaporation per second. + /// Evaporation factor. Multiplied by the evaporating speed of the reagent. /// </summary> [DataField("evaporationAmount")] - public FixedPoint2 EvaporationAmount = FixedPoint2.New(0.3); + public FixedPoint2 EvaporationAmount = FixedPoint2.New(1); } diff --git a/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs b/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs index 023d024a05..8b937ed1a7 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs @@ -1,17 +1,52 @@ using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; namespace Content.Shared.Fluids; public abstract partial class SharedPuddleSystem { - [ValidatePrototypeId<ReagentPrototype>] - private const string Water = "Water"; + public string[] GetEvaporatingReagents(Solution solution) + { + var evaporatingReagents = new List<string>(); + foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) + { + if (solProto.EvaporationSpeed > FixedPoint2.Zero) + evaporatingReagents.Add(solProto.ID); + } + return evaporatingReagents.ToArray(); + } - public static readonly string[] EvaporationReagents = [Water]; + public string[] GetAbsorbentReagents(Solution solution) + { + var absorbentReagents = new List<string>(); + foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) + { + if (solProto.Absorbent) + absorbentReagents.Add(solProto.ID); + } + return absorbentReagents.ToArray(); + } public bool CanFullyEvaporate(Solution solution) { - return solution.GetTotalPrototypeQuantity(EvaporationReagents) == solution.Volume; + return solution.GetTotalPrototypeQuantity(GetEvaporatingReagents(solution)) == solution.Volume; + } + + /// <summary> + /// Gets the evaporating speed of the reagents within a solution. + /// The speed at which a solution evaporates is the sum of the speed of all evaporating reagents in it. + /// </summary> + public Dictionary<string, FixedPoint2> GetEvaporationSpeeds(Solution solution) + { + var evaporatingSpeeds = new Dictionary<string, FixedPoint2>(); + foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) + { + if (solProto.EvaporationSpeed > FixedPoint2.Zero) + { + evaporatingSpeeds.Add(solProto.ID, solProto.EvaporationSpeed); + } + } + return evaporatingSpeeds; } } diff --git a/Content.Shared/Fluids/SharedPuddleSystem.cs b/Content.Shared/Fluids/SharedPuddleSystem.cs index f573c042c5..34ba8ba803 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.cs @@ -100,7 +100,7 @@ public abstract partial class SharedPuddleSystem : EntitySystem { if (CanFullyEvaporate(solution)) args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating")); - else if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero) + else if (solution.GetTotalPrototypeQuantity(GetEvaporatingReagents(solution)) > FixedPoint2.Zero) args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating-partial")); else args.PushMarkup(Loc.GetString("puddle-component-examine-evaporating-no")); diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml index f72733d15d..c722c42162 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml @@ -436,6 +436,8 @@ parent: BaseDrink desc: reagent-desc-water slippery: true + evaporationSpeed: 0.3 + absorbent: true physicalDesc: reagent-physical-desc-translucent flavor: water color: "#75b1f0" From 56feab4e0bc74fbbb4186d0d19a238ebe068a199 Mon Sep 17 00:00:00 2001 From: Aaron <betterwithketchup@gmail.com> Date: Fri, 18 Apr 2025 20:14:44 -0400 Subject: [PATCH 329/622] Add PreventFTLComponent and changed FTL check (#34077) * Add PreventFTLComponent and changed FTL check * Remove component body. --------- Co-authored-by: Milon <milonpl.git@proton.me> --- .../Shuttles/Systems/ShuttleSystem.FasterThanLight.cs | 2 +- .../Shuttles/Components/PreventFTLComponent.cs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 Content.Shared/Shuttles/Components/PreventFTLComponent.cs diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index cae6c443dd..40464e516f 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -243,7 +243,7 @@ public sealed partial class ShuttleSystem } } - if (HasComp<PreventPilotComponent>(shuttleUid)) + if (HasComp<PreventPilotComponent>(shuttleUid) || HasComp<PreventFTLComponent>(shuttleUid)) { reason = Loc.GetString("shuttle-console-prevent"); return false; diff --git a/Content.Shared/Shuttles/Components/PreventFTLComponent.cs b/Content.Shared/Shuttles/Components/PreventFTLComponent.cs new file mode 100644 index 0000000000..343e1ffb06 --- /dev/null +++ b/Content.Shared/Shuttles/Components/PreventFTLComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Shuttles.Components; + +/// <summary> +/// Add to grids that you do not want to FTL, but still might want to pilot. +/// </summary> +[RegisterComponent, NetworkedComponent] +public sealed partial class PreventFTLComponent : Component; From 07c1a6fd45f47c625ce6cdd242ca3d71b5449e26 Mon Sep 17 00:00:00 2001 From: Alpaccalypse <21291379+Alpaccalypse@users.noreply.github.com> Date: Sat, 19 Apr 2025 01:24:26 +0100 Subject: [PATCH 330/622] Change 'Irish slammer' to 'Grenade Penguin' (#34181) * Changed irish slammer to grenade penguin. * changed DrinkGlass suffix to grenade penguin * Fixed typo * Added penguin squawk to reaction * Added comment as ID differs from localisation * Minor, post merge fix --- .../Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl | 4 ++-- .../Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml | 2 +- Resources/Prototypes/Recipes/Reactions/drinks.yml | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl index 962f0898b1..5a22328900 100644 --- a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl +++ b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl @@ -157,8 +157,8 @@ reagent-desc-hooch = Either someone's failure at cocktail making or attempt in a reagent-name-iced-beer = iced beer reagent-desc-iced-beer = A beer which is so cold the air around it freezes. -reagent-name-irish-slammer = Irish slammer -reagent-desc-irish-slammer = An unconventional mixture of irish cream and stout. +reagent-name-irish-slammer = Grenade Penguin +reagent-desc-irish-slammer = What's black and white and red all over? reagent-name-irish-cream = Irish cream reagent-desc-irish-cream = Whiskey-imbued cream. What else could you expect from the Irish. diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index ca56fbcb35..1891ed71ec 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -1116,7 +1116,7 @@ - type: entity parent: DrinkGlass id: DrinkIrishSlammer - suffix: irish slammer + suffix: grenade penguin components: - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml index a46dfa2969..b307166aa8 100644 --- a/Resources/Prototypes/Recipes/Reactions/drinks.yml +++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml @@ -573,6 +573,8 @@ amount: 1 products: IrishSlammer: 2 + sound: + path: /Audio/Animals/penguin_squawk.ogg # Cocktail is called grenade penguin in localisation - type: reaction id: IrishCoffee From d569c3b73c26ac9ef94fde41e80c8fa23a2c2127 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sat, 19 Apr 2025 02:25:29 +0200 Subject: [PATCH 331/622] Make artifact module actually useful. (#33338) Init --- .../Entities/Objects/Specific/Robotics/borg_modules.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index 44855ccfa3..f26cb0a041 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -606,6 +606,11 @@ - type: ItemBorgModule items: - NodeScanner + - Multitool + - Wrench + - SprayBottle + - Beaker + - Syringe - type: BorgModuleIcon icon: { sprite: Interface/Actions/actions_borg.rsi, state: node-scanner-module } From 7b78feb308730150dfdc1a4b627ed9abbe55c5fc Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 00:25:32 +0000 Subject: [PATCH 332/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a5fda209ff..365d2a41f7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: Pinkbat5 - changes: - - message: Diona can now chirp. - type: Add - - message: Nymphs can scream and laugh like adult diona. - type: Add - id: 7743 - time: '2024-12-20T22:34:44.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32511 - author: ScarKy0 changes: - message: Syndicate uplinks now have 6 discounts instead of 3. @@ -3912,3 +3903,10 @@ id: 8243 time: '2025-04-19T00:04:44.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34169 +- author: Alpaccalypse + changes: + - message: The cocktail "Irish slammer" has been renamed to "Grenade Penguin". + type: Tweak + id: 8244 + time: '2025-04-19T00:24:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34181 From d0c2a6443623b429d447b5096826958b12864cfe Mon Sep 17 00:00:00 2001 From: August Sun <45527070+august-sun@users.noreply.github.com> Date: Fri, 18 Apr 2025 18:26:23 -0600 Subject: [PATCH 333/622] Resprited the Chief Engineer's mantle/manica (#36697) * Swapped sprites, updated JSON and name/description of item * Change RSI meta.json spacing --------- Co-authored-by: august-sun <45527070+august.sun@users.noreply.github.com> Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Entities/Clothing/Neck/mantles.yml | 6 ++-- .../mantles/cemantle.rsi/equipped-NECK.png | Bin 817 -> 762 bytes .../Neck/mantles/cemantle.rsi/icon.png | Bin 393 -> 353 bytes .../Neck/mantles/cemantle.rsi/meta.json | 32 +++++++++--------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml b/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml index bd389bcf4a..586cc5e665 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml @@ -12,8 +12,8 @@ - type: entity parent: [ClothingNeckBase, BaseCommandContraband] id: ClothingNeckMantleCE - name: chief engineer's mantle - description: High visibility, check. RIG system, check. High capacity cell, check. Everything a chief engineer could need in a stylish mantle. + name: chief engineer's manica + description: A segmented arm covering for the experienced Chief Engineer, to signify the hazards of the job and the dangers faced to earn it. components: - type: Sprite sprite: Clothing/Neck/mantles/cemantle.rsi @@ -84,4 +84,4 @@ - type: Sprite sprite: Clothing/Neck/mantles/mantle.rsi - type: Clothing - sprite: Clothing/Neck/mantles/mantle.rsi + sprite: Clothing/Neck/mantles/mantle.rsi diff --git a/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/equipped-NECK.png b/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/equipped-NECK.png index 9ec0e02042445ad137b4b3b0060eb0d393ad06ef..9ad2fba78d8b35fee3e56851877935d1cfdf5cdd 100644 GIT binary patch delta 725 zcmV;`0xJEn2Koh%F@Lm4L_t(|ob8&wiyA=`$G?UI;&DidglmGGECd#<T!bsaivNMd zRVflMaDRa5uZx%BiXa$>rGG%$BdG*QurM4PZ0yA1PEzFdmYstuUW#>ePqV+&)p)#5 zv*^yu`@VT^XO^7@Fbu;m48t(qPy<8_kgh4TX)S)}nnF@**nd6`f*Q!dOaZjY2D~O= z5#vz^3WBaF)G8Y=#a-P&_)Y*dK&Eh<7q`xTmMw5p*{6E7L?BSTTB4)MK3TSiY&<OP zAXv6Q;fAR2fyjNeY{$5`b=sLCoQ{WnMx{g2`C)&29bIEMx&}T0y<ekApZ+<Jc>$!7 zi#h6tDV*^EKz}{R0RYa>gWApkZJ;;S_dMh1O+K1VLgFnFUgLV+kf~<b0`<ZG0C3nz z<Hy;+vrk@4Q@t>lOoE@`u*g94&%@i7T6cGxNPPQlM4te+@zUos0QeerivWP#ousef zu;`jHN$)83Pu~od4}z{KbaeviRzPy#|DC*=rfvmvb$_ygT}!UI+v2<=uck@vN<nRX zcY$J4K`m>nPT3l%WepUYN?^OdHK5p35ak)%H10L%>uV!$4G4S@k{PfK&I41OE6Ln# zeEubJ9oV!EhG7_nVHk#C7=~dOhGFgjaUFqgg2<n`-OjJ#@N-#~)f0Fw;O64^Zsccw zubbISTz@1pJ?jHzalWz7A2#TkLNBw=@bpO%hwo2;M9f)1p!&NKe*Y1;G~3uqO>bSA zK;ed{^EeS&L+A+r#sv}?U@zqu`&Yq4?6`_DhM3o*9^}x8%eJm5)U7zRI^D|Vi>9QW zi{r)hL`qj_pq4dI{i&>^0Ag9(PRFiCp1E)HnNHy>k#+&VsTpXMx3gwoX=Db-GL-v} z1(7nqvIVq{X?%G#h)d7fiM(jIqrNRg6AZ&J48t%C!_4s)Dvo+ny8P9S00000NkvXX Hu0mjf26<#( delta 781 zcmV+o1M>X(1+fN@F@NhxL_t(|ob8&iYTHm0hJQ6(Y(!t6!CO!llObT^sbJ{fu@C}X zvjmLiJcJ1(LvV42LYH*t&^Iu2O5@_81VV)uS7=Bu9V~?J;Nf;qj&&t$<;s@r7|u6E z($)Eo&ONdq{{a|=VHk#CnC+ojwq(-rN|0?x*@m1aRxMkS)_<&0U$!Af7m!D_0|@{} zwF5c22(P8pf1xW50G<Gv`!-6&LPVrgEXd}*4NpYZXGJ`om;eKJh@;wp9JoV>N%Hz6 zo-Ba+@Bpy82ec~Av<RhQLAELmcK3qoSr=h+5sgFf&3q06cL+0|i=3Z#-#iivP%T@s z*8?8Bpz3O+&3}9jkdTxB5UzRffL?F;ce7fyWdAOR=ZWY;`eT8eUw`3`!;`e;!2|kt zdipPuE>du}A3a~cF2KwK_!J(u;LN>$QB-~Eun3popX%mNzB>Ae1?b*7MjeI7F8gDF z?yX}00B(Q|Yyd#wx&=}7n~yp`Pz*DlgJ=New?I?fq<_=jmbQLk0VoOGWOdf1h2owf zXlH*c!ft!)0Jl$F85E;)V{7NKlB8EnsTg#H`0)q1w{Mo}Hm%R#bEA9f82(rQm&?Cu zTUmf9jZG)OFbu;m48t%C!!QiPFbu<N7pecBUM*Yl`v)7ZLKh6i$z}`|)q(Z|@cyfn z$`t}q`hNm62QbTzU(1xnBQ%Vmo)eRBc42gWkJ0(PRxGUojLz?;b`(KYHCfVEhxS@V zRjOr6ULD#IyIi%+&3q2;K9{l^kRak-JPFfGK-@xKC2l{|jSoi9+<-3nufS#WP<?Q6 zXFJFC?0Yk$b8Mr2U6|^|2RCNrn#7a#_!Py92Y<pHk9hGX`oary0;3BD@wovSprE+{ zeAEl4UjU`5svn>BS2ruvxq-;c01)K5qZcPt2l!t^s_Bb$KpQ|E;g1D&Qgnb8^jWE# z$+dmz7Nv3~<?EmSj7&d+Q?|j6Zvc1KlV`tC48t%C!!QiPY?l8Ro2MCa0qV&B0000< LMFvhpu0mjfM7MI@ diff --git a/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/icon.png b/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/icon.png index ac1fd8367e95595a3b72e1f3b47a6a75fe6efb98..4ef92c200e0296714ce6a6b3d0e6172b43f4b103 100644 GIT binary patch delta 313 zcmV-90mlA`1K|RYF@GCLL_t(oh3%BTO2a@L$3GR9iuefG<UkNNL!nbj-oR&w-~;pl zIyyN8Qm~_s;VO!QAPBKr=#<Sg<OYYIL%ddpCMP6L_gM~de?DJ+cfWwc;cz%Ckpz(h z34A48p1Wr&2Pib$U8L*^5%@|>(9Qx#f)u)z>(BaIS!rg`SbySaC<qcyLzzWmDJxB( ze}`^k-$o8w`D*z+=4)2@8s_lwo^SRn-{ANJj)pdR7&J|qQkRt`9%TSrJ$O95W;^$t zpL!CHvQ3D=WwWDk61G(cZ#{rU`OgplhX+IMAJf+LjRd}uj~nDULd?PcifO&R<gHyW zStzd0(mvdP<uV(XEEHu`w}Z_a_zPA)B2$5`<yQ20{|<-4;Q;sofogzezSopS00000 LNkvXXu0mjf3Q&%P delta 353 zcmV-n0iOQh0*M2VF@HlzL_t(oh3%8EO2beThQFvwO7ICvw-Ohpf*pk}(ii9(h)_EB zA)FkFAijY<fVc=wVx@xwiX}@8SxP2D$Q?S|4l!vWHQqLpaK9zVx#yn$&$;J<Mx)XE zM>=g=mVIx7p_(Xf$V5T`=Z`J!9wtVw+mg3u6AsN>(F^sudw<)C1BfNe{eWJ#CFg#C zSeEBkGVpa(EEbC7Y1K^Tet=ao3-RCf?PQ?Swxv6TMVJWWMWR@+|Mp1~uY+mMA_RA; zHX8?Ji)nG+g?e*C!f5@PKL+0|?%&zK*zt@$4QbU(E}3QVdNVl!F#zk{EQkUO-)*8; zFm}8@hq2T^YFYwdNYc(I7F^>ci{BmaUFg3wvUzxVohjb}<-|NE$4OVj^9SbXk@DYe zLg^a*WbAlG6bl$pNqlDm8G}l@H5!dZqXA$AM|p+3W{n3h00000NkvXXu0mjfVGE*Q diff --git a/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/meta.json b/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/meta.json index a9b40d83e2..ea254a4b4f 100644 --- a/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/mantles/cemantle.rsi/meta.json @@ -1,18 +1,18 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "made by emisse for ss14", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "made by augustsun(Discord)/august-sun(GitHub) for SS14", + "size": { + "x": 32, + "y": 32 }, - { - "name": "equipped-NECK", - "directions": 4 - } - ] -} \ No newline at end of file + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} From f23851a30df80d1bca090f6ad4bcdd1a55d8e558 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 00:27:30 +0000 Subject: [PATCH 334/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 365d2a41f7..0ecf50231c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,18 +1,4 @@ Entries: -- author: ScarKy0 - changes: - - message: Syndicate uplinks now have 6 discounts instead of 3. - type: Tweak - id: 7744 - time: '2024-12-21T02:14:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33950 -- author: JustinWinningham - changes: - - message: Wood walls no longer require girders and are built from barricades instead. - type: Tweak - id: 7745 - time: '2024-12-21T03:28:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33902 - author: ElectroJr changes: - message: Toolshed console commands have been reworked. Some old commands may no @@ -3910,3 +3896,17 @@ id: 8244 time: '2025-04-19T00:24:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34181 +- author: ScarKy0 + changes: + - message: Added a couple more tools to the artifact borg module. + type: Tweak + id: 8245 + time: '2025-04-19T00:25:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33338 +- author: august-sun + changes: + - message: Resprited the Chief Engineer's mantle. + type: Tweak + id: 8246 + time: '2025-04-19T00:26:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36697 From cfda91e0f02b55cbbd47fa7d6d69c14b203f9db3 Mon Sep 17 00:00:00 2001 From: Preston Smith <92108534+thetolbean@users.noreply.github.com> Date: Fri, 18 Apr 2025 19:33:14 -0500 Subject: [PATCH 335/622] Correct mobster suffix (#33240) Correct mob grammar --- Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs b/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs index 0e9b0a34ef..5906bf3ed4 100644 --- a/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs +++ b/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs @@ -14,7 +14,7 @@ public sealed class MobsterAccentSystem : EntitySystem private static readonly Regex RegexUpperAr = new(@"(?<=\w)A[Rr](?=\w)"); private static readonly Regex RegexFirstWord = new(@"^(\S+)"); private static readonly Regex RegexLastWord = new(@"(\S+)$"); - + private static readonly Regex RegexLastPunctuation = new(@"([.!?]+$)(?!.*[.!?])|(?<![.!?])$"); [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ReplacementAccentSystem _replacement = default!; @@ -84,7 +84,7 @@ public sealed class MobsterAccentSystem : EntitySystem } if (lastWordAllCaps) suffix = suffix.ToUpper(); - msg += suffix; + msg = RegexLastPunctuation.Replace(msg, suffix); } return msg; From d69738a9f4526f2f321eb0c673661d0d1b6f5c77 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Fri, 18 Apr 2025 20:38:33 -0400 Subject: [PATCH 336/622] Fix two zombie bugs (#34472) * fix two zombie bugs * add comment --- Content.Server/Zombies/ZombieSystem.cs | 8 +++++++- Content.Shared/Zombies/PendingZombieComponent.cs | 2 +- Resources/Prototypes/Entities/Mobs/Species/vox.yml | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Content.Server/Zombies/ZombieSystem.cs b/Content.Server/Zombies/ZombieSystem.cs index e34ecb4ad5..054bd0f6ec 100644 --- a/Content.Server/Zombies/ZombieSystem.cs +++ b/Content.Server/Zombies/ZombieSystem.cs @@ -87,6 +87,13 @@ namespace Content.Server.Zombies private void OnPendingMapInit(EntityUid uid, IncurableZombieComponent component, MapInitEvent args) { _actions.AddAction(uid, ref component.Action, component.ZombifySelfActionPrototype); + + if (HasComp<ZombieComponent>(uid) || HasComp<ZombieImmuneComponent>(uid)) + return; + + EnsureComp<PendingZombieComponent>(uid, out PendingZombieComponent pendingComp); + + pendingComp.GracePeriod = _random.Next(pendingComp.MinInitialInfectedGrace, pendingComp.MaxInitialInfectedGrace); } private void OnPendingMapInit(EntityUid uid, PendingZombieComponent component, MapInitEvent args) @@ -98,7 +105,6 @@ namespace Content.Server.Zombies } component.NextTick = _timing.CurTime + TimeSpan.FromSeconds(1f); - component.GracePeriod = _random.Next(component.MinInitialInfectedGrace, component.MaxInitialInfectedGrace); } public override void Update(float frameTime) diff --git a/Content.Shared/Zombies/PendingZombieComponent.cs b/Content.Shared/Zombies/PendingZombieComponent.cs index 0fb61c84df..b199edeb00 100644 --- a/Content.Shared/Zombies/PendingZombieComponent.cs +++ b/Content.Shared/Zombies/PendingZombieComponent.cs @@ -17,7 +17,7 @@ public sealed partial class PendingZombieComponent : Component { DamageDict = new () { - { "Poison", 0.2 }, + { "Poison", 0.4 }, } }; diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index dc93dc8fdf..4703bfd06b 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -43,7 +43,7 @@ damage: types: Heat: -0.07 - Poison: -0.2 + Poison: -0.2 # needs to be less than the PendingZombieComponent does or they never become zombies by the disease. groups: Brute: -0.07 - type: DamageVisuals From 46b13897aba71438809e564e354cf0416fe801b6 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 00:39:40 +0000 Subject: [PATCH 337/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0ecf50231c..1748858c5d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ElectroJr - changes: - - message: Toolshed console commands have been reworked. Some old commands may no - longer work. - type: Tweak - id: 7746 - time: '2024-12-21T06:45:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33598 - author: muburu changes: - message: Space Ninjas now have silent footsteps. @@ -3910,3 +3902,13 @@ id: 8246 time: '2025-04-19T00:26:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36697 +- author: IProduceWidgets + changes: + - message: Vox are no longer immune to the zombie virus under certain circumstances + type: Fix + - message: The zombie virus no longer provides non-Initial Infected an undue grace + period before poisoning them. + type: Fix + id: 8247 + time: '2025-04-19T00:38:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34472 From 9317bbf6538130e61dd6a8318b755a3ce309d716 Mon Sep 17 00:00:00 2001 From: Booblesnoot42 <108703193+Booblesnoot42@users.noreply.github.com> Date: Fri, 18 Apr 2025 20:57:17 -0400 Subject: [PATCH 338/622] Fix Airlock Crushing Animation (#34523) fixed issue --- Content.Shared/Doors/Systems/SharedDoorSystem.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index 4d92cf9681..a0dba80bd9 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -768,10 +768,13 @@ public abstract partial class SharedDoorSystem : EntitySystem var door = ent.Comp; door.NextStateChange = null; - if (door.CurrentlyCrushing.Count > 0) + if (door.CurrentlyCrushing.Count > 0 && door.State != DoorState.Opening) + { // This is a closed door that is crushing people and needs to auto-open. Note that we don't check "can open" // here. The door never actually finished closing and we don't want people to get stuck inside of doors. StartOpening(ent, door); + return; + } switch (door.State) { From 00c4833c9a0ccebf9a2e256e86c320c9254d52c1 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 00:58:23 +0000 Subject: [PATCH 339/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1748858c5d..dee4b55f54 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: muburu - changes: - - message: Space Ninjas now have silent footsteps. - type: Tweak - id: 7747 - time: '2024-12-23T14:24:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33280 - author: amatwiedle changes: - message: Borgs can no longer drink from tools provided by modules. @@ -3912,3 +3905,10 @@ id: 8247 time: '2025-04-19T00:38:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34472 +- author: Booblesnoot42 + changes: + - message: Airlocks will now animate properly after crushing someone. + type: Fix + id: 8248 + time: '2025-04-19T00:57:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34523 From a44baec417b44a732ea6e9b98ba28fe2041dea48 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Sat, 19 Apr 2025 03:02:41 +0200 Subject: [PATCH 340/622] Fix forensics not being applied to held items (#30609) * Initial commit * Fix merge changes * sloth comment: bitmask * fix MIA parameter --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: EmoGarbage404 <retron404@gmail.com> --- .../Inventory/ServerInventorySystem.cs | 4 +- Content.Server/Strip/StrippableSystem.cs | 1 + .../Clothing/EntitySystems/ClothingSystem.cs | 6 +-- .../EntitySystems/ToggleableClothingSystem.cs | 4 +- .../EntitySystems/SharedHandsSystem.Pickup.cs | 2 + .../Inventory/InventorySystem.Equip.cs | 47 ++++++++++++++----- .../Strip/SharedStrippableSystem.cs | 10 +++- 7 files changed, 52 insertions(+), 22 deletions(-) diff --git a/Content.Server/Inventory/ServerInventorySystem.cs b/Content.Server/Inventory/ServerInventorySystem.cs index e3783753bb..64cfc447b4 100644 --- a/Content.Server/Inventory/ServerInventorySystem.cs +++ b/Content.Server/Inventory/ServerInventorySystem.cs @@ -31,8 +31,8 @@ namespace Content.Server.Inventory var enumerator = new InventorySlotEnumerator(source.Comp); while (enumerator.NextItem(out var item, out var slot)) { - if (TryUnequip(source, slot.Name, true, true, inventory: source.Comp)) - TryEquip(target, item, slot.Name , true, true, inventory: target.Comp); + if (TryUnequip(source, slot.Name, true, true, inventory: source.Comp, triggerHandContact: true)) + TryEquip(target, item, slot.Name , true, true, inventory: target.Comp, triggerHandContact: true); } } } diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index b74e40e1da..b3efa392b6 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Ensnaring.Components; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.IdentityManagement; +using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Inventory; using Content.Shared.Inventory.VirtualItem; diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index d752afc1ad..a7e52180cd 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -65,14 +65,14 @@ public abstract class ClothingSystem : EntitySystem if (!_invSystem.TryUnequip(userEnt, slotDef.Name, true, inventory: userEnt, checkDoafter: true)) continue; - if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true)) + if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true, triggerHandContact: true)) continue; _handsSystem.PickupOrDrop(userEnt, slotEntity.Value, handsComp: userEnt); } else { - if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true)) + if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true, triggerHandContact: true)) continue; } @@ -134,7 +134,7 @@ public abstract class ClothingSystem : EntitySystem { if (args.Handled || args.Cancelled || args.Target is not { } target) return; - args.Handled = _invSystem.TryUnequip(args.User, target, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false); + args.Handled = _invSystem.TryUnequip(args.User, target, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false, triggerHandContact: true); if (args.Handled) _handsSystem.TryPickup(args.User, ent); } diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs index c63dfb5901..4c8de4def1 100644 --- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs @@ -160,7 +160,7 @@ public sealed class ToggleableClothingSystem : EntitySystem // This should maybe double check that the entity currently in the slot is actually the attached clothing, but // if its not, then something else has gone wrong already... if (component.Container != null && component.Container.ContainedEntity == null && component.ClothingUid != null) - _inventorySystem.TryUnequip(args.Equipee, component.Slot, force: true); + _inventorySystem.TryUnequip(args.Equipee, component.Slot, force: true, triggerHandContact: true); } private void OnRemoveToggleable(EntityUid uid, ToggleableClothingComponent component, ComponentRemove args) @@ -248,7 +248,7 @@ public sealed class ToggleableClothingSystem : EntitySystem user, user); } else - _inventorySystem.TryEquip(user, parent, component.ClothingUid.Value, component.Slot); + _inventorySystem.TryEquip(user, parent, component.ClothingUid.Value, component.Slot, triggerHandContact: true); } private void OnGetActions(EntityUid uid, ToggleableClothingComponent component, GetItemActionsEvent args) diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs index 0fbf87f5af..5c95983631 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs @@ -242,6 +242,8 @@ public abstract partial class SharedHandsSystem : EntitySystem return; } + _interactionSystem.DoContactInteraction(uid, entity); //Possibly fires twice if manually picked up via interacting with the object + if (log) _adminLogger.Add(LogType.Pickup, LogImpact.Low, $"{ToPrettyString(uid):user} picked up {ToPrettyString(entity):entity}"); diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 8158b8c2f6..4988fd96be 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -97,7 +97,7 @@ public abstract partial class InventorySystem // unequip the item. if (itemUid != null) { - if (!TryUnequip(actor, ev.Slot, out var item, predicted: true, inventory: inventory, checkDoafter: true)) + if (!TryUnequip(actor, ev.Slot, out var item, predicted: true, inventory: inventory, checkDoafter: true, triggerHandContact: true)) return; _handsSystem.PickupOrDrop(actor, item.Value); @@ -120,15 +120,15 @@ public abstract partial class InventorySystem RaiseLocalEvent(held.Value, new HandDeselectedEvent(actor)); - TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true, checkDoafter: true); + TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true, checkDoafter: true, triggerHandContact: true); } public bool TryEquip(EntityUid uid, EntityUid itemUid, string slot, bool silent = false, bool force = false, bool predicted = false, - InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false) => - TryEquip(uid, uid, itemUid, slot, silent, force, predicted, inventory, clothing, checkDoafter); + InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false, bool triggerHandContact = false) => + TryEquip(uid, uid, itemUid, slot, silent, force, predicted, inventory, clothing, checkDoafter, triggerHandContact); public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, string slot, bool silent = false, bool force = false, bool predicted = false, - InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false) + InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false, bool triggerHandContact = false) { if (!Resolve(target, ref inventory, false)) { @@ -190,6 +190,10 @@ public abstract partial class InventorySystem _audio.PlayPredicted(clothing.EquipSound, target, actor); } + // If new gloves are equipped, trigger OnContactInteraction for held items + if (triggerHandContact && !((slotDefinition.SlotFlags & SlotFlags.GLOVES) == 0)) + TriggerHandContactInteraction(target); + Dirty(target, inventory); _movementSpeed.RefreshMovementSpeedModifiers(target); @@ -320,9 +324,10 @@ public abstract partial class InventorySystem InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool reparent = true, - bool checkDoafter = false) + bool checkDoafter = false, + bool triggerHandContact = false) { - return TryUnequip(uid, uid, slot, silent, force, predicted, inventory, clothing, reparent, checkDoafter); + return TryUnequip(uid, uid, slot, silent, force, predicted, inventory, clothing, reparent, checkDoafter, triggerHandContact); } public bool TryUnequip( @@ -335,9 +340,10 @@ public abstract partial class InventorySystem InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool reparent = true, - bool checkDoafter = false) + bool checkDoafter = false, + bool triggerHandContact = false) { - return TryUnequip(actor, target, slot, out _, silent, force, predicted, inventory, clothing, reparent, checkDoafter); + return TryUnequip(actor, target, slot, out _, silent, force, predicted, inventory, clothing, reparent, checkDoafter, triggerHandContact); } public bool TryUnequip( @@ -350,9 +356,10 @@ public abstract partial class InventorySystem InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool reparent = true, - bool checkDoafter = false) + bool checkDoafter = false, + bool triggerHandContact = false) { - return TryUnequip(uid, uid, slot, out removedItem, silent, force, predicted, inventory, clothing, reparent, checkDoafter); + return TryUnequip(uid, uid, slot, out removedItem, silent, force, predicted, inventory, clothing, reparent, checkDoafter, triggerHandContact); } public bool TryUnequip( @@ -366,7 +373,8 @@ public abstract partial class InventorySystem InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool reparent = true, - bool checkDoafter = false) + bool checkDoafter = false, + bool triggerHandContact = false) { var itemsDropped = 0; return TryUnequip(actor, target, slot, out removedItem, ref itemsDropped, @@ -385,7 +393,8 @@ public abstract partial class InventorySystem InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool reparent = true, - bool checkDoafter = false) + bool checkDoafter = false, + bool triggerHandContact = false) { removedItem = null; @@ -476,6 +485,10 @@ public abstract partial class InventorySystem _audio.PlayPredicted(clothing.UnequipSound, target, actor); } + // If gloves are unequipped, OnContactInteraction should trigger for held items + if (triggerHandContact && !((slotDefinition.SlotFlags & SlotFlags.GLOVES) == 0)) + TriggerHandContactInteraction(target); + Dirty(target, inventory); _movementSpeed.RefreshMovementSpeedModifiers(target); @@ -551,4 +564,12 @@ public abstract partial class InventorySystem entityUid = container.ContainedEntity; return entityUid != null; } + + public void TriggerHandContactInteraction(EntityUid uid) + { + foreach (var item in _handsSystem.EnumerateHeld(uid)) + { + _interactionSystem.DoContactInteraction(uid, item); + } + } } diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index 3645b5a0b9..d851f46060 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -23,6 +23,8 @@ namespace Content.Shared.Strip; public abstract class SharedStrippableSystem : EntitySystem { + [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; @@ -244,7 +246,7 @@ public abstract class SharedStrippableSystem : EntitySystem if (!_handsSystem.TryDrop(user, handsComp: user.Comp)) return; - _inventorySystem.TryEquip(user, target, held, slot); + _inventorySystem.TryEquip(user, target, held, slot, triggerHandContact: true); _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); } @@ -306,6 +308,8 @@ public abstract class SharedStrippableSystem : EntitySystem var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + _interactionSystem.DoContactInteraction(user, item); + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, true, slot), user, target, item) { Hidden = stealth, @@ -333,7 +337,7 @@ public abstract class SharedStrippableSystem : EntitySystem if (!CanStripRemoveInventory(user, target, item, slot)) return; - if (!_inventorySystem.TryUnequip(user, target, slot)) + if (!_inventorySystem.TryUnequip(user, target, slot, triggerHandContact: true)) return; RaiseLocalEvent(item, new DroppedEvent(user), true); // Gas tank internals etc. @@ -511,6 +515,8 @@ public abstract class SharedStrippableSystem : EntitySystem var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); + _interactionSystem.DoContactInteraction(user, item); + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, false, handName), user, target, item) { Hidden = stealth, From b034a1053fd763c71539c324f59379811befe062 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 01:03:47 +0000 Subject: [PATCH 341/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index dee4b55f54..9a32da868f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: amatwiedle - changes: - - message: Borgs can no longer drink from tools provided by modules. - type: Fix - id: 7748 - time: '2024-12-23T19:54:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32964 - author: Booblesnoot42 changes: - message: On Cog, an unnecessary protolathe was removed from cargo. @@ -3912,3 +3905,14 @@ id: 8248 time: '2025-04-19T00:57:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34523 +- author: SlamBamActionman + changes: + - message: Fingerprints and fibers are now always applied to items being held, regardless + of how they got into your hands. + type: Fix + - message: Changing gloves now correctly applies new fibers/fingerprints on held + items. + type: Fix + id: 8249 + time: '2025-04-19T01:02:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30609 From 369eef146f8cff3d6cc4b829cc67a4772d1c5b23 Mon Sep 17 00:00:00 2001 From: Coolsurf6 <coolsurf24@yahoo.com.au> Date: Sat, 19 Apr 2025 11:23:58 +1000 Subject: [PATCH 342/622] Fixed Attachbodypart Console Command (#34577) * remade command for attachbodypart * fixed up WriteError --- .../Body/Commands/AttachBodyPartCommand.cs | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Content.Server/Body/Commands/AttachBodyPartCommand.cs b/Content.Server/Body/Commands/AttachBodyPartCommand.cs index 82f7161937..9172e9e87e 100644 --- a/Content.Server/Body/Commands/AttachBodyPartCommand.cs +++ b/Content.Server/Body/Commands/AttachBodyPartCommand.cs @@ -100,21 +100,23 @@ namespace Content.Server.Body.Commands var slotId = $"AttachBodyPartVerb-{partUid}"; - // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract - if (body.RootContainer.ContainedEntity != null) + if (body.RootContainer.ContainedEntity is null && !bodySystem.AttachPartToRoot(bodyId, partUid.Value, body, part)) { - bodySystem.AttachPartToRoot(bodyId, partUid.Value, body, part); - } - else - { - var (rootPartId, rootPart) = bodySystem.GetRootPartOrNull(bodyId, body)!.Value; - if (!bodySystem.TryCreatePartSlotAndAttach(rootPartId, slotId, partUid.Value, part.PartType, rootPart, part)) - { - shell.WriteError($"Could not create slot {slotId} on entity {_entManager.ToPrettyString(bodyId)}"); - return; - } + shell.WriteError("Body container does not have a root entity to attach to the body part!"); + return; } + var (rootPartId, rootPart) = bodySystem.GetRootPartOrNull(bodyId, body)!.Value; + if (!bodySystem.TryCreatePartSlotAndAttach(rootPartId, + slotId, + partUid.Value, + part.PartType, + rootPart, + part)) + { + shell.WriteError($"Could not create slot {slotId} on entity {_entManager.ToPrettyString(bodyId)}"); + return; + } shell.WriteLine($"Attached part {_entManager.ToPrettyString(partUid.Value)} to {_entManager.ToPrettyString(bodyId)}"); } } From 1dbc40f051deaea7efa7958dcbfa3be13e3a83be Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 01:25:04 +0000 Subject: [PATCH 343/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9a32da868f..018f7971e6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Booblesnoot42 - changes: - - message: On Cog, an unnecessary protolathe was removed from cargo. - type: Remove - id: 7749 - time: '2024-12-23T23:24:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34026 - author: Booblesnoot42 changes: - message: On Amber, an unnecessary protolathe was removed from cargo. @@ -3916,3 +3909,10 @@ id: 8249 time: '2025-04-19T01:02:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30609 +- author: Coolsurf6 + changes: + - message: Attachbodypart command now functions as intended. + type: Fix + id: 8250 + time: '2025-04-19T01:23:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34577 From 8ab0e59db663c2b82bd7994a48b99ff5634a63e2 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 11:38:22 +1000 Subject: [PATCH 344/622] Refactor disarms (#36546) * Refactor disarms - Move client stuff to shared - Cleanup a bunch of stuff - Ref events - Fix the swing sound mispredict (I noticed it on target dummies). * Revert this change * minor review * Rebiew --------- Co-authored-by: Milon <milonpl.git@proton.me> --- .../Weapons/Melee/MeleeWeaponSystem.cs | 43 +---- .../CombatMode/Disarm/DisarmMalusComponent.cs | 16 -- Content.Server/Hands/Systems/HandsSystem.cs | 2 +- .../Weapons/Melee/MeleeWeaponSystem.cs | 134 -------------- .../Actions/Events/DisarmAttemptEvent.cs | 10 +- .../CombatMode/DisarmMalusComponent.cs | 17 ++ Content.Shared/CombatMode/DisarmedEvent.cs | 52 +++--- Content.Shared/Cuffs/SharedCuffableSystem.cs | 4 +- .../Damage/Systems/StaminaSystem.cs | 2 +- .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 168 ++++++++++++++++-- 10 files changed, 214 insertions(+), 234 deletions(-) delete mode 100644 Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs create mode 100644 Content.Shared/CombatMode/DisarmMalusComponent.cs diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index c4fef410c4..826436b88d 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -107,28 +107,28 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem { coordinates = TransformSystem.ToCoordinates(_map.GetMap(mousePos.MapId), mousePos); } - + // If the gun has AltFireComponent, it can be used to attack. if (TryComp<GunComponent>(weaponUid, out var gun) && gun.UseKey) { if (!TryComp<AltFireMeleeComponent>(weaponUid, out var altFireComponent) || altDown != BoundKeyState.Down) return; - + switch(altFireComponent.AttackType) { case AltFireAttackType.Light: ClientLightAttack(entity, mousePos, coordinates, weaponUid, weapon); break; - + case AltFireAttackType.Heavy: ClientHeavyAttack(entity, coordinates, weaponUid, weapon); break; - + case AltFireAttackType.Disarm: ClientDisarm(entity, mousePos, coordinates); break; } - + return; } @@ -166,35 +166,6 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem _color.RaiseEffect(Color.Red, targets, Filter.Local()); } - protected override bool DoDisarm(EntityUid user, DisarmAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) - { - if (!base.DoDisarm(user, ev, meleeUid, component, session)) - return false; - - if (!TryComp<CombatModeComponent>(user, out var combatMode) || - combatMode.CanDisarm != true) - { - return false; - } - - var target = GetEntity(ev.Target); - - // They need to either have hands... - if (!HasComp<HandsComponent>(target!.Value)) - { - // or just be able to be shoved over. - if (TryComp<StatusEffectsComponent>(target, out var status) && status.AllowedEffects.Contains("KnockedDown")) - return true; - - if (Timing.IsFirstTimePredicted && HasComp<MobStateComponent>(target.Value)) - PopupSystem.PopupEntity(Loc.GetString("disarm-action-disarmable", ("targetName", target.Value)), target.Value); - - return false; - } - - return true; - } - /// <summary> /// Raises a heavy attack event with the relevant attacked entities. /// This is to avoid lag effecting the client's perspective too much. @@ -222,7 +193,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem var entities = GetNetEntityList(ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user).ToList()); RaisePredictiveEvent(new HeavyAttackEvent(GetNetEntity(meleeUid), entities.GetRange(0, Math.Min(MaxTargets, entities.Count)), GetNetCoordinates(coordinates))); } - + private void ClientDisarm(EntityUid attacker, MapCoordinates mousePos, EntityCoordinates coordinates) { EntityUid? target = null; @@ -232,7 +203,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem RaisePredictiveEvent(new DisarmAttackEvent(GetNetEntity(target), GetNetCoordinates(coordinates))); } - + private void ClientLightAttack(EntityUid attacker, MapCoordinates mousePos, EntityCoordinates coordinates, EntityUid weaponUid, MeleeWeaponComponent meleeComponent) { var attackerPos = TransformSystem.GetMapCoordinates(attacker); diff --git a/Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs b/Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs deleted file mode 100644 index 49f677f286..0000000000 --- a/Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Content.Server.CombatMode.Disarm -{ - /// <summary> - /// Applies a malus to disarm attempts against this item. - /// </summary> - [RegisterComponent] - public sealed partial class DisarmMalusComponent : Component - { - /// <summary> - /// So, disarm chances are a % chance represented as a value between 0 and 1. - /// This default would be a 30% penalty to that. - /// </summary> - [DataField("malus")] - public float Malus = 0.3f; - } -} diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index 1e8e012c52..e45ee550e1 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -98,7 +98,7 @@ namespace Content.Server.Hands.Systems } } - private void OnDisarmed(EntityUid uid, HandsComponent component, DisarmedEvent args) + private void OnDisarmed(EntityUid uid, HandsComponent component, ref DisarmedEvent args) { if (args.Handled) return; diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index ff975c4714..1e8f3334ac 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -1,26 +1,13 @@ using Content.Server.Chat.Systems; -using Content.Server.CombatMode.Disarm; using Content.Server.Movement.Systems; -using Content.Shared.Actions.Events; -using Content.Shared.Administration.Components; -using Content.Shared.CombatMode; using Content.Shared.Damage.Events; using Content.Shared.Damage.Systems; -using Content.Shared.Database; using Content.Shared.Effects; -using Content.Shared.Hands.Components; -using Content.Shared.IdentityManagement; -using Content.Shared.Mobs.Systems; -using Content.Shared.Popups; using Content.Shared.Speech.Components; -using Content.Shared.StatusEffect; using Content.Shared.Weapons.Melee; using Content.Shared.Weapons.Melee.Events; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Player; -using Robust.Shared.Random; using System.Linq; using System.Numerics; @@ -28,12 +15,9 @@ namespace Content.Server.Weapons.Melee; public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem { - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly DamageExamineSystem _damageExamine = default!; [Dependency] private readonly LagCompensationSystem _lag = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedColorFlashEffectSystem _color = default!; public override void Initialize() @@ -85,106 +69,6 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem return true; } - protected override bool DoDisarm(EntityUid user, DisarmAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) - { - if (!base.DoDisarm(user, ev, meleeUid, component, session)) - return false; - - if (!TryComp<CombatModeComponent>(user, out var combatMode) || - combatMode.CanDisarm != true) - { - return false; - } - - var target = GetEntity(ev.Target!.Value); - - if (_mobState.IsIncapacitated(target)) - { - return false; - } - - if (!TryComp<HandsComponent>(target, out var targetHandsComponent)) - { - if (!TryComp<StatusEffectsComponent>(target, out var status) || !status.AllowedEffects.Contains("KnockedDown")) - return false; - } - - if (!InRange(user, target, component.Range, session)) - { - return false; - } - - EntityUid? inTargetHand = null; - - if (targetHandsComponent?.ActiveHand is { IsEmpty: false }) - { - inTargetHand = targetHandsComponent.ActiveHand.HeldEntity!.Value; - } - - Interaction.DoContactInteraction(user, target); - - var attemptEvent = new DisarmAttemptEvent(target, user, inTargetHand); - - if (inTargetHand != null) - { - RaiseLocalEvent(inTargetHand.Value, attemptEvent); - } - - RaiseLocalEvent(target, attemptEvent); - - if (attemptEvent.Cancelled) - return false; - - var chance = CalculateDisarmChance(user, target, inTargetHand, combatMode); - - if (_random.Prob(chance)) - { - // Yknow something tells me this comment is hilariously out of date... - // Don't play a sound as the swing is already predicted. - // Also don't play popups because most disarms will miss. - return false; - } - - AdminLogger.Add(LogType.DisarmedAction, $"{ToPrettyString(user):user} used disarm on {ToPrettyString(target):target}"); - - var eventArgs = new DisarmedEvent { Target = target, Source = user, PushProbability = 1 - chance }; - RaiseLocalEvent(target, eventArgs); - - if (!eventArgs.Handled) - { - return false; - } - - _audio.PlayPvs(combatMode.DisarmSuccessSound, user, AudioParams.Default.WithVariation(0.025f).WithVolume(5f)); - AdminLogger.Add(LogType.DisarmedAction, $"{ToPrettyString(user):user} used disarm on {ToPrettyString(target):target}"); - - var targetEnt = Identity.Entity(target, EntityManager); - var userEnt = Identity.Entity(user, EntityManager); - - var msgOther = Loc.GetString( - eventArgs.PopupPrefix + "popup-message-other-clients", - ("performerName", userEnt), - ("targetName", targetEnt)); - - var msgUser = Loc.GetString(eventArgs.PopupPrefix + "popup-message-cursor", ("targetName", targetEnt)); - - var filterOther = Filter.PvsExcept(user, entityManager: EntityManager); - - PopupSystem.PopupEntity(msgOther, user, filterOther, true); - PopupSystem.PopupEntity(msgUser, target, user); - - if (eventArgs.IsStunned) - { - - PopupSystem.PopupEntity(Loc.GetString("stunned-component-disarm-success-others", ("source", userEnt), ("target", targetEnt)), targetEnt, Filter.PvsExcept(user), true, PopupType.LargeCaution); - PopupSystem.PopupCursor(Loc.GetString("stunned-component-disarm-success", ("target", targetEnt)), user, PopupType.Large); - - AdminLogger.Add(LogType.DisarmedKnockdown, LogImpact.Medium, $"{ToPrettyString(user):user} knocked down {ToPrettyString(target):target}"); - } - - return true; - } - protected override bool InRange(EntityUid user, EntityUid target, float range, ICommonSession? session) { EntityCoordinates targetCoordinates; @@ -205,24 +89,6 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem _color.RaiseEffect(Color.Red, targets, filter); } - private float CalculateDisarmChance(EntityUid disarmer, EntityUid disarmed, EntityUid? inTargetHand, CombatModeComponent disarmerComp) - { - if (HasComp<DisarmProneComponent>(disarmer)) - return 1.0f; - - if (HasComp<DisarmProneComponent>(disarmed)) - return 0.0f; - - var chance = disarmerComp.BaseDisarmFailChance; - - if (inTargetHand != null && TryComp<DisarmMalusComponent>(inTargetHand, out var malus)) - { - chance += malus.Malus; - } - - return Math.Clamp(chance, 0f, 1f); - } - public override void DoLunge(EntityUid user, EntityUid weapon, Angle angle, Vector2 localPos, string? animation, bool predicted = true) { Filter filter; diff --git a/Content.Shared/Actions/Events/DisarmAttemptEvent.cs b/Content.Shared/Actions/Events/DisarmAttemptEvent.cs index 8252205846..002aaf33df 100644 --- a/Content.Shared/Actions/Events/DisarmAttemptEvent.cs +++ b/Content.Shared/Actions/Events/DisarmAttemptEvent.cs @@ -1,15 +1,21 @@ namespace Content.Shared.Actions.Events; -public sealed class DisarmAttemptEvent : CancellableEntityEventArgs +/// <summary> +/// Raised directed on the target OR their actively held entity. +/// </summary> +[ByRefEvent] +public record struct DisarmAttemptEvent { public readonly EntityUid TargetUid; public readonly EntityUid DisarmerUid; public readonly EntityUid? TargetItemInHandUid; + public bool Cancelled; + public DisarmAttemptEvent(EntityUid targetUid, EntityUid disarmerUid, EntityUid? targetItemInHandUid = null) { TargetUid = targetUid; DisarmerUid = disarmerUid; TargetItemInHandUid = targetItemInHandUid; } -} \ No newline at end of file +} diff --git a/Content.Shared/CombatMode/DisarmMalusComponent.cs b/Content.Shared/CombatMode/DisarmMalusComponent.cs new file mode 100644 index 0000000000..2a89eb1cf2 --- /dev/null +++ b/Content.Shared/CombatMode/DisarmMalusComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.CombatMode; + +/// <summary> +/// Applies a malus to disarm attempts against this item. +/// </summary> +[RegisterComponent, NetworkedComponent] +public sealed partial class DisarmMalusComponent : Component +{ + /// <summary> + /// So, disarm chances are a % chance represented as a value between 0 and 1. + /// This default would be a 30% penalty to that. + /// </summary> + [DataField] + public float Malus = 0.3f; +} diff --git a/Content.Shared/CombatMode/DisarmedEvent.cs b/Content.Shared/CombatMode/DisarmedEvent.cs index 884ae36628..3f8e5c81d1 100644 --- a/Content.Shared/CombatMode/DisarmedEvent.cs +++ b/Content.Shared/CombatMode/DisarmedEvent.cs @@ -1,31 +1,33 @@ -namespace Content.Shared.CombatMode +namespace Content.Shared.CombatMode; + +[ByRefEvent] +public record struct DisarmedEvent(EntityUid Target, EntityUid Source, float PushProb) { - public sealed class DisarmedEvent : HandledEntityEventArgs - { - /// <summary> - /// The entity being disarmed. - /// </summary> - public EntityUid Target { get; init; } + /// <summary> + /// The entity being disarmed. + /// </summary> + public readonly EntityUid Target = Target; - /// <summary> - /// The entity performing the disarm. - /// </summary> - public EntityUid Source { get; init; } + /// <summary> + /// The entity performing the disarm. + /// </summary> + public readonly EntityUid Source = Source; - /// <summary> - /// Probability for push/knockdown. - /// </summary> - public float PushProbability { get; init; } + /// <summary> + /// Probability for push/knockdown. + /// </summary> + public readonly float PushProbability = PushProb; - /// <summary> - /// Prefix for the popup message that will be displayed on a successful push. - /// Should be set before returning. - /// </summary> - public string PopupPrefix { get; set; } = ""; + /// <summary> + /// Prefix for the popup message that will be displayed on a successful push. + /// Should be set before returning. + /// </summary> + public string PopupPrefix = ""; - /// <summary> - /// Whether the entity was successfully stunned from a shove. - /// </summary> - public bool IsStunned { get; set; } - } + /// <summary> + /// Whether the entity was successfully stunned from a shove. + /// </summary> + public bool IsStunned; + + public bool Handled; } diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index bdb3a50454..99a4dad510 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -723,8 +723,8 @@ namespace Content.Shared.Cuffs // if combat mode is on, shove the person. if (_combatMode.IsInCombatMode(user) && target != user && user != null) { - var eventArgs = new DisarmedEvent { Target = target, Source = user.Value, PushProbability = 1}; - RaiseLocalEvent(target, eventArgs); + var eventArgs = new DisarmedEvent(target, user.Value, 1f); + RaiseLocalEvent(target, ref eventArgs); shoved = true; } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index bd84b711e3..96454d20dd 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -119,7 +119,7 @@ public sealed partial class StaminaSystem : EntitySystem Dirty(uid, component); } - private void OnDisarmed(EntityUid uid, StaminaComponent component, DisarmedEvent args) + private void OnDisarmed(EntityUid uid, StaminaComponent component, ref DisarmedEvent args) { if (args.Handled) return; diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 947c969a3e..59d1510d5f 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -2,6 +2,8 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Numerics; using Content.Shared.ActionBlocker; +using Content.Shared.Actions.Events; +using Content.Shared.Administration.Components; using Content.Shared.Administration.Logs; using Content.Shared.CombatMode; using Content.Shared.Damage; @@ -10,22 +12,30 @@ using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Hands; using Content.Shared.Hands.Components; +using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Inventory.VirtualItem; using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Physics; using Content.Shared.Popups; +using Content.Shared.StatusEffect; using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; using Robust.Shared.Map; +using Robust.Shared.Network; using Robust.Shared.Physics; using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Robust.Shared.Random; using Robust.Shared.Timing; using ItemToggleMeleeWeaponComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleMeleeWeaponComponent; @@ -33,20 +43,24 @@ namespace Content.Shared.Weapons.Melee; public abstract class SharedMeleeWeaponSystem : EntitySystem { - [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; - [Dependency] protected readonly ActionBlockerSystem Blocker = default!; - [Dependency] protected readonly SharedCombatModeSystem CombatMode = default!; - [Dependency] protected readonly DamageableSystem Damageable = default!; - [Dependency] protected readonly SharedInteractionSystem Interaction = default!; - [Dependency] protected readonly IMapManager MapManager = default!; - [Dependency] protected readonly SharedPopupSystem PopupSystem = default!; - [Dependency] protected readonly IGameTiming Timing = default!; - [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; - [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly MeleeSoundSystem _meleeSound = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IPrototypeManager _protoManager = default!; - [Dependency] private readonly StaminaSystem _stamina = default!; + [Dependency] protected readonly IGameTiming Timing = default!; + [Dependency] protected readonly IMapManager MapManager = default!; + [Dependency] private readonly INetManager _netMan = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; + [Dependency] protected readonly ActionBlockerSystem Blocker = default!; + [Dependency] protected readonly DamageableSystem Damageable = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly MeleeSoundSystem _meleeSound = default!; + [Dependency] protected readonly MobStateSystem MobState = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] protected readonly SharedCombatModeSystem CombatMode = default!; + [Dependency] protected readonly SharedInteractionSystem Interaction = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] protected readonly SharedPopupSystem PopupSystem = default!; + [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; + [Dependency] private readonly StaminaSystem _stamina = default!; private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque); @@ -783,7 +797,25 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem return highestDamageType; } - protected virtual bool DoDisarm(EntityUid user, DisarmAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) + private float CalculateDisarmChance(EntityUid disarmer, EntityUid disarmed, EntityUid? inTargetHand, CombatModeComponent disarmerComp) + { + if (HasComp<DisarmProneComponent>(disarmer)) + return 1.0f; + + if (HasComp<DisarmProneComponent>(disarmed)) + return 0.0f; + + var chance = disarmerComp.BaseDisarmFailChance; + + if (inTargetHand != null && TryComp<DisarmMalusComponent>(inTargetHand, out var malus)) + { + chance += malus.Malus; + } + + return Math.Clamp(chance, 0f, 1f); + } + + private bool DoDisarm(EntityUid user, DisarmAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) { var target = GetEntity(ev.Target); @@ -793,8 +825,110 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem return false; } - // Play a sound to give instant feedback; same with playing the animations - _meleeSound.PlaySwingSound(user, meleeUid, component); + + if (MobState.IsIncapacitated(target.Value)) + { + return false; + } + + if (!TryComp<CombatModeComponent>(user, out var combatMode) || + combatMode.CanDisarm != true) + { + return false; + } + + // Need hands or to be able to be shoved over. + if (!TryComp<HandsComponent>(target, out var targetHandsComponent)) + { + if (!TryComp<StatusEffectsComponent>(target, out var status) || + !status.AllowedEffects.Contains("KnockedDown")) + { + // Notify disarmable + if (HasComp<MobStateComponent>(target.Value)) + PopupSystem.PopupClient(Loc.GetString("disarm-action-disarmable", ("targetName", target.Value)), target.Value); + + return false; + } + } + + if (!InRange(user, target.Value, component.Range, session)) + { + return false; + } + + EntityUid? inTargetHand = null; + + if (targetHandsComponent?.ActiveHand is { IsEmpty: false }) + { + inTargetHand = targetHandsComponent.ActiveHand.HeldEntity!.Value; + } + + var attemptEvent = new DisarmAttemptEvent(target.Value, user, inTargetHand); + + if (inTargetHand != null) + { + RaiseLocalEvent(inTargetHand.Value, ref attemptEvent); + } + + RaiseLocalEvent(target.Value, ref attemptEvent); + + if (attemptEvent.Cancelled) + return false; + + var chance = CalculateDisarmChance(user, target.Value, inTargetHand, combatMode); + + // At this point we diverge + if (_netMan.IsClient) + { + // Play a sound to give instant feedback; same with playing the animations + _meleeSound.PlaySwingSound(user, meleeUid, component); + return true; + } + + if (_random.Prob(chance)) + { + return false; + } + + var eventArgs = new DisarmedEvent(target.Value, user, 1 - chance); + RaiseLocalEvent(target.Value, ref eventArgs); + + // Nothing handled it so abort. + if (!eventArgs.Handled) + { + return false; + } + + Interaction.DoContactInteraction(user, target); + AdminLogger.Add(LogType.DisarmedAction, $"{ToPrettyString(user):user} used disarm on {ToPrettyString(target):target}"); + + AdminLogger.Add(LogType.DisarmedAction, $"{ToPrettyString(user):user} used disarm on {ToPrettyString(target):target}"); + + _audio.PlayPvs(combatMode.DisarmSuccessSound, target.Value, AudioParams.Default.WithVariation(0.025f).WithVolume(5f)); + var targetEnt = Identity.Entity(target.Value, EntityManager); + var userEnt = Identity.Entity(user, EntityManager); + + var msgOther = Loc.GetString( + eventArgs.PopupPrefix + "popup-message-other-clients", + ("performerName", userEnt), + ("targetName", targetEnt)); + + var msgUser = Loc.GetString(eventArgs.PopupPrefix + "popup-message-cursor", ("targetName", targetEnt)); + + var filterOther = Filter.PvsExcept(user, entityManager: EntityManager); + + PopupSystem.PopupEntity(msgOther, user, filterOther, true); + PopupSystem.PopupEntity(msgUser, target.Value, user); + + if (eventArgs.IsStunned) + { + + PopupSystem.PopupEntity(Loc.GetString("stunned-component-disarm-success-others", ("source", userEnt), ("target", targetEnt)), targetEnt, Filter.PvsExcept(user), true, PopupType.LargeCaution); + PopupSystem.PopupCursor(Loc.GetString("stunned-component-disarm-success", ("target", targetEnt)), user, PopupType.Large); + + AdminLogger.Add(LogType.DisarmedKnockdown, LogImpact.Medium, $"{ToPrettyString(user):user} knocked down {ToPrettyString(target):target}"); + } + return true; } From 84fe396480f76e1cf70a0d6310df0ed7e8d74c4d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 01:39:28 +0000 Subject: [PATCH 345/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 018f7971e6..be18e3aea3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Booblesnoot42 - changes: - - message: On Amber, an unnecessary protolathe was removed from cargo. - type: Remove - id: 7750 - time: '2024-12-23T23:24:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34027 - author: TheShuEd changes: - message: You can now select candles in trinkets loadout @@ -3916,3 +3909,10 @@ id: 8250 time: '2025-04-19T01:23:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34577 +- author: metalgearsloth + changes: + - message: Fix disarm swing sound even if a disarm isn't possible on the target. + type: Fix + id: 8251 + time: '2025-04-19T01:38:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36546 From 72372dc77dc4475d4667a803eb3f4162e8a25425 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 11:48:41 +1000 Subject: [PATCH 346/622] Predict gas volume pumps (#33835) * Predict gas volume pumps * Also this one * Review --- .../Binary/Systems/GasVolumePumpSystem.cs | 29 +++++ .../UI/GasVolumePumpBoundUserInterface.cs | 38 +++--- .../Atmos/UI/GasVolumePumpWindow.xaml | 5 +- .../Atmos/UI/GasVolumePumpWindow.xaml.cs | 3 +- .../Components/GasVolumePumpComponent.cs | 52 -------- .../EntitySystems/GasVolumePumpSystem.cs | 111 +----------------- .../Components/GasVolumePumpComponent.cs | 45 +++++++ .../SharedGasVolumePumpComponent.cs | 17 +-- .../Systems/SharedGasVolumePumpSystem.cs | 91 ++++++++++++++ .../Structures/Piping/Atmospherics/binary.yml | 3 + 10 files changed, 199 insertions(+), 195 deletions(-) create mode 100644 Content.Client/Atmos/Piping/Binary/Systems/GasVolumePumpSystem.cs delete mode 100644 Content.Server/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs create mode 100644 Content.Shared/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs create mode 100644 Content.Shared/Atmos/Piping/Binary/Systems/SharedGasVolumePumpSystem.cs diff --git a/Content.Client/Atmos/Piping/Binary/Systems/GasVolumePumpSystem.cs b/Content.Client/Atmos/Piping/Binary/Systems/GasVolumePumpSystem.cs new file mode 100644 index 0000000000..f615d9a892 --- /dev/null +++ b/Content.Client/Atmos/Piping/Binary/Systems/GasVolumePumpSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.Atmos.Piping.Binary.Systems; +using Robust.Client.GameObjects; + +namespace Content.Client.Atmos.Piping.Binary.Systems; + +public sealed class GasVolumePumpSystem : SharedGasVolumePumpSystem +{ + [Dependency] private readonly UserInterfaceSystem _ui = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent<GasVolumePumpComponent, AfterAutoHandleStateEvent>(OnPumpState); + } + + protected override void UpdateUi(Entity<GasVolumePumpComponent> entity) + { + if (_ui.TryGetOpenUi(entity.Owner, GasVolumePumpUiKey.Key, out var bui)) + { + bui.Update(); + } + } + + private void OnPumpState(Entity<GasVolumePumpComponent> ent, ref AfterAutoHandleStateEvent args) + { + UpdateUi(ent); + } +} diff --git a/Content.Client/Atmos/UI/GasVolumePumpBoundUserInterface.cs b/Content.Client/Atmos/UI/GasVolumePumpBoundUserInterface.cs index 642f34c2f9..55682f75ef 100644 --- a/Content.Client/Atmos/UI/GasVolumePumpBoundUserInterface.cs +++ b/Content.Client/Atmos/UI/GasVolumePumpBoundUserInterface.cs @@ -1,8 +1,7 @@ -using Content.Shared.Atmos; -using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.IdentityManagement; using Content.Shared.Localizations; using JetBrains.Annotations; -using Robust.Client.GameObjects; using Robust.Client.UserInterface; namespace Content.Client.Atmos.UI @@ -14,7 +13,7 @@ namespace Content.Client.Atmos.UI public sealed class GasVolumePumpBoundUserInterface : BoundUserInterface { [ViewVariables] - private const float MaxTransferRate = Atmospherics.MaxTransferRate; + private float _maxTransferRate; [ViewVariables] private GasVolumePumpWindow? _window; @@ -29,38 +28,41 @@ namespace Content.Client.Atmos.UI _window = this.CreateWindow<GasVolumePumpWindow>(); + if (EntMan.TryGetComponent(Owner, out GasVolumePumpComponent? pump)) + { + _maxTransferRate = pump.MaxTransferRate; + } + _window.ToggleStatusButtonPressed += OnToggleStatusButtonPressed; _window.PumpTransferRateChanged += OnPumpTransferRatePressed; + Update(); } private void OnToggleStatusButtonPressed() { if (_window is null) return; - SendMessage(new GasVolumePumpToggleStatusMessage(_window.PumpStatus)); + + SendPredictedMessage(new GasVolumePumpToggleStatusMessage(_window.PumpStatus)); } private void OnPumpTransferRatePressed(string value) { var rate = UserInputParser.TryFloat(value, out var parsed) ? parsed : 0f; - if (rate > MaxTransferRate) - rate = MaxTransferRate; + rate = Math.Clamp(rate, 0f, _maxTransferRate); - SendMessage(new GasVolumePumpChangeTransferRateMessage(rate)); + SendPredictedMessage(new GasVolumePumpChangeTransferRateMessage(rate)); } - /// <summary> - /// Update the UI state based on server-sent info - /// </summary> - /// <param name="state"></param> - protected override void UpdateState(BoundUserInterfaceState state) + public override void Update() { - base.UpdateState(state); - if (_window == null || state is not GasVolumePumpBoundUserInterfaceState cast) + base.Update(); + + if (_window is null || !EntMan.TryGetComponent(Owner, out GasVolumePumpComponent? pump)) return; - _window.Title = cast.PumpLabel; - _window.SetPumpStatus(cast.Enabled); - _window.SetTransferRate(cast.TransferRate); + _window.Title = Identity.Name(Owner, EntMan); + _window.SetPumpStatus(pump.Enabled); + _window.SetTransferRate(pump.TransferRate); } } } diff --git a/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml b/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml index 7275b34b3a..fd547ef01e 100644 --- a/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml +++ b/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml @@ -1,5 +1,6 @@ -<DefaultWindow xmlns="https://spacestation14.io" +<controls:FancyWindow xmlns="https://spacestation14.io" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" MinSize="200 120" Title="Volume Pump"> <BoxContainer Orientation="Vertical" Margin="5 5 5 5" SeparationOverride="10"> <BoxContainer Orientation="Horizontal" HorizontalExpand="True"> @@ -19,4 +20,4 @@ <Button Name="SetTransferRateButton" Text="{Loc comp-gas-pump-ui-pump-set-rate}" HorizontalAlignment="Right" Disabled="True"/> </BoxContainer> </BoxContainer> -</DefaultWindow> +</controls:FancyWindow> diff --git a/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml.cs b/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml.cs index 83a530c5c5..13598fb975 100644 --- a/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml.cs +++ b/Content.Client/Atmos/UI/GasVolumePumpWindow.xaml.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Content.Client.Atmos.EntitySystems; +using Content.Client.UserInterface.Controls; using Content.Shared.Atmos; using Content.Shared.Atmos.Prototypes; using Robust.Client.AutoGenerated; @@ -16,7 +17,7 @@ namespace Content.Client.Atmos.UI /// Client-side UI used to control a gas volume pump. /// </summary> [GenerateTypedNameReferences] - public sealed partial class GasVolumePumpWindow : DefaultWindow + public sealed partial class GasVolumePumpWindow : FancyWindow { public bool PumpStatus = true; diff --git a/Content.Server/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs b/Content.Server/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs deleted file mode 100644 index 48cdaebb97..0000000000 --- a/Content.Server/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Content.Shared.Atmos; -using Content.Shared.Guidebook; - -namespace Content.Server.Atmos.Piping.Binary.Components -{ - [RegisterComponent] - public sealed partial class GasVolumePumpComponent : Component - { - [ViewVariables(VVAccess.ReadWrite)] - [DataField("enabled")] - public bool Enabled { get; set; } = true; - - [DataField("blocked")] - public bool Blocked { get; set; } = false; - - [ViewVariables(VVAccess.ReadWrite)] - public bool Overclocked { get; set; } = false; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("inlet")] - public string InletName { get; set; } = "inlet"; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("outlet")] - public string OutletName { get; set; } = "outlet"; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("transferRate")] - public float TransferRate { get; set; } = Atmospherics.MaxTransferRate; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("maxTransferRate")] - public float MaxTransferRate { get; set; } = Atmospherics.MaxTransferRate; - - [DataField("leakRatio")] - public float LeakRatio { get; set; } = 0.1f; - - [DataField("lowerThreshold")] - public float LowerThreshold { get; set; } = 0.01f; - - [DataField("higherThreshold")] - [GuidebookData] - public float HigherThreshold { get; set; } = DefaultHigherThreshold; - public static readonly float DefaultHigherThreshold = 2 * Atmospherics.MaxOutputPressure; - - [DataField("overclockThreshold")] - public float OverclockThreshold { get; set; } = 1000; - - [DataField("lastMolesTransferred")] - public float LastMolesTransferred; - } -} diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs index d593324b19..1650427be5 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs @@ -1,7 +1,5 @@ -using Content.Server.Administration.Logs; using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.Monitor.Systems; -using Content.Server.Atmos.Piping.Binary.Components; using Content.Server.Atmos.Piping.Components; using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; @@ -10,73 +8,34 @@ using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; using Content.Server.Power.Components; using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.Atmos.Piping.Binary.Systems; using Content.Shared.Atmos.Piping.Components; -using Content.Shared.Atmos.Visuals; using Content.Shared.Audio; -using Content.Shared.Database; using Content.Shared.DeviceNetwork; -using Content.Shared.Examine; -using Content.Shared.Interaction; -using Content.Shared.Popups; -using Content.Shared.Power; using JetBrains.Annotations; using Robust.Server.GameObjects; -using Robust.Shared.Player; namespace Content.Server.Atmos.Piping.Binary.EntitySystems { [UsedImplicitly] - public sealed class GasVolumePumpSystem : EntitySystem + public sealed class GasVolumePumpSystem : SharedGasVolumePumpSystem { - [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; [Dependency] private readonly DeviceNetworkSystem _deviceNetwork = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - public override void Initialize() { base.Initialize(); - SubscribeLocalEvent<GasVolumePumpComponent, ComponentInit>(OnInit); SubscribeLocalEvent<GasVolumePumpComponent, AtmosDeviceUpdateEvent>(OnVolumePumpUpdated); SubscribeLocalEvent<GasVolumePumpComponent, AtmosDeviceDisabledEvent>(OnVolumePumpLeaveAtmosphere); - SubscribeLocalEvent<GasVolumePumpComponent, ExaminedEvent>(OnExamined); - SubscribeLocalEvent<GasVolumePumpComponent, ActivateInWorldEvent>(OnPumpActivate); - SubscribeLocalEvent<GasVolumePumpComponent, PowerChangedEvent>(OnPowerChanged); - // Bound UI subscriptions - SubscribeLocalEvent<GasVolumePumpComponent, GasVolumePumpChangeTransferRateMessage>(OnTransferRateChangeMessage); - SubscribeLocalEvent<GasVolumePumpComponent, GasVolumePumpToggleStatusMessage>(OnToggleStatusMessage); SubscribeLocalEvent<GasVolumePumpComponent, DeviceNetworkPacketEvent>(OnPacketRecv); } - private void OnInit(EntityUid uid, GasVolumePumpComponent pump, ComponentInit args) - { - UpdateAppearance(uid, pump); - } - - private void OnExamined(EntityUid uid, GasVolumePumpComponent pump, ExaminedEvent args) - { - if (!EntityManager.GetComponent<TransformComponent>(uid).Anchored || !args.IsInDetailsRange) // Not anchored? Out of range? No status. - return; - - if (Loc.TryGetString("gas-volume-pump-system-examined", out var str, - ("statusColor", "lightblue"), // TODO: change with volume? - ("rate", pump.TransferRate) - )) - args.PushMarkup(str); - } - - private void OnPowerChanged(EntityUid uid, GasVolumePumpComponent component, ref PowerChangedEvent args) - { - UpdateAppearance(uid, component); - } - private void OnVolumePumpUpdated(EntityUid uid, GasVolumePumpComponent pump, ref AtmosDeviceUpdateEvent args) { if (!pump.Enabled || @@ -134,78 +93,18 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems private void OnVolumePumpLeaveAtmosphere(EntityUid uid, GasVolumePumpComponent pump, ref AtmosDeviceDisabledEvent args) { pump.Enabled = false; + Dirty(uid, pump); UpdateAppearance(uid, pump); - - DirtyUI(uid, pump); _userInterfaceSystem.CloseUi(uid, GasVolumePumpUiKey.Key); } - private void OnPumpActivate(EntityUid uid, GasVolumePumpComponent pump, ActivateInWorldEvent args) - { - if (args.Handled || !args.Complex) - return; - - if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor)) - return; - - if (Transform(uid).Anchored) - { - _userInterfaceSystem.OpenUi(uid, GasVolumePumpUiKey.Key, actor.PlayerSession); - DirtyUI(uid, pump); - } - else - { - _popup.PopupCursor(Loc.GetString("comp-gas-pump-ui-needs-anchor"), args.User); - } - - args.Handled = true; - } - - private void OnToggleStatusMessage(EntityUid uid, GasVolumePumpComponent pump, GasVolumePumpToggleStatusMessage args) - { - pump.Enabled = args.Enabled; - _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); - DirtyUI(uid, pump); - UpdateAppearance(uid, pump); - } - - private void OnTransferRateChangeMessage(EntityUid uid, GasVolumePumpComponent pump, GasVolumePumpChangeTransferRateMessage args) - { - pump.TransferRate = Math.Clamp(args.TransferRate, 0f, pump.MaxTransferRate); - _adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium, - $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}"); - DirtyUI(uid, pump); - } - - private void DirtyUI(EntityUid uid, GasVolumePumpComponent? pump) - { - if (!Resolve(uid, ref pump)) - return; - - _userInterfaceSystem.SetUiState(uid, GasVolumePumpUiKey.Key, - new GasVolumePumpBoundUserInterfaceState(Name(uid), pump.TransferRate, pump.Enabled)); - } - - private void UpdateAppearance(EntityUid uid, GasVolumePumpComponent? pump = null, AppearanceComponent? appearance = null) - { - if (!Resolve(uid, ref pump, ref appearance, false)) - return; - - bool pumpOn = pump.Enabled && (TryComp<ApcPowerReceiverComponent>(uid, out var power) && power.Powered); - if (!pumpOn) - _appearance.SetData(uid, GasVolumePumpVisuals.State, GasVolumePumpState.Off, appearance); - else if (pump.Blocked) - _appearance.SetData(uid, GasVolumePumpVisuals.State, GasVolumePumpState.Blocked, appearance); - else - _appearance.SetData(uid, GasVolumePumpVisuals.State, GasVolumePumpState.On, appearance); - } - private void OnPacketRecv(EntityUid uid, GasVolumePumpComponent component, DeviceNetworkPacketEvent args) { if (!TryComp(uid, out DeviceNetworkComponent? netConn) || !args.Data.TryGetValue(DeviceNetworkConstants.Command, out var cmd)) + { return; + } var payload = new NetworkPayload(); diff --git a/Content.Shared/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs b/Content.Shared/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs new file mode 100644 index 0000000000..653f68ce6b --- /dev/null +++ b/Content.Shared/Atmos/Piping/Binary/Components/GasVolumePumpComponent.cs @@ -0,0 +1,45 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Atmos.Piping.Binary.Components; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class GasVolumePumpComponent : Component +{ + [DataField, AutoNetworkedField] + public bool Enabled = true; + + [DataField] + public bool Blocked = false; + + [ViewVariables(VVAccess.ReadWrite)] + public bool Overclocked = false; + + [DataField("inlet")] + public string InletName = "inlet"; + + [DataField("outlet")] + public string OutletName = "outlet"; + + [DataField, AutoNetworkedField] + public float TransferRate = Atmospherics.MaxTransferRate; + + [DataField] + public float MaxTransferRate = Atmospherics.MaxTransferRate; + + [DataField] + public float LeakRatio = 0.1f; + + [DataField] + public float LowerThreshold = 0.01f; + + [DataField] + public float HigherThreshold = DefaultHigherThreshold; + + public static readonly float DefaultHigherThreshold = 2 * Atmospherics.MaxOutputPressure; + + [DataField] + public float OverclockThreshold = 1000; + + [DataField] + public float LastMolesTransferred; +} diff --git a/Content.Shared/Atmos/Piping/Binary/Components/SharedGasVolumePumpComponent.cs b/Content.Shared/Atmos/Piping/Binary/Components/SharedGasVolumePumpComponent.cs index d4315f86f5..f3b6bb8caf 100644 --- a/Content.Shared/Atmos/Piping/Binary/Components/SharedGasVolumePumpComponent.cs +++ b/Content.Shared/Atmos/Piping/Binary/Components/SharedGasVolumePumpComponent.cs @@ -5,26 +5,11 @@ namespace Content.Shared.Atmos.Piping.Binary.Components public sealed record GasVolumePumpData(float LastMolesTransferred); [Serializable, NetSerializable] - public enum GasVolumePumpUiKey + public enum GasVolumePumpUiKey : byte { Key, } - [Serializable, NetSerializable] - public sealed class GasVolumePumpBoundUserInterfaceState : BoundUserInterfaceState - { - public string PumpLabel { get; } - public float TransferRate { get; } - public bool Enabled { get; } - - public GasVolumePumpBoundUserInterfaceState(string pumpLabel, float transferRate, bool enabled) - { - PumpLabel = pumpLabel; - TransferRate = transferRate; - Enabled = enabled; - } - } - [Serializable, NetSerializable] public sealed class GasVolumePumpToggleStatusMessage : BoundUserInterfaceMessage { diff --git a/Content.Shared/Atmos/Piping/Binary/Systems/SharedGasVolumePumpSystem.cs b/Content.Shared/Atmos/Piping/Binary/Systems/SharedGasVolumePumpSystem.cs new file mode 100644 index 0000000000..660f17b42f --- /dev/null +++ b/Content.Shared/Atmos/Piping/Binary/Systems/SharedGasVolumePumpSystem.cs @@ -0,0 +1,91 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Atmos.Piping.Binary.Components; +using Content.Shared.Atmos.Visuals; +using Content.Shared.Database; +using Content.Shared.Examine; +using Content.Shared.Power; +using Content.Shared.Power.EntitySystems; + +namespace Content.Shared.Atmos.Piping.Binary.Systems; + +public abstract class SharedGasVolumePumpSystem : EntitySystem +{ + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedPowerReceiverSystem _receiver = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent<GasVolumePumpComponent, ComponentInit>(OnInit); + SubscribeLocalEvent<GasVolumePumpComponent, PowerChangedEvent>(OnPowerChanged); + + SubscribeLocalEvent<GasVolumePumpComponent, ExaminedEvent>(OnExamined); + SubscribeLocalEvent<GasVolumePumpComponent, GasVolumePumpToggleStatusMessage>(OnToggleStatusMessage); + SubscribeLocalEvent<GasVolumePumpComponent, GasVolumePumpChangeTransferRateMessage>(OnTransferRateChangeMessage); + } + + private void OnInit(Entity<GasVolumePumpComponent> ent, ref ComponentInit args) + { + UpdateAppearance(ent.Owner, ent.Comp); + } + + private void OnPowerChanged(Entity<GasVolumePumpComponent> ent, ref PowerChangedEvent args) + { + UpdateAppearance(ent.Owner, ent.Comp); + } + + protected virtual void UpdateUi(Entity<GasVolumePumpComponent> entity) + { + + } + + private void OnToggleStatusMessage(EntityUid uid, GasVolumePumpComponent pump, GasVolumePumpToggleStatusMessage args) + { + pump.Enabled = args.Enabled; + _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + + Dirty(uid, pump); + UpdateUi((uid, pump)); + UpdateAppearance(uid, pump); + } + + private void OnTransferRateChangeMessage(EntityUid uid, GasVolumePumpComponent pump, GasVolumePumpChangeTransferRateMessage args) + { + pump.TransferRate = Math.Clamp(args.TransferRate, 0f, pump.MaxTransferRate); + Dirty(uid, pump); + UpdateUi((uid, pump)); + _adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium, + $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}"); + } + + private void OnExamined(EntityUid uid, GasVolumePumpComponent pump, ExaminedEvent args) + { + if (!Transform(uid).Anchored) + return; + + if (Loc.TryGetString("gas-volume-pump-system-examined", + out var str, + ("statusColor", "lightblue"), // TODO: change with volume? + ("rate", pump.TransferRate) + )) + { + args.PushMarkup(str); + } + } + + protected void UpdateAppearance(EntityUid uid, GasVolumePumpComponent? pump = null, AppearanceComponent? appearance = null) + { + if (!Resolve(uid, ref pump, ref appearance, false)) + return; + + bool pumpOn = pump.Enabled && _receiver.IsPowered(uid); + if (!pumpOn) + _appearance.SetData(uid, GasVolumePumpVisuals.State, GasVolumePumpState.Off, appearance); + else if (pump.Blocked) + _appearance.SetData(uid, GasVolumePumpVisuals.State, GasVolumePumpState.Blocked, appearance); + else + _appearance.SetData(uid, GasVolumePumpVisuals.State, GasVolumePumpState.On, appearance); + } +} diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index 71c0da2736..33a8414961 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -120,6 +120,9 @@ - type: PipeColorVisuals - type: GasVolumePump enabled: false + - type: ActivatableUI + key: enum.GasVolumePumpUiKey.Key + - type: ActivatableUIRequiresAnchor - type: UserInterface interfaces: enum.GasVolumePumpUiKey.Key: From 4d25907ba45aa5fadc68634aab2874a6141850ed Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 01:49:48 +0000 Subject: [PATCH 347/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index be18e3aea3..dff89adf6a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: You can now select candles in trinkets loadout - type: Add - id: 7751 - time: '2024-12-24T00:24:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33193 - author: lzk228 changes: - message: Now you are allowed to paint multiple airlocks with the spray painter. @@ -3916,3 +3909,10 @@ id: 8251 time: '2025-04-19T01:38:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36546 +- author: metalgearsloth + changes: + - message: Predict gas volume pumps. + type: Tweak + id: 8252 + time: '2025-04-19T01:48:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33835 From b6e101b96f19800ef23c7486efa0004dec6d44f2 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Sat, 19 Apr 2025 04:17:13 +0200 Subject: [PATCH 348/622] Prevent certain foldable items from being unfolded on structures (#36687) initial commit --- .../EntitySystems/AnchorableSystem.cs | 5 +++- .../Foldable/DeployFoldableSystem.cs | 12 +++++++++ Content.Shared/Foldable/FoldableSystem.cs | 26 +++++++++++++++---- .../Interaction/SharedInteractionSystem.cs | 2 +- .../components/foldable-component.ftl | 3 +++ 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs index a291473b30..ec8edea474 100644 --- a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs +++ b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs @@ -277,7 +277,10 @@ public sealed partial class AnchorableSystem : EntitySystem return !attempt.Cancelled; } - private bool TileFree(EntityCoordinates coordinates, PhysicsComponent anchorBody) + /// <summary> + /// Returns true if no hard anchored entities exist on the coordinate tile that would collide with the provided physics body. + /// </summary> + public bool TileFree(EntityCoordinates coordinates, PhysicsComponent anchorBody) { // Probably ignore CanCollide on the anchoring body? var gridUid = _transformSystem.GetGrid(coordinates); diff --git a/Content.Shared/Foldable/DeployFoldableSystem.cs b/Content.Shared/Foldable/DeployFoldableSystem.cs index 16315cde69..a83518dfa3 100644 --- a/Content.Shared/Foldable/DeployFoldableSystem.cs +++ b/Content.Shared/Foldable/DeployFoldableSystem.cs @@ -1,7 +1,10 @@ +using Content.Shared.Construction.EntitySystems; using Content.Shared.DragDrop; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; +using Content.Shared.Popups; +using Robust.Shared.Physics.Components; namespace Content.Shared.Foldable; @@ -9,6 +12,8 @@ public sealed class DeployFoldableSystem : EntitySystem { [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly FoldableSystem _foldable = default!; + [Dependency] private readonly AnchorableSystem _anchorable = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; public override void Initialize() { @@ -57,6 +62,13 @@ public sealed class DeployFoldableSystem : EntitySystem if (!TryComp<FoldableComponent>(ent, out var foldable)) return; + if (!TryComp(ent.Owner, out PhysicsComponent? anchorBody) + || !_anchorable.TileFree(args.ClickLocation, anchorBody)) + { + _popup.PopupPredicted(Loc.GetString("foldable-deploy-fail", ("object", ent)), ent, args.User); + return; + } + if (!TryComp(args.User, out HandsComponent? hands) || !_hands.TryDrop(args.User, args.Used, targetDropLocation: args.ClickLocation, handsComp: hands)) return; diff --git a/Content.Shared/Foldable/FoldableSystem.cs b/Content.Shared/Foldable/FoldableSystem.cs index 3ba4201e79..73916f1c15 100644 --- a/Content.Shared/Foldable/FoldableSystem.cs +++ b/Content.Shared/Foldable/FoldableSystem.cs @@ -1,9 +1,11 @@ -using Content.Shared.Body.Components; using Content.Shared.Buckle; using Content.Shared.Buckle.Components; +using Content.Shared.Construction.EntitySystems; +using Content.Shared.Popups; using Content.Shared.Storage.Components; using Content.Shared.Verbs; using Robust.Shared.Containers; +using Robust.Shared.Physics.Components; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -15,6 +17,8 @@ public sealed class FoldableSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedBuckleSystem _buckle = default!; [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly AnchorableSystem _anchorable = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; public override void Initialize() { @@ -83,9 +87,17 @@ public sealed class FoldableSystem : EntitySystem args.Cancel(); } - public bool TryToggleFold(EntityUid uid, FoldableComponent comp) + public bool TryToggleFold(EntityUid uid, FoldableComponent comp, EntityUid? folder = null) { - return TrySetFolded(uid, comp, !comp.IsFolded); + var result = TrySetFolded(uid, comp, !comp.IsFolded); + if (!result && folder != null) + { + if (comp.IsFolded) + _popup.PopupPredicted(Loc.GetString("foldable-unfold-fail", ("object", uid)), uid, folder.Value); + else + _popup.PopupPredicted(Loc.GetString("foldable-fold-fail", ("object", uid)), uid, folder.Value); + } + return result; } public bool CanToggleFold(EntityUid uid, FoldableComponent? fold = null) @@ -97,6 +109,10 @@ public sealed class FoldableSystem : EntitySystem if (_container.IsEntityInContainer(uid) && !fold.CanFoldInsideContainer) return false; + if (!TryComp(uid, out PhysicsComponent? body) || + !_anchorable.TileFree(Transform(uid).Coordinates, body)) + return false; + var ev = new FoldAttemptEvent(fold); RaiseLocalEvent(uid, ref ev); return !ev.Cancelled; @@ -121,12 +137,12 @@ public sealed class FoldableSystem : EntitySystem private void AddFoldVerb(EntityUid uid, FoldableComponent component, GetVerbsEvent<AlternativeVerb> args) { - if (!args.CanAccess || !args.CanInteract || args.Hands == null || !CanToggleFold(uid, component)) + if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; AlternativeVerb verb = new() { - Act = () => TryToggleFold(uid, component), + Act = () => TryToggleFold(uid, component, args.User), Text = component.IsFolded ? Loc.GetString(component.UnfoldVerbText) : Loc.GetString(component.FoldVerbText), Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/fold.svg.192dpi.png")), diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 00246bafcd..eeb961537b 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -855,7 +855,7 @@ namespace Content.Shared.Interaction { // If the target is an item, we ignore any colliding entities. Currently done so that if items get stuck // inside of walls, users can still pick them up. - ignored.UnionWith(_broadphase.GetEntitiesIntersectingBody(target, (int) collisionMask, false, physics)); + ignored.UnionWith(_broadphase.GetEntitiesIntersectingBody(target, (int) collisionMask, false, physics)); // Note: This also bypasses items underneath doors, which may be problematic if it'd cause undesirable behavior. } else if (_wallMountQuery.TryComp(target, out var wallMount)) { diff --git a/Resources/Locale/en-US/foldable/components/foldable-component.ftl b/Resources/Locale/en-US/foldable/components/foldable-component.ftl index 525820920b..1221efbdf0 100644 --- a/Resources/Locale/en-US/foldable/components/foldable-component.ftl +++ b/Resources/Locale/en-US/foldable/components/foldable-component.ftl @@ -1,5 +1,8 @@ # Foldable +foldable-fold-fail = You can't fold the {$object} here. +foldable-unfold-fail = You can't unfold the {$object} here. + foldable-deploy-fail = You can't deploy the {$object} here. fold-verb = Fold unfold-verb = Unfold From be8fa724a759682bbae3cbb6fd36a3ce64aba5f4 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 12:31:21 +1000 Subject: [PATCH 349/622] Fix import (#36706) --- .../Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs b/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs index 65755d62c5..8cc3f21436 100644 --- a/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs +++ b/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs @@ -1,6 +1,7 @@ using Content.Server.Atmos.Piping.Binary.Components; using Content.Server.Atmos.Piping.Unary.EntitySystems; using Content.Shared.Atmos; +using Content.Shared.Atmos.Piping.Binary.Components; using Content.Shared.Guidebook; namespace Content.Server.Atmos.Piping.Unary.Components From 9599f582f3e08c711431910b2f4043fc8fdf75cb Mon Sep 17 00:00:00 2001 From: SharkSnake98 <peanutbuttersharky@gmail.com> Date: Sat, 19 Apr 2025 01:12:10 -0400 Subject: [PATCH 350/622] New Drinks (#36287) Co-authored-by: RedBookcase <crazykid1590@gmail.com> Co-authored-by: SharkSnake98 <sharksnake87@gmail.com> --- .../Locale/en-US/flavors/flavor-profiles.ftl | 14 +- .../meta/consumable/drink/alcohol.ftl | 36 ++++ .../Random/Food_Drinks/drinks_glass.yml | 12 ++ .../Objects/Consumable/Drinks/drinks.yml | 195 +++++++++++++++++- Resources/Prototypes/Flavors/flavors.yml | 60 ++++++ .../Reagents/Consumable/Drink/alcohol.yml | 165 +++++++++++++++ .../Reagents/Consumable/Drink/drinks.yml | 15 ++ .../Prototypes/Recipes/Reactions/drinks.yml | 158 +++++++++++++- .../alienbrainhemorrhage.rsi/fill-1.png | Bin 0 -> 168 bytes .../alienbrainhemorrhage.rsi/fill-2.png | Bin 0 -> 219 bytes .../alienbrainhemorrhage.rsi/fill-3.png | Bin 0 -> 228 bytes .../alienbrainhemorrhage.rsi/fill-4.png | Bin 0 -> 249 bytes .../alienbrainhemorrhage.rsi/fill-5.png | Bin 0 -> 258 bytes .../Drinks/alienbrainhemorrhage.rsi/icon.png | Bin 0 -> 306 bytes .../alienbrainhemorrhage.rsi/icon_empty.png | Bin 0 -> 222 bytes .../Drinks/alienbrainhemorrhage.rsi/meta.json | 34 +++ .../Consumable/Drinks/bronx.rsi/fill-1.png | Bin 0 -> 144 bytes .../Consumable/Drinks/bronx.rsi/fill-2.png | Bin 0 -> 162 bytes .../Consumable/Drinks/bronx.rsi/fill-3.png | Bin 0 -> 180 bytes .../Consumable/Drinks/bronx.rsi/fill-4.png | Bin 0 -> 183 bytes .../Consumable/Drinks/bronx.rsi/icon.png | Bin 0 -> 258 bytes .../Drinks/bronx.rsi/icon_empty.png | Bin 0 -> 255 bytes .../Consumable/Drinks/bronx.rsi/meta.json | 31 +++ .../Drinks/crushdepth.rsi/fill-1.png | Bin 0 -> 150 bytes .../Drinks/crushdepth.rsi/fill-2.png | Bin 0 -> 168 bytes .../Drinks/crushdepth.rsi/fill-3.png | Bin 0 -> 186 bytes .../Drinks/crushdepth.rsi/fill-4.png | Bin 0 -> 207 bytes .../Drinks/crushdepth.rsi/fill-5.png | Bin 0 -> 237 bytes .../Consumable/Drinks/crushdepth.rsi/icon.png | Bin 0 -> 306 bytes .../Drinks/crushdepth.rsi/icon_empty.png | Bin 0 -> 276 bytes .../Drinks/crushdepth.rsi/meta.json | 34 +++ .../Drinks/dark&stormy.rsi/fill-1.png | Bin 0 -> 147 bytes .../Drinks/dark&stormy.rsi/fill-2.png | Bin 0 -> 174 bytes .../Drinks/dark&stormy.rsi/fill-3.png | Bin 0 -> 201 bytes .../Drinks/dark&stormy.rsi/fill-4.png | Bin 0 -> 216 bytes .../Drinks/dark&stormy.rsi/fill-5.png | Bin 0 -> 216 bytes .../Drinks/dark&stormy.rsi/icon.png | Bin 0 -> 273 bytes .../Drinks/dark&stormy.rsi/icon_empty.png | Bin 0 -> 231 bytes .../Drinks/dark&stormy.rsi/meta.json | 34 +++ .../Drinks/electricshark.rsi/fill-1.png | Bin 0 -> 153 bytes .../Drinks/electricshark.rsi/fill-2.png | Bin 0 -> 177 bytes .../Drinks/electricshark.rsi/fill-3.png | Bin 0 -> 189 bytes .../Drinks/electricshark.rsi/fill-4.png | Bin 0 -> 201 bytes .../Drinks/electricshark.rsi/fill-5.png | Bin 0 -> 213 bytes .../Drinks/electricshark.rsi/icon.png | Bin 0 -> 348 bytes .../Drinks/electricshark.rsi/icon_empty.png | Bin 0 -> 339 bytes .../Drinks/electricshark.rsi/meta.json | 34 +++ .../Consumable/Drinks/jackrose.rsi/fill-1.png | Bin 0 -> 144 bytes .../Consumable/Drinks/jackrose.rsi/fill-2.png | Bin 0 -> 159 bytes .../Consumable/Drinks/jackrose.rsi/fill-3.png | Bin 0 -> 177 bytes .../Consumable/Drinks/jackrose.rsi/fill-4.png | Bin 0 -> 195 bytes .../Consumable/Drinks/jackrose.rsi/icon.png | Bin 0 -> 291 bytes .../Drinks/jackrose.rsi/icon_empty.png | Bin 0 -> 276 bytes .../Consumable/Drinks/jackrose.rsi/meta.json | 31 +++ .../Drinks/junglebird.rsi/fill-1.png | Bin 0 -> 159 bytes .../Drinks/junglebird.rsi/fill-2.png | Bin 0 -> 192 bytes .../Drinks/junglebird.rsi/fill-3.png | Bin 0 -> 189 bytes .../Drinks/junglebird.rsi/fill-4.png | Bin 0 -> 189 bytes .../Consumable/Drinks/junglebird.rsi/icon.png | Bin 0 -> 300 bytes .../Drinks/junglebird.rsi/icon_empty.png | Bin 0 -> 273 bytes .../Drinks/junglebird.rsi/meta.json | 31 +++ .../Drinks/kalimotxo.rsi/fill-1.png | Bin 0 -> 165 bytes .../Drinks/kalimotxo.rsi/fill-2.png | Bin 0 -> 183 bytes .../Drinks/kalimotxo.rsi/fill-3.png | Bin 0 -> 183 bytes .../Drinks/kalimotxo.rsi/fill-4.png | Bin 0 -> 195 bytes .../Drinks/kalimotxo.rsi/fill-5.png | Bin 0 -> 210 bytes .../Consumable/Drinks/kalimotxo.rsi/icon.png | Bin 0 -> 291 bytes .../Drinks/kalimotxo.rsi/icon_empty.png | Bin 0 -> 243 bytes .../Consumable/Drinks/kalimotxo.rsi/meta.json | 34 +++ .../Drinks/monkeybusiness.rsi/fill-1.png | Bin 0 -> 144 bytes .../Drinks/monkeybusiness.rsi/fill-2.png | Bin 0 -> 162 bytes .../Drinks/monkeybusiness.rsi/fill-3.png | Bin 0 -> 180 bytes .../Drinks/monkeybusiness.rsi/fill-4.png | Bin 0 -> 183 bytes .../Drinks/monkeybusiness.rsi/icon.png | Bin 0 -> 231 bytes .../Drinks/monkeybusiness.rsi/icon_empty.png | Bin 0 -> 213 bytes .../Drinks/monkeybusiness.rsi/meta.json | 31 +++ .../Consumable/Drinks/radler.rsi/fill-1.png | Bin 0 -> 144 bytes .../Consumable/Drinks/radler.rsi/fill-2.png | Bin 0 -> 165 bytes .../Consumable/Drinks/radler.rsi/fill-3.png | Bin 0 -> 201 bytes .../Consumable/Drinks/radler.rsi/fill-4.png | Bin 0 -> 201 bytes .../Consumable/Drinks/radler.rsi/fill-5.png | Bin 0 -> 213 bytes .../Consumable/Drinks/radler.rsi/icon.png | Bin 0 -> 267 bytes .../Drinks/radler.rsi/icon_empty.png | Bin 0 -> 231 bytes .../Consumable/Drinks/radler.rsi/meta.json | 34 +++ .../Consumable/Drinks/tortuga.rsi/fill-1.png | Bin 0 -> 156 bytes .../Consumable/Drinks/tortuga.rsi/fill-2.png | Bin 0 -> 198 bytes .../Consumable/Drinks/tortuga.rsi/fill-3.png | Bin 0 -> 210 bytes .../Consumable/Drinks/tortuga.rsi/fill-4.png | Bin 0 -> 240 bytes .../Consumable/Drinks/tortuga.rsi/icon.png | Bin 0 -> 363 bytes .../Drinks/tortuga.rsi/icon_empty.png | Bin 0 -> 315 bytes .../Consumable/Drinks/tortuga.rsi/meta.json | 31 +++ .../Consumable/Drinks/vampiro.rsi/fill-1.png | Bin 0 -> 177 bytes .../Consumable/Drinks/vampiro.rsi/fill-2.png | Bin 0 -> 213 bytes .../Consumable/Drinks/vampiro.rsi/fill-3.png | Bin 0 -> 240 bytes .../Consumable/Drinks/vampiro.rsi/fill-4.png | Bin 0 -> 285 bytes .../Consumable/Drinks/vampiro.rsi/icon.png | Bin 0 -> 354 bytes .../Drinks/vampiro.rsi/icon_empty.png | Bin 0 -> 291 bytes .../Consumable/Drinks/vampiro.rsi/meta.json | 31 +++ 98 files changed, 1042 insertions(+), 3 deletions(-) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/radler.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/meta.json diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl index 38efd407ae..14e4ed5adb 100644 --- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl +++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl @@ -236,8 +236,11 @@ flavor-complex-long-island = suspiciously like iced tea flavor-complex-three-mile-island = like tea brewed in nuclear runoff flavor-complex-whiskey-cola = like carbonated molasses flavor-complex-root-beer-float = like ice cream in root beer +flavor-complex-crush-depth = like the Hadal Zone flavor-complex-black-russian = like alcoholic coffee flavor-complex-white-russian = like alcoholic sweetened coffee +flavor-complex-electric-shark = like Shark Week in the tropics +flavor-complex-tortuga = like sweet tea flavor-complex-moonshine = like pure alcohol flavor-complex-singulo = like a bottomless hole flavor-complex-syndie-bomb = like bitter whiskey @@ -253,6 +256,12 @@ flavor-complex-atomic-cola = like hoarding bottle caps flavor-complex-cuba-libre = like spiked cola flavor-complex-gin-tonic = refreshingly bitter flavor-complex-screwdriver = like spiked orange juice +flavor-complex-jack-rose = like a testimony +flavor-complex-jungle-bird = like you’re in a tropical aviary +flavor-complex-kalimotxo = like fancy spiked cola +flavor-complex-vampiro = fruity, savoury, and spicy +flavor-complex-bronx = like mildly sweet, alcoholic fruit +flavor-complex-monkey-business = like going ape flavor-complex-vodka-red-bool = like a heart attack flavor-complex-irish-bool = like caffeine and Ireland flavor-complex-xeno-basher = like killing bugs @@ -260,13 +269,14 @@ flavor-complex-budget-insuls-drink = like door hacking flavor-complex-watermelon-wakeup = like a sweet wakeup call flavor-complex-rubberneck = like synthetics flavor-complex-irish-slammer = like a spiked cola float +flavor-complex-alien-brain-hemorrhage = like an extraterrestrial injury flavor-complex-themartinez = like violets and lemon vodka flavor-complex-cogchamp = like brass flavor-complex-white-gilgamesh = like lightly carbonated cream flavor-complex-antifreeze = warm flavor-complex-caipirinha = like Brazil flavor-complex-daiquiri = like rum, lime and sugar -flavor-complex-deathintheafternoon = like anise and champagne +flavor-complex-deathintheafternoon = like anise and champagne flavor-complex-empress75 = like tyrian purple flavor-complex-espressomartini = like vodka and coffee flavor-complex-mayojito = like stomach turmoil @@ -294,6 +304,7 @@ flavor-complex-driest-martini = like a drunk mimic flavor-complex-erika-surprise = like the bartender made a mistake flavor-complex-gin-fizz = refreshing and lemony flavor-complex-gildlager = like the Tzar's gold +flavor-complex-dark-and-stormy = like ginger ale spiked with rum flavor-complex-grog = like a sea shanty flavor-complex-hippies-delight = like your blood pressure is dropping flavor-complex-hooch = like it would be delicious if you were a diesel engine @@ -304,6 +315,7 @@ flavor-complex-martini = like a spy movie flavor-complex-mojito = like going into the shade after being in the hot sun flavor-complex-neurotoxin = like an underground testing facility flavor-complex-patron = like being serenaded by mariachi +flavor-complex-radler = like spiked lemonade flavor-complex-red-mead = like a viking battle flavor-complex-sbiten = like fire flavor-complex-snowwhite = like sour and bitter hops diff --git a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl index 5a22328900..df9e6ce78f 100644 --- a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl +++ b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl @@ -61,6 +61,9 @@ reagent-desc-champagne = A premium sparkling wine reagent-name-acid-spit = acidspit reagent-desc-acid-spit = A drink for the daring, can be deadly if incorrectly prepared! +reagent-name-alien-brain-hemorrhage = alien brain hemorrhage +reagent-desc-alien-brain-hemorrhage = You might want to get that checked out at Med. + reagent-name-allies-cocktail = allies cocktail reagent-desc-allies-cocktail = A drink made from your allies, not as sweet as when made from your enemies. @@ -109,15 +112,24 @@ reagent-desc-booger = Ewww... reagent-name-brave-bull = Brave Bull reagent-desc-brave-bull = It's just as effective as Dutch-Courage! +reagent-name-bronx = Bronx +reagent-desc-bronx = The orange-flavoured cousin of the Manhattan and Martini. + reagent-name-coconut-rum = coconut rum reagent-desc-coconut-rum = Rum with coconut for that tropical feel. reagent-name-cosmopolitan = cosmopolitan reagent-desc-cosmopolitan = Even in the worst situations, nothing beats a fresh cosmopolitan. +reagent-name-crush-depth = crush depth +reagent-desc-crush-depth = A stygian drink, harkening back to the abyssopelagic. Dark and Cold, it serves as a reminder that the most ancient emotion is fear, and the strongest type of fear is that of the unknown. + reagent-name-cuba-libre = Cuba libre reagent-desc-cuba-libre = Rum, mixed with cola. Viva la revolucion. +reagent-name-dark-and-stormy = dark & stormy +reagent-desc-dark-and-stormy = You can almost hear the thunder. + reagent-name-demons-blood = Demon's Blood reagent-desc-demons-blood = AHHHH!!!! @@ -130,6 +142,9 @@ reagent-desc-doctors-delight = A gulp a day keeps the MediBot away. That's proba reagent-name-driest-martini = driest martini reagent-desc-driest-martini = Only for the experienced. You think you see sand floating in the glass. +reagent-name-electric-shark = electric shark +reagent-desc-electric-shark = Fun Shark fact: Selachians make up 20% of Space Station 16’s Engineering staff! + reagent-name-erika-surprise = Erika surprise reagent-desc-erika-surprise = The surprise is, it's green! @@ -166,9 +181,21 @@ reagent-desc-irish-cream = Whiskey-imbued cream. What else could you expect from reagent-name-irish-coffee = Irish coffee reagent-desc-irish-coffee = Coffee served with irish cream. Regular cream just isn't the same! +reagent-name-jack-rose = Jack rose +reagent-desc-jack-rose = Excessively Red. + +reagent-name-jungle-bird = jungle bird +reagent-desc-jungle-bird = Despite the name, it’s not exceptionally popular among Voxes. + +reagent-name-kalimotxo = kalimotxo +reagent-desc-kalimotxo = A high-class Cuba Libre, for the discerning alcoholic. + reagent-name-kira-special = Kira special reagent-desc-kira-special = Long live the guy who everyone had mistaken for a girl. Baka! +reagent-name-tortuga = Tortuga +reagent-desc-tortuga = Perfect for pirates who’ve been selected as the designated driver. Yarr! + reagent-name-long-island-iced-tea = Long Island iced tea reagent-desc-long-island-iced-tea = The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only. @@ -196,6 +223,9 @@ reagent-desc-mead = A Viking's drink, though a cheap one. reagent-name-mojito = Mojito reagent-desc-mojito = If it's good enough for Spesscuba, it's good enough for you. +reagent-name-monkey-business = monkey business +reagent-desc-monkey-business = You’ve got to wonder how the monkeys feel about this drink. + reagent-name-moonshine = moonshine reagent-desc-moonshine = Artisanal homemade liquor. What could go wrong? @@ -211,6 +241,9 @@ reagent-desc-patron = Tequila with silver in it, a favorite of alcoholic women i reagent-name-pina-colada = Piña Colada reagent-desc-pina-colada = For getting lost in the rain. +reagent-name-radler = radler +reagent-desc-radler = A simple but staple classic, straight out of Space-Germany. + reagent-name-red-mead = red mead reagent-desc-red-mead = The true Viking's drink! Even though it has a strange red color. @@ -250,6 +283,9 @@ reagent-desc-three-mile-island = "Made for a woman, strong enough for a man." reagent-name-toxins-special = toxins special reagent-desc-toxins-special = This thing is ON FIRE! CALL THE DAMN SHUTTLE! +reagent-name-vampiro = vampiro +reagent-desc-vampiro = Popular in Mexico and Transylvania. + reagent-name-vodka-martini = vodka martini reagent-desc-vodka-martini = Vodka instead of Gin. Not quite how 007 enjoyed it, but still delicious. diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_glass.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_glass.yml index c3a9a3a143..8504925528 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_glass.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_glass.yml @@ -16,6 +16,7 @@ prototypes: - DrinkAbsintheGlass - DrinkAleGlass + - DrinkAlienBrainHemorrhage - DrinkAloe - DrinkAndalusia - DrinkAntifreeze @@ -32,17 +33,21 @@ - DrinkBloodyMaryGlass - DrinkBooger - DrinkBraveBullGlass + - DrinkBronxGlass - BudgetInsulsDrinkGlass - DrinkCarrotJuice - DrinkCoconutRum - DrinkChocolateGlass - DrinkCognacGlass - DrinkCosmopolitan + - DrinkCrushDepthGlass - DrinkCubaLibreGlass + - DrinkDarkandStormyGlass - DrinkDeadRumGlass - DrinkDevilsKiss - DrinkDriestMartiniGlass - DrinkDrGibbGlass + - DrinkElectricSharkGlass - DrinkErikaSurprise - DrinkFourteenLokoGlass - DrinkGargleBlasterGlass @@ -62,6 +67,9 @@ - DrinkIrishSlammer - DrinkIrishCoffeeGlass - DrinkLemonadeGlass + - DrinkJackRoseGlass + - DrinkJungleBirdGlass + - DrinkKalimotxoGlass - DrinkKiraSpecial - DrinkLongIslandIcedTeaGlass - DrinkManhattanGlass @@ -71,11 +79,13 @@ - DrinkMeadGlass - DrinkMilkshake - DrinkMojito + - DrinkMonkeyBusinessGlass - DrinkNTCahors - DrinkPainkillerGlass - DrinkPatronGlass - DrinkPinaColadaGlass - DrinkPoscaGlass + - DrinkRadlerGlass - DrinkRedMeadGlass - DrinkRewriter - DrinkRoyRogersGlass @@ -92,7 +102,9 @@ - DrinkSyndicatebomb - DrinkTequilaSunriseGlass - DrinkThreeMileIslandGlass + - DrinkTortugaGlass - DrinkToxinsSpecialGlass + - DrinkVampiroGlass - DrinkVodkaMartiniGlass - DrinkVodkaRedBool - DrinkVodkaTonicGlass diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index 1891ed71ec..9b50ed8a1e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -187,6 +187,22 @@ sprite: Objects/Consumable/Drinks/aleglass.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkAlienBrainHemorrhage + suffix: alien brain hemorrhage + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: AlienBrainHemorrhage + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/alienbrainhemorrhage.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkAlliesCocktail @@ -507,6 +523,22 @@ sprite: Objects/Consumable/Drinks/bravebullglass.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkBronxGlass + suffix: bronx + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Bronx + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/bronx.rsi + state: icon + - type: entity parent: DrinkGlass id: BudgetInsulsDrinkGlass @@ -661,6 +693,22 @@ - ReagentId: Cream Quantity: 30 +- type: entity + parent: DrinkGlass + id: DrinkCrushDepthGlass + suffix: crush depth + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: CrushDepth + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/crushdepth.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkCubaLibreGlass @@ -677,6 +725,22 @@ sprite: Objects/Consumable/Drinks/cubalibreglass.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkDarkandStormyGlass + suffix: dark and stormy + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: DarkandStormy + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/dark&stormy.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkDeadRumGlass @@ -773,6 +837,22 @@ sprite: Objects/Consumable/Drinks/dr_gibb_glass.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkElectricSharkGlass + suffix: electric shark + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: ElectricShark + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/electricshark.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkErikaSurprise @@ -1177,6 +1257,54 @@ sprite: Objects/Consumable/Drinks/coffeeliqueurglass.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkJackRoseGlass + suffix: jack rose + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: JackRose + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/jackrose.rsi + state: icon + +- type: entity + parent: DrinkGlass + id: DrinkJungleBirdGlass + suffix: jungle bird + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: JungleBird + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/junglebird.rsi + state: icon + +- type: entity + parent: DrinkGlass + id: DrinkKalimotxoGlass + suffix: kalimotxo + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Kalimotxo + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/kalimotxo.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkKiraSpecial @@ -1193,6 +1321,7 @@ sprite: Objects/Consumable/Drinks/kiraspecial.rsi state: icon + - type: entity parent: DrinkGlass id: DrinkLemonadeGlass @@ -1391,6 +1520,22 @@ sprite: Objects/Consumable/Drinks/mojito.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkMonkeyBusinessGlass + suffix: monkey business + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: MonkeyBusiness + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/monkeybusiness.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkNeurotoxinGlass @@ -1567,6 +1712,22 @@ sprite: Objects/Consumable/Drinks/glass_light_yellow.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkRadlerGlass + suffix: radler + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Radler + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/radler.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkRedMeadGlass @@ -2045,6 +2206,22 @@ - ReagentId: JuiceTomato Quantity: 30 +- type: entity + parent: DrinkGlass + id: DrinkTortugaGlass + suffix: tortuga + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Tortuga + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/tortuga.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkToxinsSpecialGlass @@ -2061,6 +2238,22 @@ sprite: Objects/Consumable/Drinks/toxinsspecialglass.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkVampiroGlass + suffix: vampiro + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Vampiro + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/vampiro.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkVermouthGlass @@ -2309,7 +2502,7 @@ drink: maxVol: 30 reagents: - - ReagentId: Daiquiri + - ReagentId: Daiquiri Quantity: 30 - type: Icon sprite: Objects/Consumable/Drinks/daiquiri.rsi diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml index ffd6fe40b8..0aa9341647 100644 --- a/Resources/Prototypes/Flavors/flavors.yml +++ b/Resources/Prototypes/Flavors/flavors.yml @@ -599,6 +599,11 @@ flavorType: Complex description: flavor-complex-irish-slammer +- type: flavor + id: alienbrainhemorrhage + flavorType: Complex + description: flavor-complex-alien-brain-hemorrhage + - type: flavor id: vodkaredbool flavorType: Complex @@ -624,6 +629,11 @@ flavorType: Complex description: flavor-complex-watermelon-wakeup +- type: flavor + id: electricshark + flavorType: Complex + description: flavor-complex-electric-shark + - type: flavor id: rubberneck flavorType: Complex @@ -749,6 +759,11 @@ flavorType: Complex description: flavor-complex-coconut-rum +- type: flavor + id: darkandstormy + flavorType: Complex + description: flavor-complex-dark-and-stormy + - type: flavor id: coffeeliquor flavorType: Complex @@ -799,6 +814,11 @@ flavorType: Complex description: flavor-complex-arnold-palmer +- type: flavor + id: tortuga + flavorType: Complex + description: flavor-complex-tortuga + - type: flavor id: bluehawaiian flavorType: Complex @@ -859,6 +879,11 @@ flavorType: Complex description: flavor-complex-iced-beer +- type: flavor + id: radler + flavorType: Complex + description: flavor-complex-radler + - type: flavor id: gargleblaster flavorType: Complex @@ -894,6 +919,11 @@ flavorType: Complex description: flavor-complex-atomic-cola +- type: flavor + id: crushdepth + flavorType: Complex + description: flavor-complex-crush-depth + - type: flavor id: cubalibre flavorType: Complex @@ -904,6 +934,31 @@ flavorType: Complex description: flavor-complex-gin-tonic +- type: flavor + id: jackrose + flavorType: Complex + description: flavor-complex-jack-rose + +- type: flavor + id: junglebird + flavorType: Complex + description: flavor-complex-jungle-bird + +- type: flavor + id: kalimotxo + flavorType: Complex + description: flavor-complex-kalimotxo + +- type: flavor + id: vampiro + flavorType: Complex + description: flavor-complex-vampiro + +- type: flavor + id: bronx + flavorType: Complex + description: flavor-complex-bronx + - type: flavor id: screwdriver flavorType: Complex @@ -1049,6 +1104,11 @@ flavorType: Complex description: flavor-complex-mojito +- type: flavor + id: monkeybusiness + flavorType: Complex + description: flavor-complex-monkey-business + - type: flavor id: neurotoxin flavorType: Complex diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index e13b34e5fc..e041e23900 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -473,6 +473,21 @@ metamorphicFillBaseName: fill- metamorphicChangeColor: false +- type: reagent + id: AlienBrainHemorrhage + name: reagent-name-alien-brain-hemorrhage + parent: BaseAlcohol + desc: reagent-desc-alien-brain-hemorrhage + physicalDesc: reagent-physical-desc-creamy + flavor: alienbrainhemorrhage + color: "#FFFDD0" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/alienbrainhemorrhage.rsi + state: icon_empty + metamorphicMaxFillLevels: 5 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: AlliesCocktail name: reagent-name-allies-cocktail @@ -753,6 +768,21 @@ reagent: Ethanol amount: 0.2 +- type: reagent + id: Bronx + name: reagent-name-bronx + parent: BaseAlcohol + desc: reagent-desc-bronx + physicalDesc: reagent-physical-desc-strong-smelling + flavor: bronx + color: "#d68829" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/bronx.rsi + state: icon_empty + metamorphicMaxFillLevels: 4 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: CoconutRum name: reagent-name-coconut-rum @@ -799,6 +829,21 @@ reagent: Ethanol amount: 0.15 +- type: reagent + id: CrushDepth + name: reagent-name-crush-depth + parent: BaseAlcohol + desc: reagent-desc-crush-depth + physicalDesc: reagent-physical-desc-cloudy + flavor: crushdepth + color: "#0a0a33" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/crushdepth.rsi + state: icon_empty + metamorphicMaxFillLevels: 5 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: CubaLibre name: reagent-name-cuba-libre @@ -823,6 +868,21 @@ amount: 0.07 fizziness: 0.2 +- type: reagent + id: DarkandStormy + name: reagent-name-dark-and-stormy + parent: BaseAlcohol + desc: reagent-desc-dark-and-stormy + physicalDesc: reagent-physical-desc-bubbly + flavor: darkandstormy + color: "#cf7f17" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/dark&stormy.rsi + state: icon_empty + metamorphicMaxFillLevels: 5 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: DemonsBlood name: reagent-name-demons-blood @@ -909,6 +969,21 @@ reagent: Ethanol amount: 0.15 +- type: reagent + id: ElectricShark + name: reagent-name-electric-shark + parent: BaseAlcohol + desc: reagent-desc-electric-shark + physicalDesc: reagent-physical-desc-tropical + flavor: electricshark + color: "#3097cf" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/electricshark.rsi + state: icon_empty + metamorphicMaxFillLevels: 5 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: ErikaSurprise name: reagent-name-erika-surprise @@ -1143,6 +1218,51 @@ reagent: Ethanol amount: 0.15 +- type: reagent + id: JackRose + name: reagent-name-jack-rose + parent: BaseAlcohol + desc: reagent-desc-jack-rose + physicalDesc: reagent-physical-desc-tart + flavor: jackrose + color: "#f53b3b" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/jackrose.rsi + state: icon_empty + metamorphicMaxFillLevels: 4 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + +- type: reagent + id: JungleBird + name: reagent-name-jungle-bird + parent: BaseAlcohol + desc: reagent-desc-jungle-bird + physicalDesc: reagent-physical-desc-tropical + flavor: junglebird + color: "#f27c3d" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/junglebird.rsi + state: icon_empty + metamorphicMaxFillLevels: 4 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + +- type: reagent + id: Kalimotxo + name: reagent-name-kalimotxo + parent: BaseAlcohol + desc: reagent-desc-kalimotxo + physicalDesc: reagent-physical-desc-bubbly + flavor: kalimotxo + color: "#360606" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/kalimotxo.rsi + state: icon_empty + metamorphicMaxFillLevels: 5 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: LongIslandIcedTea name: reagent-name-long-island-iced-tea @@ -1282,6 +1402,21 @@ metamorphicChangeColor: false fizziness: 0.3 +- type: reagent + id: MonkeyBusiness + name: reagent-name-monkey-business + parent: BaseAlcohol + desc: reagent-desc-monkey-business + physicalDesc: reagent-physical-desc-tart + flavor: monkeybusiness + color: "#d6b929" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/monkeybusiness.rsi + state: icon_empty + metamorphicMaxFillLevels: 4 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: Moonshine name: reagent-name-moonshine @@ -1426,6 +1561,21 @@ reagent: Ethanol amount: 0.2 +- type: reagent + id: Radler + name: reagent-name-radler + parent: BaseAlcohol + desc: reagent-desc-radler + physicalDesc: reagent-physical-desc-citric + flavor: radler + color: "#edff2b" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/radler.rsi + state: icon_empty + metamorphicMaxFillLevels: 5 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: Sbiten name: reagent-name-sbiten @@ -1656,6 +1806,21 @@ metamorphicFillBaseName: fill- metamorphicChangeColor: false +- type: reagent + id: Vampiro + name: reagent-name-vampiro + parent: BaseAlcohol + desc: reagent-desc-vampiro + physicalDesc: reagent-physical-desc-spicy + flavor: vampiro + color: "#b51b1b" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/vampiro.rsi + state: icon_empty + metamorphicMaxFillLevels: 4 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: VodkaMartini name: reagent-name-vodka-martini diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml index c722c42162..4f65cc0f25 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml @@ -590,3 +590,18 @@ effects: - !type:SatiateThirst factor: 0.6 + +- type: reagent + id: Tortuga + name: reagent-name-tortuga + parent: BaseDrink + desc: reagent-desc-tortuga + physicalDesc: reagent-physical-desc-sweet + flavor: tortuga + color: "#1c8c40" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/tortuga.rsi + state: icon_empty + metamorphicMaxFillLevels: 4 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml index b307166aa8..8cc2da8623 100644 --- a/Resources/Prototypes/Recipes/Reactions/drinks.yml +++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml @@ -8,6 +8,18 @@ products: AcidSpit: 3 +- type: reaction + id: AlienBrainHemorrhage + reactants: + IrishCream: + amount: 1 + BlueCuracao: + amount: 1 + Grenadine: + amount: 1 + products: + AlienBrainHemorrhage: 3 + - type: reaction id: AlliesCocktail requiredMixerCategories: @@ -238,6 +250,20 @@ products: BraveBull: 3 +- type: reaction + id: Bronx + requiredMixerCategories: + - Shake + reactants: + Gin: + amount: 1 + Vermouth: + amount: 1 + JuiceOrange: + amount: 1 + products: + Bronx: 3 + - type: reaction id: CafeLatte reactants: @@ -282,6 +308,16 @@ products: CreamOfCoconut: 3 +- type: reaction + id: CrushDepth + reactants: + RootBeerFloat: + amount: 1 + Rum: + amount: 1 + products: + CrushDepth: 2 + - type: reaction id: CubaLibre reactants: @@ -292,6 +328,16 @@ products: CubaLibre: 3 +- type: reaction + id: DarkandStormy + reactants: + SolDry: + amount: 1 + Rum: + amount: 1 + products: + DarkandStormy: 2 + - type: reaction id: DemonsBlood requiredMixerCategories: @@ -352,6 +398,20 @@ products: DriestMartini: 2 +- type: reaction + id: ElectricShark + requiredMixerCategories: + - Shake + reactants: + DarkandStormy: + amount: 4 + BlueCuracao: + amount: 1 + JuicePineapple: + amount: 1 + products: + ElectricShark: 6 + - type: reaction id: ErikaSurprise requiredMixerCategories: @@ -598,6 +658,48 @@ products: IrishCream: 3 +- type: reaction + id: JackRose + requiredMixerCategories: + - Shake + reactants: + JuiceApple: + amount: 1 + Cognac: + amount: 1 + Grenadine: + amount: 1 + JuiceLemon: + amount: 1 + products: + JackRose: 4 + +- type: reaction + id: JungleBird + requiredMixerCategories: + - Shake + reactants: + Rum: + amount: 3 + JuicePineapple: + amount: 1 + Grenadine: + amount: 1 + JuiceLime: + amount: 1 + products: + JungleBird: 6 + +- type: reaction + id: Kalimotxo + reactants: + Cola: + amount: 1 + Wine: + amount: 1 + products: + Kalimotxo: 2 + - type: reaction id: KiraSpecial requiredMixerCategories: @@ -737,6 +839,22 @@ products: Mojito: 4 +- type: reaction + id: MonkeyBusiness + requiredMixerCategories: + - Shake + reactants: + Gin: + amount: 1 + JuiceOrange: + amount: 1 + Grenadine: + amount: 1 + Absinthe: + amount: 1 + products: + MonkeyBusiness: 4 + - type: reaction id: Moonshine reactants: @@ -838,6 +956,16 @@ products: Posca: 3 +- type: reaction + id: Radler + reactants: + Lemonade: + amount: 1 + Beer: + amount: 1 + products: + Radler: 2 + - type: reaction id: RedMead reactants: @@ -1041,6 +1169,18 @@ products: ThreeMileIsland: 10 +- type: reaction + id: Tortuga + requiredMixerCategories: + - Stir + reactants: + IcedTea: + amount: 1 + Sugar: + amount: 1 + products: + Tortuga: 2 + - type: reaction id: ToxinsSpecial requiredMixerCategories: @@ -1055,6 +1195,22 @@ products: ToxinsSpecial: 5 +- type: reaction + id: Vampiro + requiredMixerCategories: + - Shake + reactants: + TequilaSunrise: + amount: 3 + BloodyMary: + amount: 1 + Hotsauce: + amount: 1 + LemonLime: + amount: 1 + products: + Vampiro: 6 + - type: reaction id: VodkaMartini requiredMixerCategories: @@ -1221,7 +1377,7 @@ amount: 1 products: Cola: 4 - + - type: reaction id: Caipirinha requiredMixerCategories: diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..735ad356e8f8102be77ce99a3853fd430d866847 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}37#&FArbD$ zDG~_>EDn4#?y*WRVR3UtBO2BSY>3|d%DyOg-P0d#2G`f6Yo2^IaSdaR;3Vd%vU82Q zkLFy{n{-w=l6kB2#>IRRyp0zHfCM8yBf}g|9z~&!_(edw7(8A5T-G@yG%+v$0H&ri A0{{R3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c17e37680e7eb5d0601f5ecc7f81e199331008d9 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}lRaG=Ln7Rh zQzQ}&SRD9f++&qs!s6zPL}aub=szF-FMoge{D(JIr}O+XKX0&S+gE0DZKkiKp5Fvc zN;!xflqq=isgmtHx3%QGV_`gdm|Mil4Q_nZQN8J`lFd+gHSg`J|0jHRPJ1kU@D5|4 z!})WT1>0wwz2&;8-Q$|WTemkWm|<2PaAsim{M%G<(cvrpK<6=dy85}Sb4qApU;qHZ Cx>F(m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..1852a05e35d1c3333d22a6efe6b7e4b2ae4ba41d GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}^E_P~Ln7Rh zQzQ}&SRD9f++&qs!s6x(Bihn9{`~m!^#8Z&?~-43$~S3W?v8(Yuw=nLy_0fEk<2HQ zW-#~dtvdFg{xi?v?CAZ1uNs1<pEs_EyK(Y^*|wwvCx)Ahhq|pL-c(JSB(qc{o1yY* z-rH6GPx$Vf_E`Gh9mYb3^XDuJw$C_w%XL$`$2EtyZf{mF!)!m`%)s#bm5-vU@C<RF POBp;}{an^LB{Ts5wg+1Y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..f29fe70e8b484703f9dbe878fbcf169d885938b7 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}8$DedLn7Rh zQzQ}&SRD9f++&qs!s6x(Au`$y^q-IaXJ1{(uvjWE=%eCIXO(P*n_Xua#rK~wW_k5` zQjXk7sRX_ob?@z(?Y=t~Xf)`sGw!l}aAS2k&p-3?279)Bm0rkaQTo%S`FZPHp8RBO zHZ_(BvI={4G#^}-u6Z)ED}`5K{jIgJU*#?Nx5?b+c*fVkTvc|iare=jYkHGxT{f|0 pnJ2l+8b~oMRs<5va!d^Gzs4xKKZ@!FI-bGP)z4*}Q$iC10|5N5S#JOU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..ec670c6cfaeff7d911c313b6b34f8ea340833cda GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dpunnLn7Rh zQzQ}&SRD9f++&qs!s6x(B--LQ{`~m!^#A7R>;+;AytM38D!WvUDnzs2Vf-QExaz%Q z+C&+q9Wn(USKBx**r#{$*~B%B&l=u-e`oxn*q&uM>x8EY4(04J)n9uK{(mOfc70o& z@)gGAdh^pi?Ab8+VQ$XR11$`jm|Mil4Q_nZQML31YJU>Cd+X|d%F|tRkDE8`WPa2z zZ*K8}Jj2;ryHoflu4%m0dn1s&r|m!n2asrJXJDAepQV_5pYt2g9}J$ZelF{r5}E+e CaA_t0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..111507b00b91bac5289f90d63b87bef8738a59c6 GIT binary patch literal 306 zcmV-20nPr2P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px#>`6pHR9Hu2WEfz;IKcKZj5=U61V%%E<Pa#?a`ZpGtlQ&bO_G@;DF#{YqpyOu z=-6`c4g)EUAlU)L6kIfQK#RRT!?TwMaJpmK4MEz5z<@dc<ZVzoz~u;1eGf8^q%?rf z0T;i@GaP;ViKO7C$N}5$-Dl9}eh5wrAj?63?hZKi>KTLo%`*(IZT&{515RB&&)|7s zC&Sy=ih&6MWCsW@?qJyDkVT(Fc<Sd<l!B<`_(m{)KpfDsa}L}wtNiNe69Tv@BvLCP zvdRHiVT7$RAf*z5=_k1)B&IebMa`%KMnhmU1O_|=0ILY1AuWeUk^lez07*qoM6N<$ Ef=#@8GXMYp literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..2e029295f895f606b926e0266bdf6bc0a6426ade GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}(>+}rLn7Rh zQzQ}&SRD9f++&qs!s6!K@I*l4X3-b>eQRz%PWGKNQ$>?4^4;R~P1|4GDEi39tl6h< zlktd1j7h0O_g*_@c71-o_GYKdA65(^e-z{&aj^!~@*DLpF)?`6a8W>lmob9lfmX(g zX}s)r7<Xu?1ZgX6;!=t*NmxC_V<mIKFHb$r&Xv5LfyNNkjg0(^40^>yip@u2)&rf$ O;OXk;vd$@?i2(qj1xc6y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/meta.json new file mode 100644 index 0000000000..fb5566d3dc --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/alienbrainhemorrhage.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7c107128804652f21657ebc95b2db816c4a15502 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}o}Mm_ArbD$ zDG~_>EDn4#?y*WRVR3VY5HH#eOyxTHe?yha^2e4p<rJfpw`y$+WbbJ^kimgMG_*4? ZWJ|FqUOLs=0yLDt)78&qol`;+0{~VgE)@U( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..adaedaca7370bce19821db758370b560e834d9be GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}F`h1tArbD$ zDG~_>EDn4#?y*WRVR3T?6Ae!Ueti6S`v38{SrOg^SEr?`%y!?zHsfr#mdgLbH>_mO tpEPUF>AkY*h?}f|6w_iw6oOffi6K*#Tk-Qdb6%i544$rjF6*2UngBnQGlKvC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..6e3e63da2e3227b50149fa9b4cf00ae7e47ffe80 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ii4<#ArbD$ zDG~_>EDn4#?y*WRVR3T?5^Z4|e}4RV`hRs?>7Lf*F^7XE*|<(hns8RZ-R51$;a412 zr=_dRcHhJ{<7~K=%KyVRtYpuhG;7c4y|U_vo2-Ep(_%#wf?1A<;lHntV(q3!DL{J} PJYD@<);T3KF)#oC5}rJ? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..88d25fbe7b1906c99a36c59a25338a5083b95036 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}g`O^sArbD$ zDG~_>EDn4#?y*WRVR3T?5*}QQ^7HrqslU3qZ~L1`*%e-sW~yk)6|gt#;VU}w*w1v$ z!UeZJ^{DVS@+d|!pLwP&I_ZC6&fLD|DYKooxn+eWE#{NpZM-OeLNM|(GRT~eR7`7d R5C>Y$;OXk;vd$@?2>=e!JL3QV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d56aa94afc20de7cdce913ad653e42c3867db4f4 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dpunnLn7Rh zQzQ}&SRD9f++&qs!s6!Kpr-htXw!%Kk9W4a%=De26cHJ?>FJAlr>AZ&Ywg)4JUwF7 zl)>JhlfUtLdd1b%eb;#>`-B;O`4J(Ut9Ox$y_MM^j=lBJV?Wb13k@zOnMTY}Q*4;W zC)C$+Kz8GSG~Sb9hfRcKSzpAlxpwyN<2pR8yWHcG;V#P*Ylako6M{=v%(qoYmmbLA z=xIA}ft#_$RLL@x$yL!|MV6Xd-4({giUv|l%yLW&cMBsF4J~*&f&O6dboFyt=akR{ E0F&2TFaQ7m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb6c282c0d1b2a230b827e57a79a3bd4a3b26dd GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}+dW+zLn7Rh zQzQ}&SRD9f++&qs!s6!Kpr-htXw!%Kk9W4a%=De26cHJ?>FJAlr>AZ&Ywg)4JUwF7 zl)>JhlfUtL`hy2g53XcS$=v=(txZlod(m0dC`Cg)hE_fg*|RbXn;7CX4lL?W<8$z5 zKQV1Wvf&w<MT;41KQ`)oy%?T&qv#`_XJKC+-%UOR^?e(kE(m1rX*-a?!LwK3K)CXx xAeP`5A)!^%I;Sqz;Of}QGJh9To`E5AX_R7E^DS?n7Z^NU{an^LB{VTG008PBUYP&@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/meta.json new file mode 100644 index 0000000000..52c392be67 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/bronx.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..41520971b16b94b08bd3e5d21f767a7db724413f GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ex5FlArbCx zuPO2|7;rcT3Y@t6f5GGq-Ot7XlV<g|oB2OflM{a~%_`u)z{mn7qL>6<|B2gqCU#$V sT*bjpOq2U_yc?J}6dDdJIlyZ1nM3g*?{rz9$qb&ZelF{r5}Fto0M^?q@&Et; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..aef4008182344559454142041482f91fd201b637 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}37#&FArbCx zuPO2YRkbE^iY+()@K60Sn^m`C`t}DmH0)(7YB)L1sh<1I%qZZ%z{mn58uc5eyson~ zDmM9QQ+hb|jhw=<Pa+YkSMvv%$1r|pnAZPhIs;g-cO!GIzJTJXd8w0ub}@Lm`njxg JN@!wW002@HGSC13 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ef796be59712be512ce087fc215a0d94a4d6836d GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}MV>B>ArbD$ zDG~_>EDn4#?y*WRVR3Ut5DiZR9*AH0)4!hU|BruGo@tYoNThshux5C|p(iJ~X5ojo zr-dikx@>B5e8><M7Pm(6!|(6uAOW@j4xSy%D{f9u)n;*%HIQOjtOz8o@Gvs0+AN_M V(`*_Kw4K4z)z4*}Q$iC10|1X4JYoO< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..9963457a6eb0733a476a0b742651464301b9a5a3 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}?Vc`<ArbD$ zDG~_>EDn4#?y*WRVR3VY5gvSv^7HrqnI5#|U}XE=>f%NfW6vO-O{E8959qJ>DIYKT z@8jRnNj9#Nk|rEwe#bCDc}GRchPFf7_5D4*37nK-Yh{jztlZdk;Qjsio*)4SMS}-? t3(}mYtr3tYJ&?iC(*`60j9D0VIIAfN{ag7H=p+VDS3j3^P6<s63;^OcNo4>4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..5a83559b9ff4cedc2419367fc30c7fc968ae8713 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}OFdm2Ln7Rh zQzQ}&SRD9f++&qs!s6x(B-+wA{`~m!bpMt~wr+~QzI~0HWb3ktZNpQoa~9qow(I*( zN>TIda@@wp#qObb>j6(=dA{C+Cz_K)4m%|{$R5yN@l!rt^xwz7rIT!2CnZfd%KVOD zg7S`vlnrf%fSNtN37nK-Yh{jztlZdk;Qjsio*)4SMS}-?3(}mYtr3tYJ&?iC(*`60 dj9D1$u2?II|1b~&I+(%J)z4*}Q$iC10{}|KSN8w_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..64cdd3eb8c6781642bd7d2aff995c4c067e21357 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}uRL8GLn7Rh zQzQ}&SRD9f++&qs!qOJb5fL5zpZ)2o#qRw=Zw(iTDy3har0afAOtJa#+f<cEp3B~w zm>s75ez7`1ME<IvBhR#{u{^eR*HmVDPD+}v_C`(r8>v}V3~80!d+nOHOtN*;P&qfB zMNIjqph_#l3C4uep>qnSJ?Jd{?bg7&L?pMM&EZnh$}RkjjHL(O+z{DgTJh?U<rZEb zmtl>}3^BnzQ;|(!YgA5tS8(<?)z*BBQJC3wLz~0DU$S2~8yU+Pww>Y-QHj>Ox3HGu z!RiSfE16HM>sxuZN8M5!>>W4fhFgjZ4Cf!@DIRomtq1y=!PC{xWt~$(69WSPL^pG< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..14bad18f6c0909e2680b85c696252411d73542fc GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}=R92;Ln7Rh zQzQ}&SRD9f++&qs!qOJb5fL5zpZ)2o#qRw=Zw(iTDy3har0afAOtJa#+f<cEp3B~w zm>s75ez7`1ME<IvBhR#{u{^eR*HmVDPD+}v_C`(r8>v}V3~80!d+nIn_4&IVJAUNn zViZs~DyY)RaDwrM4tpe55rf9Z#w$PzE7}?K?qAg9<ypa;@RY&K{lF$g&5!&>{Y!Ez zUNtxhGu_Zqp73~E%pT_;L!U6I1L2AjXEB^CV=$flN#!|HR+OC-(_%#fDW(Mi3=F<{ W6BQ3$Doq6XjKR~@&t;ucLK6UhI$!4i literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/meta.json new file mode 100644 index 0000000000..fb5566d3dc --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/crushdepth.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ca76f8d344683bf5a60d5b335e626b2641dd58eb GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}zMd|QArbCx zuWjUIFyLTz+~dCN#6RPdt~ZXqrie|Ny_|i`>NQ;bhyHgna40k|FoB6_4)-tDPrZEW qnr^nHT*9UkQA{ij42&#lta3YoITX)rT=x}dFoUP7pUXO@geCwEpf2bD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..aefd7e17cf61aafb65982a0fb122fd99823b2287 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}>7Fi*ArbD$ zDG~_>EDn4#?y*WRVR3UtAx>~L%Fo~bCw<30#-+N46UCgTMW$pjSvLHAtSiE9a7tog zs#xT#fA*H&<@aiuZ<291+ols4Xz;4xqJRW%<3)i5X&ej;8%;zM?|S7N09wi5>FVdQ J&MBdZ0RWpWHdp`v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d9008407c6178b6715399295a10ffd708698c577 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}jh-%!ArbD$ zDG~_>EDn4#?y*WRVR3Ut5DjYteti6Sx_(*cMGaHS=ud8&&M0{c-(alH3Xm1BXw=z! z;u1>{!{M*I8hj57x)o3BY%*z-Iq>hJSQoQIYR?IyZXMtM^XL5Tzc)oXl5atp^RzV@ n5~T++IC|QEM1V01!$wa9#hWW`r~n<q;OXk;vd$@?iGcwCqeewV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..1216e99cb6f7a61e13182276fa88778bc8174681 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}6FprVLn7Rh zQzQ}&SRD9f++&qs!s6x(BTjHN%Fo~bXMgna)}a2(@AgWkbvBvsa<Ln%?Q-K}-1ek5 zrLs-OcY#2{t>ETY4F@<=X1Y#Oo4_owF5jV$p*@l(GHv2g&L<4t`nLzj9MDL1nHHIn z`Ro6aJM~|d-8oUjU@E;S#r5C{W~hY?vlJN^UM$p8R6b{W80a_#Pgg&ebxsLQ3;@q| BOPl}z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..3f12cd164bcccf0f4e74c56353dd226142327102 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}6FprVLn7Rh zQzQ}&SRD9f++&qs!s6x(CK}cV{P_6u^#9$ZQ5s8kl>JxUbVkYh@(N})R}O=<U2dMt zIVYu0cKK~GX>@AH^ygj0%%nacRV;Fr17E_9eT+vLWzq~&X1Y#Oo4|a-{+?4I!{Q#n z$h3(|U;dw5{Qu(YBIVPJS8`5F5@lV?C&AlzQ9y#1F{_P%!RD5Y;?|4I;XubRc)I$z KtaD0eVgLYSbV}6# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..90cd2bf5705c6815212a47dd6779d0eaa8bf6006 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}r#)R9Ln7Rh zQzQ}&SRD9f++&qs!s6!Kprsh_>E1hg4eRe5a!NOCCYd(qXx%Il$x)Pu2sfI+wWDd~ za{D)GHw9I!8B%uk@8fd&`86m_?5|A2>Mw6TZdAMJtdh;p>d?K{?(khJU6JxL<#Fc> zUNuY<W%60QDDaZQ)C$Sk%M6$2NrkX)XuEWsk>|Sk0*eLDrYhCS9{BfBtc%%8zh?P- z=3TrNhNl)ye9DkhdT?5I`3qrIiLHtzMkh2|9HKneaj&@BBVT$TgQKVIKtnqN!vwuT V#gkJvh5^0B;OXk;vd$@?2>|lbXd?gs literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad26bfc2e465aeebb681fb514f24aadfd2c217f GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}3q4&NLn7Rh zQzQ}&SRD9f++&qs!s6!Kprsh_>E1hg4eRe5a!NOCCYd(qXx%Il$x)Pu2sfI+wWDd~ za{D)GHw9I!8B%uk@8fd&`86m_?5|A2>Mw6TZdAMJtdh;p>d?K{j+tGbzbkISj}^>r z&LE@xI1)Z<#-46uEN9rZE8+A}Yn~EMW{IteTapxx7flG8^qMKl{IR>NffUnXMS};5 a3=GR(mnhEIC&&(TEQ6=3pUXO@geCxPqEEE| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/meta.json new file mode 100644 index 0000000000..fb5566d3dc --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/dark&stormy.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd25a8b79ae661d61ad2eed6002c5ecc5eda16f GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}fu1goArbD$ zDG~_>EDn4#?y*WRVR3UtBO0Cv82Cp2mX9`m_hn7Oq_a#joi{CGEN9p%y-}t8zzSxl ghK5^;3=ET$ITS13hwcCx&fw|l=d#Wzp^1S301X8!!vFvP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..35985ab459435392881fd3126da905fd2eb85cb2 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArbD$ zDG~_>EDn4#?y*WRVR3UtAw2jR<>&AJvwgiq$HhKN%d4|fHaoOUSaZ^*`gMKIT8&+n z2TXEx!`SD{6ZP4YeuAr!v7BM6^u`ocX;WFlR}B{hBzPMy3NSFNStYD!7TX~Tw3Wfr M)z4*}Q$iC10IK{q!2kdN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ed2bbdd376dab6b910fadf6da14717101ac3e7 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Wu7jMArbD$ zDG~_>EDn4#?y*WRVR3Ut5DiZReti6Sx_<gGZi%fwCdx@qI?E*Kv}u{+Lx$g7%@T?Q zMXStD&QsK8IkS2DzvI`s7R_e%xqL0D^uWu=gI_os8Os^AN^eYIl{S?%eARGKK!UgN dq5uQKmlKMLhXNS30$sr1>FVdQ&MBdZ0RR_?LXZFe literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1da7eb096058a2733714c9c53daec994082ef4 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}O`a}}ArbD$ zDG~_>EDn4#?y*WRVR3VY5gvSv^7Hrq`TnZ1C9wT%_7$a@IujICvZX}$3NrUJ2r{`> z<#>GKxv6OIfN#Tkiw;31_2pHU)mhGL-v00SwXQ|8nSCx_ODa9^GV<UT&PK*^hON>Y qQ&^=<Wes07TojPtZM-PJzz}b*uNcAm^e50Y44$rjF6*2Univ3&$3*)8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7ec355bc6790141e3037ff191b8268cbcc4c7e GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}eV#6kArbD$ zDG~_>EDn4#?y*WRVR3T?6Ae!Ueti6Sy8garzJb?=yH~kXX0sZ#r1&-;VvMuxH*iXb zUo3WVo}x7i+Z{%|UU37b2Oj;rf1MHz$R@-W3MjMq`F&mH&oLuC|8M_VQCD;J8Ozol zebsPzbJI&<CgyhxS>{P6xy-VxlCCf=Ry2@eTCB*x@UqZWG3V2vc|eyjc)I$ztaD0e GVgLXU{Ygdu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bddb1cd6a941b840b6263ff9c6c910253fd1aecd GIT binary patch literal 348 zcmV-i0i*tjP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$7D+@wR9Hu2WEfz;IKcKZj5=U61cp}#2<E8%e?R3mNuDBFv4)1me^{2iapMMt zK9J=gd73!@W;w_qK0R|$ijTQF62N>?EeGi#Is`z9OST;SzojIZVaD!*C=Lkhv|&j0 zSisQZV@;BIWI2GCl9LpNkmO=e2(;MiGx$z=gW(Q+{ih5*`YK@YEf?<)9U4@10L)b& zhY;%svK-*m^9UmZj7;CdeSP5Z%m2gM0WOUfFhan>fsuY8FyIcbuRtvaK*3?_DL|hP zIK2G>)}jF90J`LYgPUGpb%4E}1bxZ@d=7xQjHV?ath7T924eF)x;~N$B3OllEe=TW uHL`w^9Y9QFM2ebG2aJZmXb22=2mk=HRiz<{_5Tq70000<MNUMnLSTYq4vPi= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae82dc839db8b1791c717b2e35e35a6bf5ddb02 GIT binary patch literal 339 zcmV-Z0j&OsP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$4M{{nR9Hu2WEfz;IKcKZj5=U61cp}#2<E8%e?R3mNuDBFv4)1me^{2iapMMt zK9J=gd73!@W;w_qK0R|$ijTQF62N>?EeGi#Is`z9OST;SzojIZVaD!*C=Lkhv|&j0 zSisQZV@;BIWI2GCl9LpNkmO=e2(;MiGZ>hfFd(M`Q2c{Jz(-#N?7l4*?+_gtRB-?- zdSIagatN`GAj<(9ygZDc#E2XUpwNK@{ej0X{||o$fPx!26zCoTgTevGj-XozpyzQ| zG=LmHmt26YkbxD?bSVe$IRF*{G%X2XzC<sQiOu)u`ba8>&`UgI!$|QpvOba>Kul#s likeXejE2By2n=`#005rE$sxZeKfeF~002ovPDHLkV1kC6f!P26 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/meta.json new file mode 100644 index 0000000000..fb5566d3dc --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/electricshark.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e91fcca8dc7535b778b871355d30aee7a65fc47c GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}o}Mm_ArbD$ zDG~_>EDn4#?y*WRVR3VY5E<<UG~@68->~aQ&gZmEHqO)3vceJ;^GWbFUKBtf82K3) ZqWM@9C10}30S#sFboFyt=akUI0070bD53xW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b07b1de3ac058a1f3a5c95d600d66805d4710cd GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}k)AG&ArbD$ zDG~_>EDn4#?y*WRVR3T?6Af<!EaXML$nTXfkJ;Xr^4a5BL(WUh`1l>lXUy`|PU~zk p3Ea#iU3wscqo)mp;HltXU|3?$p(uUfh6d0Q22WQ%mvv4FO#s(hF~I-; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..58ac6675e5325b7284cadf757cc9218e89ce09aa GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}*`6+rArbD$ zDG~_>EDn4#?y*WRVR3T?5^ZT5e}4RV`v2|{mo=>`zP-AtQrV?)^n}?wey(5r@0bpk zzV<NdPvJc=ZQiG^t=5NfKBsLuqvS1Ys=XnQy{GL!1_uh!(9XcXcaC52l8NCzptTI1 Lu6{1-oD!M<egHy# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..7d452d93148e17528b4381f84dd26892487fde10 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}wVp1HArbD$ zDG~_>EDn4#?y*WRVR3T?5+}GC<>&AJQ$J;1+g6_7=xseJ#-2eun+2aV?Dp)8kX^91 z%G5J$(h`ZA$38nc{=XQTup>|Q<g<xu7;jz*-nXy7eMas*pJ|aPnTyg`&0aNJ6p-L; dL?J#10G;wlOi@xGupQ_S22WQ%mvv4FO#tq@L|y;@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b89e6ffd222e7d09b80eaa0a65220bbf361f542f GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}w>@1PLn7Rh zQzQ}&SRD9f++&qs!qOJc@yFBS$N5bOjE@_c+5cHvSO|PkaAaMQ7CeF3p~|68!A(D~ zYXYy<%_5N;M!g4zKhHjxc93a<iD93@X-3^|zj*pDUEZ)OF)YN)xxe4^;xnPO0%_73 zEDn4-W>4w3%J}&)cgAam32PPHUCzHgT5#aflB7vG?2-;e9186&H_q_wP!3xfJ|V}_ zm9L?-rGFpS;c4CFCpOJVVm~0`=(WhX-+a?z21_kBSpz91Wn-2Np<Yi~SdQMDFhfgx n{;WXup0)!S96fCe3@@KXDE?IRvH*IM!PC{xWt~$(69WSPvM+0s literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..5607707f40409addb7df676210e1a967c7a25ceb GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}XFOdTLn7Rh zQzQ}&SRD9f++&qs!qOJc@yFBS$N5bOjE@_c+5cHvSO|PkaAaMQ7CeF3p~|68!A(D~ zYXYy<%_5N;M!g4zKhHjxc93a<iD93@X-3^|zj$Q!*ho}49^ChoTidz6-}K@$p|t|f zk^?vriWzjyIes!JWjLYuV%mgk%M&`2oEa=t9PE}JDe978;O3OC6>ZZMe?LLw{Rz$) zZv-6pIg>WYn3*o-li+Q<D4<}?vLV!KiO9hXI-c8@Pn`Y!;+LDOffUnXMIga&p*cfw W=XK>9Kz}iKy85}Sb4qApU;qGHVPJ*; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/meta.json new file mode 100644 index 0000000000..52c392be67 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/jackrose.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..85821df5d9a0f0424404ef1963c28c0845790b1c GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}k)AG&ArbD$ zDG~_>EDn4#?y*WRVR3UtAx>~LzCJtc|3=dklkEP<IdUhZ9K`0YH$D1_;qbG|Dzn`; pv1OS*bdxoZVp^;SAs#3)F!cTAP~18}XAjU422WQ%mvv4FO#q*bF*5)F literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..44e1ca3e35abd0e0db21bfac8615614b98c56eb2 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}6`n4RArbD$ zDG~_>EDn4#?y*WRVR3Ut5DjYteti6S`hWW5Si`KMrK=vR%y!?zHesy-yUna8Z4Vi? zzDkCQT%WD`KRNqE#<feDEa$GzN-Awg{G2(-)@2i0mia?BSpzAi#flK(fg%ILQbRFC WMh_=<pc@!GUHx3vIVChPFaQAL$w4gu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..802d422c3f00b959d6e4b0359b49ca9a54bdbfc3 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}<(@8%ArbD$ zDG~_>EDn4#?y*WRVR3VY5p8K4e}4RV`hWAubrPa0gRT}%vUS<SHeqe^A;x~Sorx_C zQC|(ALf2>O{!h+6k#X&kCfB*^vyw_15<h2x<+98ly2%<yF)dbv5Dyd?7=GK!DsD8( Rbpbko!PC{xWt~$(6987GLL~qI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..5c57ae9737992dcb1d783932e175ddbf19fca5d8 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}<(@8%ArbD$ zDG~_>EDn4#?y*WRVR3VY5E*R;`p?Jzv!DH@E3j81R95|_vr0C@O{-T8j)F}6YC98` zFm8R7tm3YDQp#alT>iE{{c9B$M|v-Jsn~Z-WHmF-Z2!q`6epPm?B+Co)o@Wjg0~S& cF!D1p*z#*DYJ3eS2Rebl)78&qol`;+06`}{NdN!< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b63c467af23000ef8060319e03695c560363edbc GIT binary patch literal 300 zcmV+{0n`48P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px#<w-<AR9Hu2WEfz;IKcKZj5=U61V%%EtPt3`MfbnA&t<H7HOrO$U+=s}w7Enp zgq0T{%gxMq7(~U6W9TK-a*&xMIRIukNMq-z9*i<<>)}`iQhZOc175$f{139Y+^mG* z>dy@*4#=Eh$>43fn4!nVnj}w=q!?sl$(E!4@fF{6aX^c`KEt!gt{Co^rq@HC5Eym9 zpa_9SliV=Uz%2c4`lNy6^Ceg_!dyc-CBo>F1y~)h)O-ScLcm8~1*-$LT)abj2jDA= yNG*g&E{bW<fF-#ornVzS9WWXKqaiRF0svIXY9Wq>n4tgw002ovPDHLkV1fX6;C+w) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..c21ad2a11e4cfac6f16ffa476d5dab7dc84f1e57 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}r#xL8Ln7Rh zQzQ}&SRD9f++&qs!s6!Kutwm<F4yn-x1Ud4Q)PO3>c9B+d)&9|bkS~^Dz0$)?3oG) zm!o~jFI2A<O_-@-$&hC0k^Fq6T#r%C>xU6+K{fuHnB(?u`oq6z$DK7T4_}?<)!;iZ zC+Xya+}$%49zQ-y#ed=wiIn7%(-!~#D0;u7(4l*;9W%Q=f7@fnKIzf}85|c>SqdVZ zw!2t7;QMef{9u$w&d!SVZ>)m*4s~4lp}tdNnJe?OCyQp>>XQJe?r8%O3=HjhIf_N@ T7u12iV(@hJb6Mw<(8K@$N62uS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/meta.json new file mode 100644 index 0000000000..52c392be67 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/junglebird.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a48cfa933c18b3ed6eff97b6280b254e69bdb26b GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ah@)YArbCx zuWjT#pupo2Xw7pV;HJ5>fk>%{%teJ)!jopdzxVBB=<{hd^ZwlDXkcLCPyiDOoOj|D z{YtexmQ|u__j1}66XrLuMQxSGwC_%u<|h`(1XA^q$^LK<x8gfbnb|;_7(8A5T-G@y HG%)}G#T_;S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a41f789084b5370ba6dd575d5451268dad87fa37 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}`JOJ0ArbCx zuNiVR81S?{bSbaaaDRVGx<cckqrmJ%0WV~Z=+u8V(ZByCq-j3edvPX(1_mY$5TVyt zY@ajp((Tkqe48RCUd_86ziy$OLw3l1wi%^c$|@ro_IcYS7VV6gwQiw)w+^F#14Cm$ cBiFZEGK#5hUUvemX7F_Nb6Mw<(8Rz10A&h4g8%>k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..dba0ef177097e331d2f95d6edcd869f070390e7d GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}g`O^sArbD$ zDG~_>EDn4#?y*WRVR3Ut5DjYteti6Sx<22oZpy5h_y6~&%ygZ$%<(Bhots))|NsAn zJ!=FC(o+8Mf40<7ykN@Wz~|uCsBnDE@9(qMd~unkmSvXWE^8pgv{(^HFv~G9ygi_$ UDD(gN0ifj!p00i_>zopr0Bxc_KL7v# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..47ddc76e44f92771e256aca6904fe4f31d538438 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}HJ&bxArbD$ zDG~_>EDn4#?y*WRVR3VY5hu7B<>&AJ^ZnUl_m#)L{rm4dEixt3shq)HS@`g-`u!)3 zx^;Y;^;jGV4HE(xxc>G3|Ia&zIYD#cI>iTPPW+L7_L;Gmp-65?wcdg>=V@zlEM7HS k6p-L;yeP0BjRWYC^A?ItN_rQ7?qKkA^>bP0l+eTg0M8FZZ~y=R literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba296aae22579afd8f9dfd8108d989b326ddd13 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}-JULvArbCx zrx|iJ81T3X-_@OW@}hKwNB)C_F6@pus?Ofe73z-Mw>^7WnKO{lp7psn(**|J3kS@3 zWp2+qrZ+`ZYRg2+dFzs59N7$7<F1KtADN_gJ$~JSTMeQ43I+{p7`PZ-Htym)%XEc7 z<iUJji;UStPbX*^H2j)YQ_D5aCM9<E1O^iaW|I#~8l{<*2P>}Gu+{|VECx?kKbLh* H2~7+D7SBkh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..237652ba749f8bfe03d9a428f817a69643f76d44 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}w>@1PLn7Rh zQzQ}&SRD9f++&qs!s6!Kutq@RX3-b>s&8wHblA8#3+F4G^qC~mtiurbZt?o2r2X?I z*faA7t3<pxz5l6-Ws?s31Fb!`=A6H9oKg4NFP?ife+tS!7#kUC<XRnI=wjRD!gzu) z@J|zu{Qv*W)`to{E4InWXHRmTlES;dq(O#B;eNA>Q378B>%j&qhG}eUDqL)?91Svt z34sPi!VfFst=VRrXIJ5EkZIs~F^~I#w(^AJZ83YC=T8y{Q(hGA@nj04g0Y8Q*UGy+ m@}&ndIC|O+G_*4?SbV8c6l6SW4D=?0r>mdKI;Vst1_l7eVP`i0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..e2caac82a4273abf72f2612b434fc215e002d273 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ydu{YLn7Rh zQzQ}&SRD9f++&qs!s6!Kutq@RX3-b>s&8wHblA8#3+F4G^qC~mtiurbZt?o2r2X?I z*faA7t3<pxz5l6-Ws?s31Fb!`=A6H9oKg4NFCLjaHX42Gtvni1FN9ck$Xs}w>|4|^ zX$|9(%Yp1YZ3i+qcq%v&PQPF9#&dg7!U5TaILXFWZMx#`4KAp%B$z5ywYu~@RWSC@ m>sooYN4^xO9;m6Ioq@qstWq&JK-L84a0X9TKbLh*2~7YO%UH7j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/meta.json new file mode 100644 index 0000000000..fb5566d3dc --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/kalimotxo.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdd9db4c40b2e933c12bee4103ee96fd860fa70 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}9-c0aArbD$ zDG~_>EDn4#?y*WRVR3VY5gJ^L{{PnfPn;@w|JdD>nXc2+vaT&y%qPLycu@eEU}T8s YU{U<>FLfr+Oa@O^KbLh*2~7+P0K)4klK=n! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e1fd43182e9305daa0bcc205676dd62fb1a75f6c GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}QJyZ2ArbD$ zDG~_>EDn4#?y*WRVR3VY5HH#e^q-Ia_rIUpZKapR_4g__omH|Owtbwu|8>2@{QSpx to6abC3!7$N2xRYRJCMPFOfWDkUC*sJai@1b&=v+yS3j3^P6<s63;?skH_!k8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..8b802c67fb2210653ed0e3978025fa34b1daa44a GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ii4<#ArbD$ zDG~_>EDn4#?y*WRVR3T?6Afzweti6Sy8c^Bz?!8Nk8izIndvzxDMi|`?}xm2&m)d= zU#&gO`crsMnALqM|I7dQbM77AX^|<Ji_&<lUNu}4kl<}ZCKwnt@CYi-G*1lx+RNbS N>gTe~DWQph0RTm(J|_SG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea71b97025703ca6bd8f38deb8a8a7952a6f18e GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}`JOJ0ArbD$ zDG~_>EDn4#?y*WRVR3T?5^ZT5e}4RVYG3W7am{H;;oGuFHm;MBX7n<@W0>IV(Dy@L zyhn&@&g=3?Zxkn)D%}2Y^8Q!*p7Yxa%_Gw$F72FU`eFq$*c@bnf#JY3amB^HQzL;^ QGkCiCxvX<aXkuUh0Ge4oJ^%m! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..842091e98d50d9bb97a9fdb5aa1cae959048a0d5 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}3q4&NLn7Rh zQzQ}&SRD9f++&qs!s6x(Bu;QOPSSP%|5)olRm~btqsb~q6}%m%ZNKr_c!PRNQmJ!h z5-+o6pF|a(17GX^!h;$M17^p#PkQe-%af0BM(=_ZD`wwiD0c|XVm>)7_z6RV$B!4Q z4RUr?wCkMKEMqt$xJ1S3%M|Z25e4_7E0}>6Iyf;z*E;k$Yn)@9vTc>Stbr8MVnraq Y;5x-cQSW{+2hgz$p00i_>zopr0L!XRH~;_u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ea020e72a8f8e495bc29126bfca946ea17ea72ac GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}y`C<PArbD$ zDG~_>EDn4#?y*WRVR3T?5+}GCC+WKXf2?(&s%DL+(PWjQ3f_*>w%>SdT=3yj!d31` z>PH2g&olmTY7DvGd`8KVC84lCPttN)@Dqjzj~_2q8|3V)Xm6ZS;qG@JrJZ5j1cj|t z@}&ndIC$;~90-%2Fj-WSk1=So?5<yd>^*Hj@t!sYhVwS=iXWLoUIQJ*;OXk;vd$@? HiGcwCF#1cv literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/meta.json new file mode 100644 index 0000000000..52c392be67 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/monkeybusiness.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..030a2ea9267f6c18861a995d413716510a62f592 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}9-c0aArbD$ zDG~_>EDn4#?y*WRVR3UtAvCxeqxtXrZ<aF2;<7$z)}GUQCCjrHRUt#*6&A%kR_U97 RW-@rX`njxgN@!wW0092BCaVAd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e942dc85e7c03f31d929076fed1453f799a963 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}@t!V@ArbD$ zDG~_>EDn4#?y*WRVR3Ut5DjYtDn6WfZoe%n#xaZg<g<xu7}GwkWq+s97Z7~Ib6R9d rrc*h~&S}kO7M@_dlHuEns-NN62OdTDofl$(Rxx<G`njxgN@xNAVLdgq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c94a2809b0ca85d5790571d371250df304da2647 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}jh-%!ArbD$ zDG~_>EDn4#?y*WRVR3VY5hu7B<>&AJQ~zIEX0hC4k$Ya7Dpj%>ZgLeJ=sqtf!51*$ zmJ>we*Mpho>vOJJ+?8S2^yeCLxrqA;%{MBijZ-q4e#$-LDAHx0={%8n#l=}tr3W%N gdfH$F1B32jDMizp{&RtjVeoYIb6Mw<(8Rz10L%kLivR!s literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..9e44a208229f4813566b9ef876cf818b654ed261 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}jh-%!ArbD$ zDG~_>EDn4#?y*WRVR3T?6Afzweti6S`v3R+hYY<6Js+-BneD!bZNl2cd<?Azy3Y$r z1TIk6+WJI5HIn(nHTLs0|B_c9d-;rE!qe??I~H3w`6jAI&QtUjKJ(qceL}Y737IY# nhu&*fRxm@22iw8GFiBQJkxTc+H=tt}JYD@<);T3KF)#oCE*nPY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..72396bb28af79ef0a60c3598fde2964551168d84 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}{hlt4ArbD$ zDG~_>EDn4#?y*WRVR3T?5+}GC<>&AJ^Z#4EvYVvZ5qaNDl`7c`H?1^eKKu)}aO3dc z%2&PVtdiZ(dSC@}TutAB4kp%>x+?7&C#4*=*;PFIEFW#^XU^WBv;XS>*`tD4T-GN) z@kGu_*w=2^6m#0~S-=y9tS!sjWDTU47AwLC24x2`#gyNEmw`@W@O1TaS?83{1OSe~ BM@s+z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dead0ec31d1161317682f58cc8b398b2eb6c9722 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}M?GB}Ln7Rh zQzQ}&SRD9f++&qs!qS$;F(t?HmwfcQmmfE(-E>yTW{7;Zczu)U_q?4I?TsPs6P_~E zq_W4#Tu54f{=?h*Zan2%WWyHtbMSDn@A)s<C&;w-`05wpOpEy{K3Xy<b1j>*dWpZt z6N#<KXFE#@8BU}HBu-g&x#dwuWcVwOZ?-2GCUGmxSbL&R;d)V*EQ9u>lbTJ5a*Eb0 z34x4@Jay|PKF+(sxLDDlh~q&P??EB4m7J4O*aLPe8^3C}C?N4cfPq1EW2K^=M7<Kw OLkym-elF{r5}E*)D`O=9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..efa22b2808f89c501bde22e9c92ba83fb1154162 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}3q4&NLn7Rh zQzQ}&SRD9f++&qs!qS$;F(t?HmwfcQmmfE(-E>yTW{7;Zczu)U_q?4I?TsPs6P_~E zq_W4#Tu54f{=mW0%?~RAUVwGFxp6%Bq#9eqxPs?EnxN&h<}*q=6`DkyPKZs)wmiz$ zAbRqN$U%et39?KZRxn&#vaIIGqM9p=ixnM;I38s29uyK=$vG*7Jz%%8@vDZ50umnt a7#LPdl_?(MTeK4BSO!m5KbLh*2~7YY+Ew=e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/meta.json new file mode 100644 index 0000000000..fb5566d3dc --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/radler.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb13c4fcbe24a7776060e562901b17328f30293 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}VV*9IArbD$ zDG~_>EDn4#?y*WRVR3UtA==_NJi?;?9KYUGb+4*P#ed=wiL{LsjfP?Fd*&2OOZn_^ i&Ec)tlNHPeZ4B|pITRnBX6yvoz~JfX=d#Wzp$PyFqA<t+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2b64762c11e6f56de945e1c416dead7c9ce2b255 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}4W2HJArbD$ zDG~_>EDn4#?y*WRVR3UtB3`r}=szF-Py73BV}qK1hYuV$&6MeP;Kuy_1~zZ)JSQ#p z2;$kq{iZ=Jea>5nS=J7lZauQ!7k1_IHDQ&?E|sGO-AB25Hd;M;+Ok<?w)-ZwtnG^K ivIbI2ixt5H1A}CRjN*6qo%4ZiVeoYIb6Mw<&;$TBibrMu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6334a476cae601e4b30b2f92ed34cbef9ed4867 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}J)SO(ArbD$ zDG~_>EDn4#?y*WRVR3VY5p7`{e}4RVy1!_$@j<RHncqDZ*}83Unz1&){mbs;@*~gf zd6q=*8MV}~*Zezt;J|67LXI9^bM^<FY_r-MQnntgujzbH`I>W*(^QqC2Hi)wdp24< xdfKvCWw!e!wx-Ai7uLmm61<HU1;7LY!$Afe#qN#Whk)*4@O1TaS?83{1OVB6O&S0I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..dda1d511aa0c593e62a39a2e80f55649b2391ec1 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}t2|vCLn7Rh zQzQ}&SRD9f++&qs!s6x(Au?JI^q-Iax7zRfvFO@A)qk5GW`6fvWb3xYX~NnQd<>CC zR8BFL@mS4X#ut!Rq!!V5=?vqBfPi=9$KQ3FulL}po1m!T%Gkwh_dhY=L29D~%dus% znLoHNYaa9u<M0TJ{&Rdf$Gq+H6f{FTgLpPa>^UH@S~<?o!h2JtO18obR*w*aR}B{h fBzPM^1S12RuA5>&#Q7CKS2K9J`njxgN@xNAxBOOk literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0902145f2bc58ba017e40209d100e69a44139b5e GIT binary patch literal 363 zcmV-x0hIoUP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$BS}O-R9Hu2WEfz;IKcKZj5=U61V%%E=n$~8xBq|W;6a?~^&0g5gR=CchKod- z2~tnAVnPl88AgsHh;{(T0+1ujO51RjUAxX?F}RsbV*t^_h6K?LDA{uK|EcaOhNdN} za5^Awt{cOo<XsF~F5Y42@v$b#Y@!r_Yy>%glwzAE4rsC0XHcE)jn^IjUjJZ-wC|%$ z2p~HEWD%1n2iP&_Y??YixyhMeOwhyuuyg<l1?7Hs?2h>Shos;qsT{y?z~?^<47@B5 zhrrl$a{!)bASL+83W24^i}9v`Xv<!ra{$Q>fJMXNJ$YCi5$iIEB+JQmfRDZkRtJz$ z0>TU+x+Fxl5m%{5Z0Uz=7FiA;SP+n)VAKJlAut*OqagqQZN-8ityJjV00000NkvXX Ju0mjf006EXmCyhH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..433a627e84f4bd0024ed77939c157b73ee73e63f GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}pFLe1Ln7Rh zQzQ}&SRD9f++&qs!s6!K@Iqk2=I#IMUp#P}^XjYAm;cS1zASC)cA3o?<i91!iH||j ztxvh5jNt^+1m!bcw+p7l?mm}dxMQYIGQ-6qZ7di0G;S7s`M>g=R@*Yw)df}x`Rk+) zFL@Hn6RmeI@x{lDYNv7*i8SW0ST;;anyto{vGIC(!RL=@2c}CT_Q~$!d+^|CqRJFy zhl{RX1sYg&7iK6NEt+(SF@^mBck9FV3{Q3(ohFtc#q=VQ=Pu)tD8C}92FnBP@vPZ1 zUA#Csj2m7|61eFWvs7tgB>zpFO)?H%6Ma11u3&a^278Tx;mU)_iefioW&*v>;OXk; Lvd$@?iGcwCMHGF@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/meta.json new file mode 100644 index 0000000000..52c392be67 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/tortuga.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..596d98eef14f83c04bdc345afb9e79db9dedad5e GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArbD$ zDG~_>EDn4#?y*WRVR3UtA==V7-gI93r+@D3sSlrC=NB|{9V?5hnwr8taSdb2!>1<A z{}oO<iq-%9+ut~QD(4%CU6u{A-g<0uO1Q$fSkXX=2}rDQVqge-Dz2EmyCDK-D}$%2 LpUXO@geC?6<#9b> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3f32db5e19d9c288bd8d62e68c41b974917726 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}eV#6kArbD$ zDG~_>EDn4#?y*WRVR3UtB3`r}=szF-FaE^lqz7rKNfkf8nm1dRYahOT|Nn!U=}W^s zKZ$sDCH79Yy?E<?qFDXUui`p9k6xeK<*=zzC7U6Vt(ZZBC1G0gjU~V2mQ2@SkMT49 z;oti}{Wjy39QR40OpEy>cpEPY0Et9VCI;66Lq#pi<I{mIWAJqKb6Mw<(8K@$4sJ~T literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..50afc916780bd97bb929916f07fcdbfe5121d4b4 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}D?D8sLn7Rh zQzQ}&SRD9f++&qs!s6x(BiiCP{`~m!^na_3Hd|hpTHEya`eyCm!n`m8X_wdMb~#L1 z?h(YZiRW2^{{DYPA2t{^%YOR$-JVTg{yM&fR)!Nn6POcfrY{Zm{3PPpmDoGo_TsJo ziDJz)eBEq8&GJk7mDm?7XAG+K-^Q%BT=Gx5s+CvM{2cax&9a_hA_$kXg>o=3G|%=^ WTzHbb2Iyu6Pgg&ebxsLQ3=9A=nNu+U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..a47a7fd0a99dff9d9f4e5c6a3e966afa76c6a799 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S3O-ELn7Rh zQzQ}&SRD9f++&qs!s6x(Au?JI^q-IaCx6l)UEq0I>W^Q)<quDfuRr((NF2_TGfQLZ z{yDwlo5V#f$Eji`7`J!l9uR9{*yQXWc35VK^=qb!&xF<rgk?9$6e^zYYMecl^Qhv6 z0EMGP6K1AZGdzi&u-=i+v5#+;C4(5#hKz=fvD4yIPX?=Kwz(djm+|)hiI4o={7Zh# zTcg2{*<{IJY1niF$jf1m@iYFx?_ILshr0QXlVuF1w<o47Z46}ZX*-a?0VFnXF*1}g Yl_;(|A?^kAAcLo?pUXO@geC?C0DGKmng9R* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f99adfbb1a17914e837bdd7f00a0bbfaa774301a GIT binary patch literal 354 zcmV-o0iFJdP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$97#k$R9Hu2WEfz;IKcKZj5=U61V%$(XoP^HqvQYm`}fntu|yjRa)fbl3sL1( zkB>Fc<`S*2WXsY2XM1ZH>KCmb=!h*B?=TSS2$CE?&}JkBG;u(Sy*|T{408r?ZdQh` zzyC3O`Slmfe);t`oaSL;W>^zEoi-r=a=`6k8?c2Sfb0;E#V`jg^qWe32Y@UDr2~*7 zF63D;aI-R@I0P07q*x9zljt;n?f{T)LB0k#1UWkB<^Wg-z@h=h-w`>B=-?+g1Yn`y zu{;eW{$c5XRNqtV0OZ67Vw387vK<h=DI1>kK=Ds*@RRKTAAJ?9WfCbRAj|-gasf;e zC_7?v0kNeYvR<+rKuVEJNbRTtMnhmU1V%#u03KVTA)ul?FaQ7m07*qoM6N<$f*Q4n Ah5!Hn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..5c537f1f7de10f2b0d715f507812f5981eb69912 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}cRgJkLn7Rh zQzQ}&SRD9f++&qs!s6zfkkQhxc=6-^e}8|!d}O1GG*?keVIg<m)3E-2(~Hl9)^12S zeer*Kb+*JS@wEysI&{U~8wkASm?YzHAx(wVq|l*zuU+%<`TEQYzc6s=&a!N1p58t& zV9}CJW`~8`MiL@iKV%%co+=o3`Z2%YWB9nSl_gfT;jExZDT9v41z`yt6_2fRo@g9+ z$`Ikvz@?QGY_D^C(iAqfUgnxFp&O=oE}7Dh(hgL*VQ0gY2kP3q6M|%f7f*X);?T2j m$qLER0~s7WZ3i0K85nBXD->Hpie3Xf%HZkh=d#Wzp$Pz-Gj0d~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/meta.json new file mode 100644 index 0000000000..52c392be67 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/vampiro.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": + { + "x": 32, + "y": 32 + }, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by SharkSnake98 on Github", + "states": + [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + } + ] +} From 5fad0e074577aeeb517d8ed1e4507c898dabba5d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 05:13:17 +0000 Subject: [PATCH 351/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index dff89adf6a..3b4056937c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: lzk228 - changes: - - message: Now you are allowed to paint multiple airlocks with the spray painter. - Along with that you can cancel the doafter by clicking on the door you are painting. - type: Tweak - id: 7752 - time: '2024-12-24T02:25:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34001 - author: ArtisticRoomba changes: - message: Reinforced tables now require welding to construct and deconstruct. @@ -3916,3 +3908,10 @@ id: 8252 time: '2025-04-19T01:48:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33835 +- author: SharkSnake98 + changes: + - message: Added 12 new, varied drinks for the bartender to mix during shifts. + type: Add + id: 8253 + time: '2025-04-19T05:12:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36287 From 34cc49c175457710c5b025ba71582a7c8cbdc1fc Mon Sep 17 00:00:00 2001 From: Ko4ergaPunk <62609550+Ko4ergaPunk@users.noreply.github.com> Date: Sat, 19 Apr 2025 08:14:50 +0300 Subject: [PATCH 352/622] Add new color turtlenecks in WinterDrobe (#32920) --- .../Inventories/winterdrobe.yml | 32 ++ .../Clothing/Uniforms/color_turtlenecks.yml | 491 ++++++++++++++++++ .../Uniforms/color_turtlenecks_skirt.yml | 491 ++++++++++++++++++ .../equipped-INNERCLOTHING.png | Bin 0 -> 5396 bytes .../Jumpskirt/color_turtle.rsi/icon.png | Bin 0 -> 4869 bytes .../color_turtle.rsi/inhand-left.png | Bin 0 -> 5079 bytes .../color_turtle.rsi/inhand-right.png | Bin 0 -> 5142 bytes .../Jumpskirt/color_turtle.rsi/meta.json | 41 ++ .../skirt-equipped-INNERCLOTHING.png | Bin 0 -> 3034 bytes .../Jumpskirt/color_turtle.rsi/skirt-icon.png | Bin 0 -> 2835 bytes .../color_turtle.rsi/skirt-inhand-left.png | Bin 0 -> 5269 bytes .../color_turtle.rsi/skirt-inhand-right.png | Bin 0 -> 5401 bytes .../equipped-INNERCLOTHING.png | Bin 0 -> 5396 bytes .../Jumpsuit/color_turtle.rsi/icon.png | Bin 0 -> 4869 bytes .../Jumpsuit/color_turtle.rsi/inhand-left.png | Bin 0 -> 5079 bytes .../color_turtle.rsi/inhand-right.png | Bin 0 -> 5142 bytes .../Jumpsuit/color_turtle.rsi/meta.json | 41 ++ .../trousers-equipped-INNERCLOTHING.png | Bin 0 -> 5305 bytes .../color_turtle.rsi/trousers-icon.png | Bin 0 -> 5127 bytes .../color_turtle.rsi/trousers-inhand-left.png | Bin 0 -> 5243 bytes .../trousers-inhand-right.png | Bin 0 -> 5375 bytes 21 files changed, 1096 insertions(+) create mode 100644 Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml create mode 100644 Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-right.png diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml index 0f8c73dac3..8909fb163f 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml @@ -18,6 +18,38 @@ ClothingOuterCoatBomber: 3 ClothingHeadHatSantahat: 2 ClothingHeadHatXmasCrown: 2 + ClothingUniformTurtleneckColorWhite: 2 + ClothingUniformTurtleneckColorGrey: 2 + ClothingUniformTurtleneckColorBlack: 2 + ClothingUniformTurtleneckColorBlue: 2 + ClothingUniformTurtleneckColorDarkBlue: 2 + ClothingUniformTurtleneckColorTeal: 2 + ClothingUniformTurtleneckColorGreen: 2 + ClothingUniformTurtleneckColorDarkGreen: 2 + ClothingUniformTurtleneckColorOrange: 2 + ClothingUniformTurtleneckColorPink: 2 + ClothingUniformTurtleneckColorRed: 2 + ClothingUniformTurtleneckColorYellow: 2 + ClothingUniformTurtleneckColorPurple: 2 + ClothingUniformTurtleneckColorLightBrown: 2 + ClothingUniformTurtleneckColorBrown: 2 + ClothingUniformTurtleneckColorMaroon: 2 + ClothingUniformTurtleneckSkirtColorWhite: 2 + ClothingUniformTurtleneckSkirtColorGrey: 2 + ClothingUniformTurtleneckSkirtColorBlack: 2 + ClothingUniformTurtleneckSkirtColorBlue: 2 + ClothingUniformTurtleneckSkirtColorDarkBlue: 2 + ClothingUniformTurtleneckSkirtColorTeal: 2 + ClothingUniformTurtleneckSkirtColorGreen: 2 + ClothingUniformTurtleneckSkirtColorDarkGreen: 2 + ClothingUniformTurtleneckSkirtColorOrange: 2 + ClothingUniformTurtleneckSkirtColorPink: 2 + ClothingUniformTurtleneckSkirtColorRed: 2 + ClothingUniformTurtleneckSkirtColorYellow: 2 + ClothingUniformTurtleneckSkirtColorPurple: 2 + ClothingUniformTurtleneckSkirtColorLightBrown: 2 + ClothingUniformTurtleneckSkirtColorBrown: 2 + ClothingUniformTurtleneckSkirtColorMaroon: 2 emaggedInventory: ClothingNeckScarfStripedSyndieGreen: 3 diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml new file mode 100644 index 0000000000..81d9801482 --- /dev/null +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml @@ -0,0 +1,491 @@ +# White Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorWhite + name: white turtleneck + description: A generic white turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + - state: trousers-inhand-left + right: + - state: inhand-right + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + - state: trousers-equipped-INNERCLOTHING + +# Grey Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorGrey + name: grey turtleneck + description: A tasteful grey turtleneck that reminds you of the good old days. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#b3b3b3" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#b3b3b3" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#b3b3b3" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#b3b3b3" + - state: trousers-equipped-INNERCLOTHING + +# Black Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorBlack + name: black turtleneck + description: A generic black turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#3f3f3f" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3f3f3f" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#3f3f3f" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3f3f3f" + - state: trousers-equipped-INNERCLOTHING + +# Blue Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorBlue + name: blue turtleneck + description: A generic blue turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#52aecc" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#52aecc" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#52aecc" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#52aecc" + - state: trousers-equipped-INNERCLOTHING + +# Dark Blue Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorDarkBlue + name: dark blue turtleneck + description: A generic dark blue turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#3285ba" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3285ba" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#3285ba" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3285ba" + - state: trousers-equipped-INNERCLOTHING + +# Teal Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorTeal + name: teal turtleneck + description: A generic teal turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#77f3b7" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#77f3b7" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#77f3b7" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#77f3b7" + - state: trousers-equipped-INNERCLOTHING + +# Green Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorGreen + name: green turtleneck + description: A generic green turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#9ed63a" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9ed63a" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#9ed63a" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9ed63a" + - state: trousers-equipped-INNERCLOTHING + + # Dark Green Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorDarkGreen + name: dark green turtleneck + description: A generic dark green turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#79CC26" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#79CC26" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#79CC26" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#79CC26" + - state: trousers-equipped-INNERCLOTHING + +# Orange Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorOrange + name: orange turtleneck + description: A generic orange turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#ff8c19" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ff8c19" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#ff8c19" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ff8c19" + - state: trousers-equipped-INNERCLOTHING + +# Pink Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorPink + name: pink turtleneck + description: A generic pink turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#ffa69b" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffa69b" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#ffa69b" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffa69b" + - state: trousers-equipped-INNERCLOTHING + +# Red Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorRed + name: red turtleneck + description: A generic red turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#eb0c07" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#eb0c07" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#eb0c07" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#eb0c07" + - state: trousers-equipped-INNERCLOTHING + +# Yellow Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorYellow + name: yellow turtleneck + description: A generic yellow turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#ffe14d" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffe14d" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#ffe14d" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffe14d" + - state: trousers-equipped-INNERCLOTHING + +# Purple Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorPurple + name: purple turtleneck + description: A generic light purple turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#9f70cc" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9f70cc" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#9f70cc" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9f70cc" + - state: trousers-equipped-INNERCLOTHING + +# Light Brown Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorLightBrown + name: light brown turtleneck + description: A generic light brown turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#c59431" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#c59431" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#c59431" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#c59431" + - state: trousers-equipped-INNERCLOTHING + +# Brown Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorBrown + name: brown turtleneck + description: A generic brown turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#a17229" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#a17229" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#a17229" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#a17229" + - state: trousers-equipped-INNERCLOTHING + +# Maroon Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckColorMaroon + name: maroon turtleneck + description: A generic maroon turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + layers: + - state: icon + color: "#cc295f" + - state: trousers-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#cc295f" + - state: trousers-inhand-left + right: + - state: inhand-right + color: "#cc295f" + - state: trousers-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#cc295f" + - state: trousers-equipped-INNERCLOTHING diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml new file mode 100644 index 0000000000..1a61e0803f --- /dev/null +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml @@ -0,0 +1,491 @@ +# White Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorWhite + name: white turtleneck with skirt + description: A generic white turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + - state: skirt-inhand-left + right: + - state: inhand-right + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + - state: skirt-equipped-INNERCLOTHING + +# Grey Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorGrey + name: grey turtleneck with skirt + description: A tasteful grey turtleneck that reminds you of the good old days. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#b3b3b3" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#b3b3b3" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#b3b3b3" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#b3b3b3" + - state: skirt-equipped-INNERCLOTHING + +# Black Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorBlack + name: black turtleneck with skirt + description: A generic black turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#3f3f3f" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3f3f3f" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#3f3f3f" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3f3f3f" + - state: skirt-equipped-INNERCLOTHING + +# Blue Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorBlue + name: blue turtleneck with skirt + description: A generic blue turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#52aecc" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#52aecc" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#52aecc" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#52aecc" + - state: skirt-equipped-INNERCLOTHING + +# Dark Blue Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorDarkBlue + name: dark blue turtleneck with skirt + description: A generic dark blue turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#3285ba" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#3285ba" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#3285ba" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#3285ba" + - state: skirt-equipped-INNERCLOTHING + +# Teal Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorTeal + name: teal turtleneck with skirt + description: A generic teal turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#77f3b7" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#77f3b7" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#77f3b7" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#77f3b7" + - state: skirt-equipped-INNERCLOTHING + +# Green Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorGreen + name: green turtleneck with skirt + description: A generic green turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#9ed63a" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9ed63a" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#9ed63a" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9ed63a" + - state: skirt-equipped-INNERCLOTHING + + # Dark Green Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorDarkGreen + name: dark green turtleneck with skirt + description: A generic dark green turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#79CC26" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#79CC26" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#79CC26" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#79CC26" + - state: skirt-equipped-INNERCLOTHING + +# Orange Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorOrange + name: orange turtleneck with skirt + description: A generic orange turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#ff8c19" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ff8c19" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#ff8c19" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ff8c19" + - state: skirt-equipped-INNERCLOTHING + +# Pink Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorPink + name: pink turtleneck with skirt + description: A generic pink turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#ffa69b" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffa69b" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#ffa69b" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffa69b" + - state: skirt-equipped-INNERCLOTHING + +# Red Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorRed + name: red turtleneck with skirt + description: A generic red turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#eb0c07" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#eb0c07" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#eb0c07" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#eb0c07" + - state: skirt-equipped-INNERCLOTHING + +# Yellow Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorYellow + name: yellow turtleneck with skirt + description: A generic yellow turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#ffe14d" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#ffe14d" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#ffe14d" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#ffe14d" + - state: skirt-equipped-INNERCLOTHING + +# Purple Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorPurple + name: purple turtleneck with skirt + description: A generic light purple turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#9f70cc" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#9f70cc" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#9f70cc" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#9f70cc" + - state: skirt-equipped-INNERCLOTHING + +# Light Brown Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorLightBrown + name: light brown turtleneck with skirt + description: A generic light brown turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#c59431" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#c59431" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#c59431" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#c59431" + - state: skirt-equipped-INNERCLOTHING + +# Brown Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorBrown + name: brown turtleneck with skirt + description: A generic brown turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#a17229" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#a17229" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#a17229" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#a17229" + - state: skirt-equipped-INNERCLOTHING + +# Maroon Turtleneck +- type: entity + parent: ClothingUniformBase + id: ClothingUniformTurtleneckSkirtColorMaroon + name: maroon turtleneck with skirt + description: A generic maroon turtleneck with no rank markings. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + layers: + - state: icon + color: "#cc295f" + - state: skirt-icon + - type: Item + inhandVisuals: + left: + - state: inhand-left + color: "#cc295f" + - state: skirt-inhand-left + right: + - state: inhand-right + color: "#cc295f" + - state: skirt-inhand-right + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING + color: "#cc295f" + - state: skirt-equipped-INNERCLOTHING diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..30ec8b9d591fb5e2e97e6a093b02cfd5dd5eb67b GIT binary patch literal 5396 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1194286cc560199b7bfaae37c3d2cd51386089ed GIT binary patch literal 4869 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 V9eMt#Wd5zd-g=AGH4Co;{{SVO`t1M! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8c952aa084fcd29954838505c2f31ce38a5a58 GIT binary patch literal 5079 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..c0da296e649577328b872b98099119933996c98b GIT binary patch literal 5142 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 b{JRBt+x#`F54nxczb4sQI$GqJdF}fb`m9t- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json new file mode 100644 index 0000000000..d4dc27c853 --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json @@ -0,0 +1,41 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Derived from qmturtleneck sprite from beestation at commit https://github.com/BeeStation/BeeStation-Hornet/commit/a11e7468ca552cfc97c9164c69ccdafff09e794c and modified by Emisse, also modified by Ko4erga", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "skirt-icon" + }, + { + "name": "skirt-equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "skirt-inhand-left", + "directions": 4 + }, + { + "name": "skirt-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed406823ac010ded3d1462a2bf9e112c380892c GIT binary patch literal 3034 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9516069cb363781cabaa8e3a6a70bdf258c02a0c GIT binary patch literal 2835 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..74b28bdc7b2b3fd72565072488ae6fa982c1d196 GIT binary patch literal 5269 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f3554454405d8b168b2e44e3d86e9671c1abde1c GIT binary patch literal 5401 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..30ec8b9d591fb5e2e97e6a093b02cfd5dd5eb67b GIT binary patch literal 5396 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1194286cc560199b7bfaae37c3d2cd51386089ed GIT binary patch literal 4869 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 V9eMt#Wd5zd-g=AGH4Co;{{SVO`t1M! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8c952aa084fcd29954838505c2f31ce38a5a58 GIT binary patch literal 5079 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..c0da296e649577328b872b98099119933996c98b GIT binary patch literal 5142 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 b{JRBt+x#`F54nxczb4sQI$GqJdF}fb`m9t- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json new file mode 100644 index 0000000000..530c661f35 --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json @@ -0,0 +1,41 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Derived from qmturtleneck sprite from beestation at commit https://github.com/BeeStation/BeeStation-Hornet/commit/a11e7468ca552cfc97c9164c69ccdafff09e794c and modified by Emisse, also modified by Ko4erga", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "trousers-icon" + }, + { + "name": "trousers-equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "trousers-inhand-left", + "directions": 4 + }, + { + "name": "trousers-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..bccf027039d9ee513664b7c0efad816a1f26fa83 GIT binary patch literal 5305 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d1c9d61185b309b1e08246d396a6a5e8725634 GIT binary patch literal 5127 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 P&qcPDn=G!Hx$pl6sxvUn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9e806da8be46d3872461395fc742d03c2161ba GIT binary patch literal 5243 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5979d70d25d79bb858ddbd702c788e0af5e6ad GIT binary patch literal 5375 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 A2><{9 literal 0 HcmV?d00001 From f1f431e7200eddbf4c28ac273937af92989fd204 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 05:15:57 +0000 Subject: [PATCH 353/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3b4056937c..8222a7943f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: Reinforced tables now require welding to construct and deconstruct. - type: Tweak - id: 7753 - time: '2024-12-26T22:47:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33992 - author: crazybrain changes: - message: Bluespace lockers and quantum spin inverters can no longer go on the @@ -3915,3 +3908,10 @@ id: 8253 time: '2025-04-19T05:12:11.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36287 +- author: Ko4erga + changes: + - message: Added new color turtlenecks in WinterDrobe. + type: Add + id: 8254 + time: '2025-04-19T05:14:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32920 From 63dfd21b146eae00c696ae561da6f40a223af0ad Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 16:20:40 +1000 Subject: [PATCH 354/622] Predict dumping (#32394) * Predict dumping - This got soaped really fucking hard. - Dumping is predicted, this required disposals to be predicte.d - Disposals required mailing (because it's tightly coupled), and a smidge of other content systems. - I also had to fix a compnetworkgenerator issue at the same time so it wouldn't mispredict. * Fix a bunch of stuff * nasty merge * Some reviews * Some more reviews while I stash * Fix merge * Fix merge * Half of review * Review * re(h)f * lizards * feexes * feex --- .../Configurable/ConfigurationSystem.cs | 25 + .../UI/ConfigurationBoundUserInterface.cs | 53 +- .../Configurable/UI/ConfigurationMenu.cs | 67 +- Content.Client/Decals/DecalSystem.cs | 9 +- .../Systems/DeviceNetworkSystem.cs | 8 + .../Disposal/DisposalUnitComponent.cs | 9 - .../Mailing/MailingUnitBoundUserInterface.cs | 79 ++ .../Disposal/Mailing/MailingUnitSystem.cs | 22 + .../{UI => Mailing}/MailingUnitWindow.xaml | 15 +- .../Mailing/MailingUnitWindow.xaml.cs | 27 + .../Disposal/{UI => }/PressureBar.cs | 3 +- .../Disposal/Systems/DisposalUnitSystem.cs | 187 ---- .../DisposalRouterBoundUserInterface.cs | 3 +- .../{UI => Tube}/DisposalRouterWindow.xaml | 0 .../{UI => Tube}/DisposalRouterWindow.xaml.cs | 3 +- .../DisposalTaggerBoundUserInterface.cs | 3 +- .../{UI => Tube}/DisposalTaggerWindow.xaml | 0 .../{UI => Tube}/DisposalTaggerWindow.xaml.cs | 3 +- .../Disposal/Tube/DisposalTubeSystem.cs | 8 + .../UI/DisposalUnitBoundUserInterface.cs | 103 -- .../Disposal/UI/DisposalUnitWindow.xaml.cs | 43 - .../Disposal/UI/MailingUnitWindow.xaml.cs | 55 -- .../Unit/DisposalUnitBoundUserInterface.cs | 63 ++ .../Disposal/Unit/DisposalUnitSystem.cs | 156 ++++ .../{UI => Unit}/DisposalUnitWindow.xaml | 19 +- .../Disposal/Unit/DisposalUnitWindow.xaml.cs | 28 + .../Systems/DeviceListSystem.cs | 1 - .../EntitySystems/PowerReceiverSystem.cs | 12 + .../StorageFillVisualizerSystem.cs | 3 - .../Tests/DeviceNetwork/DeviceNetworkTest.cs | 4 +- .../DeviceNetwork/DeviceNetworkTestSystem.cs | 39 +- .../Tests/Disposal/DisposalUnitTest.cs | 20 +- .../Administration/Systems/AdminVerbSystem.cs | 2 - .../Consoles/AtmosAlertsComputerSystem.cs | 1 - .../Consoles/AtmosMonitoringConsoleSystem.cs | 3 +- .../Atmos/Monitor/Systems/AirAlarmSystem.cs | 6 +- .../Monitor/Systems/AtmosAlarmableSystem.cs | 6 +- .../Monitor/Systems/AtmosMonitoringSystem.cs | 1 + .../Atmos/Monitor/Systems/FireAlarmSystem.cs | 8 +- .../Monitor/WireActions/AirAlarmPanicWire.cs | 2 +- .../EntitySystems/GasVolumePumpSystem.cs | 4 +- .../Components/GasOutletInjectorComponent.cs | 1 - .../EntitySystems/GasThermoMachineSystem.cs | 5 +- .../Unary/EntitySystems/GasVentPumpSystem.cs | 4 +- .../EntitySystems/GasVentScrubberSystem.cs | 9 +- .../CartridgeLoader/CartridgeLoaderSystem.cs | 1 + .../Cartridges/NetProbeCartridgeSystem.cs | 5 +- .../CommunicationsConsoleSystem.cs | 3 +- .../Configurable/ConfigurationSystem.cs | 85 +- .../Containers/ThrowInsertContainerSystem.cs | 8 +- .../DeviceLinking/Systems/DeviceLinkSystem.cs | 4 +- .../Systems/DoorSignalControlSystem.cs | 1 + .../Systems/EdgeDetectorSystem.cs | 2 +- .../DeviceLinking/Systems/LogicGateSystem.cs | 1 + .../DeviceLinking/Systems/MemoryCellSystem.cs | 1 + .../DeviceNetwork/Systems/ApcNetworkSystem.cs | 1 + .../DeviceNetwork/Systems/DeviceListSystem.cs | 4 +- .../Systems/DeviceNetworkJammerSystem.cs | 1 + .../DeviceNetworkRequiresPowerSystem.cs | 1 + .../Systems/DeviceNetworkSystem.cs | 109 +-- .../Systems/Devices/ApcNetSwitchSystem.cs | 3 +- .../Systems/NetworkConfiguratorSystem.cs | 1 - .../Systems/SingletonDeviceNetServerSystem.cs | 2 +- .../Systems/StationLimitedNetworkSystem.cs | 1 + .../Systems/WiredNetworkSystem.cs | 1 + .../Systems/WirelessNetworkSystem.cs | 1 + .../Disposal/Mailing/MailingUnitSystem.cs | 200 +--- .../Tube/Components/DisposalEntryComponent.cs | 11 - .../{Components => }/DisposalBendComponent.cs | 2 +- .../DisposalJunctionComponent.cs | 2 +- .../DisposalRouterComponent.cs | 8 +- .../DisposalSignalRouterComponent.cs | 3 +- .../DisposalSignalRouterSystem.cs | 3 +- .../DisposalTaggerComponent.cs | 9 +- .../DisposalTransitComponent.cs | 2 +- .../{Components => }/DisposalTubeComponent.cs | 4 +- .../Disposal/Tube/DisposalTubeSystem.cs | 38 +- .../Tube/GetDisposalsNextDirectionEvent.cs | 2 +- .../Disposal/TubeConnectionsCommand.cs | 1 - .../BeingDisposedComponent.cs | 2 +- .../BeingDisposedSystem.cs | 3 +- .../Unit/Components/DisposalUnitComponent.cs | 13 - .../{EntitySystems => }/DisposableSystem.cs | 5 +- .../DisposalHolderComponent.cs | 3 +- .../Disposal/Unit/DisposalUnitSystem.cs | 44 + .../DoInsertDisposalUnitEvent.cs | 2 +- Content.Server/Fax/AdminUI/AdminFaxEui.cs | 1 + Content.Server/Fax/FaxSystem.cs | 6 +- .../Light/EntitySystems/PoweredLightSystem.cs | 2 + .../CrewMonitoringConsoleSystem.cs | 2 + .../CrewMonitoringServerSystem.cs | 4 +- .../Medical/SuitSensors/SuitSensorSystem.cs | 3 +- Content.Server/PDA/PdaSystem.cs | 6 +- .../EntitySystems/PowerReceiverSystem.cs | 1 - .../Power/Generation/Teg/TegSystem.cs | 1 + .../Radio/EntitySystems/JammerSystem.cs | 1 - .../Robotics/Systems/RoboticsConsoleSystem.cs | 3 +- Content.Server/RoundEnd/RoundEndSystem.cs | 3 +- .../Screens/Systems/ScreenSystem.cs | 4 +- .../SensorMonitoring/BatterySensorSystem.cs | 1 + .../SensorMonitoringConsoleSystem.UI.cs | 4 +- .../SensorMonitoringConsoleSystem.cs | 4 +- .../Shuttles/Systems/ArrivalsSystem.cs | 7 +- .../Systems/EmergencyShuttleSystem.Console.cs | 2 +- .../Systems/EmergencyShuttleSystem.cs | 2 +- .../Silicons/Borgs/BorgSystem.Transponder.cs | 7 +- .../SurveillanceCameraMonitorSystem.cs | 1 + .../Systems/SurveillanceCameraRouterSystem.cs | 6 +- .../Systems/SurveillanceCameraSystem.cs | 5 +- .../Turrets/DeployableTurretSystem.cs | 2 + .../Climbing/Components/ClimbableComponent.cs | 8 +- .../Climbing/Systems/ClimbSystem.cs | 10 +- .../Configurable/ConfigurationComponent.cs | 38 +- .../Configurable/SharedConfigurationSystem.cs | 77 ++ .../SharedThrowInsertContainerSystem.cs | 8 + .../Components/DeviceNetworkComponent.cs | 11 +- .../DeviceNetwork/DeviceNet.cs | 5 +- .../DeviceNetwork/DeviceNetworkConstants.cs | 4 +- .../Events/BeforeBroadcastAttemptEvent.cs | 17 + .../Events/BeforePacketSentEvent.cs | 35 + .../Events/DeviceNetworkPacketEvent.cs | 47 + .../Systems/SharedDeviceNetworkSystem.cs | 25 + .../Disposal/Mailing/MailingUnitComponent.cs | 18 +- .../{ => Mailing}/MailingUnitUiMessages.cs | 0 .../SharedDisposalRouterComponent.cs | 0 .../SharedDisposalTaggerComponent.cs | 0 .../Mailing/SharedMailingUnitSystem.cs | 174 ++++ .../MailingUnitBoundUserInterfaceState.cs | 45 - .../Disposal/SharedDisposalUnitSystem.cs | 162 ---- .../Disposal/Tube/DisposalEntryComponent.cs | 12 + .../SharedDisposalTubeComponent.cs | 0 .../Disposal/Unit/BeforeDisposalFlushEvent.cs | 10 + .../DisposalUnitComponent.cs} | 74 +- .../Disposal/Unit/SharedDisposalTubeSystem.cs | 14 + .../Disposal/Unit/SharedDisposalUnitSystem.cs | 879 +++++++++--------- .../SharedApcPowerReceiverComponent.cs | 12 +- .../SharedPowerReceiverSystem.cs | 9 +- .../Storage/EntitySystems/DumpableSystem.cs | 8 +- .../Entities/Structures/Furniture/toilet.yml | 2 - .../Structures/Piping/Disposal/units.yml | 16 +- 140 files changed, 1655 insertions(+), 1858 deletions(-) create mode 100644 Content.Client/Configurable/ConfigurationSystem.cs create mode 100644 Content.Client/DeviceNetwork/Systems/DeviceNetworkSystem.cs delete mode 100644 Content.Client/Disposal/DisposalUnitComponent.cs create mode 100644 Content.Client/Disposal/Mailing/MailingUnitBoundUserInterface.cs create mode 100644 Content.Client/Disposal/Mailing/MailingUnitSystem.cs rename Content.Client/Disposal/{UI => Mailing}/MailingUnitWindow.xaml (80%) create mode 100644 Content.Client/Disposal/Mailing/MailingUnitWindow.xaml.cs rename Content.Client/Disposal/{UI => }/PressureBar.cs (96%) delete mode 100644 Content.Client/Disposal/Systems/DisposalUnitSystem.cs rename Content.Client/Disposal/{UI => Tube}/DisposalRouterBoundUserInterface.cs (95%) rename Content.Client/Disposal/{UI => Tube}/DisposalRouterWindow.xaml (100%) rename Content.Client/Disposal/{UI => Tube}/DisposalRouterWindow.xaml.cs (90%) rename Content.Client/Disposal/{UI => Tube}/DisposalTaggerBoundUserInterface.cs (95%) rename Content.Client/Disposal/{UI => Tube}/DisposalTaggerWindow.xaml (100%) rename Content.Client/Disposal/{UI => Tube}/DisposalTaggerWindow.xaml.cs (90%) create mode 100644 Content.Client/Disposal/Tube/DisposalTubeSystem.cs delete mode 100644 Content.Client/Disposal/UI/DisposalUnitBoundUserInterface.cs delete mode 100644 Content.Client/Disposal/UI/DisposalUnitWindow.xaml.cs delete mode 100644 Content.Client/Disposal/UI/MailingUnitWindow.xaml.cs create mode 100644 Content.Client/Disposal/Unit/DisposalUnitBoundUserInterface.cs create mode 100644 Content.Client/Disposal/Unit/DisposalUnitSystem.cs rename Content.Client/Disposal/{UI => Unit}/DisposalUnitWindow.xaml (72%) create mode 100644 Content.Client/Disposal/Unit/DisposalUnitWindow.xaml.cs delete mode 100644 Content.Server/Disposal/Tube/Components/DisposalEntryComponent.cs rename Content.Server/Disposal/Tube/{Components => }/DisposalBendComponent.cs (70%) rename Content.Server/Disposal/Tube/{Components => }/DisposalJunctionComponent.cs (84%) rename Content.Server/Disposal/Tube/{Components => }/DisposalRouterComponent.cs (57%) rename Content.Server/Disposal/Tube/{Components => }/DisposalSignalRouterComponent.cs (91%) rename Content.Server/Disposal/Tube/{Systems => }/DisposalSignalRouterSystem.cs (94%) rename Content.Server/Disposal/Tube/{Components => }/DisposalTaggerComponent.cs (53%) rename Content.Server/Disposal/Tube/{Components => }/DisposalTransitComponent.cs (82%) rename Content.Server/Disposal/Tube/{Components => }/DisposalTubeComponent.cs (90%) rename Content.Server/Disposal/Unit/{Components => }/BeingDisposedComponent.cs (81%) rename Content.Server/Disposal/Unit/{EntitySystems => }/BeingDisposedSystem.cs (92%) delete mode 100644 Content.Server/Disposal/Unit/Components/DisposalUnitComponent.cs rename Content.Server/Disposal/Unit/{EntitySystems => }/DisposableSystem.cs (98%) rename Content.Server/Disposal/Unit/{Components => }/DisposalHolderComponent.cs (94%) create mode 100644 Content.Server/Disposal/Unit/DisposalUnitSystem.cs rename Content.Server/Disposal/Unit/{EntitySystems => }/DoInsertDisposalUnitEvent.cs (65%) create mode 100644 Content.Shared/Configurable/SharedConfigurationSystem.cs create mode 100644 Content.Shared/Containers/SharedThrowInsertContainerSystem.cs rename {Content.Server => Content.Shared}/DeviceNetwork/Components/DeviceNetworkComponent.cs (93%) rename {Content.Server => Content.Shared}/DeviceNetwork/DeviceNet.cs (97%) rename {Content.Server => Content.Shared}/DeviceNetwork/DeviceNetworkConstants.cs (96%) create mode 100644 Content.Shared/DeviceNetwork/Events/BeforeBroadcastAttemptEvent.cs create mode 100644 Content.Shared/DeviceNetwork/Events/BeforePacketSentEvent.cs create mode 100644 Content.Shared/DeviceNetwork/Events/DeviceNetworkPacketEvent.cs create mode 100644 Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkSystem.cs rename {Content.Server => Content.Shared}/Disposal/Mailing/MailingUnitComponent.cs (57%) rename Content.Shared/Disposal/{ => Mailing}/MailingUnitUiMessages.cs (100%) rename Content.Shared/Disposal/{Components => Mailing}/SharedDisposalRouterComponent.cs (100%) rename Content.Shared/Disposal/{Components => Mailing}/SharedDisposalTaggerComponent.cs (100%) create mode 100644 Content.Shared/Disposal/Mailing/SharedMailingUnitSystem.cs delete mode 100644 Content.Shared/Disposal/MailingUnitBoundUserInterfaceState.cs delete mode 100644 Content.Shared/Disposal/SharedDisposalUnitSystem.cs create mode 100644 Content.Shared/Disposal/Tube/DisposalEntryComponent.cs rename Content.Shared/Disposal/{Components => Tube}/SharedDisposalTubeComponent.cs (100%) create mode 100644 Content.Shared/Disposal/Unit/BeforeDisposalFlushEvent.cs rename Content.Shared/Disposal/{Components/SharedDisposalUnitComponent.cs => Unit/DisposalUnitComponent.cs} (68%) create mode 100644 Content.Shared/Disposal/Unit/SharedDisposalTubeSystem.cs rename Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs => Content.Shared/Disposal/Unit/SharedDisposalUnitSystem.cs (53%) diff --git a/Content.Client/Configurable/ConfigurationSystem.cs b/Content.Client/Configurable/ConfigurationSystem.cs new file mode 100644 index 0000000000..6594375ba2 --- /dev/null +++ b/Content.Client/Configurable/ConfigurationSystem.cs @@ -0,0 +1,25 @@ +using Content.Client.Configurable.UI; +using Content.Shared.Configurable; + +namespace Content.Client.Configurable; + +public sealed class ConfigurationSystem : SharedConfigurationSystem +{ + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent<ConfigurationComponent, AfterAutoHandleStateEvent>(OnConfigurationState); + } + + private void OnConfigurationState(Entity<ConfigurationComponent> ent, ref AfterAutoHandleStateEvent args) + { + if (_uiSystem.TryGetOpenUi<ConfigurationBoundUserInterface>(ent.Owner, + ConfigurationComponent.ConfigurationUiKey.Key, + out var bui)) + { + bui.Refresh(ent); + } + } +} diff --git a/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs b/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs index e4966f1ec4..a3845ba1eb 100644 --- a/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs +++ b/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs @@ -1,6 +1,8 @@ -using System.Text.RegularExpressions; -using Robust.Client.GameObjects; +using System.Numerics; +using System.Text.RegularExpressions; +using Content.Shared.Configurable; using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; using static Content.Shared.Configurable.ConfigurationComponent; namespace Content.Client.Configurable.UI @@ -19,16 +21,53 @@ namespace Content.Client.Configurable.UI base.Open(); _menu = this.CreateWindow<ConfigurationMenu>(); _menu.OnConfiguration += SendConfiguration; + if (EntMan.TryGetComponent(Owner, out ConfigurationComponent? component)) + Refresh((Owner, component)); } - protected override void UpdateState(BoundUserInterfaceState state) + public void Refresh(Entity<ConfigurationComponent> entity) { - base.UpdateState(state); - - if (state is not ConfigurationBoundUserInterfaceState configurationState) + if (_menu == null) return; - _menu?.Populate(configurationState); + _menu.Column.Children.Clear(); + _menu.Inputs.Clear(); + + foreach (var field in entity.Comp.Config) + { + var label = new Label + { + Margin = new Thickness(0, 0, 8, 0), + Name = field.Key, + Text = field.Key + ":", + VerticalAlignment = Control.VAlignment.Center, + HorizontalExpand = true, + SizeFlagsStretchRatio = .2f, + MinSize = new Vector2(60, 0) + }; + + var input = new LineEdit + { + Name = field.Key + "-input", + Text = field.Value ?? "", + IsValid = _menu.Validate, + HorizontalExpand = true, + SizeFlagsStretchRatio = .8f + }; + + _menu.Inputs.Add((field.Key, input)); + + var row = new BoxContainer + { + Orientation = BoxContainer.LayoutOrientation.Horizontal + }; + + ConfigurationMenu.CopyProperties(_menu.Row, row); + + row.AddChild(label); + row.AddChild(input); + _menu.Column.AddChild(row); + } } protected override void ReceiveMessage(BoundUserInterfaceMessage message) diff --git a/Content.Client/Configurable/UI/ConfigurationMenu.cs b/Content.Client/Configurable/UI/ConfigurationMenu.cs index 29217eef7b..4ca68c5fa0 100644 --- a/Content.Client/Configurable/UI/ConfigurationMenu.cs +++ b/Content.Client/Configurable/UI/ConfigurationMenu.cs @@ -1,12 +1,8 @@ -using System.Collections.Generic; -using System.Numerics; +using System.Numerics; using System.Text.RegularExpressions; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; -using Robust.Shared.Localization; -using Robust.Shared.Maths; -using static Content.Shared.Configurable.ConfigurationComponent; using static Robust.Client.UserInterface.Controls.BaseButton; using static Robust.Client.UserInterface.Controls.BoxContainer; @@ -14,10 +10,10 @@ namespace Content.Client.Configurable.UI { public sealed class ConfigurationMenu : DefaultWindow { - private readonly BoxContainer _column; - private readonly BoxContainer _row; + public readonly BoxContainer Column; + public readonly BoxContainer Row; - private readonly List<(string name, LineEdit input)> _inputs; + public readonly List<(string name, LineEdit input)> Inputs; [ViewVariables] public Regex? Validation { get; internal set; } @@ -28,7 +24,7 @@ namespace Content.Client.Configurable.UI { MinSize = SetSize = new Vector2(300, 250); - _inputs = new List<(string name, LineEdit input)>(); + Inputs = new List<(string name, LineEdit input)>(); Title = Loc.GetString("configuration-menu-device-title"); @@ -39,14 +35,14 @@ namespace Content.Client.Configurable.UI HorizontalExpand = true }; - _column = new BoxContainer + Column = new BoxContainer { Orientation = LayoutOrientation.Vertical, Margin = new Thickness(8), SeparationOverride = 16, }; - _row = new BoxContainer + Row = new BoxContainer { Orientation = LayoutOrientation.Horizontal, SeparationOverride = 16, @@ -69,61 +65,20 @@ namespace Content.Client.Configurable.UI ModulateSelfOverride = Color.FromHex("#202025") }; - outerColumn.AddChild(_column); + outerColumn.AddChild(Column); baseContainer.AddChild(outerColumn); baseContainer.AddChild(confirmButton); Contents.AddChild(baseContainer); } - public void Populate(ConfigurationBoundUserInterfaceState state) - { - _column.Children.Clear(); - _inputs.Clear(); - - foreach (var field in state.Config) - { - var label = new Label - { - Margin = new Thickness(0, 0, 8, 0), - Name = field.Key, - Text = field.Key + ":", - VerticalAlignment = VAlignment.Center, - HorizontalExpand = true, - SizeFlagsStretchRatio = .2f, - MinSize = new Vector2(60, 0) - }; - - var input = new LineEdit - { - Name = field.Key + "-input", - Text = field.Value ?? "", - IsValid = Validate, - HorizontalExpand = true, - SizeFlagsStretchRatio = .8f - }; - - _inputs.Add((field.Key, input)); - - var row = new BoxContainer - { - Orientation = LayoutOrientation.Horizontal - }; - CopyProperties(_row, row); - - row.AddChild(label); - row.AddChild(input); - _column.AddChild(row); - } - } - private void OnConfirm(ButtonEventArgs args) { - var config = GenerateDictionary(_inputs, "Text"); + var config = GenerateDictionary(Inputs, "Text"); OnConfiguration?.Invoke(config); Close(); } - private bool Validate(string value) + public bool Validate(string value) { return Validation?.IsMatch(value) != false; } @@ -140,7 +95,7 @@ namespace Content.Client.Configurable.UI return dictionary; } - private static void CopyProperties<T>(T from, T to) where T : Control + public static void CopyProperties<T>(T from, T to) where T : Control { foreach (var property in from.AllAttachedProperties) { diff --git a/Content.Client/Decals/DecalSystem.cs b/Content.Client/Decals/DecalSystem.cs index 41e5f39c28..172a06c4cd 100644 --- a/Content.Client/Decals/DecalSystem.cs +++ b/Content.Client/Decals/DecalSystem.cs @@ -13,7 +13,7 @@ namespace Content.Client.Decals [Dependency] private readonly IOverlayManager _overlayManager = default!; [Dependency] private readonly SpriteSystem _sprites = default!; - private DecalOverlay _overlay = default!; + private DecalOverlay? _overlay; private HashSet<uint> _removedUids = new(); private readonly List<Vector2i> _removedChunks = new(); @@ -31,6 +31,9 @@ namespace Content.Client.Decals public void ToggleOverlay() { + if (_overlay == null) + return; + if (_overlayManager.HasOverlay<DecalOverlay>()) { _overlayManager.RemoveOverlay(_overlay); @@ -44,6 +47,10 @@ namespace Content.Client.Decals public override void Shutdown() { base.Shutdown(); + + if (_overlay == null) + return; + _overlayManager.RemoveOverlay(_overlay); } diff --git a/Content.Client/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Client/DeviceNetwork/Systems/DeviceNetworkSystem.cs new file mode 100644 index 0000000000..5b11b2bfe7 --- /dev/null +++ b/Content.Client/DeviceNetwork/Systems/DeviceNetworkSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.DeviceNetwork.Systems; + +namespace Content.Client.DeviceNetwork.Systems; + +public sealed class DeviceNetworkSystem : SharedDeviceNetworkSystem +{ + +} diff --git a/Content.Client/Disposal/DisposalUnitComponent.cs b/Content.Client/Disposal/DisposalUnitComponent.cs deleted file mode 100644 index e63a3fd45e..0000000000 --- a/Content.Client/Disposal/DisposalUnitComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Content.Shared.Disposal.Components; - -namespace Content.Client.Disposal; - -[RegisterComponent] -public sealed partial class DisposalUnitComponent : SharedDisposalUnitComponent -{ - -} diff --git a/Content.Client/Disposal/Mailing/MailingUnitBoundUserInterface.cs b/Content.Client/Disposal/Mailing/MailingUnitBoundUserInterface.cs new file mode 100644 index 0000000000..013c4eaa1b --- /dev/null +++ b/Content.Client/Disposal/Mailing/MailingUnitBoundUserInterface.cs @@ -0,0 +1,79 @@ +using Content.Client.Disposal.Unit; +using Content.Client.Power.EntitySystems; +using Content.Shared.Disposal; +using Content.Shared.Disposal.Components; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; + +namespace Content.Client.Disposal.Mailing; + +public sealed class MailingUnitBoundUserInterface : BoundUserInterface +{ + [ViewVariables] + public MailingUnitWindow? MailingUnitWindow; + + public MailingUnitBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + private void ButtonPressed(DisposalUnitComponent.UiButton button) + { + SendMessage(new DisposalUnitComponent.UiButtonPressedMessage(button)); + // If we get client-side power stuff then we can predict the button presses but for now we won't as it stuffs + // the pressure lerp up. + } + + private void TargetSelected(ItemList.ItemListSelectedEventArgs args) + { + var item = args.ItemList[args.ItemIndex]; + SendMessage(new TargetSelectedMessage(item.Text)); + } + + protected override void Open() + { + base.Open(); + + MailingUnitWindow = this.CreateWindow<MailingUnitWindow>(); + MailingUnitWindow.OpenCenteredRight(); + + MailingUnitWindow.Eject.OnPressed += _ => ButtonPressed(DisposalUnitComponent.UiButton.Eject); + MailingUnitWindow.Engage.OnPressed += _ => ButtonPressed(DisposalUnitComponent.UiButton.Engage); + MailingUnitWindow.Power.OnPressed += _ => ButtonPressed(DisposalUnitComponent.UiButton.Power); + + MailingUnitWindow.TargetListContainer.OnItemSelected += TargetSelected; + + if (EntMan.TryGetComponent(Owner, out MailingUnitComponent? component)) + Refresh((Owner, component)); + } + + public void Refresh(Entity<MailingUnitComponent> entity) + { + if (MailingUnitWindow == null) + return; + + // TODO: This should be decoupled from disposals + if (EntMan.TryGetComponent(entity.Owner, out DisposalUnitComponent? disposals)) + { + var disposalSystem = EntMan.System<DisposalUnitSystem>(); + + var disposalState = disposalSystem.GetState(Owner, disposals); + var fullPressure = disposalSystem.EstimatedFullPressure(Owner, disposals); + + MailingUnitWindow.UnitState.Text = Loc.GetString($"disposal-unit-state-{disposalState}"); + MailingUnitWindow.FullPressure = fullPressure; + MailingUnitWindow.PressureBar.UpdatePressure(fullPressure); + MailingUnitWindow.Power.Pressed = EntMan.System<PowerReceiverSystem>().IsPowered(Owner); + MailingUnitWindow.Engage.Pressed = disposals.Engaged; + } + + MailingUnitWindow.Title = Loc.GetString("ui-mailing-unit-window-title", ("tag", entity.Comp.Tag ?? " ")); + //UnitTag.Text = state.Tag; + MailingUnitWindow.Target.Text = entity.Comp.Target; + + MailingUnitWindow.TargetListContainer.Clear(); + foreach (var target in entity.Comp.TargetList) + { + MailingUnitWindow.TargetListContainer.AddItem(target); + } + } +} diff --git a/Content.Client/Disposal/Mailing/MailingUnitSystem.cs b/Content.Client/Disposal/Mailing/MailingUnitSystem.cs new file mode 100644 index 0000000000..780656b4f0 --- /dev/null +++ b/Content.Client/Disposal/Mailing/MailingUnitSystem.cs @@ -0,0 +1,22 @@ +using Content.Shared.Disposal; +using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Mailing; + +namespace Content.Client.Disposal.Mailing; + +public sealed class MailingUnitSystem : SharedMailingUnitSystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent<MailingUnitComponent, AfterAutoHandleStateEvent>(OnMailingState); + } + + private void OnMailingState(Entity<MailingUnitComponent> ent, ref AfterAutoHandleStateEvent args) + { + if (UserInterfaceSystem.TryGetOpenUi<MailingUnitBoundUserInterface>(ent.Owner, MailingUnitUiKey.Key, out var bui)) + { + bui.Refresh(ent); + } + } +} diff --git a/Content.Client/Disposal/UI/MailingUnitWindow.xaml b/Content.Client/Disposal/Mailing/MailingUnitWindow.xaml similarity index 80% rename from Content.Client/Disposal/UI/MailingUnitWindow.xaml rename to Content.Client/Disposal/Mailing/MailingUnitWindow.xaml index c57ca7b4c1..0acd300895 100644 --- a/Content.Client/Disposal/UI/MailingUnitWindow.xaml +++ b/Content.Client/Disposal/Mailing/MailingUnitWindow.xaml @@ -1,12 +1,14 @@ -<DefaultWindow xmlns="https://spacestation14.io" - xmlns:ui="clr-namespace:Content.Client.Disposal.UI" - MinSize="300 400" +<controls:FancyWindow xmlns="https://spacestation14.io" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + xmlns:disposal="clr-namespace:Content.Client.Disposal" + MinSize="300 400" SetSize="300 400" Resizable="False"> <BoxContainer Orientation="Vertical"> <BoxContainer Orientation="Horizontal" SeparationOverride="8"> <Label Text="{Loc 'ui-mailing-unit-target-label'}" /> <Label Name="Target" + Access="Public" Text="" /> </BoxContainer> <ItemList Name="TargetListContainer" @@ -18,14 +20,15 @@ </ItemList> <BoxContainer Orientation="Horizontal" SeparationOverride="4"> <Label Text="{Loc 'ui-disposal-unit-label-state'}" /> - <Label Name="UnitState" + <Label Name="UnitState" Access="Public" Text="{Loc 'ui-disposal-unit-label-status'}" /> </BoxContainer> <Control MinSize="0 5" /> <BoxContainer Orientation="Horizontal" SeparationOverride="4"> <Label Text="{Loc 'ui-disposal-unit-label-pressure'}" /> - <ui:PressureBar Name="PressureBar" + <disposal:PressureBar Name="PressureBar" + Access="Public" MinSize="190 20" HorizontalAlignment="Right" MinValue="0" @@ -50,4 +53,4 @@ StyleClasses="OpenLeft" /> </BoxContainer> </BoxContainer> -</DefaultWindow> +</controls:FancyWindow> diff --git a/Content.Client/Disposal/Mailing/MailingUnitWindow.xaml.cs b/Content.Client/Disposal/Mailing/MailingUnitWindow.xaml.cs new file mode 100644 index 0000000000..8f1dcaf7dc --- /dev/null +++ b/Content.Client/Disposal/Mailing/MailingUnitWindow.xaml.cs @@ -0,0 +1,27 @@ +using Content.Client.UserInterface.Controls; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Timing; + +namespace Content.Client.Disposal.Mailing +{ + /// <summary> + /// Client-side UI used to control a <see cref="Shared.Disposal.Components.MailingUnitComponent"/> + /// </summary> + [GenerateTypedNameReferences] + public sealed partial class MailingUnitWindow : FancyWindow + { + public TimeSpan FullPressure; + + public MailingUnitWindow() + { + RobustXamlLoader.Load(this); + } + + protected override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + PressureBar.UpdatePressure(FullPressure); + } + } +} diff --git a/Content.Client/Disposal/UI/PressureBar.cs b/Content.Client/Disposal/PressureBar.cs similarity index 96% rename from Content.Client/Disposal/UI/PressureBar.cs rename to Content.Client/Disposal/PressureBar.cs index bff95ca430..7b2ebacaf7 100644 --- a/Content.Client/Disposal/UI/PressureBar.cs +++ b/Content.Client/Disposal/PressureBar.cs @@ -1,9 +1,10 @@ using Content.Shared.Disposal; +using Content.Shared.Disposal.Unit; using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; using Robust.Shared.Timing; -namespace Content.Client.Disposal.UI; +namespace Content.Client.Disposal; public sealed class PressureBar : ProgressBar { diff --git a/Content.Client/Disposal/Systems/DisposalUnitSystem.cs b/Content.Client/Disposal/Systems/DisposalUnitSystem.cs deleted file mode 100644 index da548c1e54..0000000000 --- a/Content.Client/Disposal/Systems/DisposalUnitSystem.cs +++ /dev/null @@ -1,187 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Shared.Disposal; -using Content.Shared.Disposal.Components; -using Content.Shared.DragDrop; -using Content.Shared.Emag.Systems; -using Robust.Client.GameObjects; -using Robust.Client.Animations; -using Robust.Client.Graphics; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; -using Robust.Shared.GameStates; -using Robust.Shared.Physics.Events; -using static Content.Shared.Disposal.Components.SharedDisposalUnitComponent; - -namespace Content.Client.Disposal.Systems; - -public sealed class DisposalUnitSystem : SharedDisposalUnitSystem -{ - [Dependency] private readonly AppearanceSystem _appearanceSystem = default!; - [Dependency] private readonly AnimationPlayerSystem _animationSystem = default!; - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; - - private const string AnimationKey = "disposal_unit_animation"; - - private const string DefaultFlushState = "disposal-flush"; - private const string DefaultChargeState = "disposal-charging"; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent<DisposalUnitComponent, ComponentHandleState>(OnHandleState); - SubscribeLocalEvent<DisposalUnitComponent, PreventCollideEvent>(OnPreventCollide); - SubscribeLocalEvent<DisposalUnitComponent, CanDropTargetEvent>(OnCanDragDropOn); - SubscribeLocalEvent<DisposalUnitComponent, GotEmaggedEvent>(OnEmagged); - - SubscribeLocalEvent<DisposalUnitComponent, ComponentInit>(OnComponentInit); - SubscribeLocalEvent<DisposalUnitComponent, AppearanceChangeEvent>(OnAppearanceChange); - } - - private void OnHandleState(EntityUid uid, DisposalUnitComponent component, ref ComponentHandleState args) - { - if (args.Current is not DisposalUnitComponentState state) - return; - - component.FlushSound = state.FlushSound; - component.State = state.State; - component.NextPressurized = state.NextPressurized; - component.AutomaticEngageTime = state.AutomaticEngageTime; - component.NextFlush = state.NextFlush; - component.Powered = state.Powered; - component.Engaged = state.Engaged; - component.RecentlyEjected.Clear(); - component.RecentlyEjected.AddRange(EnsureEntityList<DisposalUnitComponent>(state.RecentlyEjected, uid)); - } - - public override bool HasDisposals(EntityUid? uid) - { - return HasComp<DisposalUnitComponent>(uid); - } - - public override bool ResolveDisposals(EntityUid uid, [NotNullWhen(true)] ref SharedDisposalUnitComponent? component) - { - if (component != null) - return true; - - TryComp<DisposalUnitComponent>(uid, out var storage); - component = storage; - return component != null; - } - - public override void DoInsertDisposalUnit(EntityUid uid, EntityUid toInsert, EntityUid user, SharedDisposalUnitComponent? disposal = null) - { - return; - } - - private void OnComponentInit(EntityUid uid, SharedDisposalUnitComponent sharedDisposalUnit, ComponentInit args) - { - if (!TryComp<SpriteComponent>(uid, out var sprite) || !TryComp<AppearanceComponent>(uid, out var appearance)) - return; - - UpdateState(uid, sharedDisposalUnit, sprite, appearance); - } - - private void OnAppearanceChange(EntityUid uid, SharedDisposalUnitComponent unit, ref AppearanceChangeEvent args) - { - if (args.Sprite == null) - return; - - UpdateState(uid, unit, args.Sprite, args.Component); - } - - /// <summary> - /// Update visuals and tick animation - /// </summary> - private void UpdateState(EntityUid uid, SharedDisposalUnitComponent unit, SpriteComponent sprite, AppearanceComponent appearance) - { - if (!_appearanceSystem.TryGetData<VisualState>(uid, Visuals.VisualState, out var state, appearance)) - return; - - sprite.LayerSetVisible(DisposalUnitVisualLayers.Unanchored, state == VisualState.UnAnchored); - sprite.LayerSetVisible(DisposalUnitVisualLayers.Base, state == VisualState.Anchored); - sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFlush, state is VisualState.OverlayFlushing or VisualState.OverlayCharging); - - var chargingState = sprite.LayerMapTryGet(DisposalUnitVisualLayers.BaseCharging, out var chargingLayer) - ? sprite.LayerGetState(chargingLayer) - : new RSI.StateId(DefaultChargeState); - - // This is a transient state so not too worried about replaying in range. - if (state == VisualState.OverlayFlushing) - { - if (!_animationSystem.HasRunningAnimation(uid, AnimationKey)) - { - var flushState = sprite.LayerMapTryGet(DisposalUnitVisualLayers.OverlayFlush, out var flushLayer) - ? sprite.LayerGetState(flushLayer) - : new RSI.StateId(DefaultFlushState); - - // Setup the flush animation to play - var anim = new Animation - { - Length = unit.FlushDelay, - AnimationTracks = - { - new AnimationTrackSpriteFlick - { - LayerKey = DisposalUnitVisualLayers.OverlayFlush, - KeyFrames = - { - // Play the flush animation - new AnimationTrackSpriteFlick.KeyFrame(flushState, 0), - // Return to base state (though, depending on how the unit is - // configured we might get an appearance change event telling - // us to go to charging state) - new AnimationTrackSpriteFlick.KeyFrame(chargingState, (float) unit.FlushDelay.TotalSeconds) - } - }, - } - }; - - if (unit.FlushSound != null) - { - anim.AnimationTracks.Add( - new AnimationTrackPlaySound - { - KeyFrames = - { - new AnimationTrackPlaySound.KeyFrame(_audioSystem.ResolveSound(unit.FlushSound), 0) - } - }); - } - - _animationSystem.Play(uid, anim, AnimationKey); - } - } - else if (state == VisualState.OverlayCharging) - sprite.LayerSetState(DisposalUnitVisualLayers.OverlayFlush, chargingState); - else - _animationSystem.Stop(uid, AnimationKey); - - if (!_appearanceSystem.TryGetData<HandleState>(uid, Visuals.Handle, out var handleState, appearance)) - handleState = HandleState.Normal; - - sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayEngaged, handleState != HandleState.Normal); - - if (!_appearanceSystem.TryGetData<LightStates>(uid, Visuals.Light, out var lightState, appearance)) - lightState = LightStates.Off; - - sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayCharging, - (lightState & LightStates.Charging) != 0); - sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayReady, - (lightState & LightStates.Ready) != 0); - sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFull, - (lightState & LightStates.Full) != 0); - } -} - -public enum DisposalUnitVisualLayers : byte -{ - Unanchored, - Base, - BaseCharging, - OverlayFlush, - OverlayCharging, - OverlayReady, - OverlayFull, - OverlayEngaged -} diff --git a/Content.Client/Disposal/UI/DisposalRouterBoundUserInterface.cs b/Content.Client/Disposal/Tube/DisposalRouterBoundUserInterface.cs similarity index 95% rename from Content.Client/Disposal/UI/DisposalRouterBoundUserInterface.cs rename to Content.Client/Disposal/Tube/DisposalRouterBoundUserInterface.cs index 296e71d3a9..1116dc7257 100644 --- a/Content.Client/Disposal/UI/DisposalRouterBoundUserInterface.cs +++ b/Content.Client/Disposal/Tube/DisposalRouterBoundUserInterface.cs @@ -1,9 +1,8 @@ using JetBrains.Annotations; -using Robust.Client.GameObjects; using Robust.Client.UserInterface; using static Content.Shared.Disposal.Components.SharedDisposalRouterComponent; -namespace Content.Client.Disposal.UI +namespace Content.Client.Disposal.Tube { /// <summary> /// Initializes a <see cref="DisposalRouterWindow"/> and updates it when new server messages are received. diff --git a/Content.Client/Disposal/UI/DisposalRouterWindow.xaml b/Content.Client/Disposal/Tube/DisposalRouterWindow.xaml similarity index 100% rename from Content.Client/Disposal/UI/DisposalRouterWindow.xaml rename to Content.Client/Disposal/Tube/DisposalRouterWindow.xaml diff --git a/Content.Client/Disposal/UI/DisposalRouterWindow.xaml.cs b/Content.Client/Disposal/Tube/DisposalRouterWindow.xaml.cs similarity index 90% rename from Content.Client/Disposal/UI/DisposalRouterWindow.xaml.cs rename to Content.Client/Disposal/Tube/DisposalRouterWindow.xaml.cs index 39ee9fbe23..c9d7d286eb 100644 --- a/Content.Client/Disposal/UI/DisposalRouterWindow.xaml.cs +++ b/Content.Client/Disposal/Tube/DisposalRouterWindow.xaml.cs @@ -1,11 +1,10 @@ using Content.Shared.Disposal.Components; using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using static Content.Shared.Disposal.Components.SharedDisposalRouterComponent; -namespace Content.Client.Disposal.UI +namespace Content.Client.Disposal.Tube { /// <summary> /// Client-side UI used to control a <see cref="SharedDisposalRouterComponent"/> diff --git a/Content.Client/Disposal/UI/DisposalTaggerBoundUserInterface.cs b/Content.Client/Disposal/Tube/DisposalTaggerBoundUserInterface.cs similarity index 95% rename from Content.Client/Disposal/UI/DisposalTaggerBoundUserInterface.cs rename to Content.Client/Disposal/Tube/DisposalTaggerBoundUserInterface.cs index 7fc0eb8540..5618e83ecf 100644 --- a/Content.Client/Disposal/UI/DisposalTaggerBoundUserInterface.cs +++ b/Content.Client/Disposal/Tube/DisposalTaggerBoundUserInterface.cs @@ -1,9 +1,8 @@ using JetBrains.Annotations; -using Robust.Client.GameObjects; using Robust.Client.UserInterface; using static Content.Shared.Disposal.Components.SharedDisposalTaggerComponent; -namespace Content.Client.Disposal.UI +namespace Content.Client.Disposal.Tube { /// <summary> /// Initializes a <see cref="DisposalTaggerWindow"/> and updates it when new server messages are received. diff --git a/Content.Client/Disposal/UI/DisposalTaggerWindow.xaml b/Content.Client/Disposal/Tube/DisposalTaggerWindow.xaml similarity index 100% rename from Content.Client/Disposal/UI/DisposalTaggerWindow.xaml rename to Content.Client/Disposal/Tube/DisposalTaggerWindow.xaml diff --git a/Content.Client/Disposal/UI/DisposalTaggerWindow.xaml.cs b/Content.Client/Disposal/Tube/DisposalTaggerWindow.xaml.cs similarity index 90% rename from Content.Client/Disposal/UI/DisposalTaggerWindow.xaml.cs rename to Content.Client/Disposal/Tube/DisposalTaggerWindow.xaml.cs index b49d5d997b..ae8286cf14 100644 --- a/Content.Client/Disposal/UI/DisposalTaggerWindow.xaml.cs +++ b/Content.Client/Disposal/Tube/DisposalTaggerWindow.xaml.cs @@ -1,11 +1,10 @@ using Content.Shared.Disposal.Components; using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using static Content.Shared.Disposal.Components.SharedDisposalTaggerComponent; -namespace Content.Client.Disposal.UI +namespace Content.Client.Disposal.Tube { /// <summary> /// Client-side UI used to control a <see cref="SharedDisposalTaggerComponent"/> diff --git a/Content.Client/Disposal/Tube/DisposalTubeSystem.cs b/Content.Client/Disposal/Tube/DisposalTubeSystem.cs new file mode 100644 index 0000000000..fd86f7ec88 --- /dev/null +++ b/Content.Client/Disposal/Tube/DisposalTubeSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Disposal.Unit; + +namespace Content.Client.Disposal.Tube; + +public sealed class DisposalTubeSystem : SharedDisposalTubeSystem +{ + +} diff --git a/Content.Client/Disposal/UI/DisposalUnitBoundUserInterface.cs b/Content.Client/Disposal/UI/DisposalUnitBoundUserInterface.cs deleted file mode 100644 index d2bec6e94f..0000000000 --- a/Content.Client/Disposal/UI/DisposalUnitBoundUserInterface.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Content.Client.Disposal.Systems; -using Content.Shared.Disposal; -using Content.Shared.Disposal.Components; -using JetBrains.Annotations; -using Robust.Client.GameObjects; -using Robust.Client.UserInterface.Controls; -using static Content.Shared.Disposal.Components.SharedDisposalUnitComponent; - -namespace Content.Client.Disposal.UI -{ - /// <summary> - /// Initializes a <see cref="MailingUnitWindow"/> or a <see cref="DisposalUnitWindow"/> and updates it when new server messages are received. - /// </summary> - [UsedImplicitly] - public sealed class DisposalUnitBoundUserInterface : BoundUserInterface - { - // What are you doing here - [ViewVariables] - public MailingUnitWindow? MailingUnitWindow; - - [ViewVariables] - public DisposalUnitWindow? DisposalUnitWindow; - - public DisposalUnitBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) - { - } - - private void ButtonPressed(UiButton button) - { - SendMessage(new UiButtonPressedMessage(button)); - // If we get client-side power stuff then we can predict the button presses but for now we won't as it stuffs - // the pressure lerp up. - } - - private void TargetSelected(ItemList.ItemListSelectedEventArgs args) - { - var item = args.ItemList[args.ItemIndex]; - SendMessage(new TargetSelectedMessage(item.Text)); - } - - protected override void Open() - { - base.Open(); - - if (UiKey is MailingUnitUiKey) - { - MailingUnitWindow = new MailingUnitWindow(); - - MailingUnitWindow.OpenCenteredRight(); - MailingUnitWindow.OnClose += Close; - - MailingUnitWindow.Eject.OnPressed += _ => ButtonPressed(UiButton.Eject); - MailingUnitWindow.Engage.OnPressed += _ => ButtonPressed(UiButton.Engage); - MailingUnitWindow.Power.OnPressed += _ => ButtonPressed(UiButton.Power); - - MailingUnitWindow.TargetListContainer.OnItemSelected += TargetSelected; - } - else if (UiKey is DisposalUnitUiKey) - { - DisposalUnitWindow = new DisposalUnitWindow(); - - DisposalUnitWindow.OpenCenteredRight(); - DisposalUnitWindow.OnClose += Close; - - DisposalUnitWindow.Eject.OnPressed += _ => ButtonPressed(UiButton.Eject); - DisposalUnitWindow.Engage.OnPressed += _ => ButtonPressed(UiButton.Engage); - DisposalUnitWindow.Power.OnPressed += _ => ButtonPressed(UiButton.Power); - } - } - - protected override void UpdateState(BoundUserInterfaceState state) - { - base.UpdateState(state); - - if (state is not MailingUnitBoundUserInterfaceState && state is not DisposalUnitBoundUserInterfaceState) - { - return; - } - - switch (state) - { - case MailingUnitBoundUserInterfaceState mailingUnitState: - MailingUnitWindow?.UpdateState(mailingUnitState); - break; - - case DisposalUnitBoundUserInterfaceState disposalUnitState: - DisposalUnitWindow?.UpdateState(disposalUnitState); - break; - } - } - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - - if (!disposing) - return; - - MailingUnitWindow?.Dispose(); - DisposalUnitWindow?.Dispose(); - } - } -} diff --git a/Content.Client/Disposal/UI/DisposalUnitWindow.xaml.cs b/Content.Client/Disposal/UI/DisposalUnitWindow.xaml.cs deleted file mode 100644 index 3440fe208a..0000000000 --- a/Content.Client/Disposal/UI/DisposalUnitWindow.xaml.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Content.Shared.Disposal.Components; -using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.CustomControls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Timing; -using static Content.Shared.Disposal.Components.SharedDisposalUnitComponent; - -namespace Content.Client.Disposal.UI -{ - /// <summary> - /// Client-side UI used to control a <see cref="SharedDisposalUnitComponent"/> - /// </summary> - [GenerateTypedNameReferences] - public sealed partial class DisposalUnitWindow : DefaultWindow - { - public TimeSpan FullPressure; - - public DisposalUnitWindow() - { - IoCManager.InjectDependencies(this); - RobustXamlLoader.Load(this); - } - - /// <summary> - /// Update the interface state for the disposals window. - /// </summary> - /// <returns>true if we should stop updating every frame.</returns> - public void UpdateState(DisposalUnitBoundUserInterfaceState state) - { - Title = state.UnitName; - UnitState.Text = state.UnitState; - Power.Pressed = state.Powered; - Engage.Pressed = state.Engaged; - FullPressure = state.FullPressureTime; - } - - protected override void FrameUpdate(FrameEventArgs args) - { - base.FrameUpdate(args); - PressureBar.UpdatePressure(FullPressure); - } - } -} diff --git a/Content.Client/Disposal/UI/MailingUnitWindow.xaml.cs b/Content.Client/Disposal/UI/MailingUnitWindow.xaml.cs deleted file mode 100644 index 489d749a0c..0000000000 --- a/Content.Client/Disposal/UI/MailingUnitWindow.xaml.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Content.Shared.Disposal; -using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.CustomControls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Timing; - -namespace Content.Client.Disposal.UI -{ - /// <summary> - /// Client-side UI used to control a <see cref="MailingUnitComponent"/> - /// </summary> - [GenerateTypedNameReferences] - public sealed partial class MailingUnitWindow : DefaultWindow - { - public TimeSpan FullPressure; - - public MailingUnitWindow() - { - RobustXamlLoader.Load(this); - } - - /// <summary> - /// Update the interface state for the disposals window. - /// </summary> - /// <returns>true if we should stop updating every frame.</returns> - public bool UpdateState(MailingUnitBoundUserInterfaceState state) - { - var disposalState = state.DisposalState; - - Title = Loc.GetString("ui-mailing-unit-window-title", ("tag", state.Tag ?? " ")); - UnitState.Text = disposalState.UnitState; - FullPressure = disposalState.FullPressureTime; - var pressureReached = PressureBar.UpdatePressure(disposalState.FullPressureTime); - Power.Pressed = disposalState.Powered; - Engage.Pressed = disposalState.Engaged; - - //UnitTag.Text = state.Tag; - Target.Text = state.Target; - - TargetListContainer.Clear(); - foreach (var target in state.TargetList) - { - TargetListContainer.AddItem(target); - } - - return !disposalState.Powered || pressureReached; - } - - protected override void FrameUpdate(FrameEventArgs args) - { - base.FrameUpdate(args); - PressureBar.UpdatePressure(FullPressure); - } - } -} diff --git a/Content.Client/Disposal/Unit/DisposalUnitBoundUserInterface.cs b/Content.Client/Disposal/Unit/DisposalUnitBoundUserInterface.cs new file mode 100644 index 0000000000..62386291a4 --- /dev/null +++ b/Content.Client/Disposal/Unit/DisposalUnitBoundUserInterface.cs @@ -0,0 +1,63 @@ +using Content.Client.Disposal.Mailing; +using Content.Client.Power.EntitySystems; +using Content.Shared.Disposal.Components; +using JetBrains.Annotations; +using Robust.Client.UserInterface; + +namespace Content.Client.Disposal.Unit +{ + /// <summary> + /// Initializes a <see cref="MailingUnitWindow"/> or a <see cref="_disposalUnitWindow"/> and updates it when new server messages are received. + /// </summary> + [UsedImplicitly] + public sealed class DisposalUnitBoundUserInterface : BoundUserInterface + { + [ViewVariables] private DisposalUnitWindow? _disposalUnitWindow; + + public DisposalUnitBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + private void ButtonPressed(DisposalUnitComponent.UiButton button) + { + SendPredictedMessage(new DisposalUnitComponent.UiButtonPressedMessage(button)); + // If we get client-side power stuff then we can predict the button presses but for now we won't as it stuffs + // the pressure lerp up. + } + + protected override void Open() + { + base.Open(); + + _disposalUnitWindow = this.CreateWindow<DisposalUnitWindow>(); + + _disposalUnitWindow.OpenCenteredRight(); + + _disposalUnitWindow.Eject.OnPressed += _ => ButtonPressed(DisposalUnitComponent.UiButton.Eject); + _disposalUnitWindow.Engage.OnPressed += _ => ButtonPressed(DisposalUnitComponent.UiButton.Engage); + _disposalUnitWindow.Power.OnPressed += _ => ButtonPressed(DisposalUnitComponent.UiButton.Power); + + if (EntMan.TryGetComponent(Owner, out DisposalUnitComponent? component)) + { + Refresh((Owner, component)); + } + } + + public void Refresh(Entity<DisposalUnitComponent> entity) + { + if (_disposalUnitWindow == null) + return; + + var disposalSystem = EntMan.System<DisposalUnitSystem>(); + + _disposalUnitWindow.Title = EntMan.GetComponent<MetaDataComponent>(entity.Owner).EntityName; + + var state = disposalSystem.GetState(entity.Owner, entity.Comp); + + _disposalUnitWindow.UnitState.Text = Loc.GetString($"disposal-unit-state-{state}"); + _disposalUnitWindow.Power.Pressed = EntMan.System<PowerReceiverSystem>().IsPowered(Owner); + _disposalUnitWindow.Engage.Pressed = entity.Comp.Engaged; + _disposalUnitWindow.FullPressure = disposalSystem.EstimatedFullPressure(entity.Owner, entity.Comp); + } + } +} diff --git a/Content.Client/Disposal/Unit/DisposalUnitSystem.cs b/Content.Client/Disposal/Unit/DisposalUnitSystem.cs new file mode 100644 index 0000000000..30ca320a2a --- /dev/null +++ b/Content.Client/Disposal/Unit/DisposalUnitSystem.cs @@ -0,0 +1,156 @@ +using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Unit; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.Audio.Systems; + +namespace Content.Client.Disposal.Unit; + +public sealed class DisposalUnitSystem : SharedDisposalUnitSystem +{ + [Dependency] private readonly AppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly AnimationPlayerSystem _animationSystem = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; + + private const string AnimationKey = "disposal_unit_animation"; + + private const string DefaultFlushState = "disposal-flush"; + private const string DefaultChargeState = "disposal-charging"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<DisposalUnitComponent, AfterAutoHandleStateEvent>(OnHandleState); + + SubscribeLocalEvent<DisposalUnitComponent, AppearanceChangeEvent>(OnAppearanceChange); + } + + private void OnHandleState(EntityUid uid, DisposalUnitComponent component, ref AfterAutoHandleStateEvent args) + { + UpdateUI((uid, component)); + } + + protected override void UpdateUI(Entity<DisposalUnitComponent> entity) + { + if (_uiSystem.TryGetOpenUi<DisposalUnitBoundUserInterface>(entity.Owner, DisposalUnitComponent.DisposalUnitUiKey.Key, out var bui)) + { + bui.Refresh(entity); + } + } + + protected override void OnDisposalInit(Entity<DisposalUnitComponent> ent, ref ComponentInit args) + { + base.OnDisposalInit(ent, ref args); + + if (!TryComp<SpriteComponent>(ent, out var sprite) || !TryComp<AppearanceComponent>(ent, out var appearance)) + return; + + UpdateState(ent, sprite, appearance); + } + + private void OnAppearanceChange(Entity<DisposalUnitComponent> ent, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + UpdateState(ent, args.Sprite, args.Component); + } + + /// <summary> + /// Update visuals and tick animation + /// </summary> + private void UpdateState(Entity<DisposalUnitComponent> ent, SpriteComponent sprite, AppearanceComponent appearance) + { + if (!_appearanceSystem.TryGetData<DisposalUnitComponent.VisualState>(ent, DisposalUnitComponent.Visuals.VisualState, out var state, appearance)) + return; + + sprite.LayerSetVisible(DisposalUnitVisualLayers.Unanchored, state == DisposalUnitComponent.VisualState.UnAnchored); + sprite.LayerSetVisible(DisposalUnitVisualLayers.Base, state == DisposalUnitComponent.VisualState.Anchored); + sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFlush, state is DisposalUnitComponent.VisualState.OverlayFlushing or DisposalUnitComponent.VisualState.OverlayCharging); + + var chargingState = sprite.LayerMapTryGet(DisposalUnitVisualLayers.BaseCharging, out var chargingLayer) + ? sprite.LayerGetState(chargingLayer) + : new RSI.StateId(DefaultChargeState); + + // This is a transient state so not too worried about replaying in range. + if (state == DisposalUnitComponent.VisualState.OverlayFlushing) + { + if (!_animationSystem.HasRunningAnimation(ent, AnimationKey)) + { + var flushState = sprite.LayerMapTryGet(DisposalUnitVisualLayers.OverlayFlush, out var flushLayer) + ? sprite.LayerGetState(flushLayer) + : new RSI.StateId(DefaultFlushState); + + // Setup the flush animation to play + var anim = new Animation + { + Length = ent.Comp.FlushDelay, + AnimationTracks = + { + new AnimationTrackSpriteFlick + { + LayerKey = DisposalUnitVisualLayers.OverlayFlush, + KeyFrames = + { + // Play the flush animation + new AnimationTrackSpriteFlick.KeyFrame(flushState, 0), + // Return to base state (though, depending on how the unit is + // configured we might get an appearance change event telling + // us to go to charging state) + new AnimationTrackSpriteFlick.KeyFrame(chargingState, (float) ent.Comp.FlushDelay.TotalSeconds) + } + }, + } + }; + + if (ent.Comp.FlushSound != null) + { + anim.AnimationTracks.Add( + new AnimationTrackPlaySound + { + KeyFrames = + { + new AnimationTrackPlaySound.KeyFrame(_audioSystem.ResolveSound(ent.Comp.FlushSound), 0) + } + }); + } + + _animationSystem.Play(ent, anim, AnimationKey); + } + } + else if (state == DisposalUnitComponent.VisualState.OverlayCharging) + sprite.LayerSetState(DisposalUnitVisualLayers.OverlayFlush, chargingState); + else + _animationSystem.Stop(ent.Owner, AnimationKey); + + if (!_appearanceSystem.TryGetData<DisposalUnitComponent.HandleState>(ent, DisposalUnitComponent.Visuals.Handle, out var handleState, appearance)) + handleState = DisposalUnitComponent.HandleState.Normal; + + sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayEngaged, handleState != DisposalUnitComponent.HandleState.Normal); + + if (!_appearanceSystem.TryGetData<DisposalUnitComponent.LightStates>(ent, DisposalUnitComponent.Visuals.Light, out var lightState, appearance)) + lightState = DisposalUnitComponent.LightStates.Off; + + sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayCharging, + (lightState & DisposalUnitComponent.LightStates.Charging) != 0); + sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayReady, + (lightState & DisposalUnitComponent.LightStates.Ready) != 0); + sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFull, + (lightState & DisposalUnitComponent.LightStates.Full) != 0); + } +} + +public enum DisposalUnitVisualLayers : byte +{ + Unanchored, + Base, + BaseCharging, + OverlayFlush, + OverlayCharging, + OverlayReady, + OverlayFull, + OverlayEngaged +} diff --git a/Content.Client/Disposal/UI/DisposalUnitWindow.xaml b/Content.Client/Disposal/Unit/DisposalUnitWindow.xaml similarity index 72% rename from Content.Client/Disposal/UI/DisposalUnitWindow.xaml rename to Content.Client/Disposal/Unit/DisposalUnitWindow.xaml index c8acef98ea..60ca7ba0db 100644 --- a/Content.Client/Disposal/UI/DisposalUnitWindow.xaml +++ b/Content.Client/Disposal/Unit/DisposalUnitWindow.xaml @@ -1,20 +1,21 @@ -<DefaultWindow xmlns="https://spacestation14.io" - xmlns:ui="clr-namespace:Content.Client.Disposal.UI" - MinSize="300 140" - SetSize="300 140" +<controls:FancyWindow xmlns="https://spacestation14.io" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + xmlns:disposal="clr-namespace:Content.Client.Disposal" + MinSize="300 140" + SetSize="300 160" Resizable="False"> - <BoxContainer Orientation="Vertical"> + <BoxContainer Orientation="Vertical" Margin="10"> <BoxContainer Orientation="Horizontal" SeparationOverride="4"> <Label Text="{Loc 'ui-disposal-unit-label-state'}" /> - <Label Name="UnitState" + <Label Name="UnitState" Access="Public" Text="{Loc 'ui-disposal-unit-label-status'}" /> </BoxContainer> <Control MinSize="0 5" /> <BoxContainer Orientation="Horizontal" SeparationOverride="4"> <Label Text="{Loc 'ui-disposal-unit-label-pressure'}" /> - <ui:PressureBar Name="PressureBar" + <disposal:PressureBar Name="PressureBar" MinSize="190 20" HorizontalAlignment="Right" MinValue="0" @@ -23,7 +24,7 @@ Value="0.5" /> </BoxContainer> <Control MinSize="0 10" /> - <BoxContainer Orientation="Horizontal"> + <BoxContainer Orientation="Horizontal" HorizontalExpand="True"> <Button Name="Engage" Access="Public" Text="{Loc 'ui-disposal-unit-button-flush'}" @@ -39,4 +40,4 @@ StyleClasses="OpenLeft" /> </BoxContainer> </BoxContainer> -</DefaultWindow> +</controls:FancyWindow> diff --git a/Content.Client/Disposal/Unit/DisposalUnitWindow.xaml.cs b/Content.Client/Disposal/Unit/DisposalUnitWindow.xaml.cs new file mode 100644 index 0000000000..db4d58e782 --- /dev/null +++ b/Content.Client/Disposal/Unit/DisposalUnitWindow.xaml.cs @@ -0,0 +1,28 @@ +using Content.Client.UserInterface.Controls; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Timing; + +namespace Content.Client.Disposal.Unit +{ + /// <summary> + /// Client-side UI used to control a <see cref="Shared.Disposal.Components.DisposalUnitComponent"/> + /// </summary> + [GenerateTypedNameReferences] + public sealed partial class DisposalUnitWindow : FancyWindow + { + public TimeSpan FullPressure; + + public DisposalUnitWindow() + { + IoCManager.InjectDependencies(this); + RobustXamlLoader.Load(this); + } + + protected override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + PressureBar.UpdatePressure(FullPressure); + } + } +} diff --git a/Content.Client/NetworkConfigurator/Systems/DeviceListSystem.cs b/Content.Client/NetworkConfigurator/Systems/DeviceListSystem.cs index 0b9fd6db05..131fa54d43 100644 --- a/Content.Client/NetworkConfigurator/Systems/DeviceListSystem.cs +++ b/Content.Client/NetworkConfigurator/Systems/DeviceListSystem.cs @@ -1,4 +1,3 @@ -using Content.Shared.DeviceNetwork; using Content.Shared.DeviceNetwork.Systems; namespace Content.Client.NetworkConfigurator.Systems; diff --git a/Content.Client/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Client/Power/EntitySystems/PowerReceiverSystem.cs index 319ab5c56d..0b19d8aced 100644 --- a/Content.Client/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Client/Power/EntitySystems/PowerReceiverSystem.cs @@ -3,6 +3,7 @@ using Content.Client.Power.Components; using Content.Shared.Power.Components; using Content.Shared.Power.EntitySystems; using Content.Shared.Examine; +using Content.Shared.Power; using Robust.Shared.GameStates; namespace Content.Client.Power.EntitySystems; @@ -26,9 +27,20 @@ public sealed class PowerReceiverSystem : SharedPowerReceiverSystem if (args.Current is not ApcPowerReceiverComponentState state) return; + var powerChanged = component.Powered != state.Powered; component.Powered = state.Powered; component.NeedsPower = state.NeedsPower; component.PowerDisabled = state.PowerDisabled; + // SO client systems can handle it. The main reason for this is we can't guarantee compstate ordering. + + if (powerChanged) + RaisePower((uid, component)); + } + + protected override void RaisePower(Entity<SharedApcPowerReceiverComponent> entity) + { + var ev = new PowerChangedEvent(entity.Comp.Powered, 0f); + RaiseLocalEvent(entity.Owner, ref ev); } public override bool ResolveApc(EntityUid entity, [NotNullWhen(true)] ref SharedApcPowerReceiverComponent? component) diff --git a/Content.Client/Storage/Visualizers/StorageFillVisualizerSystem.cs b/Content.Client/Storage/Visualizers/StorageFillVisualizerSystem.cs index cb949ebbfd..9b0c487a02 100644 --- a/Content.Client/Storage/Visualizers/StorageFillVisualizerSystem.cs +++ b/Content.Client/Storage/Visualizers/StorageFillVisualizerSystem.cs @@ -11,9 +11,6 @@ public sealed class StorageFillVisualizerSystem : VisualizerSystem<StorageFillVi if (args.Sprite == null) return; - if (!TryComp(uid, out SpriteComponent? sprite)) - return; - if (!AppearanceSystem.TryGetData<int>(uid, StorageFillVisuals.FillLevel, out var level, args.Component)) return; diff --git a/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs b/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs index b37f7cfa46..fdc0e1a4d4 100644 --- a/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs +++ b/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTest.cs @@ -1,12 +1,10 @@ using System.Numerics; -using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Shared.DeviceNetwork; using Robust.Shared.GameObjects; -using Robust.Shared.IoC; using Robust.Shared.Map; -using Robust.Shared.Map.Components; +using Content.Shared.DeviceNetwork.Components; namespace Content.IntegrationTests.Tests.DeviceNetwork { diff --git a/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTestSystem.cs b/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTestSystem.cs index 400d85f2cc..c314f41234 100644 --- a/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTestSystem.cs +++ b/Content.IntegrationTests/Tests/DeviceNetwork/DeviceNetworkTestSystem.cs @@ -1,31 +1,30 @@ -using Content.Server.DeviceNetwork.Components; -using Content.Server.DeviceNetwork.Systems; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Robust.Shared.GameObjects; using Robust.Shared.Reflection; +using Content.Shared.DeviceNetwork.Components; -namespace Content.IntegrationTests.Tests.DeviceNetwork +namespace Content.IntegrationTests.Tests.DeviceNetwork; + +[Reflect(false)] +public sealed class DeviceNetworkTestSystem : EntitySystem { - [Reflect(false)] - public sealed class DeviceNetworkTestSystem : EntitySystem + public NetworkPayload LastPayload = default; + + public override void Initialize() { - public NetworkPayload LastPayload = default; + base.Initialize(); - public override void Initialize() - { - base.Initialize(); + SubscribeLocalEvent<DeviceNetworkComponent, DeviceNetworkPacketEvent>(OnPacketReceived); + } - SubscribeLocalEvent<DeviceNetworkComponent, DeviceNetworkPacketEvent>(OnPacketReceived); - } + public void SendBaselineTestEvent(EntityUid uid) + { + RaiseLocalEvent(uid, new DeviceNetworkPacketEvent(0, "", 0, "", uid, new NetworkPayload())); + } - public void SendBaselineTestEvent(EntityUid uid) - { - RaiseLocalEvent(uid, new DeviceNetworkPacketEvent(0, "", 0, "", uid, new NetworkPayload())); - } - - private void OnPacketReceived(EntityUid uid, DeviceNetworkComponent component, DeviceNetworkPacketEvent args) - { - LastPayload = args.Data; - } + private void OnPacketReceived(EntityUid uid, DeviceNetworkComponent component, DeviceNetworkPacketEvent args) + { + LastPayload = args.Data; } } diff --git a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs index 9109fdbe4f..8cfe8fbfcd 100644 --- a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs +++ b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs @@ -1,13 +1,12 @@ #nullable enable annotations using System.Linq; using System.Numerics; -using Content.Server.Disposal.Tube.Components; -using Content.Server.Disposal.Unit.Components; -using Content.Server.Disposal.Unit.EntitySystems; +using Content.Server.Disposal.Unit; using Content.Server.Power.Components; -using Content.Shared.Disposal; +using Content.Server.Power.EntitySystems; using Content.Shared.Disposal.Components; -using NUnit.Framework; +using Content.Shared.Disposal.Tube; +using Content.Shared.Disposal.Unit; using Robust.Shared.GameObjects; using Robust.Shared.Reflection; @@ -30,7 +29,6 @@ namespace Content.IntegrationTests.Tests.Disposal { var (_, toInsert, unit) = ev; var insertTransform = EntityManager.GetComponent<TransformComponent>(toInsert); - var unitTransform = EntityManager.GetComponent<TransformComponent>(unit); // Not in a tube yet Assert.That(insertTransform.ParentUid, Is.EqualTo(unit)); }, after: new[] { typeof(SharedDisposalUnitSystem) }); @@ -163,6 +161,8 @@ namespace Content.IntegrationTests.Tests.Disposal var entityManager = server.ResolveDependency<IEntityManager>(); var xformSystem = entityManager.System<SharedTransformSystem>(); var disposalSystem = entityManager.System<DisposalUnitSystem>(); + var power = entityManager.System<PowerReceiverSystem>(); + await server.WaitAssertion(() => { // Spawn the entities @@ -191,7 +191,7 @@ namespace Content.IntegrationTests.Tests.Disposal xformSystem.AnchorEntity(unitUid, entityManager.GetComponent<TransformComponent>(unitUid)); // No power - Assert.That(unitComponent.Powered, Is.False); + Assert.That(power.IsPowered(unitUid), Is.False); // Can't insert the trunk or the unit into itself UnitInsertContains(unitUid, unitComponent, false, disposalSystem, disposalUnit, disposalTrunk); @@ -227,9 +227,9 @@ namespace Content.IntegrationTests.Tests.Disposal await server.WaitAssertion(() => { // Remove power need - Assert.That(entityManager.TryGetComponent(disposalUnit, out ApcPowerReceiverComponent power)); - power!.NeedsPower = false; - unitComponent.Powered = true; //Power state changed event doesn't get fired smh + Assert.That(entityManager.TryGetComponent(disposalUnit, out ApcPowerReceiverComponent powerComp)); + power.SetNeedsPower(disposalUnit, false); + powerComp.Powered = true; // Flush with a mob and an item Flush(disposalUnit, unitComponent, true, disposalSystem, human, wrench); diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index c953277aad..d94a277173 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Administration.UI; using Content.Server.Disposal.Tube; -using Content.Server.Disposal.Tube.Components; using Content.Server.EUI; using Content.Server.GameTicking; using Content.Server.Ghost.Roles; @@ -24,7 +23,6 @@ using Content.Shared.Verbs; using Robust.Server.Console; using Robust.Server.GameObjects; using Robust.Shared.Console; -using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Prototypes; diff --git a/Content.Server/Atmos/Consoles/AtmosAlertsComputerSystem.cs b/Content.Server/Atmos/Consoles/AtmosAlertsComputerSystem.cs index 6e3a11b5f9..f4613b1d05 100644 --- a/Content.Server/Atmos/Consoles/AtmosAlertsComputerSystem.cs +++ b/Content.Server/Atmos/Consoles/AtmosAlertsComputerSystem.cs @@ -1,5 +1,4 @@ using Content.Server.Atmos.Monitor.Components; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.Pinpointer; using Content.Server.Power.Components; diff --git a/Content.Server/Atmos/Consoles/AtmosMonitoringConsoleSystem.cs b/Content.Server/Atmos/Consoles/AtmosMonitoringConsoleSystem.cs index 5ecadc7154..8c786e5b21 100644 --- a/Content.Server/Atmos/Consoles/AtmosMonitoringConsoleSystem.cs +++ b/Content.Server/Atmos/Consoles/AtmosMonitoringConsoleSystem.cs @@ -17,6 +17,7 @@ using Robust.Shared.Map.Components; using Robust.Shared.Timing; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Atmos.Consoles; @@ -360,7 +361,7 @@ public sealed class AtmosMonitoringConsoleSystem : SharedAtmosMonitoringConsoleS chunk.AtmosPipeData[index] = atmosPipeData & ~mask; } - // Rebuild the tile's pipe data + // Rebuild the tile's pipe data foreach (var ent in _sharedMapSystem.GetAnchoredEntities(gridUid, grid, coords)) { if (!TryComp<AtmosPipeColorComponent>(ent, out var entAtmosPipeColor)) diff --git a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs index 0ed91a9bc8..0ed33eaa46 100644 --- a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs @@ -1,11 +1,8 @@ using Content.Server.Atmos.Monitor.Components; using Content.Server.Atmos.Piping.Components; using Content.Server.DeviceLinking.Systems; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.Popups; -using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; @@ -22,8 +19,9 @@ using Content.Shared.Interaction; using Content.Shared.Power; using Content.Shared.Wires; using Robust.Server.GameObjects; -using Robust.Shared.Player; using System.Linq; +using Content.Shared.DeviceNetwork.Events; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Atmos.Monitor.Systems; diff --git a/Content.Server/Atmos/Monitor/Systems/AtmosAlarmableSystem.cs b/Content.Server/Atmos/Monitor/Systems/AtmosAlarmableSystem.cs index 81a3968e6f..918b0f33ff 100644 --- a/Content.Server/Atmos/Monitor/Systems/AtmosAlarmableSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AtmosAlarmableSystem.cs @@ -1,19 +1,17 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Server.Atmos.Monitor.Components; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Power.Components; using Content.Shared.Atmos.Monitor; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; using Content.Shared.Tag; using Robust.Server.Audio; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Prototypes; -using Robust.Shared.Utility; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Atmos.Monitor.Systems; diff --git a/Content.Server/Atmos/Monitor/Systems/AtmosMonitoringSystem.cs b/Content.Server/Atmos/Monitor/Systems/AtmosMonitoringSystem.cs index 99cf0109bb..520afe0c58 100644 --- a/Content.Server/Atmos/Monitor/Systems/AtmosMonitoringSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AtmosMonitoringSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Atmos.Monitor; using Content.Shared.Atmos.Piping.Components; using Content.Shared.Database; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; using Content.Shared.Tag; using Robust.Shared.Prototypes; diff --git a/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs index 6d768c1292..d7a9a188f9 100644 --- a/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs @@ -1,18 +1,12 @@ -using Content.Server.AlertLevel; using Content.Server.Atmos.Monitor.Components; -using Content.Server.DeviceNetwork.Components; -using Content.Server.DeviceNetwork.Systems; -using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Shared.Access.Systems; -using Content.Shared.AlertLevel; using Content.Shared.Atmos.Monitor; using Content.Shared.CCVar; -using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.DeviceNetwork.Systems; using Content.Shared.Interaction; using Content.Shared.Emag.Systems; -using Robust.Server.GameObjects; using Robust.Shared.Configuration; namespace Content.Server.Atmos.Monitor.Systems; diff --git a/Content.Server/Atmos/Monitor/WireActions/AirAlarmPanicWire.cs b/Content.Server/Atmos/Monitor/WireActions/AirAlarmPanicWire.cs index 1171b36fb9..c7c615455b 100644 --- a/Content.Server/Atmos/Monitor/WireActions/AirAlarmPanicWire.cs +++ b/Content.Server/Atmos/Monitor/WireActions/AirAlarmPanicWire.cs @@ -1,9 +1,9 @@ using Content.Server.Atmos.Monitor.Components; using Content.Server.Atmos.Monitor.Systems; -using Content.Server.DeviceNetwork.Components; using Content.Server.Wires; using Content.Shared.Atmos.Monitor.Components; using Content.Shared.Wires; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Atmos.Monitor; diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs index 1650427be5..c6c660614a 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs @@ -1,8 +1,6 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.Monitor.Systems; using Content.Server.Atmos.Piping.Components; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; @@ -12,8 +10,10 @@ using Content.Shared.Atmos.Piping.Binary.Systems; using Content.Shared.Atmos.Piping.Components; using Content.Shared.Audio; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using JetBrains.Annotations; using Robust.Server.GameObjects; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Atmos.Piping.Binary.EntitySystems { diff --git a/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs b/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs index 8cc3f21436..3020b94d49 100644 --- a/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs +++ b/Content.Server/Atmos/Piping/Unary/Components/GasOutletInjectorComponent.cs @@ -1,4 +1,3 @@ -using Content.Server.Atmos.Piping.Binary.Components; using Content.Server.Atmos.Piping.Unary.EntitySystems; using Content.Shared.Atmos; using Content.Shared.Atmos.Piping.Binary.Components; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 827ba0bda5..e4f5f99ed7 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -2,10 +2,7 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.Monitor.Systems; using Content.Server.Atmos.Piping.Components; using Content.Server.Atmos.Piping.Unary.Components; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.NodeContainer; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; using Content.Server.Power.Components; @@ -18,7 +15,9 @@ using Content.Shared.UserInterface; using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Examine; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Atmos.Piping.Unary.EntitySystems { diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs index e9f27a1958..89dfb6aa9d 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentPumpSystem.cs @@ -3,8 +3,6 @@ using Content.Server.Atmos.Monitor.Systems; using Content.Server.Atmos.Piping.Components; using Content.Server.Atmos.Piping.Unary.Components; using Content.Server.DeviceLinking.Systems; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; @@ -20,7 +18,9 @@ using Content.Shared.Audio; using Content.Shared.Database; using Content.Shared.DeviceLinking.Events; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.DoAfter; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Power; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentScrubberSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentScrubberSystem.cs index 38d75701d7..b5c8a9c1a9 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentScrubberSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasVentScrubberSystem.cs @@ -1,25 +1,22 @@ using Content.Server.Atmos.EntitySystems; -using Content.Server.Atmos.Monitor.Components; using Content.Server.Atmos.Monitor.Systems; using Content.Server.Atmos.Piping.Components; using Content.Server.Atmos.Piping.Unary.Components; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.NodeContainer; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; -using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Shared.Administration.Logs; using Content.Shared.Atmos; -using Content.Shared.Atmos.Piping.Unary.Visuals; using Content.Shared.Atmos.Monitor; using Content.Shared.Atmos.Piping.Components; using Content.Shared.Atmos.Piping.Unary.Components; +using Content.Shared.Atmos.Piping.Unary.Visuals; using Content.Shared.Audio; using Content.Shared.Database; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; using Content.Shared.Tools.Systems; using JetBrains.Annotations; diff --git a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs index 8637e44e62..405d1cee9f 100644 --- a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs +++ b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs @@ -3,6 +3,7 @@ using System.Linq; using Content.Server.DeviceNetwork.Systems; using Content.Server.PDA; using Content.Shared.CartridgeLoader; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Interaction; using Robust.Server.Containers; using Robust.Server.GameObjects; diff --git a/Content.Server/CartridgeLoader/Cartridges/NetProbeCartridgeSystem.cs b/Content.Server/CartridgeLoader/Cartridges/NetProbeCartridgeSystem.cs index f01be1fc71..aaeaf0325e 100644 --- a/Content.Server/CartridgeLoader/Cartridges/NetProbeCartridgeSystem.cs +++ b/Content.Server/CartridgeLoader/Cartridges/NetProbeCartridgeSystem.cs @@ -1,11 +1,10 @@ -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Shared.CartridgeLoader; using Content.Shared.CartridgeLoader.Cartridges; +using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.Popups; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; using Robust.Shared.Random; namespace Content.Server.CartridgeLoader.Cartridges; diff --git a/Content.Server/Communications/CommunicationsConsoleSystem.cs b/Content.Server/Communications/CommunicationsConsoleSystem.cs index b4303ee50a..fc489c1823 100644 --- a/Content.Server/Communications/CommunicationsConsoleSystem.cs +++ b/Content.Server/Communications/CommunicationsConsoleSystem.cs @@ -1,9 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.AlertLevel; using Content.Server.Chat.Systems; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Interaction; using Content.Server.Popups; using Content.Server.RoundEnd; using Content.Server.Screens.Components; @@ -16,6 +14,7 @@ using Content.Shared.Chat; using Content.Shared.Communications; using Content.Shared.Database; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.IdentityManagement; using Content.Shared.Popups; using Robust.Server.GameObjects; diff --git a/Content.Server/Configurable/ConfigurationSystem.cs b/Content.Server/Configurable/ConfigurationSystem.cs index bf89c3f7ed..965571f883 100644 --- a/Content.Server/Configurable/ConfigurationSystem.cs +++ b/Content.Server/Configurable/ConfigurationSystem.cs @@ -1,91 +1,8 @@ using Content.Shared.Configurable; -using Content.Shared.Interaction; -using Content.Shared.Tools.Components; -using Content.Shared.Tools.Systems; -using Robust.Server.GameObjects; -using Robust.Shared.Containers; -using Robust.Shared.Player; -using static Content.Shared.Configurable.ConfigurationComponent; namespace Content.Server.Configurable; -public sealed class ConfigurationSystem : EntitySystem +public sealed class ConfigurationSystem : SharedConfigurationSystem { - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - [Dependency] private readonly SharedToolSystem _toolSystem = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent<ConfigurationComponent, ConfigurationUpdatedMessage>(OnUpdate); - SubscribeLocalEvent<ConfigurationComponent, ComponentStartup>(OnStartup); - SubscribeLocalEvent<ConfigurationComponent, InteractUsingEvent>(OnInteractUsing); - SubscribeLocalEvent<ConfigurationComponent, ContainerIsInsertingAttemptEvent>(OnInsert); - } - - private void OnInteractUsing(EntityUid uid, ConfigurationComponent component, InteractUsingEvent args) - { - // TODO use activatable ui system - if (args.Handled) - return; - - if (!_toolSystem.HasQuality(args.Used, component.QualityNeeded)) - return; - - args.Handled = _uiSystem.TryOpenUi(uid, ConfigurationUiKey.Key, args.User); - } - - private void OnStartup(EntityUid uid, ConfigurationComponent component, ComponentStartup args) - { - UpdateUi(uid, component); - } - - private void UpdateUi(EntityUid uid, ConfigurationComponent component) - { - if (_uiSystem.HasUi(uid, ConfigurationUiKey.Key)) - _uiSystem.SetUiState(uid, ConfigurationUiKey.Key, new ConfigurationBoundUserInterfaceState(component.Config)); - } - - private void OnUpdate(EntityUid uid, ConfigurationComponent component, ConfigurationUpdatedMessage args) - { - foreach (var key in component.Config.Keys) - { - var value = args.Config.GetValueOrDefault(key); - - if (string.IsNullOrWhiteSpace(value) || component.Validation != null && !component.Validation.IsMatch(value)) - continue; - - component.Config[key] = value; - } - - UpdateUi(uid, component); - - var updatedEvent = new ConfigurationUpdatedEvent(component); - RaiseLocalEvent(uid, updatedEvent, false); - - // TODO support float (spinbox) and enum (drop-down) configurations - // TODO support verbs. - } - - private void OnInsert(EntityUid uid, ConfigurationComponent component, ContainerIsInsertingAttemptEvent args) - { - if (!_toolSystem.HasQuality(args.EntityUid, component.QualityNeeded)) - return; - - args.Cancel(); - } - - /// <summary> - /// Sent when configuration values got changes - /// </summary> - public sealed class ConfigurationUpdatedEvent : EntityEventArgs - { - public ConfigurationComponent Configuration; - - public ConfigurationUpdatedEvent(ConfigurationComponent configuration) - { - Configuration = configuration; - } - } } diff --git a/Content.Server/Containers/ThrowInsertContainerSystem.cs b/Content.Server/Containers/ThrowInsertContainerSystem.cs index 09176c423c..1b87cb83ef 100644 --- a/Content.Server/Containers/ThrowInsertContainerSystem.cs +++ b/Content.Server/Containers/ThrowInsertContainerSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Administration.Logs; +using Content.Shared.Containers; using Content.Shared.Database; using Content.Shared.Popups; using Content.Shared.Throwing; @@ -52,10 +53,3 @@ public sealed class ThrowInsertContainerSystem : EntitySystem _adminLogger.Add(LogType.Landed, LogImpact.Low, $"{ToPrettyString(args.Thrown)} thrown by {ToPrettyString(args.Component.Thrower.Value):player} landed in {ToPrettyString(ent)}"); } } - -/// <summary> -/// Sent before the insertion is made. -/// Allows preventing the insertion if any system on the entity should need to. -/// </summary> -[ByRefEvent] -public record struct BeforeThrowInsertEvent(EntityUid ThrownEntity, bool Cancelled = false); diff --git a/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs b/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs index b895ec190e..cec92db44c 100644 --- a/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs +++ b/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs @@ -1,10 +1,10 @@ using Content.Server.DeviceLinking.Components; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Shared.DeviceLinking; using Content.Shared.DeviceLinking.Events; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.DeviceLinking.Systems; diff --git a/Content.Server/DeviceLinking/Systems/DoorSignalControlSystem.cs b/Content.Server/DeviceLinking/Systems/DoorSignalControlSystem.cs index 145e2a7dfc..107559826c 100644 --- a/Content.Server/DeviceLinking/Systems/DoorSignalControlSystem.cs +++ b/Content.Server/DeviceLinking/Systems/DoorSignalControlSystem.cs @@ -2,6 +2,7 @@ using Content.Server.DeviceLinking.Components; using Content.Server.DeviceNetwork; using Content.Server.Doors.Systems; using Content.Shared.DeviceLinking.Events; +using Content.Shared.DeviceNetwork; using Content.Shared.Doors.Components; using Content.Shared.Doors; using JetBrains.Annotations; diff --git a/Content.Server/DeviceLinking/Systems/EdgeDetectorSystem.cs b/Content.Server/DeviceLinking/Systems/EdgeDetectorSystem.cs index 2bf71e4e94..a425122df4 100644 --- a/Content.Server/DeviceLinking/Systems/EdgeDetectorSystem.cs +++ b/Content.Server/DeviceLinking/Systems/EdgeDetectorSystem.cs @@ -1,6 +1,6 @@ using Content.Server.DeviceLinking.Components; -using Content.Server.DeviceNetwork; using Content.Shared.DeviceLinking.Events; +using Content.Shared.DeviceNetwork; namespace Content.Server.DeviceLinking.Systems; diff --git a/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs b/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs index eaab3c986f..038851f4ff 100644 --- a/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs +++ b/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs @@ -2,6 +2,7 @@ using Content.Server.DeviceLinking.Components; using Content.Server.DeviceNetwork; using Content.Shared.DeviceLinking; using Content.Shared.DeviceLinking.Events; +using Content.Shared.DeviceNetwork; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Popups; diff --git a/Content.Server/DeviceLinking/Systems/MemoryCellSystem.cs b/Content.Server/DeviceLinking/Systems/MemoryCellSystem.cs index dbae7790f9..45e4d21750 100644 --- a/Content.Server/DeviceLinking/Systems/MemoryCellSystem.cs +++ b/Content.Server/DeviceLinking/Systems/MemoryCellSystem.cs @@ -2,6 +2,7 @@ using Content.Server.DeviceLinking.Components; using Content.Server.DeviceNetwork; using Content.Shared.DeviceLinking; using Content.Shared.DeviceLinking.Events; +using Content.Shared.DeviceNetwork; namespace Content.Server.DeviceLinking.Systems; diff --git a/Content.Server/DeviceNetwork/Systems/ApcNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/ApcNetworkSystem.cs index aa4623e415..798a9b540e 100644 --- a/Content.Server/DeviceNetwork/Systems/ApcNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/ApcNetworkSystem.cs @@ -4,6 +4,7 @@ using Content.Server.NodeContainer.EntitySystems; using JetBrains.Annotations; using Content.Server.Power.EntitySystems; using Content.Server.Power.Nodes; +using Content.Shared.DeviceNetwork.Events; namespace Content.Server.DeviceNetwork.Systems { diff --git a/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs index 1988a07cea..20f0dfacb1 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs @@ -1,9 +1,7 @@ using System.Linq; -using Content.Server.DeviceNetwork.Components; -using Content.Shared.DeviceNetwork; using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.DeviceNetwork.Systems; -using Content.Shared.Interaction; using JetBrains.Annotations; using Robust.Shared.Map.Events; diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs index 0702a72042..1905b752b8 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.DeviceNetwork.Systems; using Robust.Server.GameObjects; diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkRequiresPowerSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkRequiresPowerSystem.cs index 6e7bd255c5..615ed37f9e 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkRequiresPowerSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkRequiresPowerSystem.cs @@ -1,6 +1,7 @@ using Content.Server.DeviceNetwork.Components; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; +using Content.Shared.DeviceNetwork.Events; namespace Content.Server.DeviceNetwork.Systems; diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs index 20ee7a5dd1..4b28fd9bf9 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs @@ -1,12 +1,12 @@ -using Content.Server.DeviceNetwork.Components; using Content.Shared.DeviceNetwork; using JetBrains.Annotations; using Robust.Shared.Prototypes; using Robust.Shared.Random; using System.Buffers; using System.Diagnostics.CodeAnalysis; -using System.Numerics; using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; +using Content.Shared.DeviceNetwork.Systems; using Content.Shared.Examine; namespace Content.Server.DeviceNetwork.Systems @@ -16,7 +16,7 @@ namespace Content.Server.DeviceNetwork.Systems /// Device networking allows machines and devices to communicate with each other while adhering to restrictions like range or being connected to the same powernet. /// </summary> [UsedImplicitly] - public sealed class DeviceNetworkSystem : EntitySystem + public sealed class DeviceNetworkSystem : SharedDeviceNetworkSystem { [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; @@ -60,16 +60,7 @@ namespace Content.Server.DeviceNetwork.Systems SwapQueues(); } - /// <summary> - /// Sends the given payload as a device network packet to the entity with the given address and frequency. - /// Addresses are given to the DeviceNetworkComponent of an entity when connecting. - /// </summary> - /// <param name="uid">The EntityUid of the sending entity</param> - /// <param name="address">The address of the entity that the packet gets sent to. If null, the message is broadcast to all devices on that frequency (except the sender)</param> - /// <param name="frequency">The frequency to send on</param> - /// <param name="data">The data to be sent</param> - /// <returns>Returns true when the packet was successfully enqueued.</returns> - public bool QueuePacket(EntityUid uid, string? address, NetworkPayload data, uint? frequency = null, int? network = null, DeviceNetworkComponent? device = null) + public override bool QueuePacket(EntityUid uid, string? address, NetworkPayload data, uint? frequency = null, int? network = null, DeviceNetworkComponent? device = null) { if (!Resolve(uid, ref device, false)) return false; @@ -368,96 +359,4 @@ namespace Content.Server.DeviceNetwork.Systems } } } - - /// <summary> - /// Event raised before a device network packet is send. - /// Subscribed to by other systems to prevent the packet from being sent. - /// </summary> - public sealed class BeforePacketSentEvent : CancellableEntityEventArgs - { - /// <summary> - /// The EntityUid of the entity the packet was sent from. - /// </summary> - public readonly EntityUid Sender; - - public readonly TransformComponent SenderTransform; - - /// <summary> - /// The senders current position in world coordinates. - /// </summary> - public readonly Vector2 SenderPosition; - - /// <summary> - /// The network the packet will be sent to. - /// </summary> - public readonly string NetworkId; - - public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId) - { - Sender = sender; - SenderTransform = xform; - SenderPosition = senderPosition; - NetworkId = networkId; - } - } - - /// <summary> - /// Sent to the sending entity before broadcasting network packets to recipients - /// </summary> - public sealed class BeforeBroadcastAttemptEvent : CancellableEntityEventArgs - { - public readonly IReadOnlySet<DeviceNetworkComponent> Recipients; - public HashSet<DeviceNetworkComponent>? ModifiedRecipients; - - public BeforeBroadcastAttemptEvent(IReadOnlySet<DeviceNetworkComponent> recipients) - { - Recipients = recipients; - } - } - - /// <summary> - /// Event raised when a device network packet gets sent. - /// </summary> - public sealed class DeviceNetworkPacketEvent : EntityEventArgs - { - /// <summary> - /// The id of the network that this packet is being sent on. - /// </summary> - public int NetId; - - /// <summary> - /// The frequency the packet is sent on. - /// </summary> - public readonly uint Frequency; - - /// <summary> - /// Address of the intended recipient. Null if the message was broadcast. - /// </summary> - public string? Address; - - /// <summary> - /// The device network address of the sending entity. - /// </summary> - public readonly string SenderAddress; - - /// <summary> - /// The entity that sent the packet. - /// </summary> - public EntityUid Sender; - - /// <summary> - /// The data that is being sent. - /// </summary> - public readonly NetworkPayload Data; - - public DeviceNetworkPacketEvent(int netId, string? address, uint frequency, string senderAddress, EntityUid sender, NetworkPayload data) - { - NetId = netId; - Address = address; - Frequency = frequency; - SenderAddress = senderAddress; - Sender = sender; - Data = data; - } - } } diff --git a/Content.Server/DeviceNetwork/Systems/Devices/ApcNetSwitchSystem.cs b/Content.Server/DeviceNetwork/Systems/Devices/ApcNetSwitchSystem.cs index 9a4a81a4c0..588020a963 100644 --- a/Content.Server/DeviceNetwork/Systems/Devices/ApcNetSwitchSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/Devices/ApcNetSwitchSystem.cs @@ -1,7 +1,8 @@ -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Components.Devices; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Interaction; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.DeviceNetwork.Systems.Devices { diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index 645d28f6d2..6bcbe30456 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.Administration.Logs; using Content.Server.DeviceLinking.Systems; -using Content.Server.DeviceNetwork.Components; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.Database; diff --git a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs index 6c997828fa..8c1f48e93f 100644 --- a/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/SingletonDeviceNetServerSystem.cs @@ -1,9 +1,9 @@ using System.Diagnostics.CodeAnalysis; using Content.Server.DeviceNetwork.Components; using Content.Server.Medical.CrewMonitoring; -using Content.Server.Power.Components; using Content.Server.Station.Systems; using Content.Shared.Power; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.DeviceNetwork.Systems; diff --git a/Content.Server/DeviceNetwork/Systems/StationLimitedNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/StationLimitedNetworkSystem.cs index 675cacc4d7..cebe1a3b9d 100644 --- a/Content.Server/DeviceNetwork/Systems/StationLimitedNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/StationLimitedNetworkSystem.cs @@ -1,5 +1,6 @@ using Content.Server.DeviceNetwork.Components; using Content.Server.Station.Systems; +using Content.Shared.DeviceNetwork.Events; using JetBrains.Annotations; using Robust.Shared.Map; diff --git a/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs index 758a333c7a..54bd5256c7 100644 --- a/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs @@ -1,4 +1,5 @@ using Content.Server.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using JetBrains.Annotations; namespace Content.Server.DeviceNetwork.Systems diff --git a/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs index 1741afd4ce..8bca47e041 100644 --- a/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs @@ -1,4 +1,5 @@ using Content.Server.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using JetBrains.Annotations; namespace Content.Server.DeviceNetwork.Systems diff --git a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs index 6249b9497d..6ee282a310 100644 --- a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs +++ b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs @@ -1,204 +1,8 @@ -using Content.Server.Configurable; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; -using Content.Server.DeviceNetwork.Systems; -using Content.Server.Disposal.Unit.EntitySystems; -using Content.Server.Power.Components; -using Content.Shared.DeviceNetwork; -using Content.Shared.Disposal; -using Content.Shared.Interaction; -using Robust.Server.GameObjects; -using Robust.Shared.Player; -using Robust.Shared.Utility; +using Content.Shared.Disposal.Mailing; namespace Content.Server.Disposal.Mailing; -public sealed class MailingUnitSystem : EntitySystem +public sealed class MailingUnitSystem : SharedMailingUnitSystem { - [Dependency] private readonly DeviceNetworkSystem _deviceNetworkSystem = default!; - [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; - private const string MailTag = "mail"; - - private const string TagConfigurationKey = "tag"; - - private const string NetTag = "tag"; - private const string NetSrc = "src"; - private const string NetTarget = "target"; - private const string NetCmdSent = "mail_sent"; - private const string NetCmdRequest = "get_mailer_tag"; - private const string NetCmdResponse = "mailer_tag"; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent<MailingUnitComponent, ComponentInit>(OnComponentInit); - SubscribeLocalEvent<MailingUnitComponent, DeviceNetworkPacketEvent>(OnPacketReceived); - SubscribeLocalEvent<MailingUnitComponent, BeforeDisposalFlushEvent>(OnBeforeFlush); - SubscribeLocalEvent<MailingUnitComponent, ConfigurationSystem.ConfigurationUpdatedEvent>(OnConfigurationUpdated); - SubscribeLocalEvent<MailingUnitComponent, ActivateInWorldEvent>(HandleActivate, before: new[] { typeof(DisposalUnitSystem) }); - SubscribeLocalEvent<MailingUnitComponent, DisposalUnitUIStateUpdatedEvent>(OnDisposalUnitUIStateChange); - SubscribeLocalEvent<MailingUnitComponent, TargetSelectedMessage>(OnTargetSelected); - } - - - private void OnComponentInit(EntityUid uid, MailingUnitComponent component, ComponentInit args) - { - UpdateTargetList(uid, component); - } - - private void OnPacketReceived(EntityUid uid, MailingUnitComponent component, DeviceNetworkPacketEvent args) - { - if (!args.Data.TryGetValue(DeviceNetworkConstants.Command, out string? command) || !IsPowered(uid)) - return; - - switch (command) - { - case NetCmdRequest: - SendTagRequestResponse(uid, args, component.Tag); - break; - case NetCmdResponse when args.Data.TryGetValue(NetTag, out string? tag): - //Add the received tag request response to the list of targets - component.TargetList.Add(tag); - UpdateUserInterface(uid, component); - break; - } - } - - /// <summary> - /// Sends the given tag as a response to a <see cref="NetCmdRequest"/> if it's not null - /// </summary> - private void SendTagRequestResponse(EntityUid uid, DeviceNetworkPacketEvent args, string? tag) - { - if (tag == null) - return; - - var payload = new NetworkPayload - { - [DeviceNetworkConstants.Command] = NetCmdResponse, - [NetTag] = tag - }; - - _deviceNetworkSystem.QueuePacket(uid, args.Address, payload, args.Frequency); - } - - /// <summary> - /// Prevents the unit from flushing if no target is selected - /// </summary> - private void OnBeforeFlush(EntityUid uid, MailingUnitComponent component, BeforeDisposalFlushEvent args) - { - if (string.IsNullOrEmpty(component.Target)) - { - args.Cancel(); - return; - } - - args.Tags.Add(MailTag); - args.Tags.Add(component.Target); - - BroadcastSentMessage(uid, component); - } - - /// <summary> - /// Broadcast that a mail was sent including the src and target tags - /// </summary> - private void BroadcastSentMessage(EntityUid uid, MailingUnitComponent component, DeviceNetworkComponent? device = null) - { - if (string.IsNullOrEmpty(component.Tag) || string.IsNullOrEmpty(component.Target) || !Resolve(uid, ref device)) - return; - - var payload = new NetworkPayload - { - [DeviceNetworkConstants.Command] = NetCmdSent, - [NetSrc] = component.Tag, - [NetTarget] = component.Target - }; - - _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); - } - - /// <summary> - /// Clears the units target list and broadcasts a <see cref="NetCmdRequest"/>. - /// The target list will then get populated with <see cref="NetCmdResponse"/> responses from all active mailing units on the same grid - /// </summary> - private void UpdateTargetList(EntityUid uid, MailingUnitComponent component, DeviceNetworkComponent? device = null) - { - if (!Resolve(uid, ref device, false)) - return; - - var payload = new NetworkPayload - { - [DeviceNetworkConstants.Command] = NetCmdRequest - }; - - component.TargetList.Clear(); - _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); - } - - /// <summary> - /// Gets called when the units tag got updated - /// </summary> - private void OnConfigurationUpdated(EntityUid uid, MailingUnitComponent component, ConfigurationSystem.ConfigurationUpdatedEvent args) - { - var configuration = args.Configuration.Config; - if (!configuration.ContainsKey(TagConfigurationKey) || configuration[TagConfigurationKey] == string.Empty) - { - component.Tag = null; - return; - } - - component.Tag = configuration[TagConfigurationKey]; - UpdateUserInterface(uid, component); - } - - private void HandleActivate(EntityUid uid, MailingUnitComponent component, ActivateInWorldEvent args) - { - if (args.Handled || !args.Complex) - return; - - if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor)) - { - return; - } - - args.Handled = true; - UpdateTargetList(uid, component); - _userInterfaceSystem.OpenUi(uid, MailingUnitUiKey.Key, actor.PlayerSession); - } - - /// <summary> - /// Gets called when the disposal unit components ui state changes. This is required because the mailing unit requires a disposal unit component and overrides its ui - /// </summary> - private void OnDisposalUnitUIStateChange(EntityUid uid, MailingUnitComponent component, DisposalUnitUIStateUpdatedEvent args) - { - component.DisposalUnitInterfaceState = args.State; - UpdateUserInterface(uid, component); - } - - private void UpdateUserInterface(EntityUid uid, MailingUnitComponent component) - { - if (component.DisposalUnitInterfaceState == null) - return; - - var state = new MailingUnitBoundUserInterfaceState(component.DisposalUnitInterfaceState, component.Target, component.TargetList.ShallowClone(), component.Tag); - _userInterfaceSystem.SetUiState(uid, MailingUnitUiKey.Key, state); - } - - private void OnTargetSelected(EntityUid uid, MailingUnitComponent component, TargetSelectedMessage args) - { - component.Target = args.Target; - UpdateUserInterface(uid, component); - } - - /// <summary> - /// Checks if the unit is powered if an <see cref="ApcPowerReceiverComponent"/> is present - /// </summary> - /// <returns>True if the power receiver component is powered or not present</returns> - private bool IsPowered(EntityUid uid, ApcPowerReceiverComponent? powerReceiver = null) - { - if (Resolve(uid, ref powerReceiver) && !powerReceiver.Powered) - return false; - - return true; - } } diff --git a/Content.Server/Disposal/Tube/Components/DisposalEntryComponent.cs b/Content.Server/Disposal/Tube/Components/DisposalEntryComponent.cs deleted file mode 100644 index e4b8955c9c..0000000000 --- a/Content.Server/Disposal/Tube/Components/DisposalEntryComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Content.Server.Disposal.Unit.EntitySystems; - -namespace Content.Server.Disposal.Tube.Components -{ - [RegisterComponent] - [Access(typeof(DisposalTubeSystem), typeof(DisposalUnitSystem))] - public sealed partial class DisposalEntryComponent : Component - { - public const string HolderPrototypeId = "DisposalHolder"; - } -} diff --git a/Content.Server/Disposal/Tube/Components/DisposalBendComponent.cs b/Content.Server/Disposal/Tube/DisposalBendComponent.cs similarity index 70% rename from Content.Server/Disposal/Tube/Components/DisposalBendComponent.cs rename to Content.Server/Disposal/Tube/DisposalBendComponent.cs index ace8a68462..7aa48f4bd3 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalBendComponent.cs +++ b/Content.Server/Disposal/Tube/DisposalBendComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Disposal.Tube.Components; +namespace Content.Server.Disposal.Tube; [RegisterComponent] [Access(typeof(DisposalTubeSystem))] diff --git a/Content.Server/Disposal/Tube/Components/DisposalJunctionComponent.cs b/Content.Server/Disposal/Tube/DisposalJunctionComponent.cs similarity index 84% rename from Content.Server/Disposal/Tube/Components/DisposalJunctionComponent.cs rename to Content.Server/Disposal/Tube/DisposalJunctionComponent.cs index d929dd16bf..af0d7eda68 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalJunctionComponent.cs +++ b/Content.Server/Disposal/Tube/DisposalJunctionComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Disposal.Tube.Components; +namespace Content.Server.Disposal.Tube; [RegisterComponent] [Access(typeof(DisposalTubeSystem))] diff --git a/Content.Server/Disposal/Tube/Components/DisposalRouterComponent.cs b/Content.Server/Disposal/Tube/DisposalRouterComponent.cs similarity index 57% rename from Content.Server/Disposal/Tube/Components/DisposalRouterComponent.cs rename to Content.Server/Disposal/Tube/DisposalRouterComponent.cs index 18c0945cef..2446cf27f7 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalRouterComponent.cs +++ b/Content.Server/Disposal/Tube/DisposalRouterComponent.cs @@ -1,12 +1,6 @@ -using Content.Server.UserInterface; -using Robust.Server.GameObjects; using Robust.Shared.Audio; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Player; -using static Content.Shared.Disposal.Components.SharedDisposalRouterComponent; -namespace Content.Server.Disposal.Tube.Components +namespace Content.Server.Disposal.Tube { [RegisterComponent] [Access(typeof(DisposalTubeSystem))] diff --git a/Content.Server/Disposal/Tube/Components/DisposalSignalRouterComponent.cs b/Content.Server/Disposal/Tube/DisposalSignalRouterComponent.cs similarity index 91% rename from Content.Server/Disposal/Tube/Components/DisposalSignalRouterComponent.cs rename to Content.Server/Disposal/Tube/DisposalSignalRouterComponent.cs index b4ef81d898..bee8293f58 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalSignalRouterComponent.cs +++ b/Content.Server/Disposal/Tube/DisposalSignalRouterComponent.cs @@ -1,8 +1,7 @@ -using Content.Server.Disposal.Tube.Systems; using Content.Shared.DeviceLinking; using Robust.Shared.Prototypes; -namespace Content.Server.Disposal.Tube.Components; +namespace Content.Server.Disposal.Tube; /// <summary> /// Requires <see cref="DisposalJunctionComponent"/> to function. diff --git a/Content.Server/Disposal/Tube/Systems/DisposalSignalRouterSystem.cs b/Content.Server/Disposal/Tube/DisposalSignalRouterSystem.cs similarity index 94% rename from Content.Server/Disposal/Tube/Systems/DisposalSignalRouterSystem.cs rename to Content.Server/Disposal/Tube/DisposalSignalRouterSystem.cs index f1fdedb522..0d6c03b8c5 100644 --- a/Content.Server/Disposal/Tube/Systems/DisposalSignalRouterSystem.cs +++ b/Content.Server/Disposal/Tube/DisposalSignalRouterSystem.cs @@ -1,8 +1,7 @@ using Content.Server.DeviceLinking.Systems; -using Content.Server.Disposal.Tube.Components; using Content.Shared.DeviceLinking.Events; -namespace Content.Server.Disposal.Tube.Systems; +namespace Content.Server.Disposal.Tube; /// <summary> /// Handles signals and the routing get next direction event. diff --git a/Content.Server/Disposal/Tube/Components/DisposalTaggerComponent.cs b/Content.Server/Disposal/Tube/DisposalTaggerComponent.cs similarity index 53% rename from Content.Server/Disposal/Tube/Components/DisposalTaggerComponent.cs rename to Content.Server/Disposal/Tube/DisposalTaggerComponent.cs index a291f4a941..3f072a80c7 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalTaggerComponent.cs +++ b/Content.Server/Disposal/Tube/DisposalTaggerComponent.cs @@ -1,13 +1,6 @@ -using Content.Server.Disposal.Unit.Components; -using Content.Server.UserInterface; -using Robust.Server.GameObjects; using Robust.Shared.Audio; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Player; -using static Content.Shared.Disposal.Components.SharedDisposalTaggerComponent; -namespace Content.Server.Disposal.Tube.Components +namespace Content.Server.Disposal.Tube { [RegisterComponent] public sealed partial class DisposalTaggerComponent : DisposalTransitComponent diff --git a/Content.Server/Disposal/Tube/Components/DisposalTransitComponent.cs b/Content.Server/Disposal/Tube/DisposalTransitComponent.cs similarity index 82% rename from Content.Server/Disposal/Tube/Components/DisposalTransitComponent.cs rename to Content.Server/Disposal/Tube/DisposalTransitComponent.cs index e916327516..10bc7d5df7 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalTransitComponent.cs +++ b/Content.Server/Disposal/Tube/DisposalTransitComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Disposal.Tube.Components +namespace Content.Server.Disposal.Tube { // TODO: Different types of tubes eject in random direction with no exit point [RegisterComponent] diff --git a/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs b/Content.Server/Disposal/Tube/DisposalTubeComponent.cs similarity index 90% rename from Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs rename to Content.Server/Disposal/Tube/DisposalTubeComponent.cs index c16f1fcc22..15d02ad1ef 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs +++ b/Content.Server/Disposal/Tube/DisposalTubeComponent.cs @@ -1,9 +1,9 @@ -using Content.Server.Disposal.Unit.EntitySystems; +using Content.Server.Disposal.Unit; using Content.Shared.Damage; using Robust.Shared.Audio; using Robust.Shared.Containers; -namespace Content.Server.Disposal.Tube.Components; +namespace Content.Server.Disposal.Tube; [RegisterComponent] [Access(typeof(DisposalTubeSystem), typeof(DisposableSystem))] diff --git a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs index 20626a5eee..f1e094db20 100644 --- a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs +++ b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs @@ -2,12 +2,12 @@ using System.Linq; using System.Text; using Content.Server.Atmos.EntitySystems; using Content.Server.Construction.Completions; -using Content.Server.Disposal.Tube.Components; -using Content.Server.Disposal.Unit.Components; -using Content.Server.Disposal.Unit.EntitySystems; +using Content.Server.Disposal.Unit; using Content.Server.Popups; using Content.Shared.Destructible; using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Tube; +using Content.Shared.Disposal.Unit; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -16,12 +16,10 @@ using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Random; -using static Content.Shared.Disposal.Components.SharedDisposalRouterComponent; -using static Content.Shared.Disposal.Components.SharedDisposalTaggerComponent; namespace Content.Server.Disposal.Tube { - public sealed class DisposalTubeSystem : EntitySystem + public sealed class DisposalTubeSystem : SharedDisposalTubeSystem { [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; @@ -49,8 +47,8 @@ namespace Content.Server.Disposal.Tube SubscribeLocalEvent<DisposalBendComponent, GetDisposalsConnectableDirectionsEvent>(OnGetBendConnectableDirections); SubscribeLocalEvent<DisposalBendComponent, GetDisposalsNextDirectionEvent>(OnGetBendNextDirection); - SubscribeLocalEvent<DisposalEntryComponent, GetDisposalsConnectableDirectionsEvent>(OnGetEntryConnectableDirections); - SubscribeLocalEvent<DisposalEntryComponent, GetDisposalsNextDirectionEvent>(OnGetEntryNextDirection); + SubscribeLocalEvent<Shared.Disposal.Tube.DisposalEntryComponent, GetDisposalsConnectableDirectionsEvent>(OnGetEntryConnectableDirections); + SubscribeLocalEvent<Shared.Disposal.Tube.DisposalEntryComponent, GetDisposalsNextDirectionEvent>(OnGetEntryNextDirection); SubscribeLocalEvent<DisposalJunctionComponent, GetDisposalsConnectableDirectionsEvent>(OnGetJunctionConnectableDirections); SubscribeLocalEvent<DisposalJunctionComponent, GetDisposalsNextDirectionEvent>(OnGetJunctionNextDirection); @@ -64,13 +62,13 @@ namespace Content.Server.Disposal.Tube SubscribeLocalEvent<DisposalTaggerComponent, GetDisposalsConnectableDirectionsEvent>(OnGetTaggerConnectableDirections); SubscribeLocalEvent<DisposalTaggerComponent, GetDisposalsNextDirectionEvent>(OnGetTaggerNextDirection); - Subs.BuiEvents<DisposalRouterComponent>(DisposalRouterUiKey.Key, subs => + Subs.BuiEvents<DisposalRouterComponent>(SharedDisposalRouterComponent.DisposalRouterUiKey.Key, subs => { subs.Event<BoundUIOpenedEvent>(OnOpenRouterUI); subs.Event<SharedDisposalRouterComponent.UiActionMessage>(OnUiAction); }); - Subs.BuiEvents<DisposalTaggerComponent>(DisposalTaggerUiKey.Key, subs => + Subs.BuiEvents<DisposalTaggerComponent>(SharedDisposalTaggerComponent.DisposalTaggerUiKey.Key, subs => { subs.Event<BoundUIOpenedEvent>(OnOpenTaggerUI); subs.Event<SharedDisposalTaggerComponent.UiActionMessage>(OnUiAction); @@ -161,12 +159,12 @@ namespace Content.Server.Disposal.Tube args.Next = previousDF == ev.Connectable[0] ? ev.Connectable[1] : ev.Connectable[0]; } - private void OnGetEntryConnectableDirections(EntityUid uid, DisposalEntryComponent component, ref GetDisposalsConnectableDirectionsEvent args) + private void OnGetEntryConnectableDirections(EntityUid uid, Shared.Disposal.Tube.DisposalEntryComponent component, ref GetDisposalsConnectableDirectionsEvent args) { args.Connectable = new[] { Transform(uid).LocalRotation.GetDir() }; } - private void OnGetEntryNextDirection(EntityUid uid, DisposalEntryComponent component, ref GetDisposalsNextDirectionEvent args) + private void OnGetEntryNextDirection(EntityUid uid, Shared.Disposal.Tube.DisposalEntryComponent component, ref GetDisposalsNextDirectionEvent args) { // Ejects contents when they come from the same direction the entry is facing. if (args.Holder.PreviousDirectionFrom != Direction.Invalid) @@ -283,10 +281,10 @@ namespace Content.Server.Disposal.Tube private void OnOpenTaggerUI(EntityUid uid, DisposalTaggerComponent tagger, BoundUIOpenedEvent args) { - if (_uiSystem.HasUi(uid, DisposalTaggerUiKey.Key)) + if (_uiSystem.HasUi(uid, SharedDisposalTaggerComponent.DisposalTaggerUiKey.Key)) { - _uiSystem.SetUiState(uid, DisposalTaggerUiKey.Key, - new DisposalTaggerUserInterfaceState(tagger.Tag)); + _uiSystem.SetUiState(uid, SharedDisposalTaggerComponent.DisposalTaggerUiKey.Key, + new SharedDisposalTaggerComponent.DisposalTaggerUserInterfaceState(tagger.Tag)); } } @@ -298,7 +296,7 @@ namespace Content.Server.Disposal.Tube { if (router.Tags.Count <= 0) { - _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState("")); + _uiSystem.SetUiState(uid, SharedDisposalRouterComponent.DisposalRouterUiKey.Key, new SharedDisposalRouterComponent.DisposalRouterUserInterfaceState("")); return; } @@ -312,7 +310,7 @@ namespace Content.Server.Disposal.Tube taglist.Remove(taglist.Length - 2, 2); - _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState(taglist.ToString())); + _uiSystem.SetUiState(uid, SharedDisposalRouterComponent.DisposalRouterUiKey.Key, new SharedDisposalRouterComponent.DisposalRouterUserInterfaceState(taglist.ToString())); } private void OnAnchorChange(EntityUid uid, DisposalTubeComponent component, ref AnchorStateChangedEvent args) @@ -419,13 +417,13 @@ namespace Content.Server.Disposal.Tube _popups.PopupEntity(Loc.GetString("disposal-tube-component-popup-directions-text", ("directions", directions)), tubeId, recipient); } - public bool TryInsert(EntityUid uid, DisposalUnitComponent from, IEnumerable<string>? tags = default, DisposalEntryComponent? entry = null) + public override bool TryInsert(EntityUid uid, DisposalUnitComponent from, IEnumerable<string>? tags = default, DisposalEntryComponent? entry = null) { if (!Resolve(uid, ref entry)) return false; var xform = Transform(uid); - var holder = Spawn(DisposalEntryComponent.HolderPrototypeId, _transform.GetMapCoordinates(uid, xform: xform)); + var holder = Spawn(entry.HolderPrototypeId, _transform.GetMapCoordinates(uid, xform: xform)); var holderComponent = Comp<DisposalHolderComponent>(holder); foreach (var entity in from.Container.ContainedEntities.ToArray()) @@ -436,7 +434,7 @@ namespace Content.Server.Disposal.Tube _atmosSystem.Merge(holderComponent.Air, from.Air); from.Air.Clear(); - if (tags != default) + if (tags != null) holderComponent.Tags.UnionWith(tags); return _disposableSystem.EnterTube(holder, uid, holderComponent); diff --git a/Content.Server/Disposal/Tube/GetDisposalsNextDirectionEvent.cs b/Content.Server/Disposal/Tube/GetDisposalsNextDirectionEvent.cs index 2872a0e6d0..30dd1c3769 100644 --- a/Content.Server/Disposal/Tube/GetDisposalsNextDirectionEvent.cs +++ b/Content.Server/Disposal/Tube/GetDisposalsNextDirectionEvent.cs @@ -1,4 +1,4 @@ -using Content.Server.Disposal.Unit.Components; +using Content.Server.Disposal.Unit; namespace Content.Server.Disposal.Tube; diff --git a/Content.Server/Disposal/TubeConnectionsCommand.cs b/Content.Server/Disposal/TubeConnectionsCommand.cs index 564c46be7a..6719a9a2ab 100644 --- a/Content.Server/Disposal/TubeConnectionsCommand.cs +++ b/Content.Server/Disposal/TubeConnectionsCommand.cs @@ -1,6 +1,5 @@ using Content.Server.Administration; using Content.Server.Disposal.Tube; -using Content.Server.Disposal.Tube.Components; using Content.Shared.Administration; using Robust.Shared.Console; diff --git a/Content.Server/Disposal/Unit/Components/BeingDisposedComponent.cs b/Content.Server/Disposal/Unit/BeingDisposedComponent.cs similarity index 81% rename from Content.Server/Disposal/Unit/Components/BeingDisposedComponent.cs rename to Content.Server/Disposal/Unit/BeingDisposedComponent.cs index 060c7c98bd..3cff669855 100644 --- a/Content.Server/Disposal/Unit/Components/BeingDisposedComponent.cs +++ b/Content.Server/Disposal/Unit/BeingDisposedComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Disposal.Unit.Components; +namespace Content.Server.Disposal.Unit; /// <summary> /// A component added to entities that are currently in disposals. diff --git a/Content.Server/Disposal/Unit/EntitySystems/BeingDisposedSystem.cs b/Content.Server/Disposal/Unit/BeingDisposedSystem.cs similarity index 92% rename from Content.Server/Disposal/Unit/EntitySystems/BeingDisposedSystem.cs rename to Content.Server/Disposal/Unit/BeingDisposedSystem.cs index 6fbfb1523a..fcff4ba3b5 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/BeingDisposedSystem.cs +++ b/Content.Server/Disposal/Unit/BeingDisposedSystem.cs @@ -1,8 +1,7 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Systems; -using Content.Server.Disposal.Unit.Components; -namespace Content.Server.Disposal.Unit.EntitySystems; +namespace Content.Server.Disposal.Unit; public sealed class BeingDisposedSystem : EntitySystem { diff --git a/Content.Server/Disposal/Unit/Components/DisposalUnitComponent.cs b/Content.Server/Disposal/Unit/Components/DisposalUnitComponent.cs deleted file mode 100644 index 548af039da..0000000000 --- a/Content.Server/Disposal/Unit/Components/DisposalUnitComponent.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Content.Server.Atmos; -using Content.Shared.Atmos; -using Content.Shared.Disposal.Components; - -namespace Content.Server.Disposal.Unit.Components; - -// GasMixture life. -[RegisterComponent] -public sealed partial class DisposalUnitComponent : SharedDisposalUnitComponent -{ - [DataField("air")] - public GasMixture Air = new(Atmospherics.CellVolume); -} diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs b/Content.Server/Disposal/Unit/DisposableSystem.cs similarity index 98% rename from Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs rename to Content.Server/Disposal/Unit/DisposableSystem.cs index 0e624ca6f5..a94176246c 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs +++ b/Content.Server/Disposal/Unit/DisposableSystem.cs @@ -1,9 +1,8 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Disposal.Tube; -using Content.Server.Disposal.Tube.Components; -using Content.Server.Disposal.Unit.Components; using Content.Shared.Body.Components; using Content.Shared.Damage; +using Content.Shared.Disposal.Components; using Content.Shared.Item; using Content.Shared.Throwing; using Robust.Shared.Audio.Systems; @@ -12,7 +11,7 @@ using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; -namespace Content.Server.Disposal.Unit.EntitySystems +namespace Content.Server.Disposal.Unit { public sealed class DisposableSystem : EntitySystem { diff --git a/Content.Server/Disposal/Unit/Components/DisposalHolderComponent.cs b/Content.Server/Disposal/Unit/DisposalHolderComponent.cs similarity index 94% rename from Content.Server/Disposal/Unit/Components/DisposalHolderComponent.cs rename to Content.Server/Disposal/Unit/DisposalHolderComponent.cs index 690b33968b..be90ae9f9c 100644 --- a/Content.Server/Disposal/Unit/Components/DisposalHolderComponent.cs +++ b/Content.Server/Disposal/Unit/DisposalHolderComponent.cs @@ -1,9 +1,8 @@ using Content.Server.Atmos; -using Content.Server.Disposal.Tube.Components; using Content.Shared.Atmos; using Robust.Shared.Containers; -namespace Content.Server.Disposal.Unit.Components +namespace Content.Server.Disposal.Unit { [RegisterComponent] public sealed partial class DisposalHolderComponent : Component, IGasMixtureHolder diff --git a/Content.Server/Disposal/Unit/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/DisposalUnitSystem.cs new file mode 100644 index 0000000000..4c6436c6c9 --- /dev/null +++ b/Content.Server/Disposal/Unit/DisposalUnitSystem.cs @@ -0,0 +1,44 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Shared.Atmos; +using Content.Shared.Destructible; +using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Unit; +using Content.Shared.Explosion; + +namespace Content.Server.Disposal.Unit; + +public sealed class DisposalUnitSystem : SharedDisposalUnitSystem +{ + [Dependency] private readonly AtmosphereSystem _atmosSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<DisposalUnitComponent, DestructionEventArgs>(OnDestruction); + SubscribeLocalEvent<DisposalUnitComponent, BeforeExplodeEvent>(OnExploded); + } + + protected override void HandleAir(EntityUid uid, DisposalUnitComponent component, TransformComponent xform) + { + var air = component.Air; + var indices = TransformSystem.GetGridTilePositionOrDefault((uid, xform)); + + if (_atmosSystem.GetTileMixture(xform.GridUid, xform.MapUid, indices, true) is { Temperature: > 0f } environment) + { + var transferMoles = 0.1f * (0.25f * Atmospherics.OneAtmosphere * 1.01f - air.Pressure) * air.Volume / (environment.Temperature * Atmospherics.R); + + component.Air = environment.Remove(transferMoles); + } + } + + private void OnDestruction(EntityUid uid, DisposalUnitComponent component, DestructionEventArgs args) + { + TryEjectContents(uid, component); + } + + private void OnExploded(Entity<DisposalUnitComponent> ent, ref BeforeExplodeEvent args) + { + args.Contents.AddRange(ent.Comp.Container.ContainedEntities); + } +} diff --git a/Content.Server/Disposal/Unit/EntitySystems/DoInsertDisposalUnitEvent.cs b/Content.Server/Disposal/Unit/DoInsertDisposalUnitEvent.cs similarity index 65% rename from Content.Server/Disposal/Unit/EntitySystems/DoInsertDisposalUnitEvent.cs rename to Content.Server/Disposal/Unit/DoInsertDisposalUnitEvent.cs index 6fdfce61da..3f3fee9785 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DoInsertDisposalUnitEvent.cs +++ b/Content.Server/Disposal/Unit/DoInsertDisposalUnitEvent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Disposal.Unit.EntitySystems +namespace Content.Server.Disposal.Unit { public record DoInsertDisposalUnitEvent(EntityUid? User, EntityUid ToInsert, EntityUid Unit); } diff --git a/Content.Server/Fax/AdminUI/AdminFaxEui.cs b/Content.Server/Fax/AdminUI/AdminFaxEui.cs index fe6b03fab7..2921bd5ef6 100644 --- a/Content.Server/Fax/AdminUI/AdminFaxEui.cs +++ b/Content.Server/Fax/AdminUI/AdminFaxEui.cs @@ -7,6 +7,7 @@ using Content.Shared.Fax; using Content.Shared.Follower; using Content.Shared.Ghost; using Content.Shared.Paper; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Fax.AdminUI; diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs index 1ac7bd23ca..79710e3f97 100644 --- a/Content.Server/Fax/FaxSystem.cs +++ b/Content.Server/Fax/FaxSystem.cs @@ -1,8 +1,6 @@ using Content.Server.Administration; using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.Popups; using Content.Server.Power.Components; @@ -12,7 +10,7 @@ using Content.Shared.Administration.Logs; using Content.Shared.Containers.ItemSlots; using Content.Shared.Database; using Content.Shared.DeviceNetwork; -using Content.Shared.Emag.Components; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Emag.Systems; using Content.Shared.Fax; using Content.Shared.Fax.Systems; @@ -27,9 +25,9 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Player; -using Robust.Shared.Prototypes; using Content.Shared.NameModifier.Components; using Content.Shared.Power; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Fax; diff --git a/Content.Server/Light/EntitySystems/PoweredLightSystem.cs b/Content.Server/Light/EntitySystems/PoweredLightSystem.cs index 53c60296d5..b98ba15623 100644 --- a/Content.Server/Light/EntitySystems/PoweredLightSystem.cs +++ b/Content.Server/Light/EntitySystems/PoweredLightSystem.cs @@ -19,6 +19,8 @@ using Robust.Shared.Timing; using Robust.Shared.Audio.Systems; using Content.Shared.Damage.Systems; using Content.Shared.Damage.Components; +using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; namespace Content.Server.Light.EntitySystems diff --git a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs index a53df6dbae..0e1d27a3c5 100644 --- a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs +++ b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs @@ -2,6 +2,8 @@ using System.Linq; using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Systems; using Content.Server.PowerCell; +using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Medical.CrewMonitoring; using Content.Shared.Medical.SuitSensor; using Content.Shared.Pinpointer; diff --git a/Content.Server/Medical/CrewMonitoring/CrewMonitoringServerSystem.cs b/Content.Server/Medical/CrewMonitoring/CrewMonitoringServerSystem.cs index d7b8cc67a5..ad50a8f957 100644 --- a/Content.Server/Medical/CrewMonitoring/CrewMonitoringServerSystem.cs +++ b/Content.Server/Medical/CrewMonitoring/CrewMonitoringServerSystem.cs @@ -1,10 +1,10 @@ -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.Medical.SuitSensors; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Medical.SuitSensor; using Robust.Shared.Timing; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Medical.CrewMonitoring; diff --git a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs index fa4344cc78..2ab09e746f 100644 --- a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs +++ b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs @@ -1,7 +1,5 @@ using System.Numerics; using Content.Server.Access.Systems; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.Emp; using Content.Server.Medical.CrewMonitoring; @@ -26,6 +24,7 @@ using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Medical.SuitSensors; diff --git a/Content.Server/PDA/PdaSystem.cs b/Content.Server/PDA/PdaSystem.cs index a9527020b0..bdf688efe7 100644 --- a/Content.Server/PDA/PdaSystem.cs +++ b/Content.Server/PDA/PdaSystem.cs @@ -2,27 +2,23 @@ using Content.Server.Access.Systems; using Content.Server.AlertLevel; using Content.Server.CartridgeLoader; using Content.Server.Chat.Managers; -using Content.Server.DeviceNetwork.Components; using Content.Server.Instruments; -using Content.Server.Light.EntitySystems; using Content.Server.PDA.Ringer; using Content.Server.Station.Systems; -using Content.Server.Store.Components; using Content.Server.Store.Systems; using Content.Server.Traitor.Uplink; using Content.Shared.Access.Components; using Content.Shared.CartridgeLoader; using Content.Shared.Chat; using Content.Shared.Light; -using Content.Shared.Light.Components; using Content.Shared.Light.EntitySystems; using Content.Shared.PDA; -using Content.Shared.Store.Components; using Robust.Server.Containers; using Robust.Server.GameObjects; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Utility; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.PDA { diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 0239273455..f3405486e6 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -15,7 +15,6 @@ namespace Content.Server.Power.EntitySystems public sealed class PowerReceiverSystem : SharedPowerReceiverSystem { [Dependency] private readonly IAdminManager _adminManager = default!; - private EntityQuery<ApcPowerReceiverComponent> _recQuery; private EntityQuery<ApcPowerProviderComponent> _provQuery; diff --git a/Content.Server/Power/Generation/Teg/TegSystem.cs b/Content.Server/Power/Generation/Teg/TegSystem.cs index 437d805dcd..04f876c2c2 100644 --- a/Content.Server/Power/Generation/Teg/TegSystem.cs +++ b/Content.Server/Power/Generation/Teg/TegSystem.cs @@ -9,6 +9,7 @@ using Content.Server.NodeContainer.Nodes; using Content.Server.Power.Components; using Content.Shared.Atmos; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Examine; using Content.Shared.Power; using Content.Shared.Power.EntitySystems; diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index 1fe48d22b4..1cea981d3c 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -1,4 +1,3 @@ -using Content.Server.DeviceNetwork.Components; using Content.Server.Power.EntitySystems; using Content.Server.PowerCell; using Content.Shared.DeviceNetwork.Components; diff --git a/Content.Server/Robotics/Systems/RoboticsConsoleSystem.cs b/Content.Server/Robotics/Systems/RoboticsConsoleSystem.cs index 916694fdd8..c4554d65d6 100644 --- a/Content.Server/Robotics/Systems/RoboticsConsoleSystem.cs +++ b/Content.Server/Robotics/Systems/RoboticsConsoleSystem.cs @@ -1,5 +1,4 @@ using Content.Server.Administration.Logs; -using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Systems; using Content.Server.Radio.EntitySystems; using Content.Shared.Lock; @@ -10,7 +9,7 @@ using Content.Shared.Robotics.Components; using Content.Shared.Robotics.Systems; using Robust.Server.GameObjects; using Robust.Shared.Timing; -using System.Diagnostics.CodeAnalysis; +using Content.Shared.DeviceNetwork.Events; namespace Content.Server.Research.Systems; diff --git a/Content.Server/RoundEnd/RoundEndSystem.cs b/Content.Server/RoundEnd/RoundEndSystem.cs index bb5934f3f0..900a52057e 100644 --- a/Content.Server/RoundEnd/RoundEndSystem.cs +++ b/Content.Server/RoundEnd/RoundEndSystem.cs @@ -4,8 +4,6 @@ using Content.Server.AlertLevel; using Content.Shared.CCVar; using Content.Server.Chat.Managers; using Content.Server.Chat.Systems; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.GameTicking; using Content.Server.Screens.Components; @@ -21,6 +19,7 @@ using Robust.Shared.Configuration; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Timing; +using Content.Shared.DeviceNetwork.Components; using Timer = Robust.Shared.Timing.Timer; namespace Content.Server.RoundEnd diff --git a/Content.Server/Screens/Systems/ScreenSystem.cs b/Content.Server/Screens/Systems/ScreenSystem.cs index 782fe38c88..c159bfe1d5 100644 --- a/Content.Server/Screens/Systems/ScreenSystem.cs +++ b/Content.Server/Screens/Systems/ScreenSystem.cs @@ -2,6 +2,8 @@ using Content.Shared.TextScreen; using Content.Server.Screens.Components; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using Robust.Shared.Timing; @@ -63,7 +65,7 @@ public sealed class ScreenSystem : EntitySystem /// <summary> /// Determines if/how a timer packet affects this screen. /// Currently there are 2 broadcast domains: Arrivals, and every other screen. - /// Domain is determined by the <see cref="DeviceNetworkComponent.TransmitFrequencyId"/> on each timer. + /// Domain is determined by the <see cref="Shared.DeviceNetwork.Components.DeviceNetworkComponent.TransmitFrequencyId"/> on each timer. /// Each broadcast domain is divided into subnets. Screen MapUid determines subnet. /// Subnets are the shuttle, source, and dest. Source/dest change each jump. /// This is required to send different timers to the shuttle/terminal/station. diff --git a/Content.Server/SensorMonitoring/BatterySensorSystem.cs b/Content.Server/SensorMonitoring/BatterySensorSystem.cs index 501b094c89..5047cd1d29 100644 --- a/Content.Server/SensorMonitoring/BatterySensorSystem.cs +++ b/Content.Server/SensorMonitoring/BatterySensorSystem.cs @@ -2,6 +2,7 @@ using Content.Server.DeviceNetwork.Systems; using Content.Server.Power.Components; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; namespace Content.Server.SensorMonitoring; diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs index dec3e6c36e..a562abd926 100644 --- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs +++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs @@ -1,7 +1,7 @@ -using Content.Server.DeviceNetwork.Components; -using Content.Shared.SensorMonitoring; +using Content.Shared.SensorMonitoring; using Robust.Shared.Collections; using ConsoleUIState = Content.Shared.SensorMonitoring.SensorMonitoringConsoleBoundInterfaceState; +using Content.Shared.DeviceNetwork.Components; using IncrementalUIState = Content.Shared.SensorMonitoring.SensorMonitoringIncrementalUpdate; namespace Content.Server.SensorMonitoring; diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs index ddd7812394..ebe8f304ba 100644 --- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs +++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs @@ -1,10 +1,7 @@ using Content.Server.Atmos.Monitor.Components; using Content.Server.Atmos.Monitor.Systems; -using Content.Server.Atmos.Piping.Binary.Components; using Content.Server.Atmos.Piping.Components; using Content.Server.Atmos.Piping.Unary.Components; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.Power.Generation.Teg; using Content.Shared.Atmos.Monitor; @@ -12,6 +9,7 @@ using Content.Shared.Atmos.Piping.Binary.Components; using Content.Shared.Atmos.Piping.Unary.Components; using Content.Shared.DeviceNetwork; using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.DeviceNetwork.Systems; using Content.Shared.SensorMonitoring; using Robust.Server.GameObjects; diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index 896570fb34..aa1c2e6dff 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Numerics; using Content.Server.Administration; using Content.Server.Chat.Managers; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.GameTicking; using Content.Server.GameTicking.Events; @@ -19,6 +18,7 @@ using Content.Shared.Administration; using Content.Shared.CCVar; using Content.Shared.Damage.Components; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.GameTicking; using Content.Shared.Mobs.Components; using Content.Shared.Movement.Components; @@ -26,20 +26,17 @@ using Content.Shared.Parallax.Biomes; using Content.Shared.Salvage; using Content.Shared.Shuttles.Components; using Content.Shared.Tiles; -using Robust.Server.GameObjects; using Robust.Shared.Collections; using Robust.Shared.Configuration; using Robust.Shared.Console; -using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.Map; -using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using Robust.Shared.Spawners; using Robust.Shared.Timing; using Robust.Shared.Utility; -using TimedDespawnComponent = Robust.Shared.Spawners.TimedDespawnComponent; namespace Content.Server.Shuttles.Systems; diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index 09aad1d931..95c6ab5a1b 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -1,5 +1,4 @@ using System.Threading; -using Content.Server.DeviceNetwork.Components; using Content.Server.Screens.Components; using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; @@ -14,6 +13,7 @@ using Content.Shared.Shuttles.Systems; using Content.Shared.UserInterface; using Robust.Shared.Map; using Robust.Shared.Player; +using Content.Shared.DeviceNetwork.Components; using Timer = Robust.Shared.Timing.Timer; namespace Content.Server.Shuttles.Systems; diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index afa77421bd..8e3e01bfb6 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -6,7 +6,6 @@ using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Chat.Systems; using Content.Server.Communications; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.GameTicking.Events; using Content.Server.Pinpointer; @@ -37,6 +36,7 @@ using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Timing; using Robust.Shared.Utility; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.Shuttles.Systems; diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs index 4d2a8912e8..e950d3f288 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs @@ -1,13 +1,10 @@ using Content.Shared.DeviceNetwork; -using Content.Shared.Emag.Components; using Content.Shared.Movement.Components; using Content.Shared.Popups; using Content.Shared.Robotics; using Content.Shared.Silicons.Borgs.Components; -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; -using Content.Server.DeviceNetwork.Systems; -using Content.Server.Explosion.Components; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Emag.Systems; using Robust.Shared.Utility; diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs index 21e71c4316..30bbb2f0e9 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs @@ -3,6 +3,7 @@ using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Systems; using Content.Server.Power.Components; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; using Content.Shared.UserInterface; using Content.Shared.SurveillanceCamera; diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs index 315273a0cc..c6886dee33 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs @@ -1,15 +1,13 @@ -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Power.Components; using Content.Shared.ActionBlocker; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; using Content.Shared.SurveillanceCamera; using Content.Shared.Verbs; using Robust.Server.GameObjects; -using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.SurveillanceCamera; diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs index f1d1b58bf5..709e383c06 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs @@ -1,16 +1,15 @@ -using Content.Server.DeviceNetwork; -using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; using Content.Server.Emp; -using Content.Server.Power.Components; using Content.Shared.ActionBlocker; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; using Content.Shared.SurveillanceCamera; using Content.Shared.Verbs; using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Content.Shared.DeviceNetwork.Components; namespace Content.Server.SurveillanceCamera; diff --git a/Content.Server/Turrets/DeployableTurretSystem.cs b/Content.Server/Turrets/DeployableTurretSystem.cs index 359d91fd1d..72c011bc90 100644 --- a/Content.Server/Turrets/DeployableTurretSystem.cs +++ b/Content.Server/Turrets/DeployableTurretSystem.cs @@ -8,6 +8,8 @@ using Content.Server.Power.Components; using Content.Server.Repairable; using Content.Shared.Destructible; using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; using Content.Shared.Power; using Content.Shared.Turrets; using Content.Shared.Weapons.Ranged.Events; diff --git a/Content.Shared/Climbing/Components/ClimbableComponent.cs b/Content.Shared/Climbing/Components/ClimbableComponent.cs index 1a924e5c30..22a42dea78 100644 --- a/Content.Shared/Climbing/Components/ClimbableComponent.cs +++ b/Content.Shared/Climbing/Components/ClimbableComponent.cs @@ -13,7 +13,13 @@ namespace Content.Shared.Climbing.Components /// <summary> /// The range from which this entity can be climbed. /// </summary> - [DataField("range")] public float Range = SharedInteractionSystem.InteractionRange / 1.4f; + [DataField] public float Range = SharedInteractionSystem.InteractionRange; + + /// <summary> + /// Can drag-drop / verb vaulting be done? Set to false if climbing is being handled manually. + /// </summary> + [DataField] + public bool Vaultable = true; /// <summary> /// The time it takes to climb onto the entity. diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index f8f2ffda88..d7d9df7fdd 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -149,7 +149,7 @@ public sealed partial class ClimbSystem : VirtualController private void OnCanDragDropOn(EntityUid uid, ClimbableComponent component, ref CanDropTargetEvent args) { - if (args.Handled) + if (args.Handled || !component.Vaultable) return; // If already climbing then don't show outlines. @@ -261,7 +261,7 @@ public sealed partial class ClimbSystem : VirtualController args.Handled = true; } - private void Climb(EntityUid uid, EntityUid user, EntityUid climbable, bool silent = false, ClimbingComponent? climbing = null, + public void Climb(EntityUid uid, EntityUid user, EntityUid climbable, bool silent = false, ClimbingComponent? climbing = null, PhysicsComponent? physics = null, FixturesComponent? fixtures = null, ClimbableComponent? comp = null) { if (!Resolve(uid, ref climbing, ref physics, ref fixtures, false)) @@ -456,6 +456,12 @@ public sealed partial class ClimbSystem : VirtualController /// <param name="reason">The reason why it cant be dropped</param> public bool CanVault(ClimbableComponent component, EntityUid user, EntityUid target, out string reason) { + if (!component.Vaultable) + { + reason = string.Empty; + return false; + } + if (!_actionBlockerSystem.CanInteract(user, target)) { reason = Loc.GetString("comp-climbable-cant-interact"); diff --git a/Content.Shared/Configurable/ConfigurationComponent.cs b/Content.Shared/Configurable/ConfigurationComponent.cs index 621871af3c..63c0845083 100644 --- a/Content.Shared/Configurable/ConfigurationComponent.cs +++ b/Content.Shared/Configurable/ConfigurationComponent.cs @@ -2,34 +2,38 @@ using System.Text.RegularExpressions; using Content.Shared.Tools; using Content.Shared.Tools.Systems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Configurable { - [RegisterComponent, NetworkedComponent] + /// <summary> + /// Configuration for mailing units. + /// </summary> + /// <remarks> + /// If you want a more detailed description ask the original coder. + /// </remarks> + [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ConfigurationComponent : Component { - [DataField("config")] + /// <summary> + /// Tags for mail unit routing. + /// </summary> + [DataField, AutoNetworkedField] public Dictionary<string, string?> Config = new(); - [DataField("qualityNeeded", customTypeSerializer: typeof(PrototypeIdSerializer<ToolQualityPrototype>))] - public string QualityNeeded = SharedToolSystem.PulseQuality; + /// <summary> + /// Quality to open up the configuration UI. + /// </summary> + [DataField] + public ProtoId<ToolQualityPrototype> QualityNeeded = SharedToolSystem.PulseQuality; - [DataField("validation")] + /// <summary> + /// Validate tags in <see cref="Config"/>. + /// </summary> + [DataField] public Regex Validation = new("^[a-zA-Z0-9 ]*$", RegexOptions.Compiled); - [Serializable, NetSerializable] - public sealed class ConfigurationBoundUserInterfaceState : BoundUserInterfaceState - { - public Dictionary<string, string?> Config { get; } - - public ConfigurationBoundUserInterfaceState(Dictionary<string, string?> config) - { - Config = config; - } - } - /// <summary> /// Message data sent from client to server when the device configuration is updated. /// </summary> diff --git a/Content.Shared/Configurable/SharedConfigurationSystem.cs b/Content.Shared/Configurable/SharedConfigurationSystem.cs new file mode 100644 index 0000000000..704965188e --- /dev/null +++ b/Content.Shared/Configurable/SharedConfigurationSystem.cs @@ -0,0 +1,77 @@ +using Content.Shared.Interaction; +using Content.Shared.Tools.Systems; +using Robust.Shared.Containers; +using static Content.Shared.Configurable.ConfigurationComponent; + +namespace Content.Shared.Configurable; + +/// <summary> +/// <see cref="ConfigurationComponent"/> +/// </summary> +public abstract class SharedConfigurationSystem : EntitySystem +{ + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly SharedToolSystem _toolSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<ConfigurationComponent, ConfigurationUpdatedMessage>(OnUpdate); + SubscribeLocalEvent<ConfigurationComponent, InteractUsingEvent>(OnInteractUsing); + SubscribeLocalEvent<ConfigurationComponent, ContainerIsInsertingAttemptEvent>(OnInsert); + } + + private void OnInteractUsing(EntityUid uid, ConfigurationComponent component, InteractUsingEvent args) + { + // TODO use activatable ui system + if (args.Handled) + return; + + if (!_toolSystem.HasQuality(args.Used, component.QualityNeeded)) + return; + + args.Handled = _uiSystem.TryOpenUi(uid, ConfigurationUiKey.Key, args.User); + } + + private void OnUpdate(EntityUid uid, ConfigurationComponent component, ConfigurationUpdatedMessage args) + { + foreach (var key in component.Config.Keys) + { + var value = args.Config.GetValueOrDefault(key); + + if (string.IsNullOrWhiteSpace(value) || component.Validation != null && !component.Validation.IsMatch(value)) + continue; + + component.Config[key] = value; + } + + Dirty(uid, component); + var updatedEvent = new ConfigurationUpdatedEvent(component); + RaiseLocalEvent(uid, updatedEvent); + + // TODO support float (spinbox) and enum (drop-down) configurations + // TODO support verbs. + } + + private void OnInsert(EntityUid uid, ConfigurationComponent component, ContainerIsInsertingAttemptEvent args) + { + if (!_toolSystem.HasQuality(args.EntityUid, component.QualityNeeded)) + return; + + args.Cancel(); + } +} + +/// <summary> +/// Sent when configuration values got changes +/// </summary> +public sealed class ConfigurationUpdatedEvent : EntityEventArgs +{ + public ConfigurationComponent Configuration; + + public ConfigurationUpdatedEvent(ConfigurationComponent configuration) + { + Configuration = configuration; + } +} diff --git a/Content.Shared/Containers/SharedThrowInsertContainerSystem.cs b/Content.Shared/Containers/SharedThrowInsertContainerSystem.cs new file mode 100644 index 0000000000..a5c300c284 --- /dev/null +++ b/Content.Shared/Containers/SharedThrowInsertContainerSystem.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Containers; + +/// <summary> +/// Sent before the insertion is made. +/// Allows preventing the insertion if any system on the entity should need to. +/// </summary> +[ByRefEvent] +public record struct BeforeThrowInsertEvent(EntityUid ThrownEntity, bool Cancelled = false); diff --git a/Content.Server/DeviceNetwork/Components/DeviceNetworkComponent.cs b/Content.Shared/DeviceNetwork/Components/DeviceNetworkComponent.cs similarity index 93% rename from Content.Server/DeviceNetwork/Components/DeviceNetworkComponent.cs rename to Content.Shared/DeviceNetwork/Components/DeviceNetworkComponent.cs index 186da57e5d..37a86e7161 100644 --- a/Content.Server/DeviceNetwork/Components/DeviceNetworkComponent.cs +++ b/Content.Shared/DeviceNetwork/Components/DeviceNetworkComponent.cs @@ -1,11 +1,10 @@ -using Content.Server.DeviceNetwork.Systems; -using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Systems; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.DeviceNetwork.Components +namespace Content.Shared.DeviceNetwork.Components { [RegisterComponent] - [Access(typeof(DeviceNetworkSystem), typeof(DeviceNet))] + [Access(typeof(SharedDeviceNetworkSystem), typeof(DeviceNet))] public sealed partial class DeviceNetworkComponent : Component { public enum DeviceNetIdDefaults @@ -113,14 +112,14 @@ namespace Content.Server.DeviceNetwork.Components /// A list of device-lists that this device is on. /// </summary> [DataField] - [Access(typeof(DeviceListSystem))] + [Access(typeof(SharedDeviceListSystem))] public HashSet<EntityUid> DeviceLists = new(); /// <summary> /// A list of configurators that this device is on. /// </summary> [DataField] - [Access(typeof(NetworkConfiguratorSystem))] + [Access(typeof(SharedNetworkConfiguratorSystem))] public HashSet<EntityUid> Configurators = new(); } } diff --git a/Content.Server/DeviceNetwork/DeviceNet.cs b/Content.Shared/DeviceNetwork/DeviceNet.cs similarity index 97% rename from Content.Server/DeviceNetwork/DeviceNet.cs rename to Content.Shared/DeviceNetwork/DeviceNet.cs index c77d45c061..4234b30385 100644 --- a/Content.Server/DeviceNetwork/DeviceNet.cs +++ b/Content.Shared/DeviceNetwork/DeviceNet.cs @@ -1,8 +1,7 @@ -using Content.Server.DeviceNetwork.Components; using Robust.Shared.Random; -using static Content.Server.DeviceNetwork.Components.DeviceNetworkComponent; +using Content.Shared.DeviceNetwork.Components; -namespace Content.Server.DeviceNetwork; +namespace Content.Shared.DeviceNetwork; /// <summary> /// Data class for storing and retrieving information about devices connected to a device network. diff --git a/Content.Server/DeviceNetwork/DeviceNetworkConstants.cs b/Content.Shared/DeviceNetwork/DeviceNetworkConstants.cs similarity index 96% rename from Content.Server/DeviceNetwork/DeviceNetworkConstants.cs rename to Content.Shared/DeviceNetwork/DeviceNetworkConstants.cs index 6cbad603b4..7fec72bb69 100644 --- a/Content.Server/DeviceNetwork/DeviceNetworkConstants.cs +++ b/Content.Shared/DeviceNetwork/DeviceNetworkConstants.cs @@ -1,7 +1,7 @@ -using Content.Server.DeviceNetwork.Components; using Robust.Shared.Utility; +using Content.Shared.DeviceNetwork.Components; -namespace Content.Server.DeviceNetwork +namespace Content.Shared.DeviceNetwork { /// <summary> /// A collection of constants to help with using device networks diff --git a/Content.Shared/DeviceNetwork/Events/BeforeBroadcastAttemptEvent.cs b/Content.Shared/DeviceNetwork/Events/BeforeBroadcastAttemptEvent.cs new file mode 100644 index 0000000000..f495847482 --- /dev/null +++ b/Content.Shared/DeviceNetwork/Events/BeforeBroadcastAttemptEvent.cs @@ -0,0 +1,17 @@ +using Content.Shared.DeviceNetwork.Components; + +namespace Content.Shared.DeviceNetwork.Events; + +/// <summary> +/// Sent to the sending entity before broadcasting network packets to recipients +/// </summary> +public sealed class BeforeBroadcastAttemptEvent : CancellableEntityEventArgs +{ + public readonly IReadOnlySet<DeviceNetworkComponent> Recipients; + public HashSet<DeviceNetworkComponent>? ModifiedRecipients; + + public BeforeBroadcastAttemptEvent(IReadOnlySet<DeviceNetworkComponent> recipients) + { + Recipients = recipients; + } +} diff --git a/Content.Shared/DeviceNetwork/Events/BeforePacketSentEvent.cs b/Content.Shared/DeviceNetwork/Events/BeforePacketSentEvent.cs new file mode 100644 index 0000000000..5d5c038dbf --- /dev/null +++ b/Content.Shared/DeviceNetwork/Events/BeforePacketSentEvent.cs @@ -0,0 +1,35 @@ +using System.Numerics; + +namespace Content.Shared.DeviceNetwork.Events; + +/// <summary> +/// Event raised before a device network packet is send. +/// Subscribed to by other systems to prevent the packet from being sent. +/// </summary> +public sealed class BeforePacketSentEvent : CancellableEntityEventArgs +{ + /// <summary> + /// The EntityUid of the entity the packet was sent from. + /// </summary> + public readonly EntityUid Sender; + + public readonly TransformComponent SenderTransform; + + /// <summary> + /// The senders current position in world coordinates. + /// </summary> + public readonly Vector2 SenderPosition; + + /// <summary> + /// The network the packet will be sent to. + /// </summary> + public readonly string NetworkId; + + public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId) + { + Sender = sender; + SenderTransform = xform; + SenderPosition = senderPosition; + NetworkId = networkId; + } +} \ No newline at end of file diff --git a/Content.Shared/DeviceNetwork/Events/DeviceNetworkPacketEvent.cs b/Content.Shared/DeviceNetwork/Events/DeviceNetworkPacketEvent.cs new file mode 100644 index 0000000000..4ae6afeef7 --- /dev/null +++ b/Content.Shared/DeviceNetwork/Events/DeviceNetworkPacketEvent.cs @@ -0,0 +1,47 @@ +namespace Content.Shared.DeviceNetwork.Events; + +/// <summary> +/// Event raised when a device network packet gets sent. +/// </summary> +public sealed class DeviceNetworkPacketEvent : EntityEventArgs +{ + /// <summary> + /// The id of the network that this packet is being sent on. + /// </summary> + public int NetId; + + /// <summary> + /// The frequency the packet is sent on. + /// </summary> + public readonly uint Frequency; + + /// <summary> + /// Address of the intended recipient. Null if the message was broadcast. + /// </summary> + public string? Address; + + /// <summary> + /// The device network address of the sending entity. + /// </summary> + public readonly string SenderAddress; + + /// <summary> + /// The entity that sent the packet. + /// </summary> + public EntityUid Sender; + + /// <summary> + /// The data that is being sent. + /// </summary> + public readonly NetworkPayload Data; + + public DeviceNetworkPacketEvent(int netId, string? address, uint frequency, string senderAddress, EntityUid sender, NetworkPayload data) + { + NetId = netId; + Address = address; + Frequency = frequency; + SenderAddress = senderAddress; + Sender = sender; + Data = data; + } +} \ No newline at end of file diff --git a/Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkSystem.cs b/Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkSystem.cs new file mode 100644 index 0000000000..5992c40413 --- /dev/null +++ b/Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkSystem.cs @@ -0,0 +1,25 @@ +using Content.Shared.DeviceNetwork.Components; + +namespace Content.Shared.DeviceNetwork.Systems; + +public abstract class SharedDeviceNetworkSystem : EntitySystem +{ + /// <summary> + /// Sends the given payload as a device network packet to the entity with the given address and frequency. + /// Addresses are given to the DeviceNetworkComponent of an entity when connecting. + /// </summary> + /// <param name="uid">The EntityUid of the sending entity</param> + /// <param name="address">The address of the entity that the packet gets sent to. If null, the message is broadcast to all devices on that frequency (except the sender)</param> + /// <param name="frequency">The frequency to send on</param> + /// <param name="data">The data to be sent</param> + /// <returns>Returns true when the packet was successfully enqueued.</returns> + public virtual bool QueuePacket(EntityUid uid, + string? address, + NetworkPayload data, + uint? frequency = null, + int? network = null, + DeviceNetworkComponent? device = null) + { + return false; + } +} diff --git a/Content.Server/Disposal/Mailing/MailingUnitComponent.cs b/Content.Shared/Disposal/Mailing/MailingUnitComponent.cs similarity index 57% rename from Content.Server/Disposal/Mailing/MailingUnitComponent.cs rename to Content.Shared/Disposal/Mailing/MailingUnitComponent.cs index be5eca99c4..255d6cdf01 100644 --- a/Content.Server/Disposal/Mailing/MailingUnitComponent.cs +++ b/Content.Shared/Disposal/Mailing/MailingUnitComponent.cs @@ -1,30 +1,28 @@ -using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Mailing; +using Robust.Shared.GameStates; -namespace Content.Server.Disposal.Mailing; +namespace Content.Shared.Disposal.Components; -[Access(typeof(MailingUnitSystem))] -[RegisterComponent] +[Access(typeof(SharedMailingUnitSystem))] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class MailingUnitComponent : Component { /// <summary> /// List of targets the mailing unit can send to. /// Each target is just a disposal routing tag /// </summary> - [DataField("targetList")] + [DataField, AutoNetworkedField] public List<string> TargetList = new(); /// <summary> /// The target that gets attached to the disposal holders tag list on flush /// </summary> - [DataField("target")] + [DataField, AutoNetworkedField] public string? Target; /// <summary> /// The tag for this mailing unit /// </summary> - [ViewVariables(VVAccess.ReadWrite)] - [DataField("tag")] + [DataField, AutoNetworkedField] public string? Tag; - - public SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState? DisposalUnitInterfaceState; } diff --git a/Content.Shared/Disposal/MailingUnitUiMessages.cs b/Content.Shared/Disposal/Mailing/MailingUnitUiMessages.cs similarity index 100% rename from Content.Shared/Disposal/MailingUnitUiMessages.cs rename to Content.Shared/Disposal/Mailing/MailingUnitUiMessages.cs diff --git a/Content.Shared/Disposal/Components/SharedDisposalRouterComponent.cs b/Content.Shared/Disposal/Mailing/SharedDisposalRouterComponent.cs similarity index 100% rename from Content.Shared/Disposal/Components/SharedDisposalRouterComponent.cs rename to Content.Shared/Disposal/Mailing/SharedDisposalRouterComponent.cs diff --git a/Content.Shared/Disposal/Components/SharedDisposalTaggerComponent.cs b/Content.Shared/Disposal/Mailing/SharedDisposalTaggerComponent.cs similarity index 100% rename from Content.Shared/Disposal/Components/SharedDisposalTaggerComponent.cs rename to Content.Shared/Disposal/Mailing/SharedDisposalTaggerComponent.cs diff --git a/Content.Shared/Disposal/Mailing/SharedMailingUnitSystem.cs b/Content.Shared/Disposal/Mailing/SharedMailingUnitSystem.cs new file mode 100644 index 0000000000..cb7a8c46c8 --- /dev/null +++ b/Content.Shared/Disposal/Mailing/SharedMailingUnitSystem.cs @@ -0,0 +1,174 @@ +using Content.Shared.Configurable; +using Content.Shared.DeviceNetwork; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Events; +using Content.Shared.DeviceNetwork.Systems; +using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Unit; +using Content.Shared.Disposal.Unit.Events; +using Content.Shared.Interaction; +using Content.Shared.Power.EntitySystems; +using Robust.Shared.Player; + +namespace Content.Shared.Disposal.Mailing; + +public abstract class SharedMailingUnitSystem : EntitySystem +{ + [Dependency] private readonly SharedDeviceNetworkSystem _deviceNetworkSystem = default!; + [Dependency] private readonly SharedPowerReceiverSystem _power = default!; + [Dependency] protected readonly SharedUserInterfaceSystem UserInterfaceSystem = default!; + + private const string MailTag = "mail"; + + private const string TagConfigurationKey = "tag"; + + private const string NetTag = "tag"; + private const string NetSrc = "src"; + private const string NetTarget = "target"; + private const string NetCmdSent = "mail_sent"; + private const string NetCmdRequest = "get_mailer_tag"; + private const string NetCmdResponse = "mailer_tag"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<MailingUnitComponent, ComponentInit>(OnComponentInit); + SubscribeLocalEvent<MailingUnitComponent, DeviceNetworkPacketEvent>(OnPacketReceived); + SubscribeLocalEvent<MailingUnitComponent, BeforeDisposalFlushEvent>(OnBeforeFlush); + SubscribeLocalEvent<MailingUnitComponent, ConfigurationUpdatedEvent>(OnConfigurationUpdated); + SubscribeLocalEvent<MailingUnitComponent, ActivateInWorldEvent>(HandleActivate, before: new[] { typeof(SharedDisposalUnitSystem) }); + SubscribeLocalEvent<MailingUnitComponent, TargetSelectedMessage>(OnTargetSelected); + } + + private void OnComponentInit(EntityUid uid, MailingUnitComponent component, ComponentInit args) + { + UpdateTargetList(uid, component); + } + + private void OnPacketReceived(EntityUid uid, MailingUnitComponent component, DeviceNetworkPacketEvent args) + { + if (!args.Data.TryGetValue(DeviceNetworkConstants.Command, out string? command) || !_power.IsPowered(uid)) + return; + + switch (command) + { + case NetCmdRequest: + SendTagRequestResponse(uid, args, component.Tag); + break; + case NetCmdResponse when args.Data.TryGetValue(NetTag, out string? tag): + //Add the received tag request response to the list of targets + component.TargetList.Add(tag); + Dirty(uid, component); + break; + } + } + + /// <summary> + /// Sends the given tag as a response to a <see cref="NetCmdRequest"/> if it's not null + /// </summary> + private void SendTagRequestResponse(EntityUid uid, DeviceNetworkPacketEvent args, string? tag) + { + if (tag == null) + return; + + var payload = new NetworkPayload + { + [DeviceNetworkConstants.Command] = NetCmdResponse, + [NetTag] = tag + }; + + _deviceNetworkSystem.QueuePacket(uid, args.Address, payload, args.Frequency); + } + + /// <summary> + /// Prevents the unit from flushing if no target is selected + /// </summary> + private void OnBeforeFlush(EntityUid uid, MailingUnitComponent component, BeforeDisposalFlushEvent args) + { + if (string.IsNullOrEmpty(component.Target)) + { + args.Cancel(); + return; + } + + Dirty(uid, component); + args.Tags.Add(MailTag); + args.Tags.Add(component.Target); + + BroadcastSentMessage(uid, component); + } + + /// <summary> + /// Broadcast that a mail was sent including the src and target tags + /// </summary> + private void BroadcastSentMessage(EntityUid uid, MailingUnitComponent component, DeviceNetworkComponent? device = null) + { + if (string.IsNullOrEmpty(component.Tag) || string.IsNullOrEmpty(component.Target) || !Resolve(uid, ref device)) + return; + + var payload = new NetworkPayload + { + [DeviceNetworkConstants.Command] = NetCmdSent, + [NetSrc] = component.Tag, + [NetTarget] = component.Target + }; + + _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); + } + + /// <summary> + /// Clears the units target list and broadcasts a <see cref="NetCmdRequest"/>. + /// The target list will then get populated with <see cref="NetCmdResponse"/> responses from all active mailing units on the same grid + /// </summary> + private void UpdateTargetList(EntityUid uid, MailingUnitComponent component, DeviceNetworkComponent? device = null) + { + if (!Resolve(uid, ref device, false)) + return; + + var payload = new NetworkPayload + { + [DeviceNetworkConstants.Command] = NetCmdRequest + }; + + component.TargetList.Clear(); + _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); + } + + /// <summary> + /// Gets called when the units tag got updated + /// </summary> + private void OnConfigurationUpdated(EntityUid uid, MailingUnitComponent component, ConfigurationUpdatedEvent args) + { + var configuration = args.Configuration.Config; + if (!configuration.ContainsKey(TagConfigurationKey) || configuration[TagConfigurationKey] == string.Empty) + { + component.Tag = null; + return; + } + + component.Tag = configuration[TagConfigurationKey]; + Dirty(uid, component); + } + + private void HandleActivate(EntityUid uid, MailingUnitComponent component, ActivateInWorldEvent args) + { + if (args.Handled || !args.Complex) + return; + + if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor)) + { + return; + } + + args.Handled = true; + UpdateTargetList(uid, component); + UserInterfaceSystem.OpenUi(uid, MailingUnitUiKey.Key, actor.PlayerSession); + } + + private void OnTargetSelected(EntityUid uid, MailingUnitComponent component, TargetSelectedMessage args) + { + component.Target = args.Target; + Dirty(uid, component); + } +} diff --git a/Content.Shared/Disposal/MailingUnitBoundUserInterfaceState.cs b/Content.Shared/Disposal/MailingUnitBoundUserInterfaceState.cs deleted file mode 100644 index 65be092072..0000000000 --- a/Content.Shared/Disposal/MailingUnitBoundUserInterfaceState.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Content.Shared.Disposal.Components; -using Robust.Shared.Serialization; - -namespace Content.Shared.Disposal; - -[Serializable, NetSerializable] -public sealed class MailingUnitBoundUserInterfaceState : BoundUserInterfaceState, IEquatable<MailingUnitBoundUserInterfaceState> -{ - public string? Target; - public List<string> TargetList; - public string? Tag; - public SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState DisposalState; - - public MailingUnitBoundUserInterfaceState(SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState disposalState, string? target, List<string> targetList, string? tag) - { - DisposalState = disposalState; - Target = target; - TargetList = targetList; - Tag = tag; - } - - public bool Equals(MailingUnitBoundUserInterfaceState? other) - { - if (other is null) - return false; - if (ReferenceEquals(this, other)) - return true; - return DisposalState.Equals(other.DisposalState) - && Target == other.Target - && TargetList.Equals(other.TargetList) - && Tag == other.Tag; - } - - public override bool Equals(object? other) - { - if (other is MailingUnitBoundUserInterfaceState otherState) - return Equals(otherState); - return false; - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } -} diff --git a/Content.Shared/Disposal/SharedDisposalUnitSystem.cs b/Content.Shared/Disposal/SharedDisposalUnitSystem.cs deleted file mode 100644 index a650ef72f8..0000000000 --- a/Content.Shared/Disposal/SharedDisposalUnitSystem.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Shared.Body.Components; -using Content.Shared.Disposal.Components; -using Content.Shared.DoAfter; -using Content.Shared.DragDrop; -using Content.Shared.Emag.Systems; -using Content.Shared.Item; -using Content.Shared.Throwing; -using Content.Shared.Whitelist; -using Robust.Shared.Audio; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Events; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Serialization; -using Robust.Shared.Timing; - -namespace Content.Shared.Disposal; - -[Serializable, NetSerializable] -public sealed partial class DisposalDoAfterEvent : SimpleDoAfterEvent -{ -} - -public abstract class SharedDisposalUnitSystem : EntitySystem -{ - [Dependency] protected readonly IGameTiming GameTiming = default!; - [Dependency] protected readonly EmagSystem _emag = default!; - [Dependency] protected readonly MetaDataSystem Metadata = default!; - [Dependency] protected readonly SharedJointSystem Joints = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; - - protected static TimeSpan ExitAttemptDelay = TimeSpan.FromSeconds(0.5); - - // Percentage - public const float PressurePerSecond = 0.05f; - - public abstract bool HasDisposals([NotNullWhen(true)] EntityUid? uid); - - public abstract bool ResolveDisposals(EntityUid uid, [NotNullWhen(true)] ref SharedDisposalUnitComponent? component); - - /// <summary> - /// Gets the current pressure state of a disposals unit. - /// </summary> - /// <param name="uid"></param> - /// <param name="component"></param> - /// <param name="metadata"></param> - /// <returns></returns> - public DisposalsPressureState GetState(EntityUid uid, SharedDisposalUnitComponent component, MetaDataComponent? metadata = null) - { - var nextPressure = Metadata.GetPauseTime(uid, metadata) + component.NextPressurized - GameTiming.CurTime; - var pressurizeTime = 1f / PressurePerSecond; - var pressurizeDuration = pressurizeTime - component.FlushDelay.TotalSeconds; - - if (nextPressure.TotalSeconds > pressurizeDuration) - { - return DisposalsPressureState.Flushed; - } - - if (nextPressure > TimeSpan.Zero) - { - return DisposalsPressureState.Pressurizing; - } - - return DisposalsPressureState.Ready; - } - - public float GetPressure(EntityUid uid, SharedDisposalUnitComponent component, MetaDataComponent? metadata = null) - { - if (!Resolve(uid, ref metadata)) - return 0f; - - var pauseTime = Metadata.GetPauseTime(uid, metadata); - return MathF.Min(1f, - (float) (GameTiming.CurTime - pauseTime - component.NextPressurized).TotalSeconds / PressurePerSecond); - } - - protected void OnPreventCollide(EntityUid uid, SharedDisposalUnitComponent component, - ref PreventCollideEvent args) - { - var otherBody = args.OtherEntity; - - // Items dropped shouldn't collide but items thrown should - if (HasComp<ItemComponent>(otherBody) && !HasComp<ThrownItemComponent>(otherBody)) - { - args.Cancelled = true; - return; - } - - if (component.RecentlyEjected.Contains(otherBody)) - { - args.Cancelled = true; - } - } - - protected void OnCanDragDropOn(EntityUid uid, SharedDisposalUnitComponent component, ref CanDropTargetEvent args) - { - if (args.Handled) - return; - - args.CanDrop = CanInsert(uid, component, args.Dragged); - args.Handled = true; - } - - protected void OnEmagged(EntityUid uid, SharedDisposalUnitComponent component, ref GotEmaggedEvent args) - { - if (!_emag.CompareFlag(args.Type, EmagType.Interaction)) - return; - - if (component.DisablePressure == true) - return; - - component.DisablePressure = true; - args.Handled = true; - } - - public virtual bool CanInsert(EntityUid uid, SharedDisposalUnitComponent component, EntityUid entity) - { - if (!Transform(uid).Anchored) - return false; - - var storable = HasComp<ItemComponent>(entity); - if (!storable && !HasComp<BodyComponent>(entity)) - return false; - - if (_whitelistSystem.IsBlacklistPass(component.Blacklist, entity) || - _whitelistSystem.IsWhitelistFail(component.Whitelist, entity)) - return false; - - if (TryComp<PhysicsComponent>(entity, out var physics) && (physics.CanCollide) || storable) - return true; - else - return false; - - } - - public abstract void DoInsertDisposalUnit(EntityUid uid, EntityUid toInsert, EntityUid user, SharedDisposalUnitComponent? disposal = null); - - [Serializable, NetSerializable] - protected sealed class DisposalUnitComponentState : ComponentState - { - public SoundSpecifier? FlushSound; - public DisposalsPressureState State; - public TimeSpan NextPressurized; - public TimeSpan AutomaticEngageTime; - public TimeSpan? NextFlush; - public bool Powered; - public bool Engaged; - public List<NetEntity> RecentlyEjected; - - public DisposalUnitComponentState(SoundSpecifier? flushSound, DisposalsPressureState state, TimeSpan nextPressurized, TimeSpan automaticEngageTime, TimeSpan? nextFlush, bool powered, bool engaged, List<NetEntity> recentlyEjected) - { - FlushSound = flushSound; - State = state; - NextPressurized = nextPressurized; - AutomaticEngageTime = automaticEngageTime; - NextFlush = nextFlush; - Powered = powered; - Engaged = engaged; - RecentlyEjected = recentlyEjected; - } - } -} diff --git a/Content.Shared/Disposal/Tube/DisposalEntryComponent.cs b/Content.Shared/Disposal/Tube/DisposalEntryComponent.cs new file mode 100644 index 0000000000..066b16ad1f --- /dev/null +++ b/Content.Shared/Disposal/Tube/DisposalEntryComponent.cs @@ -0,0 +1,12 @@ +using Content.Shared.Disposal.Unit; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Disposal.Tube; + +[RegisterComponent] +[Access(typeof(SharedDisposalTubeSystem), typeof(SharedDisposalUnitSystem))] +public sealed partial class DisposalEntryComponent : Component +{ + [DataField] + public EntProtoId HolderPrototypeId = "DisposalHolder"; +} diff --git a/Content.Shared/Disposal/Components/SharedDisposalTubeComponent.cs b/Content.Shared/Disposal/Tube/SharedDisposalTubeComponent.cs similarity index 100% rename from Content.Shared/Disposal/Components/SharedDisposalTubeComponent.cs rename to Content.Shared/Disposal/Tube/SharedDisposalTubeComponent.cs diff --git a/Content.Shared/Disposal/Unit/BeforeDisposalFlushEvent.cs b/Content.Shared/Disposal/Unit/BeforeDisposalFlushEvent.cs new file mode 100644 index 0000000000..ee141d6c4d --- /dev/null +++ b/Content.Shared/Disposal/Unit/BeforeDisposalFlushEvent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Disposal.Unit.Events; + +/// <summary> +/// Sent before the disposal unit flushes it's contents. +/// Allows adding tags for sorting and preventing the disposal unit from flushing. +/// </summary> +public sealed class BeforeDisposalFlushEvent : CancellableEntityEventArgs +{ + public readonly List<string> Tags = new(); +} \ No newline at end of file diff --git a/Content.Shared/Disposal/Components/SharedDisposalUnitComponent.cs b/Content.Shared/Disposal/Unit/DisposalUnitComponent.cs similarity index 68% rename from Content.Shared/Disposal/Components/SharedDisposalUnitComponent.cs rename to Content.Shared/Disposal/Unit/DisposalUnitComponent.cs index 36dd14f9b2..34fe223013 100644 --- a/Content.Shared/Disposal/Components/SharedDisposalUnitComponent.cs +++ b/Content.Shared/Disposal/Unit/DisposalUnitComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Atmos; using Robust.Shared.Audio; using Content.Shared.Whitelist; using Robust.Shared.Containers; @@ -7,15 +8,24 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Disposal.Components; -[NetworkedComponent] -public abstract partial class SharedDisposalUnitComponent : Component +/// <summary> +/// Takes in entities and flushes them out to attached disposals tubes after a timer. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class DisposalUnitComponent : Component { public const string ContainerId = "disposals"; + /// <summary> + /// Air contained in the disposal unit. + /// </summary> + [DataField] + public GasMixture Air = new(Atmospherics.CellVolume); + /// <summary> /// Sounds played upon the unit flushing. /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField("soundFlush")] + [DataField("soundFlush"), AutoNetworkedField] public SoundSpecifier? FlushSound = new SoundPathSpecifier("/Audio/Machines/disposalflush.ogg"); /// <summary> @@ -39,20 +49,13 @@ public abstract partial class SharedDisposalUnitComponent : Component /// <summary> /// State for this disposals unit. /// </summary> - [DataField] + [DataField, AutoNetworkedField] public DisposalsPressureState State; - // TODO: Just make this use vaulting. - /// <summary> - /// We'll track whatever just left disposals so we know what collision we need to ignore until they stop intersecting our BB. - /// </summary> - [ViewVariables, DataField] - public List<EntityUid> RecentlyEjected = new(); - /// <summary> /// Next time the disposal unit will be pressurized. /// </summary> - [DataField(customTypeSerializer:typeof(TimeOffsetSerializer))] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] public TimeSpan NextPressurized = TimeSpan.Zero; /// <summary> @@ -70,26 +73,24 @@ public abstract partial class SharedDisposalUnitComponent : Component /// <summary> /// Removes the pressure requirement for flushing. /// </summary> - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public bool DisablePressure; /// <summary> /// Last time that an entity tried to exit this disposal unit. /// </summary> - [ViewVariables] + [DataField, AutoNetworkedField] public TimeSpan LastExitAttempt; [DataField] public bool AutomaticEngage = true; - [ViewVariables(VVAccess.ReadWrite)] - [DataField] + [DataField, AutoNetworkedField] public TimeSpan AutomaticEngageTime = TimeSpan.FromSeconds(30); /// <summary> /// Delay from trying to enter disposals ourselves. /// </summary> - [ViewVariables(VVAccess.ReadWrite)] [DataField] public float EntryDelay = 0.5f; @@ -104,20 +105,16 @@ public abstract partial class SharedDisposalUnitComponent : Component /// </summary> [ViewVariables] public Container Container = default!; - // TODO: Network power shit instead fam. - [ViewVariables, DataField] - public bool Powered; - /// <summary> /// Was the disposals unit engaged for a manual flush. /// </summary> - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public bool Engaged; /// <summary> /// Next time this unit will flush. Is the lesser of <see cref="FlushDelay"/> and <see cref="AutomaticEngageTime"/> /// </summary> - [ViewVariables, DataField(customTypeSerializer:typeof(TimeOffsetSerializer))] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] public TimeSpan? NextFlush; [Serializable, NetSerializable] @@ -162,37 +159,6 @@ public abstract partial class SharedDisposalUnitComponent : Component Power } - [Serializable, NetSerializable] - public sealed class DisposalUnitBoundUserInterfaceState : BoundUserInterfaceState, IEquatable<DisposalUnitBoundUserInterfaceState> - { - public readonly string UnitName; - public readonly string UnitState; - public readonly TimeSpan FullPressureTime; - public readonly bool Powered; - public readonly bool Engaged; - - public DisposalUnitBoundUserInterfaceState(string unitName, string unitState, TimeSpan fullPressureTime, bool powered, - bool engaged) - { - UnitName = unitName; - UnitState = unitState; - FullPressureTime = fullPressureTime; - Powered = powered; - Engaged = engaged; - } - - public bool Equals(DisposalUnitBoundUserInterfaceState? other) - { - if (ReferenceEquals(null, other)) return false; - if (ReferenceEquals(this, other)) return true; - return UnitName == other.UnitName && - UnitState == other.UnitState && - Powered == other.Powered && - Engaged == other.Engaged && - FullPressureTime.Equals(other.FullPressureTime); - } - } - /// <summary> /// Message data sent from client to server when a disposal unit ui button is pressed. /// </summary> diff --git a/Content.Shared/Disposal/Unit/SharedDisposalTubeSystem.cs b/Content.Shared/Disposal/Unit/SharedDisposalTubeSystem.cs new file mode 100644 index 0000000000..58d4da7eba --- /dev/null +++ b/Content.Shared/Disposal/Unit/SharedDisposalTubeSystem.cs @@ -0,0 +1,14 @@ +using Content.Shared.Disposal.Components; + +namespace Content.Shared.Disposal.Unit; + +public abstract class SharedDisposalTubeSystem : EntitySystem +{ + public virtual bool TryInsert(EntityUid uid, + DisposalUnitComponent from, + IEnumerable<string>? tags = default, + Tube.DisposalEntryComponent? entry = null) + { + return false; + } +} diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Shared/Disposal/Unit/SharedDisposalUnitSystem.cs similarity index 53% rename from Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs rename to Content.Shared/Disposal/Unit/SharedDisposalUnitSystem.cs index 136ac2c440..1db24c700d 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Shared/Disposal/Unit/SharedDisposalUnitSystem.cs @@ -1,24 +1,15 @@ -using System.Diagnostics.CodeAnalysis; using System.Linq; -using Content.Server.Administration.Logs; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Containers; -using Content.Server.Disposal.Tube; -using Content.Server.Disposal.Tube.Components; -using Content.Server.Disposal.Unit.Components; -using Content.Server.Popups; -using Content.Server.Power.Components; -using Content.Server.Power.EntitySystems; using Content.Shared.ActionBlocker; -using Content.Shared.Atmos; +using Content.Shared.Administration.Logs; +using Content.Shared.Body.Components; +using Content.Shared.Climbing.Systems; +using Content.Shared.Containers; using Content.Shared.Database; -using Content.Shared.Destructible; -using Content.Shared.Disposal; using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Unit.Events; using Content.Shared.DoAfter; using Content.Shared.DragDrop; using Content.Shared.Emag.Systems; -using Content.Shared.Explosion; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.IdentityManagement; @@ -27,59 +18,59 @@ using Content.Shared.Item; using Content.Shared.Movement.Events; using Content.Shared.Popups; using Content.Shared.Power; +using Content.Shared.Power.EntitySystems; +using Content.Shared.Throwing; using Content.Shared.Verbs; -using Robust.Server.Audio; -using Robust.Server.GameObjects; +using Content.Shared.Whitelist; +using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; -using Robust.Shared.GameStates; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; -using Robust.Shared.Player; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Serialization; +using Robust.Shared.Timing; using Robust.Shared.Utility; -namespace Content.Server.Disposal.Unit.EntitySystems; +namespace Content.Shared.Disposal.Unit; -public sealed class DisposalUnitSystem : SharedDisposalUnitSystem +[Serializable, NetSerializable] +public sealed partial class DisposalDoAfterEvent : SimpleDoAfterEvent { - [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly AppearanceSystem _appearance = default!; - [Dependency] private readonly AtmosphereSystem _atmosSystem = default!; - [Dependency] private readonly AudioSystem _audioSystem = default!; - [Dependency] private readonly DisposalTubeSystem _disposalTubeSystem = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly PowerReceiverSystem _power = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; - [Dependency] private readonly UserInterfaceSystem _ui = default!; - [Dependency] private readonly SharedMapSystem _map = default!; +} + +public abstract class SharedDisposalUnitSystem : EntitySystem +{ + [Dependency] protected readonly ActionBlockerSystem ActionBlockerSystem = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] protected readonly MetaDataSystem Metadata = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] protected readonly SharedAudioSystem Audio = default!; + [Dependency] protected readonly IGameTiming GameTiming = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLog = default!; + [Dependency] private readonly ClimbSystem _climb = default!; + [Dependency] protected readonly SharedContainerSystem Containers = default!; + [Dependency] protected readonly SharedJointSystem Joints = default!; + [Dependency] private readonly SharedPowerReceiverSystem _power = default!; + [Dependency] private readonly SharedDisposalTubeSystem _disposalTubeSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + + protected static TimeSpan ExitAttemptDelay = TimeSpan.FromSeconds(0.5); + + // Percentage + public const float PressurePerSecond = 0.05f; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent<DisposalUnitComponent, ComponentGetState>(OnGetState); SubscribeLocalEvent<DisposalUnitComponent, PreventCollideEvent>(OnPreventCollide); SubscribeLocalEvent<DisposalUnitComponent, CanDropTargetEvent>(OnCanDragDropOn); - SubscribeLocalEvent<DisposalUnitComponent, GotEmaggedEvent>(OnEmagged); - - // Shouldn't need re-anchoring. - SubscribeLocalEvent<DisposalUnitComponent, AnchorStateChangedEvent>(OnAnchorChanged); - // TODO: Predict me when hands predicted - SubscribeLocalEvent<DisposalUnitComponent, ContainerRelayMovementEntityEvent>(OnMovement); - SubscribeLocalEvent<DisposalUnitComponent, PowerChangedEvent>(OnPowerChange); - SubscribeLocalEvent<DisposalUnitComponent, ComponentInit>(OnDisposalInit); - - SubscribeLocalEvent<DisposalUnitComponent, ActivateInWorldEvent>(OnActivate); - SubscribeLocalEvent<DisposalUnitComponent, AfterInteractUsingEvent>(OnAfterInteractUsing); - SubscribeLocalEvent<DisposalUnitComponent, DragDropTargetEvent>(OnDragDropOn); - SubscribeLocalEvent<DisposalUnitComponent, DestructionEventArgs>(OnDestruction); - SubscribeLocalEvent<DisposalUnitComponent, BeforeExplodeEvent>(OnExploded); - SubscribeLocalEvent<DisposalUnitComponent, GetVerbsEvent<InteractionVerb>>(AddInsertVerb); SubscribeLocalEvent<DisposalUnitComponent, GetVerbsEvent<AlternativeVerb>>(AddDisposalAltVerbs); SubscribeLocalEvent<DisposalUnitComponent, GetVerbsEvent<Verb>>(AddClimbInsideVerb); @@ -88,27 +79,27 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem SubscribeLocalEvent<DisposalUnitComponent, BeforeThrowInsertEvent>(OnThrowInsert); - SubscribeLocalEvent<DisposalUnitComponent, SharedDisposalUnitComponent.UiButtonPressedMessage>(OnUiButtonPressed); + SubscribeLocalEvent<DisposalUnitComponent, DisposalUnitComponent.UiButtonPressedMessage>(OnUiButtonPressed); + + SubscribeLocalEvent<DisposalUnitComponent, GotEmaggedEvent>(OnEmagged); + SubscribeLocalEvent<DisposalUnitComponent, AnchorStateChangedEvent>(OnAnchorChanged); + SubscribeLocalEvent<DisposalUnitComponent, PowerChangedEvent>(OnPowerChange); + SubscribeLocalEvent<DisposalUnitComponent, ComponentInit>(OnDisposalInit); + + SubscribeLocalEvent<DisposalUnitComponent, ActivateInWorldEvent>(OnActivate); + SubscribeLocalEvent<DisposalUnitComponent, AfterInteractUsingEvent>(OnAfterInteractUsing); + SubscribeLocalEvent<DisposalUnitComponent, DragDropTargetEvent>(OnDragDropOn); + SubscribeLocalEvent<DisposalUnitComponent, ContainerRelayMovementEntityEvent>(OnMovement); } - private void OnGetState(EntityUid uid, DisposalUnitComponent component, ref ComponentGetState args) - { - args.State = new DisposalUnitComponentState( - component.FlushSound, - component.State, - component.NextPressurized, - component.AutomaticEngageTime, - component.NextFlush, - component.Powered, - component.Engaged, - GetNetEntityList(component.RecentlyEjected)); - } - - private void AddDisposalAltVerbs(EntityUid uid, SharedDisposalUnitComponent component, GetVerbsEvent<AlternativeVerb> args) + private void AddDisposalAltVerbs(Entity<DisposalUnitComponent> ent, ref GetVerbsEvent<AlternativeVerb> args) { if (!args.CanAccess || !args.CanInteract) return; + var uid = ent.Owner; + var component = ent.Comp; + // Behavior for if the disposals bin has items in it if (component.Container.ContainedEntities.Count > 0) { @@ -133,41 +124,12 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem } } - private void AddClimbInsideVerb(EntityUid uid, SharedDisposalUnitComponent component, GetVerbsEvent<Verb> args) - { - // This is not an interaction, activation, or alternative verb type because unfortunately most users are - // unwilling to accept that this is where they belong and don't want to accidentally climb inside. - if (!args.CanAccess || - !args.CanInteract || - component.Container.ContainedEntities.Contains(args.User) || - !_actionBlockerSystem.CanMove(args.User)) - { - return; - } - - if (!CanInsert(uid, component, args.User)) - return; - - // Add verb to climb inside of the unit, - Verb verb = new() - { - Act = () => TryInsert(uid, args.User, args.User), - DoContactInteraction = true, - Text = Loc.GetString("disposal-self-insert-verb-get-data-text") - }; - // TODO VERB ICON - // TODO VERB CATEGORY - // create a verb category for "enter"? - // See also, medical scanner. Also maybe add verbs for entering lockers/body bags? - args.Verbs.Add(verb); - } - - private void AddInsertVerb(EntityUid uid, SharedDisposalUnitComponent component, GetVerbsEvent<InteractionVerb> args) + private void AddInsertVerb(EntityUid uid, DisposalUnitComponent component, GetVerbsEvent<InteractionVerb> args) { if (!args.CanAccess || !args.CanInteract || args.Hands == null || args.Using == null) return; - if (!_actionBlockerSystem.CanDrop(args.User)) + if (!ActionBlockerSystem.CanDrop(args.User)) return; if (!CanInsert(uid, component, args.Using.Value)) @@ -180,7 +142,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem Act = () => { _handsSystem.TryDropIntoContainer(args.User, args.Using.Value, component.Container, checkActionBlocker: false, args.Hands); - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} inserted {ToPrettyString(args.Using.Value)} into {ToPrettyString(uid)}"); + _adminLog.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} inserted {ToPrettyString(args.Using.Value)} into {ToPrettyString(uid)}"); AfterInsert(uid, component, args.Using.Value, args.User); } }; @@ -188,7 +150,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem args.Verbs.Add(insertVerb); } - private void OnDoAfter(EntityUid uid, SharedDisposalUnitComponent component, DoAfterEvent args) + private void OnDoAfter(EntityUid uid, DisposalUnitComponent component, DoAfterEvent args) { if (args.Handled || args.Cancelled || args.Args.Target == null || args.Args.Used == null) return; @@ -204,89 +166,46 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem args.Cancelled = true; } - public override void DoInsertDisposalUnit(EntityUid uid, EntityUid toInsert, EntityUid user, SharedDisposalUnitComponent? disposal = null) - { - if (!ResolveDisposals(uid, ref disposal)) - return; - - if (!_containerSystem.Insert(toInsert, disposal.Container)) - return; - - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(user):player} inserted {ToPrettyString(toInsert)} into {ToPrettyString(uid)}"); - AfterInsert(uid, disposal, toInsert, user); - } - public override void Update(float frameTime) { base.Update(frameTime); - var query = AllEntityQuery<DisposalUnitComponent, MetaDataComponent>(); + var query = EntityQueryEnumerator<DisposalUnitComponent, MetaDataComponent>(); while (query.MoveNext(out var uid, out var unit, out var metadata)) { - if (!metadata.EntityPaused) - Update(uid, unit, metadata, frameTime); + Update(uid, unit, metadata); } } - #region UI Handlers - private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent component, SharedDisposalUnitComponent.UiButtonPressedMessage args) + // TODO: This should just use the same thing as entity storage? + private void OnMovement(EntityUid uid, DisposalUnitComponent component, ref ContainerRelayMovementEntityEvent args) { - if (args.Actor is not { Valid: true } player) - { + var currentTime = GameTiming.CurTime; + + if (!ActionBlockerSystem.CanMove(args.Entity)) return; - } - switch (args.Button) - { - case SharedDisposalUnitComponent.UiButton.Eject: - TryEjectContents(uid, component); - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit eject button on {ToPrettyString(uid)}"); - break; - case SharedDisposalUnitComponent.UiButton.Engage: - ToggleEngage(uid, component); - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); - break; - case SharedDisposalUnitComponent.UiButton.Power: - _power.TogglePower(uid, user: args.Actor); - break; - default: - throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); - } + if (!TryComp(args.Entity, out HandsComponent? hands) || + hands.Count == 0 || + currentTime < component.LastExitAttempt + ExitAttemptDelay) + return; + + Dirty(uid, component); + component.LastExitAttempt = currentTime; + Remove(uid, component, args.Entity); + UpdateUI((uid, component)); } - public void ToggleEngage(EntityUid uid, SharedDisposalUnitComponent component) - { - component.Engaged ^= true; - - if (component.Engaged) - { - ManualEngage(uid, component); - } - else - { - Disengage(uid, component); - } - } - - #endregion - - #region Eventbus Handlers - - private void OnActivate(EntityUid uid, SharedDisposalUnitComponent component, ActivateInWorldEvent args) + private void OnActivate(EntityUid uid, DisposalUnitComponent component, ActivateInWorldEvent args) { if (args.Handled || !args.Complex) return; - if (!TryComp(args.User, out ActorComponent? actor)) - { - return; - } - args.Handled = true; - _ui.OpenUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); + _ui.TryToggleUi(uid, DisposalUnitComponent.DisposalUnitUiKey.Key, args.User); } - private void OnAfterInteractUsing(EntityUid uid, SharedDisposalUnitComponent component, AfterInteractUsingEvent args) + private void OnAfterInteractUsing(EntityUid uid, DisposalUnitComponent component, AfterInteractUsingEvent args) { if (args.Handled || !args.CanReach) return; @@ -301,26 +220,23 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem return; } - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} inserted {ToPrettyString(args.Used)} into {ToPrettyString(uid)}"); + _adminLog.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} inserted {ToPrettyString(args.Used)} into {ToPrettyString(uid)}"); AfterInsert(uid, component, args.Used, args.User); args.Handled = true; } - private void OnDisposalInit(EntityUid uid, SharedDisposalUnitComponent component, ComponentInit args) + protected virtual void OnDisposalInit(Entity<DisposalUnitComponent> ent, ref ComponentInit args) { - component.Container = _containerSystem.EnsureContainer<Container>(uid, SharedDisposalUnitComponent.ContainerId); - - UpdateInterface(uid, component, component.Powered); + ent.Comp.Container = Containers.EnsureContainer<Container>(ent, DisposalUnitComponent.ContainerId); } - private void OnPowerChange(EntityUid uid, SharedDisposalUnitComponent component, ref PowerChangedEvent args) + private void OnPowerChange(EntityUid uid, DisposalUnitComponent component, ref PowerChangedEvent args) { - if (!component.Running || args.Powered == component.Powered) + if (!component.Running) return; - component.Powered = args.Powered; + UpdateUI((uid, component)); UpdateVisualState(uid, component); - UpdateInterface(uid, component, args.Powered); if (!args.Powered) { @@ -336,24 +252,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem } } - // TODO: This should just use the same thing as entity storage? - private void OnMovement(EntityUid uid, SharedDisposalUnitComponent component, ref ContainerRelayMovementEntityEvent args) - { - var currentTime = GameTiming.CurTime; - - if (!_actionBlockerSystem.CanMove(args.Entity)) - return; - - if (!TryComp(args.Entity, out HandsComponent? hands) || - hands.Count == 0 || - currentTime < component.LastExitAttempt + ExitAttemptDelay) - return; - - component.LastExitAttempt = currentTime; - Remove(uid, component, args.Entity); - } - - private void OnAnchorChanged(EntityUid uid, SharedDisposalUnitComponent component, ref AnchorStateChangedEvent args) + private void OnAnchorChanged(EntityUid uid, DisposalUnitComponent component, ref AnchorStateChangedEvent args) { if (Terminating(uid)) return; @@ -363,108 +262,238 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem TryEjectContents(uid, component); } - private void OnDestruction(EntityUid uid, SharedDisposalUnitComponent component, DestructionEventArgs args) - { - TryEjectContents(uid, component); - } - - private void OnDragDropOn(EntityUid uid, SharedDisposalUnitComponent component, ref DragDropTargetEvent args) + private void OnDragDropOn(EntityUid uid, DisposalUnitComponent component, ref DragDropTargetEvent args) { args.Handled = TryInsert(uid, args.Dragged, args.User); } - #endregion - - private void UpdateState(EntityUid uid, DisposalsPressureState state, SharedDisposalUnitComponent component, MetaDataComponent metadata) + protected virtual void UpdateUI(Entity<DisposalUnitComponent> entity) { - if (component.State == state) - return; - component.State = state; - UpdateVisualState(uid, component); - UpdateInterface(uid, component, component.Powered); - Dirty(uid, component, metadata); - - if (state == DisposalsPressureState.Ready) - { - component.NextPressurized = TimeSpan.Zero; - - // Manually engaged - if (component.Engaged) - { - component.NextFlush = GameTiming.CurTime + component.ManualFlushTime; - } - else if (component.Container.ContainedEntities.Count > 0) - { - component.NextFlush = GameTiming.CurTime + component.AutomaticEngageTime; - } - else - { - component.NextFlush = null; - } - } } /// <summary> - /// Work out if we can stop updating this disposals component i.e. full pressure and nothing colliding. + /// Returns the estimated time when the disposal unit will be back to full pressure. /// </summary> - private void Update(EntityUid uid, SharedDisposalUnitComponent component, MetaDataComponent metadata, float frameTime) + public TimeSpan EstimatedFullPressure(EntityUid uid, DisposalUnitComponent component) { - var state = GetState(uid, component, metadata); + if (component.NextPressurized < GameTiming.CurTime) + return TimeSpan.Zero; - // Pressurizing, just check if we need a state update. - if (component.NextPressurized > GameTiming.CurTime) + return component.NextPressurized; + } + + public bool CanFlush(EntityUid unit, DisposalUnitComponent component) + { + return GetState(unit, component) == DisposalsPressureState.Ready + && _power.IsPowered(unit) + && Comp<TransformComponent>(unit).Anchored; + } + + public void Remove(EntityUid uid, DisposalUnitComponent component, EntityUid toRemove) + { + if (GameTiming.ApplyingState) + return; + + if (!Containers.Remove(toRemove, component.Container)) + return; + + if (component.Container.ContainedEntities.Count == 0) + { + // If not manually engaged then reset the flushing entirely. + if (!component.Engaged) + { + component.NextFlush = null; + Dirty(uid, component); + UpdateUI((uid, component)); + } + } + + _climb.Climb(toRemove, toRemove, uid, silent: true); + + UpdateVisualState(uid, component); + } + + public void UpdateVisualState(EntityUid uid, DisposalUnitComponent component, bool flush = false) + { + if (!TryComp(uid, out AppearanceComponent? appearance)) { - UpdateState(uid, state, component, metadata); return; } - if (component.NextFlush != null) + if (!Transform(uid).Anchored) { - if (component.NextFlush.Value < GameTiming.CurTime) - { - TryFlush(uid, component); - } + _appearance.SetData(uid, DisposalUnitComponent.Visuals.VisualState, DisposalUnitComponent.VisualState.UnAnchored, appearance); + _appearance.SetData(uid, DisposalUnitComponent.Visuals.Handle, DisposalUnitComponent.HandleState.Normal, appearance); + _appearance.SetData(uid, DisposalUnitComponent.Visuals.Light, DisposalUnitComponent.LightStates.Off, appearance); + return; } - UpdateState(uid, state, component, metadata); + var state = GetState(uid, component); - Box2? disposalsBounds = null; - var count = component.RecentlyEjected.Count; - - if (count > 0) + switch (state) { - if (!HasComp<PhysicsComponent>(uid)) - { - component.RecentlyEjected.Clear(); - } - else - { - disposalsBounds = _lookup.GetWorldAABB(uid); - } + case DisposalsPressureState.Flushed: + _appearance.SetData(uid, DisposalUnitComponent.Visuals.VisualState, DisposalUnitComponent.VisualState.OverlayFlushing, appearance); + break; + case DisposalsPressureState.Pressurizing: + _appearance.SetData(uid, DisposalUnitComponent.Visuals.VisualState, DisposalUnitComponent.VisualState.OverlayCharging, appearance); + break; + case DisposalsPressureState.Ready: + _appearance.SetData(uid, DisposalUnitComponent.Visuals.VisualState, DisposalUnitComponent.VisualState.Anchored, appearance); + break; } - for (var i = 0; i < component.RecentlyEjected.Count; i++) - { - var ejectedId = component.RecentlyEjected[i]; - if (HasComp<PhysicsComponent>(ejectedId)) - { - // TODO: We need to use a specific collision method (which sloth hasn't coded yet) for actual bounds overlaps. - // TODO: Come do this sloth :^) - // Check for itemcomp as we won't just block the disposal unit "sleeping" for something it can't collide with anyway. - if (!HasComp<ItemComponent>(ejectedId) - && _lookup.GetWorldAABB(ejectedId).Intersects(disposalsBounds!.Value)) - { - continue; - } + _appearance.SetData(uid, DisposalUnitComponent.Visuals.Handle, component.Engaged + ? DisposalUnitComponent.HandleState.Engaged + : DisposalUnitComponent.HandleState.Normal, appearance); - component.RecentlyEjected.RemoveAt(i); - i--; - } + if (!_power.IsPowered(uid)) + { + _appearance.SetData(uid, DisposalUnitComponent.Visuals.Light, DisposalUnitComponent.LightStates.Off, appearance); + return; } - if (count != component.RecentlyEjected.Count) - Dirty(uid, component, metadata); + var lightState = DisposalUnitComponent.LightStates.Off; + + if (component.Container.ContainedEntities.Count > 0) + { + lightState |= DisposalUnitComponent.LightStates.Full; + } + + if (state is DisposalsPressureState.Pressurizing or DisposalsPressureState.Flushed) + { + lightState |= DisposalUnitComponent.LightStates.Charging; + } + else + { + lightState |= DisposalUnitComponent.LightStates.Ready; + } + + _appearance.SetData(uid, DisposalUnitComponent.Visuals.Light, lightState, appearance); + } + + /// <summary> + /// Gets the current pressure state of a disposals unit. + /// </summary> + /// <param name="uid"></param> + /// <param name="component"></param> + /// <param name="metadata"></param> + /// <returns></returns> + public DisposalsPressureState GetState(EntityUid uid, DisposalUnitComponent component, MetaDataComponent? metadata = null) + { + var nextPressure = Metadata.GetPauseTime(uid, metadata) + component.NextPressurized - GameTiming.CurTime; + var pressurizeTime = 1f / PressurePerSecond; + var pressurizeDuration = pressurizeTime - component.FlushDelay.TotalSeconds; + + if (nextPressure.TotalSeconds > pressurizeDuration) + { + return DisposalsPressureState.Flushed; + } + + if (nextPressure > TimeSpan.Zero) + { + return DisposalsPressureState.Pressurizing; + } + + return DisposalsPressureState.Ready; + } + + public float GetPressure(EntityUid uid, DisposalUnitComponent component, MetaDataComponent? metadata = null) + { + if (!Resolve(uid, ref metadata)) + return 0f; + + var pauseTime = Metadata.GetPauseTime(uid, metadata); + return MathF.Min(1f, + (float)(GameTiming.CurTime - pauseTime - component.NextPressurized).TotalSeconds / PressurePerSecond); + } + + protected void OnPreventCollide(EntityUid uid, DisposalUnitComponent component, + ref PreventCollideEvent args) + { + var otherBody = args.OtherEntity; + + // Items dropped shouldn't collide but items thrown should + if (HasComp<ItemComponent>(otherBody) && !HasComp<ThrownItemComponent>(otherBody)) + { + args.Cancelled = true; + } + } + + protected void OnCanDragDropOn(EntityUid uid, DisposalUnitComponent component, ref CanDropTargetEvent args) + { + if (args.Handled) + return; + + args.CanDrop = CanInsert(uid, component, args.Dragged); + args.Handled = true; + } + + protected void OnEmagged(EntityUid uid, DisposalUnitComponent component, ref GotEmaggedEvent args) + { + component.DisablePressure = true; + args.Handled = true; + } + + public virtual bool CanInsert(EntityUid uid, DisposalUnitComponent component, EntityUid entity) + { + // TODO: All of the below should be using the EXISTING EVENT + if (!Containers.CanInsert(entity, component.Container)) + return false; + + if (!Transform(uid).Anchored) + return false; + + var storable = HasComp<ItemComponent>(entity); + if (!storable && !HasComp<BodyComponent>(entity)) + return false; + + if (_whitelistSystem.IsBlacklistPass(component.Blacklist, entity) || + _whitelistSystem.IsWhitelistFail(component.Whitelist, entity)) + return false; + + if (TryComp<PhysicsComponent>(entity, out var physics) && (physics.CanCollide) || storable) + return true; + else + return false; + } + + public void DoInsertDisposalUnit(EntityUid uid, + EntityUid toInsert, + EntityUid user, + DisposalUnitComponent? disposal = null) + { + if (!Resolve(uid, ref disposal)) + return; + + if (!Containers.Insert(toInsert, disposal.Container)) + return; + + _adminLog.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(user):player} inserted {ToPrettyString(toInsert)} into {ToPrettyString(uid)}"); + AfterInsert(uid, disposal, toInsert, user); + } + + public virtual void AfterInsert(EntityUid uid, + DisposalUnitComponent component, + EntityUid inserted, + EntityUid? user = null, + bool doInsert = false) + { + Audio.PlayPredicted(component.InsertSound, uid, user: user); + if (doInsert && !Containers.Insert(inserted, component.Container)) + return; + + if (user != inserted && user != null) + _adminLog.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(user.Value):player} inserted {ToPrettyString(inserted)} into {ToPrettyString(uid)}"); + + QueueAutomaticEngage(uid, component); + + _ui.CloseUi(uid, DisposalUnitComponent.DisposalUnitUiKey.Key, inserted); + + // Maybe do pullable instead? Eh still fine. + Joints.RecursiveClearJoints(inserted); + UpdateVisualState(uid, component); } public bool TryInsert(EntityUid unitId, EntityUid toInsertId, EntityUid? userId, DisposalUnitComponent? unit = null) @@ -507,8 +536,61 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem return true; } + private void UpdateState(EntityUid uid, DisposalsPressureState state, DisposalUnitComponent component, MetaDataComponent metadata) + { + if (component.State == state) + return; - public bool TryFlush(EntityUid uid, SharedDisposalUnitComponent component) + component.State = state; + UpdateVisualState(uid, component); + Dirty(uid, component, metadata); + + if (state == DisposalsPressureState.Ready) + { + component.NextPressurized = TimeSpan.Zero; + + // Manually engaged + if (component.Engaged) + { + component.NextFlush = GameTiming.CurTime + component.ManualFlushTime; + } + else if (component.Container.ContainedEntities.Count > 0) + { + component.NextFlush = GameTiming.CurTime + component.AutomaticEngageTime; + } + else + { + component.NextFlush = null; + } + } + } + + /// <summary> + /// Work out if we can stop updating this disposals component i.e. full pressure and nothing colliding. + /// </summary> + private void Update(EntityUid uid, DisposalUnitComponent component, MetaDataComponent metadata) + { + var state = GetState(uid, component, metadata); + + // Pressurizing, just check if we need a state update. + if (component.NextPressurized > GameTiming.CurTime) + { + UpdateState(uid, state, component, metadata); + return; + } + + if (component.NextFlush != null) + { + if (component.NextFlush.Value < GameTiming.CurTime) + { + TryFlush(uid, component); + } + } + + UpdateState(uid, state, component, metadata); + } + + public bool TryFlush(EntityUid uid, DisposalUnitComponent component) { if (!CanFlush(uid, component)) { @@ -533,11 +615,12 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem var coords = xform.Coordinates; var entry = _map.GetLocal(xform.GridUid.Value, grid, coords) - .FirstOrDefault(HasComp<DisposalEntryComponent>); + .FirstOrDefault(HasComp<Tube.DisposalEntryComponent>); if (entry == default || component is not DisposalUnitComponent sDisposals) { component.Engaged = false; + UpdateUI((uid, component)); Dirty(uid, component); return false; } @@ -555,140 +638,23 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem component.NextFlush = null; UpdateVisualState(uid, component, true); - UpdateInterface(uid, component, component.Powered); - Dirty(uid, component); + UpdateUI((uid, component)); return true; } - private void HandleAir(EntityUid uid, DisposalUnitComponent component, TransformComponent xform) + protected virtual void HandleAir(EntityUid uid, DisposalUnitComponent component, TransformComponent xform) { - var air = component.Air; - var indices = _transformSystem.GetGridTilePositionOrDefault((uid, xform)); - if (_atmosSystem.GetTileMixture(xform.GridUid, xform.MapUid, indices, true) is { Temperature: > 0f } environment) - { - var transferMoles = 0.1f * (0.25f * Atmospherics.OneAtmosphere * 1.01f - air.Pressure) * air.Volume / (environment.Temperature * Atmospherics.R); - - component.Air = environment.Remove(transferMoles); - } } - public void UpdateInterface(EntityUid uid, SharedDisposalUnitComponent component, bool powered) - { - var compState = GetState(uid, component); - var stateString = Loc.GetString($"disposal-unit-state-{compState}"); - var state = new SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState(Name(uid), stateString, EstimatedFullPressure(uid, component), powered, component.Engaged); - _ui.SetUiState(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state); - - var stateUpdatedEvent = new DisposalUnitUIStateUpdatedEvent(state); - RaiseLocalEvent(uid, stateUpdatedEvent); - } - - /// <summary> - /// Returns the estimated time when the disposal unit will be back to full pressure. - /// </summary> - private TimeSpan EstimatedFullPressure(EntityUid uid, SharedDisposalUnitComponent component) - { - if (component.NextPressurized < GameTiming.CurTime) - return TimeSpan.Zero; - - return component.NextPressurized; - } - - public void UpdateVisualState(EntityUid uid, SharedDisposalUnitComponent component, bool flush = false) - { - if (!TryComp(uid, out AppearanceComponent? appearance)) - { - return; - } - - if (!Transform(uid).Anchored) - { - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.UnAnchored, appearance); - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.Handle, SharedDisposalUnitComponent.HandleState.Normal, appearance); - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightStates.Off, appearance); - return; - } - - var state = GetState(uid, component); - - switch (state) - { - case DisposalsPressureState.Flushed: - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.OverlayFlushing, appearance); - break; - case DisposalsPressureState.Pressurizing: - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.OverlayCharging, appearance); - break; - case DisposalsPressureState.Ready: - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.VisualState, SharedDisposalUnitComponent.VisualState.Anchored, appearance); - break; - } - - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.Handle, component.Engaged - ? SharedDisposalUnitComponent.HandleState.Engaged - : SharedDisposalUnitComponent.HandleState.Normal, appearance); - - if (!component.Powered) - { - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.Light, SharedDisposalUnitComponent.LightStates.Off, appearance); - return; - } - - var lightState = SharedDisposalUnitComponent.LightStates.Off; - - if (component.Container.ContainedEntities.Count > 0) - { - lightState |= SharedDisposalUnitComponent.LightStates.Full; - } - - if (state is DisposalsPressureState.Pressurizing or DisposalsPressureState.Flushed) - { - lightState |= SharedDisposalUnitComponent.LightStates.Charging; - } - else - { - lightState |= SharedDisposalUnitComponent.LightStates.Ready; - } - - _appearance.SetData(uid, SharedDisposalUnitComponent.Visuals.Light, lightState, appearance); - } - - public void Remove(EntityUid uid, SharedDisposalUnitComponent component, EntityUid toRemove) - { - _containerSystem.Remove(toRemove, component.Container); - - if (component.Container.ContainedEntities.Count == 0) - { - // If not manually engaged then reset the flushing entirely. - if (!component.Engaged) - { - component.NextFlush = null; - } - } - - if (!component.RecentlyEjected.Contains(toRemove)) - component.RecentlyEjected.Add(toRemove); - - UpdateVisualState(uid, component); - Dirty(uid, component); - } - - public bool CanFlush(EntityUid unit, SharedDisposalUnitComponent component) - { - return GetState(unit, component) == DisposalsPressureState.Ready - && component.Powered - && Comp<TransformComponent>(unit).Anchored; - } - - public void ManualEngage(EntityUid uid, SharedDisposalUnitComponent component, MetaDataComponent? metadata = null) + public void ManualEngage(EntityUid uid, DisposalUnitComponent component, MetaDataComponent? metadata = null) { component.Engaged = true; UpdateVisualState(uid, component); - UpdateInterface(uid, component, component.Powered); Dirty(uid, component); + UpdateUI((uid, component)); if (!CanFlush(uid, component)) return; @@ -701,7 +667,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem component.NextFlush = TimeSpan.FromSeconds(Math.Min((component.NextFlush ?? TimeSpan.MaxValue).TotalSeconds, nextEngage.TotalSeconds)); } - public void Disengage(EntityUid uid, SharedDisposalUnitComponent component) + public void Disengage(EntityUid uid, DisposalUnitComponent component) { component.Engaged = false; @@ -711,14 +677,14 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem } UpdateVisualState(uid, component); - UpdateInterface(uid, component, component.Powered); Dirty(uid, component); + UpdateUI((uid, component)); } /// <summary> /// Remove all entities currently in the disposal unit. /// </summary> - public void TryEjectContents(EntityUid uid, SharedDisposalUnitComponent component) + public void TryEjectContents(EntityUid uid, DisposalUnitComponent component) { foreach (var entity in component.Container.ContainedEntities.ToArray()) { @@ -729,38 +695,16 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem { component.NextFlush = null; Dirty(uid, component); + UpdateUI((uid, component)); } } - public override bool HasDisposals(EntityUid? uid) - { - return HasComp<DisposalUnitComponent>(uid); - } - - public override bool ResolveDisposals(EntityUid uid, [NotNullWhen(true)] ref SharedDisposalUnitComponent? component) - { - if (component != null) - return true; - - TryComp<DisposalUnitComponent>(uid, out var storage); - component = storage; - return component != null; - } - - public override bool CanInsert(EntityUid uid, SharedDisposalUnitComponent component, EntityUid entity) - { - if (!base.CanInsert(uid, component, entity)) - return false; - - return _containerSystem.CanInsert(entity, component.Container); - } - /// <summary> /// If something is inserted (or the likes) then we'll queue up an automatic flush in the future. /// </summary> - public void QueueAutomaticEngage(EntityUid uid, SharedDisposalUnitComponent component, MetaDataComponent? metadata = null) + public void QueueAutomaticEngage(EntityUid uid, DisposalUnitComponent component, MetaDataComponent? metadata = null) { - if (component.Deleted || !component.AutomaticEngage || !component.Powered && component.Container.ContainedEntities.Count == 0) + if (component.Deleted || !component.AutomaticEngage || !_power.IsPowered(uid) && component.Container.ContainedEntities.Count == 0) { return; } @@ -771,53 +715,74 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem component.NextFlush = flushTime; Dirty(uid, component); + UpdateUI((uid, component)); } - public void AfterInsert(EntityUid uid, SharedDisposalUnitComponent component, EntityUid inserted, EntityUid? user = null, bool doInsert = false) + private void OnUiButtonPressed(EntityUid uid, DisposalUnitComponent component, DisposalUnitComponent.UiButtonPressedMessage args) { - _audioSystem.PlayPvs(component.InsertSound, uid); + if (args.Actor is not { Valid: true } player) + { + return; + } - if (doInsert && !_containerSystem.Insert(inserted, component.Container)) + switch (args.Button) + { + case DisposalUnitComponent.UiButton.Eject: + TryEjectContents(uid, component); + _adminLog.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit eject button on {ToPrettyString(uid)}"); + break; + case DisposalUnitComponent.UiButton.Engage: + ToggleEngage(uid, component); + _adminLog.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); + break; + case DisposalUnitComponent.UiButton.Power: + _power.TogglePower(uid, user: args.Actor); + break; + default: + throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); + } + } + + public void ToggleEngage(EntityUid uid, DisposalUnitComponent component) + { + component.Engaged ^= true; + + if (component.Engaged) + { + ManualEngage(uid, component); + } + else + { + Disengage(uid, component); + } + } + + private void AddClimbInsideVerb(EntityUid uid, DisposalUnitComponent component, GetVerbsEvent<Verb> args) + { + // This is not an interaction, activation, or alternative verb type because unfortunately most users are + // unwilling to accept that this is where they belong and don't want to accidentally climb inside. + if (!args.CanAccess || + !args.CanInteract || + component.Container.ContainedEntities.Contains(args.User) || + !ActionBlockerSystem.CanMove(args.User)) + { + return; + } + + if (!CanInsert(uid, component, args.User)) return; - if (user != inserted && user != null) - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(user.Value):player} inserted {ToPrettyString(inserted)} into {ToPrettyString(uid)}"); - - QueueAutomaticEngage(uid, component); - - _ui.CloseUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, inserted); - - // Maybe do pullable instead? Eh still fine. - Joints.RecursiveClearJoints(inserted); - UpdateVisualState(uid, component); - } - - private void OnExploded(Entity<DisposalUnitComponent> ent, ref BeforeExplodeEvent args) - { - args.Contents.AddRange(ent.Comp.Container.ContainedEntities); - } - -} - -/// <summary> -/// Sent before the disposal unit flushes it's contents. -/// Allows adding tags for sorting and preventing the disposal unit from flushing. -/// </summary> -public sealed class DisposalUnitUIStateUpdatedEvent : EntityEventArgs -{ - public SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState State; - - public DisposalUnitUIStateUpdatedEvent(SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState state) - { - State = state; + // Add verb to climb inside of the unit, + Verb verb = new() + { + Act = () => TryInsert(uid, args.User, args.User), + DoContactInteraction = true, + Text = Loc.GetString("disposal-self-insert-verb-get-data-text") + }; + // TODO VERB ICON + // TODO VERB CATEGORY + // create a verb category for "enter"? + // See also, medical scanner. Also maybe add verbs for entering lockers/body bags? + args.Verbs.Add(verb); } } - -/// <summary> -/// Sent before the disposal unit flushes it's contents. -/// Allows adding tags for sorting and preventing the disposal unit from flushing. -/// </summary> -public sealed class BeforeDisposalFlushEvent : CancellableEntityEventArgs -{ - public readonly List<string> Tags = new(); -} diff --git a/Content.Shared/Power/Components/SharedApcPowerReceiverComponent.cs b/Content.Shared/Power/Components/SharedApcPowerReceiverComponent.cs index 69c3bd790e..80bacd24bd 100644 --- a/Content.Shared/Power/Components/SharedApcPowerReceiverComponent.cs +++ b/Content.Shared/Power/Components/SharedApcPowerReceiverComponent.cs @@ -8,9 +8,15 @@ public abstract partial class SharedApcPowerReceiverComponent : Component [ViewVariables] public bool Powered; - [ViewVariables] - public virtual bool NeedsPower { get; set; } + /// <summary> + /// When false, causes this to appear powered even if not receiving power from an Apc. + /// </summary> + [ViewVariables(VVAccess.ReadWrite)] + public virtual bool NeedsPower { get; set;} - [ViewVariables] + /// <summary> + /// When true, causes this to never appear powered. + /// </summary> + [ViewVariables(VVAccess.ReadWrite)] public virtual bool PowerDisabled { get; set; } } diff --git a/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs b/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs index 2d152d8b45..d86273974b 100644 --- a/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs +++ b/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs @@ -62,8 +62,13 @@ public abstract class SharedPowerReceiverSystem : EntitySystem return !receiver.PowerDisabled; // i.e. PowerEnabled } - /// <summary> - /// Checks if entity is APC-powered device, and if it have power. + protected virtual void RaisePower(Entity<SharedApcPowerReceiverComponent> entity) + { + // NOOP on server because client has 0 idea of load so we can't raise it properly in shared. + } + + /// <summary> + /// Checks if entity is APC-powered device, and if it have power. /// </summary> public bool IsPowered(Entity<SharedApcPowerReceiverComponent?> entity) { diff --git a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs index 93c4b69e4d..d0ad27eee5 100644 --- a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs +++ b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs @@ -1,5 +1,7 @@ using System.Linq; using Content.Shared.Disposal; +using Content.Shared.Disposal.Components; +using Content.Shared.Disposal.Unit; using Content.Shared.DoAfter; using Content.Shared.Interaction; using Content.Shared.Item; @@ -40,7 +42,7 @@ public sealed class DumpableSystem : EntitySystem if (!args.CanReach || args.Handled) return; - if (!_disposalUnitSystem.HasDisposals(args.Target) && !HasComp<PlaceableSurfaceComponent>(args.Target)) + if (!HasComp<DisposalUnitComponent>(args.Target) && !HasComp<PlaceableSurfaceComponent>(args.Target)) return; if (!TryComp<StorageComponent>(uid, out var storage)) @@ -81,7 +83,7 @@ public sealed class DumpableSystem : EntitySystem if (!TryComp<StorageComponent>(uid, out var storage) || !storage.Container.ContainedEntities.Any()) return; - if (_disposalUnitSystem.HasDisposals(args.Target)) + if (HasComp<DisposalUnitComponent>(args.Target)) { UtilityVerb verb = new() { @@ -146,7 +148,7 @@ public sealed class DumpableSystem : EntitySystem var dumped = false; - if (_disposalUnitSystem.HasDisposals(args.Args.Target)) + if (HasComp<DisposalUnitComponent>(args.Args.Target)) { dumped = true; diff --git a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml index cb3ae3d065..2605af8019 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml @@ -32,8 +32,6 @@ components: - HumanoidAppearance - type: DisposalUnit - autoEngageEnabled: false - noUI: true blacklist: components: - HumanoidAppearance diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml index 9d04b32563..7388a814f7 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml @@ -8,6 +8,8 @@ snap: - Disposal components: + - type: Climbable + vaultable: false - type: Sprite sprite: Structures/Piping/disposal.rsi layers: @@ -29,6 +31,17 @@ map: [ "enum.DisposalUnitVisualLayers.OverlayEngaged" ] - type: Physics bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.45,-0.45,0.45,0.45" + density: 55 + mask: + - TableMask + layer: + - TableLayer - type: Destructible thresholds: - trigger: @@ -116,7 +129,6 @@ graph: DisposalMachine node: mailing_unit - type: DisposalUnit - autoEngageEnabled: false whitelist: components: - Item @@ -136,6 +148,6 @@ - type: UserInterface interfaces: enum.MailingUnitUiKey.Key: - type: DisposalUnitBoundUserInterface + type: MailingUnitBoundUserInterface enum.ConfigurationUiKey.Key: type: ConfigurationBoundUserInterface From 4682149e749adff82749e2402bccb6872ba281d3 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 16:51:12 +1000 Subject: [PATCH 355/622] Predict virtual hands and co (#36617) These are the easy ones anything else gets slightly spicier. --- .../Interaction/SharedInteractionSystem.cs | 13 ++++---- .../VirtualItem/SharedVirtualItemSystem.cs | 21 ++----------- .../EntitySystems/EncryptionKeySystem.cs | 8 +---- .../Systems/TechnologyDiskSystem.cs | 3 +- .../Wieldable/SharedWieldableSystem.cs | 30 ++++++++----------- 5 files changed, 23 insertions(+), 52 deletions(-) diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index eeb961537b..494fbdf032 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -51,7 +51,6 @@ namespace Content.Shared.Interaction public abstract partial class SharedInteractionSystem : EntitySystem { [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; @@ -223,24 +222,24 @@ namespace Content.Shared.Interaction { if (!item.DeleteOnDrop) RemCompDeferred<UnremoveableComponent>(uid); - else if (_net.IsServer) - QueueDel(uid); + else + PredictedQueueDel(uid); } private void OnUnequipHand(EntityUid uid, UnremoveableComponent item, GotUnequippedHandEvent args) { if (!item.DeleteOnDrop) RemCompDeferred<UnremoveableComponent>(uid); - else if (_net.IsServer) - QueueDel(uid); + else + PredictedQueueDel(uid); } private void OnDropped(EntityUid uid, UnremoveableComponent item, DroppedEvent args) { if (!item.DeleteOnDrop) RemCompDeferred<UnremoveableComponent>(uid); - else if (_net.IsServer) - QueueDel(uid); + else + PredictedQueueDel(uid); } private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) diff --git a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs index 9eac60adc4..393a4c09eb 100644 --- a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs +++ b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs @@ -157,11 +157,6 @@ public abstract class SharedVirtualItemSystem : EntitySystem /// </summary> public void DeleteInHandsMatching(EntityUid user, EntityUid matching) { - // Client can't currently predict deleting networked entities so we use this workaround, another - // problem can popup when the hands leave PVS for example and this avoids that too - if (_netManager.IsClient) - return; - foreach (var hand in _handsSystem.EnumerateHands(user)) { if (TryComp(hand.HeldEntity, out VirtualItemComponent? virt) && virt.BlockingEntity == matching) @@ -206,11 +201,6 @@ public abstract class SharedVirtualItemSystem : EntitySystem /// <param name="slotName">Set this param if you have the name of the slot, it avoids unnecessary queries</param> public void DeleteInSlotMatching(EntityUid user, EntityUid matching, string? slotName = null) { - // Client can't currently predict deleting networked entities so we use this workaround, another - // problem can popup when the hands leave PVS for example and this avoids that too - if (_netManager.IsClient) - return; - if (slotName != null) { if (!_inventorySystem.TryGetSlotEntity(user, slotName, out var slotEnt)) @@ -244,14 +234,8 @@ public abstract class SharedVirtualItemSystem : EntitySystem /// <param name="virtualItem">The virtual item, if spawned</param> public bool TrySpawnVirtualItem(EntityUid blockingEnt, EntityUid user, [NotNullWhen(true)] out EntityUid? virtualItem) { - if (_netManager.IsClient) - { - virtualItem = null; - return false; - } - var pos = Transform(user).Coordinates; - virtualItem = Spawn(VirtualItem, pos); + virtualItem = PredictedSpawnAttachedTo(VirtualItem, pos); var virtualItemComp = Comp<VirtualItemComponent>(virtualItem.Value); virtualItemComp.BlockingEntity = blockingEnt; Dirty(virtualItem.Value, virtualItemComp); @@ -273,7 +257,6 @@ public abstract class SharedVirtualItemSystem : EntitySystem return; _transformSystem.DetachEntity(item, Transform(item)); - if (_netManager.IsServer) - QueueDel(item); + PredictedQueueDel(item); } } diff --git a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs index 9ddcb423b4..e63c6ac7b7 100644 --- a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs +++ b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs @@ -58,13 +58,7 @@ public sealed partial class EncryptionKeySystem : EntitySystem _hands.PickupOrDrop(args.User, ent, dropNear: true); } - if (!_timing.IsFirstTimePredicted) - return; - - // TODO add predicted pop-up overrides. - if (_net.IsServer) - _popup.PopupEntity(Loc.GetString("encryption-keys-all-extracted"), uid, args.User); - + _popup.PopupPredicted(Loc.GetString("encryption-keys-all-extracted"), uid, args.User); _audio.PlayPredicted(component.KeyExtractionSound, uid, args.User); } diff --git a/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs b/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs index 93c7c22471..4ca4728681 100644 --- a/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs +++ b/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs @@ -74,8 +74,7 @@ public sealed class TechnologyDiskSystem : EntitySystem } } _popup.PopupClient(Loc.GetString("tech-disk-inserted"), target, args.User); - if (_net.IsServer) - QueueDel(ent); + PredictedQueueDel(ent); args.Handled = true; } diff --git a/Content.Shared/Wieldable/SharedWieldableSystem.cs b/Content.Shared/Wieldable/SharedWieldableSystem.cs index b4a6144405..d3b8c4e4c6 100644 --- a/Content.Shared/Wieldable/SharedWieldableSystem.cs +++ b/Content.Shared/Wieldable/SharedWieldableSystem.cs @@ -21,6 +21,7 @@ using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Wieldable.Components; using Robust.Shared.Audio.Systems; +using Robust.Shared.Collections; using Robust.Shared.Network; using Robust.Shared.Timing; @@ -260,26 +261,21 @@ public abstract class SharedWieldableSystem : EntitySystem _audio.PlayPredicted(component.WieldSound, used, user); //This section handles spawning the virtual item(s) to occupy the required additional hand(s). - //Since the client can't currently predict entity spawning, only do this if this is running serverside. - //Remove this check if TrySpawnVirtualItem in SharedVirtualItemSystem is allowed to complete clientside. - if (_netManager.IsServer) + var virtuals = new ValueList<EntityUid>(); + for (var i = 0; i < component.FreeHandsRequired; i++) { - var virtuals = new List<EntityUid>(); - for (var i = 0; i < component.FreeHandsRequired; i++) + if (_virtualItem.TrySpawnVirtualItemInHand(used, user, out var virtualItem, true)) { - if (_virtualItem.TrySpawnVirtualItemInHand(used, user, out var virtualItem, true)) - { - virtuals.Add(virtualItem.Value); - continue; - } - - foreach (var existingVirtual in virtuals) - { - QueueDel(existingVirtual); - } - - return false; + virtuals.Add(virtualItem.Value); + continue; } + + foreach (var existingVirtual in virtuals) + { + QueueDel(existingVirtual); + } + + return false; } var selfMessage = Loc.GetString("wieldable-component-successful-wield", ("item", used)); From 694190f2a4fe60c0c4dcd080550f202cdc2c0384 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 06:52:19 +0000 Subject: [PATCH 356/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8222a7943f..584aefc415 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: crazybrain - changes: - - message: Bluespace lockers and quantum spin inverters can no longer go on the - arrivals shuttle. - type: Tweak - id: 7754 - time: '2024-12-27T12:34:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34072 - author: Plykiya changes: - message: You now see a popup when being cuffed or uncuffed again. @@ -3915,3 +3907,10 @@ id: 8254 time: '2025-04-19T05:14:50.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32920 +- author: metalgearsloth + changes: + - message: Virtual items (e.g. wielding) are now predicted. + type: Add + id: 8255 + time: '2025-04-19T06:51:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36617 From 64cd1805569f39eb23ad436bbdd1dd02f35364ff Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 17:29:32 +1000 Subject: [PATCH 357/622] Update submodule to 254.1.0 (#36711) * Update submodule to 254.1.0 * API update --- .../Inventory/VirtualItem/SharedVirtualItemSystem.cs | 3 +-- .../Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs | 2 +- RobustToolbox | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs index 393a4c09eb..256a5ec2a9 100644 --- a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs +++ b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs @@ -256,7 +256,6 @@ public abstract class SharedVirtualItemSystem : EntitySystem if (TerminatingOrDeleted(item)) return; - _transformSystem.DetachEntity(item, Transform(item)); - PredictedQueueDel(item); + PredictedQueueDel(item.Owner); } } diff --git a/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs b/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs index 4ca4728681..8caf1c39a6 100644 --- a/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs +++ b/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs @@ -74,7 +74,7 @@ public sealed class TechnologyDiskSystem : EntitySystem } } _popup.PopupClient(Loc.GetString("tech-disk-inserted"), target, args.User); - PredictedQueueDel(ent); + PredictedQueueDel(ent.Owner); args.Handled = true; } diff --git a/RobustToolbox b/RobustToolbox index b146b1b82c..191d7ab81c 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit b146b1b82cda98f9445e7a9e2146e569e6cf4197 +Subproject commit 191d7ab81c3693503bc9f483c5829228d9cb57cf From 9bdd7307fdd3e422e95a4987208498f36ec4c6c6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 18:05:20 +1000 Subject: [PATCH 358/622] Predicted multihanded component (#36712) * Predicted multihanded component * Refview * reh --- .../Items/Systems/MultiHandedItemSystem.cs | 15 ----- Content.Server/Item/MultiHandedItemSystem.cs | 24 -------- .../Item/MultiHandedItemComponent.cs | 2 +- Content.Shared/Item/MultiHandedItemSystem.cs | 56 +++++++++++++++++++ .../Item/SharedMultiHandedItemSystem.cs | 47 ---------------- 5 files changed, 57 insertions(+), 87 deletions(-) delete mode 100644 Content.Client/Items/Systems/MultiHandedItemSystem.cs delete mode 100644 Content.Server/Item/MultiHandedItemSystem.cs create mode 100644 Content.Shared/Item/MultiHandedItemSystem.cs delete mode 100644 Content.Shared/Item/SharedMultiHandedItemSystem.cs diff --git a/Content.Client/Items/Systems/MultiHandedItemSystem.cs b/Content.Client/Items/Systems/MultiHandedItemSystem.cs deleted file mode 100644 index 716a4ad1a4..0000000000 --- a/Content.Client/Items/Systems/MultiHandedItemSystem.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Content.Shared.Hands; -using Content.Shared.Item; - -namespace Content.Client.Items.Systems; - -public sealed class MultiHandedItemSystem : SharedMultiHandedItemSystem -{ - protected override void OnEquipped(EntityUid uid, MultiHandedItemComponent component, GotEquippedHandEvent args) - { - } - - protected override void OnUnequipped(EntityUid uid, MultiHandedItemComponent component, GotUnequippedHandEvent args) - { - } -} diff --git a/Content.Server/Item/MultiHandedItemSystem.cs b/Content.Server/Item/MultiHandedItemSystem.cs deleted file mode 100644 index 9146c7c982..0000000000 --- a/Content.Server/Item/MultiHandedItemSystem.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Server.Hands.Systems; -using Content.Server.Inventory; -using Content.Shared.Hands; -using Content.Shared.Item; - -namespace Content.Server.Item; - -public sealed class MultiHandedItemSystem : SharedMultiHandedItemSystem -{ - [Dependency] private readonly VirtualItemSystem _virtualItem = default!; - - protected override void OnEquipped(EntityUid uid, MultiHandedItemComponent component, GotEquippedHandEvent args) - { - for (var i = 0; i < component.HandsNeeded - 1; i++) - { - _virtualItem.TrySpawnVirtualItemInHand(uid, args.User); - } - } - - protected override void OnUnequipped(EntityUid uid, MultiHandedItemComponent component, GotUnequippedHandEvent args) - { - _virtualItem.DeleteInHandsMatching(args.User, uid); - } -} diff --git a/Content.Shared/Item/MultiHandedItemComponent.cs b/Content.Shared/Item/MultiHandedItemComponent.cs index 9a90d063ba..3a0ac23bcd 100644 --- a/Content.Shared/Item/MultiHandedItemComponent.cs +++ b/Content.Shared/Item/MultiHandedItemComponent.cs @@ -9,6 +9,6 @@ namespace Content.Shared.Item; [RegisterComponent, NetworkedComponent] public sealed partial class MultiHandedItemComponent : Component { - [DataField("handsNeeded"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public int HandsNeeded = 2; } diff --git a/Content.Shared/Item/MultiHandedItemSystem.cs b/Content.Shared/Item/MultiHandedItemSystem.cs new file mode 100644 index 0000000000..da9d895dd2 --- /dev/null +++ b/Content.Shared/Item/MultiHandedItemSystem.cs @@ -0,0 +1,56 @@ +using Content.Shared.Hands; +using Content.Shared.Hands.Components; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Inventory.VirtualItem; +using Content.Shared.Popups; +using Robust.Shared.Timing; + +namespace Content.Shared.Item; + +public sealed class MultiHandedItemSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedVirtualItemSystem _virtualItem = default!; + + /// <inheritdoc/> + public override void Initialize() + { + SubscribeLocalEvent<MultiHandedItemComponent, GettingPickedUpAttemptEvent>(OnAttemptPickup); + SubscribeLocalEvent<MultiHandedItemComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted); + SubscribeLocalEvent<MultiHandedItemComponent, GotEquippedHandEvent>(OnEquipped); + SubscribeLocalEvent<MultiHandedItemComponent, GotUnequippedHandEvent>(OnUnequipped); + } + + private void OnEquipped(Entity<MultiHandedItemComponent> ent, ref GotEquippedHandEvent args) + { + for (var i = 0; i < ent.Comp.HandsNeeded - 1; i++) + { + _virtualItem.TrySpawnVirtualItemInHand(ent.Owner, args.User); + } + } + + private void OnUnequipped(Entity<MultiHandedItemComponent> ent, ref GotUnequippedHandEvent args) + { + _virtualItem.DeleteInHandsMatching(args.User, ent.Owner); + } + + private void OnAttemptPickup(Entity<MultiHandedItemComponent> ent, ref GettingPickedUpAttemptEvent args) + { + if (TryComp<HandsComponent>(args.User, out var hands) && hands.CountFreeHands() >= ent.Comp.HandsNeeded) + return; + + args.Cancel(); + _popup.PopupPredictedCursor(Loc.GetString("multi-handed-item-pick-up-fail", + ("number", ent.Comp.HandsNeeded - 1), ("item", ent.Owner)), args.User); + } + + private void OnVirtualItemDeleted(Entity<MultiHandedItemComponent> ent, ref VirtualItemDeletedEvent args) + { + if (args.BlockingEntity != ent.Owner || _timing.ApplyingState) + return; + + _hands.TryDrop(args.User, ent.Owner); + } +} diff --git a/Content.Shared/Item/SharedMultiHandedItemSystem.cs b/Content.Shared/Item/SharedMultiHandedItemSystem.cs deleted file mode 100644 index 0259b361b5..0000000000 --- a/Content.Shared/Item/SharedMultiHandedItemSystem.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Content.Shared.Hands; -using Content.Shared.Hands.Components; -using Content.Shared.Hands.EntitySystems; -using Content.Shared.Popups; -using Robust.Shared.Timing; - -namespace Content.Shared.Item; - -public abstract class SharedMultiHandedItemSystem : EntitySystem -{ - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedHandsSystem _hands = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - - /// <inheritdoc/> - public override void Initialize() - { - SubscribeLocalEvent<MultiHandedItemComponent, GettingPickedUpAttemptEvent>(OnAttemptPickup); - SubscribeLocalEvent<MultiHandedItemComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted); - SubscribeLocalEvent<MultiHandedItemComponent, GotEquippedHandEvent>(OnEquipped); - SubscribeLocalEvent<MultiHandedItemComponent, GotUnequippedHandEvent>(OnUnequipped); - } - - protected abstract void OnEquipped(EntityUid uid, MultiHandedItemComponent component, GotEquippedHandEvent args); - protected abstract void OnUnequipped(EntityUid uid, MultiHandedItemComponent component, GotUnequippedHandEvent args); - - private void OnAttemptPickup(EntityUid uid, MultiHandedItemComponent component, GettingPickedUpAttemptEvent args) - { - if (TryComp<HandsComponent>(args.User, out var hands) && hands.CountFreeHands() >= component.HandsNeeded) - return; - - args.Cancel(); - if (_timing.IsFirstTimePredicted) - { - _popup.PopupCursor(Loc.GetString("multi-handed-item-pick-up-fail", - ("number", component.HandsNeeded - 1), ("item", uid)), args.User); - } - } - - private void OnVirtualItemDeleted(EntityUid uid, MultiHandedItemComponent component, VirtualItemDeletedEvent args) - { - if (args.BlockingEntity != uid) - return; - - _hands.TryDrop(args.User, uid); - } -} From bffd951867cbcab08abf296ebcbfb0067bf6d98c Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 18:49:02 +1000 Subject: [PATCH 359/622] Fix charges (#36714) We have the absolute value so use that. --- Content.Shared/Charges/Systems/SharedChargesSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Charges/Systems/SharedChargesSystem.cs b/Content.Shared/Charges/Systems/SharedChargesSystem.cs index 2eb05f8bfc..4805e5a441 100644 --- a/Content.Shared/Charges/Systems/SharedChargesSystem.cs +++ b/Content.Shared/Charges/Systems/SharedChargesSystem.cs @@ -118,7 +118,7 @@ public abstract class SharedChargesSystem : EntitySystem action.Comp.LastUpdate = _timing.CurTime; } - action.Comp.LastCharges = Math.Clamp(action.Comp.LastCharges + addCharges, 0, action.Comp.MaxCharges); + action.Comp.LastCharges = Math.Clamp(charges, 0, action.Comp.MaxCharges); Dirty(action); } From c45f291425ed7414d474c6fe0bf7d3f723fd318d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 08:50:09 +0000 Subject: [PATCH 360/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 584aefc415..1488fb5207 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: You now see a popup when being cuffed or uncuffed again. - type: Fix - id: 7755 - time: '2024-12-27T13:34:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33639 - author: Alpaccalypse changes: - message: Power monitoring computer boards can no longer be researched or printed, @@ -3914,3 +3907,10 @@ id: 8255 time: '2025-04-19T06:51:12.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36617 +- author: metalgearsloth + changes: + - message: Fix charges sometimes breaking for auto-recharge devices such as RCDs. + type: Fix + id: 8256 + time: '2025-04-19T08:49:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36714 From 919425911ef8c113f762033125827312575205d8 Mon Sep 17 00:00:00 2001 From: jbox1 <40789662+jbox144@users.noreply.github.com> Date: Sat, 19 Apr 2025 18:51:53 +1000 Subject: [PATCH 361/622] Ore silos and department eco --- Resources/Maps/plasma.yml | 2631 ++++++++++++++++++++++++------------- 1 file changed, 1749 insertions(+), 882 deletions(-) diff --git a/Resources/Maps/plasma.yml b/Resources/Maps/plasma.yml index daf884241b..e1c2da78be 100644 --- a/Resources/Maps/plasma.yml +++ b/Resources/Maps/plasma.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 248.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 03/09/2025 09:02:52 - entityCount: 26218 + time: 04/19/2025 08:50:04 + entityCount: 26229 maps: - 1 grids: @@ -11768,9 +11768,11 @@ entities: - type: DeviceLinkSource linkedPorts: 387: - - DoorStatus: Close + - - DoorStatus + - Close 386: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9038 components: - type: Transform @@ -12047,7 +12049,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10197: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 433 components: - type: Transform @@ -12081,7 +12084,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23296: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5964 components: - type: Transform @@ -12118,7 +12122,8 @@ entities: - type: DeviceLinkSource linkedPorts: 310: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17595 components: - type: Transform @@ -12147,7 +12152,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5899: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockEngineeringLocked entities: - uid: 149 @@ -12232,7 +12238,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7384: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18032 components: - type: Transform @@ -12250,7 +12257,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17502: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 115 @@ -12264,7 +12272,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8648: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 332 components: - type: Transform @@ -12276,7 +12285,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8647: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1771 components: - type: Transform @@ -12288,7 +12298,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23005: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8300 components: - type: Transform @@ -12299,7 +12310,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8719: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8301 components: - type: Transform @@ -12310,7 +12322,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8721: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8713 components: - type: Transform @@ -12322,9 +12335,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8742: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 8741: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9280 components: - type: Transform @@ -12336,9 +12351,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8653: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 8652: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10081 components: - type: Transform @@ -12349,7 +12366,8 @@ entities: - type: DeviceLinkSource linkedPorts: 514: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassAtmosphericsLocked entities: - uid: 608 @@ -12363,7 +12381,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5533: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5533 components: - type: Transform @@ -12375,7 +12394,8 @@ entities: - type: DeviceLinkSource linkedPorts: 608: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8598 components: - type: Transform @@ -12398,7 +12418,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8718: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10565 components: - type: Transform @@ -12410,7 +12431,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10563: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10566 components: - type: Transform @@ -12422,7 +12444,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10564: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassCommandLocked entities: - uid: 1880 @@ -12435,7 +12458,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8722: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24574 components: - type: Transform @@ -12449,7 +12473,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24883: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24883 components: - type: Transform @@ -12463,7 +12488,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24574: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 6122 @@ -12476,9 +12502,11 @@ entities: - type: DeviceLinkSource linkedPorts: 6124: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 6123: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6123 components: - type: Transform @@ -12489,7 +12517,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6122: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6124 components: - type: Transform @@ -12500,7 +12529,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6122: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17502 components: - type: Transform @@ -12512,7 +12542,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13904: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21310 components: - type: Transform @@ -12523,7 +12554,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21322: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21322 components: - type: Transform @@ -12534,7 +12566,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21310: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 5606 @@ -12561,7 +12594,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7378: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9344 components: - type: Transform @@ -12572,7 +12606,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11057: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9652 components: - type: Transform @@ -12583,7 +12618,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10487: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9984 components: - type: Transform @@ -12594,7 +12630,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9985: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9985 components: - type: Transform @@ -12605,7 +12642,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9984: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10185 components: - type: Transform @@ -12616,7 +12654,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10184: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11057 components: - type: Transform @@ -12627,7 +12666,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9344: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17519 components: - type: Transform @@ -12647,7 +12687,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1771: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24228 components: - type: Transform @@ -12658,7 +12699,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24227: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 8647 @@ -12670,8 +12712,10 @@ entities: - type: DeviceLinkSource linkedPorts: 26239: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 8648 @@ -12683,8 +12727,10 @@ entities: - type: DeviceLinkSource linkedPorts: 16903: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - proto: AirlockExternalGlassShuttleEmergencyLocked @@ -12698,8 +12744,10 @@ entities: - type: DeviceLinkSource linkedPorts: 8950: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 8719 @@ -12711,8 +12759,10 @@ entities: - type: DeviceLinkSource linkedPorts: 13489: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 8721 @@ -12724,8 +12774,10 @@ entities: - type: DeviceLinkSource linkedPorts: 26238: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 8722 @@ -12737,8 +12789,10 @@ entities: - type: DeviceLinkSource linkedPorts: 26237: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - proto: AirlockExternalGlassShuttleEscape @@ -12783,8 +12837,10 @@ entities: - type: DeviceLinkSource linkedPorts: 24217: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockExternalLocked @@ -12799,7 +12855,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10185: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10487 components: - type: Transform @@ -12810,7 +12867,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9652: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24227 components: - type: Transform @@ -12821,7 +12879,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24228: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezerHydroponicsLocked entities: - uid: 3410 @@ -12849,7 +12908,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1936: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 387 components: - type: Transform @@ -12861,7 +12921,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1936: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 460 components: - type: Transform @@ -13133,8 +13194,10 @@ entities: - type: DeviceLinkSource linkedPorts: 19502: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 8653 @@ -13146,8 +13209,10 @@ entities: - type: DeviceLinkSource linkedPorts: 19503: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 8741 @@ -13159,8 +13224,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22372: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 8742 @@ -13172,8 +13239,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22371: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 10563 @@ -13185,8 +13254,10 @@ entities: - type: DeviceLinkSource linkedPorts: 8961: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 10564 @@ -13198,8 +13269,10 @@ entities: - type: DeviceLinkSource linkedPorts: 12421: - - DoorStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 2 - uid: 24212 @@ -13583,9 +13656,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9820: - - DoorStatus: Close + - - DoorStatus + - Close 23603: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9820 components: - type: Transform @@ -13596,9 +13671,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9819: - - DoorStatus: Close + - - DoorStatus + - Close 9821: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9821 components: - type: Transform @@ -13609,7 +13686,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9820: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 10142 components: - type: Transform @@ -13845,7 +13923,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9819: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 23999 components: - type: Transform @@ -14002,7 +14081,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7455: - - DoorStatus: Close + - - DoorStatus + - Close - proto: AirlockMaintServiceLocked entities: - uid: 1024 @@ -14234,7 +14314,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7859: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7857 components: - type: Transform @@ -14246,7 +14327,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13624: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7859 components: - type: Transform @@ -14258,7 +14340,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7848: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8080 components: - type: Transform @@ -14275,7 +14358,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7857: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13827 components: - type: Transform @@ -14324,7 +14408,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5609: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6604 components: - type: Transform @@ -14336,7 +14421,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6487: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6605 components: - type: Transform @@ -14348,7 +14434,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6545: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8247 components: - type: Transform @@ -14403,7 +14490,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19605: - - DoorStatus: Close + - - DoorStatus + - Close - proto: AirlockServiceLocked entities: - uid: 1968 @@ -24547,7 +24635,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25870: - - DoorStatus: Input + - - DoorStatus + - Input - uid: 4923 components: - type: Transform @@ -25210,7 +25299,7 @@ entities: - uid: 6835 components: - type: Transform - pos: -80.4528,-27.475985 + pos: -80.98839,-25.448616 parent: 2 - uid: 16179 components: @@ -25327,9 +25416,12 @@ entities: - type: DeviceLinkSource linkedPorts: 8661: - - Timer: Open - - Timer: AutoClose - - Start: Close + - - Timer + - Open + - - Timer + - AutoClose + - - Start + - Close - uid: 14643 components: - type: Transform @@ -25339,9 +25431,12 @@ entities: - type: DeviceLinkSource linkedPorts: 8660: - - Timer: Open - - Timer: AutoClose - - Start: Close + - - Timer + - Open + - - Timer + - AutoClose + - - Start + - Close - uid: 15254 components: - type: Transform @@ -25351,9 +25446,12 @@ entities: - type: DeviceLinkSource linkedPorts: 357: - - Start: Close - - Timer: Open - - Timer: AutoClose + - - Start + - Close + - - Timer + - Open + - - Timer + - AutoClose - uid: 22692 components: - type: Transform @@ -25363,9 +25461,12 @@ entities: - type: DeviceLinkSource linkedPorts: 512: - - Start: Close - - Timer: Open - - Timer: AutoClose + - - Start + - Close + - - Timer + - Open + - - Timer + - AutoClose - uid: 22696 components: - type: Transform @@ -25375,9 +25476,12 @@ entities: - type: DeviceLinkSource linkedPorts: 915: - - Start: Close - - Timer: Open - - Timer: AutoClose + - - Start + - Close + - - Timer + - Open + - - Timer + - AutoClose - proto: Brutepack entities: - uid: 20642 @@ -63580,6 +63684,23 @@ entities: - type: Transform pos: -39.5,-25.5 parent: 2 +- proto: ChemistryBottleEpinephrine + entities: + - uid: 2612 + components: + - type: Transform + pos: -60.347107,-3.8663821 + parent: 2 + - uid: 6479 + components: + - type: Transform + pos: -36.623154,-30.40255 + parent: 2 + - uid: 6480 + components: + - type: Transform + pos: -36.404404,-30.261925 + parent: 2 - proto: ChemistryHotplate entities: - uid: 3949 @@ -64897,7 +65018,8 @@ entities: range: 7 linkedPorts: 14168: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - uid: 7251 components: - type: Transform @@ -64907,7 +65029,8 @@ entities: range: 7 linkedPorts: 15401: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 5571 @@ -65013,6 +65136,45 @@ entities: rot: -1.5707963267948966 rad pos: -98.5,13.5 parent: 2 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 22274 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -112.5,-18.5 + parent: 2 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 19332 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -21.5,-46.5 + parent: 2 +- proto: ComputerCargoOrdersScience + entities: + - uid: 3012 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -112.5,-39.5 + parent: 2 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 12908 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -80.5,-27.5 + parent: 2 +- proto: ComputerCargoOrdersService + entities: + - uid: 24116 + components: + - type: Transform + pos: -72.5,-24.5 + parent: 2 - proto: ComputerComms entities: - uid: 2690 @@ -65140,6 +65302,14 @@ entities: rot: 1.5707963267948966 rad pos: -20.5,-25.5 parent: 2 +- proto: ComputerFundingAllocation + entities: + - uid: 22992 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -53.5,-7.5 + parent: 2 - proto: ComputerId entities: - uid: 2701 @@ -65814,7 +65984,7 @@ entities: - uid: 11064 components: - type: Transform - rot: 1.5707963267948966 rad + rot: -1.5707963267948966 rad pos: -97.5,20.5 parent: 2 - uid: 11082 @@ -66289,11 +66459,6 @@ entities: - type: Transform pos: -87.5,12.5 parent: 2 - - uid: 12908 - components: - - type: Transform - pos: -116.5,-38.5 - parent: 2 - uid: 15970 components: - type: Transform @@ -66612,6 +66777,41 @@ entities: - type: Transform pos: -134.5,15.5 parent: 2 +- proto: CrateLockBoxEngineering + entities: + - uid: 23199 + components: + - type: Transform + pos: -118.5,-24.5 + parent: 2 +- proto: CrateLockBoxMedical + entities: + - uid: 23764 + components: + - type: Transform + pos: -17.5,-42.5 + parent: 2 +- proto: CrateLockBoxScience + entities: + - uid: 23593 + components: + - type: Transform + pos: -114.5,-40.5 + parent: 2 +- proto: CrateLockBoxSecurity + entities: + - uid: 23594 + components: + - type: Transform + pos: -88.5,-20.5 + parent: 2 +- proto: CrateLockBoxService + entities: + - uid: 23710 + components: + - type: Transform + pos: -45.5,-23.5 + parent: 2 - proto: CrateMaterialGlass entities: - uid: 12923 @@ -66664,10 +66864,10 @@ entities: showEnts: False occludes: True ent: null - - uid: 12921 + - uid: 2929 components: - type: Transform - pos: -112.5,-39.5 + pos: -116.5,-38.5 parent: 2 - proto: CrateMaterialTextiles entities: @@ -67574,6 +67774,11 @@ entities: - type: Transform pos: -92.52145,-24.442335 parent: 2 + - uid: 22354 + components: + - type: Transform + pos: -31.56386,-19.092993 + parent: 2 - uid: 22985 components: - type: Transform @@ -76601,8 +76806,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22440: - - OutputHigh: On - - OutputLow: Off + - - OutputHigh + - On + - - OutputLow + - Off - type: Physics canCollide: False bodyType: Static @@ -76741,23 +76948,6 @@ entities: rot: 3.141592653589793 rad pos: -112.5,34.5 parent: 2 -- proto: EpinephrineChemistryBottle - entities: - - uid: 2612 - components: - - type: Transform - pos: -60.347107,-3.8663821 - parent: 2 - - uid: 6479 - components: - - type: Transform - pos: -36.623154,-30.40255 - parent: 2 - - uid: 6480 - components: - - type: Transform - pos: -36.404404,-30.261925 - parent: 2 - proto: ExosuitFabricator entities: - uid: 20469 @@ -76897,16 +77087,6 @@ entities: parent: 2 - type: FaxMachine name: Reporter - - uid: 3012 - components: - - type: MetaData - name: long range fax machine - - type: Transform - pos: -53.5,-7.5 - parent: 2 - - type: FaxMachine - name: Head of Personel - - type: Label - uid: 4761 components: - type: Transform @@ -76960,6 +77140,13 @@ entities: - type: FaxMachine name: Warden - type: Label + - uid: 10749 + components: + - type: Transform + pos: -51.5,-7.5 + parent: 2 + - type: FaxMachine + name: Head of Personell - uid: 13583 components: - type: MetaData @@ -124369,7 +124556,7 @@ entities: parent: 2 - proto: HolopadCommandHop entities: - - uid: 24547 + - uid: 4117 components: - type: Transform pos: -51.5,-6.5 @@ -125093,12 +125280,6 @@ entities: parent: 2 - proto: IntercomCommand entities: - - uid: 1224 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -42.5,-66.5 - parent: 2 - uid: 23355 components: - type: Transform @@ -125107,6 +125288,12 @@ entities: parent: 2 - proto: IntercomCommon entities: + - uid: 1224 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -42.5,-66.5 + parent: 2 - uid: 6494 components: - type: Transform @@ -125671,7 +125858,8 @@ entities: - type: DeviceLinkSource linkedPorts: 668: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Plasma Storage Vent - type: NameModifier @@ -125686,7 +125874,8 @@ entities: - type: DeviceLinkSource linkedPorts: 669: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Burn Chamber Vent - type: NameModifier @@ -125702,7 +125891,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4662: - - Pressed: Trigger + - - Pressed + - Trigger - proto: LockableButtonEngineering entities: - uid: 5991 @@ -125716,11 +125906,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4923: - - Pressed: Toggle + - - Pressed + - Toggle 4922: - - Pressed: Toggle + - - Pressed + - Toggle 4924: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: EMERGENCY VENT - type: NameModifier @@ -125735,11 +125928,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4923: - - Pressed: Toggle + - - Pressed + - Toggle 4922: - - Pressed: Toggle + - - Pressed + - Toggle 4924: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: EMERGENCY VENT - type: NameModifier @@ -125755,7 +125951,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20188: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8824 components: - type: Transform @@ -125765,7 +125962,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8812: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: LockableButtonMedical entities: - uid: 2458 @@ -125777,9 +125975,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5862: - - Pressed: Open + - - Pressed + - Open 5752: - - Pressed: Open + - - Pressed + - Open - uid: 2607 components: - type: MetaData @@ -125790,9 +125990,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3972: - - Pressed: Toggle + - - Pressed + - Toggle 3988: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Front Door - type: NameModifier @@ -125805,9 +126007,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3972: - - Pressed: Toggle + - - Pressed + - Toggle 3988: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4192 components: - type: Transform @@ -125817,11 +126021,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4190: - - Pressed: Toggle + - - Pressed + - Toggle 4191: - - Pressed: Toggle + - - Pressed + - Toggle 4189: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilled entities: - uid: 5383 @@ -125851,7 +126058,7 @@ entities: - type: Transform pos: -67.5,-24.5 parent: 2 - - uid: 10749 + - uid: 7428 components: - type: Transform pos: -68.5,-24.5 @@ -126396,7 +126603,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9280: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126411,7 +126619,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8713: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126428,7 +126637,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1898: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126443,7 +126653,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10565: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126458,7 +126669,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10566: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126473,7 +126685,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8300: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126488,7 +126701,8 @@ entities: - type: DeviceLinkSource linkedPorts: 115: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126503,7 +126717,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17089: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -126518,7 +126733,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17089: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -126533,7 +126749,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22370: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -126548,7 +126765,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22370: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -126563,7 +126781,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10081: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126578,7 +126797,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1880: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126593,7 +126813,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8301: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126608,7 +126829,8 @@ entities: - type: DeviceLinkSource linkedPorts: 332: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -126781,6 +127003,13 @@ entities: - type: Transform pos: -110.5,36.5 parent: 2 +- proto: MachineMaterialSilo + entities: + - uid: 12921 + components: + - type: Transform + pos: -112.5,-38.5 + parent: 2 - proto: MagazinePistol entities: - uid: 4573 @@ -127030,12 +127259,12 @@ entities: - uid: 2102 components: - type: Transform - pos: -22.33516,-46.510864 + pos: -22.948994,-46.2582 parent: 2 - uid: 5832 components: - type: Transform - pos: -22.507034,-46.74524 + pos: -23.120869,-46.492577 parent: 2 - uid: 22878 components: @@ -127047,12 +127276,12 @@ entities: - uid: 2103 components: - type: Transform - pos: -22.96016,-46.49524 + pos: -23.464619,-46.180077 parent: 2 - uid: 2105 components: - type: Transform - pos: -23.14766,-46.729614 + pos: -23.667744,-46.47695 parent: 2 - proto: MedkitFilled entities: @@ -127064,12 +127293,12 @@ entities: - uid: 2495 components: - type: Transform - pos: -24.58516,-46.760864 + pos: -24.652119,-46.430077 parent: 2 - uid: 2498 components: - type: Transform - pos: -24.39766,-46.510864 + pos: -24.527119,-46.180077 parent: 2 - uid: 6463 components: @@ -127101,24 +127330,24 @@ entities: - uid: 2104 components: - type: Transform - pos: -23.850784,-46.792114 + pos: -24.152119,-46.461327 parent: 2 - uid: 6459 components: - type: Transform - pos: -23.67891,-46.573364 + pos: -24.011494,-46.211327 parent: 2 - proto: MedkitToxinFilled entities: - uid: 6460 components: - type: Transform - pos: -21.77266,-46.74524 + pos: -22.573994,-46.5082 parent: 2 - uid: 6461 components: - type: Transform - pos: -21.507034,-46.542114 + pos: -22.308369,-46.22695 parent: 2 - proto: Memorial entities: @@ -128175,13 +128404,6 @@ entities: - type: Transform pos: -19.5,-18.5 parent: 2 -- proto: PaperBin20 - entities: - - uid: 22274 - components: - - type: Transform - pos: -51.5,-7.5 - parent: 2 - proto: PaperBin5 entities: - uid: 6715 @@ -128488,6 +128710,13 @@ entities: - type: Transform pos: -60.456474,2.4886463 parent: 2 +- proto: PhoneInstrument + entities: + - uid: 22431 + components: + - type: Transform + pos: -60.930367,-1.4142666 + parent: 2 - proto: PianoInstrument entities: - uid: 15846 @@ -129720,6 +129949,11 @@ entities: - type: Transform pos: -30.5,-66.5 parent: 2 + - uid: 22991 + components: + - type: Transform + pos: -122.5,-50.5 + parent: 2 - uid: 24952 components: - type: Transform @@ -131470,6 +131704,12 @@ entities: rot: 1.5707963267948966 rad pos: -70.5,-31.5 parent: 2 + - uid: 24501 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -71.5,-26.5 + parent: 2 - uid: 25360 components: - type: Transform @@ -132766,12 +133006,6 @@ entities: - type: Transform pos: -24.5,-9.5 parent: 2 - - uid: 23710 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -80.5,-27.5 - parent: 2 - uid: 24408 components: - type: Transform @@ -133479,11 +133713,6 @@ entities: parent: 2 - proto: RandomArtifactSpawner entities: - - uid: 7428 - components: - - type: Transform - pos: -112.5,-38.5 - parent: 2 - uid: 19337 components: - type: Transform @@ -133494,6 +133723,11 @@ entities: - type: Transform pos: -89.5,19.5 parent: 2 + - uid: 24047 + components: + - type: Transform + pos: -114.5,-39.5 + parent: 2 - uid: 25697 components: - type: Transform @@ -136494,11 +136728,14 @@ entities: - type: DeviceLinkSource linkedPorts: 138: - - Pressed: Toggle + - - Pressed + - Toggle 3976: - - Pressed: Toggle + - - Pressed + - Toggle 132: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Paramedic Shutters - type: NameModifier @@ -136786,17 +137023,17 @@ entities: - uid: 22075 components: - type: Transform - pos: -111.06298,-18.491226 + pos: -110.842995,-18.42477 parent: 2 - uid: 22165 components: - type: Transform - pos: -111.06298,-18.491226 + pos: -110.76487,-18.42477 parent: 2 - uid: 22240 components: - type: Transform - pos: -111.06298,-18.491226 + pos: -110.686745,-18.409145 parent: 2 - uid: 25202 components: @@ -136881,7 +137118,7 @@ entities: - uid: 22256 components: - type: Transform - pos: -111.703606,-18.538101 + pos: -111.29612,-18.471645 parent: 2 - proto: SheetSteel entities: @@ -136933,17 +137170,17 @@ entities: - uid: 21889 components: - type: Transform - pos: -112.42362,-18.506851 + pos: -111.749245,-18.42477 parent: 2 - uid: 22097 components: - type: Transform - pos: -112.42362,-18.491226 + pos: -111.82737,-18.409145 parent: 2 - uid: 22114 components: - type: Transform - pos: -112.42362,-18.475601 + pos: -111.79612,-18.39352 parent: 2 - uid: 25203 components: @@ -137788,9 +138025,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5666: - - Pressed: Trigger + - - Pressed + - Trigger 669: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Burn Chamber Vent - type: NameModifier @@ -137806,7 +138045,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5948: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Vent Chamber - type: NameModifier @@ -137822,9 +138062,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1936: - - Pressed: Toggle + - - Pressed + - Toggle 385: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Open Doors - type: NameModifier @@ -137840,7 +138082,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3776: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 1521 components: - type: Transform @@ -137850,7 +138093,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3779: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 2591 components: - type: MetaData @@ -137861,7 +138105,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3300: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Space Blast Doors - type: NameModifier @@ -137875,7 +138120,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3780: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 3810 components: - type: Transform @@ -137884,7 +138130,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3771: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 3811 components: - type: Transform @@ -137893,7 +138140,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3772: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 4222 components: - type: Transform @@ -137903,7 +138151,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4096: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 6068 components: - type: MetaData @@ -137914,7 +138163,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6071: - - Pressed: Trigger + - - Pressed + - Trigger - type: Label currentLabel: Ignite Chamber - type: NameModifier @@ -137929,7 +138179,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5948: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Vent Chamber - type: NameModifier @@ -137943,7 +138194,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6157: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 6164 components: - type: Transform @@ -137953,7 +138205,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6156: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 6168 components: - type: MetaData @@ -137964,7 +138217,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5948: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Vent Chamber - type: NameModifier @@ -137979,7 +138233,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6071: - - Pressed: Trigger + - - Pressed + - Trigger - type: Label currentLabel: Ignite Chamber - type: NameModifier @@ -137993,7 +138248,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4662: - - Pressed: Trigger + - - Pressed + - Trigger - uid: 19541 components: - type: MetaData @@ -138005,7 +138261,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19524: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Dock Blast Doors - type: NameModifier @@ -138021,7 +138278,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19525: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Dock Blast Doors - type: NameModifier @@ -138037,7 +138295,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23508: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Salvage Blast Doors - type: NameModifier @@ -138053,7 +138312,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7764: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Disposals Blast Doors - type: NameModifier @@ -138069,7 +138329,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7766: - - Pressed: Toggle + - - Pressed + - Toggle - type: Label currentLabel: Disposals Blast Doors - type: NameModifier @@ -138084,7 +138345,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16763: - - Pressed: Trigger + - - Pressed + - Trigger - type: Label currentLabel: Space Blast Doors - type: NameModifier @@ -138098,7 +138360,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14940: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 25417 components: - type: Transform @@ -138108,7 +138371,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12466: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 25418 components: - type: Transform @@ -138118,7 +138382,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12043: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: SignalSwitch entities: - uid: 1217 @@ -138130,14 +138395,20 @@ entities: - type: DeviceLinkSource linkedPorts: 9769: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9414: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9078: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 1220 components: - type: Transform @@ -138147,14 +138418,20 @@ entities: - type: DeviceLinkSource linkedPorts: 15252: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 15282: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 15283: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 2791 components: - type: MetaData @@ -138167,20 +138444,30 @@ entities: - type: DeviceLinkSource linkedPorts: 2795: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2796: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2793: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2794: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1825: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138200,56 +138487,90 @@ entities: - type: DeviceLinkSource linkedPorts: 2773: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2775: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2776: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2777: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2779: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2780: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2782: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2783: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2784: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2785: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2787: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2786: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2788: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2789: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2790: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2781: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2778: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138268,11 +138589,15 @@ entities: - type: DeviceLinkSource linkedPorts: 2959: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2998: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138292,23 +138617,35 @@ entities: - type: DeviceLinkSource linkedPorts: 2962: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2963: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 399: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2960: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2964: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2958: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138323,8 +138660,10 @@ entities: - type: DeviceLinkSource linkedPorts: 25628: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 7079 components: - type: Transform @@ -138334,8 +138673,10 @@ entities: - type: DeviceLinkSource linkedPorts: 7134: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 7335 components: - type: MetaData @@ -138347,11 +138688,15 @@ entities: - type: DeviceLinkSource linkedPorts: 19537: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19536: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Warehouse Shutters - type: NameModifier @@ -138367,14 +138712,20 @@ entities: - type: DeviceLinkSource linkedPorts: 11622: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11623: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11624: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 11613 @@ -138387,14 +138738,20 @@ entities: - type: DeviceLinkSource linkedPorts: 11619: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11617: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11616: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 11614 @@ -138408,14 +138765,20 @@ entities: - type: DeviceLinkSource linkedPorts: 11620: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11618: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11621: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 17822 @@ -138431,14 +138794,20 @@ entities: - type: DeviceLinkSource linkedPorts: 17820: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 17819: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 17815: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138454,14 +138823,20 @@ entities: - type: DeviceLinkSource linkedPorts: 22373: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22374: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22375: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 25663 components: - type: MetaData @@ -138473,8 +138848,10 @@ entities: - type: DeviceLinkSource linkedPorts: 18983: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - type: Label currentLabel: Janitor Light - type: NameModifier @@ -138490,14 +138867,20 @@ entities: - type: DeviceLinkSource linkedPorts: 7273: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7274: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7272: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 3053 components: - type: Transform @@ -138506,20 +138889,30 @@ entities: - type: DeviceLinkSource linkedPorts: 6265: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6310: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6308: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6307: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6306: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 3834 components: - type: Transform @@ -138531,17 +138924,25 @@ entities: - type: DeviceLinkSource linkedPorts: 3830: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3831: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3832: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3833: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 3974 @@ -138555,17 +138956,25 @@ entities: - type: DeviceLinkSource linkedPorts: 138: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3976: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 132: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3985: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - type: Label currentLabel: Paramedic Shutters - type: NameModifier @@ -138581,14 +138990,20 @@ entities: - type: DeviceLinkSource linkedPorts: 3997: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3998: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3999: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 8067 @@ -138599,14 +139014,20 @@ entities: - type: DeviceLinkSource linkedPorts: 13676: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13637: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 13665: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 8073 components: - type: Transform @@ -138616,14 +139037,20 @@ entities: - type: DeviceLinkSource linkedPorts: 13625: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7181: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1798: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 8662 components: - type: MetaData @@ -138634,14 +139061,20 @@ entities: - type: DeviceLinkSource linkedPorts: 1716: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5039: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7778: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Shutters - type: NameModifier @@ -138654,14 +139087,20 @@ entities: - type: DeviceLinkSource linkedPorts: 8822: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8821: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8820: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9429 components: - type: Transform @@ -138673,14 +139112,20 @@ entities: - type: DeviceLinkSource linkedPorts: 20435: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20495: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20417: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 11163 @@ -138692,11 +139137,15 @@ entities: - type: DeviceLinkSource linkedPorts: 11159: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9559: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 12308 components: - type: MetaData @@ -138707,7 +139156,8 @@ entities: - type: DeviceLinkSource linkedPorts: 937: - - Status: DoorBolt + - - Status + - DoorBolt - type: Label currentLabel: Door Bolt - type: NameModifier @@ -138721,17 +139171,25 @@ entities: - type: DeviceLinkSource linkedPorts: 25626: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25625: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25624: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25623: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 17488 components: - type: Transform @@ -138740,14 +139198,20 @@ entities: - type: DeviceLinkSource linkedPorts: 7275: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7276: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7277: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 17816 components: - type: MetaData @@ -138761,14 +139225,20 @@ entities: - type: DeviceLinkSource linkedPorts: 5391: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5113: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5581: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138788,32 +139258,50 @@ entities: - type: DeviceLinkSource linkedPorts: 18777: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5558: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18648: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18649: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21672: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18694: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16381: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6607: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6613: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138833,14 +139321,20 @@ entities: - type: DeviceLinkSource linkedPorts: 17813: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 17814: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9642: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138858,29 +139352,45 @@ entities: - type: DeviceLinkSource linkedPorts: 19533: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19532: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19531: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19534: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19535: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19528: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19529: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19530: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Privacy Shutters - type: NameModifier @@ -138898,14 +139408,20 @@ entities: - type: DeviceLinkSource linkedPorts: 22284: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18724: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 17192: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - type: Label @@ -138923,11 +139439,15 @@ entities: - type: DeviceLinkSource linkedPorts: 3344: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3382: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 25393 @@ -138941,41 +139461,65 @@ entities: - type: DeviceLinkSource linkedPorts: 4466: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4467: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4469: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4459: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25385: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25386: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25389: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25388: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25387: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25392: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25391: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 25390: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 25397 @@ -138988,14 +139532,20 @@ entities: - type: DeviceLinkSource linkedPorts: 4457: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4468: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4456: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - uid: 25613 @@ -139006,8 +139556,10 @@ entities: - type: DeviceLinkSource linkedPorts: 9583: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 25656 components: - type: Transform @@ -139017,8 +139569,10 @@ entities: - type: DeviceLinkSource linkedPorts: 25654: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 25659 components: - type: Transform @@ -139027,8 +139581,10 @@ entities: - type: DeviceLinkSource linkedPorts: 25657: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 25661 components: - type: Transform @@ -139038,8 +139594,10 @@ entities: - type: DeviceLinkSource linkedPorts: 17852: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 25694 components: - type: Transform @@ -139051,17 +139609,25 @@ entities: - type: DeviceLinkSource linkedPorts: 14139: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 14140: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 14141: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 14142: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close lastSignals: Status: True - proto: SignalTimer @@ -139075,8 +139641,10 @@ entities: - type: DeviceLinkSource linkedPorts: 9290: - - Start: Open - - Timer: Close + - - Start + - Open + - - Timer + - Close - uid: 16763 components: - type: Transform @@ -139086,8 +139654,10 @@ entities: - type: DeviceLinkSource linkedPorts: 4631: - - Start: Open - - Timer: Close + - - Start + - Open + - - Timer + - Close - proto: SignAnomaly entities: - uid: 8081 @@ -143622,6 +144192,7 @@ entities: - type: Transform pos: -112.5,18.5 parent: 2 + - type: Conveyed - uid: 5807 components: - type: Transform @@ -143632,6 +144203,7 @@ entities: - type: Transform pos: -109.5,18.5 parent: 2 + - type: Conveyed - uid: 8610 components: - type: Transform @@ -146094,11 +146666,6 @@ entities: - type: Transform pos: -22.5,-46.5 parent: 2 - - uid: 4117 - components: - - type: Transform - pos: -21.5,-46.5 - parent: 2 - uid: 4121 components: - type: Transform @@ -146934,11 +147501,6 @@ entities: - type: Transform pos: -36.5,-25.5 parent: 2 - - uid: 19332 - components: - - type: Transform - pos: -112.5,-18.5 - parent: 2 - uid: 19333 components: - type: Transform @@ -147054,6 +147616,11 @@ entities: - type: Transform pos: -14.5,-24.5 parent: 2 + - uid: 22432 + components: + - type: Transform + pos: -122.5,-50.5 + parent: 2 - uid: 22830 components: - type: Transform @@ -147701,11 +148268,6 @@ entities: - type: Transform pos: -44.5,-4.5 parent: 2 - - uid: 2929 - components: - - type: Transform - pos: -53.5,-7.5 - parent: 2 - uid: 2936 components: - type: Transform @@ -148920,31 +149482,51 @@ entities: - type: DeviceLinkSource linkedPorts: 6610: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6612: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19511: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 25544: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2600: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 25555: - - Left: Open - - Right: Open - - Left: AutoClose - - Right: AutoClose - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Left + - AutoClose + - - Right + - AutoClose + - - Middle + - Close - type: Label currentLabel: Front Desk Conveyor - type: NameModifier @@ -148959,89 +149541,152 @@ entities: - type: DeviceLinkSource linkedPorts: 1357: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4369: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8476: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4368: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7262: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4370: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4367: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7264: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11280: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11082: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19736: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14873: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8421: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12463: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8422: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 1576: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8449: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 23479: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 23417: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 24821: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4575: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - type: Label currentLabel: Salvage Conveyor - type: NameModifier @@ -149056,45 +149701,75 @@ entities: - type: DeviceLinkSource linkedPorts: 7553: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6968: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 20287: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7315: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7559: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7343: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6964: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11064: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6813: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6815: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - type: Label currentLabel: Disposals Conveyor - type: NameModifier @@ -149109,25 +149784,40 @@ entities: - type: DeviceLinkSource linkedPorts: 7584: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7586: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7418: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7539: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7077: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - type: Label currentLabel: Dock Conveyor - type: NameModifier @@ -149142,25 +149832,40 @@ entities: - type: DeviceLinkSource linkedPorts: 7548: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7582: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7583: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7579: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7344: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - type: Label currentLabel: Dock Conveyor - type: NameModifier @@ -149173,37 +149878,61 @@ entities: - type: DeviceLinkSource linkedPorts: 22196: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22197: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22198: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22199: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22200: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22201: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22203: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22202: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 23513 components: - type: MetaData @@ -149214,85 +149943,145 @@ entities: - type: DeviceLinkSource linkedPorts: 7080: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 23169: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 23171: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 6525: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6524: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6587: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6577: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5820: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6507: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5850: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7549: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7304: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7336: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18079: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 6054: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6790: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6794: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6000: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6743: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6679: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - type: Label currentLabel: Cargo Conveyor - type: NameModifier @@ -149307,23 +150096,37 @@ entities: - type: DeviceLinkSource linkedPorts: 25546: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 25545: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6926: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11109: - - Left: Open - - Right: Open - - Middle: Close - - Left: AutoClose - - Right: AutoClose + - - Left + - Open + - - Right + - Open + - - Middle + - Close + - - Left + - AutoClose + - - Right + - AutoClose - type: Label currentLabel: Desk Conveyor - type: NameModifier @@ -149338,81 +150141,138 @@ entities: - type: DeviceLinkSource linkedPorts: 14781: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 15308: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11641: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10621: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11649: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11764: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11757: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11768: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11745: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11744: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10569: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4582: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11739: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11726: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11723: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11720: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18938: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18870: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 24819: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - type: Label currentLabel: Space Conveyor - type: NameModifier @@ -166243,7 +167103,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2966: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 18341 components: - type: Transform @@ -166262,7 +167123,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -199343.58 + secondsUntilStateChange: -200076.22 state: Opening - type: Airlock autoClose: False @@ -166304,7 +167165,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24033: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 16040 components: - type: Transform @@ -166316,7 +167178,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4026: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureArmoryLocked entities: - uid: 4026 @@ -166330,7 +167193,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16040: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 6663 components: - type: Transform @@ -166426,7 +167290,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2967: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureJanitorLocked entities: - uid: 19615 @@ -166465,7 +167330,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21056: - - DoorStatus: Toggle + - - DoorStatus + - Toggle - proto: WindoorSecureSalvageLocked entities: - uid: 9973 @@ -166500,7 +167366,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1715: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureServiceLocked entities: - uid: 10029 From b09c3f1e565395714df10556110d4f7929df53a9 Mon Sep 17 00:00:00 2001 From: Deerstop <edainturner@gmail.com> Date: Sat, 19 Apr 2025 18:54:29 +1000 Subject: [PATCH 362/622] added silo, moved service request console --- Resources/Maps/elkridge.yml | 897 +++++++++++++++++++++++------------- 1 file changed, 588 insertions(+), 309 deletions(-) diff --git a/Resources/Maps/elkridge.yml b/Resources/Maps/elkridge.yml index 6669b10ec3..c70d34dd3d 100644 --- a/Resources/Maps/elkridge.yml +++ b/Resources/Maps/elkridge.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/15/2025 00:47:30 - entityCount: 17536 + time: 04/19/2025 08:48:01 + entityCount: 17540 maps: - 1 grids: @@ -3685,7 +3685,6 @@ entities: 13337: -35,12 13339: -34,14 13340: -32,17 - 13341: -31,15 13360: -28,-49 13361: -27,-50 13362: -23,-48 @@ -9335,7 +9334,7 @@ entities: 0: 65520 10,-9: 0: 17984 - 4: 1 + 6: 1 3: 2444 11,-7: 0: 65518 @@ -9593,7 +9592,7 @@ entities: 0: 25838 -8,3: 3: 17 - 0: 47308 + 0: 55500 -9,3: 0: 54374 -7,1: @@ -9699,7 +9698,7 @@ entities: 0: 4881 3: 8226 2: 8 - 5: 2048 + 4: 2048 4,-13: 0: 4369 3: 17508 @@ -9708,7 +9707,7 @@ entities: 0: 36096 5,-10: 2: 3 - 5: 768 + 4: 768 3: 32904 0: 2048 5,-9: @@ -9943,17 +9942,17 @@ entities: 3: 4113 0: 256 2: 12 - 6: 3072 + 5: 3072 9,-9: 3: 1025 0: 2832 - 4: 12 + 6: 12 10,-11: 3: 295 0: 17920 10,-10: 2: 1 - 6: 256 + 5: 256 3: 18508 0: 1024 10,-12: @@ -10604,21 +10603,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 0 - - 6666.982 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 temperature: 293.15 moles: @@ -10649,6 +10633,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 0 + - 6666.982 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -13222,7 +13221,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5306: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5306 components: - type: Transform @@ -13233,7 +13233,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5137: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7076 components: - type: Transform @@ -13258,7 +13259,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1201: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1201 components: - type: Transform @@ -13269,7 +13271,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1196: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassCargoLocked entities: - uid: 6502 @@ -13293,7 +13296,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7671: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7671 components: - type: Transform @@ -13305,7 +13309,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7670: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 1184 @@ -13319,7 +13324,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5592: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1363 components: - type: Transform @@ -13331,7 +13337,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1364: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1364 components: - type: Transform @@ -13343,7 +13350,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1363: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2749 components: - type: Transform @@ -13354,7 +13362,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8435: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5592 components: - type: Transform @@ -13366,7 +13375,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1184: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7698 components: - type: Transform @@ -13378,7 +13388,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7784: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7784 components: - type: Transform @@ -13390,7 +13401,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7698: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8435 components: - type: Transform @@ -13402,7 +13414,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2749: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9751 components: - type: Transform @@ -13413,7 +13426,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12652: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12652 components: - type: Transform @@ -13424,7 +13438,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9751: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 6194 @@ -13437,7 +13452,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15710: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8145 components: - type: Transform @@ -13449,7 +13465,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8146: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8146 components: - type: Transform @@ -13461,7 +13478,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8145: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14221 components: - type: Transform @@ -13472,7 +13490,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14271: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14271 components: - type: Transform @@ -13483,7 +13502,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14221: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14715 components: - type: Transform @@ -13495,7 +13515,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14786: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14786 components: - type: Transform @@ -13507,7 +13528,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14715: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 7058 @@ -13659,7 +13681,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6194: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezerHydroponicsLocked entities: - uid: 247 @@ -14332,7 +14355,7 @@ entities: pos: 47.5,5.5 parent: 2 - type: Door - secondsUntilStateChange: -418041.62 + secondsUntilStateChange: -418632.5 state: Opening - type: DeviceLinkSource lastSignals: @@ -14806,7 +14829,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9586: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9586 components: - type: MetaData @@ -14819,7 +14843,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7036: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11249 components: - type: MetaData @@ -14984,7 +15009,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3977: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3977 components: - type: MetaData @@ -14998,7 +15024,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3976: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirSensor entities: - uid: 454 @@ -17930,6 +17957,18 @@ entities: rot: 3.141592653589793 rad pos: -42.5,-46.5 parent: 2 + - uid: 17253 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -32.5,15.5 + parent: 2 + - uid: 17540 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -33.5,17.5 + parent: 2 - proto: BarSign entities: - uid: 17 @@ -18857,9 +18896,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1652: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 1959 components: - type: Transform @@ -18869,9 +18911,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1929: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - proto: Brutepack1 entities: - uid: 17029 @@ -45282,6 +45327,11 @@ entities: - type: Transform pos: 36.5,-16.5 parent: 2 + - uid: 16204 + components: + - type: Transform + pos: -29.5,15.5 + parent: 2 - uid: 16254 components: - type: Transform @@ -47945,7 +47995,7 @@ entities: - uid: 17078 components: - type: Transform - pos: -30.50995,15.527845 + pos: -31.466911,15.535599 parent: 2 - proto: ClothingHandsTacticalMaidGloves entities: @@ -48615,7 +48665,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12747: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 5067 @@ -48779,11 +48830,11 @@ entities: parent: 2 - proto: ComputerCargoOrdersService entities: - - uid: 5463 + - uid: 16200 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,5.5 + pos: 7.5,3.5 parent: 2 - proto: ComputerCargoShuttle entities: @@ -49386,10 +49437,10 @@ entities: parent: 2 - proto: CrateArtifactContainer entities: - - uid: 16483 + - uid: 5463 components: - type: Transform - pos: -18.5,15.5 + pos: -29.5,15.5 parent: 2 - proto: CrateContrabandStorageSecure entities: @@ -78906,11 +78957,6 @@ entities: - type: Transform pos: -38.5,-46.5 parent: 2 - - uid: 17253 - components: - - type: Transform - pos: -31.5,15.5 - parent: 2 - proto: GlassBoxLaserFilled entities: - uid: 15420 @@ -84386,13 +84432,17 @@ entities: - type: DeviceLinkSource linkedPorts: 6001: - - Pressed: Toggle + - - Pressed + - Toggle 6000: - - Pressed: Toggle + - - Pressed + - Toggle 6002: - - Pressed: Toggle + - - Pressed + - Toggle 3436: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCaptain entities: - uid: 13976 @@ -84405,17 +84455,23 @@ entities: - type: DeviceLinkSource linkedPorts: 4881: - - Pressed: Toggle + - - Pressed + - Toggle 996: - - Pressed: Toggle + - - Pressed + - Toggle 13978: - - Pressed: Toggle + - - Pressed + - Toggle 13977: - - Pressed: Toggle + - - Pressed + - Toggle 755: - - Pressed: Toggle + - - Pressed + - Toggle 11048: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonChiefEngineer entities: - uid: 16183 @@ -84429,13 +84485,17 @@ entities: - type: DeviceLinkSource linkedPorts: 8122: - - Pressed: Toggle + - - Pressed + - Toggle 7324: - - Pressed: Toggle + - - Pressed + - Toggle 4121: - - Pressed: Toggle + - - Pressed + - Toggle 8126: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonChiefMedicalOfficer entities: - uid: 16176 @@ -84447,9 +84507,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16173: - - Pressed: Toggle + - - Pressed + - Toggle 16174: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCommand entities: - uid: 8657 @@ -84463,11 +84525,15 @@ entities: - type: DeviceLinkSource linkedPorts: 2840: - - Pressed: Toggle - - Pressed: DoorBolt + - - Pressed + - Toggle + - - Pressed + - DoorBolt 2466: - - Pressed: Toggle - - Pressed: DoorBolt + - - Pressed + - Toggle + - - Pressed + - DoorBolt - uid: 11097 components: - type: MetaData @@ -84478,29 +84544,41 @@ entities: - type: DeviceLinkSource linkedPorts: 4607: - - Pressed: Toggle + - - Pressed + - Toggle 11085: - - Pressed: Toggle + - - Pressed + - Toggle 11086: - - Pressed: Toggle + - - Pressed + - Toggle 11088: - - Pressed: Toggle + - - Pressed + - Toggle 11087: - - Pressed: Toggle + - - Pressed + - Toggle 11089: - - Pressed: Toggle + - - Pressed + - Toggle 11090: - - Pressed: Toggle + - - Pressed + - Toggle 11091: - - Pressed: Toggle + - - Pressed + - Toggle 11092: - - Pressed: Toggle + - - Pressed + - Toggle 11093: - - Pressed: Toggle + - - Pressed + - Toggle 11094: - - Pressed: Toggle + - - Pressed + - Toggle 15279: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonDetective entities: - uid: 13949 @@ -84514,7 +84592,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14003: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonEngineering entities: - uid: 2911 @@ -84527,7 +84606,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12655: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonExternal entities: - uid: 6221 @@ -84540,15 +84620,20 @@ entities: - type: DeviceLinkSource linkedPorts: 15146: - - Pressed: Toggle + - - Pressed + - Toggle 15144: - - Pressed: Toggle + - - Pressed + - Toggle 11050: - - Pressed: Toggle + - - Pressed + - Toggle 3058: - - Pressed: Toggle + - - Pressed + - Toggle 15143: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8194 components: - type: MetaData @@ -84560,15 +84645,20 @@ entities: - type: DeviceLinkSource linkedPorts: 15144: - - Pressed: Toggle + - - Pressed + - Toggle 15146: - - Pressed: Toggle + - - Pressed + - Toggle 11050: - - Pressed: Toggle + - - Pressed + - Toggle 3058: - - Pressed: Toggle + - - Pressed + - Toggle 15143: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonHeadOfPersonnel entities: - uid: 16196 @@ -84582,9 +84672,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16192: - - Pressed: Toggle + - - Pressed + - Toggle 3989: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonHeadOfSecurity entities: - uid: 16185 @@ -84598,9 +84690,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16186: - - Pressed: Toggle + - - Pressed + - Toggle 16187: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonKitchen entities: - uid: 4481 @@ -84613,13 +84707,17 @@ entities: - type: DeviceLinkSource linkedPorts: 16219: - - Pressed: Toggle + - - Pressed + - Toggle 16221: - - Pressed: Toggle + - - Pressed + - Toggle 14372: - - Pressed: Toggle + - - Pressed + - Toggle 16222: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 9089 @@ -84633,9 +84731,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3915: - - Pressed: Open + - - Pressed + - Open 3916: - - Pressed: Open + - - Pressed + - Open - uid: 13575 components: - type: MetaData @@ -84647,9 +84747,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5080: - - Pressed: Toggle + - - Pressed + - Toggle 4706: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13768 components: - type: MetaData @@ -84660,9 +84762,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4706: - - Pressed: Toggle + - - Pressed + - Toggle 5080: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 16210 components: - type: MetaData @@ -84674,9 +84778,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16146: - - Pressed: Toggle + - - Pressed + - Toggle 16147: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonQuartermaster entities: - uid: 16161 @@ -84690,15 +84796,20 @@ entities: - type: DeviceLinkSource linkedPorts: 12813: - - Pressed: Toggle + - - Pressed + - Toggle 16159: - - Pressed: Toggle + - - Pressed + - Toggle 16157: - - Pressed: Toggle + - - Pressed + - Toggle 16156: - - Pressed: Toggle + - - Pressed + - Toggle 16155: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonResearchDirector entities: - uid: 11128 @@ -84710,11 +84821,14 @@ entities: - type: DeviceLinkSource linkedPorts: 14681: - - Pressed: Toggle + - - Pressed + - Toggle 15086: - - Pressed: Toggle + - - Pressed + - Toggle 11182: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonSecurity entities: - uid: 16002 @@ -84726,7 +84840,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15998: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 16003 components: - type: Transform @@ -84736,7 +84851,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15999: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilled entities: - uid: 2107 @@ -85600,6 +85716,13 @@ entities: - type: Transform pos: -31.5,34.5 parent: 2 +- proto: MachineMaterialSilo + entities: + - uid: 3541 + components: + - type: Transform + pos: -18.5,15.5 + parent: 2 - proto: MagazinePistolSubMachineGunTopMounted entities: - uid: 5644 @@ -86031,6 +86154,12 @@ entities: parent: 2 - proto: Mannequin entities: + - uid: 450 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,5.5 + parent: 2 - uid: 5455 components: - type: Transform @@ -87432,11 +87561,6 @@ entities: - type: Transform pos: -8.5,48.5 parent: 2 - - uid: 13562 - components: - - type: Transform - pos: -6.5,3.5 - parent: 2 - uid: 13774 components: - type: Transform @@ -90007,6 +90131,11 @@ entities: - type: Transform pos: -25.5,22.5 parent: 2 + - uid: 16483 + components: + - type: Transform + pos: -31.5,15.5 + parent: 2 - uid: 16570 components: - type: Transform @@ -93966,7 +94095,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12655: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2643 components: - type: MetaData @@ -93978,9 +94108,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2600: - - Pressed: Toggle + - - Pressed + - Toggle 2360: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3473 components: - type: MetaData @@ -93992,11 +94124,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5397: - - Pressed: Toggle + - - Pressed + - Toggle 3711: - - Pressed: Toggle + - - Pressed + - Toggle 6996: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6029 components: - type: MetaData @@ -94007,7 +94142,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7748: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7024 components: - type: MetaData @@ -94019,9 +94155,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5144: - - Pressed: Toggle + - - Pressed + - Toggle 16017: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9353 components: - type: MetaData @@ -94033,7 +94171,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8133: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9658 components: - type: MetaData @@ -94045,11 +94184,14 @@ entities: - type: DeviceLinkSource linkedPorts: 9655: - - Pressed: Toggle + - - Pressed + - Toggle 9651: - - Pressed: Toggle + - - Pressed + - Toggle 2332: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10510 components: - type: MetaData @@ -94060,7 +94202,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9968: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11169 components: - type: MetaData @@ -94072,7 +94215,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14013: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11201 components: - type: MetaData @@ -94083,9 +94227,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1540: - - Pressed: Toggle + - - Pressed + - Toggle 11215: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11351 components: - type: MetaData @@ -94096,13 +94242,17 @@ entities: - type: DeviceLinkSource linkedPorts: 1443: - - Pressed: Toggle + - - Pressed + - Toggle 1515: - - Pressed: Toggle + - - Pressed + - Toggle 1513: - - Pressed: Toggle + - - Pressed + - Toggle 1514: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 12773 components: - type: MetaData @@ -94114,9 +94264,11 @@ entities: - type: DeviceLinkSource linkedPorts: 11249: - - Pressed: Toggle + - - Pressed + - Toggle 5141: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 12908 components: - type: MetaData @@ -94128,13 +94280,17 @@ entities: - type: DeviceLinkSource linkedPorts: 1514: - - Pressed: Toggle + - - Pressed + - Toggle 1513: - - Pressed: Toggle + - - Pressed + - Toggle 1515: - - Pressed: Toggle + - - Pressed + - Toggle 1443: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14428 components: - type: MetaData @@ -94145,9 +94301,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1186: - - Pressed: Toggle + - - Pressed + - Toggle 7942: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14431 components: - type: MetaData @@ -94158,9 +94316,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2585: - - Pressed: Toggle + - - Pressed + - Toggle 2526: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14435 components: - type: MetaData @@ -94171,9 +94331,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3915: - - Pressed: Toggle + - - Pressed + - Toggle 3916: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14437 components: - type: MetaData @@ -94185,9 +94347,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2589: - - Pressed: Toggle + - - Pressed + - Toggle 2588: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14446 components: - type: MetaData @@ -94199,9 +94363,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15298: - - Pressed: Toggle + - - Pressed + - Toggle 15299: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14447 components: - type: MetaData @@ -94213,9 +94379,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1940: - - Pressed: Toggle + - - Pressed + - Toggle 1939: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14511 components: - type: MetaData @@ -94227,9 +94395,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4489: - - Pressed: Toggle + - - Pressed + - Toggle 4514: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14512 components: - type: MetaData @@ -94241,9 +94411,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4570: - - Pressed: Toggle + - - Pressed + - Toggle 4531: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15855 components: - type: MetaData @@ -94255,7 +94427,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15902: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15860 components: - type: MetaData @@ -94267,7 +94440,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15859: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15861 components: - type: MetaData @@ -94279,7 +94453,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6033: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 15865 components: - type: MetaData @@ -94291,7 +94466,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6303: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 15866 components: - type: MetaData @@ -94303,7 +94479,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15858: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15868 components: - type: MetaData @@ -94315,7 +94492,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15857: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15871 components: - type: MetaData @@ -94327,7 +94505,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15872: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15880 components: - type: MetaData @@ -94339,7 +94518,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15856: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15883 components: - type: MetaData @@ -94351,7 +94531,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15881: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15886 components: - type: MetaData @@ -94363,7 +94544,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15884: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15889 components: - type: MetaData @@ -94375,7 +94557,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15888: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15891 components: - type: MetaData @@ -94386,7 +94569,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15892: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15895 components: - type: MetaData @@ -94398,7 +94582,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3590: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 16553 components: - type: MetaData @@ -94410,7 +94595,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16579: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalSwitchDirectional entities: - uid: 9640 @@ -94423,35 +94609,55 @@ entities: - type: DeviceLinkSource linkedPorts: 4372: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3249: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4573: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 5212: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4212: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 5316: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 6388: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4219: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 9508: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 5640: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off - uid: 13472 components: - type: Transform @@ -94461,11 +94667,15 @@ entities: - type: DeviceLinkSource linkedPorts: 14970: - - Off: Open - - On: Close + - - Off + - Open + - - On + - Close 1927: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 13480 components: - type: Transform @@ -94475,11 +94685,15 @@ entities: - type: DeviceLinkSource linkedPorts: 13703: - - Off: Open - - On: Close + - - Off + - Open + - - On + - Close 1928: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - proto: SignAnomaly entities: - uid: 16169 @@ -102600,17 +102814,26 @@ entities: - type: DeviceLinkSource linkedPorts: 4266: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4265: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4264: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 6529 components: - type: Transform @@ -102619,21 +102842,33 @@ entities: - type: DeviceLinkSource linkedPorts: 6524: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6523: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6522: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6521: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 6530 components: - type: Transform @@ -102642,21 +102877,33 @@ entities: - type: DeviceLinkSource linkedPorts: 6528: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6527: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6526: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6525: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 9351 components: - type: Transform @@ -102665,33 +102912,54 @@ entities: - type: DeviceLinkSource linkedPorts: 14116: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14113: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14114: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14118: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14117: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9349: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14115: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 15084 components: - type: Transform @@ -102700,21 +102968,33 @@ entities: - type: DeviceLinkSource linkedPorts: 4277: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2827: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4279: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14913: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 3431 @@ -102851,11 +103131,6 @@ entities: parent: 2 - proto: VendingMachineCigs entities: - - uid: 450 - components: - - type: Transform - pos: 7.5,3.5 - parent: 2 - uid: 2141 components: - type: Transform @@ -102866,6 +103141,11 @@ entities: - type: Transform pos: -20.5,-6.5 parent: 2 + - uid: 13562 + components: + - type: Transform + pos: -6.5,3.5 + parent: 2 - proto: VendingMachineClothing entities: - uid: 4174 @@ -104617,12 +104897,6 @@ entities: - type: Transform pos: -42.5,21.5 parent: 2 - - uid: 3541 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -29.5,15.5 - parent: 2 - uid: 3550 components: - type: Transform @@ -107746,6 +108020,11 @@ entities: rot: 1.5707963267948966 rad pos: -18.5,11.5 parent: 2 + - uid: 16201 + components: + - type: Transform + pos: -30.5,15.5 + parent: 2 - uid: 16302 components: - type: Transform From 61c3f944f0020ec810a2d7b2c297c0f62812ee85 Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 12:07:50 +0200 Subject: [PATCH 363/622] init --- Resources/Maps/omega.yml | 540 ++++++++++++++++++++++++++------------- 1 file changed, 358 insertions(+), 182 deletions(-) diff --git a/Resources/Maps/omega.yml b/Resources/Maps/omega.yml index ec6ecaac6a..8433901c5d 100644 --- a/Resources/Maps/omega.yml +++ b/Resources/Maps/omega.yml @@ -1,10 +1,10 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/14/2025 14:30:33 + time: 04/19/2025 10:03:04 entityCount: 13940 maps: - 473 @@ -6357,7 +6357,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4014: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalEngineeringLocked entities: - uid: 9212 @@ -6370,7 +6371,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9190: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13456 components: - type: Transform @@ -6381,7 +6383,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13457: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 892 @@ -6468,9 +6471,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12107: - - DoorStatus: Close + - - DoorStatus + - Close 9656: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 13037 components: - type: Transform @@ -6508,7 +6513,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4550: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3040 components: - type: Transform @@ -6530,7 +6536,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2894: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassCommandLocked entities: - uid: 4014 @@ -6544,7 +6551,8 @@ entities: - type: DeviceLinkSource linkedPorts: 729: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 9190 @@ -6557,7 +6565,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9212: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13457 components: - type: Transform @@ -6569,7 +6578,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13456: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 10406 @@ -6582,7 +6592,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10405: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11139 components: - type: Transform @@ -6593,7 +6604,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11141: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11141 components: - type: Transform @@ -6604,7 +6616,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11139: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 3760 @@ -6717,7 +6730,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9651: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 12107 @@ -6728,7 +6742,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9651: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 12991 @@ -6755,7 +6770,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2814: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2814 components: - type: Transform @@ -6766,7 +6782,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2737: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3349 components: - type: Transform @@ -6777,7 +6794,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3350: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3350 components: - type: Transform @@ -6788,7 +6806,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3349: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3686 components: - type: Transform @@ -6799,7 +6818,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3687: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3687 components: - type: Transform @@ -6810,7 +6830,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3686: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10405 components: - type: Transform @@ -6821,7 +6842,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10406: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezer entities: - uid: 3119 @@ -7357,7 +7379,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11676: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11350 components: - type: Transform @@ -7378,7 +7401,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11326: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11802 components: - type: Transform @@ -12296,9 +12320,12 @@ entities: - type: DeviceLinkSource linkedPorts: 7786: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 4811 components: - type: Transform @@ -12307,9 +12334,12 @@ entities: - type: DeviceLinkSource linkedPorts: 7785: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - proto: Bucket entities: - uid: 1477 @@ -34131,7 +34161,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6319: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 3581 @@ -62476,7 +62507,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9455: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8728 components: - type: Transform @@ -62486,7 +62518,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9828: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13618 components: - type: Transform @@ -62496,7 +62529,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9455: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13619 components: - type: Transform @@ -62506,7 +62540,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9828: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonChiefEngineer entities: - uid: 13776 @@ -62518,15 +62553,20 @@ entities: - type: DeviceLinkSource linkedPorts: 10675: - - Pressed: Toggle + - - Pressed + - Toggle 10674: - - Pressed: Toggle + - - Pressed + - Toggle 10673: - - Pressed: Toggle + - - Pressed + - Toggle 13775: - - Pressed: Toggle + - - Pressed + - Toggle 13532: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCommand entities: - uid: 13857 @@ -62538,9 +62578,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4413: - - Pressed: Toggle + - - Pressed + - Toggle 7635: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonHeadOfPersonnel entities: - uid: 13858 @@ -62552,15 +62594,20 @@ entities: - type: DeviceLinkSource linkedPorts: 13854: - - Pressed: Toggle + - - Pressed + - Toggle 13853: - - Pressed: Toggle + - - Pressed + - Toggle 13852: - - Pressed: Toggle + - - Pressed + - Toggle 4695: - - Pressed: Toggle + - - Pressed + - Toggle 9592: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonHeadOfSecurity entities: - uid: 13826 @@ -62571,11 +62618,14 @@ entities: - type: DeviceLinkSource linkedPorts: 8153: - - Pressed: Toggle + - - Pressed + - Toggle 8160: - - Pressed: Toggle + - - Pressed + - Toggle 8161: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 4693 @@ -62587,9 +62637,11 @@ entities: - type: DeviceLinkSource linkedPorts: 13414: - - Pressed: Open + - - Pressed + - Open 13415: - - Pressed: Open + - - Pressed + - Open - proto: LockableButtonResearch entities: - uid: 9591 @@ -62601,11 +62653,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4615: - - Pressed: Toggle + - - Pressed + - Toggle 5795: - - Pressed: Toggle + - - Pressed + - Toggle 5794: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonSecurity entities: - uid: 13825 @@ -62617,13 +62672,17 @@ entities: - type: DeviceLinkSource linkedPorts: 13821: - - Pressed: Toggle + - - Pressed + - Toggle 13822: - - Pressed: Toggle + - - Pressed + - Toggle 13823: - - Pressed: Toggle + - - Pressed + - Toggle 13824: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilled entities: - uid: 9571 @@ -63414,6 +63473,13 @@ entities: - type: Transform pos: 4.5,-40.5 parent: 4812 +- proto: MachineMaterialSilo + entities: + - uid: 6224 + components: + - type: Transform + pos: 16.5,-23.5 + parent: 4812 - proto: MagazinePistolSubMachineGunTopMounted entities: - uid: 2914 @@ -71458,7 +71524,7 @@ entities: - uid: 6236 components: - type: Transform - pos: 16.561968,-23.469662 + pos: 13.57206,-23.338892 parent: 4812 - uid: 10770 components: @@ -71933,17 +71999,23 @@ entities: - type: DeviceLinkSource linkedPorts: 360: - - Pressed: Toggle + - - Pressed + - Toggle 359: - - Pressed: Toggle + - - Pressed + - Toggle 358: - - Pressed: Toggle + - - Pressed + - Toggle 357: - - Pressed: Toggle + - - Pressed + - Toggle 356: - - Pressed: Toggle + - - Pressed + - Toggle 355: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1646 components: - type: Transform @@ -71952,11 +72024,14 @@ entities: - type: DeviceLinkSource linkedPorts: 785: - - Pressed: Toggle + - - Pressed + - Toggle 787: - - Pressed: Toggle + - - Pressed + - Toggle 786: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1965 components: - type: Transform @@ -71965,11 +72040,14 @@ entities: - type: DeviceLinkSource linkedPorts: 2235: - - Pressed: Toggle + - - Pressed + - Toggle 2236: - - Pressed: Toggle + - - Pressed + - Toggle 1930: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2241 components: - type: Transform @@ -71978,11 +72056,14 @@ entities: - type: DeviceLinkSource linkedPorts: 1929: - - Pressed: Toggle + - - Pressed + - Toggle 2234: - - Pressed: Toggle + - - Pressed + - Toggle 1931: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 5576 components: - type: Transform @@ -71991,11 +72072,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5509: - - Pressed: Toggle + - - Pressed + - Toggle 5507: - - Pressed: Toggle + - - Pressed + - Toggle 5508: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6690 components: - type: Transform @@ -72004,11 +72088,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5575: - - Pressed: Toggle + - - Pressed + - Toggle 5574: - - Pressed: Toggle + - - Pressed + - Toggle 5573: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 2928 @@ -72020,11 +72107,14 @@ entities: - type: DeviceLinkSource linkedPorts: 9345: - - Pressed: Toggle + - - Pressed + - Toggle 13742: - - Pressed: Toggle + - - Pressed + - Toggle 13743: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4610 components: - type: Transform @@ -72034,9 +72124,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12970: - - Pressed: Toggle + - - Pressed + - Toggle 13287: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10877 components: - type: Transform @@ -72046,9 +72138,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2866: - - Pressed: Toggle + - - Pressed + - Toggle 2864: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13373 components: - type: Transform @@ -72058,13 +72152,17 @@ entities: - type: DeviceLinkSource linkedPorts: 13668: - - Pressed: Toggle + - - Pressed + - Toggle 13667: - - Pressed: Toggle + - - Pressed + - Toggle 13666: - - Pressed: Toggle + - - Pressed + - Toggle 13665: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13629 components: - type: Transform @@ -72074,13 +72172,17 @@ entities: - type: DeviceLinkSource linkedPorts: 2835: - - Pressed: Toggle + - - Pressed + - Toggle 2836: - - Pressed: Toggle + - - Pressed + - Toggle 2837: - - Pressed: Toggle + - - Pressed + - Toggle 2870: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13662 components: - type: Transform @@ -72089,23 +72191,32 @@ entities: - type: DeviceLinkSource linkedPorts: 6574: - - Pressed: Toggle + - - Pressed + - Toggle 6576: - - Pressed: Toggle + - - Pressed + - Toggle 6575: - - Pressed: Toggle + - - Pressed + - Toggle 6577: - - Pressed: Toggle + - - Pressed + - Toggle 6578: - - Pressed: Toggle + - - Pressed + - Toggle 6570: - - Pressed: Toggle + - - Pressed + - Toggle 6586: - - Pressed: Toggle + - - Pressed + - Toggle 13473: - - Pressed: Toggle + - - Pressed + - Toggle 13663: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13886 components: - type: Transform @@ -72114,9 +72225,11 @@ entities: - type: DeviceLinkSource linkedPorts: 13890: - - Pressed: Toggle + - - Pressed + - Toggle 13891: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13887 components: - type: Transform @@ -72125,9 +72238,11 @@ entities: - type: DeviceLinkSource linkedPorts: 13888: - - Pressed: Toggle + - - Pressed + - Toggle 13889: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignAnomaly2 entities: - uid: 6342 @@ -76938,11 +77053,6 @@ entities: - type: Transform pos: 16.5,-27.5 parent: 4812 - - uid: 6224 - components: - - type: Transform - pos: 16.5,-23.5 - parent: 4812 - uid: 6225 components: - type: Transform @@ -78138,25 +78248,40 @@ entities: - type: DeviceLinkSource linkedPorts: 3013: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3014: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3033: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3028: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3029: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 3188 components: - type: Transform @@ -78167,25 +78292,40 @@ entities: - type: DeviceLinkSource linkedPorts: 2863: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3043: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3046: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2765: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2771: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11245 components: - type: Transform @@ -78194,13 +78334,19 @@ entities: - type: DeviceLinkSource linkedPorts: 11235: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11244: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 12980 components: - type: Transform @@ -78209,45 +78355,75 @@ entities: - type: DeviceLinkSource linkedPorts: 2886: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 2896: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 2890: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 3769: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 3434: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 13135: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 13282: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 13283: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 13289: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 13290: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward - proto: UniformPrinter entities: - uid: 2513 From d48948aae98ed200b00cda38b78b027ce4ed28bb Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 12:17:09 +0200 Subject: [PATCH 364/622] init --- Resources/Maps/oasis.yml | 1731 +++++++++++++++++++++++++------------- 1 file changed, 1131 insertions(+), 600 deletions(-) diff --git a/Resources/Maps/oasis.yml b/Resources/Maps/oasis.yml index 0f0e04e64f..53f2b33e27 100644 --- a/Resources/Maps/oasis.yml +++ b/Resources/Maps/oasis.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/15/2025 03:45:33 - entityCount: 30307 + time: 04/19/2025 10:13:38 + entityCount: 30308 maps: - 1 grids: @@ -7260,7 +7260,7 @@ entities: 0: 65427 -13,-12: 0: 56524 - 6: 17 + 3: 17 -12,-11: 0: 60931 -13,-11: @@ -7368,12 +7368,12 @@ entities: 2: 34952 -11,2: 2: 255 - 3: 57344 + 4: 57344 -12,4: 2: 53192 -11,3: 2: 61440 - 4: 224 + 5: 224 -10,1: 0: 40847 -10,2: @@ -7396,16 +7396,16 @@ entities: 2: 34952 -11,6: 2: 61440 - 6: 224 + 3: 224 -11,7: 2: 65535 -12,8: 2: 34952 -11,4: - 5: 224 - 6: 57344 + 6: 224 + 3: 57344 -11,5: - 6: 57568 + 3: 57568 -11,8: 2: 65535 -10,6: @@ -7499,11 +7499,11 @@ entities: -9,-13: 0: 4095 -7,-15: - 6: 61184 + 3: 61184 -7,-14: 0: 32752 -6,-15: - 6: 256 + 3: 256 0: 32768 -6,-14: 0: 65528 @@ -7535,7 +7535,7 @@ entities: -10,-16: 0: 8704 -10,-17: - 6: 49152 + 3: 49152 -16,-7: 2: 52416 -16,-6: @@ -7560,7 +7560,7 @@ entities: 0: 52416 -15,-9: 0: 34952 - 6: 256 + 3: 256 -14,-8: 0: 49080 -14,-7: @@ -7580,31 +7580,31 @@ entities: -13,-7: 0: 26214 -16,-12: - 6: 32 + 3: 32 -16,-11: - 6: 32768 + 3: 32768 -16,-10: - 6: 8 + 3: 8 -15,-11: - 6: 13036 + 3: 13036 0: 32768 -15,-10: - 6: 307 + 3: 307 0: 34952 -15,-12: - 6: 51336 + 3: 51336 -14,-12: - 6: 4607 + 3: 4607 0: 49152 -14,-11: - 6: 17 + 3: 17 0: 61644 -14,-10: 0: 65535 -14,-13: - 6: 59392 + 3: 59392 -13,-13: - 6: 4352 + 3: 4352 0: 1604 8,9: 0: 65535 @@ -7807,9 +7807,9 @@ entities: 14,-9: 0: 36623 15,-8: - 6: 16 + 3: 16 15,-6: - 6: 16 + 3: 16 0: 4096 2: 32768 15,-9: @@ -7817,16 +7817,16 @@ entities: 16,-5: 2: 304 12,-11: - 6: 32772 + 3: 32772 12,-12: 2: 12 12,-13: 2: 52303 13,-12: 2: 15 - 6: 16384 + 3: 16384 13,-11: - 6: 65228 + 3: 65228 13,-10: 0: 65520 13,-13: @@ -7834,7 +7834,7 @@ entities: 14,-12: 2: 15 14,-11: - 6: 65521 + 3: 65521 14,-10: 0: 65520 14,-13: @@ -7842,14 +7842,14 @@ entities: 15,-12: 2: 1 15,-11: - 6: 28688 + 3: 28688 15,-10: 0: 4368 - 6: 52420 + 3: 52420 15,-13: 2: 4511 16,-10: - 6: 19 + 3: 19 -4,9: 0: 7421 -5,9: @@ -7864,13 +7864,13 @@ entities: 0: 32767 -4,12: 0: 34945 - 6: 13072 + 3: 13072 -3,9: 0: 4095 -3,10: 0: 65535 -3,11: - 6: 61408 + 3: 61408 -2,9: 0: 4095 -2,10: @@ -7914,7 +7914,7 @@ entities: 0: 65535 -5,12: 0: 13111 - 6: 34816 + 3: 34816 -12,9: 2: 65497 -13,9: @@ -7923,19 +7923,19 @@ entities: 2: 52428 -11,9: 2: 4607 - 6: 49152 + 3: 49152 -11,10: 2: 33041 - 6: 204 + 3: 204 -12,11: 2: 136 -11,11: 2: 248 -10,9: 2: 52479 - 6: 4096 + 3: 4096 -10,10: - 6: 17 + 3: 17 2: 34952 -10,11: 2: 2296 @@ -7988,14 +7988,14 @@ entities: 2: 49 -5,13: 0: 51 - 6: 51208 + 3: 51208 -5,14: - 6: 264 + 3: 264 -4,13: - 6: 29443 + 3: 29443 0: 136 -4,14: - 6: 3 + 3: 3 -3,12: 0: 65520 -3,13: @@ -8051,7 +8051,7 @@ entities: 2: 1228 5,13: 0: 8738 - 6: 136 + 3: 136 5,14: 0: 546 2: 16384 @@ -8225,7 +8225,7 @@ entities: -15,-16: 2: 65520 -15,-13: - 6: 64 + 3: 64 -14,-16: 2: 24404 -14,-15: @@ -8337,7 +8337,7 @@ entities: -10,-19: 2: 4096 -10,-18: - 6: 4 + 3: 4 -18,-12: 2: 68 -18,-13: @@ -8456,6 +8456,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -8501,21 +8516,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -12537,7 +12537,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28923: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 8505 components: - type: Transform @@ -12548,7 +12549,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28923: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 8506 components: - type: Transform @@ -12559,7 +12561,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28922: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 8507 components: - type: Transform @@ -12570,7 +12573,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28922: - - DoorStatus: InputA + - - DoorStatus + - InputA - proto: AirlockAtmosphericsLocked entities: - uid: 8143 @@ -12659,7 +12663,7 @@ entities: pos: 38.5,-9.5 parent: 2 - type: Door - secondsUntilStateChange: -96552.94 + secondsUntilStateChange: -96624.1 state: Opening - type: DeviceLinkSource lastSignals: @@ -13169,7 +13173,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13107: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13142 components: - type: Transform @@ -13180,7 +13185,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13106: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15503 components: - type: Transform @@ -13192,7 +13198,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18882: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18896 components: - type: Transform @@ -13204,7 +13211,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15562: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 29618 components: - type: Transform @@ -13215,7 +13223,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28756: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassAtmosphericsLocked entities: - uid: 8424 @@ -13229,7 +13238,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8431: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8431 components: - type: Transform @@ -13241,7 +13251,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8424: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 28436 components: - type: Transform @@ -13253,13 +13264,17 @@ entities: - type: DeviceLinkSource linkedPorts: 8507: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 8506: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 8505: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 8504: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassCargoLocked entities: - uid: 11331 @@ -13272,7 +13287,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11335: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11332 components: - type: Transform @@ -13283,7 +13299,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11336: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 29523 components: - type: Transform @@ -13295,10 +13312,13 @@ entities: - type: DeviceLinkSource linkedPorts: 827: - - DoorStatus: InputB + - - DoorStatus + - InputB 29543: - - DoorStatus: InputA - - DoorStatus: InputB + - - DoorStatus + - InputA + - - DoorStatus + - InputB - uid: 29528 components: - type: Transform @@ -13309,9 +13329,11 @@ entities: - type: DeviceLinkSource linkedPorts: 29536: - - DoorStatus: InputA + - - DoorStatus + - InputA 29539: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 29532 components: - type: Transform @@ -13323,9 +13345,11 @@ entities: - type: DeviceLinkSource linkedPorts: 29538: - - DoorStatus: InputA + - - DoorStatus + - InputA 29534: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 29541 components: - type: Transform @@ -13337,10 +13361,13 @@ entities: - type: DeviceLinkSource linkedPorts: 29542: - - DoorStatus: InputA - - DoorStatus: InputB + - - DoorStatus + - InputA + - - DoorStatus + - InputB 826: - - DoorStatus: InputB + - - DoorStatus + - InputB - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 234 @@ -13353,7 +13380,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3673: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 437 components: - type: Transform @@ -13364,7 +13392,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3673: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3673 components: - type: Transform @@ -13375,9 +13404,11 @@ entities: - type: DeviceLinkSource linkedPorts: 234: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 437: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3888 components: - type: Transform @@ -13388,7 +13419,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3902: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3902 components: - type: Transform @@ -13399,7 +13431,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3888: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6828 components: - type: Transform @@ -13408,7 +13441,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6829: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6829 components: - type: Transform @@ -13417,7 +13451,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6828: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7615 components: - type: Transform @@ -13427,7 +13462,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7623: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7621 components: - type: Transform @@ -13437,7 +13473,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7622: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7622 components: - type: Transform @@ -13447,7 +13484,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7621: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7623 components: - type: Transform @@ -13457,7 +13495,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7615: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7830 components: - type: Transform @@ -13469,7 +13508,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8048: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8048 components: - type: Transform @@ -13481,7 +13521,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7830: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8052 components: - type: Transform @@ -13493,7 +13534,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8053: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8053 components: - type: Transform @@ -13505,7 +13547,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8052: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13059 components: - type: Transform @@ -13523,7 +13566,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19974: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19974 components: - type: Transform @@ -13535,7 +13579,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19973: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 29371 components: - type: Transform @@ -13558,7 +13603,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3867: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3783 components: - type: Transform @@ -13568,7 +13614,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3778: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3867 components: - type: Transform @@ -13608,7 +13655,8 @@ entities: - type: DeviceLinkSource linkedPorts: 555: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18430 components: - type: Transform @@ -13620,7 +13668,8 @@ entities: - type: DeviceLinkSource linkedPorts: 353: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19233 components: - type: Transform @@ -13632,7 +13681,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24274: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20084 components: - type: Transform @@ -13650,7 +13700,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22785: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22785 components: - type: Transform @@ -13660,7 +13711,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22784: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24274 components: - type: Transform @@ -13672,7 +13724,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19233: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24599 components: - type: Transform @@ -13683,7 +13736,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24609: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24600 components: - type: Transform @@ -13695,9 +13749,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24601: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24606: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24606 components: - type: Transform @@ -13709,9 +13765,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24601: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24600: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24609 components: - type: Transform @@ -13722,7 +13780,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24599: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24630 components: - type: Transform @@ -13768,9 +13827,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5762: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 11336 @@ -13782,9 +13844,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5763: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockExternalGlassShuttleEmergencyLocked @@ -13798,9 +13863,12 @@ entities: - type: DeviceLinkSource linkedPorts: 28961: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 13107 @@ -13812,9 +13880,12 @@ entities: - type: DeviceLinkSource linkedPorts: 28962: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 15562 @@ -13826,9 +13897,12 @@ entities: - type: DeviceLinkSource linkedPorts: 28964: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 18882 @@ -13840,9 +13914,12 @@ entities: - type: DeviceLinkSource linkedPorts: 28963: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockExternalGlassShuttleEscape @@ -13875,9 +13952,12 @@ entities: - type: DeviceLinkSource linkedPorts: 28765: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockExternalGlassShuttleLocked @@ -13891,9 +13971,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5766: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 555 @@ -13905,9 +13988,12 @@ entities: - type: DeviceLinkSource linkedPorts: 6810: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 3806 @@ -13919,9 +14005,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5765: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - uid: 9992 components: - type: Transform @@ -13931,9 +14020,12 @@ entities: - type: DeviceLinkSource linkedPorts: 7856: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - uid: 9993 components: - type: Transform @@ -13943,9 +14035,12 @@ entities: - type: DeviceLinkSource linkedPorts: 7854: - - DockStatus: InputA - - DockStatus: InputB - - DoorStatus: InputA + - - DockStatus + - InputA + - - DockStatus + - InputB + - - DoorStatus + - InputA - uid: 20082 components: - type: Transform @@ -13955,9 +14050,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5764: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - uid: 21015 components: - type: Transform @@ -13979,13 +14077,18 @@ entities: - type: DeviceLinkSource linkedPorts: 277: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB 29540: - - DockStatus: InputA + - - DockStatus + - InputA 29535: - - DockStatus: InputA + - - DockStatus + - InputA - type: DeviceLinkSink invokeCounter: 1 - uid: 29530 @@ -13997,13 +14100,18 @@ entities: - type: DeviceLinkSource linkedPorts: 10843: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB 29533: - - DockStatus: InputA + - - DockStatus + - InputA 29537: - - DockStatus: InputA + - - DockStatus + - InputA - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockExternalLocked @@ -14018,9 +14126,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24600: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24606: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24613 components: - type: Transform @@ -14031,9 +14141,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24622: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24623: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24614 components: - type: Transform @@ -14044,9 +14156,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24615: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24616: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24615 components: - type: Transform @@ -14057,9 +14171,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24614: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24616: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24616 components: - type: Transform @@ -14070,9 +14186,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24614: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24615: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24617 components: - type: Transform @@ -14083,9 +14201,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24618: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24619: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24618 components: - type: Transform @@ -14096,9 +14216,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24619: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24617: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24619 components: - type: Transform @@ -14109,9 +14231,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24618: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24617: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24620 components: - type: Transform @@ -14122,7 +14246,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24621: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24621 components: - type: Transform @@ -14133,7 +14258,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24620: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24622 components: - type: Transform @@ -14144,9 +14270,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24623: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24613: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24623 components: - type: Transform @@ -14157,9 +14285,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24622: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 24613: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezerLocked entities: - uid: 423 @@ -14584,7 +14714,7 @@ entities: pos: -22.5,26.5 parent: 2 - type: Door - secondsUntilStateChange: -118605.1 + secondsUntilStateChange: -118676.266 state: Opening - type: DeviceLinkSource lastSignals: @@ -15449,7 +15579,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -217433.7 + secondsUntilStateChange: -217504.88 state: Opening - uid: 6934 components: @@ -15461,7 +15591,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -217436.33 + secondsUntilStateChange: -217507.5 state: Opening - uid: 6935 components: @@ -15473,7 +15603,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -217435.19 + secondsUntilStateChange: -217506.36 state: Opening - uid: 6936 components: @@ -15484,7 +15614,7 @@ entities: lastSignals: DoorStatus: True - type: Door - secondsUntilStateChange: -217434.4 + secondsUntilStateChange: -217505.58 state: Opening - proto: AirlockTheatreLocked entities: @@ -78935,11 +79065,6 @@ entities: - type: Transform pos: -25.5,10.5 parent: 2 - - uid: 9951 - components: - - type: Transform - pos: 8.5,-46.5 - parent: 2 - uid: 9953 components: - type: Transform @@ -79045,6 +79170,11 @@ entities: - type: Transform pos: 22.5,-32.5 parent: 2 + - uid: 30308 + components: + - type: Transform + pos: 7.5,-46.5 + parent: 2 - proto: ClosetJanitorFilled entities: - uid: 3055 @@ -97095,7 +97225,7 @@ entities: pos: -13.5,-1.5 parent: 2 - type: Door - secondsUntilStateChange: -208757.72 + secondsUntilStateChange: -208828.89 - type: DeviceNetwork deviceLists: - 18275 @@ -143115,7 +143245,7 @@ entities: pos: 36.5,-35.5 parent: 2 - type: Door - secondsUntilStateChange: -245589.52 + secondsUntilStateChange: -245660.69 state: Opening - uid: 5211 components: @@ -144162,7 +144292,8 @@ entities: - type: DeviceLinkSource linkedPorts: 683: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 23551 components: - type: MetaData @@ -144174,7 +144305,8 @@ entities: - type: DeviceLinkSource linkedPorts: 570: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 23556 components: - type: MetaData @@ -144186,7 +144318,8 @@ entities: - type: DeviceLinkSource linkedPorts: 684: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 23557 components: - type: MetaData @@ -144197,7 +144330,8 @@ entities: - type: DeviceLinkSource linkedPorts: 682: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 23558 components: - type: MetaData @@ -144208,7 +144342,8 @@ entities: - type: DeviceLinkSource linkedPorts: 681: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 23559 components: - type: MetaData @@ -144219,7 +144354,8 @@ entities: - type: DeviceLinkSource linkedPorts: 680: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: LockerAtmosphericsFilled entities: - uid: 8897 @@ -144961,7 +145097,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12066: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -144977,7 +145114,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29541: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -144993,7 +145131,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29523: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145008,7 +145147,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11297: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145024,7 +145164,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29540: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145039,7 +145180,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29539: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145055,7 +145197,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29537: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145070,7 +145213,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29538: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145087,7 +145231,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28494: - - Output: InputB + - - Output + - InputB - uid: 29543 components: - type: Transform @@ -145100,7 +145245,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29507: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145117,9 +145263,11 @@ entities: - type: DeviceLinkSource linkedPorts: 29527: - - Output: InputA + - - Output + - InputA 12066: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -145134,9 +145282,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2259: - - Output: InputA + - - Output + - InputA 11297: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -145151,7 +145301,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29528: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145166,7 +145317,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29532: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145185,7 +145337,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28924: - - Output: InputA + - - Output + - InputA - uid: 28923 components: - type: Transform @@ -145201,7 +145354,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28924: - - Output: InputB + - - Output + - InputB - uid: 28924 components: - type: Transform @@ -145217,7 +145371,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28436: - - Output: DoorBolt + - - Output + - DoorBolt - uid: 29522 components: - type: Transform @@ -145229,17 +145384,23 @@ entities: - type: DeviceLinkSource linkedPorts: 29527: - - Output: InputB + - - Output + - InputB 2259: - - Output: InputB + - - Output + - InputB 29533: - - Output: InputB + - - Output + - InputB 29535: - - Output: InputB + - - Output + - InputB 29536: - - Output: InputB + - - Output + - InputB 29534: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145255,9 +145416,11 @@ entities: - type: DeviceLinkSource linkedPorts: 29507: - - Output: InputA + - - Output + - InputA 24126: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145273,9 +145436,11 @@ entities: - type: DeviceLinkSource linkedPorts: 28494: - - Output: InputA + - - Output + - InputA 29530: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145290,7 +145455,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29531: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145306,7 +145472,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29531: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -145322,7 +145489,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29529: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -145337,7 +145505,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29529: - - Output: InputB + - - Output + - InputB - type: Physics canCollide: False bodyType: Static @@ -145354,7 +145523,8 @@ entities: - type: DeviceLinkSource linkedPorts: 827: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -145369,7 +145539,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11331: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145384,7 +145555,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11332: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145400,7 +145572,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11161: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145416,7 +145589,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20084: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145431,7 +145605,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18430: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145446,7 +145621,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12847: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145462,7 +145638,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7764: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145478,7 +145655,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7763: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145493,7 +145671,8 @@ entities: - type: DeviceLinkSource linkedPorts: 826: - - Output: InputA + - - Output + - InputA - type: Physics canCollide: False bodyType: Static @@ -145509,7 +145688,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29618: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145525,7 +145705,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13142: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145541,7 +145722,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13141: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145557,7 +145739,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15503: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145573,7 +145756,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18896: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -145707,6 +145891,13 @@ entities: - type: Transform pos: -10.5,-42.5 parent: 2 +- proto: MachineMaterialSilo + entities: + - uid: 9951 + components: + - type: Transform + pos: 8.5,-46.5 + parent: 2 - proto: MachineParticleAcceleratorEmitterForeCircuitboard entities: - uid: 11506 @@ -153521,8 +153712,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22036: - - PowerDischarging: On - - PowerCharging: Off + - - PowerDischarging + - On + - - PowerCharging + - Off - proto: PresentRandomCash entities: - uid: 9641 @@ -160714,9 +160907,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16922: - - Pressed: Toggle + - - Pressed + - Toggle 17256: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4246 components: - type: MetaData @@ -160727,7 +160922,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3921: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6115 components: - type: MetaData @@ -160738,9 +160934,11 @@ entities: - type: DeviceLinkSource linkedPorts: 6114: - - Pressed: Toggle + - - Pressed + - Toggle 6113: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9928 components: - type: Transform @@ -162103,7 +162301,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29522: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 29574 components: - type: Transform @@ -162112,7 +162311,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29522: - - DoorStatus: InputB + - - DoorStatus + - InputB - proto: ShuttersWindowOpen entities: - uid: 742 @@ -162227,11 +162427,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5586: - - Pressed: Toggle + - - Pressed + - Toggle 5585: - - Pressed: Toggle + - - Pressed + - Toggle 5584: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 872 components: - type: Transform @@ -162241,13 +162444,17 @@ entities: - type: DeviceLinkSource linkedPorts: 923: - - Pressed: Toggle + - - Pressed + - Toggle 922: - - Pressed: Toggle + - - Pressed + - Toggle 921: - - Pressed: Toggle + - - Pressed + - Toggle 920: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 928 components: - type: MetaData @@ -162258,13 +162465,17 @@ entities: - type: DeviceLinkSource linkedPorts: 924: - - Pressed: Toggle + - - Pressed + - Toggle 925: - - Pressed: Toggle + - - Pressed + - Toggle 926: - - Pressed: Toggle + - - Pressed + - Toggle 927: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1014 components: - type: MetaData @@ -162276,7 +162487,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1050: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1628 components: - type: Transform @@ -162286,17 +162498,23 @@ entities: - type: DeviceLinkSource linkedPorts: 1502: - - Pressed: Toggle + - - Pressed + - Toggle 1501: - - Pressed: Toggle + - - Pressed + - Toggle 742: - - Pressed: Toggle + - - Pressed + - Toggle 1619: - - Pressed: Toggle + - - Pressed + - Toggle 1620: - - Pressed: Toggle + - - Pressed + - Toggle 1621: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1629 components: - type: MetaData @@ -162308,17 +162526,23 @@ entities: - type: DeviceLinkSource linkedPorts: 1622: - - Pressed: Toggle + - - Pressed + - Toggle 1623: - - Pressed: Toggle + - - Pressed + - Toggle 1624: - - Pressed: Toggle + - - Pressed + - Toggle 1625: - - Pressed: Toggle + - - Pressed + - Toggle 1626: - - Pressed: Toggle + - - Pressed + - Toggle 1627: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1919 components: - type: MetaData @@ -162330,7 +162554,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7999: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1920 components: - type: MetaData @@ -162342,7 +162567,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8000: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2694 components: - type: MetaData @@ -162354,9 +162580,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2602: - - Pressed: Toggle + - - Pressed + - Toggle 2603: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2696 components: - type: MetaData @@ -162368,11 +162596,14 @@ entities: - type: DeviceLinkSource linkedPorts: 2600: - - Pressed: Toggle + - - Pressed + - Toggle 2601: - - Pressed: Toggle + - - Pressed + - Toggle 5742: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2735 components: - type: MetaData @@ -162384,7 +162615,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2733: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3701 components: - type: Transform @@ -162394,11 +162626,14 @@ entities: - type: DeviceLinkSource linkedPorts: 30094: - - Pressed: Toggle + - - Pressed + - Toggle 30095: - - Pressed: Toggle + - - Pressed + - Toggle 30093: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3800 components: - type: MetaData @@ -162410,9 +162645,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3799: - - Pressed: Toggle + - - Pressed + - Toggle 5217: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3892 components: - type: MetaData @@ -162424,7 +162661,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3810: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4033 components: - type: MetaData @@ -162436,7 +162674,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4035: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4168 components: - type: MetaData @@ -162448,7 +162687,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4167: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6175 components: - type: MetaData @@ -162460,9 +162700,11 @@ entities: - type: DeviceLinkSource linkedPorts: 17256: - - Pressed: Toggle + - - Pressed + - Toggle 16922: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6481 components: - type: MetaData @@ -162474,11 +162716,14 @@ entities: - type: DeviceLinkSource linkedPorts: 6394: - - Pressed: Toggle + - - Pressed + - Toggle 6395: - - Pressed: Toggle + - - Pressed + - Toggle 6480: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6652 components: - type: MetaData @@ -162489,19 +162734,26 @@ entities: - type: DeviceLinkSource linkedPorts: 6606: - - Pressed: Toggle + - - Pressed + - Toggle 6607: - - Pressed: Toggle + - - Pressed + - Toggle 6608: - - Pressed: Toggle + - - Pressed + - Toggle 6609: - - Pressed: Toggle + - - Pressed + - Toggle 6610: - - Pressed: Toggle + - - Pressed + - Toggle 6614: - - Pressed: Toggle + - - Pressed + - Toggle 6615: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7696 components: - type: MetaData @@ -162513,11 +162765,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7190: - - Pressed: Toggle + - - Pressed + - Toggle 7191: - - Pressed: Toggle + - - Pressed + - Toggle 7192: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7697 components: - type: MetaData @@ -162529,11 +162784,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7189: - - Pressed: Toggle + - - Pressed + - Toggle 7188: - - Pressed: Toggle + - - Pressed + - Toggle 7042: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7698 components: - type: MetaData @@ -162545,11 +162803,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7340: - - Pressed: Toggle + - - Pressed + - Toggle 7339: - - Pressed: Toggle + - - Pressed + - Toggle 7338: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7706 components: - type: MetaData @@ -162561,13 +162822,17 @@ entities: - type: DeviceLinkSource linkedPorts: 7336: - - Pressed: Toggle + - - Pressed + - Toggle 7337: - - Pressed: Toggle + - - Pressed + - Toggle 7334: - - Pressed: Toggle + - - Pressed + - Toggle 7335: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7865 components: - type: MetaData @@ -162578,11 +162843,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7862: - - Pressed: Toggle + - - Pressed + - Toggle 7861: - - Pressed: Toggle + - - Pressed + - Toggle 7860: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8947 components: - type: MetaData @@ -162594,13 +162862,17 @@ entities: - type: DeviceLinkSource linkedPorts: 8941: - - Pressed: Toggle + - - Pressed + - Toggle 1125: - - Pressed: Toggle + - - Pressed + - Toggle 6576: - - Pressed: Toggle + - - Pressed + - Toggle 6226: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9642 components: - type: MetaData @@ -162612,11 +162884,14 @@ entities: - type: DeviceLinkSource linkedPorts: 9640: - - Pressed: Toggle + - - Pressed + - Toggle 9639: - - Pressed: Toggle + - - Pressed + - Toggle 9638: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9774 components: - type: MetaData @@ -162628,7 +162903,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16239: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9775 components: - type: Transform @@ -162646,7 +162922,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9718: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9782 components: - type: MetaData @@ -162658,15 +162935,20 @@ entities: - type: DeviceLinkSource linkedPorts: 9769: - - Pressed: Toggle + - - Pressed + - Toggle 9770: - - Pressed: Toggle + - - Pressed + - Toggle 9771: - - Pressed: Toggle + - - Pressed + - Toggle 9855: - - Pressed: Toggle + - - Pressed + - Toggle 9773: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10078 components: - type: MetaData @@ -162678,7 +162960,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9715: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10222 components: - type: Transform @@ -162688,11 +162971,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7794: - - Pressed: Toggle + - - Pressed + - Toggle 7762: - - Pressed: Toggle + - - Pressed + - Toggle 10164: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10393 components: - type: MetaData @@ -162704,11 +162990,14 @@ entities: - type: DeviceLinkSource linkedPorts: 10312: - - Pressed: Toggle + - - Pressed + - Toggle 9965: - - Pressed: Toggle + - - Pressed + - Toggle 10308: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 10588 components: - type: MetaData @@ -162719,11 +163008,14 @@ entities: - type: DeviceLinkSource linkedPorts: 10589: - - Pressed: Toggle + - - Pressed + - Toggle 10590: - - Pressed: Toggle + - - Pressed + - Toggle 10591: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11339 components: - type: MetaData @@ -162735,9 +163027,11 @@ entities: - type: DeviceLinkSource linkedPorts: 11338: - - Pressed: Toggle + - - Pressed + - Toggle 11337: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11986 components: - type: Transform @@ -162747,9 +163041,11 @@ entities: - type: DeviceLinkSource linkedPorts: 29526: - - Pressed: Toggle + - - Pressed + - Toggle 29574: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 12804 components: - type: MetaData @@ -162761,11 +163057,14 @@ entities: - type: DeviceLinkSource linkedPorts: 12801: - - Pressed: Toggle + - - Pressed + - Toggle 12802: - - Pressed: Toggle + - - Pressed + - Toggle 12803: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13038 components: - type: MetaData @@ -162777,17 +163076,23 @@ entities: - type: DeviceLinkSource linkedPorts: 12956: - - Pressed: Toggle + - - Pressed + - Toggle 12955: - - Pressed: Toggle + - - Pressed + - Toggle 12774: - - Pressed: Toggle + - - Pressed + - Toggle 20644: - - Pressed: Toggle + - - Pressed + - Toggle 20255: - - Pressed: Toggle + - - Pressed + - Toggle 20268: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15291 components: - type: Transform @@ -162797,11 +163102,14 @@ entities: - type: DeviceLinkSource linkedPorts: 8458: - - Pressed: Toggle + - - Pressed + - Toggle 8459: - - Pressed: Toggle + - - Pressed + - Toggle 8460: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 18372 components: - type: MetaData @@ -162813,7 +163121,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23781: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 18469 components: - type: Transform @@ -162822,9 +163131,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12261: - - Pressed: Toggle + - - Pressed + - Toggle 12830: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 18694 components: - type: MetaData @@ -162836,23 +163147,32 @@ entities: - type: DeviceLinkSource linkedPorts: 11555: - - Pressed: Toggle + - - Pressed + - Toggle 11554: - - Pressed: Toggle + - - Pressed + - Toggle 24136: - - Pressed: Toggle + - - Pressed + - Toggle 24134: - - Pressed: Toggle + - - Pressed + - Toggle 24135: - - Pressed: Toggle + - - Pressed + - Toggle 24145: - - Pressed: Toggle + - - Pressed + - Toggle 24147: - - Pressed: Toggle + - - Pressed + - Toggle 17900: - - Pressed: Toggle + - - Pressed + - Toggle 28363: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 21063 components: - type: MetaData @@ -162872,7 +163192,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21068: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 21223 components: - type: MetaData @@ -162884,15 +163205,20 @@ entities: - type: DeviceLinkSource linkedPorts: 9854: - - Pressed: Toggle + - - Pressed + - Toggle 9772: - - Pressed: Toggle + - - Pressed + - Toggle 9768: - - Pressed: Toggle + - - Pressed + - Toggle 9767: - - Pressed: Toggle + - - Pressed + - Toggle 9766: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23768 components: - type: MetaData @@ -162904,7 +163230,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23766: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23771 components: - type: MetaData @@ -162915,7 +163242,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23770: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23773 components: - type: MetaData @@ -162927,7 +163255,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23772: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23774 components: - type: MetaData @@ -162941,7 +163270,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23762: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23775 components: - type: MetaData @@ -162953,7 +163283,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23761: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23776 components: - type: MetaData @@ -162964,7 +163295,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24128: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23777 components: - type: MetaData @@ -162976,7 +163308,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23763: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23778 components: - type: MetaData @@ -162988,7 +163321,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23764: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23779 components: - type: MetaData @@ -162999,7 +163333,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16214: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23782 components: - type: MetaData @@ -163010,13 +163345,17 @@ entities: - type: DeviceLinkSource linkedPorts: 3534: - - Pressed: Toggle + - - Pressed + - Toggle 3535: - - Pressed: Toggle + - - Pressed + - Toggle 3536: - - Pressed: Toggle + - - Pressed + - Toggle 3537: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23785 components: - type: MetaData @@ -163028,7 +163367,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23784: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23829 components: - type: MetaData @@ -163040,7 +163380,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16797: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24149 components: - type: MetaData @@ -163052,21 +163393,29 @@ entities: - type: DeviceLinkSource linkedPorts: 24140: - - Pressed: Toggle + - - Pressed + - Toggle 24142: - - Pressed: Toggle + - - Pressed + - Toggle 11306: - - Pressed: Toggle + - - Pressed + - Toggle 11305: - - Pressed: Toggle + - - Pressed + - Toggle 11304: - - Pressed: Toggle + - - Pressed + - Toggle 11303: - - Pressed: Toggle + - - Pressed + - Toggle 11302: - - Pressed: Toggle + - - Pressed + - Toggle 11301: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24218 components: - type: MetaData @@ -163077,11 +163426,14 @@ entities: - type: DeviceLinkSource linkedPorts: 18581: - - Pressed: Toggle + - - Pressed + - Toggle 11982: - - Pressed: Toggle + - - Pressed + - Toggle 20831: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24278 components: - type: MetaData @@ -163093,23 +163445,32 @@ entities: - type: DeviceLinkSource linkedPorts: 3531: - - Pressed: Toggle + - - Pressed + - Toggle 3530: - - Pressed: Toggle + - - Pressed + - Toggle 3529: - - Pressed: Toggle + - - Pressed + - Toggle 2365: - - Pressed: Toggle + - - Pressed + - Toggle 2366: - - Pressed: Toggle + - - Pressed + - Toggle 2367: - - Pressed: Toggle + - - Pressed + - Toggle 2368: - - Pressed: Toggle + - - Pressed + - Toggle 2369: - - Pressed: Toggle + - - Pressed + - Toggle 2370: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 28321 components: - type: MetaData @@ -163120,11 +163481,14 @@ entities: - type: DeviceLinkSource linkedPorts: 28326: - - Pressed: Toggle + - - Pressed + - Toggle 28407: - - Pressed: Toggle + - - Pressed + - Toggle 29923: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 28356 components: - type: MetaData @@ -163136,7 +163500,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12133: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 28357 components: - type: MetaData @@ -163148,7 +163513,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12132: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 28358 components: - type: MetaData @@ -163160,7 +163526,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12131: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 28868 components: - type: MetaData @@ -163172,7 +163539,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29962: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 28874 components: - type: MetaData @@ -163183,7 +163551,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3764: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 28878 components: - type: MetaData @@ -163195,7 +163564,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23642: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 28900 components: - type: MetaData @@ -163206,11 +163576,14 @@ entities: - type: DeviceLinkSource linkedPorts: 9296: - - Pressed: Toggle + - - Pressed + - Toggle 9294: - - Pressed: Toggle + - - Pressed + - Toggle 9295: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 29782 components: - type: MetaData @@ -163222,9 +163595,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1384: - - Pressed: Open + - - Pressed + - Open 1378: - - Pressed: Open + - - Pressed + - Open - proto: SignAnomaly entities: - uid: 16793 @@ -174613,37 +174988,61 @@ entities: - type: DeviceLinkSource linkedPorts: 29014: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off 29007: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off 29008: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off 29009: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off 29010: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off 29011: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off 29012: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off 29013: - - Left: Forward - - Right: Forward - - Middle: Off + - - Left + - Forward + - - Right + - Forward + - - Middle + - Off - uid: 11354 components: - type: Transform @@ -174652,29 +175051,47 @@ entities: - type: DeviceLinkSource linkedPorts: 11358: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11345: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11346: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11348: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11349: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11352: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11355 components: - type: Transform @@ -174683,29 +175100,47 @@ entities: - type: DeviceLinkSource linkedPorts: 11357: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11344: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11353: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11350: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11347: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11356: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 12098 components: - type: Transform @@ -174714,37 +175149,61 @@ entities: - type: DeviceLinkSource linkedPorts: 12097: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12096: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12095: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12094: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12092: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12093: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11660: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11659: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 16101 components: - type: MetaData @@ -174755,41 +175214,68 @@ entities: - type: DeviceLinkSource linkedPorts: 11363: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11364: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11941: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11942: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11948: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11565: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11828: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11571: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11596: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 19975 components: - type: MetaData @@ -174800,9 +175286,12 @@ entities: - type: DeviceLinkSource linkedPorts: 23797: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 29268 components: - type: Transform @@ -174811,61 +175300,103 @@ entities: - type: DeviceLinkSource linkedPorts: 29511: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 20597: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 29512: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 29513: - - Right: Reverse - - Middle: Off - - Left: Off + - - Right + - Reverse + - - Middle + - Off + - - Left + - Off 29514: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11361: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11325: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 24001: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 29515: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 29516: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 29517: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11990: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 29508: - - Left: Forward - - Right: Off - - Middle: Off + - - Left + - Forward + - - Right + - Off + - - Middle + - Off 11382: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 9643 @@ -196161,7 +196692,7 @@ entities: pos: 24.5,2.5 parent: 21002 - type: Door - secondsUntilStateChange: -590794.1 + secondsUntilStateChange: -590865.3 state: Opening - uid: 28863 components: From 9bdba76f678236a044215e19141b1425c855a48b Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 12:48:50 +0200 Subject: [PATCH 365/622] init --- Resources/Maps/bagel.yml | 1775 +++++++++++++++++++++++++------------- 1 file changed, 1172 insertions(+), 603 deletions(-) diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index 88d2565dd2..7b74ac605f 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/14/2025 14:08:28 - entityCount: 25721 + time: 04/19/2025 10:44:14 + entityCount: 25722 maps: - 943 grids: @@ -11586,7 +11586,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18404: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 18404 components: - type: MetaData @@ -11597,7 +11598,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18403: - - DoorStatus: Close + - - DoorStatus + - Close - proto: AirlockCommandLocked entities: - uid: 5803 @@ -11630,7 +11632,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18076: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18125 components: - type: MetaData @@ -11700,7 +11703,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5859: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 15490 components: - type: MetaData @@ -11860,7 +11864,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13627: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13627 components: - type: Transform @@ -11871,7 +11876,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12194: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 97 @@ -11936,7 +11942,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4889: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 5085 components: - type: Transform @@ -11967,7 +11974,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6673: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5406 components: - type: Transform @@ -12012,7 +12020,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7332: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7345 components: - type: Transform @@ -12055,7 +12064,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12706: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12706 components: - type: Transform @@ -12064,7 +12074,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8358: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13183 components: - type: Transform @@ -12085,7 +12096,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3335: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3335 components: - type: Transform @@ -12094,7 +12106,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3334: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5497 components: - type: Transform @@ -12103,7 +12116,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7692: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7692 components: - type: Transform @@ -12112,7 +12126,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5497: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15525 components: - type: MetaData @@ -12142,7 +12157,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25540: - - DoorStatus: InputB + - - DoorStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 16412 @@ -12153,7 +12169,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25540: - - DoorStatus: InputA + - - DoorStatus + - InputA - type: DeviceLinkSink invokeCounter: 1 - uid: 16422 @@ -12166,7 +12183,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25541: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 16432 components: - type: Transform @@ -12177,7 +12195,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25541: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 16435 components: - type: Transform @@ -12188,7 +12207,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25538: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 16439 components: - type: Transform @@ -12199,7 +12219,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25538: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 16454 components: - type: Transform @@ -12210,7 +12231,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25536: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 16508 components: - type: Transform @@ -12221,7 +12243,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25536: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 17481 components: - type: Transform @@ -12230,7 +12253,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17490: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17490 components: - type: Transform @@ -12239,7 +12263,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17481: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20107 components: - type: Transform @@ -12248,7 +12273,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20108: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20108 components: - type: Transform @@ -12257,7 +12283,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20107: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20550 components: - type: Transform @@ -12278,7 +12305,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3080: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3080 components: - type: Transform @@ -12287,7 +12315,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3071: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4595 components: - type: Transform @@ -12296,7 +12325,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4596: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4596 components: - type: Transform @@ -12305,7 +12335,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4595: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6673 components: - type: Transform @@ -12314,7 +12345,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5312: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7362 components: - type: Transform @@ -12325,7 +12357,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7364: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 8522 components: - type: Transform @@ -12334,7 +12367,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3900: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10940 components: - type: Transform @@ -12343,7 +12377,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10942: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10942 components: - type: Transform @@ -12352,7 +12387,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10940: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12842 components: - type: Transform @@ -12361,7 +12397,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12584: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19087 components: - type: Transform @@ -12372,7 +12409,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25634: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21235 components: - type: Transform @@ -12381,7 +12419,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21236: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21236 components: - type: Transform @@ -12390,7 +12429,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21235: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22426 components: - type: Transform @@ -12399,9 +12439,11 @@ entities: - type: DeviceLinkSource linkedPorts: 22428: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 22429: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22427 components: - type: Transform @@ -12410,9 +12452,11 @@ entities: - type: DeviceLinkSource linkedPorts: 22429: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 22428: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22428 components: - type: Transform @@ -12421,9 +12465,11 @@ entities: - type: DeviceLinkSource linkedPorts: 22427: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 22426: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22429 components: - type: Transform @@ -12432,9 +12478,11 @@ entities: - type: DeviceLinkSource linkedPorts: 22427: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 22426: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24098 components: - type: Transform @@ -12445,7 +12493,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1435: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 25634 components: - type: Transform @@ -12457,7 +12506,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19087: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 5137 @@ -12564,7 +12614,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4890: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 5405 @@ -12607,7 +12658,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7362: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 7525 @@ -12669,7 +12721,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24098: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2167 components: - type: Transform @@ -12680,7 +12733,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2418: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2418 components: - type: Transform @@ -12691,7 +12745,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2167: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3900 components: - type: Transform @@ -12700,7 +12755,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8522: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11630 components: - type: Transform @@ -12709,7 +12765,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11631: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11631 components: - type: Transform @@ -12718,7 +12775,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11630: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18076 components: - type: Transform @@ -12727,7 +12785,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18033: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalShuttleSyndicateLocked entities: - uid: 8065 @@ -13990,7 +14049,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7316: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt lastSignals: DoorStatus: False DockStatus: True @@ -14005,7 +14065,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12842: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockSyndicateGlassLocked entities: - uid: 5333 @@ -14077,7 +14138,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2970: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2970 components: - type: Transform @@ -14086,7 +14148,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2963: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirSensor entities: - uid: 109 @@ -17736,9 +17799,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1483: - - Start: Close - - Timer: Open - - Timer: AutoClose + - - Start + - Close + - - Timer + - Open + - - Timer + - AutoClose - uid: 1853 components: - type: MetaData @@ -17750,9 +17816,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1548: - - Start: Close - - Timer: Open - - Timer: AutoClose + - - Start + - Close + - - Timer + - Open + - - Timer + - AutoClose - uid: 9058 components: - type: MetaData @@ -17764,9 +17833,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1555: - - Start: Close - - Timer: Open - - Timer: AutoClose + - - Start + - Close + - - Timer + - Open + - - Timer + - AutoClose - uid: 9158 components: - type: MetaData @@ -17778,9 +17850,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1487: - - Start: Close - - Timer: Open - - Timer: AutoClose + - - Start + - Close + - - Timer + - Open + - - Timer + - AutoClose - proto: BrokenBottle entities: - uid: 23662 @@ -61951,29 +62026,11 @@ entities: - type: Transform pos: -1.5,33.5 parent: 60 - - uid: 17154 + - uid: 22139 components: - type: Transform - pos: -51.5,-4.5 + pos: -53.5,4.5 parent: 60 - - type: EntityStorage - air: - volume: 200 - immutable: False - temperature: 293.1496 - moles: - - 1.6495836 - - 6.2055764 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - uid: 23417 components: - type: Transform @@ -63983,7 +64040,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9442: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - uid: 24680 components: - type: Transform @@ -63992,7 +64050,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9570: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 13949 @@ -114173,21 +114232,29 @@ entities: - type: DeviceLinkSource linkedPorts: 21783: - - Pressed: Toggle + - - Pressed + - Toggle 21784: - - Pressed: Toggle + - - Pressed + - Toggle 21785: - - Pressed: Toggle + - - Pressed + - Toggle 5306: - - Pressed: Toggle + - - Pressed + - Toggle 14432: - - Pressed: Toggle + - - Pressed + - Toggle 20723: - - Pressed: Toggle + - - Pressed + - Toggle 16505: - - Pressed: Toggle + - - Pressed + - Toggle 16020: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 859 @@ -114201,9 +114268,11 @@ entities: - type: DeviceLinkSource linkedPorts: 6832: - - Pressed: Open + - - Pressed + - Open 94: - - Pressed: Open + - - Pressed + - Open - uid: 25271 components: - type: Transform @@ -114213,15 +114282,20 @@ entities: - type: DeviceLinkSource linkedPorts: 24366: - - Pressed: Toggle + - - Pressed + - Toggle 24367: - - Pressed: Toggle + - - Pressed + - Toggle 24368: - - Pressed: Toggle + - - Pressed + - Toggle 24369: - - Pressed: Toggle + - - Pressed + - Toggle 24372: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonSecurity entities: - uid: 25410 @@ -114233,9 +114307,11 @@ entities: - type: DeviceLinkSource linkedPorts: 25409: - - Pressed: Toggle + - - Pressed + - Toggle 6207: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilledHardsuit entities: - uid: 15401 @@ -115015,9 +115091,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16432: - - Output: DoorBolt + - - Output + - DoorBolt 16422: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -115032,9 +115110,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16412: - - Output: DoorBolt + - - Output + - DoorBolt 16407: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -115049,9 +115129,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16435: - - Output: DoorBolt + - - Output + - DoorBolt 16439: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -115066,9 +115148,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16454: - - Output: DoorBolt + - - Output + - DoorBolt 16508: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -115161,6 +115245,13 @@ entities: - type: Transform pos: 4.5,-44.5 parent: 60 +- proto: MachineMaterialSilo + entities: + - uid: 17154 + components: + - type: Transform + pos: -51.5,-4.5 + parent: 60 - proto: MagazineLightRifle entities: - uid: 1863 @@ -128261,11 +128352,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7697: - - Pressed: Toggle + - - Pressed + - Toggle 914: - - Pressed: Toggle + - - Pressed + - Toggle 920: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23871 components: - type: MetaData @@ -128276,11 +128370,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7697: - - Pressed: Toggle + - - Pressed + - Toggle 914: - - Pressed: Toggle + - - Pressed + - Toggle 920: - - Pressed: Toggle + - - Pressed + - Toggle - proto: ResearchAndDevelopmentServer entities: - uid: 8499 @@ -129505,9 +129602,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2608: - - Pressed: Toggle + - - Pressed + - Toggle 2408: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3803 components: - type: MetaData @@ -129519,7 +129618,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7729: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 5346 components: - type: Transform @@ -129529,19 +129629,26 @@ entities: - type: DeviceLinkSource linkedPorts: 5361: - - Pressed: Toggle + - - Pressed + - Toggle 5344: - - Pressed: Toggle + - - Pressed + - Toggle 5360: - - Pressed: Toggle + - - Pressed + - Toggle 5358: - - Pressed: Toggle + - - Pressed + - Toggle 5352: - - Pressed: Toggle + - - Pressed + - Toggle 5359: - - Pressed: Toggle + - - Pressed + - Toggle 5345: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7746 components: - type: MetaData @@ -129552,7 +129659,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7728: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14913 components: - type: Transform @@ -129561,7 +129669,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15089: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14914 components: - type: Transform @@ -129570,7 +129679,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15089: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15424 components: - type: MetaData @@ -129581,11 +129691,14 @@ entities: - type: DeviceLinkSource linkedPorts: 16978: - - Pressed: Toggle + - - Pressed + - Toggle 16980: - - Pressed: Toggle + - - Pressed + - Toggle 16979: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15426 components: - type: MetaData @@ -129596,11 +129709,14 @@ entities: - type: DeviceLinkSource linkedPorts: 16977: - - Pressed: Toggle + - - Pressed + - Toggle 16976: - - Pressed: Toggle + - - Pressed + - Toggle 16973: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 1240 @@ -129612,13 +129728,17 @@ entities: - type: DeviceLinkSource linkedPorts: 21340: - - Pressed: Toggle + - - Pressed + - Toggle 21341: - - Pressed: Toggle + - - Pressed + - Toggle 21342: - - Pressed: Toggle + - - Pressed + - Toggle 1631: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1603 components: - type: Transform @@ -129627,11 +129747,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4487: - - Pressed: Toggle + - - Pressed + - Toggle 4496: - - Pressed: Toggle + - - Pressed + - Toggle 4355: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2287 components: - type: Transform @@ -129640,23 +129763,32 @@ entities: - type: DeviceLinkSource linkedPorts: 2250: - - Pressed: Toggle + - - Pressed + - Toggle 14208: - - Pressed: Toggle + - - Pressed + - Toggle 16129: - - Pressed: Toggle + - - Pressed + - Toggle 2381: - - Pressed: Toggle + - - Pressed + - Toggle 12303: - - Pressed: Toggle + - - Pressed + - Toggle 16134: - - Pressed: Toggle + - - Pressed + - Toggle 3106: - - Pressed: Toggle + - - Pressed + - Toggle 17671: - - Pressed: Toggle + - - Pressed + - Toggle 4045: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2511 components: - type: MetaData @@ -129668,7 +129800,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14521: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 2625 components: - type: MetaData @@ -129680,23 +129813,32 @@ entities: - type: DeviceLinkSource linkedPorts: 6775: - - Pressed: Toggle + - - Pressed + - Toggle 6772: - - Pressed: Toggle + - - Pressed + - Toggle 6771: - - Pressed: Toggle + - - Pressed + - Toggle 6774: - - Pressed: Toggle + - - Pressed + - Toggle 6773: - - Pressed: Toggle + - - Pressed + - Toggle 4670: - - Pressed: Toggle + - - Pressed + - Toggle 4109: - - Pressed: Toggle + - - Pressed + - Toggle 3844: - - Pressed: Toggle + - - Pressed + - Toggle 3845: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2882 components: - type: Transform @@ -129706,11 +129848,14 @@ entities: - type: DeviceLinkSource linkedPorts: 3208: - - Pressed: Toggle + - - Pressed + - Toggle 7664: - - Pressed: Toggle + - - Pressed + - Toggle 21334: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9571 components: - type: Transform @@ -129719,7 +129864,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13639: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11257 components: - type: Transform @@ -129731,23 +129877,32 @@ entities: - type: DeviceLinkSource linkedPorts: 10577: - - Pressed: Toggle + - - Pressed + - Toggle 8389: - - Pressed: Toggle + - - Pressed + - Toggle 9167: - - Pressed: Toggle + - - Pressed + - Toggle 3978: - - Pressed: Toggle + - - Pressed + - Toggle 4673: - - Pressed: Toggle + - - Pressed + - Toggle 4677: - - Pressed: Toggle + - - Pressed + - Toggle 4513: - - Pressed: Toggle + - - Pressed + - Toggle 4671: - - Pressed: Toggle + - - Pressed + - Toggle 4679: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11678 components: - type: Transform @@ -129757,9 +129912,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19159: - - Pressed: Toggle + - - Pressed + - Toggle 19158: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13575 components: - type: Transform @@ -129769,21 +129926,29 @@ entities: - type: DeviceLinkSource linkedPorts: 147: - - Pressed: Toggle + - - Pressed + - Toggle 4034: - - Pressed: Toggle + - - Pressed + - Toggle 16527: - - Pressed: Toggle + - - Pressed + - Toggle 12509: - - Pressed: Toggle + - - Pressed + - Toggle 1454: - - Pressed: Toggle + - - Pressed + - Toggle 3200: - - Pressed: Toggle + - - Pressed + - Toggle 17491: - - Pressed: Toggle + - - Pressed + - Toggle 17379: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13899 components: - type: MetaData @@ -129795,7 +129960,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14444: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 14549 components: - type: Transform @@ -129805,11 +129971,14 @@ entities: - type: DeviceLinkSource linkedPorts: 8381: - - Pressed: Toggle + - - Pressed + - Toggle 8382: - - Pressed: Toggle + - - Pressed + - Toggle 5149: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14550 components: - type: Transform @@ -129819,13 +129988,17 @@ entities: - type: DeviceLinkSource linkedPorts: 7131: - - Pressed: Toggle + - - Pressed + - Toggle 5560: - - Pressed: Toggle + - - Pressed + - Toggle 7132: - - Pressed: Toggle + - - Pressed + - Toggle 21068: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14551 components: - type: Transform @@ -129835,9 +130008,11 @@ entities: - type: DeviceLinkSource linkedPorts: 14548: - - Pressed: Toggle + - - Pressed + - Toggle 14547: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14622 components: - type: MetaData @@ -129848,7 +130023,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13901: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14910 components: - type: Transform @@ -129858,11 +130034,14 @@ entities: - type: DeviceLinkSource linkedPorts: 327: - - Pressed: Toggle + - - Pressed + - Toggle 2404: - - Pressed: Toggle + - - Pressed + - Toggle 2506: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 16158 components: - type: Transform @@ -129877,11 +130056,14 @@ entities: - type: DeviceLinkSource linkedPorts: 2506: - - Pressed: Toggle + - - Pressed + - Toggle 2404: - - Pressed: Toggle + - - Pressed + - Toggle 327: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20425 components: - type: MetaData @@ -129893,7 +130075,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17459: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 20979 components: - type: MetaData @@ -129904,7 +130087,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17460: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 21386 components: - type: MetaData @@ -129916,7 +130100,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21175: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 21611 components: - type: MetaData @@ -129928,7 +130113,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17448: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 24334 components: - type: MetaData @@ -129940,7 +130126,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24333: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24347 components: - type: MetaData @@ -129952,7 +130139,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11167: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24365 components: - type: MetaData @@ -129964,7 +130152,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24337: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24787 components: - type: Transform @@ -129974,7 +130163,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24784: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24788 components: - type: Transform @@ -129984,7 +130174,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24784: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24789 components: - type: Transform @@ -129994,7 +130185,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24785: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24790 components: - type: Transform @@ -130004,7 +130196,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24785: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalSwitchDirectional entities: - uid: 1580 @@ -130020,14 +130213,20 @@ entities: - type: DeviceLinkSource linkedPorts: 1638: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1639: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 1640: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 1583 components: - type: MetaData @@ -130041,14 +130240,20 @@ entities: - type: DeviceLinkSource linkedPorts: 1293: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1238: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 1257: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 1624 components: - type: MetaData @@ -130062,14 +130267,20 @@ entities: - type: DeviceLinkSource linkedPorts: 1354: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1384: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1652: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 1699 components: - type: MetaData @@ -130083,14 +130294,20 @@ entities: - type: DeviceLinkSource linkedPorts: 1653: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1655: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1656: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 2103 components: - type: MetaData @@ -130102,8 +130319,10 @@ entities: - type: DeviceLinkSource linkedPorts: 1919: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 4506 components: - type: MetaData @@ -130115,8 +130334,10 @@ entities: - type: DeviceLinkSource linkedPorts: 5825: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 5758 components: - type: MetaData @@ -130128,8 +130349,10 @@ entities: - type: DeviceLinkSource linkedPorts: 1530: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 5835 components: - type: MetaData @@ -130141,8 +130364,10 @@ entities: - type: DeviceLinkSource linkedPorts: 4201: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 6307 components: - type: MetaData @@ -130154,8 +130379,10 @@ entities: - type: DeviceLinkSource linkedPorts: 1485: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 7563 components: - type: Transform @@ -130165,7 +130392,8 @@ entities: - type: DeviceLinkSource linkedPorts: 186: - - Status: Toggle + - - Status + - Toggle - uid: 8127 components: - type: MetaData @@ -130177,8 +130405,10 @@ entities: - type: DeviceLinkSource linkedPorts: 24352: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 8221 components: - type: MetaData @@ -130192,14 +130422,20 @@ entities: - type: DeviceLinkSource linkedPorts: 1681: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 10622: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5432: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 8349 components: - type: MetaData @@ -130211,8 +130447,10 @@ entities: - type: DeviceLinkSource linkedPorts: 8297: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 8433 components: - type: MetaData @@ -130224,50 +130462,80 @@ entities: - type: DeviceLinkSource linkedPorts: 188: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 187: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9680: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4564: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4563: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4552: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4542: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4505: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4457: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13978: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8721: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4565: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 207: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 208: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9679: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 8670 components: - type: MetaData @@ -130279,11 +130547,15 @@ entities: - type: DeviceLinkSource linkedPorts: 242: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8454: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 8677 components: - type: MetaData @@ -130295,8 +130567,10 @@ entities: - type: DeviceLinkSource linkedPorts: 8678: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 8908 components: - type: MetaData @@ -130308,11 +130582,15 @@ entities: - type: DeviceLinkSource linkedPorts: 243: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 245: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9309 components: - type: Transform @@ -130321,7 +130599,8 @@ entities: - type: DeviceLinkSource linkedPorts: 186: - - Status: Toggle + - - Status + - Toggle - uid: 9397 components: - type: MetaData @@ -130332,14 +130611,20 @@ entities: - type: DeviceLinkSource linkedPorts: 18519: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18518: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18517: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9549 components: - type: MetaData @@ -130350,23 +130635,35 @@ entities: - type: DeviceLinkSource linkedPorts: 11628: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11629: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13618: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11583: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13616: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12021: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9550 components: - type: MetaData @@ -130377,23 +130674,35 @@ entities: - type: DeviceLinkSource linkedPorts: 11628: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13618: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11629: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11583: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13616: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12021: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 16398 components: - type: MetaData @@ -130404,11 +130713,15 @@ entities: - type: DeviceLinkSource linkedPorts: 16541: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16542: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 16399 components: - type: MetaData @@ -130420,20 +130733,30 @@ entities: - type: DeviceLinkSource linkedPorts: 6524: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6526: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6522: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25417: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16735: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 16402 components: - type: MetaData @@ -130445,11 +130768,15 @@ entities: - type: DeviceLinkSource linkedPorts: 16058: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 15575: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 16433 components: - type: MetaData @@ -130463,11 +130790,15 @@ entities: - type: DeviceLinkSource linkedPorts: 16425: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 14167: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 17957 components: - type: MetaData @@ -130479,17 +130810,25 @@ entities: - type: DeviceLinkSource linkedPorts: 190: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 189: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 191: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 206: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 18802 components: - type: MetaData @@ -130502,47 +130841,75 @@ entities: - type: DeviceLinkSource linkedPorts: 13602: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 13176: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 13384: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 18873: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 5338: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 6127: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 13142: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 13389: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 13175: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 5221: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 9238: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 13178: - - Off: Forward - - On: Reverse + - - Off + - Forward + - - On + - Reverse 13177: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward 397: - - On: Reverse - - Off: Forward + - - On + - Reverse + - - Off + - Forward - uid: 18859 components: - type: MetaData @@ -130563,14 +130930,20 @@ entities: - type: DeviceLinkSource linkedPorts: 19033: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19835: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19836: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 21187 components: - type: Transform @@ -130580,20 +130953,30 @@ entities: - type: DeviceLinkSource linkedPorts: 21186: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21085: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21754: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21753: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21755: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 25781 components: - type: Transform @@ -130602,17 +130985,25 @@ entities: - type: DeviceLinkSource linkedPorts: 20491: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16373: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16372: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16468: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 25782 components: - type: Transform @@ -130622,17 +131013,25 @@ entities: - type: DeviceLinkSource linkedPorts: 20491: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16373: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16372: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16468: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 25785 components: - type: MetaData @@ -130644,11 +131043,15 @@ entities: - type: DeviceLinkSource linkedPorts: 16541: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16542: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - proto: SignAnomaly entities: - uid: 9496 @@ -141610,33 +142013,54 @@ entities: - type: DeviceLinkSource linkedPorts: 7725: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 7724: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 7723: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 3860: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 3894: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 3895: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 3896: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward - uid: 1189 components: - type: Transform @@ -141645,17 +142069,26 @@ entities: - type: DeviceLinkSource linkedPorts: 920: - - Middle: Close - - Right: Open - - Left: Open + - - Middle + - Close + - - Right + - Open + - - Left + - Open 914: - - Middle: Close - - Right: Open - - Left: Open + - - Middle + - Close + - - Right + - Open + - - Left + - Open 7697: - - Middle: Close - - Right: Open - - Left: Open + - - Middle + - Close + - - Right + - Open + - - Left + - Open - uid: 5805 components: - type: Transform @@ -141664,33 +142097,54 @@ entities: - type: DeviceLinkSource linkedPorts: 12703: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5489: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8360: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12283: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6978: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6730: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12705: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 9480 components: - type: Transform @@ -141699,17 +142153,26 @@ entities: - type: DeviceLinkSource linkedPorts: 5627: - - Middle: Close - - Right: Open - - Left: Open + - - Middle + - Close + - - Right + - Open + - - Left + - Open 5626: - - Middle: Close - - Right: Open - - Left: Open + - - Middle + - Close + - - Right + - Open + - - Left + - Open 5628: - - Middle: Close - - Right: Open - - Left: Open + - - Middle + - Close + - - Right + - Open + - - Left + - Open - uid: 11821 components: - type: Transform @@ -141718,77 +142181,131 @@ entities: - type: DeviceLinkSource linkedPorts: 11697: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12019: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13083: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11864: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12882: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12018: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5742: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13136: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9282: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5740: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11816: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13114: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13084: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8773: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18895: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9242: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6145: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9452: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 13173 components: - type: Transform @@ -141799,25 +142316,40 @@ entities: - type: DeviceLinkSource linkedPorts: 13167: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13168: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13169: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13170: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13171: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 13174 components: - type: Transform @@ -141826,33 +142358,54 @@ entities: - type: DeviceLinkSource linkedPorts: 13166: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13165: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13164: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13163: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13162: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13221: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13222: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 23728 components: - type: Transform @@ -141861,17 +142414,26 @@ entities: - type: DeviceLinkSource linkedPorts: 23657: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19831: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18894: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 24108 components: - type: Transform @@ -141880,9 +142442,12 @@ entities: - type: DeviceLinkSource linkedPorts: 4073: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 3769 @@ -157898,7 +158463,8 @@ entities: - type: DeviceLinkSource linkedPorts: 234: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 15897 components: - type: Transform @@ -157910,7 +158476,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8920: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureAtmosphericsLocked entities: - uid: 13959 @@ -157937,7 +158504,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8413: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 2584 components: - type: Transform @@ -157982,7 +158550,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15897: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9176 components: - type: Transform From 25a73ce3ebb29610b4c6ff2b98c88440ae1e34dc Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 13:13:05 +0200 Subject: [PATCH 366/622] init --- Resources/Maps/packed.yml | 686 +++++++++++++++++++++++++------------- 1 file changed, 453 insertions(+), 233 deletions(-) diff --git a/Resources/Maps/packed.yml b/Resources/Maps/packed.yml index 5ce4507cfc..21316998bb 100644 --- a/Resources/Maps/packed.yml +++ b/Resources/Maps/packed.yml @@ -1,10 +1,10 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/14/2025 18:36:28 + time: 04/19/2025 11:10:37 entityCount: 15485 maps: - 126 @@ -8274,7 +8274,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4392: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalEngineeringLocked entities: - uid: 173 @@ -8287,7 +8288,8 @@ entities: - type: DeviceLinkSource linkedPorts: 225: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 226 components: - type: Transform @@ -8303,7 +8305,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2128: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2128 components: - type: Transform @@ -8314,7 +8317,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1902: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4392 components: - type: Transform @@ -8325,7 +8329,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4391: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12931 components: - type: Transform @@ -8336,7 +8341,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12932: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12932 components: - type: Transform @@ -8347,7 +8353,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12931: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 88 @@ -8439,7 +8446,8 @@ entities: - type: DeviceLinkSource linkedPorts: 975: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 975 components: - type: Transform @@ -8450,7 +8458,8 @@ entities: - type: DeviceLinkSource linkedPorts: 974: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 225 @@ -8464,7 +8473,8 @@ entities: - type: DeviceLinkSource linkedPorts: 173: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 662 components: - type: Transform @@ -8488,7 +8498,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13780: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4556 components: - type: Transform @@ -8500,7 +8511,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4517: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8930 components: - type: Transform @@ -8511,7 +8523,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2333: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14224 components: - type: Transform @@ -8522,7 +8535,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14221: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 13727 @@ -8644,7 +8658,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1370: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1370 components: - type: Transform @@ -8655,7 +8670,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1369: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2333 components: - type: Transform @@ -8666,7 +8682,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8930: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4517 components: - type: Transform @@ -8677,7 +8694,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4556: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7759 components: - type: Transform @@ -8688,7 +8706,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13556: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8728 components: - type: Transform @@ -8699,7 +8718,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10751: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10751 components: - type: Transform @@ -8710,7 +8730,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8728: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13556 components: - type: Transform @@ -8721,7 +8742,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7759: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13780 components: - type: Transform @@ -8732,7 +8754,8 @@ entities: - type: DeviceLinkSource linkedPorts: 941: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14221 components: - type: Transform @@ -8743,7 +8766,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14224: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezer entities: - uid: 10 @@ -9610,7 +9634,7 @@ entities: pos: 44.5,30.5 parent: 2 - type: Door - secondsUntilStateChange: -3540.0032 + secondsUntilStateChange: -3771.7566 state: Opening - type: DeviceLinkSource lastSignals: @@ -12328,9 +12352,12 @@ entities: - type: DeviceLinkSource linkedPorts: 2258: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 7718 components: - type: Transform @@ -12339,9 +12366,12 @@ entities: - type: DeviceLinkSource linkedPorts: 2259: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - proto: Brutepack entities: - uid: 5712 @@ -38716,12 +38746,12 @@ entities: - uid: 6793 components: - type: Transform - pos: 60.359756,25.627806 + pos: 53.3757,25.459305 parent: 2 - - uid: 11827 + - uid: 10291 components: - type: Transform - pos: 60.359756,25.45593 + pos: 53.3757,25.646805 parent: 2 - uid: 12167 components: @@ -39027,7 +39057,7 @@ entities: - uid: 5343 components: - type: Transform - pos: 60.54431,25.642796 + pos: 53.65695,25.740555 parent: 2 - uid: 10799 components: @@ -39631,7 +39661,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8666: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 15222 @@ -39697,7 +39728,7 @@ entities: - uid: 10276 components: - type: Transform - pos: 73.5,8.5 + pos: 71.5,8.5 parent: 2 - proto: ComputerCargoOrdersScience entities: @@ -68844,9 +68875,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12890: - - Pressed: Toggle + - - Pressed + - Toggle 12891: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8692 components: - type: Transform @@ -68856,7 +68889,8 @@ entities: - type: DeviceLinkSource linkedPorts: 55: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 12355 components: - type: Transform @@ -68866,7 +68900,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4257: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15242 components: - type: Transform @@ -68875,9 +68910,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12891: - - Pressed: Toggle + - - Pressed + - Toggle 12890: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonChiefEngineer entities: - uid: 6118 @@ -68888,11 +68925,14 @@ entities: - type: DeviceLinkSource linkedPorts: 13490: - - Pressed: Toggle + - - Pressed + - Toggle 13489: - - Pressed: Toggle + - - Pressed + - Toggle 13488: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13470 components: - type: Transform @@ -68901,17 +68941,23 @@ entities: - type: DeviceLinkSource linkedPorts: 13478: - - Pressed: Toggle + - - Pressed + - Toggle 13477: - - Pressed: Toggle + - - Pressed + - Toggle 13476: - - Pressed: Toggle + - - Pressed + - Toggle 13480: - - Pressed: Toggle + - - Pressed + - Toggle 13481: - - Pressed: Toggle + - - Pressed + - Toggle 13482: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCommand entities: - uid: 15104 @@ -68923,35 +68969,50 @@ entities: - type: DeviceLinkSource linkedPorts: 15098: - - Pressed: Toggle + - - Pressed + - Toggle 15096: - - Pressed: Toggle + - - Pressed + - Toggle 15095: - - Pressed: Toggle + - - Pressed + - Toggle 15094: - - Pressed: Toggle + - - Pressed + - Toggle 15093: - - Pressed: Toggle + - - Pressed + - Toggle 15092: - - Pressed: Toggle + - - Pressed + - Toggle 15091: - - Pressed: Toggle + - - Pressed + - Toggle 15097: - - Pressed: Toggle + - - Pressed + - Toggle 15090: - - Pressed: Toggle + - - Pressed + - Toggle 15089: - - Pressed: Toggle + - - Pressed + - Toggle 15088: - - Pressed: Toggle + - - Pressed + - Toggle 15099: - - Pressed: Toggle + - - Pressed + - Toggle 15100: - - Pressed: Toggle + - - Pressed + - Toggle 15101: - - Pressed: Toggle + - - Pressed + - Toggle 15102: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonEngineering entities: - uid: 15398 @@ -68963,9 +69024,11 @@ entities: - type: DeviceLinkSource linkedPorts: 924: - - Pressed: Toggle + - - Pressed + - Toggle 803: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15399 components: - type: Transform @@ -68975,9 +69038,11 @@ entities: - type: DeviceLinkSource linkedPorts: 803: - - Pressed: Toggle + - - Pressed + - Toggle 924: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15400 components: - type: Transform @@ -68987,7 +69052,8 @@ entities: - type: DeviceLinkSource linkedPorts: 779: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 15129 @@ -68999,9 +69065,11 @@ entities: - type: DeviceLinkSource linkedPorts: 599: - - Pressed: Open + - - Pressed + - Open 600: - - Pressed: Open + - - Pressed + - Open - proto: LockableButtonResearch entities: - uid: 1557 @@ -69013,9 +69081,11 @@ entities: - type: DeviceLinkSource linkedPorts: 11022: - - Pressed: Toggle + - - Pressed + - Toggle 8248: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonSalvage entities: - uid: 15284 @@ -69027,7 +69097,8 @@ entities: - type: DeviceLinkSource linkedPorts: 895: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonService entities: - uid: 15276 @@ -69039,9 +69110,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12988: - - Pressed: Toggle + - - Pressed + - Toggle 13443: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilledHardsuit entities: - uid: 1458 @@ -69425,6 +69498,13 @@ entities: - type: Transform pos: 52.5,21.5 parent: 2 +- proto: MachineMaterialSilo + entities: + - uid: 5309 + components: + - type: Transform + pos: 60.5,25.5 + parent: 2 - proto: MachineParticleAcceleratorEmitterForeCircuitboard entities: - uid: 5610 @@ -69593,7 +69673,7 @@ entities: - uid: 9369 components: - type: Transform - pos: 71.5,8.5 + pos: 73.5,8.5 parent: 2 - proto: MedkitAdvancedFilled entities: @@ -73712,7 +73792,7 @@ entities: - uid: 5342 components: - type: Transform - pos: 60.5,25.5 + pos: 53.5,25.5 parent: 2 - uid: 5375 components: @@ -76988,9 +77068,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8248: - - Pressed: Toggle + - - Pressed + - Toggle 11022: - - Pressed: Toggle + - - Pressed + - Toggle - proto: ResearchAndDevelopmentServer entities: - uid: 8233 @@ -77969,7 +78051,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8103: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1471 components: - type: MetaData @@ -77980,11 +78063,14 @@ entities: - type: DeviceLinkSource linkedPorts: 265: - - Pressed: Toggle + - - Pressed + - Toggle 267: - - Pressed: Toggle + - - Pressed + - Toggle 270: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7809 components: - type: Transform @@ -77994,7 +78080,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8067: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13002 components: - type: Transform @@ -78003,11 +78090,14 @@ entities: - type: DeviceLinkSource linkedPorts: 2090: - - Pressed: Toggle + - - Pressed + - Toggle 12839: - - Pressed: Toggle + - - Pressed + - Toggle 12381: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14913 components: - type: Transform @@ -78017,11 +78107,14 @@ entities: - type: DeviceLinkSource linkedPorts: 14912: - - Pressed: Toggle + - - Pressed + - Toggle 14910: - - Pressed: Toggle + - - Pressed + - Toggle 14911: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 543 @@ -78035,15 +78128,20 @@ entities: - type: DeviceLinkSource linkedPorts: 419: - - Pressed: Toggle + - - Pressed + - Toggle 1658: - - Pressed: Toggle + - - Pressed + - Toggle 6512: - - Pressed: Toggle + - - Pressed + - Toggle 913: - - Pressed: Toggle + - - Pressed + - Toggle 1154: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3993 components: - type: Transform @@ -78053,23 +78151,32 @@ entities: - type: DeviceLinkSource linkedPorts: 4636: - - Pressed: Toggle + - - Pressed + - Toggle 4635: - - Pressed: Toggle + - - Pressed + - Toggle 3972: - - Pressed: Toggle + - - Pressed + - Toggle 3241: - - Pressed: Toggle + - - Pressed + - Toggle 3992: - - Pressed: Toggle + - - Pressed + - Toggle 7808: - - Pressed: Toggle + - - Pressed + - Toggle 8031: - - Pressed: Toggle + - - Pressed + - Toggle 10999: - - Pressed: Toggle + - - Pressed + - Toggle 10959: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11001 components: - type: Transform @@ -78079,13 +78186,17 @@ entities: - type: DeviceLinkSource linkedPorts: 449: - - Pressed: Toggle + - - Pressed + - Toggle 2044: - - Pressed: Toggle + - - Pressed + - Toggle 780: - - Pressed: Toggle + - - Pressed + - Toggle 4502: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11019 components: - type: Transform @@ -78095,9 +78206,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15371: - - Pressed: Toggle + - - Pressed + - Toggle 15370: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13655 components: - type: MetaData @@ -78109,23 +78222,32 @@ entities: - type: DeviceLinkSource linkedPorts: 13650: - - Pressed: Toggle + - - Pressed + - Toggle 13651: - - Pressed: Toggle + - - Pressed + - Toggle 13652: - - Pressed: Toggle + - - Pressed + - Toggle 13644: - - Pressed: Toggle + - - Pressed + - Toggle 13645: - - Pressed: Toggle + - - Pressed + - Toggle 13646: - - Pressed: Toggle + - - Pressed + - Toggle 13647: - - Pressed: Toggle + - - Pressed + - Toggle 13648: - - Pressed: Toggle + - - Pressed + - Toggle 13649: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14566 components: - type: Transform @@ -78134,9 +78256,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5351: - - Pressed: Toggle + - - Pressed + - Toggle 5361: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14742 components: - type: Transform @@ -78145,9 +78269,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12825: - - Pressed: Toggle + - - Pressed + - Toggle 13183: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14924 components: - type: Transform @@ -78157,9 +78283,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12826: - - Pressed: Toggle + - - Pressed + - Toggle 12824: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15124 components: - type: Transform @@ -78169,15 +78297,20 @@ entities: - type: DeviceLinkSource linkedPorts: 6937: - - Pressed: Toggle + - - Pressed + - Toggle 15119: - - Pressed: Toggle + - - Pressed + - Toggle 15120: - - Pressed: Toggle + - - Pressed + - Toggle 15122: - - Pressed: Toggle + - - Pressed + - Toggle 15121: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15127 components: - type: Transform @@ -78187,7 +78320,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13915: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15286 components: - type: Transform @@ -78196,7 +78330,8 @@ entities: - type: DeviceLinkSource linkedPorts: 895: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignAnomaly entities: - uid: 5066 @@ -82947,11 +83082,6 @@ entities: - type: Transform pos: 54.5,17.5 parent: 2 - - uid: 5309 - components: - - type: Transform - pos: 55.5,20.5 - parent: 2 - uid: 5310 components: - type: Transform @@ -84537,33 +84667,54 @@ entities: - type: DeviceLinkSource linkedPorts: 829: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 967: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 944: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 450: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 999: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14660: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12384: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 5856 components: - type: Transform @@ -84572,53 +84723,89 @@ entities: - type: DeviceLinkSource linkedPorts: 5842: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5843: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5844: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5845: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5846: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5847: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5850: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5851: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5852: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5853: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5854: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5855: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 5857 components: - type: Transform @@ -84627,9 +84814,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5875: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close - uid: 8101 components: - type: Transform @@ -84638,25 +84828,40 @@ entities: - type: DeviceLinkSource linkedPorts: 2037: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2041: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2042: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2064: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13731: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 8446 components: - type: Transform @@ -84665,25 +84870,40 @@ entities: - type: DeviceLinkSource linkedPorts: 2040: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2067: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2051: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2066: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8239: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UniformPrinter entities: - uid: 10283 From 92106c52b6188acc8c35529940c384b6bdef423d Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 13:21:07 +0200 Subject: [PATCH 367/622] init --- Resources/Maps/box.yml | 1077 ++++++++++++++++++++++++++-------------- 1 file changed, 717 insertions(+), 360 deletions(-) diff --git a/Resources/Maps/box.yml b/Resources/Maps/box.yml index dde4240082..f7ef35dff1 100644 --- a/Resources/Maps/box.yml +++ b/Resources/Maps/box.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/16/2025 19:47:10 - entityCount: 28355 + time: 04/19/2025 11:18:31 + entityCount: 28356 maps: - 780 grids: @@ -13298,7 +13298,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13669: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13669 components: - type: Transform @@ -13307,7 +13308,8 @@ entities: - type: DeviceLinkSource linkedPorts: 431: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalEngineeringLocked entities: - uid: 3852 @@ -13319,9 +13321,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3707: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 3858: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11000 components: - type: Transform @@ -13330,7 +13334,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23210: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23210 components: - type: Transform @@ -13339,7 +13344,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11000: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 1727 @@ -13350,7 +13356,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5209: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 8807 components: - type: Transform @@ -13391,7 +13398,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12644: - - DoorStatus: Close + - - DoorStatus + - Close - proto: AirlockExternalGlassAtmosphericsLocked entities: - uid: 3858 @@ -13404,9 +13412,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3852: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 3707: - - DoorStatus: Close + - - DoorStatus + - Close - proto: AirlockExternalGlassCargoLocked entities: - uid: 7010 @@ -13417,7 +13427,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15002: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15002 components: - type: Transform @@ -13426,7 +13437,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7010: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18040 components: - type: Transform @@ -13450,9 +13462,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3601: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 4365: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3601 components: - type: Transform @@ -13464,9 +13478,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4365: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 2905: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3707 components: - type: Transform @@ -13478,9 +13494,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3852: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 3858: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 4365 components: - type: Transform @@ -13492,9 +13510,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3601: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 2905: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11754 components: - type: Transform @@ -13506,7 +13526,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14105: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14105 components: - type: Transform @@ -13518,7 +13539,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11754: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14448 components: - type: Transform @@ -13527,7 +13549,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14449: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14449 components: - type: Transform @@ -13536,7 +13559,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14448: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17059 components: - type: Transform @@ -13553,7 +13577,8 @@ entities: - type: DeviceLinkSource linkedPorts: 509: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 509 components: - type: Transform @@ -13562,7 +13587,8 @@ entities: - type: DeviceLinkSource linkedPorts: 508: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 594 components: - type: MetaData @@ -13580,7 +13606,8 @@ entities: - type: DeviceLinkSource linkedPorts: 562: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 4758 components: - type: Transform @@ -13589,7 +13616,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15592: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9436 components: - type: Transform @@ -13598,7 +13626,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9810: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11795 components: - type: Transform @@ -13609,7 +13638,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19987: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12466 components: - type: Transform @@ -13618,7 +13648,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1110: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12467 components: - type: Transform @@ -13627,7 +13658,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12470: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12468 components: - type: Transform @@ -13636,7 +13668,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12469: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 13138 components: - type: Transform @@ -13645,7 +13678,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13139: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13139 components: - type: Transform @@ -13654,7 +13688,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13138: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18669 components: - type: Transform @@ -13663,7 +13698,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19366: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19988 components: - type: Transform @@ -13672,7 +13708,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19989: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 606 @@ -13762,7 +13799,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12486: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 655 components: - type: Transform @@ -13772,7 +13810,8 @@ entities: - type: DeviceLinkSource linkedPorts: 593: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 5626 components: - type: Transform @@ -13781,7 +13820,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22633: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9810 components: - type: Transform @@ -13790,7 +13830,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9436: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11651 components: - type: Transform @@ -13799,7 +13840,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11652: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11652 components: - type: Transform @@ -13808,7 +13850,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11651: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15592 components: - type: Transform @@ -13817,7 +13860,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4758: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19366 components: - type: Transform @@ -13826,7 +13870,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18669: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19985 components: - type: Transform @@ -13835,7 +13880,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19986: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19986 components: - type: Transform @@ -13844,7 +13890,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19985: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19987 components: - type: Transform @@ -13855,7 +13902,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11795: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19989 components: - type: Transform @@ -13864,7 +13912,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19988: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22633 components: - type: Transform @@ -13873,7 +13922,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5626: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalShuttleLocked entities: - uid: 593 @@ -13885,7 +13935,8 @@ entities: - type: DeviceLinkSource linkedPorts: 655: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 1110 components: - type: Transform @@ -13895,7 +13946,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12466: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12469 components: - type: Transform @@ -13904,7 +13956,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12468: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12470 components: - type: Transform @@ -13913,7 +13966,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12467: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12486 components: - type: Transform @@ -13923,7 +13977,8 @@ entities: - type: DeviceLinkSource linkedPorts: 610: - - DoorStatus: Close + - - DoorStatus + - Close - proto: AirlockFreezer entities: - uid: 25720 @@ -13987,7 +14042,7 @@ entities: pos: 24.5,16.5 parent: 8364 - type: Door - secondsUntilStateChange: -97804.64 + secondsUntilStateChange: -97887.33 state: Opening - type: DeviceLinkSource lastSignals: @@ -14330,7 +14385,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1495: - - DoorStatus: Close + - - DoorStatus + - Close lastSignals: DoorStatus: False DockStatus: True @@ -14345,7 +14401,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1727: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 12644 @@ -14357,7 +14414,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12643: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 21828 @@ -15542,7 +15600,7 @@ entities: pos: 9.5,25.5 parent: 8364 - type: Door - secondsUntilStateChange: -11061.134 + secondsUntilStateChange: -11143.819 state: Opening - type: DeviceLinkSource lastSignals: @@ -22029,9 +22087,12 @@ entities: - type: DeviceLinkSource linkedPorts: 8624: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 25829 components: - type: Transform @@ -22040,9 +22101,12 @@ entities: - type: DeviceLinkSource linkedPorts: 8625: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 26575 components: - type: Transform @@ -22051,9 +22115,12 @@ entities: - type: DeviceLinkSource linkedPorts: 8626: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - proto: Bucket entities: - uid: 10718 @@ -73816,7 +73883,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21199: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 19021 @@ -73902,11 +73970,11 @@ entities: parent: 8364 - proto: ComputerCargoOrdersScience entities: - - uid: 11598 + - uid: 28356 components: - type: Transform rot: 1.5707963267948966 rad - pos: 69.5,-26.5 + pos: 69.5,-25.5 parent: 8364 - proto: ComputerCargoOrdersSecurity entities: @@ -88430,7 +88498,7 @@ entities: pos: 18.5,-13.5 parent: 8364 - type: Door - secondsUntilStateChange: -5035.644 + secondsUntilStateChange: -5118.329 state: Closing - uid: 13388 components: @@ -88438,7 +88506,7 @@ entities: pos: 18.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -5071.344 + secondsUntilStateChange: -5154.0293 state: Closing - uid: 13389 components: @@ -88606,7 +88674,7 @@ entities: pos: -34.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -91993.18 + secondsUntilStateChange: -92075.87 state: Closing - uid: 15010 components: @@ -128912,13 +128980,18 @@ entities: - type: DeviceLinkSource linkedPorts: 6419: - - Pressed: Open + - - Pressed + - Open 25744: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 25747: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose - uid: 25554 components: - type: MetaData @@ -128930,11 +129003,14 @@ entities: - type: DeviceLinkSource linkedPorts: 6419: - - Pressed: Close + - - Pressed + - Close 25744: - - Pressed: Close + - - Pressed + - Close 25747: - - Pressed: Close + - - Pressed + - Close - proto: LockableButtonChiefMedicalOfficer entities: - uid: 3809 @@ -128945,9 +129021,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2505: - - Pressed: Open + - - Pressed + - Open 2506: - - Pressed: Open + - - Pressed + - Open - proto: LockerAtmosphericsFilledHardsuit entities: - uid: 3883 @@ -130513,6 +130591,13 @@ entities: - type: Transform pos: -43.5,-12.5 parent: 8364 +- proto: MachineMaterialSilo + entities: + - uid: 11598 + components: + - type: Transform + pos: 69.5,-26.5 + parent: 8364 - proto: MagazineBoxMagnumPractice entities: - uid: 10062 @@ -133147,7 +133232,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11608: - - DoorStatus: Close + - - DoorStatus + - Close - proto: PlasmaWindoorSecureSecurityLocked entities: - uid: 11608 @@ -133161,7 +133247,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9517: - - DoorStatus: Close + - - DoorStatus + - Close - proto: PlasticFlapsAirtightClear entities: - uid: 3067 @@ -146817,11 +146904,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4205: - - Pressed: Toggle + - - Pressed + - Toggle 3542: - - Pressed: Toggle + - - Pressed + - Toggle 25091: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1910 components: - type: Transform @@ -146831,21 +146921,29 @@ entities: - type: DeviceLinkSource linkedPorts: 1924: - - Pressed: Toggle + - - Pressed + - Toggle 1923: - - Pressed: Toggle + - - Pressed + - Toggle 1918: - - Pressed: Toggle + - - Pressed + - Toggle 17901: - - Pressed: Toggle + - - Pressed + - Toggle 22990: - - Pressed: Toggle + - - Pressed + - Toggle 18406: - - Pressed: Toggle + - - Pressed + - Toggle 5241: - - Pressed: Toggle + - - Pressed + - Toggle 5223: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2638 components: - type: Transform @@ -146854,7 +146952,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13910: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3753 components: - type: Transform @@ -146863,7 +146962,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3750: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3754 components: - type: Transform @@ -146872,7 +146972,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22831: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3807 components: - type: Transform @@ -146881,7 +146982,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3535: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4249 components: - type: Transform @@ -146891,11 +146993,14 @@ entities: - type: DeviceLinkSource linkedPorts: 25091: - - Pressed: Toggle + - - Pressed + - Toggle 3542: - - Pressed: Toggle + - - Pressed + - Toggle 4205: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4250 components: - type: Transform @@ -146905,11 +147010,14 @@ entities: - type: DeviceLinkSource linkedPorts: 13849: - - Pressed: Toggle + - - Pressed + - Toggle 3605: - - Pressed: Toggle + - - Pressed + - Toggle 15544: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 5222 components: - type: Transform @@ -146918,11 +147026,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5336: - - Pressed: Toggle + - - Pressed + - Toggle 5338: - - Pressed: Toggle + - - Pressed + - Toggle 22014: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 5243 components: - type: Transform @@ -146931,11 +147042,14 @@ entities: - type: DeviceLinkSource linkedPorts: 19078: - - Pressed: Toggle + - - Pressed + - Toggle 19080: - - Pressed: Toggle + - - Pressed + - Toggle 19090: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 5322 components: - type: Transform @@ -146944,7 +147058,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9923: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 5478 components: - type: Transform @@ -146953,21 +147068,29 @@ entities: - type: DeviceLinkSource linkedPorts: 20840: - - Pressed: Toggle + - - Pressed + - Toggle 20841: - - Pressed: Toggle + - - Pressed + - Toggle 20842: - - Pressed: Toggle + - - Pressed + - Toggle 20843: - - Pressed: Toggle + - - Pressed + - Toggle 20844: - - Pressed: Toggle + - - Pressed + - Toggle 20845: - - Pressed: Toggle + - - Pressed + - Toggle 20846: - - Pressed: Toggle + - - Pressed + - Toggle 20848: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9421 components: - type: Transform @@ -146976,13 +147099,17 @@ entities: - type: DeviceLinkSource linkedPorts: 9642: - - Pressed: Toggle + - - Pressed + - Toggle 9639: - - Pressed: Toggle + - - Pressed + - Toggle 9640: - - Pressed: Toggle + - - Pressed + - Toggle 9641: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9868 components: - type: Transform @@ -146991,13 +147118,17 @@ entities: - type: DeviceLinkSource linkedPorts: 10454: - - Pressed: Toggle + - - Pressed + - Toggle 10455: - - Pressed: Toggle + - - Pressed + - Toggle 10456: - - Pressed: Toggle + - - Pressed + - Toggle 10457: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11625 components: - type: Transform @@ -147006,11 +147137,14 @@ entities: - type: DeviceLinkSource linkedPorts: 6086: - - Pressed: Toggle + - - Pressed + - Toggle 5898: - - Pressed: Toggle + - - Pressed + - Toggle 5911: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11628 components: - type: Transform @@ -147019,11 +147153,14 @@ entities: - type: DeviceLinkSource linkedPorts: 6087: - - Pressed: Toggle + - - Pressed + - Toggle 6098: - - Pressed: Toggle + - - Pressed + - Toggle 6099: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11984 components: - type: Transform @@ -147033,9 +147170,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8814: - - Pressed: Toggle + - - Pressed + - Toggle 9243: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 16830 components: - type: MetaData @@ -147047,7 +147186,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5373: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 17685 components: - type: Transform @@ -147057,19 +147197,26 @@ entities: - type: DeviceLinkSource linkedPorts: 15422: - - Pressed: Toggle + - - Pressed + - Toggle 1455: - - Pressed: Toggle + - - Pressed + - Toggle 17669: - - Pressed: Toggle + - - Pressed + - Toggle 15377: - - Pressed: Toggle + - - Pressed + - Toggle 1454: - - Pressed: Toggle + - - Pressed + - Toggle 14850: - - Pressed: Toggle + - - Pressed + - Toggle 15428: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 17791 components: - type: Transform @@ -147078,9 +147225,11 @@ entities: - type: DeviceLinkSource linkedPorts: 18327: - - Pressed: Toggle + - - Pressed + - Toggle 18326: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19172 components: - type: Transform @@ -147089,9 +147238,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8814: - - Pressed: Toggle + - - Pressed + - Toggle 9243: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19856 components: - type: Transform @@ -147100,11 +147251,14 @@ entities: - type: DeviceLinkSource linkedPorts: 20182: - - Pressed: Toggle + - - Pressed + - Toggle 4458: - - Pressed: Toggle + - - Pressed + - Toggle 20180: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20896 components: - type: Transform @@ -147113,11 +147267,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5592: - - Pressed: Toggle + - - Pressed + - Toggle 5591: - - Pressed: Toggle + - - Pressed + - Toggle 5590: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 22220 components: - type: MetaData @@ -147129,11 +147286,14 @@ entities: - type: DeviceLinkSource linkedPorts: 3851: - - Pressed: Toggle + - - Pressed + - Toggle 11732: - - Pressed: Toggle + - - Pressed + - Toggle 10835: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 25517 components: - type: Transform @@ -147143,11 +147303,14 @@ entities: - type: DeviceLinkSource linkedPorts: 20853: - - Pressed: Toggle + - - Pressed + - Toggle 20852: - - Pressed: Toggle + - - Pressed + - Toggle 20851: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 26795 components: - type: Transform @@ -147156,23 +147319,32 @@ entities: - type: DeviceLinkSource linkedPorts: 26786: - - Pressed: Toggle + - - Pressed + - Toggle 26787: - - Pressed: Toggle + - - Pressed + - Toggle 26788: - - Pressed: Toggle + - - Pressed + - Toggle 26789: - - Pressed: Toggle + - - Pressed + - Toggle 26790: - - Pressed: Toggle + - - Pressed + - Toggle 26791: - - Pressed: Toggle + - - Pressed + - Toggle 26792: - - Pressed: Toggle + - - Pressed + - Toggle 26794: - - Pressed: Toggle + - - Pressed + - Toggle 26793: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 26932 components: - type: MetaData @@ -147184,13 +147356,17 @@ entities: - type: DeviceLinkSource linkedPorts: 3789: - - Pressed: Toggle + - - Pressed + - Toggle 3788: - - Pressed: Toggle + - - Pressed + - Toggle 3875: - - Pressed: Toggle + - - Pressed + - Toggle 3868: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 26934 components: - type: MetaData @@ -147202,9 +147378,11 @@ entities: - type: DeviceLinkSource linkedPorts: 26666: - - Pressed: Toggle + - - Pressed + - Toggle 26667: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 26935 components: - type: MetaData @@ -147216,11 +147394,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5798: - - Pressed: Toggle + - - Pressed + - Toggle 9379: - - Pressed: Toggle + - - Pressed + - Toggle 4704: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 26936 components: - type: MetaData @@ -147232,9 +147413,11 @@ entities: - type: DeviceLinkSource linkedPorts: 26668: - - Pressed: Toggle + - - Pressed + - Toggle 26669: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 26937 components: - type: MetaData @@ -147246,13 +147429,17 @@ entities: - type: DeviceLinkSource linkedPorts: 3868: - - Pressed: Toggle + - - Pressed + - Toggle 3875: - - Pressed: Toggle + - - Pressed + - Toggle 3788: - - Pressed: Toggle + - - Pressed + - Toggle 3789: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 27744 components: - type: Transform @@ -147262,11 +147449,14 @@ entities: - type: DeviceLinkSource linkedPorts: 15544: - - Pressed: Toggle + - - Pressed + - Toggle 3605: - - Pressed: Toggle + - - Pressed + - Toggle 13849: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 28254 components: - type: MetaData @@ -147278,11 +147468,14 @@ entities: - type: DeviceLinkSource linkedPorts: 20002: - - Pressed: Toggle + - - Pressed + - Toggle 28251: - - Pressed: Toggle + - - Pressed + - Toggle 28253: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 10732 @@ -147295,11 +147488,14 @@ entities: - type: DeviceLinkSource linkedPorts: 8158: - - Pressed: Toggle + - - Pressed + - Toggle 27220: - - Pressed: Toggle + - - Pressed + - Toggle 27221: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 27608 components: - type: Transform @@ -147308,7 +147504,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11334: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 27659 components: - type: Transform @@ -147318,7 +147515,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6417: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 27660 components: - type: Transform @@ -147328,7 +147526,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6416: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 27661 components: - type: Transform @@ -147338,7 +147537,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6415: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 27662 components: - type: Transform @@ -147348,7 +147548,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6414: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 27663 components: - type: Transform @@ -147358,7 +147559,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6413: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 27664 components: - type: Transform @@ -147368,7 +147570,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6412: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: SignalSwitch entities: - uid: 9411 @@ -147384,11 +147587,15 @@ entities: - type: DeviceLinkSource linkedPorts: 19930: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19932: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 13247 components: - type: MetaData @@ -147408,26 +147615,40 @@ entities: - type: DeviceLinkSource linkedPorts: 8650: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8649: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8648: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8647: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8646: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8645: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8644: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9368 components: - type: MetaData @@ -147441,14 +147662,20 @@ entities: - type: DeviceLinkSource linkedPorts: 6970: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4212: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3134: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 11568 components: - type: MetaData @@ -147462,44 +147689,70 @@ entities: - type: DeviceLinkSource linkedPorts: 12030: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12033: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 17151: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 18370: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19886: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19890: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19931: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19959: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19968: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 20152: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22451: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11980: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12024: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 15129 components: - type: MetaData @@ -147512,11 +147765,15 @@ entities: - type: DeviceLinkSource linkedPorts: 4495: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4494: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - proto: SignAnomaly entities: - uid: 25994 @@ -158467,17 +158724,26 @@ entities: - type: DeviceLinkSource linkedPorts: 20192: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 20193: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 20194: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close - uid: 9807 components: - type: Transform @@ -158491,37 +158757,61 @@ entities: - type: DeviceLinkSource linkedPorts: 7213: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7162: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9935: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 7307: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10535: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10536: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11325: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10804: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 13893 components: - type: Transform @@ -158530,61 +158820,103 @@ entities: - type: DeviceLinkSource linkedPorts: 6232: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6231: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6230: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6229: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6228: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6227: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6226: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6233: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6234: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6235: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6236: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13812: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6120: - - Right: Reverse - - Left: Forward - - Middle: Off + - - Right + - Reverse + - - Left + - Forward + - - Middle + - Off 16588: - - Right: Reverse - - Left: Forward - - Middle: Off + - - Right + - Reverse + - - Left + - Forward + - - Middle + - Off - uid: 16780 components: - type: Transform @@ -158593,9 +158925,12 @@ entities: - type: DeviceLinkSource linkedPorts: 16779: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 20027 components: - type: Transform @@ -158604,21 +158939,33 @@ entities: - type: DeviceLinkSource linkedPorts: 11321: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 17202: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8017: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3062: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 20049 components: - type: Transform @@ -178469,9 +178816,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8605: - - DoorStatus: Close + - - DoorStatus + - Close 8604: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 8609 components: - type: MetaData @@ -178484,9 +178833,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8604: - - DoorStatus: Close + - - DoorStatus + - Close 8605: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9242 components: - type: MetaData @@ -178499,7 +178850,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12663: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9805 components: - type: MetaData @@ -178714,7 +179066,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9242: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 25744 components: - type: Transform @@ -178947,9 +179300,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8609: - - DoorStatus: Close + - - DoorStatus + - Close 8608: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 8605 components: - type: MetaData @@ -178963,9 +179318,11 @@ entities: - type: DeviceLinkSource linkedPorts: 8608: - - DoorStatus: Close + - - DoorStatus + - Close 8609: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 8624 components: - type: MetaData From 5c1cee58ba90d3a8851a8afbda8f22cceb5830a0 Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 13:30:30 +0200 Subject: [PATCH 368/622] init --- Resources/Maps/fland.yml | 1449 +++++++++++++++++++++++++------------- 1 file changed, 967 insertions(+), 482 deletions(-) diff --git a/Resources/Maps/fland.yml b/Resources/Maps/fland.yml index b125e62ce6..5180e5bfbb 100644 --- a/Resources/Maps/fland.yml +++ b/Resources/Maps/fland.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/15/2025 11:43:28 - entityCount: 36027 + time: 04/19/2025 11:28:47 + entityCount: 36028 maps: - 1 grids: @@ -17877,7 +17877,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9359: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9357 components: - type: Transform @@ -17886,7 +17887,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9358: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9358 components: - type: Transform @@ -17895,7 +17897,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9357: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9359 components: - type: Transform @@ -17904,7 +17907,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9356: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9407 components: - type: Transform @@ -17923,7 +17927,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9410: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9410 components: - type: Transform @@ -17932,7 +17937,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9409: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9411 components: - type: Transform @@ -17941,7 +17947,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9412: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9412 components: - type: Transform @@ -17950,7 +17957,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9411: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9459 components: - type: Transform @@ -18168,7 +18176,8 @@ entities: - type: DeviceLinkSource linkedPorts: 31366: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 16663 components: - type: Transform @@ -18636,7 +18645,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12402: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12402 components: - type: Transform @@ -18648,7 +18658,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12401: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23029 components: - type: Transform @@ -18657,7 +18668,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23413: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23458 components: - type: Transform @@ -18668,7 +18680,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23457: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 2870 @@ -18748,7 +18761,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15609: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 15612 components: - type: Transform @@ -18759,7 +18773,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15610: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 33581 components: - type: Transform @@ -18792,7 +18807,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10120: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10120 components: - type: Transform @@ -18803,7 +18819,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10119: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 3715 @@ -18814,7 +18831,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3716: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3716 components: - type: Transform @@ -18823,7 +18841,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3715: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12403 components: - type: Transform @@ -18835,7 +18854,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12421: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12404 components: - type: Transform @@ -18847,7 +18867,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12395: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12420 components: - type: Transform @@ -18859,7 +18880,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12400: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12421 components: - type: Transform @@ -18871,7 +18893,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12403: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12503 components: - type: Transform @@ -18883,7 +18906,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12397: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12504 components: - type: Transform @@ -18895,7 +18919,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12399: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 20640 components: - type: Transform @@ -18905,7 +18930,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20641: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20641 components: - type: Transform @@ -18915,7 +18941,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20640: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23413 components: - type: Transform @@ -18924,7 +18951,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23029: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23457 components: - type: Transform @@ -18935,7 +18963,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23458: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24737 components: - type: Transform @@ -18944,7 +18973,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24738: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 24738 components: - type: Transform @@ -18953,7 +18983,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24737: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 26784 components: - type: Transform @@ -18962,7 +18993,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26785: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 26785 components: - type: Transform @@ -18971,7 +19003,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26784: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 27106 components: - type: Transform @@ -18980,7 +19013,8 @@ entities: - type: DeviceLinkSource linkedPorts: 27107: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 27107 components: - type: Transform @@ -18989,7 +19023,8 @@ entities: - type: DeviceLinkSource linkedPorts: 27106: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 33236 components: - type: Transform @@ -18998,7 +19033,8 @@ entities: - type: DeviceLinkSource linkedPorts: 33237: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 33237 components: - type: Transform @@ -19007,7 +19043,8 @@ entities: - type: DeviceLinkSource linkedPorts: 33236: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 2999 @@ -19020,7 +19057,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3000: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3000 components: - type: Transform @@ -19029,7 +19067,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2999: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3748 components: - type: Transform @@ -19038,7 +19077,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3743: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 3749 components: - type: Transform @@ -19047,7 +19087,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13618: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13618 components: - type: Transform @@ -19056,7 +19097,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3749: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19163 components: - type: Transform @@ -19067,9 +19109,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19166: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 19165: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19164 components: - type: Transform @@ -19080,9 +19124,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19166: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 19165: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19165 components: - type: Transform @@ -19093,9 +19139,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19164: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 19163: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19166 components: - type: Transform @@ -19106,9 +19154,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19164: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 19163: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 26786 components: - type: Transform @@ -19117,7 +19167,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26787: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 26787 components: - type: Transform @@ -19126,7 +19177,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26786: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 33238 components: - type: Transform @@ -19135,7 +19187,8 @@ entities: - type: DeviceLinkSource linkedPorts: 33239: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 33239 components: - type: Transform @@ -19144,7 +19197,8 @@ entities: - type: DeviceLinkSource linkedPorts: 33238: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 2869 @@ -19249,7 +19303,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3748: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 10108 components: - type: Transform @@ -19270,7 +19325,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12404: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 12397 @@ -19282,7 +19338,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12503: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 12399 @@ -19293,7 +19350,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12504: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 12400 @@ -19304,7 +19362,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12420: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 15609 @@ -19315,7 +19374,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15611: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 15610 @@ -19326,7 +19386,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15612: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 31366 @@ -19338,7 +19399,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16079: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockExternalLocked @@ -19353,7 +19415,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3834: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3834 components: - type: Transform @@ -19362,7 +19425,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3833: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6538 components: - type: Transform @@ -19372,7 +19436,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6540: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6540 components: - type: Transform @@ -19382,7 +19447,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6538: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23125 components: - type: Transform @@ -19391,7 +19457,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23126: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23126 components: - type: Transform @@ -19400,7 +19467,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23125: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23127 components: - type: Transform @@ -19409,7 +19477,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23128: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23128 components: - type: Transform @@ -19418,7 +19487,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23127: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezer entities: - uid: 30594 @@ -19518,7 +19588,7 @@ entities: pos: -15.5,-4.5 parent: 13329 - type: Door - secondsUntilStateChange: -12067.695 + secondsUntilStateChange: -12230.655 state: Opening - type: DeviceLinkSource lastSignals: @@ -30817,9 +30887,12 @@ entities: - type: DeviceLinkSource linkedPorts: 9333: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 10578 components: - type: Transform @@ -30828,9 +30901,12 @@ entities: - type: DeviceLinkSource linkedPorts: 9336: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 10583 components: - type: Transform @@ -30839,9 +30915,12 @@ entities: - type: DeviceLinkSource linkedPorts: 9334: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 10586 components: - type: Transform @@ -30850,9 +30929,12 @@ entities: - type: DeviceLinkSource linkedPorts: 9335: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - proto: BrokenBottle entities: - uid: 18218 @@ -164358,51 +164440,81 @@ entities: - type: DeviceLinkSource linkedPorts: 10681: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10680: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10679: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10678: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10685: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10684: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10683: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10687: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10686: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 26338: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 35939: - - Pressed: Open + - - Pressed + - Open 35970: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 35969: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 9361: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 10677: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 7239: - - Pressed: Open + - - Pressed + - Open - type: Label currentLabel: Open Armory - type: NameModifier @@ -164418,37 +164530,53 @@ entities: - type: DeviceLinkSource linkedPorts: 26338: - - Pressed: Close + - - Pressed + - Close 10681: - - Pressed: Close + - - Pressed + - Close 10680: - - Pressed: Close + - - Pressed + - Close 10679: - - Pressed: Close + - - Pressed + - Close 10678: - - Pressed: Close + - - Pressed + - Close 10685: - - Pressed: Close + - - Pressed + - Close 10684: - - Pressed: Close + - - Pressed + - Close 10683: - - Pressed: Close + - - Pressed + - Close 10687: - - Pressed: Close + - - Pressed + - Close 10686: - - Pressed: Close + - - Pressed + - Close 35970: - - Pressed: Close + - - Pressed + - Close 35969: - - Pressed: Close + - - Pressed + - Close 35939: - - Pressed: Close + - - Pressed + - Close 10677: - - Pressed: Close + - - Pressed + - Close 9361: - - Pressed: Close + - - Pressed + - Close 7239: - - Pressed: Close + - - Pressed + - Close - type: Label currentLabel: Close Armory - type: NameModifier @@ -166557,6 +166685,13 @@ entities: - type: Transform pos: 28.5,58.5 parent: 13329 +- proto: MachineMaterialSilo + entities: + - uid: 36028 + components: + - type: Transform + pos: 43.5,-27.5 + parent: 13329 - proto: MagazinePistol entities: - uid: 10651 @@ -169094,7 +169229,8 @@ entities: - type: DeviceLinkSource linkedPorts: 32364: - - DoorStatus: Close + - - DoorStatus + - Close - proto: PlasmaWindoorSecureSecurityLocked entities: - uid: 32364 @@ -169108,7 +169244,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26292: - - DoorStatus: Close + - - DoorStatus + - Close - proto: PlasticFlapsAirtightClear entities: - uid: 11498 @@ -183710,9 +183847,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9596: - - Pressed: Toggle + - - Pressed + - Toggle 9595: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 31585 components: - type: Transform @@ -184982,13 +185121,17 @@ entities: - type: DeviceLinkSource linkedPorts: 934: - - Pressed: Toggle + - - Pressed + - Toggle 935: - - Pressed: Toggle + - - Pressed + - Toggle 936: - - Pressed: Toggle + - - Pressed + - Toggle 937: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 939 components: - type: MetaData @@ -184999,15 +185142,20 @@ entities: - type: DeviceLinkSource linkedPorts: 933: - - Pressed: Toggle + - - Pressed + - Toggle 932: - - Pressed: Toggle + - - Pressed + - Toggle 931: - - Pressed: Toggle + - - Pressed + - Toggle 930: - - Pressed: Toggle + - - Pressed + - Toggle 929: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 940 components: - type: MetaData @@ -185018,17 +185166,23 @@ entities: - type: DeviceLinkSource linkedPorts: 921: - - Pressed: Toggle + - - Pressed + - Toggle 922: - - Pressed: Toggle + - - Pressed + - Toggle 923: - - Pressed: Toggle + - - Pressed + - Toggle 924: - - Pressed: Toggle + - - Pressed + - Toggle 925: - - Pressed: Toggle + - - Pressed + - Toggle 926: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1073 components: - type: MetaData @@ -185039,11 +185193,14 @@ entities: - type: DeviceLinkSource linkedPorts: 1072: - - Pressed: Toggle + - - Pressed + - Toggle 927: - - Pressed: Toggle + - - Pressed + - Toggle 928: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1317 components: - type: MetaData @@ -185054,17 +185211,23 @@ entities: - type: DeviceLinkSource linkedPorts: 1316: - - Pressed: Toggle + - - Pressed + - Toggle 1315: - - Pressed: Toggle + - - Pressed + - Toggle 1314: - - Pressed: Toggle + - - Pressed + - Toggle 1313: - - Pressed: Toggle + - - Pressed + - Toggle 1312: - - Pressed: Toggle + - - Pressed + - Toggle 1311: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 1431 components: - type: MetaData @@ -185075,7 +185238,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1432: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4523 components: - type: Transform @@ -185084,15 +185248,20 @@ entities: - type: DeviceLinkSource linkedPorts: 4518: - - Pressed: Toggle + - - Pressed + - Toggle 4519: - - Pressed: Toggle + - - Pressed + - Toggle 4520: - - Pressed: Toggle + - - Pressed + - Toggle 4521: - - Pressed: Toggle + - - Pressed + - Toggle 4522: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4751 components: - type: Transform @@ -185101,11 +185270,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4748: - - Pressed: Toggle + - - Pressed + - Toggle 4749: - - Pressed: Toggle + - - Pressed + - Toggle 4750: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9777 components: - type: Transform @@ -185114,11 +185286,14 @@ entities: - type: DeviceLinkSource linkedPorts: 9774: - - Pressed: Toggle + - - Pressed + - Toggle 9775: - - Pressed: Toggle + - - Pressed + - Toggle 9776: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10587 components: - type: MetaData @@ -185129,13 +185304,17 @@ entities: - type: DeviceLinkSource linkedPorts: 10588: - - Pressed: Toggle + - - Pressed + - Toggle 10589: - - Pressed: Toggle + - - Pressed + - Toggle 10590: - - Pressed: Toggle + - - Pressed + - Toggle 10591: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10877 components: - type: Transform @@ -185144,11 +185323,14 @@ entities: - type: DeviceLinkSource linkedPorts: 10879: - - Pressed: Toggle + - - Pressed + - Toggle 10880: - - Pressed: Toggle + - - Pressed + - Toggle 10881: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10878 components: - type: Transform @@ -185157,11 +185339,14 @@ entities: - type: DeviceLinkSource linkedPorts: 10884: - - Pressed: Toggle + - - Pressed + - Toggle 10883: - - Pressed: Toggle + - - Pressed + - Toggle 10882: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11543 components: - type: Transform @@ -185170,9 +185355,11 @@ entities: - type: DeviceLinkSource linkedPorts: 11541: - - Pressed: Toggle + - - Pressed + - Toggle 11542: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14608 components: - type: Transform @@ -185182,11 +185369,14 @@ entities: - type: DeviceLinkSource linkedPorts: 14607: - - Pressed: Toggle + - - Pressed + - Toggle 14606: - - Pressed: Toggle + - - Pressed + - Toggle 14605: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15306 components: - type: Transform @@ -185195,9 +185385,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15304: - - Pressed: Toggle + - - Pressed + - Toggle 15305: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15398 components: - type: Transform @@ -185206,11 +185398,14 @@ entities: - type: DeviceLinkSource linkedPorts: 15301: - - Pressed: Toggle + - - Pressed + - Toggle 15302: - - Pressed: Toggle + - - Pressed + - Toggle 15303: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20585 components: - type: Transform @@ -185219,7 +185414,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20588: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20586 components: - type: Transform @@ -185228,11 +185424,14 @@ entities: - type: DeviceLinkSource linkedPorts: 20589: - - Pressed: Toggle + - - Pressed + - Toggle 20471: - - Pressed: Toggle + - - Pressed + - Toggle 20428: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24020 components: - type: Transform @@ -185241,9 +185440,11 @@ entities: - type: DeviceLinkSource linkedPorts: 24022: - - Pressed: Toggle + - - Pressed + - Toggle 24021: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 25903 components: - type: Transform @@ -185252,7 +185453,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25901: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 25904 components: - type: Transform @@ -185261,7 +185463,8 @@ entities: - type: DeviceLinkSource linkedPorts: 25902: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 26443 components: - type: Transform @@ -185270,7 +185473,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26442: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 31488 components: - type: Transform @@ -185279,13 +185483,17 @@ entities: - type: DeviceLinkSource linkedPorts: 31484: - - Pressed: Toggle + - - Pressed + - Toggle 31485: - - Pressed: Toggle + - - Pressed + - Toggle 31486: - - Pressed: Toggle + - - Pressed + - Toggle 31487: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 31552 components: - type: Transform @@ -185294,9 +185502,11 @@ entities: - type: DeviceLinkSource linkedPorts: 31551: - - Pressed: Toggle + - - Pressed + - Toggle 31550: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 32703 components: - type: Transform @@ -185308,15 +185518,20 @@ entities: - type: DeviceLinkSource linkedPorts: 32702: - - Pressed: Toggle + - - Pressed + - Toggle 32381: - - Pressed: Toggle + - - Pressed + - Toggle 34226: - - Pressed: Toggle + - - Pressed + - Toggle 32380: - - Pressed: Toggle + - - Pressed + - Toggle 32379: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 34227 components: - type: Transform @@ -185325,15 +185540,20 @@ entities: - type: DeviceLinkSource linkedPorts: 32379: - - Pressed: Toggle + - - Pressed + - Toggle 32380: - - Pressed: Toggle + - - Pressed + - Toggle 32381: - - Pressed: Toggle + - - Pressed + - Toggle 34226: - - Pressed: Toggle + - - Pressed + - Toggle 32702: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 34691 components: - type: MetaData @@ -185344,15 +185564,20 @@ entities: - type: DeviceLinkSource linkedPorts: 34690: - - Pressed: Toggle + - - Pressed + - Toggle 34689: - - Pressed: Toggle + - - Pressed + - Toggle 34688: - - Pressed: Toggle + - - Pressed + - Toggle 34687: - - Pressed: Toggle + - - Pressed + - Toggle 34686: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 34692 components: - type: MetaData @@ -185363,15 +185588,20 @@ entities: - type: DeviceLinkSource linkedPorts: 34685: - - Pressed: Toggle + - - Pressed + - Toggle 34684: - - Pressed: Toggle + - - Pressed + - Toggle 34683: - - Pressed: Toggle + - - Pressed + - Toggle 34682: - - Pressed: Toggle + - - Pressed + - Toggle 34681: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 34695 components: - type: MetaData @@ -185382,15 +185612,20 @@ entities: - type: DeviceLinkSource linkedPorts: 34680: - - Pressed: Toggle + - - Pressed + - Toggle 34679: - - Pressed: Toggle + - - Pressed + - Toggle 34678: - - Pressed: Toggle + - - Pressed + - Toggle 34677: - - Pressed: Toggle + - - Pressed + - Toggle 34676: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 35312 components: - type: MetaData @@ -185401,9 +185636,11 @@ entities: - type: DeviceLinkSource linkedPorts: 35310: - - Pressed: Toggle + - - Pressed + - Toggle 35311: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 20551 @@ -185415,9 +185652,11 @@ entities: - type: DeviceLinkSource linkedPorts: 18558: - - Pressed: Open + - - Pressed + - Open 18557: - - Pressed: Open + - - Pressed + - Open - uid: 24277 components: - type: Transform @@ -185426,7 +185665,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29009: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 24281 components: - type: Transform @@ -185435,7 +185675,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29005: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 24282 components: - type: Transform @@ -185444,7 +185685,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29008: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 24283 components: - type: Transform @@ -185453,7 +185695,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29010: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 24284 components: - type: Transform @@ -185462,7 +185705,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29007: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 24285 components: - type: Transform @@ -185471,7 +185715,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29006: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 26975 components: - type: Transform @@ -185481,7 +185726,8 @@ entities: - type: DeviceLinkSource linkedPorts: 27054: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 35603 components: - type: Transform @@ -185491,9 +185737,11 @@ entities: - type: DeviceLinkSource linkedPorts: 35591: - - Pressed: Toggle + - - Pressed + - Toggle 35590: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalSwitchDirectional entities: - uid: 6941 @@ -185507,19 +185755,29 @@ entities: - type: DeviceLinkSource linkedPorts: 1493: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1492: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 15508: - - On: Open - - On: AutoClose - - Off: Close + - - On + - Open + - - On + - AutoClose + - - Off + - Close 9406: - - On: Open - - On: AutoClose - - Off: Close + - - On + - Open + - - On + - AutoClose + - - Off + - Close - type: Label currentLabel: Front Shutters - type: NameModifier @@ -185537,35 +185795,55 @@ entities: - type: DeviceLinkSource linkedPorts: 10638: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 10645: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9397: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9398: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9396: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9395: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9394: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9393: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9392: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9391: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Front Blast Doors - type: NameModifier @@ -185583,20 +185861,30 @@ entities: - type: DeviceLinkSource linkedPorts: 9405: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9404: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9403: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9401: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9400: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Perma Blast Doors - type: NameModifier @@ -185614,38 +185902,60 @@ entities: - type: DeviceLinkSource linkedPorts: 18502: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 10658: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 10659: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18498: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18463: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18462: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18461: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18460: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18503: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 10661: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18505: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Window Shutters - type: NameModifier @@ -185661,11 +185971,15 @@ entities: - type: DeviceLinkSource linkedPorts: 10638: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 10645: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Cell Blast Doors - type: NameModifier @@ -185678,14 +185992,20 @@ entities: - type: DeviceLinkSource linkedPorts: 25540: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25541: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25542: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 35971 components: - type: MetaData @@ -185697,11 +186017,15 @@ entities: - type: DeviceLinkSource linkedPorts: 9397: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9398: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Cell Blast Doors - type: NameModifier @@ -185719,11 +186043,15 @@ entities: - type: DeviceLinkSource linkedPorts: 9396: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9395: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Cell Blast Doors - type: NameModifier @@ -185741,17 +186069,25 @@ entities: - type: DeviceLinkSource linkedPorts: 9394: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9393: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9392: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9391: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - type: Label currentLabel: Cell Blast Doors - type: NameModifier @@ -185765,14 +186101,20 @@ entities: - type: DeviceLinkSource linkedPorts: 25540: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 25541: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 25542: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - proto: SignAnomaly entities: - uid: 20083 @@ -200876,13 +201218,19 @@ entities: - type: DeviceLinkSource linkedPorts: 11495: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11496: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11550 components: - type: Transform @@ -200891,65 +201239,110 @@ entities: - type: DeviceLinkSource linkedPorts: 11532: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11531: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11530: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11529: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11528: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11518: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11519: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11520: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11521: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11522: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11523: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11524: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11525: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11526: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11527: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11551 components: - type: Transform @@ -200958,37 +201351,61 @@ entities: - type: DeviceLinkSource linkedPorts: 11533: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11534: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11535: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11536: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11537: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11538: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11539: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11540: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11681 components: - type: Transform @@ -200997,9 +201414,12 @@ entities: - type: DeviceLinkSource linkedPorts: 26363: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11835 components: - type: Transform @@ -201008,21 +201428,33 @@ entities: - type: DeviceLinkSource linkedPorts: 11830: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11829: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11828: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11827: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 27052 components: - type: Transform @@ -201031,21 +201463,33 @@ entities: - type: DeviceLinkSource linkedPorts: 27056: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 27055: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 26977: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 26978: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 27053 components: - type: Transform @@ -201054,37 +201498,61 @@ entities: - type: DeviceLinkSource linkedPorts: 27061: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 26976: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 32424: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 27060: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 27059: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 27058: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 27057: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34658: - - Right: Forward - - Left: Reverse - - Middle: Off + - - Right + - Forward + - - Left + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 12083 @@ -225766,7 +226234,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15258: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 8646 components: - type: Transform @@ -225778,7 +226247,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15259: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 9385 components: - type: Transform @@ -225856,7 +226326,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13328: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 32363 components: - type: Transform @@ -225868,7 +226339,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9651: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 36001 components: - type: Transform @@ -225880,7 +226352,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15325: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorBarKitchenLocked entities: - uid: 1220 @@ -226157,9 +226630,11 @@ entities: - type: DeviceLinkSource linkedPorts: 10660: - - DoorStatus: Close + - - DoorStatus + - Close 9337: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 13328 components: - type: Transform @@ -226171,7 +226646,8 @@ entities: - type: DeviceLinkSource linkedPorts: 31762: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 18458 components: - type: Transform @@ -226182,9 +226658,11 @@ entities: - type: DeviceLinkSource linkedPorts: 10660: - - DoorStatus: Close + - - DoorStatus + - Close 9337: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureCommandLocked entities: - uid: 30210 @@ -226271,9 +226749,11 @@ entities: - type: DeviceLinkSource linkedPorts: 11718: - - DoorStatus: Close + - - DoorStatus + - Close 18458: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 10660 components: - type: Transform @@ -226285,7 +226765,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18458: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 18827 components: - type: Transform @@ -226328,7 +226809,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7602: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 15259 components: - type: Transform @@ -226340,7 +226822,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8646: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 15324 components: - type: Transform @@ -226357,7 +226840,8 @@ entities: - type: DeviceLinkSource linkedPorts: 36001: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 15329 components: - type: Transform @@ -226455,7 +226939,8 @@ entities: - type: DeviceLinkSource linkedPorts: 32363: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 10244 components: - type: Transform From 49da5c540b2681bc847bf1bad88e10ef0e666839 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sat, 19 Apr 2025 22:17:03 +1000 Subject: [PATCH 369/622] Try fix RestartTest (#36725) --- .../Tests/GameRules/FailAndStartPresetTest.cs | 4 ++-- Content.Server/GameTicking/GameTicker.GamePreset.cs | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs b/Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs index 3109df890a..b9a02339fb 100644 --- a/Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs +++ b/Content.IntegrationTests/Tests/GameRules/FailAndStartPresetTest.cs @@ -85,7 +85,7 @@ public sealed class FailAndStartPresetTest Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay)); // Try to start nukeops without readying up - await pair.WaitCommand("setgamepreset TestPresetTenPlayers"); + await pair.WaitCommand("setgamepreset TestPresetTenPlayers 9999"); await pair.WaitCommand("startround"); await pair.RunTicksSync(10); @@ -99,7 +99,7 @@ public sealed class FailAndStartPresetTest // Ready up and start nukeops await pair.WaitClientCommand("toggleready True"); Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.ReadyToPlay)); - await pair.WaitCommand("setgamepreset TestPreset"); + await pair.WaitCommand("setgamepreset TestPreset 9999"); await pair.WaitCommand("startround"); await pair.RunTicksSync(10); diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index 14985051e7..c062b95361 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -109,7 +109,11 @@ public sealed partial class GameTicker // Reset counter is checked and changed at the end of each round // So if the game is in the lobby, the first requested round will happen before the check, and we need one less check if (CurrentPreset is null) - ResetCountdown = resetDelay.Value -1; + ResetCountdown = resetDelay.Value - 1; + } + else + { + ResetCountdown = null; } Preset = preset; From e9b49b00efb1d6ad604f67a0276e5798f5877856 Mon Sep 17 00:00:00 2001 From: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> Date: Sat, 19 Apr 2025 08:37:10 -0400 Subject: [PATCH 370/622] Fix a minor warning in BatterySystem.cs (#36726) change timing from protected to private, rename, and adjust references. --- Content.Server/Power/EntitySystems/BatterySystem.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs index 6e636622e6..89e3ed2c1f 100644 --- a/Content.Server/Power/EntitySystems/BatterySystem.cs +++ b/Content.Server/Power/EntitySystems/BatterySystem.cs @@ -13,7 +13,7 @@ namespace Content.Server.Power.EntitySystems [UsedImplicitly] public sealed class BatterySystem : EntitySystem { - [Dependency] protected readonly IGameTiming Timing = default!; + [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { @@ -92,7 +92,7 @@ namespace Content.Server.Power.EntitySystems if (comp.AutoRechargePause) { - if (comp.NextAutoRecharge > Timing.CurTime) + if (comp.NextAutoRecharge > _timing.CurTime) continue; } @@ -179,7 +179,7 @@ namespace Content.Server.Power.EntitySystems if (value < 0) value = batteryself.AutoRechargePauseTime; - if (Timing.CurTime + TimeSpan.FromSeconds(value) <= batteryself.NextAutoRecharge) + if (_timing.CurTime + TimeSpan.FromSeconds(value) <= batteryself.NextAutoRecharge) return; SetChargeCooldown(uid, batteryself.AutoRechargePauseTime, batteryself); @@ -194,9 +194,9 @@ namespace Content.Server.Power.EntitySystems return; if (value >= 0) - batteryself.NextAutoRecharge = Timing.CurTime + TimeSpan.FromSeconds(value); + batteryself.NextAutoRecharge = _timing.CurTime + TimeSpan.FromSeconds(value); else - batteryself.NextAutoRecharge = Timing.CurTime; + batteryself.NextAutoRecharge = _timing.CurTime; } /// <summary> From b435d0f2e67b0c0990b124539a1d7ee757781f90 Mon Sep 17 00:00:00 2001 From: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Date: Sat, 19 Apr 2025 15:10:43 +0200 Subject: [PATCH 371/622] Reduces handheld security radios range for picking people's messages up. (#34878) weh --- Resources/Prototypes/Entities/Objects/Devices/radio.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Objects/Devices/radio.yml b/Resources/Prototypes/Entities/Objects/Devices/radio.yml index 84e15878af..adf094d12e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/radio.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/radio.yml @@ -33,6 +33,7 @@ components: - type: RadioMicrophone broadcastChannel: Security + listenRange: 1 - type: RadioSpeaker channels: - Security From f815825d1e3f6168ad1f6dda6eeb82c5805c2424 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 13:11:49 +0000 Subject: [PATCH 372/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1488fb5207..7bab5ec71c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Alpaccalypse - changes: - - message: Power monitoring computer boards can no longer be researched or printed, - as originally intended. - type: Remove - id: 7756 - time: '2024-12-28T10:13:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34078 - author: psykana changes: - message: Traitor can no longer get multiple objectives to save/help/kill the same @@ -3914,3 +3906,11 @@ id: 8256 time: '2025-04-19T08:49:02.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36714 +- author: Boaz1111 + changes: + - message: Reduced the range at which security radios pick up noise from 4 tiles + to 1 tile. + type: Tweak + id: 8257 + time: '2025-04-19T13:10:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34878 From 35fc2013e3e8440fc96a860ed611e6b033adb09a Mon Sep 17 00:00:00 2001 From: Zokkie <6126135+Zokkie@users.noreply.github.com> Date: Sat, 19 Apr 2025 15:28:30 +0200 Subject: [PATCH 373/622] Flippo Engraved Lighter is now in detective locker (#35165) Makes the Flipp Engraved Lighter from the detective less obscure to find. --- Resources/Prototypes/Catalog/Fills/Lockers/security.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml index dd9b602e00..4d42f2daa4 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml @@ -125,7 +125,8 @@ - id: ClothingHeadHatDetGadget - id: ClothingNeckTieDet - id: ClothingOuterVestDetective - - id: ClothingOuterCoatDetective + - id: ClothingOuterCoatDetectiveLoadout + - id: FlippoEngravedLighter - id: FlashlightSeclite - id: ForensicScanner - id: LogProbeCartridge From bd79d099398e8223d1dfed954ce19338158fe252 Mon Sep 17 00:00:00 2001 From: Benjamin Velliquette <32338704+bVelliquette@users.noreply.github.com> Date: Sat, 19 Apr 2025 09:43:05 -0400 Subject: [PATCH 374/622] Fix Long Produce Time After De-aging A Plant with cryoxadone. (#34668) Update LastProduce when deaging plant from cryoxadone --- .../EntityEffects/Effects/PlantMetabolism/PlantCryoxadone.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Server/EntityEffects/Effects/PlantMetabolism/PlantCryoxadone.cs b/Content.Server/EntityEffects/Effects/PlantMetabolism/PlantCryoxadone.cs index 7fe4b7a170..8a143ea5d5 100644 --- a/Content.Server/EntityEffects/Effects/PlantMetabolism/PlantCryoxadone.cs +++ b/Content.Server/EntityEffects/Effects/PlantMetabolism/PlantCryoxadone.cs @@ -24,6 +24,7 @@ public sealed partial class PlantCryoxadone : EntityEffect else deviation = (int) (seed.Maturation / seed.GrowthStages); plantHolderComp.Age -= deviation; + plantHolderComp.LastProduce = plantHolderComp.Age; plantHolderComp.SkipAging++; plantHolderComp.ForceUpdate = true; } From e214eb7a28da6737edfaae3966ef48edaefc7a42 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 13:44:12 +0000 Subject: [PATCH 375/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7bab5ec71c..e1de5ece0b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: psykana - changes: - - message: Traitor can no longer get multiple objectives to save/help/kill the same - person - type: Fix - id: 7757 - time: '2024-12-28T14:49:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33704 - author: chromiumboy changes: - message: The holoapd UI has been updated to include a text-based filter for the @@ -3914,3 +3906,10 @@ id: 8257 time: '2025-04-19T13:10:43.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34878 +- author: Quantus + changes: + - message: Fixed the unusual delay in production after de-aging a plant with cryoxadone. + type: Fix + id: 8258 + time: '2025-04-19T13:43:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34668 From 6138fcdce9f306c15fd86eaa1884e79e85a9382a Mon Sep 17 00:00:00 2001 From: Milon <milonpl.git@proton.me> Date: Sat, 19 Apr 2025 15:55:05 +0200 Subject: [PATCH 376/622] Predict and cleanup RingerComponent (#35907) * clean up most stuff * move to shared * works * shuffle shit around * oops! access * fixes * todo: everything * SUFFERING * curse you --- .../PDA/Ringer/RingerBoundUserInterface.cs | 82 ++-- Content.Client/PDA/Ringer/RingerSystem.cs | 56 +++ Content.Client/PDA/Ringer/RingtoneMenu.xaml | 11 +- .../PDA/Ringer/RingtoneMenu.xaml.cs | 34 +- .../GameTicking/Rules/TraitorRuleSystem.cs | 18 +- Content.Server/PDA/PdaSystem.cs | 9 +- Content.Server/PDA/Ringer/RingerComponent.cs | 36 -- Content.Server/PDA/Ringer/RingerSystem.cs | 356 ++++++------------ .../PDA/Ringer/RingerUplinkComponent.cs | 24 -- .../Store/Systems/StoreSystem.Ui.cs | 2 +- Content.Shared/PDA/Ringer/RingerComponent.cs | 57 +++ Content.Shared/PDA/Ringer/RingerMessagesUI.cs | 29 +- .../PDA/Ringer/RingerUpdateState.cs | 18 - .../PDA/Ringer/RingerUplinkComponent.cs | 24 ++ Content.Shared/PDA/Ringer/RingerVisuals.cs | 12 +- Content.Shared/PDA/SharedPdaSystem.cs | 6 + Content.Shared/PDA/SharedRingerSystem.cs | 275 ++++++++++++++ .../Entities/Objects/Devices/pda.yml | 1 + 18 files changed, 645 insertions(+), 405 deletions(-) create mode 100644 Content.Client/PDA/Ringer/RingerSystem.cs delete mode 100644 Content.Server/PDA/Ringer/RingerComponent.cs delete mode 100644 Content.Server/PDA/Ringer/RingerUplinkComponent.cs create mode 100644 Content.Shared/PDA/Ringer/RingerComponent.cs delete mode 100644 Content.Shared/PDA/Ringer/RingerUpdateState.cs create mode 100644 Content.Shared/PDA/Ringer/RingerUplinkComponent.cs diff --git a/Content.Client/PDA/Ringer/RingerBoundUserInterface.cs b/Content.Client/PDA/Ringer/RingerBoundUserInterface.cs index 170a296ac2..fc778de7d9 100644 --- a/Content.Client/PDA/Ringer/RingerBoundUserInterface.cs +++ b/Content.Client/PDA/Ringer/RingerBoundUserInterface.cs @@ -7,40 +7,21 @@ using Robust.Shared.Timing; namespace Content.Client.PDA.Ringer { [UsedImplicitly] - public sealed class RingerBoundUserInterface : BoundUserInterface + public sealed class RingerBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) { [ViewVariables] private RingtoneMenu? _menu; - public RingerBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) - { - } - protected override void Open() { base.Open(); _menu = this.CreateWindow<RingtoneMenu>(); _menu.OpenToLeft(); - _menu.TestRingerButton.OnPressed += _ => - { - SendMessage(new RingerPlayRingtoneMessage()); - }; + _menu.TestRingtoneButtonPressed += OnTestRingtoneButtonPressed; + _menu.SetRingtoneButtonPressed += OnSetRingtoneButtonPressed; - _menu.SetRingerButton.OnPressed += _ => - { - if (!TryGetRingtone(out var ringtone)) - return; - - SendMessage(new RingerSetRingtoneMessage(ringtone)); - _menu.SetRingerButton.Disabled = true; - - Timer.Spawn(333, () => - { - if (_menu is { Disposed: false, SetRingerButton: { Disposed: false } ringer}) - ringer.Disabled = false; - }); - }; + Update(); } private bool TryGetRingtone(out Note[] ringtone) @@ -63,36 +44,59 @@ namespace Content.Client.PDA.Ringer return true; } - protected override void UpdateState(BoundUserInterfaceState state) + public override void Update() { - base.UpdateState(state); + base.Update(); - if (_menu == null || state is not RingerUpdateState msg) + if (_menu == null) return; - for (int i = 0; i < _menu.RingerNoteInputs.Length; i++) + if (!EntMan.TryGetComponent(Owner, out RingerComponent? ringer)) + return; + + for (var i = 0; i < _menu.RingerNoteInputs.Length; i++) { + var note = ringer.Ringtone[i].ToString(); - var note = msg.Ringtone[i].ToString(); - if (RingtoneMenu.IsNote(note)) - { - _menu.PreviousNoteInputs[i] = note.Replace("sharp", "#"); - _menu.RingerNoteInputs[i].Text = _menu.PreviousNoteInputs[i]; - } + if (!RingtoneMenu.IsNote(note)) + continue; + _menu.PreviousNoteInputs[i] = note.Replace("sharp", "#"); + _menu.RingerNoteInputs[i].Text = _menu.PreviousNoteInputs[i]; } - _menu.TestRingerButton.Disabled = msg.IsPlaying; + _menu.TestRingerButton.Disabled = ringer.Active; } - - protected override void Dispose(bool disposing) + private void OnTestRingtoneButtonPressed() { - base.Dispose(disposing); - if (!disposing) + if (_menu is null) return; - _menu?.Dispose(); + SendPredictedMessage(new RingerPlayRingtoneMessage()); + + // We disable it instantly to remove the delay before the client receives the next compstate + // Makes the UI feel responsive, will be re-enabled by ringer.Active once it gets an update. + _menu.TestRingerButton.Disabled = true; + } + + private void OnSetRingtoneButtonPressed() + { + if (_menu is null) + return; + + if (!TryGetRingtone(out var ringtone)) + return; + + SendPredictedMessage(new RingerSetRingtoneMessage(ringtone)); + _menu.SetRingerButton.Disabled = true; + + Timer.Spawn(333, + () => + { + if (_menu is { Disposed: false, SetRingerButton: { Disposed: false } ringer} ) + ringer.Disabled = false; + }); } } } diff --git a/Content.Client/PDA/Ringer/RingerSystem.cs b/Content.Client/PDA/Ringer/RingerSystem.cs new file mode 100644 index 0000000000..6d45a8ce8b --- /dev/null +++ b/Content.Client/PDA/Ringer/RingerSystem.cs @@ -0,0 +1,56 @@ +using Content.Shared.PDA; +using Content.Shared.PDA.Ringer; +using Content.Shared.Store.Components; + +namespace Content.Client.PDA.Ringer; + +/// <summary> +/// Handles the client-side logic for <see cref="SharedRingerSystem"/>. +/// </summary> +public sealed class RingerSystem : SharedRingerSystem +{ + /// <inheritdoc/> + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<RingerComponent, AfterAutoHandleStateEvent>(OnRingerUpdate); + } + + /// <summary> + /// Updates the UI whenever we get a new component state from the server. + /// </summary> + private void OnRingerUpdate(Entity<RingerComponent> ent, ref AfterAutoHandleStateEvent args) + { + UpdateRingerUi(ent); + } + + /// <inheritdoc/> + protected override void UpdateRingerUi(Entity<RingerComponent> ent) + { + if (UI.TryGetOpenUi(ent.Owner, RingerUiKey.Key, out var bui)) + { + bui.Update(); + } + } + + /// <inheritdoc/> + public override bool TryToggleUplink(EntityUid uid, Note[] ringtone, EntityUid? user = null) + { + if (!TryComp<RingerUplinkComponent>(uid, out var uplink)) + return false; + + if (!HasComp<StoreComponent>(uid)) + return false; + + // Special case for client-side prediction: + // Since we can't expose the uplink code to clients for security reasons, + // we assume if an antagonist is trying to set a ringtone, it's to unlock the uplink. + // The server will properly verify the code and correct if needed. + if (IsAntagonist(user)) + return ToggleUplinkInternal((uid, uplink)); + + // Non-antagonists never get to toggle the uplink on the client + return false; + } +} diff --git a/Content.Client/PDA/Ringer/RingtoneMenu.xaml b/Content.Client/PDA/Ringer/RingtoneMenu.xaml index 2fff0ab1b5..1bef4d433f 100644 --- a/Content.Client/PDA/Ringer/RingtoneMenu.xaml +++ b/Content.Client/PDA/Ringer/RingtoneMenu.xaml @@ -1,7 +1,8 @@ -<DefaultWindow xmlns="https://spacestation14.io" - Title="{Loc 'comp-ringer-ui-menu-title'}" - MinSize="320 128" - SetSize="320 128"> +<controls:FancyWindow xmlns="https://spacestation14.io" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + Title="{Loc 'comp-ringer-ui-menu-title'}" + MinSize="320 100" + SetSize="320 100"> <BoxContainer Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True" @@ -90,4 +91,4 @@ </BoxContainer> </PanelContainer> </BoxContainer> -</DefaultWindow> +</controls:FancyWindow> diff --git a/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs b/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs index 044714b06f..989fe65843 100644 --- a/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs +++ b/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs @@ -1,6 +1,6 @@ using System.Numerics; +using Content.Client.UserInterface.Controls; using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Content.Shared.PDA; using Robust.Client.UserInterface.Controls; @@ -8,15 +8,21 @@ using Robust.Client.UserInterface.Controls; namespace Content.Client.PDA.Ringer { [GenerateTypedNameReferences] - public sealed partial class RingtoneMenu : DefaultWindow + public sealed partial class RingtoneMenu : FancyWindow { public string[] PreviousNoteInputs = new[] { "A", "A", "A", "A", "A", "A" }; - public LineEdit[] RingerNoteInputs = default!; + public LineEdit[] RingerNoteInputs; + + public event Action? SetRingtoneButtonPressed; + public event Action? TestRingtoneButtonPressed; public RingtoneMenu() { RobustXamlLoader.Load(this); + SetRingerButton.OnPressed += _ => SetRingtoneButtonPressed?.Invoke(); + TestRingerButton.OnPressed += _ => TestRingtoneButtonPressed?.Invoke(); + RingerNoteInputs = new[] { RingerNoteOneInput, RingerNoteTwoInput, RingerNoteThreeInput, RingerNoteFourInput, RingerNoteFiveInput, RingerNoteSixInput }; for (var i = 0; i < RingerNoteInputs.Length; ++i) @@ -43,14 +49,28 @@ namespace Content.Client.PDA.Ringer foo(); input.CursorPosition = input.Text.Length; // Resets caret position to the end of the typed input }; - input.OnTextChanged += _ => - { - input.Text = input.Text.ToUpper(); - if (!IsNote(input.Text)) + input.OnTextChanged += args => + { + // Convert to uppercase + var upperText = args.Text.ToUpper(); + + // Filter to only valid notes + var newText = upperText; + if (!IsNote(newText)) + { + newText = PreviousNoteInputs[index]; input.AddStyleClass("Caution"); + } else + { + PreviousNoteInputs[index] = newText; input.RemoveStyleClass("Caution"); + } + + // Only update if there's a change + if (newText != input.Text) + input.Text = newText; }; } } diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index 4d041af3a0..790b14579e 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -184,13 +184,19 @@ public sealed class TraitorRuleSystem : GameRuleSystem<TraitorRuleComponent> { Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink is PDA"); // Codes are only generated if the uplink is a PDA - code = EnsureComp<RingerUplinkComponent>(pda.Value).Code; + var ev = new GenerateUplinkCodeEvent(); + RaiseLocalEvent(pda.Value, ref ev); - // If giveUplink is false the uplink code part is omitted - briefing = string.Format("{0}\n{1}", - briefing, - Loc.GetString("traitor-role-uplink-code-short", ("code", string.Join("-", code).Replace("sharp", "#")))); - return (code, briefing); + if (ev.Code is { } generatedCode) + { + code = generatedCode; + + // If giveUplink is false the uplink code part is omitted + briefing = string.Format("{0}\n{1}", + briefing, + Loc.GetString("traitor-role-uplink-code-short", ("code", string.Join("-", code).Replace("sharp", "#")))); + return (code, briefing); + } } else if (pda is null && uplinked) { diff --git a/Content.Server/PDA/PdaSystem.cs b/Content.Server/PDA/PdaSystem.cs index bdf688efe7..bfa8e1825d 100644 --- a/Content.Server/PDA/PdaSystem.cs +++ b/Content.Server/PDA/PdaSystem.cs @@ -10,15 +10,16 @@ using Content.Server.Traitor.Uplink; using Content.Shared.Access.Components; using Content.Shared.CartridgeLoader; using Content.Shared.Chat; +using Content.Shared.DeviceNetwork.Components; using Content.Shared.Light; using Content.Shared.Light.EntitySystems; using Content.Shared.PDA; +using Content.Shared.PDA.Ringer; using Robust.Server.Containers; using Robust.Server.GameObjects; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Utility; -using Content.Shared.DeviceNetwork.Components; namespace Content.Server.PDA { @@ -166,7 +167,7 @@ namespace Content.Server.PDA /// <summary> /// Send new UI state to clients, call if you modify something like uplink. /// </summary> - public void UpdatePdaUi(EntityUid uid, PdaComponent? pda = null) + public override void UpdatePdaUi(EntityUid uid, PdaComponent? pda = null) { if (!Resolve(uid, ref pda, false)) return; @@ -243,7 +244,7 @@ namespace Content.Server.PDA return; if (HasComp<RingerComponent>(uid)) - _ringer.ToggleRingerUI(uid, msg.Actor); + _ringer.TryToggleRingerUi(uid, msg.Actor); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowMusicMessage msg) @@ -272,7 +273,7 @@ namespace Content.Server.PDA if (TryComp<RingerUplinkComponent>(uid, out var uplink)) { - _ringer.LockUplink(uid, uplink); + _ringer.LockUplink((uid, uplink)); UpdatePdaUi(uid, pda); } } diff --git a/Content.Server/PDA/Ringer/RingerComponent.cs b/Content.Server/PDA/Ringer/RingerComponent.cs deleted file mode 100644 index 55dc458b74..0000000000 --- a/Content.Server/PDA/Ringer/RingerComponent.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Content.Shared.PDA; - -namespace Content.Server.PDA.Ringer -{ - [RegisterComponent] - public sealed partial class RingerComponent : Component - { - [DataField("ringtone")] - public Note[] Ringtone = new Note[SharedRingerSystem.RingtoneLength]; - - [DataField("timeElapsed")] - public float TimeElapsed = 0; - - /// <summary> - /// Keeps track of how many notes have elapsed if the ringer component is playing. - /// </summary> - [DataField("noteCount")] - public int NoteCount = 0; - - /// <summary> - /// How far the sound projects in metres. - /// </summary> - [ViewVariables(VVAccess.ReadWrite)] - [DataField("range")] - public float Range = 3f; - - [ViewVariables(VVAccess.ReadWrite)] - [DataField("volume")] - public float Volume = -4f; - } - - [RegisterComponent] - public sealed partial class ActiveRingerComponent : Component - { - } -} diff --git a/Content.Server/PDA/Ringer/RingerSystem.cs b/Content.Server/PDA/Ringer/RingerSystem.cs index 0cc4ea86c2..dbdc5e83f3 100644 --- a/Content.Server/PDA/Ringer/RingerSystem.cs +++ b/Content.Server/PDA/Ringer/RingerSystem.cs @@ -1,253 +1,131 @@ using System.Linq; -using System.Runtime.InteropServices; -using Content.Server.Store.Components; using Content.Server.Store.Systems; using Content.Shared.PDA; using Content.Shared.PDA.Ringer; -using Content.Shared.Popups; -using Content.Shared.Store; using Content.Shared.Store.Components; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; -using Robust.Shared.Network; -using Robust.Shared.Player; using Robust.Shared.Random; -using Robust.Shared.Timing; -using Robust.Shared.Utility; -using Robust.Server.Audio; -namespace Content.Server.PDA.Ringer +namespace Content.Server.PDA.Ringer; + +/// <summary> +/// Handles the server-side logic for <see cref="SharedRingerSystem"/>. +/// </summary> +public sealed class RingerSystem : SharedRingerSystem { - public sealed class RingerSystem : SharedRingerSystem + [Dependency] private readonly IRobustRandom _random = default!; + + /// <inheritdoc/> + public override void Initialize() { - [Dependency] private readonly PdaSystem _pda = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly UserInterfaceSystem _ui = default!; - [Dependency] private readonly AudioSystem _audio = default!; - [Dependency] private readonly SharedPopupSystem _popupSystem = default!; - [Dependency] private readonly TransformSystem _transform = default!; + base.Initialize(); - private readonly Dictionary<NetUserId, TimeSpan> _lastSetRingtoneAt = new(); + SubscribeLocalEvent<RingerComponent, MapInitEvent>(OnMapInit); + SubscribeLocalEvent<RingerComponent, CurrencyInsertAttemptEvent>(OnCurrencyInsert); - public override void Initialize() - { - base.Initialize(); - - // General Event Subscriptions - SubscribeLocalEvent<RingerComponent, MapInitEvent>(RandomizeRingtone); - SubscribeLocalEvent<RingerUplinkComponent, ComponentInit>(RandomizeUplinkCode); - // RingerBoundUserInterface Subscriptions - SubscribeLocalEvent<RingerComponent, RingerSetRingtoneMessage>(OnSetRingtone); - SubscribeLocalEvent<RingerUplinkComponent, BeforeRingtoneSetEvent>(OnSetUplinkRingtone); - SubscribeLocalEvent<RingerComponent, RingerPlayRingtoneMessage>(RingerPlayRingtone); - SubscribeLocalEvent<RingerComponent, RingerRequestUpdateInterfaceMessage>(UpdateRingerUserInterfaceDriver); - - SubscribeLocalEvent<RingerComponent, CurrencyInsertAttemptEvent>(OnCurrencyInsert); - } - - //Event Functions - - private void OnCurrencyInsert(EntityUid uid, RingerComponent ringer, CurrencyInsertAttemptEvent args) - { - if (!TryComp<RingerUplinkComponent>(uid, out var uplink)) - { - args.Cancel(); - return; - } - - // if the store can be locked, it must be unlocked first before inserting currency. Stops traitor checking. - if (!uplink.Unlocked) - args.Cancel(); - } - - private void RingerPlayRingtone(EntityUid uid, RingerComponent ringer, RingerPlayRingtoneMessage args) - { - EnsureComp<ActiveRingerComponent>(uid); - - _popupSystem.PopupEntity(Loc.GetString("comp-ringer-vibration-popup"), uid, Filter.Pvs(uid, 0.05f), false, PopupType.Small); - - UpdateRingerUserInterface(uid, ringer, true); - } - - public void RingerPlayRingtone(Entity<RingerComponent?> ent) - { - if (!Resolve(ent, ref ent.Comp)) - return; - - EnsureComp<ActiveRingerComponent>(ent); - - _popupSystem.PopupEntity(Loc.GetString("comp-ringer-vibration-popup"), ent, Filter.Pvs(ent, 0.05f), false, PopupType.Medium); - - UpdateRingerUserInterface(ent, ent.Comp, true); - } - - private void UpdateRingerUserInterfaceDriver(EntityUid uid, RingerComponent ringer, RingerRequestUpdateInterfaceMessage args) - { - UpdateRingerUserInterface(uid, ringer, HasComp<ActiveRingerComponent>(uid)); - } - - private void OnSetRingtone(EntityUid uid, RingerComponent ringer, RingerSetRingtoneMessage args) - { - if (!TryComp(args.Actor, out ActorComponent? actorComp)) - return; - - ref var lastSetAt = ref CollectionsMarshal.GetValueRefOrAddDefault(_lastSetRingtoneAt, actorComp.PlayerSession.UserId, out var exists); - - // Delay on the client is 0.333, 0.25 is still enough and gives some leeway in case of small time differences - if (exists && lastSetAt > _gameTiming.CurTime - TimeSpan.FromMilliseconds(250)) - return; - - lastSetAt = _gameTiming.CurTime; - - // Client sent us an updated ringtone so set it to that. - if (args.Ringtone.Length != RingtoneLength) - return; - - var ev = new BeforeRingtoneSetEvent(args.Ringtone); - RaiseLocalEvent(uid, ref ev); - if (ev.Handled) - return; - - UpdateRingerRingtone(uid, ringer, args.Ringtone); - } - - private void OnSetUplinkRingtone(EntityUid uid, RingerUplinkComponent uplink, ref BeforeRingtoneSetEvent args) - { - if (uplink.Code.SequenceEqual(args.Ringtone) && HasComp<StoreComponent>(uid)) - { - uplink.Unlocked = !uplink.Unlocked; - if (TryComp<PdaComponent>(uid, out var pda)) - _pda.UpdatePdaUi(uid, pda); - - // can't keep store open after locking it - if (!uplink.Unlocked) - _ui.CloseUi(uid, StoreUiKey.Key); - - // no saving the code to prevent meta click set on sus guys pda -> wewlad - args.Handled = true; - } - } - - /// <summary> - /// Locks the uplink and closes the window, if its open - /// </summary> - /// <remarks> - /// Will not update the PDA ui so you must do that yourself if needed - /// </remarks> - public void LockUplink(EntityUid uid, RingerUplinkComponent? uplink) - { - if (!Resolve(uid, ref uplink, true)) - return; - - uplink.Unlocked = false; - _ui.CloseUi(uid, StoreUiKey.Key); - } - - public void RandomizeRingtone(EntityUid uid, RingerComponent ringer, MapInitEvent args) - { - UpdateRingerRingtone(uid, ringer, GenerateRingtone()); - } - - public void RandomizeUplinkCode(EntityUid uid, RingerUplinkComponent uplink, ComponentInit args) - { - uplink.Code = GenerateRingtone(); - } - - //Non Event Functions - - private Note[] GenerateRingtone() - { - // Default to using C pentatonic so it at least sounds not terrible. - return GenerateRingtone(new[] - { - Note.C, - Note.D, - Note.E, - Note.G, - Note.A - }); - } - - private Note[] GenerateRingtone(Note[] notes) - { - var ringtone = new Note[RingtoneLength]; - - for (var i = 0; i < RingtoneLength; i++) - { - ringtone[i] = _random.Pick(notes); - } - - return ringtone; - } - - private bool UpdateRingerRingtone(EntityUid uid, RingerComponent ringer, Note[] ringtone) - { - // Assume validation has already happened. - ringer.Ringtone = ringtone; - UpdateRingerUserInterface(uid, ringer, HasComp<ActiveRingerComponent>(uid)); - - return true; - } - - private void UpdateRingerUserInterface(EntityUid uid, RingerComponent ringer, bool isPlaying) - { - _ui.SetUiState(uid, RingerUiKey.Key, new RingerUpdateState(isPlaying, ringer.Ringtone)); - } - - public bool ToggleRingerUI(EntityUid uid, EntityUid actor) - { - _ui.TryToggleUi(uid, RingerUiKey.Key, actor); - return true; - } - - public override void Update(float frameTime) //Responsible for actually playing the ringtone - { - var remove = new RemQueue<EntityUid>(); - - var pdaQuery = EntityQueryEnumerator<RingerComponent, ActiveRingerComponent>(); - while (pdaQuery.MoveNext(out var uid, out var ringer, out var _)) - { - ringer.TimeElapsed += frameTime; - - if (ringer.TimeElapsed < NoteDelay) - continue; - - ringer.TimeElapsed -= NoteDelay; - var ringerXform = Transform(uid); - - _audio.PlayEntity( - GetSound(ringer.Ringtone[ringer.NoteCount]), - Filter.Empty().AddInRange(_transform.GetMapCoordinates(uid, ringerXform), ringer.Range), - uid, - true, - AudioParams.Default.WithMaxDistance(ringer.Range).WithVolume(ringer.Volume) - ); - - ringer.NoteCount++; - - if (ringer.NoteCount > RingtoneLength - 1) - { - remove.Add(uid); - UpdateRingerUserInterface(uid, ringer, false); - ringer.TimeElapsed = 0; - ringer.NoteCount = 0; - break; - } - } - - foreach (var ent in remove) - { - RemComp<ActiveRingerComponent>(ent); - } - } - - private static string GetSound(Note note) - { - return new ResPath("/Audio/Effects/RingtoneNotes/" + note.ToString().ToLower()) + ".ogg"; - } + SubscribeLocalEvent<RingerUplinkComponent, GenerateUplinkCodeEvent>(OnGenerateUplinkCode); } - [ByRefEvent] - public record struct BeforeRingtoneSetEvent(Note[] Ringtone, bool Handled = false); + /// <summary> + /// Randomizes a ringtone for <see cref="RingerComponent"/> on <see cref="MapInitEvent"/>. + /// </summary> + private void OnMapInit(Entity<RingerComponent> ent, ref MapInitEvent args) + { + UpdateRingerRingtone(ent, GenerateRingtone()); + } + + /// <summary> + /// Handles the <see cref="CurrencyInsertAttemptEvent"/> for <see cref="RingerUplinkComponent"/>. + /// </summary> + private void OnCurrencyInsert(Entity<RingerComponent> ent, ref CurrencyInsertAttemptEvent args) + { + // TODO: Store isn't predicted, can't move it to shared + if (!TryComp<RingerUplinkComponent>(ent, out var uplink)) + { + args.Cancel(); + return; + } + + // if the store can be locked, it must be unlocked first before inserting currency. Stops traitor checking. + if (!uplink.Unlocked) + args.Cancel(); + } + + /// <summary> + /// Handles the <see cref="GenerateUplinkCodeEvent"/> for generating an uplink code. + /// </summary> + private void OnGenerateUplinkCode(Entity<RingerUplinkComponent> ent, ref GenerateUplinkCodeEvent ev) + { + // Generate a new uplink code + var code = GenerateRingtone(); + + // Set the code on the component + ent.Comp.Code = code; + + // Return the code via the event + ev.Code = code; + } + + /// <inheritdoc/> + public override bool TryToggleUplink(EntityUid uid, Note[] ringtone, EntityUid? user = null) + { + if (!TryComp<RingerUplinkComponent>(uid, out var uplink)) + return false; + + if (!HasComp<StoreComponent>(uid)) + return false; + + // On the server, we always check if the code matches + if (!uplink.Code.SequenceEqual(ringtone)) + return false; + + return ToggleUplinkInternal((uid, uplink)); + } + + /// <summary> + /// Generates a random ringtone using the C pentatonic scale. + /// </summary> + /// <returns>An array of Notes representing the ringtone.</returns> + /// <remarks>The logic for this is on the Server so that we don't get a different result on the Client every time.</remarks> + private Note[] GenerateRingtone() + { + // Default to using C pentatonic so it at least sounds not terrible. + return GenerateRingtone(new[] + { + Note.C, + Note.D, + Note.E, + Note.G, + Note.A + }); + } + + /// <summary> + /// Generates a random ringtone using the specified notes. + /// </summary> + /// <param name="notes">The notes to choose from when generating the ringtone.</param> + /// <returns>An array of Notes representing the ringtone.</returns> + /// <remarks>The logic for this is on the Server so that we don't get a different result on the Client every time.</remarks> + private Note[] GenerateRingtone(Note[] notes) + { + var ringtone = new Note[RingtoneLength]; + + for (var i = 0; i < RingtoneLength; i++) + { + ringtone[i] = _random.Pick(notes); + } + + return ringtone; + } +} + +/// <summary> +/// Event raised to generate a new uplink code for a PDA. +/// </summary> +[ByRefEvent] +public record struct GenerateUplinkCodeEvent +{ + /// <summary> + /// The generated uplink code (filled in by the event handler). + /// </summary> + public Note[]? Code; } diff --git a/Content.Server/PDA/Ringer/RingerUplinkComponent.cs b/Content.Server/PDA/Ringer/RingerUplinkComponent.cs deleted file mode 100644 index 4ffedf3af4..0000000000 --- a/Content.Server/PDA/Ringer/RingerUplinkComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Shared.PDA; - -namespace Content.Server.PDA.Ringer; - -/// <summary> -/// Opens the store ui when the ringstone is set to the secret code. -/// Traitors are told the code when greeted. -/// </summary> -[RegisterComponent, Access(typeof(RingerSystem))] -public sealed partial class RingerUplinkComponent : Component -{ - /// <summary> - /// Notes to set ringtone to in order to lock or unlock the uplink. - /// Automatically initialized to random notes. - /// </summary> - [DataField("code")] - public Note[] Code = new Note[RingerSystem.RingtoneLength]; - - /// <summary> - /// Whether to show the toggle uplink button in pda settings. - /// </summary> - [DataField("unlocked"), ViewVariables(VVAccess.ReadWrite)] - public bool Unlocked; -} diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 93bbd3bd96..587270bd64 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.Actions; using Content.Server.Administration.Logs; -using Content.Server.PDA.Ringer; using Content.Server.Stack; using Content.Server.Store.Components; using Content.Shared.Actions; @@ -9,6 +8,7 @@ using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Hands.EntitySystems; using Content.Shared.Mind; +using Content.Shared.PDA.Ringer; using Content.Shared.Store; using Content.Shared.Store.Components; using Content.Shared.UserInterface; diff --git a/Content.Shared/PDA/Ringer/RingerComponent.cs b/Content.Shared/PDA/Ringer/RingerComponent.cs new file mode 100644 index 0000000000..81cdb2522c --- /dev/null +++ b/Content.Shared/PDA/Ringer/RingerComponent.cs @@ -0,0 +1,57 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.PDA.Ringer; + +[RegisterComponent, NetworkedComponent, Access(typeof(SharedRingerSystem))] +[AutoGenerateComponentState(true, fieldDeltas: true), AutoGenerateComponentPause] +public sealed partial class RingerComponent : Component +{ + /// <summary> + /// The ringtone, represented as an array of notes. + /// </summary> + [DataField, AutoNetworkedField] + public Note[] Ringtone = new Note[SharedRingerSystem.RingtoneLength]; + + /// <summary> + /// The last time this ringer's ringtone was set. + /// </summary> + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField, AutoNetworkedField] + public TimeSpan NextRingtoneSetTime; + + /// <summary> + /// The time when the next note should play. + /// </summary> + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField, AutoNetworkedField] + public TimeSpan? NextNoteTime; + + /// <summary> + /// The cooldown before the ringtone can be changed again. + /// </summary> + [DataField] + public TimeSpan Cooldown = TimeSpan.FromMilliseconds(250); + + /// <summary> + /// Keeps track of how many notes have elapsed if the ringer component is playing. + /// </summary> + [DataField, AutoNetworkedField] + public int NoteCount; + + /// <summary> + /// How far the sound projects in metres. + /// </summary> + [DataField, AutoNetworkedField] + public float Range = 3f; + + /// <summary> + /// The ringtone volume. + /// </summary> + [DataField, AutoNetworkedField] + public float Volume = -4f; + + /// <summary> + /// Whether the ringer is currently playing its ringtone. + /// </summary> + [DataField, AutoNetworkedField] + public bool Active; +} diff --git a/Content.Shared/PDA/Ringer/RingerMessagesUI.cs b/Content.Shared/PDA/Ringer/RingerMessagesUI.cs index 36867284b4..d737c7b3b4 100644 --- a/Content.Shared/PDA/Ringer/RingerMessagesUI.cs +++ b/Content.Shared/PDA/Ringer/RingerMessagesUI.cs @@ -1,26 +1,17 @@ using Robust.Shared.Serialization; -namespace Content.Shared.PDA.Ringer +namespace Content.Shared.PDA.Ringer; + +[Serializable, NetSerializable] +public sealed class RingerPlayRingtoneMessage : BoundUserInterfaceMessage; + +[Serializable, NetSerializable] +public sealed class RingerSetRingtoneMessage : BoundUserInterfaceMessage { + public Note[] Ringtone { get; } - [Serializable, NetSerializable] - public sealed class RingerRequestUpdateInterfaceMessage : BoundUserInterfaceMessage + public RingerSetRingtoneMessage(Note[] ringTone) { - } - - [Serializable, NetSerializable] - public sealed class RingerPlayRingtoneMessage : BoundUserInterfaceMessage - { - } - - [Serializable, NetSerializable] - public sealed class RingerSetRingtoneMessage : BoundUserInterfaceMessage - { - public Note[] Ringtone { get; } - - public RingerSetRingtoneMessage(Note[] ringTone) - { - Ringtone = ringTone; - } + Ringtone = ringTone; } } diff --git a/Content.Shared/PDA/Ringer/RingerUpdateState.cs b/Content.Shared/PDA/Ringer/RingerUpdateState.cs deleted file mode 100644 index 9d2eccd1a7..0000000000 --- a/Content.Shared/PDA/Ringer/RingerUpdateState.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.PDA.Ringer -{ - [Serializable, NetSerializable] - public sealed class RingerUpdateState : BoundUserInterfaceState - { - public bool IsPlaying; - public Note[] Ringtone; - - public RingerUpdateState(bool isPlay, Note[] ringtone) - { - IsPlaying = isPlay; - Ringtone = ringtone; - } - } - -} diff --git a/Content.Shared/PDA/Ringer/RingerUplinkComponent.cs b/Content.Shared/PDA/Ringer/RingerUplinkComponent.cs new file mode 100644 index 0000000000..e3170c84e3 --- /dev/null +++ b/Content.Shared/PDA/Ringer/RingerUplinkComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.PDA.Ringer; + +/// <summary> +/// Opens the store UI when the ringstone is set to the secret code. +/// Traitors are told the code when greeted. +/// </summary> +[RegisterComponent, NetworkedComponent, Access(typeof(SharedRingerSystem))] +public sealed partial class RingerUplinkComponent : Component +{ + /// <summary> + /// Notes to set ringtone to in order to lock or unlock the uplink. + /// Set via GenerateUplinkCodeEvent. + /// </summary> + [DataField] + public Note[] Code = new Note[SharedRingerSystem.RingtoneLength]; + + /// <summary> + /// Whether to show the toggle uplink button in PDA settings. + /// </summary> + [DataField] + public bool Unlocked; +} diff --git a/Content.Shared/PDA/Ringer/RingerVisuals.cs b/Content.Shared/PDA/Ringer/RingerVisuals.cs index 44e5e818d3..32c9fb3a38 100644 --- a/Content.Shared/PDA/Ringer/RingerVisuals.cs +++ b/Content.Shared/PDA/Ringer/RingerVisuals.cs @@ -1,11 +1,9 @@ using Robust.Shared.Serialization; -namespace Content.Shared.PDA.Ringer -{ - [Serializable, NetSerializable] - public enum RingerUiKey - { - Key - } +namespace Content.Shared.PDA.Ringer; +[Serializable, NetSerializable] +public enum RingerUiKey : byte +{ + Key, } diff --git a/Content.Shared/PDA/SharedPdaSystem.cs b/Content.Shared/PDA/SharedPdaSystem.cs index bd291a3843..38a3899f7f 100644 --- a/Content.Shared/PDA/SharedPdaSystem.cs +++ b/Content.Shared/PDA/SharedPdaSystem.cs @@ -66,5 +66,11 @@ namespace Content.Shared.PDA { Appearance.SetData(uid, PdaVisuals.IdCardInserted, pda.ContainedId != null); } + + public virtual void UpdatePdaUi(EntityUid uid, PdaComponent? pda = null) + { + // This does nothing yet while I finish up PDA prediction + // Overriden by the server + } } } diff --git a/Content.Shared/PDA/SharedRingerSystem.cs b/Content.Shared/PDA/SharedRingerSystem.cs index 5652a60599..278ab94307 100644 --- a/Content.Shared/PDA/SharedRingerSystem.cs +++ b/Content.Shared/PDA/SharedRingerSystem.cs @@ -1,14 +1,289 @@ +using Content.Shared.Mind; +using Content.Shared.PDA.Ringer; +using Content.Shared.Popups; +using Content.Shared.Roles; +using Content.Shared.Store; +using JetBrains.Annotations; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Network; +using Robust.Shared.Player; using Robust.Shared.Serialization; +using Robust.Shared.Timing; namespace Content.Shared.PDA; +/// <summary> +/// Handles the shared functionality for PDA ringtones. +/// </summary> public abstract class SharedRingerSystem : EntitySystem { public const int RingtoneLength = 6; public const int NoteTempo = 300; public const float NoteDelay = 60f / NoteTempo; + + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedPdaSystem _pda = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedRoleSystem _role = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] protected readonly SharedUserInterfaceSystem UI = default!; + + /// <inheritdoc/> + public override void Initialize() + { + base.Initialize(); + + // RingerBoundUserInterface Subscriptions + SubscribeLocalEvent<RingerComponent, RingerSetRingtoneMessage>(OnSetRingtone); + SubscribeLocalEvent<RingerComponent, RingerPlayRingtoneMessage>(OnPlayRingtone); + } + + /// <inheritdoc/> + public override void Update(float frameTime) + { + var ringerQuery = EntityQueryEnumerator<RingerComponent>(); + while (ringerQuery.MoveNext(out var uid, out var ringer)) + { + if (!ringer.Active || !ringer.NextNoteTime.HasValue) + continue; + + var curTime = _timing.CurTime; + + // Check if it's time to play the next note + if (curTime < ringer.NextNoteTime.Value) + continue; + + // Play the note + // We only do this on the server because otherwise the sound either dupes or blends into a mess + // There's no easy way to figure out which player started it, so that we can exclude them from the list + // and play it separately with PlayLocal, so that it's actually predicted + if (_net.IsServer) + { + var ringerXform = Transform(uid); + _audio.PlayEntity( + GetSound(ringer.Ringtone[ringer.NoteCount]), + Filter.Empty().AddInRange(_xform.GetMapCoordinates(uid, ringerXform), ringer.Range), + uid, + true, + AudioParams.Default.WithMaxDistance(ringer.Range).WithVolume(ringer.Volume) + ); + } + + // Schedule next note + ringer.NextNoteTime = curTime + TimeSpan.FromSeconds(NoteDelay); + ringer.NoteCount++; + + // Dirty the fields we just changed + DirtyFields(uid, + ringer, + null, + nameof(RingerComponent.NextNoteTime), + nameof(RingerComponent.NoteCount)); + + // Check if we've finished playing all notes + if (ringer.NoteCount >= RingtoneLength) + { + ringer.Active = false; + ringer.NextNoteTime = null; + ringer.NoteCount = 0; + + DirtyFields(uid, + ringer, + null, + nameof(RingerComponent.Active), + nameof(RingerComponent.NextNoteTime), + nameof(RingerComponent.NoteCount)); + + UpdateRingerUi((uid, ringer)); + } + } + } + + #region Public API + + /// <summary> + /// Plays the ringtone on the device with the given RingerComponent. + /// </summary> + public void RingerPlayRingtone(Entity<RingerComponent?> ent) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + StartRingtone((ent, ent.Comp)); + } + + /// <summary> + /// Toggles the ringer UI for the given entity. + /// </summary> + /// <param name="uid">The entity containing the ringer UI.</param> + /// <param name="actor">The entity that's interacting with the UI.</param> + /// <returns>True if the UI toggle was successful.</returns> + public bool TryToggleRingerUi(EntityUid uid, EntityUid actor) + { + UI.TryToggleUi(uid, RingerUiKey.Key, actor); + return true; + } + + /// <summary> + /// Locks the uplink and closes the window, if its open. + /// </summary> + /// <remarks> + /// Will not update the PDA ui so you must do that yourself if needed. + /// </remarks> + public void LockUplink(Entity<RingerUplinkComponent?> ent) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + ent.Comp.Unlocked = false; + UI.CloseUi(ent.Owner, StoreUiKey.Key); + } + + /// <summary> + /// Attempts to unlock or lock the uplink by checking the provided ringtone against the uplink code. + /// On the client side, for antagonists, the code check is skipped to support prediction. + /// On the server side, the code is always verified. + /// </summary> + /// <param name="uid">The entity with the RingerUplinkComponent.</param> + /// <param name="ringtone">The ringtone to check against the uplink code.</param> + /// <param name="user">The entity attempting to toggle the uplink. If the user is an antagonist, + /// the ringtone code check will be skipped on the client to allow prediction.</param> + /// <returns>True if the uplink state was toggled, false otherwise.</returns> + [PublicAPI] + public abstract bool TryToggleUplink(EntityUid uid, Note[] ringtone, EntityUid? user = null); + + #endregion + + // UI Message event handlers + + /// <summary> + /// Handles the <see cref="RingerSetRingtoneMessage"/> from the client UI. + /// </summary> + private void OnSetRingtone(Entity<RingerComponent> ent, ref RingerSetRingtoneMessage args) + { + // Prevent ringtone spam by checking the last time this ringtone was set + var curTime = _timing.CurTime; + if (ent.Comp.NextRingtoneSetTime > curTime) + return; + + ent.Comp.NextRingtoneSetTime = curTime + ent.Comp.Cooldown; + DirtyField(ent.AsNullable(), nameof(RingerComponent.NextRingtoneSetTime)); + + // Client sent us an updated ringtone so set it to that. + if (args.Ringtone.Length != RingtoneLength) + return; + + // Try to toggle the uplink first + if (TryToggleUplink(ent, args.Ringtone)) + return; // Don't save the uplink code as the ringtone + + UpdateRingerRingtone(ent, args.Ringtone); + } + + /// <summary> + /// Handles the <see cref="RingerPlayRingtoneMessage"/> from the client UI. + /// </summary> + private void OnPlayRingtone(Entity<RingerComponent> ent, ref RingerPlayRingtoneMessage args) + { + StartRingtone(ent); + } + + // Helper methods + + /// <summary> + /// Starts playing the ringtone on the device. + /// </summary> + private void StartRingtone(Entity<RingerComponent> ent) + { + // Already active? Don't start it again + if (ent.Comp.Active) + return; + + ent.Comp.Active = true; + ent.Comp.NoteCount = 0; + ent.Comp.NextNoteTime = _timing.CurTime; + + UpdateRingerUi(ent); + + _popup.PopupPredicted(Loc.GetString("comp-ringer-vibration-popup"), + ent, + ent.Owner, + Filter.Pvs(ent, 0.05f), + false, + PopupType.Medium); + + DirtyFields(ent.AsNullable(), + null, + nameof(RingerComponent.NextNoteTime), + nameof(RingerComponent.Active), + nameof(RingerComponent.NoteCount)); + } + + /// <summary> + /// Updates the ringer's ringtone and notifies clients. + /// </summary> + /// <param name="ent">Entity with RingerComponent to update.</param> + /// <param name="ringtone">The new ringtone to set.</param> + protected void UpdateRingerRingtone(Entity<RingerComponent> ent, Note[] ringtone) + { + // Assume validation has already happened. + ent.Comp.Ringtone = ringtone; + DirtyField(ent.AsNullable(), nameof(RingerComponent.Ringtone)); + UpdateRingerUi(ent); + } + + /// <summary> + /// Base implementation for toggle uplink processing after verification. + /// </summary> + protected bool ToggleUplinkInternal(Entity<RingerUplinkComponent> ent) + { + // Toggle the unlock state + ent.Comp.Unlocked = !ent.Comp.Unlocked; + + // Update PDA UI if needed + if (TryComp<PdaComponent>(ent, out var pda)) + _pda.UpdatePdaUi(ent, pda); + + // Close store UI if we're locking + if (!ent.Comp.Unlocked) + UI.CloseUi(ent.Owner, StoreUiKey.Key); + + return true; + } + + /// <summary> + /// Helper method to determine if the mind is an antagonist. + /// </summary> + protected bool IsAntagonist(EntityUid? user) + { + return user != null && _mind.TryGetMind(user.Value, out var mindId, out _) && _role.MindIsAntagonist(mindId); + } + + /// <summary> + /// Gets the sound path for a specific note. + /// </summary> + /// <param name="note">The note to get the sound for.</param> + /// <returns>A SoundPathSpecifier pointing to the sound file for the note.</returns> + private static SoundPathSpecifier GetSound(Note note) + { + return new SoundPathSpecifier($"/Audio/Effects/RingtoneNotes/{note.ToString().ToLower()}.ogg"); + } + + /// <summary> + /// Updates the RingerBoundUserInterface. + /// </summary> + protected virtual void UpdateRingerUi(Entity<RingerComponent> ent) + { + } } +/// <summary> +/// Enum representing musical notes for ringtones. +/// </summary> [Serializable, NetSerializable] public enum Note : byte { diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 1f52c154c7..e47d6d2ec7 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -68,6 +68,7 @@ softness: 5 autoRot: true - type: Ringer + - type: RingerUplink - type: DeviceNetwork deviceNetId: Wireless receiveFrequencyId: PDA From aa5d344a575fba462462ed62390fc82d38c592aa Mon Sep 17 00:00:00 2001 From: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Date: Sat, 19 Apr 2025 10:03:05 -0400 Subject: [PATCH 377/622] ERT Janitor Weapon - Hydra (#34416) * checkpointing work * Got this fully working and all sprites done * Exchanged my sprites with the ones made by AugustSun * Changed the name to Hydra Launcher, and adjusted it to function like a revolver instead. * Modified the hydra to be a revolver * fixed container issue * Swapped in even newer sprites * review --------- Co-authored-by: Milon <milonpl.git@proton.me> --- .../Weapons/Guns/Ammunition/explosives.yml | 17 ++++++++ .../Weapons/Guns/Launchers/launchers.yml | 40 +++++++++++++++++ .../Weapons/Guns/Projectiles/projectiles.yml | 30 +++++++++++++ .../Explosives/explosives.rsi/cleanade.png | Bin 0 -> 517 bytes .../Explosives/explosives.rsi/meta.json | 5 ++- .../hydra_launcher.rsi/bolt-open.png | Bin 0 -> 687 bytes .../hydra_launcher.rsi/equipped-BACKPACK.png | Bin 0 -> 1032 bytes .../equipped-SUITSTORAGE.png | Bin 0 -> 1032 bytes .../Launchers/hydra_launcher.rsi/icon.png | Bin 0 -> 687 bytes .../hydra_launcher.rsi/inhand-left.png | Bin 0 -> 811 bytes .../hydra_launcher.rsi/inhand-right.png | Bin 0 -> 799 bytes .../Launchers/hydra_launcher.rsi/meta.json | 41 ++++++++++++++++++ .../wielded-inhand-left.png | Bin 0 -> 924 bytes .../wielded-inhand-right.png | Bin 0 -> 914 bytes .../Projectiles/projectiles2.rsi/cleanade.png | Bin 0 -> 730 bytes .../Projectiles/projectiles2.rsi/meta.json | 17 ++++++-- 16 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi/cleanade.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/equipped-BACKPACK.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/equipped-SUITSTORAGE.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/wielded-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/wielded-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/cleanade.png diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml index 42bd054ac7..2bd0dfc46d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml @@ -123,6 +123,23 @@ state: frag suffix: false +- type: entity + parent: BaseGrenade + id: GrenadeCleanade + name: cleanade grenade round + components: + - type: CartridgeAmmo + proto: BulletGrenadeCleanade + - type: Sprite + sprite: Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi + layers: + - state: cleanade + map: [ "enum.AmmoVisualLayers.Base" ] + - type: Appearance + - type: SpentAmmoVisuals + state: frag + suffix: false + - type: entity id: GrenadeEMP name: EMP grenade diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml index 64f1fdac29..2fcf294a73 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml @@ -53,6 +53,46 @@ soundInsert: path: /Audio/Weapons/Guns/MagIn/batrifle_magin.ogg +- type: entity + parent: [ BaseWeaponLauncher, BaseGunWieldable, BaseMajorContraband ] + id: WeaponLauncherHydra + name: hydra + description: PLOOP... FSSSSSS + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Launchers/hydra_launcher.rsi + layers: + - state: icon + map: [ "enum.GunVisualLayers.Base" ] + - type: Clothing + sprite: Objects/Weapons/Guns/Launchers/hydra_launcher.rsi + slots: + - Back + - suitStorage + - type: AmmoCounter + - type: Gun + fireRate: 1 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/grenade_launcher.ogg + - type: ContainerContainer + containers: + revolver-ammo: !type:Container + - type: RevolverAmmoProvider + whitelist: + tags: + - Grenade + proto: GrenadeCleanade + capacity: 6 + chambers: [ True, True, True, True, True, True ] + ammoSlots: [ null, null, null, null, null, null ] + soundEject: + path: /Audio/Weapons/Guns/MagOut/sfrifle_magout.ogg + soundInsert: + path: /Audio/Weapons/Guns/MagIn/sfrifle_magin.ogg + - type: entity name: RPG-7 parent: [ BaseWeaponLauncher, BaseMajorContraband ] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index ace364f127..4d7ef02f8a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -813,6 +813,36 @@ intensitySlope: 1 maxIntensity: 10 +- type: entity + parent: BaseBulletTrigger + id: BulletGrenadeCleanade + name: cleanade grenade round + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi + layers: + - state: cleanade + - type: ActiveTimerTrigger + timeRemaining: 0.3 + - type: SmokeOnTrigger + duration: 3.5 + spreadAmount: 30 + smokePrototype: Foam + solution: + reagents: + - ReagentId: SpaceCleaner + Quantity: 30 + - type: SoundOnTrigger + sound: /Audio/Items/smoke_grenade_smoke.ogg + - type: ExplodeOnTrigger + - type: Explosive + explosionType: Default + totalIntensity: 0.01 # a little pop + intensitySlope: 1 + maxIntensity: 0.01 + tileBreakScale: 0.01 + - type: entity id: BulletGrenadeEMP name: EMP rocket diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi/cleanade.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi/cleanade.png new file mode 100644 index 0000000000000000000000000000000000000000..ba40acdec217b1f1ac4c647d4ad4c2d188b46ffc GIT binary patch literal 517 zcmV+g0{Z=lP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$zez+vR9J=WmQ5=}Q5eU6BZ`I^c?%<nnHW-<ro3#JQcTVL0zQL<l9VO0K`A!Y zb_y$DH7u-%nwV*l-SyU_NN$FaYjNFc$ig|?EX;p(&Qs6x|2_A-UC1e?|1O72k}?(1 zv*-2BT^2?*rD_Q$DN_;M+t&_2TWc%TPbb6<mQa&7QV@ARG0#?Ab1B1fgZfu_zXo8+ zG&j2kP?I+@rQ`ri^UsPMR@x8H?<ug%&9w*UQW{8Wn!Nz(`Ud05q-74q+Pl3jp2|jr z&4mE~=1033S0=5_P4nY;+<t%(PZPyO2E^|29d56S!>d7#<8k&DSEK;)MH4R0&Z%+N z0x&Zaqo5{5q0>oP)7V>EvG*Qur60MydmxcG1waXhX(_Lu{KY}$;!@OG96(i70A^QH zDB&>oS-U<M4ARlrWB)}oyPBe*(Zf+9`62$C$%vK$B=$gwr-_Gqqw{DqYQ?YfgqsHh zA0s{D)bR(5N#8VVj~U~G{r7?snov!#FW?V=FZ4do9)AM)uB6|B-%<|X&jEz5PU|H2 zLXg-nf^VBo^aKb4=v%!yz7SOPet87(2XGARNd27V^ndjVKtPrS|EI-800000NkvXX Hu0mjf&n4;K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi/meta.json index 15ed620c3e..0d91035a83 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/discordia-space/CEV-Eris/raw/e1d495c3faf4642b6ec1c4be8acc7cd5bc51d785/icons/obj/ammo.dmi, ball, glassshot and grapeshot Made by Alekshhh (Github) for ss1, emp made by TheShuEd (github)", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/e1d495c3faf4642b6ec1c4be8acc7cd5bc51d785/icons/obj/ammo.dmi, ball, glassshot and grapeshot Made by Alekshhh (Github) for ss1, emp made by TheShuEd (github), cleanade made by southbridge-fur (github)", "states": [ { "name": "baton" @@ -36,6 +36,9 @@ }, { "name": "spent" + }, + { + "name": "cleanade" } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..9a88d3f8eac042cec6817a3753eb3514397aec6f GIT binary patch literal 687 zcmV;g0#N;lP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px%Pf0{UR9J=WmCa5QQ5c4wDaEODaEz&v3Zk~%HCQ%KHZCyT>xOs-TmTnB;ubGJ z4I2pw8;MPfF}5TI5*H@6HbR2@3{z$(gF@qRVP|NWo`!be#(7rf?>q1Nedo*>2nY!H z-%)xAN+s?Kw_W;H>1hv_P_KcSrg>(X4gE6%XZ1R2B!Z@CsF4UG!?(LKk;#k;fN;0M z+3b{0NCmV(o#ByDZ>~`Ic&VdlSu{I2C(UA^IIm>0Q(|oF0hVO}pzAt7OW(3A3}YY1 zaik_PnQ>v;7L`gx@hUJoIVaNU1h)p_zJNXF2eXrNVuKG@mc`=YtB%>t%sdsFo8Q~c zx#BJgKq8S4x!4oZ>Vz+#c51V}TR_i+z3d`a!f4R}xr08{t4=d+r3_;qfPDV#c?GI_ zht!5_Uyv(aE|&l>O_S8UQKHePRR8#Aowc>1++Y)7fSsKkKE>Zr-8%3sSlwPyax0I8 zdDEm;s{ycQ7}$+=JL<pj)?Ug$vsf$^6OQBHIF17F?BNShJGIGgt+27ZqyXHwJ}COb zeezvH{aDr^hGF<Fd0L&|{ni_*rw5cNof{~ZOHy%{WHKcHqE`nPY&=Bmu$^DNv5VrX zjbuCn7sZ=d-z|71-3o;II=o?_{+8@z;w=U)io4mb?-qPPwtd9eSzW4sbbR6)TQ0u@ zXxYaz&@Ssv#D|8^^=s1k&tJZ_^cRZr(*4^$#naP|#A}{o+9v3KZ*(%567CTkpEz_p zf-dOkS9*8!j!;!qI&W6}UqC=WK!A)t?7JmCbN8u^0000EWmrjOO-%qQ0000800000 V0002eQ<DGy002ovPDHLkV1nG!HIo1U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/equipped-BACKPACK.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000000000000000000000000000000000..31343acf344e7ee326d6a7d4ad48cc70a452aea7 GIT binary patch literal 1032 zcmV+j1o!)iP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px&s7XXYRCt{2nm=q4R~*Mb7ekdE7bl^IXpOnV*y@%jTdJZIU8)X<0rq&R)PW4B zTPG%jRH+jks5-zz#hglrsY5$8Vxa>;*bYuERv=Pjh|lrgwvQpYliSAeU2^A3()XFp z|9<cH`@Y}({O-LUNF)-8L?SsVq|+G@wGUk}%~_%AdT0)Y5&S?<hD>u-SeC``@Cd0? zDsV@2T^EL71TKOSgps*yR@k-;z?*WJQmI6-SPaBAKq{3I0|PMt48y>(ES8rGf!IHB zPy=(>tUDt=FDwKW^uM{0xW)JDH?b@W!!Q6u5F#At7Pvk?FXHhy5N`0rVo|BKD(<X1 zBADjvfp3R>3vhjY-W~j>2M<CE-r?!SA^=-kZviNm%P4=hnV$YcB+n%TK<0w~+Osdm zJA?n>?%mLX?<Aeh2u;&a#9siM9vxx3(WYu|(QGsTD7^Gue`0<en9F8Gv)QECY;ynJ zy}kyo>$(^m9OUB*W5i+u)Ef=zjRwO*r%+-isn@oB1rI)o;MFUag*fq^`??=#zZ>Jp z1gmQ$#?B`JD8G5jtJfQR^x;`JbC$x(qAz>CYk+Orkp&O1w!Y5T`6R1rC5AMO)1xB* ztd?G37-QU-dFZPScotyc(PIU|t@gdx+}u<Ep6Bwe2nq_%U*r@`)5zssP;FIwiQp>( zq72?4moK;?d@wr7FTeh#0DKw$hIYHn(~U)6A_TS+?kBl?L20$yZt%LUi)yRF($X^} zAAjPCFmv(Ko+5ZIf~u;DTCEm&1~{y&tp39nXPuBMEJFtJ^(Q;mL7=LtP*wHtK8CWB z1+e35I-NQ6{)Wa;m@J7zB9TZW5{X12kw_$xqk(D8iXaXn!)9u7LQG9gc=prtrf98J z+n+~$#_vYxk=z#V#?>pAeP^hz28qSR-@9&$JB<=i9h*7he_>vtQfp#amZt`aKr*1S zQ6dUD$6t8#Sh@D+SAe&sDo+ATO-_iaz14Ma=Q@hn?`+X=#;>+2o`2s{fX^>|)>XyM z!Ta4PvDf(bH^1|2!&3&>+jX>|;jW)Y5qxLC>o)#)GSSmcPXSg+>wA74b@030cH_we zL#N*NWXp3A{Cecu|GXE)J>M(%PMp)@z3}umcq4Jk%h&pf)3C7{e>_`qn<;wHGXsL^ z$PALbf`<@Rt#@V~3RP9b?dc!IepXxkCX~}*=h*qM3lQ4T_;EdVKUNPzp>rHFKq8Sy zB>!jL0fkF`;g~U~nE(I)4rN$LW=%~1DgXcg2mk;800000(o>TF0000<MNUMnLSTXg Cjpr=@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000000000000000000000000000000000..31343acf344e7ee326d6a7d4ad48cc70a452aea7 GIT binary patch literal 1032 zcmV+j1o!)iP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px&s7XXYRCt{2nm=q4R~*Mb7ekdE7bl^IXpOnV*y@%jTdJZIU8)X<0rq&R)PW4B zTPG%jRH+jks5-zz#hglrsY5$8Vxa>;*bYuERv=Pjh|lrgwvQpYliSAeU2^A3()XFp z|9<cH`@Y}({O-LUNF)-8L?SsVq|+G@wGUk}%~_%AdT0)Y5&S?<hD>u-SeC``@Cd0? zDsV@2T^EL71TKOSgps*yR@k-;z?*WJQmI6-SPaBAKq{3I0|PMt48y>(ES8rGf!IHB zPy=(>tUDt=FDwKW^uM{0xW)JDH?b@W!!Q6u5F#At7Pvk?FXHhy5N`0rVo|BKD(<X1 zBADjvfp3R>3vhjY-W~j>2M<CE-r?!SA^=-kZviNm%P4=hnV$YcB+n%TK<0w~+Osdm zJA?n>?%mLX?<Aeh2u;&a#9siM9vxx3(WYu|(QGsTD7^Gue`0<en9F8Gv)QECY;ynJ zy}kyo>$(^m9OUB*W5i+u)Ef=zjRwO*r%+-isn@oB1rI)o;MFUag*fq^`??=#zZ>Jp z1gmQ$#?B`JD8G5jtJfQR^x;`JbC$x(qAz>CYk+Orkp&O1w!Y5T`6R1rC5AMO)1xB* ztd?G37-QU-dFZPScotyc(PIU|t@gdx+}u<Ep6Bwe2nq_%U*r@`)5zssP;FIwiQp>( zq72?4moK;?d@wr7FTeh#0DKw$hIYHn(~U)6A_TS+?kBl?L20$yZt%LUi)yRF($X^} zAAjPCFmv(Ko+5ZIf~u;DTCEm&1~{y&tp39nXPuBMEJFtJ^(Q;mL7=LtP*wHtK8CWB z1+e35I-NQ6{)Wa;m@J7zB9TZW5{X12kw_$xqk(D8iXaXn!)9u7LQG9gc=prtrf98J z+n+~$#_vYxk=z#V#?>pAeP^hz28qSR-@9&$JB<=i9h*7he_>vtQfp#amZt`aKr*1S zQ6dUD$6t8#Sh@D+SAe&sDo+ATO-_iaz14Ma=Q@hn?`+X=#;>+2o`2s{fX^>|)>XyM z!Ta4PvDf(bH^1|2!&3&>+jX>|;jW)Y5qxLC>o)#)GSSmcPXSg+>wA74b@030cH_we zL#N*NWXp3A{Cecu|GXE)J>M(%PMp)@z3}umcq4Jk%h&pf)3C7{e>_`qn<;wHGXsL^ z$PALbf`<@Rt#@V~3RP9b?dc!IepXxkCX~}*=h*qM3lQ4T_;EdVKUNPzp>rHFKq8Sy zB>!jL0fkF`;g~U~nE(I)4rN$LW=%~1DgXcg2mk;800000(o>TF0000<MNUMnLSTXg Cjpr=@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/icon.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a88d3f8eac042cec6817a3753eb3514397aec6f GIT binary patch literal 687 zcmV;g0#N;lP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px%Pf0{UR9J=WmCa5QQ5c4wDaEODaEz&v3Zk~%HCQ%KHZCyT>xOs-TmTnB;ubGJ z4I2pw8;MPfF}5TI5*H@6HbR2@3{z$(gF@qRVP|NWo`!be#(7rf?>q1Nedo*>2nY!H z-%)xAN+s?Kw_W;H>1hv_P_KcSrg>(X4gE6%XZ1R2B!Z@CsF4UG!?(LKk;#k;fN;0M z+3b{0NCmV(o#ByDZ>~`Ic&VdlSu{I2C(UA^IIm>0Q(|oF0hVO}pzAt7OW(3A3}YY1 zaik_PnQ>v;7L`gx@hUJoIVaNU1h)p_zJNXF2eXrNVuKG@mc`=YtB%>t%sdsFo8Q~c zx#BJgKq8S4x!4oZ>Vz+#c51V}TR_i+z3d`a!f4R}xr08{t4=d+r3_;qfPDV#c?GI_ zht!5_Uyv(aE|&l>O_S8UQKHePRR8#Aowc>1++Y)7fSsKkKE>Zr-8%3sSlwPyax0I8 zdDEm;s{ycQ7}$+=JL<pj)?Ug$vsf$^6OQBHIF17F?BNShJGIGgt+27ZqyXHwJ}COb zeezvH{aDr^hGF<Fd0L&|{ni_*rw5cNof{~ZOHy%{WHKcHqE`nPY&=Bmu$^DNv5VrX zjbuCn7sZ=d-z|71-3o;II=o?_{+8@z;w=U)io4mb?-qPPwtd9eSzW4sbbR6)TQ0u@ zXxYaz&@Ssv#D|8^^=s1k&tJZ_^cRZr(*4^$#naP|#A}{o+9v3KZ*(%567CTkpEz_p zf-dOkS9*8!j!;!qI&W6}UqC=WK!A)t?7JmCbN8u^0000EWmrjOO-%qQ0000800000 V0002eQ<DGy002ovPDHLkV1nG!HIo1U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8ff16677d60be6bcd46f4519be17a74f6f34c4 GIT binary patch literal 811 zcmV+`1JwM9P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px%%Sl8*RCt{2+FeiDU=#=NKRRXuWxQB}O0CgWlj((*T%kd)mR;-<?UE0`?)U_J zqRoVtEkbErR%j7I8WQ*Hg0$=8MX*nu%g*mcQ|$4aBQGY;A0UJfLI@#*5JCbg7pm-U z_ppjJ-UWx_yFZqo9UeSsArJ2><tt2*B<{<N@GdAx5>r(T0MPyM-MilS`fcgo<qq$^ z$3MJjn%w&4{tN&B$8ivg#jv@R#fBiPG(0dFd_xeXuA8PA;W<12yy965@cue%?2NFp zoduADoZDr3$5^^?Ik(HiL~>SL?m~G6oSmLvXFH3YWg{*`k&~5`?$5~z;zBfx)~0Y@ zz}3Y$>sl5PqKHg7<t?FDyj<!HtXRBcaUqJHW%F)rChiMp8wU3GWZblMZwXy{002-` zZQ&B!$Gi3bnRE&t-oNvH{`hF|y-yX&>+1MOV{ea-aMRYoBI^Kv;cy5=QP66&&}=p$ zs;aSvU){$=QJgf#?y<io<GNNyt=<Tw*HDTAlO^2$1p0m3djs<i*=+tEXx4Q}l2|gC z!ulFQ8~$09@)cGtRN1_jfvRe(T&S{AzVc7~CrJn)gb+dqA%qY@2qA>{JT)J%te}Am z?x(}E@&Vf60bBKmd>((Ta-qtG<GVohLJ3IZaxyZR3`V07hJ!vnf4Sy1y!-v;Ru%xz zY&HTNopV1NHBB?p>FBsMbi{=y#Ka^Yz@xSsoY>sTA{L9mah$-pfftz%n8yuH#Dyqs z4IQ119=PU<%Lgpt1}A!!jh*c*&Q4DP_xqyq0gL#96Pa`h2~kAXvT${A9%!-L7f`D= zBG<LLw*+_iR;vX?QM@IrvW$npiG(QPrmbUtPe$7?0`<%NV-WDp^QZCw0GOgE0KokD zfLZ1RC%X0kJ<H}6oOrh2K`CEh;_El~WPHS9!@K^A;KXAnI6(*@Bs{+Wsj_7QMxK{d p0000EWmrjOO-%qQ00008000000002eQ<DGy002ovPDHLkV1lxkcJlxL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ed0ebe9bc611fdbfd97a075893047db004b081 GIT binary patch literal 799 zcmV+)1K|9LP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px%zez+vRCt{2+RaYlU=#-6w>re8lz>=+LMhP}5_RDcH)zn+WEOK7vzr^3<-`kM z=@oD-a|M$qXn;aAQ+~uQh>7#f0^2D=%TEebCg)kUr8(#HkK}s+LI@#*5JCtc#8atI zW^Y}?GOT&+(DwK2hD(JqGoSmxROEvsN$fIzHFBYxeYoM=HadT_wVeO}RI3#jhT(er zdmu@YU9+=JtCz~{oonr`cR=O#j@#gQY;7kX2m%I!!J_M3IKwbFw+pnv^PbHE9s`h5 zNhU_32=gJ_w{$d{`n$gRPXE>^Mxu~YNzcc?bpR<@L6{Gr)9qn*CxPRm!$sE_m@pqg zN>)7gj}4$$JZDz(@y!?_qKJ04i;J_<mHY~Hx;=#X5Q@cf*ZM~WpsE@JfOhZ6Zobyg zkx9#Fv|2&b>sv0X*^Pew^pV9kV`%rD0Q~LGiBnaLRjU<FRW+t43hMPbL{S{>WG~31 zW&FIp!SzjLCEfwRa0myvENTrMj9Ui)n5GG<KdawrwZd`0a5B!F!0@vYjmEIPhLvjG zlFMrB<u~y7*t1`ZZhhKRRb!<>dF+qG|Kc)##Y%-Tb9)R3A%qY@2qA<JLI@#*kQppH zG%;;$e-S(b60<O$`y)eGWWm<CwEaDn&!4b-{)9O*0E^;l#Yd7Prm7kMp#AH?-actP zejZ1M2TY7aAqWCGoz7C0>3!V+hGB4n!2p6FU~4-uHH<KipfU=+1^@ufrjGlTjxZmZ z8b+8$P#Fc^12{f9#O_YQUWcC)MwnHQ83kVhxHvmy?QRzlQAB(*HZ_bei=Z<Kz6Q`} zwU9~6s5NwZ2$RAHUaVuC%h$kg2v+mU$|(3g;XGl4N#}X1jKT-MCwMJvEQ|nvDT)FB zQ=121HO;;zzr&RJ?Awno+-vmBZ;8R9FajZjkk#-9w>V}o;f;Q&0000EWmrjOO-%qQ d00008000000002eQ<DGy002ovPDHLkV1jQYVvYa+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/meta.json new file mode 100644 index 0000000000..df91b7ed4c --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/meta.json @@ -0,0 +1,41 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Hydra Launcher sprites by august-sun (Github) / augustsun (Discord) for SS14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "bolt-open" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "wielded-inhand-left", + "directions": 4 + }, + { + "name": "wielded-inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/wielded-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/wielded-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9ae1e9f02990a7b345bff18259cf6b9d001bf6 GIT binary patch literal 924 zcmV;N17rM&P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px&JV``BRCt{2+Dl9mK^O<{{~7~j+0qAVOv_6J5?<OSCgP<M@J_rC!^H$Sc;t+n zjc1M?jENWSUJVea2Z)mJI1mU`UV(!v&^lexqK*gH&6e$Mmu(>szTXM<o5#*KGi{R@ zfDl3mA%qZe9SNmqr0L#WuKm6C{YOdKyeK!U0*#GL+$yH2tqJq?wpL#5@u1w}Deaq; zNTG4ubkk^O=i|JMN?sqTZ{6mzvolv_71$;q5{YsE2nK_u*yQ9y-a+>DJ?8*;F9rYr zQdyNA8;bWAOw4F(Oi!+p@^&JTC})h>mT|NK_V)I2{tpI&=;?~(T?LBr6ZQ2C__X-} zy%+$?ru5ioY>W@j4MJ5_)4)Vg<ZmCo&na)z-QB~jl5P}<MESzPyyL`KCLozSu&pTY zzouuIOa|FM|MY~7EW8r>?z}AcS)%!}_1QAExw+}64daY6#tM(aDli%w<1CxP$m}b< zj4aE%rluAEQ0@1c>Zs}=X1;#QJG-JN!sqj2cX!8f1%yIjB$EeFRW)y!vwG9{j!R`# zwp+<^1q{Xe1>=6yFvcKB61<XRsv}tB^JFkwQ4~QGMavbDNURB>DDqMa9zf3ISvhk@ zvMh6-&kt{9g(;TFWU#!lDx5B_D2f0a&oThZ6<~}R>zyZ8UxNV9P*-bu##kE5E31%Y znFD~&=g--Lb~BqV*4Ws@wfg6k3|EcHvdn`4zv+4Q=m_iU8&~Ex03n1BLI@#*5JCtc zgb+dsJALV(y{(nEx3xMx1ieiCTHX+G%E?WV%gog&j&_b03WedVtk93idQvX{09JPZ zilrsHqoo-Du(7qR$L1H8T=nPrY*6z%eTa>%ZBz#Wn5g=QN6NEeo3z!@(hSDZ__e<e z02uJSJ`Tjd-P|Z~wFOjF6;xFf5{WfIJ0;d$$jOnkTj6jhr!N3t*%Vkdh2gnD*d4uF zDf%<Oh_Q4jn=^^W<HG4aicNS)6Cg>I0PK&!OVx)_F-a)uMWYYy>r1XW5Wx7<^o1Oa zKka(LjoV;;aY?Ydd|}7+3NQ}7p|1AA1`hz^Q`3U>&9l9;t6#{t)=n;BQ6dN-gb?D` ye*l+1KiCQf^Z)<=4rN$LW=%~1DgXcg2mk;800000(o>TF0000<MNUMnLSTXh4Xqvk literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/wielded-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/hydra_launcher.rsi/wielded-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce848601fa1a583ad6fe56a0622b6df5076ee8f GIT binary patch literal 914 zcmV;D18w|?P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px&GD$>1RCt{2n!is|Q546&4}q3Tp)_=Wf<SHkQBX^w1{Ng6zrvZp(U~}_Goyo& zxDdl)Tn!MYgEb)mbx>?YpwJj!f6?1V!g3wtmG|0*?Q36~8qa6yk8{sGzwW)mIRHTr z1VIo4K@k5Vk{MzDC9hCFN5AiwTHCC&m|bAA+hMcYF*X_yg99E>PTuG9mzA+{ompBd z6`YuuEHTK@<;1|?kN|*4<o!Qc5hX^?Pc0T4<tIk~fHzpc(9kfJmR=b;84Asm1SgeB z{n5cWVzH>{;P`xg;cz&xwY6DOV72}{4Bs!&Rj2^Qn0R{YdBJHF)p=R|g_-Fo!?F}O zbGTjvgX5x-V1z<5Vs&+;AgA?beri$7ZOlSZl*0eIBk*qjtxnm}j~7xfI4-ugzk+j) z_SP2IY_^h3g>(U&b3=o&*-SZ`D_VD+{$lp__H^Gje@6Z)Ux)-_O!W7Akj-YGD2gsh zDwB6^3&uK1lq54b0KmaP9I`AI);*qhCLHbEhNV{yuh%P_T@Gx1{8aPZ!Wa{bF*uz) zNF)x=uYg!ADlx`{k@Eo1$rv1t&XV7gnVeyUs&yU!c6O|LW>5VQvMfuCG2JoNRe(kq zZns-#vk3r!t5<~45y<6_k<DgMEZ+=h{V4Vk&{Tj?)_p#|P|u<)%aW(B&#(eMfB9y; z<u#z%?R56&?h+#(O=WCkWLUJfwUzvyN;hZr34$O9f*=TjAP9mW2!bF8g0POU(SR5m z4d_};jTmgOa$nOEBF%&q!LGWSGk)_%Ve{dOg8<H2WYr8rltZ0g0DzV5mjHm>{Wx;@ zV<ZxX0E}B-<*0Z>MvHdpVj=qkyZdqUx?H$^?Q&iFg#6?PAKb6Oc^=7h8oB&&%{omV z0mhh^+n5DEInqsEB-3dCfXCBcvr*^qDDptk?$y=VfmkdmDT*RhlYOAZJ3uu^h4VbZ z;c#7>q@3q1)mL=@ik$~w*gCfgHN#f#VLDsdAp`A2*z0m(d2PKRE%JNQcZGTk0Ms-_ zQ*{Nn-EI*-OaS=v3N*@j09amIm(-UB(7#A^=XBtxaT^i@K@bE%)QR8A99HD(ogUf% o000hUSV?A0O#mtY000O800000007cclK=n!07*qoM6N<$g0!lhqyPW_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/cleanade.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/cleanade.png new file mode 100644 index 0000000000000000000000000000000000000000..28a4bc828f688c8331c6f993019a5f228e0520a5 GIT binary patch literal 730 zcmV<00ww*4P)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(00001b5ch_0Itp) z=>Px%lu1NERA_<imd|SwK@`Wo$)?SZH3cQvY>J8!ghC_`4?!D+92AN)JxB?N<g_5z zORqwE)IY$JAk0OPUPPpL5Ih(Ug(8$<F;XL;#<UVCTALDMlkBbs%aVkE?#pggbU&Bf znK1A3_AzfJfQ^lf&3}x8x{xszlq6}p``t`(xm?G%SS$tsAQFjer&1}i^}S(?1sP*O zYwQ-o7|SxovR1i!z3Zi)7U+;llJtNY%Sykq&peV{&q0&y*G<|1jIpZ#E}*l3FC|G@ z=qDK+{_KcPnP{|d5&(u>*r<MYKBMdc7bSrapE5bbsTtm*$g+Ye0PNK{KY)Q0V8o|P z_`ULY+f?}Ask;EA7VvxJ6z@@*QK6#7#EKt4&F_^{lvqUncucH_2g9Q=u_AUA<c}fk z05`XPWK8%nEbyNk01zLQN8f%9D3n-4zvy(z?u(I?69Dk_N66{s_Ql^U>j|j<Uasy5 z@tbfsR0RM8e$%zV@%<jCy8MD~OB)A$TTU-`$U})mD!|<*CEQqh2XwShff9;Do4*a3 zUv~lGXOk)bOr_KKP%2@sRtEt1c`pE{tIJE|{}xvGN!vCM2vC+8hLL_!0b0$bVF_66 zCl%n^?yg}8SnVhEYbJAD?Vfx8F%Pr*-wZ$L765?D_iiHG_;vC=eRu~z6syZi)Nq#h zbr&FUWm-Kxn?|@%!0VO!+I;9-8Hv`k`s(o`Q+I*Ue%)t)cqR@2n!LQegJWZdF?nrP z`^`*@_LEvbs4i%7cVY%YG>Yf>JS7wfBmJZTl-G9v0Pe&LPDi77Gr*5G+ON9>7U$<2 zrP_G_z@<||n!NC04U6-0rr!ca`^gDU-MZaz6%FF!|0chUjm^KoPxaRn!{HYEbpQYW M07*qoM6N<$f|F2B`2YX_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json index 87ce717f44..b4d8f09a82 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111", + "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111, cleanade made by Southbridge_fur (github)", "size": { "x": 32, "y": 32 @@ -13,7 +13,7 @@ { "name": "buckshot-flare" }, - { + { "name": "depleted-uranium" }, { @@ -91,11 +91,20 @@ ] ] }, - { + { "name": "grapeshot" }, - { + { "name": "shard" + }, + { + "name": "cleanade", + "delays": [ + [ + 0.05, + 0.05 + ] + ] } ] } From d9e9afed1e5b94554c28bf6ab13859f2ccad6b5e Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Sat, 19 Apr 2025 07:11:55 -0700 Subject: [PATCH 378/622] DetGadget hat fixes (#35658) * """Refactors""" extraction code, fixes bug with labeled items * second line of fixes * Enhance label handling and add label retrieval method (its more preformant I swear) * Cleanup --------- Co-authored-by: beck-thompson <beck314159@hotmail.com> --- .../EntitySystems/TriggerSystem.Voice.cs | 9 +++-- .../VoiceTrigger/StorageVoiceControlSystem.cs | 39 ++++++++++++------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.Voice.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.Voice.cs index 9d11a9dad7..a96508e37c 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.Voice.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.Voice.cs @@ -48,13 +48,15 @@ namespace Content.Server.Explosion.EntitySystems return; } - if (!string.IsNullOrWhiteSpace(component.KeyPhrase) && message.Contains(component.KeyPhrase, StringComparison.InvariantCultureIgnoreCase)) + if (!string.IsNullOrWhiteSpace(component.KeyPhrase) && message.IndexOf(component.KeyPhrase, StringComparison.InvariantCultureIgnoreCase) is var index and >= 0 ) { _adminLogger.Add(LogType.Trigger, LogImpact.Medium, $"A voice-trigger on {ToPrettyString(ent):entity} was triggered by {ToPrettyString(args.Source):speaker} speaking the key-phrase {component.KeyPhrase}."); Trigger(ent, args.Source); - var voice = new VoiceTriggeredEvent(args.Source, message); + var messageWithoutPhrase = message.Remove(index, component.KeyPhrase.Length).Trim(); + + var voice = new VoiceTriggeredEvent(args.Source, message, messageWithoutPhrase); RaiseLocalEvent(ent, ref voice); } } @@ -147,5 +149,6 @@ namespace Content.Server.Explosion.EntitySystems /// </summary> /// <param name="Source"> The EntityUid of the entity sending the message</param> /// <param name="Message"> The contents of the message</param> +/// <param name="MessageWithoutPhrase"> The message without the phrase that triggered it.</param> [ByRefEvent] -public readonly record struct VoiceTriggeredEvent(EntityUid Source, string? Message); +public readonly record struct VoiceTriggeredEvent(EntityUid Source, string Message, string MessageWithoutPhrase); diff --git a/Content.Server/VoiceTrigger/StorageVoiceControlSystem.cs b/Content.Server/VoiceTrigger/StorageVoiceControlSystem.cs index 72e361bc58..c3fde14517 100644 --- a/Content.Server/VoiceTrigger/StorageVoiceControlSystem.cs +++ b/Content.Server/VoiceTrigger/StorageVoiceControlSystem.cs @@ -36,10 +36,6 @@ public sealed class StorageVoiceControlSystem : EntitySystem (itemSlot.SlotFlags & ent.Comp.AllowedSlots) == 0) return; - // Don't do anything if there is no message - if (args.Message == null) - return; - // Get the storage component if (!TryComp<StorageComponent>(ent, out var storage)) return; @@ -79,20 +75,33 @@ public sealed class StorageVoiceControlSystem : EntitySystem // If otherwise, we're retrieving an item, so check all the items currently in the attached storage foreach (var item in storage.Container.ContainedEntities) { - // Get the item's name - var itemName = MetaData(item).EntityName; - // The message doesn't match the item name the requestor requested, skip and move on to the next item - if (!args.Message.Contains(itemName, StringComparison.InvariantCultureIgnoreCase)) - continue; - - // We found the item we want, so draw it from storage and place it into the player's hands - if (storage.Container.ContainedEntities.Count != 0) + // Check if the name contains the actual command. + // This will do comparisons against any length of string which is a little weird, but worth the tradeoff. + // E.g "go go s" would give you the screwdriver because "screwdriver" contains "s" + if (Name(item).Contains(args.MessageWithoutPhrase)) { - _container.RemoveEntity(ent, item); - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(args.Source)} retrieved {ToPrettyString(item)} from {ToPrettyString(ent)} via voice control"); - _hands.TryPickup(args.Source, item, handsComp: hands); + ExtractItemFromStorage(ent, item, args.Source, hands); break; } } } + + /// <summary> + /// Extracts an item from storage and places it into the player's hands. + /// </summary> + /// <param name="ent">The entity with the <see cref="StorageVoiceControlComponent"/></param> + /// <param name="item">The entity to be extracted from the attached storage</param> + /// <param name="source">The entity wearing the item</param> + /// <param name="hands">The <see cref="HandsComponent"/> of the person wearing the item</param> + private void ExtractItemFromStorage(Entity<StorageVoiceControlComponent> ent, + EntityUid item, + EntityUid source, + HandsComponent hands) + { + _container.RemoveEntity(ent, item); + _adminLogger.Add(LogType.Action, + LogImpact.Low, + $"{ToPrettyString(source)} retrieved {ToPrettyString(item)} from {ToPrettyString(ent)} via voice control"); + _hands.TryPickup(source, item, handsComp: hands); + } } From de7a34a18c2b93fb03f45fc4e27feb8149fd9b1a Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 14:13:01 +0000 Subject: [PATCH 379/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e1de5ece0b..abdee7bccb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: chromiumboy - changes: - - message: The holoapd UI has been updated to include a text-based filter for the - contacts list, and also to specify the name of the holopad that incoming calls - originate from - type: Tweak - id: 7758 - time: '2024-12-28T23:33:16.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34055 - author: zHonys changes: - message: Smile can now use hats @@ -3913,3 +3904,13 @@ id: 8258 time: '2025-04-19T13:43:05.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34668 +- author: ArtisticRoomba + changes: + - message: The Go Go Hat now checks if your message matches either the name of the + item or the label of the item. This allows people with accents to name their + items according to how their character would say the item, or for a faster retrieval + without having to type out the full name. + type: Tweak + id: 8259 + time: '2025-04-19T14:11:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35658 From 36999e5a06d3a63046041754a223d0c17c1fc0ba Mon Sep 17 00:00:00 2001 From: GrownSamoyedDog <61863648+GrownSamoyedDog@users.noreply.github.com> Date: Sat, 19 Apr 2025 07:25:09 -0700 Subject: [PATCH 380/622] Gave Bartender Pineapple Juice Cartons (#34769) pineapple juice core pina colada maxxed --- .../VendingMachines/Inventories/boozeomat.yml | 1 + .../Consumable/Drinks/drinks-cartons.yml | 15 +++++++++++++++ .../Drinks/pineapplejuice.rsi/icon.png | Bin 0 -> 272 bytes .../Drinks/pineapplejuice.rsi/icon_open.png | Bin 0 -> 277 bytes .../Drinks/pineapplejuice.rsi/meta.json | 17 +++++++++++++++++ 5 files changed, 33 insertions(+) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml index 97a3d0f5a1..9127438674 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml @@ -26,6 +26,7 @@ DrinkGrenadineBottleFull: 2 DrinkJuiceLimeCarton: 3 DrinkJuiceLemonCarton: 3 + DrinkJuicePineappleCarton: 3 DrinkJuiceOrangeCarton: 3 DrinkJuiceTomatoCarton: 3 DrinkCoffeeLiqueurBottleFull: 3 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml index 9dd3cffbe6..c33e24ad3e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml @@ -209,3 +209,18 @@ Quantity: 50 - type: Sprite sprite: Objects/Consumable/Drinks/lemonjuice.rsi + +- type: entity + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] + id: DrinkJuicePineappleCarton + name: pineapple juice + description: Tastes like a tropical vacation far from space. + components: + - type: SolutionContainerManager + solutions: + drink: + reagents: + - ReagentId: JuicePineapple + Quantity: 50 + - type: Sprite + sprite: Objects/Consumable/Drinks/pineapplejuice.rsi diff --git a/Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9876e1862e4a01c6ecd6611d146c855a69d537a5 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|<N|y`T!D0U zTH>-~;oHqp->1laza(oDcrbbP|GisRe}8k|vE*GhPz6^>kY6yve;BCi6bS>0c6quu zhFJ7Ion$R^)PRGzIk)cn{tv=?rU>SCUC6T4k&3_W?(Xu;qKHB3+y=%KH|7Ybb%f3p zY&%k$+n>&TGJ{Eqr@=AO=)kYsz}GhqZcyCdZa#5KPl3$F>xm3in>IHVD4Y%DFKti^ zD`4+GQI_C(RkUD6*CA2oz^j37*F78l@tEwJsQFJh`Ol?44BZP^R=0HSJP33ZgQu&X J%Q~loCIBkQZFc|w literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a7ac6653fed2adc48e34958f89319238359231 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|6a#!hT!FNl zoNRVl;<9An+s#tnr^tT4Bx@6RFnRX>y<1m*e{=uSCe9k5BJPqPzhH*{a8O%Tdle|$ z?djqeV$u6_lA+KM0}kfor04_x<!cV@G+MOxQN~s|vEKEs{g0pdWwD7->zo5~2+wqu zo{tjiI1CEqKU8er(BmB7%xI$F&H7-E?yI_T26LA0Z!}dV3ij=NzE|YHybWrCyec*C zRb?|yh~7G={K;a)qE}p2C9WU4maTZD@%V~n!)M8qKd!reINti<{+aO&D{H}io?J7a Pvlu*G{an^LB{Ts5)cSD{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/meta.json new file mode 100644 index 0000000000..31a3eae2e6 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/pineapplejuice.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "GrownSamoyedDog on Github. A variant of orangejuice carton from: https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} From 3075d5550674bd399d8863fd44dd5f05f3b26817 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 14:26:15 +0000 Subject: [PATCH 381/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index abdee7bccb..ae4e42c548 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: zHonys - changes: - - message: Smile can now use hats - type: Add - id: 7759 - time: '2024-12-29T01:49:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33924 - author: ewokswagger changes: - message: Pizza deliveries are now guaranteed to have at least one cotton pizza. @@ -3914,3 +3907,10 @@ id: 8259 time: '2025-04-19T14:11:55.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35658 +- author: GrownSamoyedDog + changes: + - message: Pineapple Juice Cartons are new and added to Booze-O-Mat. + type: Add + id: 8260 + time: '2025-04-19T14:25:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34769 From 8982956a6bcca08c32753732c7697e7bb2186583 Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Sat, 19 Apr 2025 17:26:56 +0300 Subject: [PATCH 382/622] Cleanup: Superbonk cleanup (#35104) * SuperBonk cleanup * Update * Comment changes * Update * Changes * EnsureComp --- .../Components/SuperBonkComponent.cs | 24 ++-- .../Administration/Systems/SuperBonkSystem.cs | 110 +++++++++--------- 2 files changed, 66 insertions(+), 68 deletions(-) diff --git a/Content.Server/Administration/Components/SuperBonkComponent.cs b/Content.Server/Administration/Components/SuperBonkComponent.cs index 868d232e60..0ceeccd136 100644 --- a/Content.Server/Administration/Components/SuperBonkComponent.cs +++ b/Content.Server/Administration/Components/SuperBonkComponent.cs @@ -1,37 +1,31 @@ using Content.Server.Administration.Systems; -using Content.Shared.Climbing.Components; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Administration.Components; /// <summary> /// Component to track the timer for the SuperBonk smite. /// </summary> -[RegisterComponent, Access(typeof(SuperBonkSystem))] -public sealed partial class SuperBonkComponent: Component +[RegisterComponent, AutoGenerateComponentPause, Access(typeof(SuperBonkSystem))] +public sealed partial class SuperBonkComponent : Component { - /// <summary> - /// Entity being Super Bonked. - /// </summary> - [DataField] - public EntityUid Target; - /// <summary> /// All of the tables the target will be bonked on. /// </summary> [DataField] - public Dictionary<EntityUid, BonkableComponent>.Enumerator Tables; + public List<EntityUid>.Enumerator Tables; /// <summary> - /// Value used to reset the timer once it expires. + /// How often should we bonk. /// </summary> [DataField] - public float InitialTime = 0.10f; + public TimeSpan BonkCooldown = TimeSpan.FromMilliseconds(100); /// <summary> - /// Timer till the next bonk. + /// Next time when we will bonk. /// </summary> - [DataField] - public float TimeRemaining = 0.10f; + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] + public TimeSpan NextBonk = TimeSpan.Zero; /// <summary> /// Whether to remove the clumsy component from the target after SuperBonk is done. diff --git a/Content.Server/Administration/Systems/SuperBonkSystem.cs b/Content.Server/Administration/Systems/SuperBonkSystem.cs index 5cd62d8357..c4de0d0a41 100644 --- a/Content.Server/Administration/Systems/SuperBonkSystem.cs +++ b/Content.Server/Administration/Systems/SuperBonkSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Clumsy; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Robust.Shared.Audio.Systems; +using Robust.Shared.Timing; namespace Content.Server.Administration.Systems; @@ -12,44 +13,38 @@ public sealed class SuperBonkSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly ClumsySystem _clumsySystem = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent<SuperBonkComponent, ComponentInit>(OnInit); SubscribeLocalEvent<SuperBonkComponent, MobStateChangedEvent>(OnMobStateChanged); - SubscribeLocalEvent<SuperBonkComponent, ComponentShutdown>(OnBonkShutdown); + SubscribeLocalEvent<SuperBonkComponent, ComponentShutdown>(OnShutdown); } - public void StartSuperBonk(EntityUid target, float delay = 0.1f, bool stopWhenDead = false) + private void OnInit(Entity<SuperBonkComponent> ent, ref ComponentInit args) { + var (_, component) = ent; - //The other check in the code to stop when the target dies does not work if the target is already dead. - if (stopWhenDead && TryComp<MobStateComponent>(target, out var mState)) - { - if (mState.CurrentState == MobState.Dead) - return; - } + component.NextBonk = _timing.CurTime + component.BonkCooldown; + } - var hadClumsy = EnsureComp<ClumsyComponent>(target, out _); + private void OnMobStateChanged(Entity<SuperBonkComponent> ent, ref MobStateChangedEvent args) + { + var (uid, component) = ent; - var tables = EntityQueryEnumerator<BonkableComponent>(); - var bonks = new Dictionary<EntityUid, BonkableComponent>(); - // This is done so we don't crash if something like a new table is spawned. - while (tables.MoveNext(out var uid, out var comp)) - { - bonks.Add(uid, comp); - } + if (component.StopWhenDead && args.NewMobState == MobState.Dead) + RemCompDeferred<SuperBonkComponent>(uid); + } - var sComp = new SuperBonkComponent - { - Target = target, - Tables = bonks.GetEnumerator(), - RemoveClumsy = !hadClumsy, - StopWhenDead = stopWhenDead, - }; + private void OnShutdown(Entity<SuperBonkComponent> ent, ref ComponentShutdown args) + { + var (uid, component) = ent; - AddComp(target, sComp); + if (component.RemoveClumsy) + RemComp<ClumsyComponent>(uid); } public override void Update(float frameTime) @@ -59,49 +54,58 @@ public sealed class SuperBonkSystem : EntitySystem while (comps.MoveNext(out var uid, out var comp)) { - comp.TimeRemaining -= frameTime; - if (!(comp.TimeRemaining <= 0)) + if (comp.NextBonk > _timing.CurTime) continue; - Bonk(comp); - - if (!(comp.Tables.MoveNext())) + if (!TryBonk(uid, comp.Tables.Current) || !comp.Tables.MoveNext()) { - RemComp<SuperBonkComponent>(comp.Target); + RemComp<SuperBonkComponent>(uid); continue; } - comp.TimeRemaining = comp.InitialTime; + comp.NextBonk += comp.BonkCooldown; } } - private void Bonk(SuperBonkComponent comp) + public void StartSuperBonk(EntityUid target, bool stopWhenDead = false) { - var uid = comp.Tables.Current.Key; + //The other check in the code to stop when the target dies does not work if the target is already dead. + if (stopWhenDead && TryComp<MobStateComponent>(target, out var mobState) && mobState.CurrentState == MobState.Dead) + return; + + + if (EnsureComp<SuperBonkComponent>(target, out var component)) + return; + + var tables = EntityQueryEnumerator<BonkableComponent>(); + var bonks = new List<EntityUid>(); + // This is done so we don't crash if something like a new table is spawned. + while (tables.MoveNext(out var uid, out var comp)) + { + bonks.Add(uid); + } + + component.Tables = bonks.GetEnumerator(); + component.RemoveClumsy = !EnsureComp<ClumsyComponent>(target, out _); + component.StopWhenDead = stopWhenDead; + } + + private bool TryBonk(EntityUid uid, EntityUid tableUid) + { + if (!TryComp<ClumsyComponent>(uid, out var clumsyComp)) + return false; // It would be very weird for something without a transform component to have a bonk component // but just in case because I don't want to crash the server. - if (!HasComp<TransformComponent>(uid) || !TryComp<ClumsyComponent>(comp.Target, out var clumsyComp)) - return; - - _transformSystem.SetCoordinates(comp.Target, Transform(uid).Coordinates); - - _clumsySystem.HitHeadClumsy((comp.Target, clumsyComp), uid); - - _audioSystem.PlayPvs(clumsyComp.TableBonkSound, comp.Target); - } - - private void OnMobStateChanged(EntityUid uid, SuperBonkComponent comp, MobStateChangedEvent args) - { - if (comp.StopWhenDead && args.NewMobState == MobState.Dead) + if (HasComp<TransformComponent>(tableUid)) { - RemComp<SuperBonkComponent>(uid); - } - } + _transformSystem.SetCoordinates(uid, Transform(tableUid).Coordinates); - private void OnBonkShutdown(EntityUid uid, SuperBonkComponent comp, ComponentShutdown ev) - { - if (comp.RemoveClumsy) - RemComp<ClumsyComponent>(comp.Target); + _clumsySystem.HitHeadClumsy((uid, clumsyComp), tableUid); + + _audioSystem.PlayPvs(clumsyComp.TableBonkSound, tableUid); + } + + return true; } } From 2201eae899bb54f80301cedf5cc94c88b1a96518 Mon Sep 17 00:00:00 2001 From: claustro305 <76455142+claustro305@users.noreply.github.com> Date: Sun, 20 Apr 2025 02:29:36 +1200 Subject: [PATCH 383/622] Removed collision from wall mounted lights and security cameras (#35908) * Removed collision from wall mounted lights and security cameras * Updated because I'm dumb and didn't realise the collision groups were case sensitive --- .../Prototypes/Entities/Structures/Lighting/base_lighting.yml | 4 ++-- .../Entities/Structures/Lighting/strobe_lighting.yml | 2 +- .../Entities/Structures/Wallmounts/surveillance_camera.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml index b37faa63b0..953bdb422e 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml @@ -54,7 +54,7 @@ bounds: "-0.4,0.5,0.4,0.35" density: 190 mask: - - TabletopMachineMask + - None layer: - TabletopMachineLayer - type: Destructible @@ -276,7 +276,7 @@ bounds: "-0.1,0.5,0.1,0.255" density: 190 mask: - - TabletopMachineMask + - None layer: - TabletopMachineLayer - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml index 297a0a7abd..c1aa9b97d8 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml @@ -48,7 +48,7 @@ bounds: "-0.2,0.5,0.2,0.35" density: 190 mask: - - TabletopMachineMask + - None layer: - TabletopMachineLayer - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml index db3b469a9f..561991cd26 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml @@ -21,7 +21,7 @@ bounds: "-0.5,-0.5,-0.2,-0.15" density: 190 mask: - - TabletopMachineMask + - None layer: - TabletopMachineLayer - type: LightOnCollide From 63eb99d57c101b61a630a8041f1b11011dd52e46 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 14:30:43 +0000 Subject: [PATCH 384/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ae4e42c548..081ef4ffba 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ewokswagger - changes: - - message: Pizza deliveries are now guaranteed to have at least one cotton pizza. - type: Tweak - id: 7760 - time: '2024-12-29T01:50:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33997 - author: ArtisticRoomba, JuneSzalkowska changes: - message: New cotton dough slices and cotton dough rolls. @@ -3914,3 +3907,11 @@ id: 8260 time: '2025-04-19T14:25:09.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34769 +- author: claustro305 + changes: + - message: Fixed a bug where dragged objects would collide with wall mounted lights + and cameras. + type: Fix + id: 8261 + time: '2025-04-19T14:29:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35908 From 39aefa04416d186bef507220b7936f8ceb3e4e09 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:37:45 +1000 Subject: [PATCH 385/622] Fix detailed examine mispredicts (#33814) So: - Shared examine like armour, adds the button incorrectly and mispredicts it. - Server-only like damage, doesn't add it (correct) and no mispredict. We'll just prune any verbs if the server sends them in unless the verb is client-only and it should fix it unless there's client-side code not flagging it as clientexclusive. --- Content.Client/Examine/ExamineSystem.cs | 34 +++++++++++++++---- .../Examine/ExamineSystemShared.Group.cs | 2 +- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index 2e8d95c978..3aec394324 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -32,6 +32,8 @@ namespace Content.Client.Examine [Dependency] private readonly VerbSystem _verbSystem = default!; [Dependency] private readonly SpriteSystem _sprite = default!; + private List<Verb> _verbList = new(); + public const string StyleClassEntityTooltip = "entity-tooltip"; private EntityUid _examinedEntity; @@ -158,13 +160,13 @@ namespace Content.Client.Examine var entity = GetEntity(ev.EntityUid); OpenTooltip(player.Value, entity, ev.CenterAtCursor, ev.OpenAtOldTooltip, ev.KnowTarget); - UpdateTooltipInfo(player.Value, entity, ev.Message, ev.Verbs); + UpdateTooltipInfo(player.Value, entity, ev.Message, ev.Verbs, getVerbs: false); } public override void SendExamineTooltip(EntityUid player, EntityUid target, FormattedMessage message, bool getVerbs, bool centerAtCursor) { - OpenTooltip(player, target, centerAtCursor, false); - UpdateTooltipInfo(player, target, message); + OpenTooltip(player, target, centerAtCursor); + UpdateTooltipInfo(player, target, message, getVerbs: getVerbs); } /// <summary> @@ -259,7 +261,7 @@ namespace Content.Client.Examine /// <summary> /// Fills the examine tooltip with a message and buttons if applicable. /// </summary> - public void UpdateTooltipInfo(EntityUid player, EntityUid target, FormattedMessage message, List<Verb>? verbs=null) + public void UpdateTooltipInfo(EntityUid player, EntityUid target, FormattedMessage message, List<Verb>? verbs=null, bool getVerbs = true) { var vBox = _examineTooltipOpen?.GetChild(0).GetChild(0); if (vBox == null) @@ -283,9 +285,29 @@ namespace Content.Client.Examine break; } - verbs ??= new List<Verb>(); var totalVerbs = _verbSystem.GetLocalVerbs(target, player, typeof(ExamineVerb)); - totalVerbs.UnionWith(verbs); + + // We still need client-exclusive verbs even when the server sends its data in so if that's the case + // we remove any non-client-exclusive verbs. + if (!getVerbs) + { + _verbList.AddRange(totalVerbs); + + foreach (var verb in _verbList) + { + if (!verb.ClientExclusive) + { + totalVerbs.Remove(verb); + } + } + + _verbList.Clear(); + } + + if (verbs != null) + { + totalVerbs.UnionWith(verbs); + } AddVerbsToTooltip(totalVerbs); } diff --git a/Content.Shared/Examine/ExamineSystemShared.Group.cs b/Content.Shared/Examine/ExamineSystemShared.Group.cs index 64b70d0af3..7dc7877eac 100644 --- a/Content.Shared/Examine/ExamineSystemShared.Group.cs +++ b/Content.Shared/Examine/ExamineSystemShared.Group.cs @@ -80,7 +80,7 @@ namespace Content.Shared.Examine } message.AddMessage(GetFormattedMessageFromExamineEntries(group.Entries)); - SendExamineTooltip(user, target, message, false, false); + SendExamineTooltip(user, target, message, getVerbs: false, centerAtCursor: false); } /// <returns>A FormattedMessage based on all <paramref name="entries"/>, sorted.</returns> From c8138913426fe1e5a890821675042d21a2f08f40 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 14:38:51 +0000 Subject: [PATCH 386/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 081ef4ffba..374fee22c6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,18 +1,4 @@ Entries: -- author: ArtisticRoomba, JuneSzalkowska - changes: - - message: New cotton dough slices and cotton dough rolls. - type: Add - - message: New cotton baguette, cotton crostini, cotton chevre-chaud, cotton bagel, - and cotton croissant recipes. You can make them by following the recipes for - regular baguettes, bagels, etc, but use cotton dough instead. - type: Add - - message: Slicing dough into thirds now divides the nutriment value into thirds. - Previously you could slice dough to triple your nutriment. - type: Fix - id: 7761 - time: '2024-12-29T02:02:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33508 - author: Velcroboy changes: - message: Rolling joints no longer requires a cigarette filter. @@ -3915,3 +3901,10 @@ id: 8261 time: '2025-04-19T14:29:36.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35908 +- author: metalgearsloth + changes: + - message: Fix detailed examine buttons sometimes showing up incorrectly. + type: Fix + id: 8262 + time: '2025-04-19T14:37:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33814 From 8e24308714f7a645fe913d1f3ef0f2fd2c838cc7 Mon Sep 17 00:00:00 2001 From: pathetic meowmeow <uhhadd@gmail.com> Date: Sat, 19 Apr 2025 10:40:49 -0400 Subject: [PATCH 387/622] Make two inventories not dance around as much when opening/closing them (#35041) * Make two inventories not dance around as much when opening/closing them * Use .Any --- .../Systems/Hotbar/Widgets/HotbarGui.xaml | 22 ++++++++- .../Systems/Storage/StorageUIController.cs | 46 ++++++++++++++++++- .../Tests/Storage/StorageInteractionTest.cs | 2 +- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Hotbar/Widgets/HotbarGui.xaml b/Content.Client/UserInterface/Systems/Hotbar/Widgets/HotbarGui.xaml index 153e02bd55..b9602c64e5 100644 --- a/Content.Client/UserInterface/Systems/Hotbar/Widgets/HotbarGui.xaml +++ b/Content.Client/UserInterface/Systems/Hotbar/Widgets/HotbarGui.xaml @@ -9,12 +9,32 @@ Orientation="Vertical" HorizontalAlignment="Center"> <BoxContainer Orientation="Vertical"> - <BoxContainer Name="StorageContainer" + <BoxContainer Name="SingleStorageContainer" Access="Public" HorizontalAlignment="Center" HorizontalExpand="True" Margin="10"> </BoxContainer> + <BoxContainer Name="DoubleStorageContainer" + Access="Public" + HorizontalAlignment="Stretch" + HorizontalExpand="True" + Margin="10"> + <BoxContainer Name="LeftStorageContainer" + Access="Public" + HorizontalAlignment="Left" + HorizontalExpand="True" + VerticalAlignment="Bottom" + Margin="10"> + </BoxContainer> + <BoxContainer Name="RightStorageContainer" + Access="Public" + HorizontalAlignment="Right" + HorizontalExpand="True" + VerticalAlignment="Bottom" + Margin="10"> + </BoxContainer> + </BoxContainer> <BoxContainer Orientation="Horizontal" Name="Hotbar" HorizontalAlignment="Center"> <inventory:ItemSlotButtonContainer Name="SecondHotbar" diff --git a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs index ca2bc5729b..69cf6909e5 100644 --- a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs +++ b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Numerics; using Content.Client.Examine; using Content.Client.Hands.Systems; @@ -48,6 +49,7 @@ public sealed class StorageUIController : UIController, IOnSystemChanged<Storage public Angle DraggingRotation = Angle.Zero; public bool StaticStorageUIEnabled; public bool OpaqueStorageWindow; + private int _openStorageLimit = -1; public bool IsDragging => _menuDragHelper.IsDragging; public ItemGridPiece? CurrentlyDragging => _menuDragHelper.Dragged; @@ -66,6 +68,12 @@ public sealed class StorageUIController : UIController, IOnSystemChanged<Storage _configuration.OnValueChanged(CCVars.StaticStorageUI, OnStaticStorageChanged, true); _configuration.OnValueChanged(CCVars.OpaqueStorageWindow, OnOpaqueWindowChanged, true); _configuration.OnValueChanged(CCVars.StorageWindowTitle, OnStorageWindowTitle, true); + _configuration.OnValueChanged(CCVars.StorageLimit, OnStorageLimitChanged, true); + } + + private void OnStorageLimitChanged(int obj) + { + _openStorageLimit = obj; } private void OnStorageWindowTitle(bool obj) @@ -99,7 +107,43 @@ public sealed class StorageUIController : UIController, IOnSystemChanged<Storage if (StaticStorageUIEnabled) { - UIManager.GetActiveUIWidgetOrNull<HotbarGui>()?.StorageContainer.AddChild(window); + var hotbar = UIManager.GetActiveUIWidgetOrNull<HotbarGui>(); + // this lambda handles the nested storage case + // during nested storage, a parent window hides and a child window is + // immediately inserted to the end of the list + // we can reorder the newly inserted to the same index as the invisible + // window in order to prevent an invisible window from being replaced + // with a visible one in a different position + Action<Control?, Control> reorder = (parent, child) => + { + if (parent is null) + return; + + var parentChildren = parent.Children.ToList(); + var invisibleIndex = parentChildren.FindIndex(c => c.Visible == false); + if (invisibleIndex == -1) + return; + child.SetPositionInParent(invisibleIndex); + }; + + if (_openStorageLimit == 2) + { + if (hotbar?.LeftStorageContainer.Children.Any(c => c.Visible) == false) // we're comparing booleans because it's bool? and not bool from the optional chaining + { + hotbar?.LeftStorageContainer.AddChild(window); + reorder(hotbar?.LeftStorageContainer, window); + } + else + { + hotbar?.RightStorageContainer.AddChild(window); + reorder(hotbar?.RightStorageContainer, window); + } + } + else + { + hotbar?.SingleStorageContainer.AddChild(window); + reorder(hotbar?.SingleStorageContainer, window); + } _closeRecentWindowUIController.SetMostRecentlyInteractedWindow(window); } else diff --git a/Content.IntegrationTests/Tests/Storage/StorageInteractionTest.cs b/Content.IntegrationTests/Tests/Storage/StorageInteractionTest.cs index 8d0de707f3..60d9ddd7fc 100644 --- a/Content.IntegrationTests/Tests/Storage/StorageInteractionTest.cs +++ b/Content.IntegrationTests/Tests/Storage/StorageInteractionTest.cs @@ -81,7 +81,7 @@ public sealed class StorageInteractionTest : InteractionTest { var uid = ToClient(target); var hotbar = GetWidget<HotbarGui>(); - var storageContainer = GetControlFromField<Control>(nameof(HotbarGui.StorageContainer), hotbar); + var storageContainer = GetControlFromField<Control>(nameof(HotbarGui.SingleStorageContainer), hotbar); return GetControlFromChildren<ItemGridPiece>(c => c.Entity == uid, storageContainer); } } From d984259db680e3e401e796d0064e7bb731ae2bcd Mon Sep 17 00:00:00 2001 From: Ps3Moira <113228053+ps3moira@users.noreply.github.com> Date: Sat, 19 Apr 2025 07:41:35 -0700 Subject: [PATCH 388/622] Removed Interior Shuttle Walls (#34261) * Removed Interior Shuttle Walls * Update migration.yml * Update walls.yml * Update girder.yml * Fix Migration --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- .../Entities/Structures/Walls/walls.yml | 46 ------------------ .../Construction/Graphs/structures/girder.yml | 33 ------------- .../Recipes/Construction/structures.yml | 18 ------- .../Walls/shuttleinterior.rsi/full.png | Bin 1746 -> 0 bytes .../Walls/shuttleinterior.rsi/meta.json | 46 ------------------ .../Walls/shuttleinterior.rsi/state0.png | Bin 881 -> 0 bytes .../Walls/shuttleinterior.rsi/state1.png | Bin 651 -> 0 bytes .../Walls/shuttleinterior.rsi/state2.png | Bin 881 -> 0 bytes .../Walls/shuttleinterior.rsi/state3.png | Bin 628 -> 0 bytes .../Walls/shuttleinterior.rsi/state4.png | Bin 627 -> 0 bytes .../Walls/shuttleinterior.rsi/state5.png | Bin 704 -> 0 bytes .../Walls/shuttleinterior.rsi/state6.png | Bin 704 -> 0 bytes .../Walls/shuttleinterior.rsi/state7.png | Bin 388 -> 0 bytes Resources/migration.yml | 9 ++-- 14 files changed, 6 insertions(+), 146 deletions(-) delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/full.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/meta.json delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state0.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state1.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state2.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state3.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state4.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state5.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state6.png delete mode 100644 Resources/Textures/Structures/Walls/shuttleinterior.rsi/state7.png diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 97823cec28..3c2f8c1de1 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -900,7 +900,6 @@ parent: BaseWall id: WallShuttle name: shuttle wall - suffix: Reinforced, Exterior components: - type: Damageable damageContainer: StructuralInorganic @@ -957,51 +956,6 @@ - type: Reflect reflectProb: 1 -- type: entity - parent: BaseWall - id: WallShuttleInterior - name: shuttle wall - suffix: Interior - components: - - type: RCDDeconstructable - cost: 6 - delay: 8 - fx: EffectRCDDeconstruct8 - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 400 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - !type:PlaySoundBehavior - sound: - collection: MetalSlam - - trigger: - !type:DamageTrigger - damage: 200 - behaviors: - - !type:PlaySoundBehavior - sound: - collection: MetalSlam - - !type:ChangeConstructionNodeBehavior - node: girder - - !type:DoActsBehavior - acts: ["Destruction"] - - type: Sprite - sprite: Structures/Walls/shuttleinterior.rsi - - type: Icon - sprite: Structures/Walls/shuttleinterior.rsi - - type: Construction - graph: Girder - node: shuttleInteriorWall - - type: IconSmooth - key: walls - base: state - - type: Reflect - reflectProb: 1 - - type: entity parent: BaseWall id: WallSolid diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml index 99525b653b..fb783e0da5 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml @@ -134,22 +134,6 @@ amount: 2 doAfter: 2 - - to: shuttleInteriorWall - completed: - - !type:SnapToGrid - southRotation: true - conditions: - - !type:EntityAnchored { } - steps: - - material: MetalRod - amount: 2 - doAfter: 1 - - tool: Screwing - doAfter: 1 - - material: Steel - amount: 2 - doAfter: 1 - - node: wall entity: WallSolid edges: @@ -256,23 +240,6 @@ - tool: Prying doAfter: 5 - - node: shuttleInteriorWall - entity: WallShuttleInterior - edges: - - to: girder - completed: - - !type:SpawnPrototype - prototype: SheetSteel1 - amount: 2 - - !type:SpawnPrototype - prototype: PartRodMetal1 - amount: 2 - steps: - - tool: Welding - doAfter: 10 - - tool: Screwing - doAfter: 1 - - node: reinforcedGirder entity: ReinforcedGirder edges: diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml index 435524c854..7602a6cb11 100644 --- a/Resources/Prototypes/Recipes/Construction/structures.yml +++ b/Resources/Prototypes/Recipes/Construction/structures.yml @@ -232,24 +232,6 @@ conditions: - !type:TileNotBlocked -- type: construction - name: interior shuttle wall - id: InteriorShuttleWall - graph: Girder - startNode: start - targetNode: shuttleInteriorWall - category: construction-category-structures - description: Keeps the air in and the greytide out. - icon: - sprite: Structures/Walls/shuttleinterior.rsi - state: full - objectType: Structure - placementMode: SnapgridCenter - canRotate: false - canBuildInImpassable: false - conditions: - - !type:TileNotBlocked - - type: construction name: diagonal shuttle wall id: DiagonalShuttleWall diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/full.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/full.png deleted file mode 100644 index f336d4c73bcece092dd4b3e83c11660e3a2f3ee9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1746 zcmV;@1}*uCP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000J=Nkl<ZSVzrQ zdrXyO82^3e!hyp@LIf1K$W_4vJ&K@}m}M;&W^MgZwk1pfZy*Q<G|Mgu2jr$rO(!|B z{%BJd&DLd=trT-Zaay=Q;^HL`g}9u<;at9+=cSL4o3=?Cz1z3%JKy)7_xU}~^LwB7 z_eep3QL@g>6~n{BkW~_bf`VYSSfJHv;gkRkBsiT;I2;bBR4QmR8u82*Kl2#-&2G1g z-)gm5%y-H%WWHz({@vBp1)ihVxuU<nA5v&&jLaY6;^N@u;f}$<K}_=YhJ`@bWhc}G zfWJ%9$eoAHW)q-XTwH{qp`ju1UID}gdA>52=jrHTgZ#|SHq>7b-=&C%IkLfEfJ&=D zTU#3{Dk@-i+7J*B052~uSchz*Ub1IwoIzTxR$+v_;k&!LyO__B<G~<!zRpz(v)PQB zH*Z3xb;X7a8xRo@AwXQbco9-yaI~D5m?$P}+_)aUH2#XHs3=^$dQ}*jZ-^faCws^X z_w@9LQ1W+<fL^c1<jIo-01<YI4uj&k^%pLQ@3FD5xP19C;vSuYva$*U2M6Qq*|U%q zJ-%G_^Yg>@?S(jg@&qCyBhlL0inVLgFg3uJQUKT;c7d3O;vsvdc*#a}I-M}Cq=$hq z2x1CFwjD>0)(E2=9UWM;@&%YorRePJgk)HlEXTyeAR}`fnwpx>-259-Q&Yv_PNxI@ zKAytpSRRagBYuz(zBmp1TLHv|`8~hu9$<bDkYO8YYHEn&A&8ES#@@<(Xl!g80T3P@ zj-ujSsIIO?TG|>xCRbOT@S66(Xjs{hVw{aIFl9$5MwL59i|1P%P7xim*#Z}}28RzH zL3(;RjQNFvbJE<zWSPTWRZ%7gxMRn5^!E0WajO8r`#{O-Sf;aKg=~Chj}@cJjuBC! zoyvrDbJJszhbMOJDne#vCi1o#Dca4D7A{&Q2T^WH%gb=?%xSD#@ho|!#*NNyTGbW# zx%pz@haDwlB~&Pe5a{nq{BYp2Q(q!+aWe99a?#P=4rxK+QaL0v6cu}`@Z;%ku<H5e z$a5+fcmIUVss2v@XjKmQ`AnjeIC1jxFYtKs)7Y{(3vEPp$&j!_o)H#?%6)tB!*^c^ z09<eG_6>qdKtW!?!#XeiS6o^QDh2TIawk$k09f+mGsxbw8Nau*j6{F|a0=>v`d*|! zl4NxE_KOG@DOckeradNb1bn?ciNKObLDFMOMG6D}<^TiO`R+SZ9?#*$loe#pi9fn~ z1P8Wm**YHk*i*4ba3H|<5n4xu6Sb!hZ%D+>9dC{Rm`~d<jJ9EZVFBvTpTU~fUJ(Fp z-M%XT<mKdz3qWaksQ@r_ijM&B;YXjqkgymfMa5{jb`8?J1y9J~RGYJNbMWogr(n#@ zrd-)Y3Wgmj6w-bj&nPM>qW$j_DNw02FqKte+42>rEGx$~-iFM92&w~{va@jf(~nX7 z-rL01Vf2};=r`N2&A4qm_OaWv8=iVCy!1NST`nki<1M`O@~hZaS%qe*yb}*#!c#Ee zB%JVVIN^ope^H7j^e~$6<2WIKN^xWaN=r@HfAE0NhAf{g7BgH)$yn|30|kjvrN#;p zey4~SokqgY--5)`b3~A=&mcjPXGBXARl=ks5+tD^FwwDj@X#ToXRH-c%8O*Sklu7I zjBP*^-N$#uD66CUNiu>jBv~IRXkO=ogNKo^ZXJwt%y+bsBx4fJoH-Mlvp10>Z$x`X zD^{;wE%cs52ly0k_fc;YA*x6&1=zi!l)YCXaJzSqI<675eC*gU1P6s8cGfH*N?H0# ziHo0-{rvr5+-5{=Z7qUAf^nncI#SbKN9gpatStW_zeUSNz&JX5SHgWiSx#=F_4+MT zA32J^py}u!iJp>@0@H32x>%NngvH89Nl9oWg_@O<g@%R(%$_|PSFT)vg~GNl!7$on zC|>pT_2JH)JEG&^@u0@!=kxV&qjV~3#>dB_s=NxJAt9)%tApqb<L1qU3+1VW1j73V z_QOf1;k0Sf;GuV?Q_&)Ft#mpZZU(?z5%Yk@*w&2GqReG(c<J3RU>+2mmx@lqjhX8a zMgnM<B6#TnwPsNfajcZUAUM3tSWgcR5n}EOwA4&03n~pKgW$no=fQJ%+}oToKpU+g znp2wFKQJJ67V|+EC;U=?-wc_1I*WA(l12@G;sfVas~Yi|Tl9Zx&l%9YU6RtCtH_7| oLR}W8klQiY?tmM$=N!qu01jeEzkOxd!~g&Q07*qoM6N<$g6ZE-kpKVy diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/meta.json b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/meta.json deleted file mode 100644 index 97ca2aa3b0..0000000000 --- a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/meta.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/tgstation/tgstation/blob/9ddb8cf084e292571d4e9c79745db25befbd82fe/icons/turf/walls/shuttle_wall.dmi", - "states": [ - { - "name": "full" - }, - { - "name": "state0", - "directions": 4 - }, - { - "name": "state1", - "directions": 4 - }, - { - "name": "state2", - "directions": 4 - }, - { - "name": "state3", - "directions": 4 - }, - { - "name": "state4", - "directions": 4 - }, - { - "name": "state5", - "directions": 4 - }, - { - "name": "state6", - "directions": 4 - }, - { - "name": "state7", - "directions": 4 - } - ] -} \ No newline at end of file diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state0.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state0.png deleted file mode 100644 index f53131b1be4c3db24b43bb6db774e52679204bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 881 zcmV-%1CIQOP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0009xNkl<ZcwX&W zJ!lj`6rNNm(pkiu7MDFz2*ETW{sa`GrFg-@fQ5~PVEj1^A|j@Uh=@cl(Fhhc7D6l} zCzcv95PuMxh+q-!yh2Y?*riAn{RZDMx7_aR<^{vf+i7;Wop(F$+xO;uZ{|&#+TfPY zZ(B8o(3#668qvr1uiFv{1Uj>XIWHzz0$^8v|C;{p>61q+9azF^8gW1f0Fd&vYE?~4 zP3j(7w`>mm`|m$~`Oo(5*v`^{CA^*hK>4#5O6tqPg6i$-(^oXyw`%nK){Sc{9azHa z0l?1P2Ufj8L6t^Is`6~cSN`;wQ>trIhxHZh?Hw!~Si;uP#pqxHu((*&UmnU+vw`3Y z0Jq0)st5NUHYpziKb6mQvOXe9IL-iVeaHd`fU(hw>gVreo0$LHDFEKgy;DPjhqQ78 z0;~e9R{N$ruiL*rTs)%hPYe}VACV;-`!hv!G%X+u04R?rfrdzd_M-A!UsKNmYyeyu zxuTUvq-fQg2LLWG`)XD;03btT@<A(b#sWZuzypGlAY1?wo(KTI1Q7<!D1eDEOnIj! zL88K`1K`;4lTG=&>7y{+{rmRlpNP_qj@?nkql2nEUe>caH=pN*Vm1%R00^-Fnz%r5 zO$(Twd8vAO3hr9~05CH<asdDUw;+P!tP8-u2M!MS*_}uLKwn$AfRh$L+1b6jW$p7& z-t)TMw}8jf6&(gaR-iDNnYz;Ij<YUMZ!CrKfMARU2;cz##hFPk2><|umc5(-U}a@F z(gMuoEhvx7&M6*X1Ar16QXbsEDJp#V>UC`awhav0?7$U~0#V|_{Jg5yzq08#Cm&$H z{OzaDz6-?J&N@GQ&R^Ye0)VJwDC)~Vd9>7902VcqnBY>Q(bPQyAnkL2coz^q35pMc z;)#$A0OzT&_+%&v08XaE;ul1S2Z&t~3nN0br!QtvG?)*FUltd?F(Q6z3@(xF4olb` zPqG-&s&BAXICTXQ830TKg2mEei=;r9!YV~Yl*vT_Ai7X8E0z7bpD4OmT2#3_lofqo zLiCXtDwY;|XiDs{IXXEi_TXf8boSrranXmT&3x*AAD{mNS_f)wlOvt^00000NkvXX Hu0mjflUj{* diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state1.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state1.png deleted file mode 100644 index 3041fa3daf8ab5adf7c2a638d55da8e43f6791bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0006~Nkl<ZcwS>< z7+_#(;rO2tC!9X9pOF&%6ltc!Vwm2rsAP%)VAZm@6#0Q7&D02hV`neJ13+3zoG2ro zK6?pQXJxEQksm11Oq6R0C@QaR1_yw)o*qfYUA=S(tiH3gmLfk;q?sfa<52wb=U0ld z06RN3MSh@2^JoB2Ap{;ie??IWke3vrC=w~sOa=cljQ9Y6Rf9hMe(>;w6>zu$7`ecV z3-_le5-HM5jT8W@20;$_56TQs7lHX83y{RH**D~?!4cmO8V!Jv-V`290i!8ki1!8u zItf!+6;s>}7!7~{&cmZAfWi<M%>on#Aj60+1CYn`$O%kJJ2T|iiL8g>EU;+hM)-gR zDc#sD8#jU7LFuUOfCs=p4`_@A0EHnyaTXZpQC$lC4;z0W-<S~}00TX-L4MRhbW)rJ z26}31zyn~!H-rXydVA2OfP&%zh6%kB7`l7g!ETfg;s(=oO??dhK>=X7`}giKP&&Uq z8UPfA0L6tMt}+0W0`A<o$6#+~iIM_VZrH=1qM|f1QUI<100l~EapmyO0wX>EHm=*i zkd>2;kp)If3K$K5(G)P61xCw&(L!*v78t?R;Am4AOJ86_^#-w}fMFK^6!u0LKm#g@ zN=gi%-Xo~x*i=^pHuA;0uVDJ%q2uu0BR0Dzomio`J3JZy6ovqD3IJu9@Bo*QnF2sV zXQ1Sc9stv(%!Ci24eKm08UUjyU^EMimI0%M;Akx{S`Cgighp&j5H^)Iq5}Y1ZxA$v l2AgRf)=gnt-C<e>003<!nO|EGA2<L2002ovPDHLkV1l_t0LcIV diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state2.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state2.png deleted file mode 100644 index f53131b1be4c3db24b43bb6db774e52679204bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 881 zcmV-%1CIQOP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0009xNkl<ZcwX&W zJ!lj`6rNNm(pkiu7MDFz2*ETW{sa`GrFg-@fQ5~PVEj1^A|j@Uh=@cl(Fhhc7D6l} zCzcv95PuMxh+q-!yh2Y?*riAn{RZDMx7_aR<^{vf+i7;Wop(F$+xO;uZ{|&#+TfPY zZ(B8o(3#668qvr1uiFv{1Uj>XIWHzz0$^8v|C;{p>61q+9azF^8gW1f0Fd&vYE?~4 zP3j(7w`>mm`|m$~`Oo(5*v`^{CA^*hK>4#5O6tqPg6i$-(^oXyw`%nK){Sc{9azHa z0l?1P2Ufj8L6t^Is`6~cSN`;wQ>trIhxHZh?Hw!~Si;uP#pqxHu((*&UmnU+vw`3Y z0Jq0)st5NUHYpziKb6mQvOXe9IL-iVeaHd`fU(hw>gVreo0$LHDFEKgy;DPjhqQ78 z0;~e9R{N$ruiL*rTs)%hPYe}VACV;-`!hv!G%X+u04R?rfrdzd_M-A!UsKNmYyeyu zxuTUvq-fQg2LLWG`)XD;03btT@<A(b#sWZuzypGlAY1?wo(KTI1Q7<!D1eDEOnIj! zL88K`1K`;4lTG=&>7y{+{rmRlpNP_qj@?nkql2nEUe>caH=pN*Vm1%R00^-Fnz%r5 zO$(Twd8vAO3hr9~05CH<asdDUw;+P!tP8-u2M!MS*_}uLKwn$AfRh$L+1b6jW$p7& z-t)TMw}8jf6&(gaR-iDNnYz;Ij<YUMZ!CrKfMARU2;cz##hFPk2><|umc5(-U}a@F z(gMuoEhvx7&M6*X1Ar16QXbsEDJp#V>UC`awhav0?7$U~0#V|_{Jg5yzq08#Cm&$H z{OzaDz6-?J&N@GQ&R^Ye0)VJwDC)~Vd9>7902VcqnBY>Q(bPQyAnkL2coz^q35pMc z;)#$A0OzT&_+%&v08XaE;ul1S2Z&t~3nN0br!QtvG?)*FUltd?F(Q6z3@(xF4olb` zPqG-&s&BAXICTXQ830TKg2mEei=;r9!YV~Yl*vT_Ai7X8E0z7bpD4OmT2#3_lofqo zLiCXtDwY;|XiDs{IXXEi_TXf8boSrranXmT&3x*AAD{mNS_f)wlOvt^00000NkvXX Hu0mjflUj{* diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state3.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state3.png deleted file mode 100644 index 1263f7a1badc82ace2097096bfeef82eb9bfde68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n2LP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0006zNkl<ZcwS>< z7+_#(;rO2tC!9X9pOF&%6ltc!Vwm2rsAP%)VAZm@6#0Q7&D02hV`neJ13+3zoG2ro zK6?pQXJxEQksm11Oq6R0C@QaR1_yw)o*qfYUA=S(tiH3gmLfk;q?sfa<52wb=U0ld z06RN3MSh@2^JoB2Ap{;ie??IWke3vrC=w~sOa=cljQ9Y6Rf9hMe(>;w6>zu$7`ecV z3-_le5-HM5jTC@f4U%Ktkgo<ud_!n707iOKcr*o!rhp;d8yx5)OitB_tcT)uz-Ryr za2_5_0ThP7XcnL_02xMn88FbD8A>CN;w-Re<wp2`1}WXxEgLt1-A?JK?tlltKo4k) z1^|U2Kyelr=uuq?{m(EO0F;K{Ku>H?>VAq-z(7xJ4R`>I_=eCxPj3&}6i`rHz%ZeA z0z-FiJJ^j9Lfl}wuBnf~KPUh!cmLi!21@7mM+1Pu5TLja#8n1>Qox-%_ZaN$EKyRx z$_;xMR8*8kMhd_c0H8oAEv_8?SzyEmz{YhO7_xHGF|xpjNdcn)Fq#5Jv%qK>Fj@$X z)&e8A8XRp3W9bWwsNNv96fo=pfWqD=186`+QAvpb)O!TA9GmKjz(&4!_Z3VZJaio1 zd&FiJr4uU@cZWv<fWi<!P641S6CU6)GE)F(=nRzH(F0)Gl$r1$v|*hEMgw3p1&n5a z(K2AP5FD)qMytWmhR}#@3Bsn*MsxsR>kWdY&|ovo!@4Pqt2<2V0002qQI%igt5B~1 O0000<MNUMnLSTYqEBt@} diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state4.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state4.png deleted file mode 100644 index 92ab8365c2adb41007f94d59e5312826d9a7bdeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627 zcmV-(0*w8MP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0006yNkl<ZcwS>< z7+_#(;rL%sNr|DLxPW2fx(y6Xbwywoy?FN(OqUi{g5@UkPQdEYRm<iwQsM=QG*e<R zOz&s_Af<pickVHS2e_c5fP;sQGpML24gVC--P_Ip^6Y2;jHUq8EHG`#Oa}j;fRUR8 zMgw3p1&n5a(K2AP5FD)qMnE+P>hO%{rZBGF;E3r94A}q(i%R~Fty>IB()M<iU}*^< zZZKWf)CaHD?%%t|aQejl0qv4gZ24#akeC8iZrB6w-w*o~02<=T%1KAb0-yi@Wed<y z*JuC?_cCBK1&n5a(K2AP5FD)qMshU>>fNC?g-297U^D=5qyX4d*RXF1f@X9<Q(hys zH#i~!05rW#$u#+}9S<NjP$*sCK&(Bu)KNSja_sD7cnXk~5+}+%PoKSntFtoJrPvKb zS&Bmu#g>;>H-iH}TThQ9cU--639P=ewU%NxkYq8MVu~&Q`SUA9WdJ)nH^puk4FC#4 zfa1`9`1}<`DL`IQjAA!X;C}{+Eg$g#uxRB*cnW|OY`9_sxuD##aT8eCu&M^hNs2?h z8pJg*LTq3R`4li3061obMpFQhAuyT+C|vDLWH{qgMsYh}#Fqh-#=t-aAjK(QGyo_J zfzcE&z}4tz7N9T%Q>=Z&X946fMRG!u($3VN$pSw9esKSj(yfjQ_ov7Y6lo?W#?bW) z^nl7}08k?qDKTT9N0kRW1&sIr80d+W0Z#z~J+(IA0WjhlLIXX$4geW*m0wPP08sz{ N002ovPDHLkV1len0ptJx diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state5.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state5.png deleted file mode 100644 index 430bab8398bf04435db77a64a4786cfa6442d08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704 zcmV;x0zdtUP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0007qNkl<ZcwX&W zJxc>Y5ZzQM(piXBCX!A}W2J@u0WqC|g^h(E7QrAQVv2}}NF;>_7B&`wb`k%87FyXv z?1Irsv9L>#D)J5|T*4)}bHFpRvrTee+`hLnZ|7!qBPQfFzqs5;B;sZ)l`_xevdQPx zogRIB)y&E9si{_9O(vT$#X`}ur&kwe5e@{_!<-k>vzyzy4g3et!@|CEdT1clBml%D zlcRD8IKM14Zc5i?Ha+KnpP8O);q~_JK{f%ffYr4X1EADE0?eOAALqroK)qgTz~9k8 z0)Z#r?*<;%`d$M-0Er%c-NM%kya)o`-aj1zegj?v0W=Gc4nXn!j69Ln_bz}qfM$T8 z;6+%#{o_;91%iycC<|zr_yZn@aDjlBTW(hZ`u$q~BB&O?U_f0UY!?XIgc-);Jj%`o zC;=ghm|6gn0d)Z;fkrhTpavkr>uysM<7_MB3?lpGK`em4S1K<~pOFmZ1~MG*e>x4i z!BgH39XQzAVGja_1oq4QSO9@XW;c<D8)Sc|jSLU6`|z&`=mZ|c5431BCYOM2BM<N( zK`a4opGVEFQ}IKr27myly;rG=W&k8Zmlo18U4RIn(WinZz;9%?95EC<3s6a$RG&mI zmp^Kj!cqPb8wV%>KN?`Q3s^6L5IK-w<unNJUV#v;0T3SuQG9N7DBOz#To?Z_)J_5k zBUXZl4urfuQLRphv|9olTa^;?vI?=Gu-`0=62L5O`X##4ee7>>KRLl}om2}@3*aqx z58Va09SGZn*czY&Fd0w_2v}Tg=bJl=s0%PHnEkl*E})C0ZC@^L{e}tax6D|-Y0CO- mbJlO1)UC6&Z=Mc&`}{Y=WkFx@XB{N~0000<MNUMnLSTX)5h@h` diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state6.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state6.png deleted file mode 100644 index c8c28b2600fcdfdaa2a40cc97d6f817d56d12ce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704 zcmV;x0zdtUP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0007qNkl<ZcwS>< z7+_#(;rL%sNr|DLxPW2fx(y6Xbwywoy?FN(OqUf`g5~;qCt!8ys%3K-De(eDnklgu zrk9ui$Oi_%gpm*cckbL{2oG>UNdX5B9cNHcQ3M9S#NnL+x_jFhK%T`6fMX1*D$2t@ z3*ZX?6<`1i`z(Mf0H#iv$q*0}FmeN6+T@uG{=xnuw+xsDO##Ec8pM?arcIf_;2#t? zg0lcH1^5R7%YeRN-Vnl<0s??3V8mvD5nl_8m;eBEcyKp`m4<&Ih^sdU=?jeH05}K? z0M$Vp0AW$d|FLz`U`g8E&JrvwA;b-)>zew2^*W?!d;i`&hSMkZ4``R1V#`MZfW#EA za>E{Yo*woo05rsvm6MK=1wa7+$`+--p{~&Y817}jXbKq30;6TXXdyUS3ykDy5Y)Rv zZwim7cED%=;79?m?(MK|34(fjps~IY+Z!Aa0RWobrevCY*p3Gf8z_`6a3IzmT<Rzu z5IJ`CGCT!HONkTZo~O@V!qr(B>r(6nqAbOsh+@mjtDC_ApslAzk~^+mx&&6=*;-4n z8%VMkO)<rm|NQxtqB4M;ott7ej0OM&AwY5HKYad*q7)!6DMqmyDDXc6#g>ow09dqg zBRmDb3N~CZf?QB;*|-U;Y*<x;<Rrx*Uk&1#7$G(=hI|Sb4FDW7L!&8x$PgIK0u-+H zCNi9HDx<g^FyhMqN@HN41CZhrFd6_9hQMeF7~pDjGz(Cef+^NM;<Etqm?Al$Noi+l z&}0E0e?PeYN$FO{h5J+F2Z}V46JzLl26{kcGytd(i<Fo#(4)!&o&rXE01WiR%7CYU mfu33$@BkR`4WWUaUIzdfTa{lLmv(ai0000<MNUMnLSTZ!ryh#{ diff --git a/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state7.png b/Resources/Textures/Structures/Walls/shuttleinterior.rsi/state7.png deleted file mode 100644 index 629e4e3154f3533bd3d84a9a22db97f0add01c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmV-~0ek+5P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0003?Nkl<ZcwX(A zK@NgI5CoS`Vxl*Fm)<0iPvR^d)Wp-2$!4LrXrd$7nXc(Uhtl{MPnV@Exr-R0>@i*I zL;66)>9c+mj>ixneJo|3Zs<Fp;`DWY32+Vpl9v%>^S$>D02V0WoegvVu)rod05Kpe z&^rVVAwZUbPJw`F_Z?sk*gFFZLc8w(6ohsT!J4T1p907Nn~K79CyHoOQ&CMgYdjiW zPuJz?$LsO_=F1SHIB#LPktX-h_h}UXdDsrX6xRY!0T}=VEJ9ESf_r*@h_bYUWdK!B z2FL&zkiDzDx{vPj)WSlLDkubnpb!*-gd<J?`13Xqzt%bise+C{$Dm`-F-SP#7<3G> ze|nPcGY1%iOoBWLQxCRIl6V(T0H}Z+(0G^70<eQ|xfaj@ZP#fTfK3cPKnBPF8PN2W inh=Bx!{tJ-F$ABmtP@b9W?;1d0000<MNUMnLSTXj;GSOq diff --git a/Resources/migration.yml b/Resources/migration.yml index 851e6ca03c..76109d0c60 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -536,20 +536,23 @@ LightTree04: LightTree LightTree05: LightTree LightTree06: LightTree -#2024-12-28 +# 2024-12-28 DrinkIrishCarBomb: DrinkIrishSlammer -#2025-01-06 +# 2025-01-06 ClothingMaskSexyClown: ClothingMaskBlushingClown ClothingMaskSexyMime: ClothingMaskBlushingMime # 2025-01-27 FoodCondimentPacketFrostoil: FoodCondimentPacketColdsauce -#2025-02-05 +# 2025-02-05 WeaponSubMachineGunVector: null WeaponSubMachineGunVectorRubber: null +# 2025-02-11 +WallShuttleInterior: WallShuttle + # 2025-02-20 MagazineBoxAntiMaterielBig: null MagazineBoxCaselessRifle10x24: null From d866d61b569acceb2eb710f3c7bd375ea34280fc Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 14:42:41 +0000 Subject: [PATCH 389/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 374fee22c6..296acb9944 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,18 +1,4 @@ Entries: -- author: Velcroboy - changes: - - message: Rolling joints no longer requires a cigarette filter. - type: Tweak - id: 7762 - time: '2024-12-29T03:25:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34106 -- author: DreamlyJack - changes: - - message: Added Hair Pulato - type: Add - id: 7763 - time: '2024-12-31T10:29:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34117 - author: chromiumboy changes: - message: Chat messages from holopads during emergency broadcasts will no longer @@ -3908,3 +3894,18 @@ id: 8262 time: '2025-04-19T14:37:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33814 +- author: sowelipililimute + changes: + - message: Servers with the number of open inventories set to two have a new alignment + that doesn't shift as much when opening and closing multiple inventories + type: Tweak + id: 8263 + time: '2025-04-19T14:40:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35041 +- author: ps3moira + changes: + - message: Removed interior shuttle walls + type: Remove + id: 8264 + time: '2025-04-19T14:41:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34261 From 5097ae5e6f2df8ad8ecdb2df558d081ec56b0175 Mon Sep 17 00:00:00 2001 From: Minemoder5000 <minemoder50000@gmail.com> Date: Sat, 19 Apr 2025 09:31:38 -0600 Subject: [PATCH 390/622] Rebalance and reduce playtime requirements for most roles. (#36666) --- .../Prototypes/Roles/Jobs/Cargo/quartermaster.yml | 6 ++---- .../Roles/Jobs/Cargo/salvage_specialist.yml | 4 +--- .../Prototypes/Roles/Jobs/Civilian/bartender.yml | 2 +- Resources/Prototypes/Roles/Jobs/Civilian/chef.yml | 2 +- Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml | 2 +- .../Prototypes/Roles/Jobs/Civilian/service_worker.yml | 4 ++++ Resources/Prototypes/Roles/Jobs/Command/captain.yml | 11 +++++++---- .../Roles/Jobs/Command/head_of_personnel.yml | 11 +++++++---- .../Roles/Jobs/Engineering/atmospheric_technician.yml | 6 +++--- .../Roles/Jobs/Engineering/chief_engineer.yml | 6 ++---- .../Roles/Jobs/Engineering/station_engineer.yml | 2 +- .../Roles/Jobs/Engineering/technical_assistant.yml | 2 +- Resources/Prototypes/Roles/Jobs/Medical/chemist.yml | 2 +- .../Roles/Jobs/Medical/chief_medical_officer.yml | 7 ++----- .../Prototypes/Roles/Jobs/Medical/medical_doctor.yml | 2 +- .../Prototypes/Roles/Jobs/Medical/medical_intern.yml | 2 +- Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml | 8 +++----- Resources/Prototypes/Roles/Jobs/Science/borg.yml | 5 +++-- .../Roles/Jobs/Science/research_assistant.yml | 2 +- .../Roles/Jobs/Science/research_director.yml | 11 ++++++----- Resources/Prototypes/Roles/Jobs/Science/scientist.yml | 2 +- .../Prototypes/Roles/Jobs/Security/detective.yml | 6 +++--- .../Roles/Jobs/Security/head_of_security.yml | 11 ++++++----- .../Prototypes/Roles/Jobs/Security/security_cadet.yml | 2 +- .../Roles/Jobs/Security/security_officer.yml | 2 +- Resources/Prototypes/Roles/Jobs/Security/warden.yml | 3 +++ 26 files changed, 64 insertions(+), 59 deletions(-) diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml index 740afded64..e0cbc95690 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml @@ -6,15 +6,13 @@ requirements: - !type:RoleTimeRequirement role: JobCargoTechnician - time: 21600 #6 hrs + time: 18000 #5 hrs - !type:RoleTimeRequirement role: JobSalvageSpecialist - time: 10800 #3 hrs + time: 9000 #2.5 hrs - !type:DepartmentTimeRequirement department: Cargo time: 36000 #10 hours - - !type:OverallPlaytimeRequirement - time: 144000 #40 hrs weight: 10 startingGear: QuartermasterGear icon: "JobIconQuarterMaster" diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml index 679b39f05b..8a1811f0c9 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml @@ -6,9 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Cargo - time: 10800 # 3 hrs - - !type:OverallPlaytimeRequirement - time: 36000 #10 hrs + time: 9000 # 2.5 hrs icon: "JobIconShaftMiner" startingGear: SalvageSpecialistGear supervisors: job-supervisors-qm diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml index 2d035ee3b4..3306c41196 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Civilian - time: 1800 + time: 1800 #0.5 hr startingGear: BartenderGear icon: "JobIconBartender" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml index 5abb1d4c8e..8ea6dd1acf 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Civilian - time: 1800 + time: 1800 #0.5 hr startingGear: ChefGear icon: "JobIconChef" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index 713cde0e0c..3cd8258e59 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -5,7 +5,7 @@ playTimeTracker: JobLawyer requirements: - !type:OverallPlaytimeRequirement - time: 36000 # 10 hrs + time: 9000 # 2.5 hrs startingGear: LawyerGear icon: "JobIconLawyer" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml index 427d9b8192..9dd79cfabe 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml @@ -3,6 +3,10 @@ name: job-name-serviceworker description: job-description-serviceworker playTimeTracker: JobServiceWorker + requirements: + - !type:DepartmentTimeRequirement + department: Civilian + time: 1800 #0.5 hr startingGear: ServiceWorkerGear icon: "JobIconServiceWorker" supervisors: job-supervisors-service diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml index a22d334c94..33fc261922 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml @@ -6,16 +6,19 @@ requirements: - !type:DepartmentTimeRequirement department: Engineering - time: 54000 # 15 hours + time: 14400 # 4 hours - !type:DepartmentTimeRequirement department: Medical - time: 54000 # 15 hours + time: 14400 # 4 hours + - !type:DepartmentTimeRequirement + department: Science + time: 14400 # 4 hours - !type:DepartmentTimeRequirement department: Security - time: 54000 # 15 hours + time: 14400 # 4 hours - !type:DepartmentTimeRequirement department: Command - time: 54000 # 15 hours + time: 14400 # 4 hours weight: 20 startingGear: CaptainGear icon: "JobIconCaptain" diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml index f457cfbc49..5f4691b250 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml @@ -6,16 +6,19 @@ requirements: - !type:DepartmentTimeRequirement department: Engineering - time: 36000 # 10 hours + time: 9000 # 2.5 hours - !type:DepartmentTimeRequirement department: Medical - time: 36000 # 10 hours + time: 9000 # 2.5 hours + - !type:DepartmentTimeRequirement + department: Science + time: 9000 # 2.5 hrs - !type:DepartmentTimeRequirement department: Security - time: 36000 # 10 hrs + time: 9000 # 2.5 hrs - !type:DepartmentTimeRequirement department: Command - time: 36000 # 10 hours + time: 9000 # 2.5 hours weight: 20 startingGear: HoPGear icon: "JobIconHeadOfPersonnel" diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml index 55c5cfaa06..007b1d1174 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml @@ -4,9 +4,9 @@ description: job-description-atmostech playTimeTracker: JobAtmosphericTechnician requirements: - - !type:DepartmentTimeRequirement - department: Engineering - time: 54000 # 15 hrs + - !type:DepartmentTimeRequirement + department: Engineering + time: 9000 #2.5 hrs startingGear: AtmosphericTechnicianGear icon: "JobIconAtmosphericTechnician" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml index 9bac538551..5550e02840 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml @@ -6,15 +6,13 @@ requirements: - !type:RoleTimeRequirement role: JobAtmosphericTechnician - time: 21600 #6 hrs + time: 9000 #2.5 hrs - !type:RoleTimeRequirement role: JobStationEngineer - time: 21600 #6 hrs + time: 18000 #5 hrs - !type:DepartmentTimeRequirement department: Engineering time: 36000 #10 hrs - - !type:OverallPlaytimeRequirement - time: 144000 #40 hrs weight: 10 startingGear: ChiefEngineerGear icon: "JobIconChiefEngineer" diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml index 0bd81e65e0..17a6e67ae2 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Engineering - time: 14400 #4 hrs + time: 9000 #2.5 hrs startingGear: StationEngineerGear icon: "JobIconStationEngineer" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml index d0d3cfe786..23ad4ca401 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml @@ -8,7 +8,7 @@ time: 3600 #1 hr - !type:DepartmentTimeRequirement department: Engineering - time: 54000 #15 hrs + time: 18000 #5 hrs inverted: true # stop playing intern if you're good at engineering! startingGear: TechnicalAssistantGear icon: "JobIconTechnicalAssistant" diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index dec2b6273e..830af18b9b 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Medical - time: 14400 #4 hrs + time: 18000 #5 hrs startingGear: ChemistGear icon: "JobIconChemist" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index 83b16d427b..d6b717df80 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -8,16 +8,13 @@ requirements: - !type:RoleTimeRequirement role: JobChemist - time: 10800 #3 hrs + time: 9000 #2.5 hrs - !type:RoleTimeRequirement role: JobMedicalDoctor - time: 21600 #6 hrs + time: 18000 #5 hrs - !type:DepartmentTimeRequirement department: Medical time: 36000 #10 hrs - - !type:OverallPlaytimeRequirement - time: 144000 #40 hrs - weight: 10 startingGear: CMOGear icon: "JobIconChiefMedicalOfficer" supervisors: job-supervisors-captain diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml index c23401f0fb..f0f39d156f 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Medical - time: 14400 #4 hrs + time: 9000 #2.5 hrs startingGear: DoctorGear icon: "JobIconMedicalDoctor" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml index 41808558fd..f7414d75ab 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Medical - time: 54000 # 15 hrs + time: 18000 # 5 hrs inverted: true # stop playing intern if you're good at med! startingGear: MedicalInternGear icon: "JobIconMedicalIntern" diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml index 166f9ac42b..22b985e8d7 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml @@ -4,11 +4,9 @@ description: job-description-paramedic playTimeTracker: JobParamedic requirements: - - !type:RoleTimeRequirement - role: JobMedicalDoctor - time: 14400 #4 hrs - - !type:OverallPlaytimeRequirement - time: 54000 # 15 hrs + - !type:DepartmentTimeRequirement + department: Medical + time: 9000 #2.5 hrs startingGear: ParamedicGear icon: "JobIconParamedic" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Science/borg.yml b/Resources/Prototypes/Roles/Jobs/Science/borg.yml index d85ed2a8bf..84ded8ed48 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/borg.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/borg.yml @@ -1,4 +1,5 @@ # No idea why it's in sci but we ball. +# Why is this one file? - type: job id: StationAi name: job-name-station-ai @@ -7,7 +8,7 @@ requirements: - !type:RoleTimeRequirement role: JobBorg - time: 54000 # 15 hrs + time: 18000 # 5 hrs canBeAntag: false icon: JobIconStationAi supervisors: job-supervisors-rd @@ -22,7 +23,7 @@ playTimeTracker: JobBorg requirements: - !type:OverallPlaytimeRequirement - time: 144000 # 40 hrs + time: 36000 # 10 hrs canBeAntag: false icon: JobIconBorg supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml b/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml index c421c09b8a..8dba235d89 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_assistant.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Science - time: 54000 #15 hrs + time: 18000 #5 hrs inverted: true # stop playing intern if you're good at science! startingGear: ResearchAssistantGear icon: "JobIconResearchAssistant" diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 7d6db3e0be..bc341907d7 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -4,11 +4,12 @@ description: job-description-rd playTimeTracker: JobResearchDirector requirements: - - !type:DepartmentTimeRequirement - department: Science - time: 36000 #10 hrs - - !type:OverallPlaytimeRequirement - time: 144000 #40 hrs + - !type:RoleTimeRequirement + role: JobScientist + time: 18000 #5 hrs + - !type:DepartmentTimeRequirement + department: Science + time: 36000 #10 hrs weight: 10 startingGear: ResearchDirectorGear icon: "JobIconResearchDirector" diff --git a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml index 8bb99eab3c..cefd26c450 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Science - time: 14400 #4 hrs + time: 9000 #2.5 hrs startingGear: ScientistGear icon: "JobIconScientist" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index d6bc23f9ff..19f14eda95 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -4,9 +4,9 @@ description: job-description-detective playTimeTracker: JobDetective requirements: - - !type:DepartmentTimeRequirement - department: Security - time: 54000 # 15 hours + - !type:RoleTimeRequirement + role: JobSecurityOfficer + time: 18000 #5 hrs startingGear: DetectiveGear icon: "JobIconDetective" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml index e22eccb7da..edf45ca944 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml @@ -6,15 +6,16 @@ requirements: - !type:RoleTimeRequirement role: JobWarden - time: 10800 #3 hrs + time: 3600 #1 hr + - !type:RoleTimeRequirement + role: JobDetective + time: 3600 #1 hr, knowing how to use the tools is important - !type:RoleTimeRequirement role: JobSecurityOfficer - time: 36000 #10 hrs + time: 18000 #5 hrs - !type:DepartmentTimeRequirement department: Security - time: 108000 # 30 hrs - - !type:OverallPlaytimeRequirement - time: 144000 #40 hrs + time: 36000 # 10 hrs weight: 10 startingGear: HoSGear icon: "JobIconHeadOfSecurity" diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml index cee8a88264..260f92b587 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml @@ -8,7 +8,7 @@ time: 36000 #10 hrs - !type:DepartmentTimeRequirement department: Security - time: 54000 #15 hrs + time: 18000 #5 hrs inverted: true # stop playing intern if you're good at security! startingGear: SecurityCadetGear icon: "JobIconSecurityCadet" diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml index dd2f82d666..af074c17aa 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml @@ -6,7 +6,7 @@ requirements: - !type:DepartmentTimeRequirement department: Security - time: 36000 #10 hrs + time: 9000 #2.5 hrs startingGear: SecurityOfficerGear icon: "JobIconSecurityOfficer" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml index 856c866038..0a49023a44 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml @@ -6,6 +6,9 @@ requirements: - !type:RoleTimeRequirement role: JobSecurityOfficer + time: 18000 #5 hrs + - !type:DepartmentTimeRequirement + department: Security time: 36000 #10 hrs weight: 5 startingGear: WardenGear From 1daac6d86b04579b42933cdd64f5b0c667d23bbd Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 15:32:44 +0000 Subject: [PATCH 391/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 296acb9944..99619886ca 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: chromiumboy - changes: - - message: Chat messages from holopads during emergency broadcasts will no longer - be logged in the chat window to prevent message spam. This is a temporary change - until a proper fix can be made to the chat system - type: Tweak - id: 7764 - time: '2024-12-31T10:52:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34114 - author: PopGamer46 changes: - message: Fixed borgs not being able to check their laws in crit @@ -3909,3 +3900,11 @@ id: 8264 time: '2025-04-19T14:41:35.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34261 +- author: Minemoder + changes: + - message: Most roles on the station now require significantly less playtime playtime + to unlock. + type: Tweak + id: 8265 + time: '2025-04-19T15:31:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36666 From 8dc2cb8874726e069f475d8b9f5cf8462ec3dff8 Mon Sep 17 00:00:00 2001 From: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> Date: Sat, 19 Apr 2025 12:11:34 -0400 Subject: [PATCH 392/622] Minor dependency and variable cleanup. (#36730) removal of misc unused or extra dependency definitions. --- Content.Client/RCD/RCDConstructionGhostSystem.cs | 1 - .../UserInterface/Systems/Actions/ActionUIController.cs | 1 - .../UserInterface/Systems/Actions/Controls/ActionButton.cs | 2 -- Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs | 3 +-- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Content.Client/RCD/RCDConstructionGhostSystem.cs b/Content.Client/RCD/RCDConstructionGhostSystem.cs index 0b6876005a..23dcf6485f 100644 --- a/Content.Client/RCD/RCDConstructionGhostSystem.cs +++ b/Content.Client/RCD/RCDConstructionGhostSystem.cs @@ -13,7 +13,6 @@ namespace Content.Client.RCD; public sealed class RCDConstructionGhostSystem : EntitySystem { [Dependency] private readonly IPlayerManager _playerManager = default!; - [Dependency] private readonly RCDSystem _rcdSystem = default!; [Dependency] private readonly IPlacementManager _placementManager = default!; [Dependency] private readonly IPrototypeManager _protoManager = default!; diff --git a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs index a4157517ce..8d512c23ab 100644 --- a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs +++ b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs @@ -45,7 +45,6 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IInputManager _input = default!; - [UISystemDependency] private readonly SharedChargesSystem _sharedCharges = default!; [UISystemDependency] private readonly ActionsSystem? _actionsSystem = default; [UISystemDependency] private readonly InteractionOutlineSystem? _interactionOutline = default; [UISystemDependency] private readonly TargetOutlineSystem? _targetOutline = default; diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs index 9e7ef6be4d..cc12f1b867 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs @@ -29,8 +29,6 @@ public sealed class ActionButton : Control, IEntityControl private bool _depressed; private bool _toggled; - private int _lastCharges; - public BoundKeyFunction? KeyBind { set diff --git a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs index 8045cfed46..c6c682bcf3 100644 --- a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs +++ b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs @@ -19,7 +19,6 @@ public sealed partial class StationJobsSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IBanManager _banManager = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly AntagSelectionSystem _antag = default!; private Dictionary<int, HashSet<string>> _jobsByWeight = default!; @@ -366,7 +365,7 @@ public sealed partial class StationJobsSystem if (!_prototypeManager.TryIndex(jobId, out var job)) continue; - if (!job.CanBeAntag && (!_playerManager.TryGetSessionById(player, out var session) || antagBlocked.Contains(session))) + if (!job.CanBeAntag && (!_player.TryGetSessionById(player, out var session) || antagBlocked.Contains(session))) continue; if (weight is not null && job.Weight != weight.Value) From b36169c58fff2dd19e23323e5cb6e058fde662db Mon Sep 17 00:00:00 2001 From: Fildrance <fildrance@gmail.com> Date: Sat, 19 Apr 2025 20:07:23 +0300 Subject: [PATCH 393/622] fixing spessman getting teleported inside artifact (#36719) * fixing spessman getting teleported inside artifact * refactor: move XAEPortal comp to server * refactor: replace Spawn and coord logic with with TrySpawnNextTo --------- Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru> --- .../XAE/Components/XAEPortalComponent.cs | 5 ++--- .../Artifact/XAE/XAEPortalSystem.cs | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) rename {Content.Shared => Content.Server}/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs (68%) rename {Content.Shared => Content.Server}/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs (78%) diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs similarity index 68% rename from Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs index 2e922bb055..bafaf78e7f 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/Components/XAEPortalComponent.cs @@ -1,12 +1,11 @@ -using Robust.Shared.GameStates; using Robust.Shared.Prototypes; -namespace Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +namespace Content.Server.Xenoarchaeology.Artifact.XAE.Components; /// <summary> /// When activated artifact will spawn a pair of portals. First - right in artifact, Second - at random point of station. /// </summary> -[RegisterComponent, Access(typeof(XAEPortalSystem)), NetworkedComponent, AutoGenerateComponentState] +[RegisterComponent, Access(typeof(XAEPortalSystem))] public sealed partial class XAEPortalComponent : Component { /// <summary> diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs similarity index 78% rename from Content.Shared/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs rename to Content.Server/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs index 3d5355b5fd..acc36f0f8d 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEPortalSystem.cs @@ -1,13 +1,15 @@ +using Content.Server.Xenoarchaeology.Artifact.XAE.Components; using Content.Shared.Mind.Components; using Content.Shared.Mobs.Components; using Content.Shared.Teleportation.Systems; -using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; +using Content.Shared.Xenoarchaeology.Artifact; +using Content.Shared.Xenoarchaeology.Artifact.XAE; using Robust.Shared.Collections; using Robust.Shared.Containers; using Robust.Shared.Random; using Robust.Shared.Timing; -namespace Content.Shared.Xenoarchaeology.Artifact.XAE; +namespace Content.Server.Xenoarchaeology.Artifact.XAE; /// <summary> /// System for xeno artifact effect that creates temporary portal between places on station. @@ -41,17 +43,16 @@ public sealed class XAEPortalSystem : BaseXAESystem<XAEPortalComponent> if (validMinds.Count == 0) return; - var offset = _random.NextVector2(2, 3); - var originWithOffset = args.Coordinates.Offset(offset); - var firstPortal = Spawn(ent.Comp.PortalProto, originWithOffset); + if(!TrySpawnNextTo(ent.Comp.PortalProto, args.Artifact, out var firstPortal)) + return; var target = _random.Pick(validMinds); - - var secondPortal = Spawn(ent.Comp.PortalProto, _transform.GetMapCoordinates(target)); + if(!TrySpawnNextTo(ent.Comp.PortalProto, target, out var secondPortal)) + return; // Manual position swapping, because the portal that opens doesn't trigger a collision, and doesn't teleport targets the first time. - _transform.SwapPositions(target, ent.Owner); + _transform.SwapPositions(target, args.Artifact.Owner); - _link.TryLink(firstPortal, secondPortal, true); + _link.TryLink(firstPortal.Value, secondPortal.Value, true); } } From f3429615a6b763afe134b9729371fa335ad4a36c Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 17:08:30 +0000 Subject: [PATCH 394/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 99619886ca..648d05a8b5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: PopGamer46 - changes: - - message: Fixed borgs not being able to check their laws in crit - type: Fix - id: 7765 - time: '2024-12-31T11:10:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34133 - author: amatwiedle changes: - message: The A/V Communication technology now unlocks holopad circuit boards. @@ -3908,3 +3901,10 @@ id: 8265 time: '2025-04-19T15:31:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36666 +- author: Fildrance + changes: + - message: fixed spessman getting stuck after unlocking portal node + type: Fix + id: 8266 + time: '2025-04-19T17:07:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36719 From 51e2607a125e01c1ac98bc37a2677f90c2a75172 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sat, 19 Apr 2025 19:11:08 +0200 Subject: [PATCH 395/622] cleanup RingerSystem (#36731) cleanup ringersystem --- Content.Client/PDA/Ringer/RingerSystem.cs | 20 -------------------- Content.Shared/PDA/SharedRingerSystem.cs | 12 +++++++----- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/Content.Client/PDA/Ringer/RingerSystem.cs b/Content.Client/PDA/Ringer/RingerSystem.cs index 6d45a8ce8b..6e2bb043ca 100644 --- a/Content.Client/PDA/Ringer/RingerSystem.cs +++ b/Content.Client/PDA/Ringer/RingerSystem.cs @@ -33,24 +33,4 @@ public sealed class RingerSystem : SharedRingerSystem bui.Update(); } } - - /// <inheritdoc/> - public override bool TryToggleUplink(EntityUid uid, Note[] ringtone, EntityUid? user = null) - { - if (!TryComp<RingerUplinkComponent>(uid, out var uplink)) - return false; - - if (!HasComp<StoreComponent>(uid)) - return false; - - // Special case for client-side prediction: - // Since we can't expose the uplink code to clients for security reasons, - // we assume if an antagonist is trying to set a ringtone, it's to unlock the uplink. - // The server will properly verify the code and correct if needed. - if (IsAntagonist(user)) - return ToggleUplinkInternal((uid, uplink)); - - // Non-antagonists never get to toggle the uplink on the client - return false; - } } diff --git a/Content.Shared/PDA/SharedRingerSystem.cs b/Content.Shared/PDA/SharedRingerSystem.cs index 278ab94307..0fa5a570aa 100644 --- a/Content.Shared/PDA/SharedRingerSystem.cs +++ b/Content.Shared/PDA/SharedRingerSystem.cs @@ -145,16 +145,18 @@ public abstract class SharedRingerSystem : EntitySystem /// <summary> /// Attempts to unlock or lock the uplink by checking the provided ringtone against the uplink code. - /// On the client side, for antagonists, the code check is skipped to support prediction. - /// On the server side, the code is always verified. + /// On the client side, it does nothing since the client cannot know the code in advance. + /// On the server side, the code is verified. /// </summary> /// <param name="uid">The entity with the RingerUplinkComponent.</param> /// <param name="ringtone">The ringtone to check against the uplink code.</param> - /// <param name="user">The entity attempting to toggle the uplink. If the user is an antagonist, - /// the ringtone code check will be skipped on the client to allow prediction.</param> + /// <param name="user">The entity attempting to toggle the uplink.</param> /// <returns>True if the uplink state was toggled, false otherwise.</returns> [PublicAPI] - public abstract bool TryToggleUplink(EntityUid uid, Note[] ringtone, EntityUid? user = null); + public virtual bool TryToggleUplink(EntityUid uid, Note[] ringtone, EntityUid? user = null) + { + return false; + } #endregion From efafd4f98de4bfe70d41505099d3fd80abdccee9 Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 19:11:17 +0200 Subject: [PATCH 396/622] init --- Resources/Maps/marathon.yml | 1275 +++++++++++++++++++++++------------ 1 file changed, 847 insertions(+), 428 deletions(-) diff --git a/Resources/Maps/marathon.yml b/Resources/Maps/marathon.yml index e30090a807..87c9c7cb2f 100644 --- a/Resources/Maps/marathon.yml +++ b/Resources/Maps/marathon.yml @@ -1,10 +1,10 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/15/2025 13:49:33 + time: 04/19/2025 17:06:58 entityCount: 23203 maps: - 5350 @@ -10234,7 +10234,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6606: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 17373 components: - type: Transform @@ -10255,7 +10256,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8595: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalEngineeringLocked entities: - uid: 1695 @@ -10268,7 +10270,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1826: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1826 components: - type: Transform @@ -10279,7 +10282,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1695: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9501 components: - type: Transform @@ -10291,7 +10295,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10789: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9879 components: - type: Transform @@ -10303,7 +10308,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11117: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10789 components: - type: Transform @@ -10315,7 +10321,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9501: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11117 components: - type: Transform @@ -10327,7 +10334,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9879: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 838 @@ -10385,7 +10393,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9254: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22374 components: - type: Transform @@ -10396,9 +10405,11 @@ entities: - type: DeviceLinkSource linkedPorts: 22375: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 22376: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22375 components: - type: Transform @@ -10409,7 +10420,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22374: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22376 components: - type: Transform @@ -10420,7 +10432,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22374: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassCargoLocked entities: - uid: 11658 @@ -10431,7 +10444,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11800: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11710 components: - type: Transform @@ -10445,7 +10459,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11658: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 12083 components: - type: Transform @@ -10464,7 +10479,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10559: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 10559 components: - type: Transform @@ -10476,7 +10492,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9342: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt lastSignals: DoorStatus: True - uid: 20059 @@ -10487,7 +10504,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20060: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20060 components: - type: Transform @@ -10496,7 +10514,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20059: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 386 @@ -10509,7 +10528,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17342: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5391 components: - type: Transform @@ -10518,7 +10538,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5390: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9654 components: - type: Transform @@ -10530,9 +10551,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9655: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 9675: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9655 components: - type: Transform @@ -10544,9 +10567,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9654: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 9675: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9675 components: - type: Transform @@ -10558,9 +10583,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9654: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 9655: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15334 components: - type: Transform @@ -10569,7 +10596,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15335: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15335 components: - type: Transform @@ -10578,7 +10606,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15334: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17342 components: - type: Transform @@ -10589,7 +10618,8 @@ entities: - type: DeviceLinkSource linkedPorts: 386: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 18018 components: - type: Transform @@ -10598,7 +10628,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21047: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21047 components: - type: Transform @@ -10607,7 +10638,8 @@ entities: - type: DeviceLinkSource linkedPorts: 18018: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21116 components: - type: Transform @@ -10616,7 +10648,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21117: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21117 components: - type: Transform @@ -10625,7 +10658,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21116: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 1299 @@ -10717,7 +10751,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1696: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5390 components: - type: Transform @@ -10726,7 +10761,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5391: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15829 components: - type: Transform @@ -10737,7 +10773,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15830: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15830 components: - type: Transform @@ -10748,7 +10785,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15829: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 16278 components: - type: Transform @@ -10757,7 +10795,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16279: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 16279 components: - type: Transform @@ -10766,7 +10805,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16278: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalShuttleLocked entities: - uid: 6606 @@ -10778,7 +10818,8 @@ entities: - type: DeviceLinkSource linkedPorts: 841: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockFreezerKitchenHydroLocked @@ -10850,7 +10891,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2312: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1006 components: - type: Transform @@ -10936,7 +10978,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1829: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2123 components: - type: Transform @@ -11558,7 +11601,7 @@ entities: pos: 34.5,45.5 parent: 30 - type: Door - secondsUntilStateChange: -10031.035 + secondsUntilStateChange: -10106.782 state: Opening - type: DeviceLinkSource lastSignals: @@ -11975,7 +12018,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5070: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1756 components: - type: Transform @@ -12070,7 +12114,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1827: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2312 components: - type: Transform @@ -12081,7 +12126,8 @@ entities: - type: DeviceLinkSource linkedPorts: 840: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13548 components: - type: Transform @@ -15741,9 +15787,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1761: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 1982 components: - type: Transform @@ -15753,9 +15802,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1759: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 1993 components: - type: Transform @@ -15765,9 +15817,12 @@ entities: - type: DeviceLinkSource linkedPorts: 1760: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - proto: Brutepack entities: - uid: 7890 @@ -50217,12 +50272,6 @@ entities: rot: -1.5707963267948966 rad pos: 23.5,11.5 parent: 30 - - uid: 21727 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 23.5,12.5 - parent: 30 - uid: 21734 components: - type: Transform @@ -54321,7 +54370,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22233: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 11291 @@ -54408,7 +54458,7 @@ entities: components: - type: Transform rot: -1.5707963267948966 rad - pos: 23.5,13.5 + pos: 23.5,12.5 parent: 30 - proto: ComputerCargoOrdersSecurity entities: @@ -103896,21 +103946,29 @@ entities: - type: DeviceLinkSource linkedPorts: 1943: - - Pressed: Close + - - Pressed + - Close 1986: - - Pressed: Close + - - Pressed + - Close 4788: - - Pressed: Close + - - Pressed + - Close 2407: - - Pressed: Close + - - Pressed + - Close 2006: - - Pressed: Close + - - Pressed + - Close 2216: - - Pressed: Close + - - Pressed + - Close 1753: - - Pressed: Close + - - Pressed + - Close 3180: - - Pressed: Close + - - Pressed + - Close - uid: 2578 components: - type: MetaData @@ -103922,29 +103980,45 @@ entities: - type: DeviceLinkSource linkedPorts: 1986: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 1943: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 4788: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 2407: - - Pressed: AutoClose - - Pressed: Open + - - Pressed + - AutoClose + - - Pressed + - Open 3180: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 1753: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 2216: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 2006: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose - proto: LockerAtmosphericsFilled entities: - uid: 9079 @@ -105223,6 +105297,13 @@ entities: rot: -1.5707963267948966 rad pos: -22.5,-44.5 parent: 30 +- proto: MachineMaterialSilo + entities: + - uid: 21727 + components: + - type: Transform + pos: 23.5,13.5 + parent: 30 - proto: MagazinePistolSubMachineGun entities: - uid: 19841 @@ -118600,17 +118681,23 @@ entities: - type: DeviceLinkSource linkedPorts: 390: - - Pressed: Toggle + - - Pressed + - Toggle 392: - - Pressed: Toggle + - - Pressed + - Toggle 391: - - Pressed: Toggle + - - Pressed + - Toggle 394: - - Pressed: Toggle + - - Pressed + - Toggle 393: - - Pressed: Toggle + - - Pressed + - Toggle 395: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 544 components: - type: Transform @@ -118619,9 +118706,11 @@ entities: - type: DeviceLinkSource linkedPorts: 542: - - Pressed: Toggle + - - Pressed + - Toggle 543: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 723 components: - type: Transform @@ -118635,7 +118724,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9068: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9038 components: - type: Transform @@ -118644,7 +118734,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9068: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11008 components: - type: Transform @@ -118653,13 +118744,17 @@ entities: - type: DeviceLinkSource linkedPorts: 11006: - - Pressed: Toggle + - - Pressed + - Toggle 11002: - - Pressed: Toggle + - - Pressed + - Toggle 11010: - - Pressed: Toggle + - - Pressed + - Toggle 21333: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11761 components: - type: Transform @@ -118668,7 +118763,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11659: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11933 components: - type: Transform @@ -118677,7 +118773,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11682: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 12029 components: - type: Transform @@ -118686,11 +118783,14 @@ entities: - type: DeviceLinkSource linkedPorts: 11822: - - Pressed: Toggle + - - Pressed + - Toggle 11823: - - Pressed: Toggle + - - Pressed + - Toggle 11716: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 12915 components: - type: Transform @@ -118699,9 +118799,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16773: - - Pressed: Toggle + - - Pressed + - Toggle 13347: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13741 components: - type: Transform @@ -118710,25 +118812,35 @@ entities: - type: DeviceLinkSource linkedPorts: 13737: - - Pressed: Toggle + - - Pressed + - Toggle 13736: - - Pressed: Toggle + - - Pressed + - Toggle 13735: - - Pressed: Toggle + - - Pressed + - Toggle 13734: - - Pressed: Toggle + - - Pressed + - Toggle 13733: - - Pressed: Toggle + - - Pressed + - Toggle 13729: - - Pressed: Toggle + - - Pressed + - Toggle 13728: - - Pressed: Toggle + - - Pressed + - Toggle 13730: - - Pressed: Toggle + - - Pressed + - Toggle 13731: - - Pressed: Toggle + - - Pressed + - Toggle 13732: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13742 components: - type: Transform @@ -118737,25 +118849,35 @@ entities: - type: DeviceLinkSource linkedPorts: 13733: - - Pressed: Toggle + - - Pressed + - Toggle 13732: - - Pressed: Toggle + - - Pressed + - Toggle 13731: - - Pressed: Toggle + - - Pressed + - Toggle 13730: - - Pressed: Toggle + - - Pressed + - Toggle 13734: - - Pressed: Toggle + - - Pressed + - Toggle 13735: - - Pressed: Toggle + - - Pressed + - Toggle 13736: - - Pressed: Toggle + - - Pressed + - Toggle 13737: - - Pressed: Toggle + - - Pressed + - Toggle 13728: - - Pressed: Toggle + - - Pressed + - Toggle 13729: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20392 components: - type: Transform @@ -118764,9 +118886,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5738: - - Pressed: Toggle + - - Pressed + - Toggle 5741: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20393 components: - type: Transform @@ -118775,9 +118899,11 @@ entities: - type: DeviceLinkSource linkedPorts: 20395: - - Pressed: Toggle + - - Pressed + - Toggle 20394: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20446 components: - type: Transform @@ -118786,19 +118912,26 @@ entities: - type: DeviceLinkSource linkedPorts: 12625: - - Pressed: Toggle + - - Pressed + - Toggle 9238: - - Pressed: Toggle + - - Pressed + - Toggle 9239: - - Pressed: Toggle + - - Pressed + - Toggle 20445: - - Pressed: Toggle + - - Pressed + - Toggle 20449: - - Pressed: Toggle + - - Pressed + - Toggle 20448: - - Pressed: Toggle + - - Pressed + - Toggle 20447: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 21721 components: - type: Transform @@ -118807,9 +118940,11 @@ entities: - type: DeviceLinkSource linkedPorts: 22424: - - Pressed: Toggle + - - Pressed + - Toggle 21722: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 295 @@ -118821,9 +118956,11 @@ entities: - type: DeviceLinkSource linkedPorts: 7417: - - Pressed: Open + - - Pressed + - Open 7402: - - Pressed: Open + - - Pressed + - Open - uid: 1919 components: - type: Transform @@ -118833,9 +118970,11 @@ entities: - type: DeviceLinkSource linkedPorts: 999: - - Pressed: Open + - - Pressed + - Open 988: - - Pressed: Open + - - Pressed + - Open - uid: 3189 components: - type: MetaData @@ -118847,7 +118986,8 @@ entities: - type: DeviceLinkSource linkedPorts: 864: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3204 components: - type: Transform @@ -118856,17 +118996,23 @@ entities: - type: DeviceLinkSource linkedPorts: 7972: - - Pressed: Toggle + - - Pressed + - Toggle 7991: - - Pressed: Toggle + - - Pressed + - Toggle 7971: - - Pressed: Toggle + - - Pressed + - Toggle 6785: - - Pressed: Toggle + - - Pressed + - Toggle 6797: - - Pressed: Toggle + - - Pressed + - Toggle 7992: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3708 components: - type: Transform @@ -118875,7 +119021,8 @@ entities: - type: DeviceLinkSource linkedPorts: 341: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4731 components: - type: Transform @@ -118885,15 +119032,20 @@ entities: - type: DeviceLinkSource linkedPorts: 15174: - - Pressed: Toggle + - - Pressed + - Toggle 6299: - - Pressed: Toggle + - - Pressed + - Toggle 5822: - - Pressed: Toggle + - - Pressed + - Toggle 5079: - - Pressed: Toggle + - - Pressed + - Toggle 5078: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6868 components: - type: Transform @@ -118903,9 +119055,11 @@ entities: - type: DeviceLinkSource linkedPorts: 7164: - - Pressed: Toggle + - - Pressed + - Toggle 7829: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6869 components: - type: Transform @@ -118915,9 +119069,11 @@ entities: - type: DeviceLinkSource linkedPorts: 7876: - - Pressed: Toggle + - - Pressed + - Toggle 6871: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6992 components: - type: MetaData @@ -118928,7 +119084,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6991: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7440 components: - type: MetaData @@ -118942,7 +119099,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7609: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7673 components: - type: Transform @@ -118952,17 +119110,23 @@ entities: - type: DeviceLinkSource linkedPorts: 14355: - - Pressed: Toggle + - - Pressed + - Toggle 14340: - - Pressed: Toggle + - - Pressed + - Toggle 14352: - - Pressed: Toggle + - - Pressed + - Toggle 12810: - - Pressed: Toggle + - - Pressed + - Toggle 4438: - - Pressed: Toggle + - - Pressed + - Toggle 899: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 7920 components: - type: Transform @@ -118972,9 +119136,11 @@ entities: - type: DeviceLinkSource linkedPorts: 7563: - - Pressed: Toggle + - - Pressed + - Toggle 7562: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8607 components: - type: Transform @@ -118984,7 +119150,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6882: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8610 components: - type: Transform @@ -118994,9 +119161,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12099: - - Pressed: Toggle + - - Pressed + - Toggle 11923: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8863 components: - type: Transform @@ -119006,9 +119175,11 @@ entities: - type: DeviceLinkSource linkedPorts: 12059: - - Pressed: Toggle + - - Pressed + - Toggle 11995: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9184 components: - type: Transform @@ -119017,11 +119188,14 @@ entities: - type: DeviceLinkSource linkedPorts: 9190: - - Pressed: Toggle + - - Pressed + - Toggle 9189: - - Pressed: Toggle + - - Pressed + - Toggle 9188: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 12859 components: - type: MetaData @@ -119032,7 +119206,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14249: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 16041 components: - type: Transform @@ -119042,7 +119217,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6413: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16042 components: - type: Transform @@ -119052,7 +119228,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6414: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16116 components: - type: Transform @@ -119062,7 +119239,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6415: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: SignalSwitch entities: - uid: 11021 @@ -119074,14 +119252,20 @@ entities: - type: DeviceLinkSource linkedPorts: 9533: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11028: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11015: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 23173 components: - type: MetaData @@ -119093,32 +119277,50 @@ entities: - type: DeviceLinkSource linkedPorts: 3181: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3182: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3183: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3184: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3185: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3176: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3177: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5698: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5700: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - proto: SignalSwitchDirectional entities: - uid: 1845 @@ -119134,35 +119336,55 @@ entities: - type: DeviceLinkSource linkedPorts: 20391: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20401: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20402: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 18840: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20360: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20389: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2584: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8060: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9292: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2189: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 3131 components: - type: Transform @@ -119172,17 +119394,25 @@ entities: - type: DeviceLinkSource linkedPorts: 9415: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9408: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9410: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9411: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 5063 components: - type: Transform @@ -119192,8 +119422,10 @@ entities: - type: DeviceLinkSource linkedPorts: 3512: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9164 components: - type: Transform @@ -119203,14 +119435,20 @@ entities: - type: DeviceLinkSource linkedPorts: 9678: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9065: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9064: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9214 components: - type: Transform @@ -119220,14 +119458,20 @@ entities: - type: DeviceLinkSource linkedPorts: 9690: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9302: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9691: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 12697 components: - type: Transform @@ -119237,11 +119481,15 @@ entities: - type: DeviceLinkSource linkedPorts: 15213: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 15987: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 14525 components: - type: Transform @@ -119251,11 +119499,15 @@ entities: - type: DeviceLinkSource linkedPorts: 15986: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 14844: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 15975 components: - type: Transform @@ -119265,11 +119517,15 @@ entities: - type: DeviceLinkSource linkedPorts: 14530: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 15075: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 20068 components: - type: Transform @@ -119279,38 +119535,60 @@ entities: - type: DeviceLinkSource linkedPorts: 20061: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20063: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20062: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20064: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20051: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20053: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20052: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19418: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19419: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 20054: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19795: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 21706 components: - type: Transform @@ -119319,14 +119597,20 @@ entities: - type: DeviceLinkSource linkedPorts: 20065: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21758: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20066: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 22211 components: - type: Transform @@ -119336,14 +119620,20 @@ entities: - type: DeviceLinkSource linkedPorts: 22194: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22101: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20075: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - proto: SignArmory entities: - uid: 1927 @@ -128683,17 +128973,26 @@ entities: - type: DeviceLinkSource linkedPorts: 16230: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 16229: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 16228: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close - uid: 11677 components: - type: Transform @@ -128702,33 +129001,54 @@ entities: - type: DeviceLinkSource linkedPorts: 11639: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12096: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6726: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12031: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16126: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11932: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12231: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11717 components: - type: Transform @@ -128737,61 +129057,103 @@ entities: - type: DeviceLinkSource linkedPorts: 8500: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 8466: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 8503: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 11691: - - Middle: Off - - Right: Reverse - - Left: Forward + - - Middle + - Off + - - Right + - Reverse + - - Left + - Forward 21238: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 20281: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22308: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22309: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22310: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22311: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22312: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22313: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22314: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22316: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 11866 components: - type: Transform @@ -128800,25 +129162,40 @@ entities: - type: DeviceLinkSource linkedPorts: 11702: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11979: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11755: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11865: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12014: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 12013 components: - type: Transform @@ -128827,21 +129204,33 @@ entities: - type: DeviceLinkSource linkedPorts: 11780: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12047: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11926: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11978: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 18373 components: - type: Transform @@ -128850,41 +129239,68 @@ entities: - type: DeviceLinkSource linkedPorts: 12943: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12944: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12961: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12973: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18374: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 12974: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 12983: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13034: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 13048: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 21584 components: - type: Transform @@ -128893,9 +129309,12 @@ entities: - type: DeviceLinkSource linkedPorts: 21582: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 7826 From de8deaf6add546f98d7eddfbea26844fb79fbcfe Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 19:18:22 +0200 Subject: [PATCH 397/622] init --- Resources/Maps/loop.yml | 671 ++++++++++++++++++++++++++-------------- 1 file changed, 447 insertions(+), 224 deletions(-) diff --git a/Resources/Maps/loop.yml b/Resources/Maps/loop.yml index a1f65f2521..eb19835678 100644 --- a/Resources/Maps/loop.yml +++ b/Resources/Maps/loop.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/17/2025 05:34:31 - entityCount: 17813 + time: 04/19/2025 17:17:37 + entityCount: 17814 maps: - 1 grids: @@ -7277,7 +7277,7 @@ entities: pos: -30.5,13.5 parent: 2 - type: Door - secondsUntilStateChange: -52533.863 + secondsUntilStateChange: -52590.652 state: Opening - type: DeviceLinkSource lastSignals: @@ -7436,7 +7436,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1200: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1200 components: - type: Transform @@ -7447,7 +7448,8 @@ entities: - type: DeviceLinkSource linkedPorts: 215: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2280 components: - type: Transform @@ -7458,7 +7460,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5219: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5219 components: - type: Transform @@ -7469,7 +7472,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2280: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalEngineeringLocked entities: - uid: 3669 @@ -7483,7 +7487,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3670: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3670 components: - type: Transform @@ -7495,7 +7500,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3669: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4325 components: - type: Transform @@ -7507,9 +7513,11 @@ entities: - type: DeviceLinkSource linkedPorts: 354: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 15451: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15451 components: - type: Transform @@ -7521,9 +7529,11 @@ entities: - type: DeviceLinkSource linkedPorts: 354: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 4325: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 77 @@ -7585,7 +7595,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1952: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 16431 components: - type: Transform @@ -7610,9 +7621,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4325: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 15451: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2714 components: - type: Transform @@ -7624,7 +7637,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7337: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3822 components: - type: Transform @@ -7635,7 +7649,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3823: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3823 components: - type: Transform @@ -7646,7 +7661,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3822: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7337 components: - type: Transform @@ -7658,7 +7674,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2714: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7452 components: - type: Transform @@ -7670,7 +7687,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17580: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8100 components: - type: Transform @@ -7681,7 +7699,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17561: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13402 components: - type: Transform @@ -7692,7 +7711,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13404: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13404 components: - type: Transform @@ -7703,7 +7723,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13402: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14633 components: - type: Transform @@ -7714,7 +7735,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14634: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14634 components: - type: Transform @@ -7725,7 +7747,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14633: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17561 components: - type: Transform @@ -7736,7 +7759,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8100: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17580 components: - type: Transform @@ -7748,7 +7772,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7452: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 1952 @@ -7761,7 +7786,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1953: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2673 components: - type: Transform @@ -7772,7 +7798,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14035: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14035 components: - type: Transform @@ -7783,7 +7810,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2673: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15778 components: - type: Transform @@ -43892,7 +43920,7 @@ entities: pos: -9.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300289.4 + secondsUntilStateChange: -300346.2 state: Opening - uid: 6747 components: @@ -43900,7 +43928,7 @@ entities: pos: -8.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300290.12 + secondsUntilStateChange: -300346.9 state: Opening - uid: 6749 components: @@ -43908,7 +43936,7 @@ entities: pos: -6.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300288.7 + secondsUntilStateChange: -300345.47 state: Opening - uid: 6750 components: @@ -43916,7 +43944,7 @@ entities: pos: -5.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300288.06 + secondsUntilStateChange: -300344.84 state: Opening - uid: 9721 components: @@ -76666,11 +76694,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4526: - - Pressed: Toggle + - - Pressed + - Toggle 3578: - - Pressed: Toggle + - - Pressed + - Toggle 6171: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonBar entities: - uid: 16964 @@ -76684,23 +76715,32 @@ entities: - type: DeviceLinkSource linkedPorts: 16956: - - Pressed: Toggle + - - Pressed + - Toggle 16955: - - Pressed: Toggle + - - Pressed + - Toggle 16957: - - Pressed: Toggle + - - Pressed + - Toggle 16958: - - Pressed: Toggle + - - Pressed + - Toggle 16959: - - Pressed: Toggle + - - Pressed + - Toggle 16960: - - Pressed: Toggle + - - Pressed + - Toggle 16961: - - Pressed: Toggle + - - Pressed + - Toggle 16962: - - Pressed: Toggle + - - Pressed + - Toggle 16963: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonBrig entities: - uid: 15056 @@ -76714,21 +76754,29 @@ entities: - type: DeviceLinkSource linkedPorts: 15055: - - Pressed: Toggle + - - Pressed + - Toggle 15053: - - Pressed: Toggle + - - Pressed + - Toggle 15051: - - Pressed: Toggle + - - Pressed + - Toggle 15040: - - Pressed: Toggle + - - Pressed + - Toggle 15039: - - Pressed: Toggle + - - Pressed + - Toggle 14916: - - Pressed: Toggle + - - Pressed + - Toggle 14897: - - Pressed: Toggle + - - Pressed + - Toggle 10603: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCargo entities: - uid: 6009 @@ -76740,9 +76788,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15844: - - Pressed: Toggle + - - Pressed + - Toggle 16418: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCommand entities: - uid: 17596 @@ -76756,29 +76806,41 @@ entities: - type: DeviceLinkSource linkedPorts: 17595: - - Pressed: Toggle + - - Pressed + - Toggle 17594: - - Pressed: Toggle + - - Pressed + - Toggle 17593: - - Pressed: Toggle + - - Pressed + - Toggle 17592: - - Pressed: Toggle + - - Pressed + - Toggle 17591: - - Pressed: Toggle + - - Pressed + - Toggle 17590: - - Pressed: Toggle + - - Pressed + - Toggle 17589: - - Pressed: Toggle + - - Pressed + - Toggle 17588: - - Pressed: Toggle + - - Pressed + - Toggle 17587: - - Pressed: Toggle + - - Pressed + - Toggle 17586: - - Pressed: Toggle + - - Pressed + - Toggle 17585: - - Pressed: Toggle + - - Pressed + - Toggle 17584: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonEngineering entities: - uid: 603 @@ -76789,13 +76851,17 @@ entities: - type: DeviceLinkSource linkedPorts: 3617: - - Pressed: Toggle + - - Pressed + - Toggle 4912: - - Pressed: Toggle + - - Pressed + - Toggle 254: - - Pressed: Toggle + - - Pressed + - Toggle 3618: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 604 components: - type: Transform @@ -76805,13 +76871,17 @@ entities: - type: DeviceLinkSource linkedPorts: 3617: - - Pressed: Toggle + - - Pressed + - Toggle 4912: - - Pressed: Toggle + - - Pressed + - Toggle 3618: - - Pressed: Toggle + - - Pressed + - Toggle 254: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4539 components: - type: Transform @@ -76821,11 +76891,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4523: - - Pressed: Toggle + - - Pressed + - Toggle 4524: - - Pressed: Toggle + - - Pressed + - Toggle 4525: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonKitchen entities: - uid: 1783 @@ -76838,15 +76911,20 @@ entities: - type: DeviceLinkSource linkedPorts: 3873: - - Pressed: Toggle + - - Pressed + - Toggle 3872: - - Pressed: Toggle + - - Pressed + - Toggle 3874: - - Pressed: Toggle + - - Pressed + - Toggle 14273: - - Pressed: Toggle + - - Pressed + - Toggle 14274: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 15502 @@ -76858,9 +76936,11 @@ entities: - type: DeviceLinkSource linkedPorts: 13976: - - Pressed: Open + - - Pressed + - Open 13975: - - Pressed: Open + - - Pressed + - Open - proto: LockableButtonResearch entities: - uid: 4540 @@ -76871,11 +76951,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4522: - - Pressed: Toggle + - - Pressed + - Toggle 4521: - - Pressed: Toggle + - - Pressed + - Toggle 4520: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4541 components: - type: Transform @@ -76885,11 +76968,14 @@ entities: - type: DeviceLinkSource linkedPorts: 4519: - - Pressed: Toggle + - - Pressed + - Toggle 4518: - - Pressed: Toggle + - - Pressed + - Toggle 1862: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonSecurity entities: - uid: 14322 @@ -76903,11 +76989,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7442: - - Pressed: Toggle + - - Pressed + - Toggle 8021: - - Pressed: Toggle + - - Pressed + - Toggle 8353: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15310 components: - type: MetaData @@ -76918,11 +77007,14 @@ entities: - type: DeviceLinkSource linkedPorts: 7442: - - Pressed: Toggle + - - Pressed + - Toggle 8021: - - Pressed: Toggle + - - Pressed + - Toggle 8353: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15350 components: - type: MetaData @@ -76933,13 +77025,17 @@ entities: - type: DeviceLinkSource linkedPorts: 8356: - - Pressed: Toggle + - - Pressed + - Toggle 8357: - - Pressed: Toggle + - - Pressed + - Toggle 10340: - - Pressed: Toggle + - - Pressed + - Toggle 14321: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilled entities: - uid: 6057 @@ -77563,6 +77659,13 @@ entities: rot: -1.5707963267948966 rad pos: -63.5,-3.5 parent: 2 +- proto: MachineMaterialSilo + entities: + - uid: 17814 + components: + - type: Transform + pos: 19.5,38.5 + parent: 2 - proto: MagazinePistolSubMachineGunPractice entities: - uid: 17217 @@ -88944,15 +89047,20 @@ entities: - type: DeviceLinkSource linkedPorts: 3090: - - Pressed: Toggle + - - Pressed + - Toggle 3089: - - Pressed: Toggle + - - Pressed + - Toggle 3088: - - Pressed: Toggle + - - Pressed + - Toggle 3087: - - Pressed: Toggle + - - Pressed + - Toggle 3203: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 14058 @@ -88966,7 +89074,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13874: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 14059 components: - type: Transform @@ -88976,7 +89085,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13875: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 14060 components: - type: Transform @@ -88986,7 +89096,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13876: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 14061 components: - type: Transform @@ -88996,7 +89107,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13873: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: SignAnomaly entities: - uid: 1790 @@ -97840,37 +97952,61 @@ entities: - type: DeviceLinkSource linkedPorts: 5737: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6389: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5833: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2818: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6021: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6022: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 1794: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6451: - - Right: Forward - - Left: Reverse - - Middle: Off + - - Right + - Forward + - - Left + - Reverse + - - Middle + - Off - uid: 9691 components: - type: Transform @@ -97879,25 +98015,40 @@ entities: - type: DeviceLinkSource linkedPorts: 6023: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3025: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3026: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 1491: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6871: - - Right: Forward - - Left: Reverse - - Middle: Off + - - Right + - Forward + - - Left + - Reverse + - - Middle + - Off - uid: 9808 components: - type: Transform @@ -97906,69 +98057,117 @@ entities: - type: DeviceLinkSource linkedPorts: 16428: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16427: - - Right: Reverse - - Left: Forward - - Middle: Off + - - Right + - Reverse + - - Left + - Forward + - - Middle + - Off 16426: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16425: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16424: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16423: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 15000: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14997: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2839: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3027: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6449: - - Right: Reverse - - Left: Forward - - Middle: Off + - - Right + - Reverse + - - Left + - Forward + - - Middle + - Off 2820: - - Right: Reverse - - Left: Forward - - Middle: Off + - - Right + - Reverse + - - Left + - Forward + - - Middle + - Off 5723: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2841: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2979: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6391: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 10371 components: - type: Transform @@ -97977,37 +98176,61 @@ entities: - type: DeviceLinkSource linkedPorts: 3117: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 432: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10643: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10370: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 8087: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10482: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11635: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 464: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 17347 From e168f2007b70a8a7e55f652ed3b6b733f36394e9 Mon Sep 17 00:00:00 2001 From: ScarKy0 <scarky0@onet.eu> Date: Sat, 19 Apr 2025 19:28:25 +0200 Subject: [PATCH 398/622] init --- Resources/Maps/convex.yml | 1381 ++++++++++++++++++++++++------------- 1 file changed, 902 insertions(+), 479 deletions(-) diff --git a/Resources/Maps/convex.yml b/Resources/Maps/convex.yml index 8abcde39a8..5c67cffad8 100644 --- a/Resources/Maps/convex.yml +++ b/Resources/Maps/convex.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/15/2025 00:13:23 - entityCount: 37740 + time: 04/19/2025 17:25:37 + entityCount: 37741 maps: - 353 grids: @@ -14314,7 +14314,7 @@ entities: 1: 2036 16,31: 0: 7 - 5: 60928 + 2: 60928 13,33: 1: 30583 13,34: @@ -14331,32 +14331,32 @@ entities: 1: 61437 15,34: 0: 4371 - 2: 52224 - 3: 8 + 3: 52224 + 4: 8 15,35: 0: 8977 - 2: 12 - 3: 34816 + 3: 12 + 4: 34816 15,33: 0: 8742 - 3: 34816 + 4: 34816 15,36: 0: 17954 - 3: 8 + 4: 8 16,32: - 4: 30464 - 5: 14 + 5: 30464 + 2: 14 16,33: - 4: 7 - 3: 13056 + 5: 7 + 4: 13056 0: 34816 16,34: - 3: 3 - 2: 4352 + 4: 3 + 3: 4352 0: 52360 16,35: - 2: 1 - 3: 13056 + 3: 1 + 4: 13056 0: 34956 13,36: 1: 32624 @@ -14375,13 +14375,13 @@ entities: 1: 8739 0: 2184 16,36: - 3: 30467 + 4: 30467 0: 8 16,37: - 3: 60935 + 4: 60935 16,38: 0: 3840 - 3: 14 + 4: 14 16,39: 1: 47295 17,2: @@ -14658,9 +14658,9 @@ entities: 1: 13107 0: 34944 20,32: - 3: 65504 + 4: 65504 20,33: - 3: 239 + 4: 239 1: 61440 20,34: 1: 65535 @@ -14975,7 +14975,7 @@ entities: 1: 49073 21,32: 1: 34952 - 3: 4352 + 4: 4352 0: 8736 22,32: 1: 48059 @@ -14996,7 +14996,7 @@ entities: 24,31: 1: 53503 21,33: - 3: 1 + 4: 1 1: 64136 0: 34 21,34: @@ -15332,59 +15332,59 @@ entities: 24,35: 1: 1638 25,32: - 3: 4592 + 4: 4592 0: 58880 25,33: - 3: 4369 + 4: 4369 0: 25828 25,34: - 3: 6007 + 4: 6007 0: 24576 25,35: - 3: 4369 + 4: 4369 0: 58596 25,36: - 3: 241 + 4: 241 0: 6 1: 28672 26,32: - 3: 35056 + 4: 35056 0: 29952 26,33: 0: 4593 26,35: 0: 29169 - 3: 32768 + 4: 32768 26,34: 0: 4465 - 3: 2184 + 4: 2184 26,36: 0: 5 - 3: 248 + 4: 248 1: 61440 27,32: - 3: 13296 + 4: 13296 0: 50176 27,33: 0: 4592 27,34: - 3: 819 + 4: 819 0: 4288 27,35: 0: 49393 - 3: 12288 + 4: 12288 27,36: - 3: 243 + 4: 243 0: 4 1: 61440 28,32: - 3: 240 + 4: 240 0: 64768 28,33: 0: 54773 28,34: 0: 53521 - 3: 3276 + 4: 3276 28,35: 0: 62965 24,37: @@ -15402,7 +15402,7 @@ entities: 27,38: 1: 65423 28,36: - 3: 240 + 4: 240 1: 56320 0: 13 28,37: @@ -15653,7 +15653,7 @@ entities: 1: 28927 29,32: 1: 1092 - 3: 4368 + 4: 4368 30,29: 1: 65527 30,30: @@ -15679,16 +15679,16 @@ entities: 32,31: 1: 49075 29,33: - 3: 4369 + 4: 4369 1: 52428 29,34: - 3: 4369 + 4: 4369 1: 52428 29,35: - 3: 4369 + 4: 4369 1: 3276 29,36: - 3: 17 + 4: 17 1: 25668 30,34: 1: 61423 @@ -16166,6 +16166,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 6666.982 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -16211,21 +16226,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 6666.982 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 temperature: 235 moles: @@ -20634,7 +20634,8 @@ entities: - type: DeviceLinkSource linkedPorts: 192: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 192 components: - type: Transform @@ -20645,7 +20646,8 @@ entities: - type: DeviceLinkSource linkedPorts: 179: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalEngineeringLocked entities: - uid: 15025 @@ -20658,7 +20660,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15394: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 15026 components: - type: Transform @@ -20669,7 +20672,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15394: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 15027 components: - type: Transform @@ -20680,7 +20684,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15393: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 15028 components: - type: Transform @@ -20691,7 +20696,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15393: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 27046 components: - type: Transform @@ -20703,7 +20709,8 @@ entities: - type: DeviceLinkSource linkedPorts: 27316: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 27316 components: - type: Transform @@ -20715,7 +20722,8 @@ entities: - type: DeviceLinkSource linkedPorts: 27046: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 31149 components: - type: Transform @@ -20726,7 +20734,8 @@ entities: - type: DeviceLinkSource linkedPorts: 160: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 103 @@ -20831,7 +20840,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19497: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 19305 components: - type: Transform @@ -20852,7 +20862,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19497: - - DoorStatus: InputA + - - DoorStatus + - InputA - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 160 @@ -20865,7 +20876,8 @@ entities: - type: DeviceLinkSource linkedPorts: 31149: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 30873 components: - type: Transform @@ -20877,7 +20889,8 @@ entities: - type: DeviceLinkSource linkedPorts: 30874: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 30874 components: - type: Transform @@ -20889,7 +20902,8 @@ entities: - type: DeviceLinkSource linkedPorts: 30873: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 31756 components: - type: Transform @@ -20901,7 +20915,8 @@ entities: - type: DeviceLinkSource linkedPorts: 31759: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 31759 components: - type: Transform @@ -20913,7 +20928,8 @@ entities: - type: DeviceLinkSource linkedPorts: 31756: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 3 @@ -20926,7 +20942,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 147 components: - type: Transform @@ -20938,7 +20955,8 @@ entities: - type: DeviceLinkSource linkedPorts: 207: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 908 components: - type: Transform @@ -20950,7 +20968,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1075 components: - type: Transform @@ -20962,7 +20981,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5486: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23361 components: - type: Transform @@ -20972,7 +20992,8 @@ entities: - type: DeviceLinkSource linkedPorts: 35643: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 28729 components: - type: Transform @@ -20984,7 +21005,8 @@ entities: - type: DeviceLinkSource linkedPorts: 131: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 29210 components: - type: Transform @@ -20996,7 +21018,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29209: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 30453 components: - type: Transform @@ -21006,7 +21029,8 @@ entities: - type: DeviceLinkSource linkedPorts: 35643: - - DoorStatus: InputB + - - DoorStatus + - InputB - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 1811 @@ -21139,7 +21163,8 @@ entities: - type: DeviceLinkSource linkedPorts: 908: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 131 components: - type: Transform @@ -21151,7 +21176,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28729: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 207 components: - type: Transform @@ -21163,7 +21189,8 @@ entities: - type: DeviceLinkSource linkedPorts: 147: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5486 components: - type: Transform @@ -21175,7 +21202,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1075: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 29209 components: - type: Transform @@ -21187,7 +21215,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29210: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezer entities: - uid: 34516 @@ -23497,7 +23526,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22926 components: - type: MetaData @@ -29539,8 +29569,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22833: - - Start: Close - - Timer: Open + - - Start + - Close + - - Timer + - Open - uid: 22838 components: - type: MetaData @@ -29552,8 +29584,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22834: - - Start: Close - - Timer: Open + - - Start + - Close + - - Timer + - Open - uid: 22839 components: - type: MetaData @@ -29565,8 +29599,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22835: - - Start: Close - - Timer: Open + - - Start + - Close + - - Timer + - Open - uid: 22840 components: - type: MetaData @@ -29578,8 +29614,10 @@ entities: - type: DeviceLinkSource linkedPorts: 22836: - - Start: Close - - Timer: Open + - - Start + - Close + - - Timer + - Open - proto: BrokenBottle entities: - uid: 33540 @@ -104641,7 +104679,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19682: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - uid: 19687 components: - type: Transform @@ -104651,7 +104690,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19683: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 3199 @@ -121856,10 +121896,10 @@ entities: - type: Transform pos: 53.5,55.5 parent: 1 - - uid: 21004 + - uid: 37741 components: - type: Transform - pos: 46.5,91.5 + pos: 49.5,88.5 parent: 1 - proto: FireAlarm entities: @@ -188342,7 +188382,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23360: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 17751 @@ -188355,9 +188396,11 @@ entities: - type: DeviceLinkSource linkedPorts: 17696: - - Pressed: Toggle + - - Pressed + - Toggle 17697: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilled entities: - uid: 15991 @@ -188915,9 +188958,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15025: - - Output: DoorBolt + - - Output + - DoorBolt 15026: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -188933,9 +188978,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15027: - - Output: DoorBolt + - - Output + - DoorBolt 15028: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -188962,9 +189009,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19494: - - Output: DoorBolt + - - Output + - DoorBolt 6971: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -189084,6 +189133,13 @@ entities: - type: Transform pos: 113.5,42.5 parent: 1 +- proto: MachineMaterialSilo + entities: + - uid: 21004 + components: + - type: Transform + pos: 46.5,91.5 + parent: 1 - proto: MagazinePistolSubMachineGunTopMounted entities: - uid: 28294 @@ -191037,7 +191093,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9257: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9257 components: - type: Transform @@ -191048,7 +191105,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3974: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9413 components: - type: Transform @@ -191060,7 +191118,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15703: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15703 components: - type: Transform @@ -191071,7 +191130,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9413: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: PlasticFlapsAirtightClear entities: - uid: 19301 @@ -202980,13 +203040,17 @@ entities: - type: DeviceLinkSource linkedPorts: 15032: - - Pressed: Toggle + - - Pressed + - Toggle 15031: - - Pressed: Toggle + - - Pressed + - Toggle 15030: - - Pressed: Toggle + - - Pressed + - Toggle 15029: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15981 components: - type: MetaData @@ -202998,15 +203062,20 @@ entities: - type: DeviceLinkSource linkedPorts: 4387: - - Pressed: Toggle + - - Pressed + - Toggle 15979: - - Pressed: Toggle + - - Pressed + - Toggle 15978: - - Pressed: Toggle + - - Pressed + - Toggle 15967: - - Pressed: Toggle + - - Pressed + - Toggle 15969: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19536 components: - type: MetaData @@ -203018,13 +203087,17 @@ entities: - type: DeviceLinkSource linkedPorts: 19532: - - Pressed: Toggle + - - Pressed + - Toggle 19533: - - Pressed: Toggle + - - Pressed + - Toggle 19529: - - Pressed: Toggle + - - Pressed + - Toggle 19534: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36775 components: - type: MetaData @@ -203036,17 +203109,23 @@ entities: - type: DeviceLinkSource linkedPorts: 3878: - - Pressed: Toggle + - - Pressed + - Toggle 3642: - - Pressed: Toggle + - - Pressed + - Toggle 15764: - - Pressed: Toggle + - - Pressed + - Toggle 1820: - - Pressed: Toggle + - - Pressed + - Toggle 3358: - - Pressed: Toggle + - - Pressed + - Toggle 30218: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 2684 @@ -203060,9 +203139,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19622: - - Pressed: Toggle + - - Pressed + - Toggle 37576: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 2955 components: - type: MetaData @@ -203082,9 +203163,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4548: - - Pressed: Toggle + - - Pressed + - Toggle 8674: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8668 components: - type: MetaData @@ -203095,11 +203178,14 @@ entities: - type: DeviceLinkSource linkedPorts: 1418: - - Pressed: Toggle + - - Pressed + - Toggle 1509: - - Pressed: Toggle + - - Pressed + - Toggle 1510: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13829 components: - type: MetaData @@ -203111,17 +203197,23 @@ entities: - type: DeviceLinkSource linkedPorts: 2496: - - Pressed: Toggle + - - Pressed + - Toggle 37324: - - Pressed: Toggle + - - Pressed + - Toggle 37328: - - Pressed: Toggle + - - Pressed + - Toggle 37327: - - Pressed: Toggle + - - Pressed + - Toggle 37326: - - Pressed: Toggle + - - Pressed + - Toggle 37325: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 14998 components: - type: MetaData @@ -203133,17 +203225,23 @@ entities: - type: DeviceLinkSource linkedPorts: 14092: - - Pressed: Toggle + - - Pressed + - Toggle 14093: - - Pressed: Toggle + - - Pressed + - Toggle 14094: - - Pressed: Toggle + - - Pressed + - Toggle 14097: - - Pressed: Toggle + - - Pressed + - Toggle 14096: - - Pressed: Toggle + - - Pressed + - Toggle 14095: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15035 components: - type: MetaData @@ -203155,17 +203253,23 @@ entities: - type: DeviceLinkSource linkedPorts: 14055: - - Pressed: Toggle + - - Pressed + - Toggle 14087: - - Pressed: Toggle + - - Pressed + - Toggle 14088: - - Pressed: Toggle + - - Pressed + - Toggle 14089: - - Pressed: Toggle + - - Pressed + - Toggle 14090: - - Pressed: Toggle + - - Pressed + - Toggle 14091: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15037 components: - type: MetaData @@ -203177,11 +203281,14 @@ entities: - type: DeviceLinkSource linkedPorts: 14100: - - Pressed: Toggle + - - Pressed + - Toggle 14099: - - Pressed: Toggle + - - Pressed + - Toggle 14098: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15038 components: - type: MetaData @@ -203193,11 +203300,14 @@ entities: - type: DeviceLinkSource linkedPorts: 14101: - - Pressed: Toggle + - - Pressed + - Toggle 14102: - - Pressed: Toggle + - - Pressed + - Toggle 37310: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 16002 components: - type: MetaData @@ -203209,13 +203319,17 @@ entities: - type: DeviceLinkSource linkedPorts: 9428: - - Pressed: Toggle + - - Pressed + - Toggle 17671: - - Pressed: Toggle + - - Pressed + - Toggle 3205: - - Pressed: Toggle + - - Pressed + - Toggle 846: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19535 components: - type: MetaData @@ -203227,9 +203341,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19530: - - Pressed: Toggle + - - Pressed + - Toggle 19531: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19676 components: - type: MetaData @@ -203240,13 +203356,17 @@ entities: - type: DeviceLinkSource linkedPorts: 19670: - - Pressed: Toggle + - - Pressed + - Toggle 19673: - - Pressed: Toggle + - - Pressed + - Toggle 19671: - - Pressed: Toggle + - - Pressed + - Toggle 19672: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19677 components: - type: MetaData @@ -203258,13 +203378,17 @@ entities: - type: DeviceLinkSource linkedPorts: 19666: - - Pressed: Toggle + - - Pressed + - Toggle 19667: - - Pressed: Toggle + - - Pressed + - Toggle 19668: - - Pressed: Toggle + - - Pressed + - Toggle 19669: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19902 components: - type: MetaData @@ -203276,15 +203400,20 @@ entities: - type: DeviceLinkSource linkedPorts: 37413: - - Pressed: Toggle + - - Pressed + - Toggle 37414: - - Pressed: Toggle + - - Pressed + - Toggle 37415: - - Pressed: Toggle + - - Pressed + - Toggle 37416: - - Pressed: Toggle + - - Pressed + - Toggle 37417: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 20904 components: - type: MetaData @@ -203296,11 +203425,14 @@ entities: - type: DeviceLinkSource linkedPorts: 20901: - - Pressed: Toggle + - - Pressed + - Toggle 20902: - - Pressed: Toggle + - - Pressed + - Toggle 20903: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 22948 components: - type: MetaData @@ -203311,9 +203443,11 @@ entities: - type: DeviceLinkSource linkedPorts: 22702: - - Pressed: Toggle + - - Pressed + - Toggle 22701: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23230 components: - type: MetaData @@ -203324,9 +203458,11 @@ entities: - type: DeviceLinkSource linkedPorts: 35988: - - Pressed: Toggle + - - Pressed + - Toggle 35992: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24763 components: - type: MetaData @@ -203338,11 +203474,14 @@ entities: - type: DeviceLinkSource linkedPorts: 2351: - - Pressed: Toggle + - - Pressed + - Toggle 24728: - - Pressed: Toggle + - - Pressed + - Toggle 24726: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 24764 components: - type: MetaData @@ -203355,9 +203494,11 @@ entities: - type: DeviceLinkSource linkedPorts: 23281: - - Pressed: Toggle + - - Pressed + - Toggle 23279: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 27275 components: - type: MetaData @@ -203368,7 +203509,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23097: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 29060 components: - type: MetaData @@ -203379,9 +203521,11 @@ entities: - type: DeviceLinkSource linkedPorts: 13770: - - Pressed: Toggle + - - Pressed + - Toggle 4274: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 29091 components: - type: MetaData @@ -203393,13 +203537,17 @@ entities: - type: DeviceLinkSource linkedPorts: 29081: - - Pressed: Toggle + - - Pressed + - Toggle 29082: - - Pressed: Toggle + - - Pressed + - Toggle 27415: - - Pressed: Toggle + - - Pressed + - Toggle 29083: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 29591 components: - type: MetaData @@ -203411,9 +203559,11 @@ entities: - type: DeviceLinkSource linkedPorts: 29601: - - Pressed: Toggle + - - Pressed + - Toggle 29603: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 29752 components: - type: Transform @@ -203423,7 +203573,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29743: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 29753 components: - type: Transform @@ -203433,7 +203584,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29744: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 29754 components: - type: Transform @@ -203443,7 +203595,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29745: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 29756 components: - type: Transform @@ -203452,7 +203605,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29741: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 29757 components: - type: Transform @@ -203461,7 +203615,8 @@ entities: - type: DeviceLinkSource linkedPorts: 29742: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 31970 components: - type: MetaData @@ -203473,9 +203628,11 @@ entities: - type: DeviceLinkSource linkedPorts: 17696: - - Pressed: Toggle + - - Pressed + - Toggle 17697: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 33808 components: - type: MetaData @@ -203486,7 +203643,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1420: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 33909 components: - type: MetaData @@ -203498,9 +203656,11 @@ entities: - type: DeviceLinkSource linkedPorts: 25486: - - Pressed: Toggle + - - Pressed + - Toggle 27753: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 34637 components: - type: Transform @@ -203510,7 +203670,8 @@ entities: - type: DeviceLinkSource linkedPorts: 34635: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 34937 components: - type: MetaData @@ -203522,7 +203683,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28156: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 34939 components: - type: MetaData @@ -203534,7 +203696,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28155: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 34992 components: - type: MetaData @@ -203546,7 +203709,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28154: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 34993 components: - type: MetaData @@ -203558,7 +203722,8 @@ entities: - type: DeviceLinkSource linkedPorts: 28151: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 35585 components: - type: MetaData @@ -203570,13 +203735,17 @@ entities: - type: DeviceLinkSource linkedPorts: 30721: - - Pressed: Toggle + - - Pressed + - Toggle 29313: - - Pressed: Toggle + - - Pressed + - Toggle 25194: - - Pressed: Toggle + - - Pressed + - Toggle 546: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36167 components: - type: MetaData @@ -203588,11 +203757,14 @@ entities: - type: DeviceLinkSource linkedPorts: 34039: - - Pressed: Toggle + - - Pressed + - Toggle 34040: - - Pressed: Toggle + - - Pressed + - Toggle 35198: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36815 components: - type: MetaData @@ -203604,7 +203776,8 @@ entities: - type: DeviceLinkSource linkedPorts: 36824: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36825 components: - type: Transform @@ -203614,9 +203787,11 @@ entities: - type: DeviceLinkSource linkedPorts: 36813: - - Pressed: Toggle + - - Pressed + - Toggle 36826: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36835 components: - type: Transform @@ -203626,7 +203801,8 @@ entities: - type: DeviceLinkSource linkedPorts: 36834: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36838 components: - type: MetaData @@ -203637,7 +203813,8 @@ entities: - type: DeviceLinkSource linkedPorts: 36837: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36841 components: - type: Transform @@ -203647,7 +203824,8 @@ entities: - type: DeviceLinkSource linkedPorts: 36839: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36843 components: - type: Transform @@ -203656,9 +203834,11 @@ entities: - type: DeviceLinkSource linkedPorts: 36845: - - Pressed: Toggle + - - Pressed + - Toggle 36844: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 36848 components: - type: MetaData @@ -203670,9 +203850,11 @@ entities: - type: DeviceLinkSource linkedPorts: 36846: - - Pressed: Toggle + - - Pressed + - Toggle 36847: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 37303 components: - type: MetaData @@ -203683,11 +203865,14 @@ entities: - type: DeviceLinkSource linkedPorts: 37302: - - Pressed: Toggle + - - Pressed + - Toggle 37301: - - Pressed: Toggle + - - Pressed + - Toggle 37300: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 37304 components: - type: MetaData @@ -203699,11 +203884,14 @@ entities: - type: DeviceLinkSource linkedPorts: 37299: - - Pressed: Toggle + - - Pressed + - Toggle 37298: - - Pressed: Toggle + - - Pressed + - Toggle 37297: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 37367 components: - type: MetaData @@ -203715,7 +203903,8 @@ entities: - type: DeviceLinkSource linkedPorts: 37366: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 37370 components: - type: MetaData @@ -203727,13 +203916,17 @@ entities: - type: DeviceLinkSource linkedPorts: 28645: - - Pressed: Open + - - Pressed + - Open 28644: - - Pressed: Open + - - Pressed + - Open 22854: - - Pressed: Open + - - Pressed + - Open 22853: - - Pressed: Open + - - Pressed + - Open - uid: 37410 components: - type: MetaData @@ -203744,35 +203937,50 @@ entities: - type: DeviceLinkSource linkedPorts: 37408: - - Pressed: Toggle + - - Pressed + - Toggle 37407: - - Pressed: Toggle + - - Pressed + - Toggle 37406: - - Pressed: Toggle + - - Pressed + - Toggle 37405: - - Pressed: Toggle + - - Pressed + - Toggle 37404: - - Pressed: Toggle + - - Pressed + - Toggle 37403: - - Pressed: Toggle + - - Pressed + - Toggle 37402: - - Pressed: Toggle + - - Pressed + - Toggle 37401: - - Pressed: Toggle + - - Pressed + - Toggle 37400: - - Pressed: Toggle + - - Pressed + - Toggle 37399: - - Pressed: Toggle + - - Pressed + - Toggle 37398: - - Pressed: Toggle + - - Pressed + - Toggle 37397: - - Pressed: Toggle + - - Pressed + - Toggle 37396: - - Pressed: Toggle + - - Pressed + - Toggle 37395: - - Pressed: Toggle + - - Pressed + - Toggle 37394: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 37425 components: - type: MetaData @@ -203784,13 +203992,17 @@ entities: - type: DeviceLinkSource linkedPorts: 37418: - - Pressed: Toggle + - - Pressed + - Toggle 37419: - - Pressed: Toggle + - - Pressed + - Toggle 37420: - - Pressed: Toggle + - - Pressed + - Toggle 37421: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 37565 components: - type: MetaData @@ -203801,11 +204013,14 @@ entities: - type: DeviceLinkSource linkedPorts: 37560: - - Pressed: Toggle + - - Pressed + - Toggle 37561: - - Pressed: Toggle + - - Pressed + - Toggle 37562: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignAnomaly entities: - uid: 5304 @@ -216146,33 +216361,54 @@ entities: - type: DeviceLinkSource linkedPorts: 19283: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19277: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19278: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19282: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19279: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19280: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19281: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 19299 components: - type: Transform @@ -216181,33 +216417,54 @@ entities: - type: DeviceLinkSource linkedPorts: 19290: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19289: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19288: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19287: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19286: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19285: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19284: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 19300 components: - type: Transform @@ -216216,61 +216473,103 @@ entities: - type: DeviceLinkSource linkedPorts: 19297: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19296: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19295: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19294: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19293: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19292: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19291: - - Left: Forward - - Right: Off - - Middle: Off + - - Left + - Forward + - - Right + - Off + - - Middle + - Off 36554: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 36553: - - Left: Forward - - Middle: Off - - Right: Off + - - Left + - Forward + - - Middle + - Off + - - Right + - Off 36555: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 36556: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 36557: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 32974: - - Left: Off - - Right: Reverse - - Middle: Off + - - Left + - Off + - - Right + - Reverse + - - Middle + - Off 32972: - - Right: Reverse - - Middle: Off - - Left: Off + - - Right + - Reverse + - - Middle + - Off + - - Left + - Off - uid: 19320 components: - type: Transform @@ -216279,17 +216578,26 @@ entities: - type: DeviceLinkSource linkedPorts: 19319: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19315: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 19317: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 19426 components: - type: Transform @@ -216298,29 +216606,47 @@ entities: - type: DeviceLinkSource linkedPorts: 1438: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 20335: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22735: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 23947: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 26175: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 29397: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 21674 components: - type: Transform @@ -216329,25 +216655,40 @@ entities: - type: DeviceLinkSource linkedPorts: 16220: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16219: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16221: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16227: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 16222: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 25722 components: - type: Transform @@ -216356,37 +216697,61 @@ entities: - type: DeviceLinkSource linkedPorts: 22742: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5888: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5034: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4529: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22792: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22793: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22802: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 22804: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 34318 components: - type: Transform @@ -216395,41 +216760,68 @@ entities: - type: DeviceLinkSource linkedPorts: 34312: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34309: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34310: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34323: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34324: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34325: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34326: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 34327: - - Left: Open - - Right: Close - - Middle: Close + - - Left + - Open + - - Right + - Close + - - Middle + - Close 34329: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 34319 components: - type: Transform @@ -216438,33 +216830,54 @@ entities: - type: DeviceLinkSource linkedPorts: 34320: - - Left: Reverse - - Right: Forward - - Middle: Off + - - Left + - Reverse + - - Right + - Forward + - - Middle + - Off 34311: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34313: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34314: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34315: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34330: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 34316: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 5580 @@ -239616,7 +240029,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13667: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 20914 components: - type: Transform @@ -239882,7 +240296,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26866: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22782 components: - type: Transform @@ -239987,7 +240402,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13668: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureJanitorLocked entities: - uid: 30036 @@ -240080,7 +240496,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20807: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20807 components: - type: Transform @@ -240092,7 +240509,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20806: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20810 components: - type: Transform @@ -240104,7 +240522,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20813: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20811 components: - type: Transform @@ -240116,7 +240535,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20812: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20812 components: - type: Transform @@ -240128,7 +240548,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20811: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20813 components: - type: Transform @@ -240140,7 +240561,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20810: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20856 components: - type: Transform @@ -240273,7 +240695,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12420: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: Window entities: - uid: 362 From 66b65314d0a3857c28c3fa4f60282aaa323d6213 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sat, 19 Apr 2025 20:00:31 +0200 Subject: [PATCH 399/622] Fix silo rotation (#36737) Update silo.yml --- Resources/Prototypes/Entities/Structures/Machines/silo.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Structures/Machines/silo.yml b/Resources/Prototypes/Entities/Structures/Machines/silo.yml index 31bfe42572..6bc08c9004 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/silo.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/silo.yml @@ -6,6 +6,7 @@ components: - type: Sprite sprite: Structures/Machines/silo.rsi + snapCardinals: true layers: - state: silo map: [ "base" ] From 52323a8972d678b2b145bfb40a6f093b779c3bb0 Mon Sep 17 00:00:00 2001 From: c4llv07e <igor@c4llv07e.xyz> Date: Sat, 19 Apr 2025 23:20:32 +0300 Subject: [PATCH 400/622] Better PowerCharge menu wrapping (retry) (#34036) * fixed * Move wattage to the power button --------- Co-authored-by: VideoKompany <135313844+VlaDOS1408@users.noreply.github.com> --- .../Power/PowerCharge/PowerChargeWindow.xaml | 97 +++++++++++++++---- 1 file changed, 76 insertions(+), 21 deletions(-) diff --git a/Content.Client/Power/PowerCharge/PowerChargeWindow.xaml b/Content.Client/Power/PowerCharge/PowerChargeWindow.xaml index 4e61255326..982b75117a 100644 --- a/Content.Client/Power/PowerCharge/PowerChargeWindow.xaml +++ b/Content.Client/Power/PowerCharge/PowerChargeWindow.xaml @@ -1,33 +1,88 @@ -<controls:FancyWindow xmlns="https://spacestation14.io" - xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" - MinSize="270 130" - SetSize="360 180"> - <BoxContainer Margin="4 0" Orientation="Horizontal"> - <BoxContainer Orientation="Vertical" HorizontalExpand="True"> - <GridContainer Margin="2 0 0 0" Columns="2"> +<controls:FancyWindow + xmlns="https://spacestation14.io" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + MinSize="320 180" + Resizable="False"> + <BoxContainer + Margin="12 8" + Orientation="Horizontal" + SeparationOverride="12"> + <BoxContainer + Orientation="Vertical" + HorizontalExpand="True"> + <GridContainer + Columns="2" + VerticalAlignment="Center"> + <!-- Power --> - <Label Text="{Loc 'power-charge-window-power'}" HorizontalExpand="True" StyleClasses="StatusFieldTitle" /> - <BoxContainer Orientation="Horizontal" MinWidth="120"> - <Button Name="OnButton" Text="{Loc 'power-charge-window-power-on'}" StyleClasses="OpenRight" /> - <Button Name="OffButton" Text="{Loc 'power-charge-window-power-off'}" StyleClasses="OpenLeft" /> + <Label + Text="{Loc 'power-charge-window-power'}" + HorizontalExpand="True" + StyleClasses="StatusFieldTitle" /> + + <BoxContainer + Orientation="Horizontal" + MinWidth="120" + SetWidth="160"> + + <Button Name="OnButton" + Text="{Loc 'power-charge-window-power-on'}" + StyleClasses="OpenRight" + MinWidth="60" + SetWidth="80" + HorizontalAlignment="Center"/> + + <Button + Name="OffButton" + Text="{Loc 'power-charge-window-power-off'}" + StyleClasses="OpenLeft" + MinWidth="60" + SetWidth="80" + HorizontalAlignment="Center"/> </BoxContainer> + <Control /> <!-- Empty control to act as a spacer in the grid. --> - <Label Name="PowerLabel" Text="0 / 0 W" /> + + <Label Name="PowerLabel" + Text="0 / 0 W" /> + <!-- Status --> - <Label Text="{Loc 'power-charge-window-status'}" StyleClasses="StatusFieldTitle" /> - <Label Name="StatusLabel" Text="{Loc 'power-charge-window-status-fully-charged'}" /> + <Label + Text="{Loc 'power-charge-window-status'}" + StyleClasses="StatusFieldTitle" /> + <Label Name="StatusLabel" + Text="{Loc 'power-charge-window-status-fully-charged'}" /> + <!-- ETA --> - <Label Text="{Loc 'power-charge-window-eta'}" StyleClasses="StatusFieldTitle" /> - <Label Name="EtaLabel" Text="N/A" /> + <Label + Text="{Loc 'power-charge-window-eta'}" + StyleClasses="StatusFieldTitle" /> + <Label Name="EtaLabel" + Text="N/A" /> + <!-- Charge --> - <Label Text="{Loc 'power-charge-window-charge'}" StyleClasses="StatusFieldTitle" /> - <ProgressBar Name="ChargeBar" MaxValue="255"> - <Label Name="ChargeText" Margin="4 0" Text="0 %" /> + <Label + Text="{Loc 'power-charge-window-charge'}" + StyleClasses="StatusFieldTitle" /> + + <ProgressBar Name="ChargeBar" + MaxValue="255"> + + <Label Name="ChargeText" + HorizontalAlignment="Center" + Margin="4 0" + Text="0 %" /> </ProgressBar> </GridContainer> </BoxContainer> - <PanelContainer Margin="12 0 0 0" StyleClasses="Inset" VerticalAlignment="Center"> - <SpriteView Name="EntityView" SetSize="96 96" OverrideDirection="South" /> + <PanelContainer + StyleClasses="Inset" + VerticalAlignment="Top"> + + <SpriteView Name="EntityView" + SetSize="96 96" + Margin="0 0 0 26" + OverrideDirection="South" /> </PanelContainer> </BoxContainer> </controls:FancyWindow> From cb5a0fbbb3ee0e66afe12f021384771304f4f561 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 20:21:41 +0000 Subject: [PATCH 401/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 648d05a8b5..38c2a2174f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: amatwiedle - changes: - - message: The A/V Communication technology now unlocks holopad circuit boards. - type: Add - id: 7766 - time: '2024-12-31T13:20:07.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34150 - author: justdie12 changes: - message: Flipped signal disposal routers sprite @@ -3908,3 +3901,10 @@ id: 8266 time: '2025-04-19T17:07:23.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36719 +- author: VlaDOS1408 + changes: + - message: Fixed Gravity gen menu resizing! Now it looks like it should. + type: Fix + id: 8267 + time: '2025-04-19T20:20:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34036 From 6f475741b21d521354958648a3014e9b4f2eb251 Mon Sep 17 00:00:00 2001 From: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Date: Sat, 19 Apr 2025 23:32:17 +0300 Subject: [PATCH 402/622] [#30096 Fix] Dumping a RefillableSolution into a DumpableSolution now requires `CanComplexInteract` (#33350) * dumping containers now require having at least one hand * Cleanup * Better * Apply suggested changes * Cleanup --------- Co-authored-by: Luiz Costa <luiz@mavromati.com> --- .../Fluids/EntitySystems/PuddleSystem.Transfers.cs | 6 ++++++ Content.Server/Fluids/EntitySystems/PuddleSystem.cs | 2 ++ .../Locale/en-US/fluids/components/absorbent-component.ftl | 1 + 3 files changed, 9 insertions(+) diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs index 04bbf55c58..b821735265 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs @@ -14,6 +14,12 @@ public sealed partial class PuddleSystem private void OnRefillableDragged(Entity<RefillableSolutionComponent> entity, ref DragDropDraggedEvent args) { + if (!_actionBlocker.CanComplexInteract(args.User)) + { + _popups.PopupEntity(Loc.GetString("mopping-system-no-hands"), args.User, args.User); + return; + } + if (!_solutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.Solution, out var soln, out var solution) || solution.Volume == FixedPoint2.Zero) { _popups.PopupEntity(Loc.GetString("mopping-system-empty", ("used", entity.Owner)), entity, args.User); diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index 9cf3a1252f..be45a1dbc4 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -4,6 +4,7 @@ using Content.Server.Chemistry.TileReactions; using Content.Server.DoAfter; using Content.Server.Fluids.Components; using Content.Server.Spreader; +using Content.Shared.ActionBlocker; using Content.Shared.Chemistry; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; @@ -40,6 +41,7 @@ namespace Content.Server.Fluids.EntitySystems; /// </summary> public sealed partial class PuddleSystem : SharedPuddleSystem { + [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedMapSystem _map = default!; diff --git a/Resources/Locale/en-US/fluids/components/absorbent-component.ftl b/Resources/Locale/en-US/fluids/components/absorbent-component.ftl index 8a4d37023f..51e500a6fe 100644 --- a/Resources/Locale/en-US/fluids/components/absorbent-component.ftl +++ b/Resources/Locale/en-US/fluids/components/absorbent-component.ftl @@ -3,6 +3,7 @@ mopping-system-target-container-empty-water = { CAPITALIZE(THE($target)) } has n mopping-system-puddle-space = { CAPITALIZE(THE($used)) } is full of water mopping-system-puddle-evaporate = { CAPITALIZE(THE($target)) } is evaporating mopping-system-no-water = { CAPITALIZE(THE($used)) } has no water! +mopping-system-no-hands = You have no hands! mopping-system-full = { CAPITALIZE(THE($used)) } is full! mopping-system-empty = { CAPITALIZE(THE($used)) } is empty! From 74f68fa6345a29f5d83e76b228ce8bba7736013b Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 20:33:24 +0000 Subject: [PATCH 403/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 38c2a2174f..03f0b81396 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: justdie12 - changes: - - message: Flipped signal disposal routers sprite - type: Fix - id: 7767 - time: '2024-12-31T13:25:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34139 - author: ArtisticRoomba changes: - message: Shotgun crate now comes with 4 lethal shell boxes. @@ -3908,3 +3901,11 @@ id: 8267 time: '2025-04-19T20:20:32.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34036 +- author: coffeeware, MilenVolf + changes: + - message: Most common mobs without hands now can't dump containers wtih solution + by drag and dropping. + type: Tweak + id: 8268 + time: '2025-04-19T20:32:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33350 From 20841d402f52a9731dd4f965fdea7297f932ce7d Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sat, 19 Apr 2025 22:33:54 +0200 Subject: [PATCH 404/622] Give salvage borgs a tool module. (#33336) Init --- .../Entities/Objects/Specific/Robotics/borg_modules.yml | 1 - Resources/Prototypes/borg_types.yml | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index f26cb0a041..0c73a5a5c9 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -391,7 +391,6 @@ - Shovel - MineralScannerUnpowered - OreBag - - Crowbar - RadioHandheld - type: BorgModuleIcon icon: { sprite: Interface/Actions/actions_borg.rsi, state: mining-module } diff --git a/Resources/Prototypes/borg_types.yml b/Resources/Prototypes/borg_types.yml index d78cf505dc..2f1eb21b1f 100644 --- a/Resources/Prototypes/borg_types.yml +++ b/Resources/Prototypes/borg_types.yml @@ -81,9 +81,10 @@ - BorgModuleCargo defaultModules: - - BorgModuleGrapplingGun - BorgModuleMining + - BorgModuleGrapplingGun - BorgModuleAppraisal + - BorgModuleTool radioChannels: - Supply From aed81bf82e1d5f5997bcad3b72ddb05d61e44ab1 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sat, 19 Apr 2025 20:35:01 +0000 Subject: [PATCH 405/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 03f0b81396..97094a293d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: Shotgun crate now comes with 4 lethal shell boxes. - type: Tweak - - message: Enforcer gun safe now comes with 4 lethal shell boxes. - type: Tweak - - message: Kammerer gun safe now comes with 2 lethal shell boxes. - type: Tweak - id: 7768 - time: '2024-12-31T23:08:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34156 - author: Booblesnoot42 changes: - message: Tarantulas spawned in vents will now be hostile to the crew. @@ -3909,3 +3898,10 @@ id: 8268 time: '2025-04-19T20:32:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33350 +- author: ScarKy0 + changes: + - message: Salvage borgs now start with a tool module + type: Add + id: 8269 + time: '2025-04-19T20:33:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33336 From e561836a03f8b6f3467f92e3e2062cac91792aa4 Mon Sep 17 00:00:00 2001 From: TytosB <dunlaintytos@yahoo.com> Date: Sat, 19 Apr 2025 15:42:59 -0500 Subject: [PATCH 406/622] terrarium --- .../Maps/Lavaland/PreservedTerrarium.yml | 1408 +++++++++++++++++ 1 file changed, 1408 insertions(+) create mode 100644 Resources/Maps/Lavaland/PreservedTerrarium.yml diff --git a/Resources/Maps/Lavaland/PreservedTerrarium.yml b/Resources/Maps/Lavaland/PreservedTerrarium.yml new file mode 100644 index 0000000000..31d7adeada --- /dev/null +++ b/Resources/Maps/Lavaland/PreservedTerrarium.yml @@ -0,0 +1,1408 @@ +meta: + format: 7 + category: Grid + engineVersion: 253.0.0 + forkId: "" + forkVersion: "" + time: 04/19/2025 20:20:58 + entityCount: 226 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 2: Space + 3: FloorBasalt + 0: FloorFreezer + 1: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -2.2124596,1.828125 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance + - type: NavMap +- proto: AirCanister + entities: + - uid: 226 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 +- proto: AirlockExternal + entities: + - uid: 89 + components: + - type: Transform + pos: 11.5,-1.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 2 + - type: DeviceLinkSource + linkedPorts: + 92: + - DoorStatus: DoorBolt + 91: + - DoorStatus: DoorBolt + - uid: 90 + components: + - type: Transform + pos: 11.5,-2.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 2 + - type: DeviceLinkSource + linkedPorts: + 92: + - DoorStatus: DoorBolt + 91: + - DoorStatus: DoorBolt + - uid: 91 + components: + - type: Transform + pos: 9.5,-2.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 2 + - type: DeviceLinkSource + linkedPorts: + 90: + - DoorStatus: DoorBolt + 89: + - DoorStatus: DoorBolt + - uid: 92 + components: + - type: Transform + pos: 9.5,-1.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 2 + - type: DeviceLinkSource + linkedPorts: + 89: + - DoorStatus: DoorBolt + 90: + - DoorStatus: DoorBolt +- proto: AirlockHydroponics + entities: + - uid: 87 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-1.5 + parent: 1 + - uid: 88 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-2.5 + parent: 1 + - uid: 219 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 +- proto: APCBasic + entities: + - uid: 154 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 +- proto: Biofabricator + entities: + - uid: 122 + components: + - type: Transform + pos: 4.5,-3.5 + parent: 1 +- proto: Bucket + entities: + - uid: 137 + components: + - type: Transform + pos: 5.6785603,1.604964 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: 7.870857,1.6834512 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 158 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: 4.5,3.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 169 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 + - uid: 170 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 + - uid: 179 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 182 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: 4.5,-4.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: 6.5,-4.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: 7.5,-4.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: 5.5,-4.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: 7.5,-3.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: 7.5,-2.5 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: 7.5,-1.5 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: 7.5,-0.5 + parent: 1 + - uid: 192 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - uid: 193 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 194 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 198 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 199 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 200 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: 8.5,-1.5 + parent: 1 + - uid: 203 + components: + - type: Transform + pos: 9.5,-1.5 + parent: 1 + - uid: 204 + components: + - type: Transform + pos: 10.5,-1.5 + parent: 1 +- proto: CableHV + entities: + - uid: 22 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 +- proto: CableMV + entities: + - uid: 23 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 +- proto: ChemMaster + entities: + - uid: 220 + components: + - type: Transform + pos: 5.5,-5.5 + parent: 1 +- proto: ClothingBackpackWaterTank + entities: + - uid: 144 + components: + - type: Transform + pos: 7.5524035,-5.446327 + parent: 1 +- proto: ClothingBeltPlantFilled + entities: + - uid: 213 + components: + - type: Transform + pos: 3.0792236,4.589468 + parent: 1 +- proto: ClothingHandsGlovesLeather + entities: + - uid: 211 + components: + - type: Transform + pos: 4.3292236,4.651968 + parent: 1 +- proto: CrateHydroponicsSeedsExotic + entities: + - uid: 128 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 1 +- proto: CrateHydroponicsSeedsMedicinal + entities: + - uid: 140 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 +- proto: CryogenicSleepUnit + entities: + - uid: 93 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-0.5 + parent: 1 + - uid: 94 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-1.5 + parent: 1 + - uid: 95 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-2.5 + parent: 1 + - uid: 96 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-3.5 + parent: 1 +- proto: DisposalBend + entities: + - uid: 150 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-7.5 + parent: 1 +- proto: DisposalPipe + entities: + - uid: 62 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 +- proto: DisposalTrunk + entities: + - uid: 147 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 151 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-7.5 + parent: 1 +- proto: DisposalUnit + entities: + - uid: 121 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 +- proto: GeneratorWallmountAPU + entities: + - uid: 21 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 +- proto: hydroponicsTray + entities: + - uid: 109 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: 1.5,-3.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: 4.5,-5.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 6.5,-5.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: 6.5,-3.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 +- proto: KitchenReagentGrinder + entities: + - uid: 126 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 +- proto: LockerBotanistFilled + entities: + - uid: 210 + components: + - type: Transform + pos: 7.5,4.5 + parent: 1 +- proto: LockerBotanistLoot + entities: + - uid: 129 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 +- proto: PackPaperRollingFilters + entities: + - uid: 209 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.38597775,4.679373 + parent: 1 +- proto: PlantBag + entities: + - uid: 135 + components: + - type: Transform + pos: 5.3973103,1.698714 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: 7.4129353,1.589339 + parent: 1 +- proto: Poweredlight + entities: + - uid: 97 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 98 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-3.5 + parent: 1 + - uid: 99 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,0.5 + parent: 1 + - uid: 100 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-4.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 105 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,0.5 + parent: 1 + - uid: 106 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-4.5 + parent: 1 + - uid: 118 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-5.5 + parent: 1 + - uid: 119 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,-5.5 + parent: 1 +- proto: SeedExtractor + entities: + - uid: 120 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 +- proto: SinkWide + entities: + - uid: 131 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-3.5 + parent: 1 + - uid: 132 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-0.5 + parent: 1 + - uid: 133 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-0.5 + parent: 1 + - uid: 134 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-3.5 + parent: 1 +- proto: SmartFridge + entities: + - uid: 108 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 +- proto: SodaDispenser + entities: + - uid: 124 + components: + - type: Transform + pos: 5.5,-3.5 + parent: 1 +- proto: SpawnMobBee + entities: + - uid: 221 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 +- proto: SpawnMobButterfly + entities: + - uid: 224 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 +- proto: SubstationWallBasic + entities: + - uid: 153 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 +- proto: TableGlass + entities: + - uid: 125 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 +- proto: TableWood + entities: + - uid: 77 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,4.5 + parent: 1 + - uid: 78 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,4.5 + parent: 1 + - uid: 79 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,4.5 + parent: 1 + - uid: 80 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,4.5 + parent: 1 + - uid: 81 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,4.5 + parent: 1 + - uid: 82 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,1.5 + parent: 1 + - uid: 83 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,1.5 + parent: 1 + - uid: 84 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,1.5 + parent: 1 + - uid: 85 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,-5.5 + parent: 1 + - uid: 86 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-5.5 + parent: 1 + - uid: 123 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,-3.5 + parent: 1 +- proto: TechnologyDisk + entities: + - uid: 216 + components: + - type: Transform + pos: 8.588779,1.6050167 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: 1.3883138,4.5268917 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: 2.1539388,4.5268917 + parent: 1 +- proto: Thruster + entities: + - uid: 30 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,2.5 + parent: 1 + - uid: 31 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,4.5 + parent: 1 + - uid: 61 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-6.5 + parent: 1 + - uid: 63 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,0.5 + parent: 1 + - uid: 64 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-4.5 + parent: 1 +- proto: ToolboxSyndicateFilled + entities: + - uid: 143 + components: + - type: Transform + pos: 8.505528,-5.352577 + parent: 1 +- proto: ToyFigurineBotanist + entities: + - uid: 212 + components: + - type: Transform + pos: 3.7510986,4.651968 + parent: 1 +- proto: VendingMachineHydrobe + entities: + - uid: 127 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 +- proto: VendingMachineNutri + entities: + - uid: 141 + components: + - type: Transform + pos: 4.5,-0.5 + parent: 1 +- proto: VendingMachineSeedsUnlocked + entities: + - uid: 107 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 +- proto: WallReinforced + entities: + - uid: 2 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -1.5,2.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 5.5,2.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 9.5,2.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 8.5,2.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 8.5,4.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 9.5,4.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 9.5,3.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 32 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,1.5 + parent: 1 + - uid: 33 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,1.5 + parent: 1 + - uid: 34 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - uid: 35 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,0.5 + parent: 1 + - uid: 36 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,0.5 + parent: 1 + - uid: 37 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,0.5 + parent: 1 + - uid: 38 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-0.5 + parent: 1 + - uid: 39 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-1.5 + parent: 1 + - uid: 40 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-3.5 + parent: 1 + - uid: 41 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-4.5 + parent: 1 + - uid: 42 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-2.5 + parent: 1 + - uid: 43 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,-4.5 + parent: 1 + - uid: 44 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-4.5 + parent: 1 + - uid: 45 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-5.5 + parent: 1 + - uid: 46 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-5.5 + parent: 1 + - uid: 47 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-4.5 + parent: 1 + - uid: 48 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-6.5 + parent: 1 + - uid: 49 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-0.5 + parent: 1 + - uid: 50 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-3.5 + parent: 1 + - uid: 51 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-6.5 + parent: 1 + - uid: 52 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,-6.5 + parent: 1 + - uid: 53 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,-6.5 + parent: 1 + - uid: 54 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-6.5 + parent: 1 + - uid: 55 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-6.5 + parent: 1 + - uid: 56 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,-6.5 + parent: 1 + - uid: 57 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,-6.5 + parent: 1 + - uid: 58 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,-6.5 + parent: 1 + - uid: 59 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-6.5 + parent: 1 + - uid: 60 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-6.5 + parent: 1 + - uid: 65 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-5.5 + parent: 1 + - uid: 66 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-5.5 + parent: 1 + - uid: 67 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-4.5 + parent: 1 + - uid: 68 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-3.5 + parent: 1 + - uid: 69 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,-3.5 + parent: 1 + - uid: 70 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-3.5 + parent: 1 + - uid: 71 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-0.5 + parent: 1 + - uid: 72 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-0.5 + parent: 1 + - uid: 73 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,-0.5 + parent: 1 + - uid: 74 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,1.5 + parent: 1 + - uid: 75 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,0.5 + parent: 1 + - uid: 76 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,1.5 + parent: 1 + - uid: 152 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-6.5 + parent: 1 + - uid: 205 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,5.5 + parent: 1 + - uid: 206 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,5.5 + parent: 1 + - uid: 207 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,5.5 + parent: 1 + - uid: 208 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,5.5 + parent: 1 +- proto: WaterTankHighCapacity + entities: + - uid: 142 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 +- proto: WeaponSprayNozzle + entities: + - uid: 145 + components: + - type: Transform + pos: 7.8961535,-5.258827 + parent: 1 +... From a327a59cb24f7da8d3f5c12712973318365d63bf Mon Sep 17 00:00:00 2001 From: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Date: Sat, 19 Apr 2025 16:07:49 -0500 Subject: [PATCH 407/622] Smuggler follow up (#36456) * Fix Overfilling satchels * Add notes * Clearer * remove line :/ * Reduce by 1 cigars/booze * fix typo --------- Co-authored-by: Velcroboy <velcroboy333@hotmail.com> --- .../Clothing/Back/smuggler_tables.yml | 133 +++++++++--------- 1 file changed, 69 insertions(+), 64 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Back/smuggler_tables.yml b/Resources/Prototypes/Entities/Clothing/Back/smuggler_tables.yml index e14c316323..d03e629014 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/smuggler_tables.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/smuggler_tables.yml @@ -28,22 +28,23 @@ - !type:NestedSelector tableId: RandomSatchelTable6 + #number after each group indicates potential max inventory fill. If all combined fills are too high, it could result in an over-filled bag/error. - type: entityTable id: RandomSatchelTable1 table: !type:AllSelector children: - !type:NestedSelector - tableId: RandomSatchelGenericTable + tableId: RandomSatchelGenericTableSmallx2 #2x small - !type:NestedSelector - tableId: RandomSatchelFunnyTable + tableId: RandomSatchelFunnyTable #5x tiny - !type:NestedSelector - tableId: RandomSatchelClothingTable + tableId: RandomSatchelClothingTable #1x small - !type:NestedSelector - tableId: RandomSatchelCannabisTable + tableId: RandomSatchelCannabisTable #5x tiny - !type:NestedSelector - tableId: RandomSatchelGizmosTable + tableId: RandomSatchelGizmosTable #2x small - !type:NestedSelector - tableId: RandomSatchelChemsTable + tableId: RandomSatchelChemsTable #5x tiny - type: entityTable id: RandomSatchelFunnyTable @@ -63,7 +64,7 @@ amount: !type:RangeNumberSelector range: 1, 5 -- type: entityTable +- type: entityTable #5x tiny id: RandomSatchelCannabisTable table: !type:GroupSelector children: @@ -82,7 +83,7 @@ amount: !type:RangeNumberSelector range: 1, 15 -- type: entityTable +- type: entityTable #2x small id: RandomSatchelGizmosTable table: !type:GroupSelector children: @@ -99,7 +100,7 @@ range: 1, 2 - id: ProximitySensor -- type: entityTable +- type: entityTable #5x tiny id: RandomSatchelChemsTable table: !type:GroupSelector children: @@ -134,17 +135,17 @@ table: !type:AllSelector children: - !type:NestedSelector - tableId: RandomSatchelTobaccoTable + tableId: RandomSatchelTobaccoTable #2x 2x3(12 slots) - !type:NestedSelector - tableId: RandomSatchelPartyTable + tableId: RandomSatchelPartyTable #5x small - !type:NestedSelector - tableId: RandomSatchelClothingTable + tableId: RandomSatchelClothingTable #1x small - !type:NestedSelector - tableId: RandomSatchelPayloadTable + tableId: RandomSatchelPayloadTable #2x small - !type:NestedSelector - tableId: RandomSatchelCircuitboardsTable + tableId: RandomSatchelCircuitboardsTable #1x small -- type: entityTable +- type: entityTable #2x 2x3(12 slots) id: RandomSatchelTobaccoTable table: !type:GroupSelector children: @@ -157,14 +158,10 @@ - id: CigCartonGreen - id: CigCartonBlack - id: CigarCase - amount: !type:RangeNumberSelector - range: 1, 2 - id: CigarGoldCase weight: 0.25 - amount: !type:RangeNumberSelector - range: 1, 2 -- type: entityTable +- type: entityTable #5x small id: RandomSatchelPartyTable table: !type:GroupSelector children: @@ -186,7 +183,7 @@ amount: !type:RangeNumberSelector range: 1, 5 -- type: entityTable +- type: entityTable #1x small id: RandomSatchelClothingTable table: !type:GroupSelector children: @@ -200,7 +197,7 @@ - id: ClothingHandsGlovesCombat - id: ClothingNeckScarfStripedSyndieRed -- type: entityTable +- type: entityTable #2x small id: RandomSatchelPayloadTable table: !type:GroupSelector children: @@ -216,7 +213,7 @@ amount: !type:RangeNumberSelector range: 1, 2 -- type: entityTable +- type: entityTable #1x small id: RandomSatchelCircuitboardsTable table: !type:GroupSelector children: @@ -245,19 +242,19 @@ table: !type:AllSelector children: - !type:NestedSelector - tableId: RandomSatchelPresentsOrToysTable + tableId: RandomSatchelPresentsOrToysTable #3x small - !type:NestedSelector - tableId: RandomSatchelCashTable + tableId: RandomSatchelCashTable #1x small - !type:NestedSelector - tableId: RandomSatchelWeaponTable + tableId: RandomSatchelWeaponTable #5x small - !type:NestedSelector - tableId: RandomSatchelBurgerTable + tableId: RandomSatchelBurgerTable #5x small - !type:NestedSelector - tableId: RandomSatchelGenericTable + tableId: RandomSatchelGenericTableSmall #1x small - !type:NestedSelector - tableId: RandomSatchelKeysTable + tableId: RandomSatchelKeysTable #1x small -- type: entityTable +- type: entityTable #3x small id: RandomSatchelPresentsOrToysTable table: !type:GroupSelector children: @@ -271,7 +268,7 @@ - id: ToyFigurineQueen - id: ToyFigurineRatKing -- type: entityTable +- type: entityTable #1x small id: RandomSatchelCashTable table: !type:GroupSelector children: @@ -301,7 +298,7 @@ amount: !type:RangeNumberSelector range: 1, 10 -- type: entityTable +- type: entityTable #5x small id: RandomSatchelWeaponTable table: !type:GroupSelector children: @@ -312,7 +309,7 @@ amount: !type:RangeNumberSelector range: 1, 5 -- type: entityTable +- type: entityTable #5x small id: RandomSatchelBurgerTable table: !type:GroupSelector children: @@ -331,8 +328,8 @@ amount: !type:RangeNumberSelector range: 1, 5 -- type: entityTable - id: RandomSatchelGenericTable +- type: entityTable #1x small + id: RandomSatchelGenericTableSmall table: !type:GroupSelector children: - id: SpaceCash100 @@ -342,6 +339,13 @@ - id: WeaponFlareGun - id: ModularReceiver - id: RifleStock + +- type: entityTable #2x small + id: RandomSatchelGenericTableSmallx2 + table: !type:GroupSelector + children: + - id: SpaceCash100 + weight: 15 - id: DrinkSpaceGlue amount: !type:RangeNumberSelector range: 1, 2 @@ -352,7 +356,7 @@ amount: !type:RangeNumberSelector range: 1, 2 -- type: entityTable +- type: entityTable #1x small id: RandomSatchelKeysTable table: !type:GroupSelector children: @@ -377,17 +381,17 @@ table: !type:AllSelector children: - !type:NestedSelector - tableId: RandomSatchelMaterialsTable + tableId: RandomSatchelMaterialsTable #1x medium - !type:NestedSelector - tableId: RandomSatchelImplantersTable + tableId: RandomSatchelImplantersTable #1x small - !type:NestedSelector - tableId: RandomSatchelCellsTable + tableId: RandomSatchelCellsTable #1x small - !type:NestedSelector - tableId: RandomSatchelSyndicateTable + tableId: RandomSatchelSyndicateTable #1x medium - !type:NestedSelector - tableId: RandomSatchelToolsTable + tableId: RandomSatchelToolsTable #1x small -- type: entityTable +- type: entityTable #1x medium id: RandomSatchelMaterialsTable table: !type:GroupSelector children: @@ -424,7 +428,7 @@ weight: 2 - id: SheetUranium -- type: entityTable +- type: entityTable #1x small id: RandomSatchelImplantersTable table: !type:GroupSelector children: @@ -434,7 +438,7 @@ - id: BikeHornImplanter - id: SadTromboneImplanter -- type: entityTable +- type: entityTable #1x small id: RandomSatchelCellsTable table: !type:GroupSelector children: @@ -444,7 +448,7 @@ - id: PowerCellMicroreactor - id: PowerCellHigh -- type: entityTable +- type: entityTable #1x medium id: RandomSatchelSyndicateTable table: !type:GroupSelector children: @@ -459,8 +463,9 @@ - id: RadioJammer - id: SoapSyndie - id: SingularityToy + - id: DehydratedSpaceCarp -- type: entityTable +- type: entityTable #1x small id: RandomSatchelToolsTable table: !type:GroupSelector children: @@ -477,15 +482,15 @@ table: !type:AllSelector children: - !type:NestedSelector - tableId: RandomSatchelAlcoholTable + tableId: RandomSatchelAlcoholTable #2x medium - !type:NestedSelector - tableId: RandomSatchelInstrumentTable + tableId: RandomSatchelInstrumentTable #1x Medium - !type:NestedSelector - tableId: RandomSatchelMedsTable + tableId: RandomSatchelMedsTable #5x tiny - !type:NestedSelector - tableId: RandomSatchelMysteriesTable + tableId: RandomSatchelMysteriesTable #1x Medium -- type: entityTable +- type: entityTable #2x medium id: RandomSatchelAlcoholTable table: !type:GroupSelector children: @@ -493,18 +498,18 @@ weight: 5 - id: DrinkCognacBottleFull amount: !type:RangeNumberSelector - range: 1, 4 + range: 1, 2 - id: DrinkGildlagerBottleFull amount: !type:RangeNumberSelector - range: 1, 4 + range: 1, 2 - id: DrinkPatronBottleFull amount: !type:RangeNumberSelector - range: 1, 4 + range: 1, 2 - id: DrinkRumBottleFull amount: !type:RangeNumberSelector - range: 1, 4 + range: 1, 2 -- type: entityTable +- type: entityTable #1x Medium id: RandomSatchelInstrumentTable table: !type:GroupSelector children: @@ -517,7 +522,7 @@ - id: RockGuitarInstrument - id: BassGuitarInstrument -- type: entityTable +- type: entityTable #5x tiny id: RandomSatchelMedsTable table: !type:GroupSelector children: @@ -552,7 +557,7 @@ - id: Stimpack - id: CombatMedipen -- type: entityTable +- type: entityTable #1x Medium id: RandomSatchelMysteriesTable table: !type:GroupSelector children: @@ -597,13 +602,13 @@ table: !type:AllSelector children: - !type:NestedSelector - tableId: RandomSatchelGearTable + tableId: RandomSatchelGearTable #1x Huge - !type:NestedSelector - tableId: RandomSatchelGadgetsTable + tableId: RandomSatchelGadgetsTable #2x small - !type:NestedSelector - tableId: CubeTable + tableId: CubeTable #10x tiny -- type: entityTable +- type: entityTable #1x Huge id: RandomSatchelGearTable table: !type:GroupSelector children: @@ -615,7 +620,7 @@ - id: HandheldStationMap - id: PinpointerStation -- type: entityTable +- type: entityTable #2x small id: RandomSatchelGadgetsTable table: !type:GroupSelector children: @@ -633,7 +638,7 @@ - id: ChameleonProjector weight: 0.25 -- type: entityTable +- type: entityTable #10x tiny id: CubeTable table: !type:GroupSelector children: From 10ca6cb179986e40c155316aa67f0ed972327cdf Mon Sep 17 00:00:00 2001 From: TytosB <dunlaintytos@yahoo.com> Date: Sat, 19 Apr 2025 16:19:08 -0500 Subject: [PATCH 408/622] fixgridatmos --- .../Maps/Lavaland/PreservedTerrarium.yml | 77 ++++++++++++++++--- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/Resources/Maps/Lavaland/PreservedTerrarium.yml b/Resources/Maps/Lavaland/PreservedTerrarium.yml index 31d7adeada..2cc6b309ca 100644 --- a/Resources/Maps/Lavaland/PreservedTerrarium.yml +++ b/Resources/Maps/Lavaland/PreservedTerrarium.yml @@ -1,10 +1,10 @@ meta: format: 7 category: Grid - engineVersion: 253.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/19/2025 20:20:58 + time: 04/19/2025 21:18:18 entityCount: 226 maps: [] grids: @@ -68,6 +68,53 @@ entities: - type: GridAtmosphere version: 2 data: + tiles: + 0,0: + 0: 62719 + 0,-1: + 0: 65535 + -1,0: + 0: 32904 + 0,1: + 0: 15 + 1,0: + 0: 61695 + 1,1: + 0: 15 + 1,-1: + 0: 65535 + 2,0: + 0: 5141 + 2,-1: + 0: 8177 + 2,1: + 0: 4 + -1,-1: + 0: 49147 + -1,-2: + 0: 34816 + 0,-2: + 0: 65292 + 1,-2: + 0: 65280 + 2,-2: + 0: 20800 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -91,9 +138,11 @@ entities: - type: DeviceLinkSource linkedPorts: 92: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 91: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 90 components: - type: Transform @@ -104,9 +153,11 @@ entities: - type: DeviceLinkSource linkedPorts: 92: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 91: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 91 components: - type: Transform @@ -117,9 +168,11 @@ entities: - type: DeviceLinkSource linkedPorts: 90: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 89: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 92 components: - type: Transform @@ -130,9 +183,11 @@ entities: - type: DeviceLinkSource linkedPorts: 89: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 90: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockHydroponics entities: - uid: 87 @@ -820,7 +875,7 @@ entities: - uid: 224 components: - type: Transform - pos: 7.5,0.5 + pos: 6.5,0.5 parent: 1 - uid: 225 components: From 511467f94a7d7b1156425cca5ae69c11f73a0e5a Mon Sep 17 00:00:00 2001 From: SeamLesss <kai.julian.watson@gmail.com> Date: Sat, 19 Apr 2025 17:17:38 -0700 Subject: [PATCH 409/622] Scarf Resprite (#35446) * guh??? * Merge branch 'master' of https://github.com/SeamLesss/space-station-14 * all of em * better scarfs --- .../Clothing/Neck/Scarfs/brown.rsi/icon.png | Bin 292 -> 4254 bytes .../Clothing/Neck/Scarfs/brown.rsi/meta.json | 2 +- .../Neck/Scarfs/centcom.rsi/equipped-NECK.png | Bin 565 -> 16598 bytes .../Clothing/Neck/Scarfs/centcom.rsi/icon.png | Bin 284 -> 4254 bytes .../Neck/Scarfs/centcom.rsi/inhand-left.png | Bin 528 -> 16598 bytes .../Neck/Scarfs/centcom.rsi/inhand-right.png | Bin 548 -> 16598 bytes .../Neck/Scarfs/centcom.rsi/meta.json | 2 +- .../Scarfs/lightblue.rsi/equipped-NECK.png | Bin 658 -> 16598 bytes .../Neck/Scarfs/lightblue.rsi/icon.png | Bin 910 -> 4254 bytes .../Neck/Scarfs/lightblue.rsi/inhand-left.png | Bin 463 -> 16598 bytes .../Scarfs/lightblue.rsi/inhand-right.png | Bin 458 -> 16598 bytes .../Neck/Scarfs/lightblue.rsi/meta.json | 2 +- .../Clothing/Neck/Scarfs/orange.rsi/icon.png | Bin 299 -> 4254 bytes .../Clothing/Neck/Scarfs/orange.rsi/meta.json | 2 +- .../Clothing/Neck/Scarfs/purple.rsi/icon.png | Bin 291 -> 4254 bytes .../Clothing/Neck/Scarfs/purple.rsi/meta.json | 2 +- .../Neck/Scarfs/syndiegreen.rsi/icon.png | Bin 288 -> 4254 bytes .../Neck/Scarfs/syndiegreen.rsi/meta.json | 2 +- .../Neck/Scarfs/syndiered.rsi/icon.png | Bin 288 -> 4254 bytes .../Neck/Scarfs/syndiered.rsi/meta.json | 2 +- 20 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Textures/Clothing/Neck/Scarfs/brown.rsi/icon.png b/Resources/Textures/Clothing/Neck/Scarfs/brown.rsi/icon.png index d50ecc9dd50f85e70a4ec2385e8c2b3e2055294b..12a177f1761ff47aa91f62d1c7ca400c4c46c150 100644 GIT binary patch literal 4254 zcmd^BOGs2<6h7CP=AomQf{O1FdeEX(Wr0XCJ_gZ-aFLsc)-3{ENvohmty@K#Hnj_* zU4>9W7_O>CB$;I;jb)F?%qRAL|M*S+{LH;`ZCO9ud;Z6HeCPb<oO>@P`@2hvYl}ss zG|>}3sc18vNJzbhMn)DD37zfjj!ToYNy9+bjl*gudcJ3HNTj3^k0aNv*Qm|#aH6j> zoGPjb9t~fryU;FDejpJ)K5#1PG?&kORUH5MaQ@c+WLMkfM(U*&Z>q#yiCi6fvu%Cb z7J#9?gH@ZLG`zgFfu*F<D-x*QtLLNl#(nAb#iTWEy<j|_VI1!{)RASKp8X(xKm@ZA zJ|;A7dJM7ni9s#Bxb#cYFW=Id`gv^&02IPFLXAPgdZAvi;wYz@B2NlMVOs!jzbTb? z2z5nyS&lJtF>!y?TzbxZ1AsRzjde2Zq3*$*Tl$na@^)d#gFAEN8-SN4+c0y)ONM8@ ztAM4~+L@HeXD<ZNn3^2Zdgw6?Ge>ZUYxBwjUjUf>P-uqL%`lP^6@h9fRF1x{0NzD* z1a$KO2pG3LwyOew3k}}@5Z3Cla8@6TGt~JEn<eR0js*cQ`%!i*F93n@Lgfgw%#$o~ zYf=z^$xly__3ZiPxj8p0!^|6#2lIje@Wq=_53-+wmB6)0O~cq{o|ru5+!Fvx4++Qc zGYX~>%-sy*sxr}<&k?EG*C$89PsFnf0f32z3cz4EasMbW`=5XwGeHq8vm8}U$%0hM ztB(<B4?lFj0wf=lQxSo%_L*E<+lCn_ej({T8d$`slbO$-B&3}3yaHx9N{S&ifgl=g zhH22IsHPuIg*bul5(+rp03gh7JCl&PKp>0|&du6~tnEGaz!P<15(q|gV{^@ca~;i_ z?}H6ezy40byIUcvM`LZZ%+95BecydL@0fi8%1xsL4?(w<?0N<1<#ic-Jno!6R==56 z$p#<*#E~zv+5gD{qm%>9H;VFYVsCZpM-voZGYv@5mDdy68(Sf~#lv$@Qx5X^hAV)d ztC>GtQUW3nDg+RCO2hU!<w$K1IRMZcRPAdX+%G1iHV`T_4Z>sYlTwb<1`tg4wu!7s zwmFo9G7ZOOw1H3|4Uux6lyaoD-eAkFI@Pcxr#aY6=9-E~X^52jq^4}Xd9Y%q`ny%X z^Ja6%$LO|4L!@qeZu>>CSTxfdivKi+EBhmE{Qutm&5fl;!`*Yw;aQ@yKYqL8%*Ed* CniCWN delta 276 zcmV+v0qg#rA*2G38Gi!+002a!ipBr{00DDSM?wIu&K&6g000tDOjJbx004PaNL@fT zZA?K<G%k&9WBkN)$N&HU26R$RQvm<}|NsAbdEov4006E@L_t(IjlGh=4#O}ALxV;B z|Cfgg$yNeARdWul>L<W7W4tU-Prgz;1Ghz_CUDu))B$k2C4a1V`1KT!0Ki^70FP33 zn8rksqQ|wP*h4v`hT5R3co)<LG-L;z$YVwVnLFv3frjiwBmmx?z#68=0PbPUdY^Lb z;Jb(n?9w}F20TRj$E~*AqbWKfXuefS1pG*VuHHALe!vPMeDa(?R9f#zdYnU#<}dVT aeE@Ef1q<GiQw>i50000<MNUMnLSTXi$#rx9 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/brown.rsi/meta.json b/Resources/Textures/Clothing/Neck/Scarfs/brown.rsi/meta.json index 276ae36807..30a175e77f 100644 --- a/Resources/Textures/Clothing/Neck/Scarfs/brown.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Scarfs/brown.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by MrGreen06#0618 (discord)", + "copyright": "Sprited by MrGreen06#0618 (discord), resprited by SeamLesss (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/equipped-NECK.png b/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/equipped-NECK.png index 63f1748aa1c71f2271af39beaf7459fd6a711d87..d64a3d4d5a5a771adee5c83ff3be4d76aeab336e 100644 GIT binary patch literal 16598 zcmeI4L1+^}6o%i1(%5VY60KH2>(Sz&ha#<%LX<6SC@mtQ2p+_uAOx|f(6cASYal3k z(o+w`i(Ydm1%-n2CLRP4EQXScX^+PFx1BIqHn?v$G0E~4(w7<D&j03{H<QB~`t0)J z>|p9-iiietbIuiIv-lk9SASRUEq_y{|MvW>Lj}r{ZGYWbQau9?=59PBvX9_n(aTrE zsx$d0w=k3Zl^E_jpB!BqA169PIp^Zl70b$IOC{wYj}Q<7LO=)z0U;m+gup)uj7*=Z z74mk?&#_s*pKp}DW;*CceB7}UL0|a%W~7!rk*2AMqohHY*6a^DCdUu@&@*+s`iQR? zpk`Wu0c?EQamRqwAWW<Kn+ZkjH^(=10R(ORpv`##19-lbq3U+EKDG%&_rvB3yH?$) zg<mi(#)q!f!|-MtW;>{KUr<N*fpoE)-Vfjy)$RB7A69-H9=rI{w&(F!g|HCs?j{aE zWQdG7+yz)|&jPrU!v4Zu#D}}rT15r>9{T65jW*b@@vt%g^o!-xK?*ARZC-IdXvnsW zF}qgX&ZsP?s95%GyS83K3_1hC(ry^6OB$>L3+ab*0DBE9(Is<;6h`1*0jS^*db_aa z+DNKh^fGG|<Cp=gLl7A-HG!X?3SD=9_8OORsIl1-t<V{;>2n73B7o2tFyxZ~J+b5x zq!17SLO=)z0U;m+Vo%`k(&l}A7a;bNl?e&~As_^VfDjM@LZDLwbfE-Rm#jM-OBj7t zjQ|4Pn!PSn!)hpD0^z)4LI-?k!y-1$IPhfy@Yd|Pf>Hf3c@w(6CjhI<<{S++0B_A+ zi)zae59<pp^WK1Nhbfk_0qnha>Xykqe)&Vw$sM<LkBJn^r|aLtPAtfKdXmt_qixu_ zC96o{4e+KjP@6oPaPJUd6?AZ3ziw_v0)T@DlZ#vRn6+Rylsb8PgcYohbEFKwc*ufY z&H(ly=!Mwp_Xi{cyerCWO9sdp5WhP_++864LO=)z0U;m+gn$tEzXU$~EWTHY^Z362 ZEmAHm-?{MHKK>fR<z^P0wM)02`~~s~hs^*0 delta 541 zcmV+&0^<GFfdRDykR*Qrb5ch_0Itp)=>Px$?@2^KRCt{2+COiCKo|z_ho%@3$EGpq z#L$7&*_G8#;D_*Qbam|3@8Ig%#ic8Q14~Uz+R?_qa2?1I{?*<c9u)ihmRFH*FUKn+ zyax~w5fRbv+$DrqLp1&N)Ama{H@>^n&*4US;B6pW-vcH=J`sP#Slq6gg!1^6acblH zp7w=Mo&X%8JmwQojB>jzh2uAlFHHii!zxd}Xal72sg#h6a(fz|;LPD@WuVBJ!%5>) zX}oG4rKm`~0+7x8c;}T)7y!~09A^$EUD-K#DG7n`&O@>YY7;M`?gh}=S*)}F8UWxB zS-aZjxJ!s+5nzA(8sj+g^JtpSt<KJ)4dD85xdc0wuHYbyL>dElj38qt7elNe#5S;Y zr|*Md1z5_a2U<75Bm|B#A4zB{o$men3NU*L93p%)+;r|Qmse+uD`0Oap+D^!p8`Zg zL_|bHL_|c2<ZH2Fo4W5@Olb85fO?<4*rx7skwoL#gl&IdZ-GRv+NbZBd^KNP8z9#x z=+d5mTA$vqFW*XG>|!)&kZMoB*YgvS5ZHeL@igld09oH&ezr-TWIWBj%V@ebp;b%y z{RQIT4v^iVKGqAgrPUd#^53#}ZT&(mL+=)~ssLd49b^5+V8zha46p*)9)K0V3K(_; f5D^g({aY2^(xE8ocH)Yn00000NkvXXu0mjfy0Hfc diff --git a/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/icon.png b/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/icon.png index e080f9b915dc1058388ed36b15faa464f90efec0..a856052a970ed041cbf1825721a15d1991fed67c 100644 GIT binary patch literal 4254 zcmeHJK}%Fo6h6+gv6&i~u%H6TAav2H9}rlK=om?ai;@N+!F6CO-32aMx3h#Gs8!L* zRe|89O|(ve5CydmEv<>sak}5VetEs#_vWUH7IlVq&%Af<Ip25BJ?Fgl;96gIE_*sF zBDrEu;kwdoxDKb)I6N}4u2lNYmF|Mn@O$#+`9t+2bGPT_u*i`XTn#e*_@sK+bgy`| zt7$1}PIa7p|Mt->k^K2$;ZpyNOha4#(~4U0k4wXT_J8JLYi+0<#~{+%*{t=2((Jx` z{jt&5;IWzwJo8~y6Zp80lJS|N`v2_oT(IBZh42h;?$`##+{9cSN=vo8DWN19X;e=W z+y#ENhE!KIk*#W7`LUsO=nzZ*4gro(LkO&I)DWd3{TFpwQ5W(gBnrU<aK1ybu0x&9 z9#ViBZ_iL_`68kk0c3RA=%g`-0Cp2)8g-II8Na)M+@hXfj!aH{^DlIs1`%*<cHO$b z%n=cDRJ#^?Zh{D~=ASN~kn(a_pYb3<t%N%!FmnWRA$d@j0J9$sWoqYq<A9Nz)k;-N zHEe3Lq@gYW7-M(s9eKT5oGrlJ9lKSL1ZvL(5insj9S>&<aE96kjFJp3$HY#^>_^$@ z@>0~#o!Zji=zOLeP5s-u!hakCZAK?nVsU~Z0EgV^fGj4KBi7oLQLh{m3E0^W#}L!= z{mEqmW39=P<Z_H9uqXSKLq-A4ZSez(J}UEujQ{Y7B>(_sdT;0Un{G;VyPSyv-gu=} zlbCTOiM|nKHWK@RmjIGaRNrT&ix7xJcyB&NNR;b$B4yr?cC_68UIJKTXE_qj2!Zp0 z<cbI0ULK%g3BVTJ4E2mqLP}!VuZc+NcZ77Pw_nG4p&C$zA>vKZS3@bm8NVoPX%ZlU z3!z115Ngym63kSEfdVKm+SDWAC9pKVra!5mNd&sQ`cwPkx1a4CzyyW1?XaOZ@y>kx zZo&tRuNo3UMBvzUNMO!G+jg*z6E6W~Gc^g32p!r-1!C?z?Wlbuyad?0sa+y;Xai!$ zd`?X}>R<xyLYD{~5{R15scA>;`aSSH+BKX|AK2l42Y(|1uP5JqKE5#D5A0%BU*YBD H+xLF~nsDxv delta 268 zcmbQIIEQJ1WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0P=HT}E0AW*XZXLF;r}TOu6~ZE z3m85|hMNIJ*-C=^f*JmUKvm^~e?XCCo-U3d7QK5Xc?um-;9)kr^#8t0&Vd}Y;+b8w zi)X6@sV=qmzxMMe<3w@3r%!s#YXlQ+ROEC#u1{i{!+bo@qfmycA^GnN@3uIX0N1?W zLV?9```LA$d-J<rC{k-`{HzzjRwS~K^V=`Z=eFtG23<Fryv`elZalJ}HKIF$)r_?- zoY5t8OaBVZkk&~yS{pe-y<}gV(>%TF%7>4^JCjz2_q{yN`B10UhJS(?i;i5>-vFSK P89ZJ6SY6gRB{Ts5(`IT* diff --git a/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/inhand-left.png b/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/inhand-left.png index 7824960e493d251aaeb612f0a063691099e8a502..98edf09fab932b4383af4fb872128de10e0c1f3f 100644 GIT binary patch literal 16598 zcmeI4O=uHA6vy9$(AqRbXb+8rnjoHn;z>)DmPAt9P?Hp?h$q|J{KA%2@Tw<8kA7eg zMC{3f2Tyv+L8??+v>rtY>Y=rio?<~1$9<9DD%s8K<n1cs8`vz&zIkunZ~mEuydhUc z@`G)Wt_T3MWrs3Hta}QtElt+vgOiiX)~%^HJeYwv^g;LNp?mwRo|cKB<5K{w9e4?t zxf8QGo2Rq6f#y%4Sh%P6?U%z{013!u(xVrINTo_8%YqvdU;<2l2`~XBzyz286JP>N zfC(@GCcp%k025#W8U&=2uzCA3#QVA>Uf0jG%BfBO><{YFm^R&zYLb}vtNZZ^gt6Ye zfhCXeby`SgklUDr#iSUS`3})-Q7DC1<@kR5y;iTio=r3~UL`6yfR5#taDLAQ%;q*L zca=#v+04za!?{yy^2XVyoQ?@6vxfS^4UMib_}Z$3ME`cUwHAT$N;{-$*r;}0U26a3 zXGc<Xm?t}O1z>b41yK2MBSNkK4EEc~xkaz@jLMH&7+(P3${pwl!QA`?EG%MuO0U`d z6nCH2b5ds%+0J5r4gI<E-+lI?&NOO2_UcCn@9FrW0DKcrG%7!CbMcPM!JAzH4ko^L z>nOmNw}9`N5(Y3Az>}8#$?91EMPTN_U;t_aSOIFB%(Y?#n7g)WnXv-YIGJn33NUwV z)iPrRsBtpaiWOk)+Nx#73Q*%@t`#f5+_hE9j1{29$(xl`C-l9-i!-8#<BI~Yx)VgR z#}Pa8S|Le`B)g6!WqG9x>2FE0+JjqGcrF3YBNPe+A>TcMzg{D-pAQJ4!c#q$aPjC; z<vf8KET?B=D}`r-@Px=u1;m7IZP00=PW`wKRO7yX`q6VfWP1R9AMFZonlN>LqjAah zfFSDnwcy#~0(`Dz;@bD$E5MZwKV$+-fC>Dw1d8jqt=8m*@qYn`Ci(p9iJNaej6X(q N*@1lK;lZ&>KLBvgf~o)j literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zPkFjHhE&XX zduy*BQ=kCrgW_KA052|`&V>r!yqmUN35vLMK-gi?(ybd60=>1h<Q*0+xylsRAmP02 zh?DeV{{<4<iz2rxB<`GkuwY*c+o3x*52tXaF)G18m$S=<!dkxdd>>y4WIFd5U;aM* zYY@MKi$ZS4mrswbDqdZ*zm74a+is6l%5SBe6&!p2#N6*sK3v4-!T(!gdc*f-onuQ` zyKVU|?5Ywj>6!CJLi?|4B>w_SA(dSYuk0Ka?T%PmFn4<FeZOYGYs?G@xlC((FY)*> z6&NzE%h{!2rN?+8rST5K)_HTS=2yFy&FbDzmd<&<HT!p~{rs(RkCqzb%O*eDFQYCz zLGD}ls&hJiY7X9WI17q||M*KZlri5TiMW%~Cgry1|I78SEYFoSpBAt?{)8|2>V{ns zp0Rl+Rem@veZKo<s{565HO0X%PG|4TdGgY)USHte6TRfspFisydi!$mg5;#!v^BmC zixQ8VRx{*m;97Q`bH_CqP9a`qedz?DBdZg0nWk+#U0%3uFXxL#->0v*p=I@aXW^Q^ eECPaSx8|>Nnq*#l%pn&T#SEUVelF{r5}E+JM&XhG diff --git a/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/inhand-right.png b/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/inhand-right.png index adb8668dc61741c07cf1c99e85373ddae80fe896..386e9983355b1152b6820c2cb200e9194d0d0c6e 100644 GIT binary patch literal 16598 zcmeI4O=uHA6vy9$(AqS;q@q!%jnz|8JefeGl1TayOOvWCB6zSK3bqxMR`gnL(z6If z5uv9lBHnrmSQOM2%*l(!j~-e@dy0A~uKNND6KLMfCYxlleGBQfGn4o6d;d&A-q5?l zss1+Kejfm|B?l5`^?M8-yPEW$i&t*s^jp*A!TtnvLJxF|^gRyiBQ4hlE=&Wow&O#< z{DYuA*gTUQ>TUk+33?;p(|u>=078&V#7Axm5sPIq`U<|7025#WOn?b60Vco%m;e)C z0!)AjFaajO1em~1A|R+_r}qLJ9BtL+vVp>~4;Lpz%lIwoDUO>Hf=m&-RK&l!j>FUJ z20S14z^gYuq0y43ax>;U#xL95Gu{o&zt0cD^Z#IFwVOt{oq;-zjYY%oej%ipg+MCc z=CMsU5y9$j!sjPzX0{wLKNA#%m+iHQ-38T}1w~f1v!|n=fc$zMzP$WKt~GO1t9h)v zp<Imn>+%{Ix3U6im4F?7WaUmR(-uhpxclG#;e-5o048ZWj+&L@2KY_JMgovYl2#lx zDaT!r0&wSFS;g%3I4ngvoZ`6Ok&8(MwCCt2la}i=X*FhYhtxFFx6wMKsqWV7lOXv) zNZn22u5>Se#ZS2|<1Bz;ecTI!0jLpR1*may?<!V+duywf87n}IlY3XO0^D0$wai!n zYMk7=iWT7A+Nx#73Q*(Z-c_ssE49V%+RVOhvtrK)Ya3Ppb`_&y0HKoyH0;e)`>K|o ziUD9prWTj%M;uPs=8|lZP+pFl@7Ayr8{ewU83OG5U<WvzP7Ceh3)}XhvK6o}^aqTp zSnbSEU`x%R5A-)Xn$_-I_1o6HvD76p-T~w@1o5q)c=Y;hskm(&$9(`#ugGTr%sN>{ z%%uV;O95C3SplVt+dW<lzh&(KaxXq^cb0@b*{|6d0K!bs)Q(p`5e@!>2`~XB&@cp| i4<m>4U<dL40@xJv?9$TTqk-r-G?(m6C7zwSbmu?vj@t?V delta 524 zcmV+n0`vXWfdQlhkR*Qrb5ch_0Itp)=>Px$-bqA3RCt{2+P_M}P!tC6?}`l;#|}CM zanJ`yz`Ax6`v6(Y;%Y&`#kn|i(9x+beE_v%XNBekib%;=2VF#wbhr-15*=>-^d_ev z=Ldn7l-`filS|17z!+nUF~%5Uj4{R-`*pej$Op*E$?W*LxrBd|vQS5q71hbNEepl~ z2%H@R4WN2_uC2JsLRo;G?a7L{2BSBE+qOhrp>%NTHsI|>wt%t#K?C^QHxV>|+St>V zE<<OV0_Y3bz5bAR9YubARdv!B02R~6)CYn|^!2n1W|yru&mARp2NX$?-0?f$KvTLL zgmXtJeFrFa_M?A2YyP_XI9xbb9^AV9=l$)Idh=FZ0!7*R!;)rJc0ineQp-*V_1_oe z9#95c0O|nLxB%1vsBr<P15o1vPzRvK1)vT<jSD~>fEpKoIsi2;0CfOrTmb3-)Djgy z2oZUYt!N6{0lI#Sg$rP`g#3RmJ_}i`vv2|Oni_@I5!-)<+P+sg7*Scjs>-SV4QH6o za|3SM5<T0K@6D!=FZbH^qSPG_p1tKUL8^^C1P$Qs;#s0Ev`uVMb%4<lvSO}b>H`jd zP7cowbS4r;OT?b~#+9lAsHVnQtedU_Li2Y=UzSAc>Qed+V2rU+`vDxI8z+%y5ZM3# O002ovPDBK*LSTX{@9<Ut diff --git a/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/meta.json b/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/meta.json index 276ae36807..30a175e77f 100644 --- a/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Scarfs/centcom.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by MrGreen06#0618 (discord)", + "copyright": "Sprited by MrGreen06#0618 (discord), resprited by SeamLesss (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/equipped-NECK.png b/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/equipped-NECK.png index 22dfcd4f0f5ddd10bf1535f1229a1062405d1119..fe49082b6b90ee981f99fed0b247f7b1d606692b 100644 GIT binary patch literal 16598 zcmeI4O=wd=5XUD)o0?EBQm9%<B?l$orIcPoXk*$mloYE)@Fu~FMM1HM7cUmUFT7X^ zN(p%Npobnpg(fF&r57O}5={;swC4(*;{3OrG&X7b_Vp#TVHRHIW#8`3>~Cl1h0fBa zm&W6rffE5D>P(ErF0&lO)zQwM?{41x#-cqn7LQSgF3_pTk+%a}bL7tGwR=RtW4L_u zX1<#%{nLr$u>WUU_u-C{S05+Wh<Ygz8=8FJ^9>H>a@<0T5>Nt4KnW-TC7=Y9z^(++ z>2&$@tykrG4Y#YW*LE*;+v!35cF%UwcW9@F)z2_^G#aJlu0Pb@moCq&tkJ{1Ac<V= zI&bPB=aOf9)qTCVpIZ1*&MbbUM0|uYRJ#bMzkkk8Lqz58v$q}VcMJdu3WWmCrH2GW zlobMqk)K&IpqUp7Ud*><3`{;Zoup^1M<gbU?;^9=Y)!x2DjWmoU;RWS9xbzyrz?R7 z-}O|0KyijWqJK3=HuQHhuKGE~#p<Fivq;7h%!JwFD*D+YZHr?77&sIPQ7#(ZP?%?z z4;mnI8!nf!)$XFbtUf#<WBQ9EvmG0?07ez!0QMp-Hvz}Rd~3Rh4aH*7*dfxbJ&uC~ zEWuj<`y8>LR4P#_m9pwzGaHu`^(NcUl@~jOemw)E%|Vk^F#xYUM0^ChX6*N7z_bE@ zcRpTwi1@8itN^G7s0U~aXt@~BDzQxGp#+qG5>Nt4KnW;;O#%Z`FZu6h>t_KrYxPbE zC;=s)1eAahPy$N8Qv#AGft1Tr1r~#eEf!rWO|8>h|K#j9a`%#|M)I;5=_*XP=9~g& zvfZ3hXse)bcq2J`G)LAJW&I3+xo!9da+Nr@fPAG$D8+Z!W?QV1Bp4hkT$qUP$&K|h z14d3njB*$>H*0HxeS1t4sX95IAkvNZS#JTD3m3#>rHEGy@ktRkM#wl$Wwn0j#&&R< zwRQzS43*#m7%-$6lNa4yN$V|8t$3bYA0-_2n<F$Ao8bP{`u~f2c)@<29@%#YOG`^- z99e<fcVk=_u%|5meK$Vj`E}I8F(B_keG7C^4^R&{*fGHRr|{NYix_~TtB}86KiT?N zzbgSHpahhF5>Nt4KnZwGAa(ZW4<2+3{};fc!JkK_d%qs<`-R~W!{f2{(d&=?0!m4h AFaQ7m delta 634 zcmV-=0)_q7fdP^QkR*Qrb5ch_0Itp)=>Px%Oi4sRRCt{2nm>x$Koo~RnN(?vL2Roa z6)scw1`@khh-+gAKEe73@d>tAquOW4vc5prBBhH_P-_H(A+?oaEM@&CyBb+m*yVlA z!{hP1r_ql$;NO5C2!bF8g77+V9Os?e$NbcH{~B+am-5%C!Kr^d@ymVwYj%yl*f76( zV!ZO0_tU>|Juu_z0o&>4%Ij98^X+Gj&Y<Ul&W<PaT#{iI|4y-;MV0e+s!nu1`6#6T z2*VJ1?tU!BPZie$IwP3`04Da_{Rk|VOY3DnRGm2Qr=%&ML8%OIcN^lG#M)!Id}2Er zHU9PiwzJ6bF%p0G?~D@60}smlT-mQ%c>@4E&m#$gT|!9H6f}&c=AlRS`K?JN0sdkG zI%BLopolPDc~<fViyi>G2Gn!S2c20bYl5PNWZ1=DY|2=-9;+Y3ah!)?h*F9)O&N_Y zBlp)h)$QxPjCu<APjCMcR6Yg3G{R)qW!_IORZr_!HNk)J%7gXBbli7>D8Od2C_ohO z{uCexf*=TjAP9mW2!bF86)D`A!k2IBe!xq$)WO=_Ir8bB`E+eLMxEQoys5hhR{shE z$38uj_XgS^j^n(^y9w4Cu$@JYQVMiN5rI+-t)R1=MZX^}?hY61+2p%|l1X5FJ*6&( zHvPO`->GswtJt#nykW=K${0E1;l{)u=%Q3cG;5-yb~$SUq9}5V95<kwDyd!UPk{p- zZXg+UOEtVT&Qbut^>+{jhyp|bZ&m?kpWDxGj{Ww3I3K@Go2W|=1VIo4LAW%30H-E3 U?Iv$M3;+NC07*qoM6N<$f_f4z%K!iX diff --git a/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/icon.png b/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/icon.png index 45069cdd79bb66fb9555c64e110de0bb3677e020..273a69bf6c1ed2b84599030122a0a535b16bb9e7 100644 GIT binary patch literal 4254 zcmeHJ&ubGw6rNORY_$>)lEo6NU{K<r{TC`(k{}ilLB&h)9H~%GJ$mz?m*!MFNI|>_ z9%B&y1g%04awsJPHo53Q1P><8H=A$Vo$il`1ur^b_wCNS_r7o5y!SSbudh`X=FiRx zAr|Vj$_*)(aGjWy_sy-XZ&J+OyIQS?F@DeAzTB2Ga}R2FHibBO23JPxJagn^_F?^+ zn;jfGJ#+EGyWNdXLgX&jE2}qe&t;Z!`(LESKRz;ly8rWy?eXTNuz91=2v1lzpV|OE zo6Y7JvREuah;q5CWUJK@Pd=+9vERIJ<=aY0d7s<>9tDi$7heln)$=?n634ZL#RI{E zJBC^3oU5$!*`bodfv2R+Z7KqA2ylcNgTU%V-WHuaAAKqFB<(1sBH*8IONBaLaKvI5 zPQST7_GGoo*IY(4^lbElH34M3<2W+OJRwEoC?B-de6?Ctl97s3o=jR3NOEEVcRHOU z_0XC%0l(%4qFq=KANM{eCo0tPi9056uh-Kch+I-0SP?+>6GUd9a8&~u!~!EZ``%Fa z)sS2fRs^se><$$GA~;(}bH`>?=rANaSQ7|_m4rAK1sp2Lgkwl0fHOpgL)p1KSzdCW z69Sy`apefzySYJPInF@Ic3`Kt0M4EtXN$@}lIq-vQA~}1&VKQ`_}kfK>CUeN)9<t; znMlCQesOTP{gOZ&a9Xqy3BWlsU58Rufcp3@`~5(ju_VTI>N7zREyt0i7?X&x1dx0n zKu37SAQ1Zj-%Vg$8L}TFjaULO(piqL+@#Ob8Gz9bVu7icA~k_-w<}7e(jj$z+xsf< zgf2xYGC~M-sP?4-x?$STWyqb-;LS!&;9t$|trgW$K?E0o5E%gDKOo8x?;HT-MH{X~ zNll>N?}yew2p<th5`knyqWS>)KY@dG*ih8a1V*D#Xq|*0NdyuRfn(DlLAeeYv@;`2 zFik*)lXFUv5G4r(BLl_YQGuAbPCLpFh<wom%mx0(r!<MsVGs~I<~$|sC{3JL0;Zx# wgboQr$$3iJQJQ{_{El`FCzMBa_}{_bj==is_dlPmp85{ly1Q0+b!Gk0FX7_w5dZ)H literal 910 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D%z&jt8|xPF`2 z@i`~qg`dMy8Rff@vKPd~j)(|u5aRmMzwtxTq&E&#FXfVNNGBYUh+Zoa-ofX8Zt{&? z87Ee|@0p{%p-*L1wfv$i=~-SPJ)7s=o?3dgF8ols)%G~kje)u=T-6sCN>7@<;#Otb z>6q*T_JLb1Jy#pp&(|=WETvqxe*gc8%l{Ym{|hVs<CpW^HSV5uz&S0mjg41+`5*qS zx$PVC$}h~bpE7k^WGdgw7(Tn<-Yee=57my{V%T$qVa-8?>B||K`xz2a8crYa-L^(; z*(`=>9Soh-43*gonK2B$4n<dsoc20uuh&+ct-{sM!Bxl3n$N%+%yjhO(sfrG=bTCH zKI~Pq*(qbbMQFFaai-j}cXRGMFTL_G{Olde1E-AFZ_%DNSEZ?3{QuXv|38-fe;4up zwe{Z{roRv9{#>E@wO;)HgQovi{r{iR_<xZ7|7M2&3mE?QGyKnI_<yG1|90R1%hmqR zVEEm`@U@2FeGbF3K!*RTC;snB{a@hxKV0ccpxiSr$s5k1`^|XvtXi_LqrNvUxiZuv z*T*r|!Q9V8&rV(W-Me=W9z58)ckjG;^GZug6B84ioSYOD6*ufVI$_DWiV1TPYP&=7 zs$8Q|%-#Lfj4XhW`~Uy{@RT@EG|wst@(Tv>2Pf!0^zJ&)l_xx1978O6w@&gFI;_Cs zyi?>^kL39mXQtX`1|LtkI?L7R3&Y989(i$wtM0L1Ej-?SnQ%SImT~%Xk(-Qq(YYLX zdW>K6HV83PT#++~+{)VHvD2FQUc-dw>2gL-?Al5Nckz2QyWDepnx-VI;$Upfkn~!n zU_I*x9>zI=S#3WizF%@wwIHrF$EEk6wL+hQ^hL(BbF*X&xev(ceeA#IUj3J?L}T)L z2A}6|b}&tL&YjP=>f4h^Tt5Fj1ix*mT*+@zd?zdJ*fzPN|F3W>7%hmkb)UBy=qCnG LS3j3^P6<r_pj7W% diff --git a/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/inhand-left.png b/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/inhand-left.png index b0eb7231ff1d75c89f083c3ff1bbefcd345d7443..35cd59aa49f727d82c52a3b1f32b25b6e60132f6 100644 GIT binary patch literal 16598 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4PvwhXc%ZVSzTBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{UwtGD?3N%Vu2?N3<?aME{-7;jEoKr`}YG?jDpb+ z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7)c?(NG;F)|NkFs z)cpDL!Hni}Um5OA&Y_z5#JH1@k#y^rh%uNHH6V|l5w&KhHR5JqRPiH4>(EvUN&zrD zZ{EEB4<0=D529gW<j|z*Cnp4{o&rFQ0HuPi%Rj+1IgWzq0hyD%<<@_t+$oU!1(Tp6 z%|b=9;6{OxzmqOIgUM@dxEMJMWOG3I8<dKu4QLVokaFNB!**Z{CMA*YaAb36;dxMC z(j)+oV=j?`SVK04+A$9^Z_t+k)F?|}p2bF!UU6bG1t><VB#Og2tipq$9e~wkgIJIz zSzr+R7sF|z0e}%C!$p8;<w|?lS^y&bG@2TS45(qNY%~Q7+o&bdW1}g6$bcHQ%0^Sb zu#H+GJvN#GhzzJ<t86p{4BMzB(qp43fXILvw#r6Rz_5*4B0V;m0*DN#VXJI31<)dD zVe18GVK%av)UbypDF8ITM-PB(&w#H>0L>D?)(0>s`@+`^fW&EqLG~c8Cm<)#sX9># zn$rW#4$~7rW|MFI-@bDf$Xb%8{iv1&K>4u@xIO?hyZisnCc1<H$R3b=Fnh_dlxise zd0sy;ksPOxrw7?ya!jCF0MKJzADah}?M=d_fPfg)0suKChEfV35I&>QqaiRF0;3@? nNJAjZ^|d3=Y2Ki70jT7}r^`bo>plE47i65LtDnm{r-UW|q(FAi delta 438 zcmV;n0ZIPWfdS70kR*Qrb5ch_0Itp)=>Px$iAh93RCt{2+A&H4Q4j{;|EawM(l406 z-orkrZIwNQN6<Sg`&#Q9z#G`uEd<%L5?DNdjD;q|!rkoKc{`E)KS&eE%w(ANnt1>b z5fKp)5fKs5s5q@aA_4&L-U|R^WrEL#Yqj{taISm03+*DZG68=kQ{?Fj+<XaHue4K~ zCK1_xilUIJs-!3iIsCrsr|a)Ss2>3UIKO`uOr}7+?R5;g#tAtBXF-*<$kPqpZZ46h z8?`tgf9@FScL4Bn54?W>b%HzRg2(ePPH2oa(I=o!;aZc_B>Dv0o<N)?Q7%C%Cvyq@ zCv1Rq0oK?6>jHnQu>sZvSYrdM3$VrpSQlW84X`f28XI6;fHgM2x&UizfOP@Z*Z}JS ztg!*s1z3yHfZZE`*fjD)X+TycF~T<Har5OMIsYUg*u4qBY!Un>pwoMR+2Yq5f)J{^ z!K<h5J>HPAGC}tEDyX+Wz^YH}2zc*hzY!kjS&Xb#y*Dn%Y7;QTCbunb2(<|qVwWEy g@8~Chh-lQl0N}JsjG?)e-~a#s07*qoM6N<$f`qEad;kCd diff --git a/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/inhand-right.png b/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/inhand-right.png index 49021629745531cbf9148c7b2f1b660fd6f9f83b..13f73766ba4141206c02631b2afbfba94a89a8cb 100644 GIT binary patch literal 16598 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4PvwhXc%ZVSzTBAf*t zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{UwtGE1U8ImK#qQ7!(*hT^vIy7#STL_U{L(7zLvt zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFp@%m5ua!O|NqaR zlsn~rtr0g^Sz=-$UiJ9Q8YnqNM*L1@!sjqX6+Z@$=g){*Gc=$3icjhAl$$qi-v0*= z9{dN<pwuwbFv#76Vul5u0#K}<5&g-q9Y`l8;!`=e<UrZh)7=g1ZbB}@8vvl>@1)Dl zVDcJL1`slAFvx@QJTT_r?oJ}$D7*nM6jK1S;D)DM0{&;f8vsKw1%Nz^?Cuel0zd(P zoN_^Yd;o7H2}({w9Z=K`80wxU#{GC3Lc|y_)YXgzz)+7tobI2jk+v7M767LrREg2l zfEpenk2jhEMqZqw`gk-2poYiD<Bg_(kr(HvJ|0a0sNpg4c%vy`<i$Cvk4IAgYIux1 z-e?LKd2x>F<Ixm=8XkmsghpHmn=rUk4A~Swt%#sF0Orr1PnU@VTG>N!0MKg<0kS=y zH4JnC*wzMsECz|g)(|i#`_g3%0mvTM+&^sg3Y+`T#RvrySt$UN|GF;!r27gIP%6mU zeDgnOEdU{p5i3tt0Dxkm47i2>G$Z@}&L(2*qDURc9*})7dnqyuNi*K5awK&qOyrqZ zdafctwim@g6mZB20OYxN3hX9XE3&;wB<semfvf;Pj)|e30<Z_msOV@2jE2By2n_ZR lc;~EM3Us44=v)9Qxz(a^e(J9C|I|UodAj<!taD0e0sx~#!V&-g literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zTRdGHLn`LH zz2%tK6d=I%;J@Q{-^uSHGafNk@x_*VA5yevYBzW+Ytv9(;F%<KXP2Sv!IIz}-&@}q z8a02^cS=v(bH7mGNF{?H6kK#J+}FIS%i{j)v_d9^C7G}O{;7X5$G+%^ZRNg0X@yQ@ zb<SZbbJ?U>1ut&W33UkxHQYA6Bjbg&-A}$WSEf1kjowXLcJKP8ckX-F^za8l@1owT zZit-o;p4xaS8@hy=XSd7RKL!6-~3(ny9p;t87}C2e`3Y(W2Uvr4;h29a$9yACb0un z4W^_JTaU4F{5@@Dw)kzsy1I_t+#BxZu}jK**?R6St3=lQ18=SJ_DQ9jjZc4f_4n0% zjAy1bpZR4N9ryh2cFU&ctQG0a^@ZmYqvW&B-rF@rlylKn$Hz7NEXS%!x9(zbaasLx zwOo1Z6OK!d*G<nXUCp;)mX!I-U)Qd#VqWu&cLQ_P3kIb{?cZ2a^e1}$;?g|=j2s3} LS3j3^P6<r_L=eV8 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/meta.json b/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/meta.json index 276ae36807..30a175e77f 100644 --- a/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Scarfs/lightblue.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by MrGreen06#0618 (discord)", + "copyright": "Sprited by MrGreen06#0618 (discord), resprited by SeamLesss (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/orange.rsi/icon.png b/Resources/Textures/Clothing/Neck/Scarfs/orange.rsi/icon.png index 4570a868962d7ce92fc47a5b80d01bd19350de0a..dad0b4b33715ad04bd4ff53b9245c2429ed9b1f4 100644 GIT binary patch literal 4254 zcmeHJF=!M)6#W-8XCfytq67<*$^#WG1dD)$dLdaPK|+LBDZxSuMM;_jIq{lct%68E zQVTZ0GL?|RP7A@HNGdUcf{L<@=e(VLn{jt$ch-Q78QA@^Gynhh{>=X~d-vSfaIJfP zw}{k&k;b@^19*0Hs`vEV+;=59r_K&H<bVWHt6!bGu130Uj9i!&*|`T#MIJ5msln<@ zFgjHI*wMGWe*ET<cT*xghl9qciOH_YK+pRxO5;ComA{Su-W6$oex<F?*R?$KSW5dV zZ2+h{gVKg1@XK|4iL9y}?LDgd*B<(j*{0R~-vGA(!^6ePfB0$pkSIlf;AX^tY|d9T z^4BnuYoGL|&$|=>I0QJB8Z80VpCY?7k$wqf^h7jRxC*5RV1HLt;$f-#_YyTLTl3j5 z*N8U(WIdu<a(PnYty#SV%#kN=a+KpKZvuI)(!k7-JR8n=mmy29IV*DinM8ZMxS-uI zVgfTqFpF)=s|GIu%zijDm(>LvC8w$gRKwDXd;;EEfas3x(}xd806ZOWrYgX=pm`H8 zmlZw%&M_;nDoLMmEF{3}N7=Ew4(`_AMdb*h%oFr&t&o6e#7L3#JoC+Yvu{?0nKz~m z`h^5=<1MNO+0VvG;I}DFV2m?QOdYeIOTf&2z5HSJ_>H}}fRQKBYOR>C8~t1YP-6rv zIRbGN^glspy_#VUz4&sn-V06w{NZ4x!x>saBtGx?O`_CizDRsSYU}LVNdT%zmaCFt z<a7aGB$pGIiUl&40Bo^*sAnc2OObw)h>@i6b<DY<=%ME%a3<8pDCFA7#AULlsPEe= zQsFs~Xc$ZG^JC&9@Zp;}!_`mb@`SWstMeR0maF;_0+=<k<MW?na1YQ9($+d`gBV-? zsb?T@n?;0_{PBEaWlUQ{i-+@&rXB2U%}IcJOG!c`LWhV9krFsPPdmyq2`2&UFO(_M zMCi~2M8q7Yq#dO<fwW?p2ptlLlH-)LqfGnV^f&*MC^zkJ%fY{1fd{_^o58KO<G>Au L#u`sgUuyjZBtTWH delta 283 zcmbQIxSDB#WIZzj1B1(wu46!ou{g-xiDBJ2nU_G0P=HT}E0AuqVp#6Ya4nJH|3UWu zn;8s#=llVRvXun+1vC5yfvU;}|9~P}JzX3_EPD4&auhnEz`>H*@V~y&(O@g%*DYHs zJd(<F++-ggcV+n8YAwcivD2R?^se-bh&6sr^^X=iUU<S#7UL;w9N*%z>8!?*&c=H! z>vw<H=G`H=eF0yd<66gN|A0(KWk<HJ8lfFqooDP7OHAWPl+8T*KykqrmD=*m&nwsT zu4p=DlAP-z{78bOy*D9gxBDUq$u0M^B%OThUN!~)Udmxsb4lmx@_KVc)u{JNm-L2( f|Iq!r(@sQaG0VrG`Gw*@FEDtz`njxgN@xNA)$DXW diff --git a/Resources/Textures/Clothing/Neck/Scarfs/orange.rsi/meta.json b/Resources/Textures/Clothing/Neck/Scarfs/orange.rsi/meta.json index 276ae36807..30a175e77f 100644 --- a/Resources/Textures/Clothing/Neck/Scarfs/orange.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Scarfs/orange.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by MrGreen06#0618 (discord)", + "copyright": "Sprited by MrGreen06#0618 (discord), resprited by SeamLesss (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/purple.rsi/icon.png b/Resources/Textures/Clothing/Neck/Scarfs/purple.rsi/icon.png index 92d9c6711344fa8e4ffd07bf3c601dfb2d3cfe97..561aa88df8f038264603ba159583becdcf2e21e7 100644 GIT binary patch literal 4254 zcmeHKO-NKx6h7lTb;dHyK<#Hx3MvR{7qbyd#&ilz!i7Q$iIzcutz5PX+61kl7OiR( zW?+jV`q>DsA|jMbZIm1f&5H6TneKPT?|HetnfE54O<kCG&b{~ieCOPA?t62!qrIiP zY*(3xlqXvgXB4f+FH)kOy?uS(6)8D)swE+H(jc+U6L*fPmFT6`?p~2CJMat1&0Do< zvGj7Xt+_N^RO`eKzaMy0B~p1PnK<6r6%Ex_j?XKJe|&`gH2#wf9hte2RjpoAR;THM zi5msmD_8-Z;?->#P&!^-UBp!8m(o&oAguYpm;Hfk2NKd2*B)^0<rv#Xn)bV*sp&BZ z0>W`M0x)!LMhvy~?u6D}_=)Zi`SNv6(;$z60Kg!eBh?smtS9PG5#35wQ`CuH777A@ z^PL+>>r_{6QyraSJntXMv9obGFaSgo+r3X&7~5!NZDru@6V0(k(my71%5ozx04jJ< z+c9gzOV(Zs+y!jC#*VnWemgA4#;d2J+8!gOW7Y^ZacueOAP@jnKMa~_&E*)yiH<-w z__br;BS3T|;fTI`00PeKi0!TbV80O<0Mfd>w8pgu=S;PiW3wgmwWBWpRzKQ~?FArk zj+-xEI|421#6@l~z5q;lMvAKEop0`&yxAFM-Iy}qeF5N&H#agWsD2K10_P?*9b=t! zV#=6&UI1qGGyTkhX#{*O$2cmTtyx<mJI~vO0KmdS2VgLrIDfR5{Y}7#S)j;PzIJpo zP<^mX_NtfI(CkC)2*n5EG(;fmeHItzwqs_BZ%A#_<KZYr@+~UzZYCm;?6-s~#wtfk zF~uejWFwbj*N6|};7VO67a9NjNs281(B-?GMaWtp5M~JbX75ASFM7y0=;KU<NGQA@ zj!_ZCsXdZXZ$40ouYX`5wUg-&y1&(Ng?LZE7>4PT;Ilj4PY0+M)%SnciKwe~T?nat zq`vEtvGbYK^ppm&5}R@byegabKZQ`F2mpFI5N;UM>AQZ>oldx%$gj+@o`F7I0|G#& z>n~)y3^Ll8p(WSh;6ye624a|Z*&>&-n3dHm08#=%X7GAt@#&*dk-{+|w)d$=YPpe| z0G@rkrz?Wg210|TLjdDCDfLJL1F!{cAT&rvq+BPZ9;t12)AM6HyY!zF(oGxuZ{Tld X;Ow>Gp7Gl+8sRtD+@84K)N|!G-mT}R delta 275 zcmV+u0qp*sA)^A28Gi!+002a!ipBr{00DDSM?wIu&K&6g000tDOjJbx002rUnU!_T zQ7x!mHL<gu+t5DfuK)l526R$RQvm<}|NsAbdEov4006B?L_t(IjlGgd62%}01$_+n zzw!q`D+QWW>f<J{TN#ouJ`MoPubf%ctQ${!Gcd7O+=Rqe1Am(n(U~K$s@{c(j{=dU z4s0oU5wRcmSfyq-J_>O>@X4?O$y3Yjv<tSoCgHdB9z;TmPRk9EehS$Nn&67=L6j<y zBY1RLgnjkyv<mSVJdT54usfjaL+W28L#Bc$_=6oOf-T=%(BGSo64rAGX{*I6d`f?g ZAB{@{qsCWZk_-R<002ovPDHLkV1n7_bQ1so diff --git a/Resources/Textures/Clothing/Neck/Scarfs/purple.rsi/meta.json b/Resources/Textures/Clothing/Neck/Scarfs/purple.rsi/meta.json index 276ae36807..30a175e77f 100644 --- a/Resources/Textures/Clothing/Neck/Scarfs/purple.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Scarfs/purple.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by MrGreen06#0618 (discord)", + "copyright": "Sprited by MrGreen06#0618 (discord), resprited by SeamLesss (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/syndiegreen.rsi/icon.png b/Resources/Textures/Clothing/Neck/Scarfs/syndiegreen.rsi/icon.png index b1bf4d39e5ab5460554ed90871773fdbe5b23148..a32113a9e1f3e397798d22890cd2828c879a5a52 100644 GIT binary patch literal 4254 zcmeHJ&rcIU6n;f0bfM5{MbjE3@t}$L2bkbNQv!{F5aK~^#=pP><AI|$&mK&S2X5Z@ z2h@WR<6THJA;xg<P&KL0vOq~&=bPo*PN%!=RuV5d&F-6>nfJbL-jA6+S(u+mI$1|V zl7-p)qLLGMhT`hIw7gtVB7XnYOkNuJt-N{pRE;Da%-&rR89s$4CeL4-RfB^M3v<(h z#S^1_m(D#~`7|ezx>CsBxP2!Pn@D{vsTKcti~Z^T2Pb2V_|}M4cO1k@q*yHWY_Dep z040;j1|)$G4-fGvkkt#w50Qh7MkL#j7HNw|FMtODV>*7-^_Nz5>XAtF`x+5C1UGjK zwcNB90(Z|dvb)_R(#>p71Yiu{BtT$-I0=u4_pL}w)*IbI(Gvk3UzK=p_3)SpMhc!R ztwB11L*qco-eAZ(G67`$$Y`HbRFcJ|FVNh#SDx#cBd*&$6p;x8A|4Iezzk6*9nM9r z0+t@!j|_)5s_R}DxMKoS0t8{}ln0SK!0d-XcU_em467#$7|H4Gxq@n_?m#QNwGeQw z$HaZ7&zLq1>}p_OK!YN-0Ow9A?W$-q5-`w`P3KRK>m|8du5Bqm_+XNKNC4a5C`nWb zLWKl24Q8`h|FdfjF#BQ5D=*QW05Hq3wf=qEIt<h)m&-m@CX<nLIxU-<o6-`3rfP7H zyF}KHT^o|UN_d%>m0_1-y<XSgK<P>VHy#phc&bS%t@`y^^V{s1z!-<8>}HO2Bw%KL zY0Z_AxNWhf@i1V3=@WE=D@9Z|{0~1a{)o{50c1WJCEbbmCq_=n_J@5vA6Am^7RoW~ zb`14^&fKkb7ZM2PK~?rUo&{ir^T2MG7thG&)uJ8_C4gBo%jseo0}*(G@uXy;a$S%# zNp&OuW!~*@C0c2%HK_=UdAl4<AWz$S(<Z(`38a3E%P;vZkh>Ru`ugc9$2(%xJ%HNg zIf3gJ%>*@pd;_Y3d|+!i2{{N^tJU-+0ttowFBvUql>hxq9e`t=kEw@^u&K+5-H?l2 zP2;dYgT!q{LL_1u#5#g<9@5l<eozbb0Aou@LL@?iAY$&+o~ItAO(K*4&u&Va2o0Km z*fGZ`sYe-^fW6QrLW2aN<TxeuC~dpP{^ma=%3~Y+Z{TlxAosrZ`t8SsN5Cyi&*xWf H-h2ET9!VY3 delta 272 zcmbQIxPWPbWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Xn;?ME0ER*5|@^i1~Ry884U~! z{QUe5cx_z=<g=Fq`2{ol2ZN>c%YFlemU+53hFJ9Oo#ZKWM1hCd@Y4VLGC2ow)QV?z z)h?c`5~RA+-v8Rqql^>9`JO)MHLnp&xKUq`)A2ZoZ4UGCK#xKhu7>2lGrZg4TmoG4 zf(r!}$L(j=eeTWgexXRMsqwR31Y42FM$T`)IG@|5a~pKsX!1I5AiD9$g4T%c2v#%J zzHmmD&@KHdG(%b^*=TL#4E2(Ibx!m2t}7ot2JcK-9p3lyJm*85S{wceW-K~#QGWw~ QPUd9rboFyt=akR{0414dM*si- diff --git a/Resources/Textures/Clothing/Neck/Scarfs/syndiegreen.rsi/meta.json b/Resources/Textures/Clothing/Neck/Scarfs/syndiegreen.rsi/meta.json index 276ae36807..30a175e77f 100644 --- a/Resources/Textures/Clothing/Neck/Scarfs/syndiegreen.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Scarfs/syndiegreen.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by MrGreen06#0618 (discord)", + "copyright": "Sprited by MrGreen06#0618 (discord), resprited by SeamLesss (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Neck/Scarfs/syndiered.rsi/icon.png b/Resources/Textures/Clothing/Neck/Scarfs/syndiered.rsi/icon.png index 67f3d270922fd6dc0275624c7e9f22149d76bf19..483a518b159f4356cf076728461c0d6a6d48e58f 100644 GIT binary patch literal 4254 zcmeHJ&ubGw7@ciQW7ckoSfeH&MGGDTp=aYkNoa#uq$uc3JPQi-)T1}g-o%49Z~g<~ zMRW2Z<XrHkjT8divPI%1&YRu0PA0S2jRh|{W%JFi?|W~)A2WS^dt=RWYpxK&Yp*vq zrCi2$d|v);ZEqh)G5_%9T2qYh_xk;t7jmZjWc~h@5GPLIbHvM6XXRw+Y5P{I)GI8` zT{`#e)5Q-$R4%uh*YDgbJIj?XeYxWwZ_b~df3@I@cH9M}?z)JT5WQY+W_vR$0Lb&a z5hQ^Jg8_yDawR~12=O@_<+7b?ld>590Ne(Q<tsmeWNQ!(bCEcfXyoV+Tt6|?T3!@_ z!$M?aKln`~%j`@9U<}|SKwyHD<6KZ<Nn%wDM_Hkmi2&k@#Dl9BbucoBWha!KQsfok z`^M_{FgF2Yy<3=zl1xfld*?^4XO09pLXn$*4UlstFhj)kX)<>eu=L=5WH`Lhjor)> z6POaf2-~zg$mIcMKMZ#96Sp*AB<G=YKdK?C9>xf`*BlXiRCf$95{Xk4i$!($AhrPK zNh!^$NR+2^#<J=B>8jdVuh%D30KyN8>_Y<B1V>4tQV=R6@Pxs5A~Oe={V=A=ODe(> z0A@Lk)xU;>Fi^+$eJj>j2sB-5m#0M5t2;lX9HFdN#<X(GB)}K1p;2ncD|c5L>s=if z^YGNPmgK-@?aahJW<L@RuB7pajdB8O_^_7=$~@r<Y12zQfOy#&PXME6B+>8|#IAoJ zy0~^@V61aLCA_tdL`-=X6oISr1y!>!z^4A;kOLaxJc)EbSiTD!a~~!1CGB9erwHI? zvo$@-d2;RpFp`UalmzC!EU5^{t1@*T-*&hXtz#q=fw69uW7g?mFUbK6^!9bBDr$S* z1>{P9FIj5HlY>-Oxbmg-9o`c%7HW?UO7e-arIS>FxfX_@dPE=*qMegVO46t;vjL8E ze!3nGVr!`chQlZ?An}@!5Q&%u3CeXyT@U)UmP&xJr6eH|p+OMQPin4HkJ2QON`QAa zrAdSabwHe$^OV%1%uT@DXcD180#S0Fl6sV;-6N0rpAzMf4gNRqw>|LqLjTdv>fH)( N+pUe}+Zzv_{Q}C@4lDow delta 272 zcmbQIxPWPbWIZzj1B1(wu46!ou{g-xiDBJ2nU_G0Xn;?ME0AvFWtWzg1~M|a*$fN} z{QUf!Y;UUq`RpY@e!&d?!C-0qvfn_VWu7jMAr`%RCwU4TQQ%=Vy!8LROwNHEwc?pw zwTow~1gS2y_rLb@DC0zNzNb%m&1(b`Zq!%gbUaRCo5OrO(4$a>t0DRC4DYr$mjKti z;6j1Lar@bIpL_GWUno**YW%Dh!B!-)k@MRx&gZu2+y-4Yn!L^%h;BTxpf#d9g4K+* zFPzaObW8sV&5+hfHd-4wL%n2QozpzM>&l0Z!8?;yhxffa&-qZN)`owA8H<iw)ZYN0 QlQ|hYUHx3vIVCg!0FL!%j{pDw diff --git a/Resources/Textures/Clothing/Neck/Scarfs/syndiered.rsi/meta.json b/Resources/Textures/Clothing/Neck/Scarfs/syndiered.rsi/meta.json index 276ae36807..30a175e77f 100644 --- a/Resources/Textures/Clothing/Neck/Scarfs/syndiered.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Scarfs/syndiered.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprited by MrGreen06#0618 (discord)", + "copyright": "Sprited by MrGreen06#0618 (discord), resprited by SeamLesss (GitHub)", "size": { "x": 32, "y": 32 From 642e3a604241b7d5c092a0c29bfcd9ce87e46c47 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 00:18:47 +0000 Subject: [PATCH 410/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 97094a293d..adc1d9a832 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Booblesnoot42 - changes: - - message: Tarantulas spawned in vents will now be hostile to the crew. - type: Fix - id: 7769 - time: '2025-01-01T16:18:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34153 - author: Booblesnoot42 changes: - message: The RCD no longer has a cooldown when opened or closed. @@ -3905,3 +3898,10 @@ id: 8269 time: '2025-04-19T20:33:54.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33336 +- author: Seam_Less + changes: + - message: Standardized the Sprites of most scarfs + type: Tweak + id: 8270 + time: '2025-04-20T00:17:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35446 From 5b3a72e9b58e897925c620641d80ece730450047 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 19 Apr 2025 20:41:15 -0400 Subject: [PATCH 411/622] Update Credits (#36748) Co-authored-by: PJBot <pieterjan.briers+bot@gmail.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 f973aeac06..19f9472ebf 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alithsko, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, ApolloVector, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, Awlod, AzzyIsNotHere, baa14453, BackeTako, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, beck-thompson, bellwetherlogic, ben, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainMaru, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, Catofquestionableethics, CatTheSystem, centcomofficer24, Centronias, Chaboricks, chairbender, Chaoticaa, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, civilCornball, claustro305, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, dinnercalzone, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Helm4142, Henry, HerCoyote23, HighTechPuddle, hitomishirichan, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, htmlsystem, hubismal, Hugal31, Huxellberger, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, Litraxx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, Lusatia, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OnyxTheBrave, Orange-Winds, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, philingham, Phill101, phunnyguy, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, PROG-MohamedDwidar, prole0, Pronana, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, Quantum-cross, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SignalWalker, siigiil, silicon14wastaken, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, sowelipililimute, Soydium, spacelizard, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, stellar-novas, stewie523, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, supergdpwyl, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, Vexerot, viceemargo, VigersRay, violet754, Visne, vlados1408, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex +0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, aaron, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alithsko, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, ApolloVector, Appiah, ar4ill, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, Awlod, AzzyIsNotHere, azzyisnothere, B-Kirill, baa14453, BackeTako, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, beck-thompson, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainMaru, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, Catofquestionableethics, CatTheSystem, centcomofficer24, Centronias, Chaboricks, chairbender, Chaoticaa, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, civilCornball, claustro305, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, crazybrain23, Crazydave91920, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, cryals, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, dinnercalzone, DinoWattz, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Helm4142, Henry, HerCoyote23, HighTechPuddle, hitomishirichan, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, htmlsystem, hubismal, Hugal31, Huxellberger, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JohnGinnane, johnku1, Jophire, joshepvodka, jproads, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, liltenhead, linkbro1, LinkUyx, Litraxx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, Lusatia, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnyxTheBrave, Orange-Winds, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, philingham, Phill101, phunnyguy, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, PROG-MohamedDwidar, prole0, Pronana, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, Quantum-cross, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, SignalWalker, siigiil, silicon14wastaken, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, sowelipililimute, Soydium, spacelizard, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, stellar-novas, stewie523, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, supergdpwyl, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, Vexerot, viceemargo, VigersRay, violet754, Visne, vlados1408, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, wtcwr68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, yuriykiss, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex From f04f19a7aa0259eee9acbb61948126f9ac224589 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 19 Apr 2025 21:00:23 -0400 Subject: [PATCH 412/622] Fix ore silo clients showing up when out of range (#36741) --- Content.Server/Materials/OreSiloSystem.cs | 6 +++++- Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Content.Server/Materials/OreSiloSystem.cs b/Content.Server/Materials/OreSiloSystem.cs index 87e6db16cf..a0aab4fcae 100644 --- a/Content.Server/Materials/OreSiloSystem.cs +++ b/Content.Server/Materials/OreSiloSystem.cs @@ -39,6 +39,10 @@ public sealed class OreSiloSystem : SharedOreSiloSystem if (client.Comp.Silo is not null) continue; + // Don't show clients on the screen if we can't link them. + if (!CanTransmitMaterials((ent, ent, xform), client)) + continue; + var netEnt = GetNetEntity(client); var name = Identity.Name(client, EntityManager); var beacon = _navMap.GetNearestBeaconString(client.Owner, onlyName: true); @@ -58,7 +62,7 @@ public sealed class OreSiloSystem : SharedOreSiloSystem var netEnt = GetNetEntity(client); var name = Identity.Name(client, EntityManager); var beacon = _navMap.GetNearestBeaconString(client, onlyName: true); - var inRange = CanTransmitMaterials((ent, ent), client); + var inRange = CanTransmitMaterials((ent, ent, xform), client); var txt = Loc.GetString("ore-silo-ui-itemlist-entry", ("name", name), diff --git a/Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs b/Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs index 729a710065..33168db1db 100644 --- a/Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs +++ b/Content.Shared/Materials/OreSilo/SharedOreSiloSystem.cs @@ -149,9 +149,9 @@ public abstract class SharedOreSiloSystem : EntitySystem /// Checks if a given client fulfills the criteria to link/receive materials from an ore silo. /// </summary> [PublicAPI] - public bool CanTransmitMaterials(Entity<OreSiloComponent?> silo, EntityUid client) + public bool CanTransmitMaterials(Entity<OreSiloComponent?, TransformComponent?> silo, EntityUid client) { - if (!Resolve(silo, ref silo.Comp)) + if (!Resolve(silo, ref silo.Comp1, ref silo.Comp2)) return false; if (!_powerReceiver.IsPowered(silo.Owner)) @@ -160,7 +160,7 @@ public abstract class SharedOreSiloSystem : EntitySystem if (_transform.GetGrid(client) != _transform.GetGrid(silo.Owner)) return false; - if (!_transform.InRange(silo.Owner, client, silo.Comp.Range)) + if (!_transform.InRange((silo.Owner, silo.Comp2), client, silo.Comp1.Range)) return false; return true; From 07e21c65169327d87dfb93338191f5a1e83c17e4 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 19 Apr 2025 21:00:49 -0400 Subject: [PATCH 413/622] Fix artifact spawns parenting to players (#36745) --- .../Spawners/EntitySystems/ConditionalSpawnerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs b/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs index ad59fc83cf..7331894bcf 100644 --- a/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs +++ b/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs @@ -135,7 +135,7 @@ namespace Content.Server.Spawners.EntitySystems var yOffset = _robustRandom.NextFloat(-ent.Comp.Offset, ent.Comp.Offset); var trueCoords = coords.Offset(new Vector2(xOffset, yOffset)); - Spawn(proto, trueCoords); + SpawnAtPosition(proto, trueCoords); } } } From a90c16b8d110d51bcc3b848ee82e02162bd21be7 Mon Sep 17 00:00:00 2001 From: shibe <95730644+shibechef@users.noreply.github.com> Date: Sat, 19 Apr 2025 22:26:10 -0400 Subject: [PATCH 414/622] Add one word to the dragon summon announcement (#36749) terror!!!! --- Resources/Locale/en-US/communications/terror.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/communications/terror.ftl b/Resources/Locale/en-US/communications/terror.ftl index 4bc80c0bd6..4daab9de6d 100644 --- a/Resources/Locale/en-US/communications/terror.ftl +++ b/Resources/Locale/en-US/communications/terror.ftl @@ -1,2 +1,2 @@ -terror-dragon = Attention crew, it appears that someone on your station has made an unexpected communication with a strange fish in nearby space. +terror-dragon = Attention crew, it appears that someone on your station has made an unexpected communication with a strange man-eating fish in nearby space. terror-revenant = Attention crew, it appears that someone on your station has made an unexpected communication with an otherworldly energy in nearby space. From 44925b9be7b5d9b48013b63fceb33335c60ddbc3 Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Sat, 19 Apr 2025 19:41:24 -0700 Subject: [PATCH 415/622] Fix spray nozzle not cleaning reagents properly (#35950) * init, god help us all * further refining * final round of bugfixes * whoopsies * To file scoped namespace * first review * oopsie * oopsie woopsie * pie is on my face * persistence * datafieldn't * make PreviousTileRef nullable * change component to file scoped namespace * Minor tweaks: - We clamp the reaction amount to a minimum value because when working with percentages and dividing, we approach numbers like 0.01 and never actually properly delete the entity (because we check for zero). This allows us to react with a minimum amount and cleans things up nicely. - Minor clarification to comments. - Rebalancing of the spray nozzle projectile. * the scug lies!!!! * undo file scoped namespace in system * kid named warning --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> --- .../Chemistry/Components/VaporComponent.cs | 30 ++++- .../Chemistry/EntitySystems/VaporSystem.cs | 106 +++++++++++------- .../Objects/Specific/Janitorial/spray.yml | 4 +- .../Weapons/Guns/Projectiles/projectiles.yml | 1 + 4 files changed, 94 insertions(+), 47 deletions(-) diff --git a/Content.Server/Chemistry/Components/VaporComponent.cs b/Content.Server/Chemistry/Components/VaporComponent.cs index a2f4a01a2a..1bc3881b1d 100644 --- a/Content.Server/Chemistry/Components/VaporComponent.cs +++ b/Content.Server/Chemistry/Components/VaporComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.FixedPoint; +using Robust.Shared.Map; namespace Content.Server.Chemistry.Components { @@ -7,11 +7,31 @@ namespace Content.Server.Chemistry.Components { public const string SolutionName = "vapor"; - [DataField("transferAmount")] - public FixedPoint2 TransferAmount = FixedPoint2.New(0.5); + /// <summary> + /// Stores data on the previously reacted tile. We only want to do reaction checks once per tile. + /// </summary> + [DataField] + public TileRef? PreviousTileRef; - public float ReactTimer; - [DataField("active")] + /// <summary> + /// Percentage of the reagent that is reacted with the TileReaction. + /// <example> + /// 0.5 = 50% of the reagent is reacted. + /// </example> + /// </summary> + [DataField] + public float TransferAmountPercentage; + + /// <summary> + /// The minimum amount of the reagent that will be reacted with the TileReaction. + /// We do this to prevent floating point issues. A reagent with a low percentage transfer amount will + /// transfer 0.01~ forever and never get deleted. + /// <remarks>Defaults to 0.05 if not defined, a good general value.</remarks> + /// </summary> + [DataField] + public float MinimumTransferAmount = 0.05f; + + [DataField] public bool Active; } } diff --git a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs index c9b64e649e..55489e0b31 100644 --- a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs @@ -30,8 +30,6 @@ namespace Content.Server.Chemistry.EntitySystems [Dependency] private readonly ReactiveSystem _reactive = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; - private const float ReactTime = 0.125f; - public override void Initialize() { base.Initialize(); @@ -50,13 +48,19 @@ namespace Content.Server.Chemistry.EntitySystems } // Check for collision with a impassable object (e.g. wall) and stop - if ((args.OtherFixture.CollisionLayer & (int) CollisionGroup.Impassable) != 0 && args.OtherFixture.Hard) + if ((args.OtherFixture.CollisionLayer & (int)CollisionGroup.Impassable) != 0 && args.OtherFixture.Hard) { EntityManager.QueueDeleteEntity(entity); } } - public void Start(Entity<VaporComponent> vapor, TransformComponent vaporXform, Vector2 dir, float speed, MapCoordinates target, float aliveTime, EntityUid? user = null) + public void Start(Entity<VaporComponent> vapor, + TransformComponent vaporXform, + Vector2 dir, + float speed, + MapCoordinates target, + float aliveTime, + EntityUid? user = null) { vapor.Comp.Active = true; var despawn = EnsureComp<TimedDespawnComponent>(vapor); @@ -83,7 +87,9 @@ namespace Content.Server.Chemistry.EntitySystems return false; } - if (!_solutionContainerSystem.TryGetSolution(vapor.Owner, VaporComponent.SolutionName, out var vaporSolution)) + if (!_solutionContainerSystem.TryGetSolution(vapor.Owner, + VaporComponent.SolutionName, + out var vaporSolution)) { return false; } @@ -93,53 +99,71 @@ namespace Content.Server.Chemistry.EntitySystems public override void Update(float frameTime) { + base.Update(frameTime); + + // Enumerate over all VaporComponents var query = EntityQueryEnumerator<VaporComponent, SolutionContainerManagerComponent, TransformComponent>(); while (query.MoveNext(out var uid, out var vaporComp, out var container, out var xform)) { - foreach (var (_, soln) in _solutionContainerSystem.EnumerateSolutions((uid, container))) + // Return early if we're not active + if (!vaporComp.Active) + continue; + + // Get the current location of the vapor entity first + if (TryComp(xform.GridUid, out MapGridComponent? gridComp)) { - Update(frameTime, (uid, vaporComp), soln, xform); - } - } - } + var tile = _map.GetTileRef(xform.GridUid.Value, gridComp, xform.Coordinates); - private void Update(float frameTime, Entity<VaporComponent> ent, Entity<SolutionComponent> soln, TransformComponent xform) - { - var (entity, vapor) = ent; - if (!vapor.Active) - return; + // Check if the tile is a tile we've reacted with previously. If so, skip it. + // If we have no previous tile reference, we don't return so we can save one. + if (vaporComp.PreviousTileRef != null && tile == vaporComp.PreviousTileRef) + continue; - vapor.ReactTimer += frameTime; - - var contents = soln.Comp.Solution; - if (vapor.ReactTimer >= ReactTime && TryComp(xform.GridUid, out MapGridComponent? gridComp)) - { - vapor.ReactTimer = 0; - - var tile = _map.GetTileRef(xform.GridUid.Value, gridComp, xform.Coordinates); - foreach (var reagentQuantity in contents.Contents.ToArray()) - { - if (reagentQuantity.Quantity == FixedPoint2.Zero) continue; - var reagent = _protoManager.Index<ReagentPrototype>(reagentQuantity.Reagent.Prototype); - - var reaction = - reagent.ReactionTile(tile, (reagentQuantity.Quantity / vapor.TransferAmount) * 0.25f, EntityManager, reagentQuantity.Reagent.Data); - - if (reaction > reagentQuantity.Quantity) + // Enumerate over all the reagents in the vapor entity solution + foreach (var (_, soln) in _solutionContainerSystem.EnumerateSolutions((uid, container))) { - Log.Error($"Tried to tile react more than we have for reagent {reagentQuantity}. Found {reaction} and we only have {reagentQuantity.Quantity}"); - reaction = reagentQuantity.Quantity; + // Iterate over the reagents in the solution + // Reason: Each reagent in our solution may have a unique TileReaction + // In this instance, we check individually for each reagent's TileReaction + // This is not doing chemical reactions! + var contents = soln.Comp.Solution; + foreach (var reagentQuantity in contents.Contents.ToArray()) + { + // Check if the reagent is empty + if (reagentQuantity.Quantity == FixedPoint2.Zero) + continue; + + var reagent = _protoManager.Index<ReagentPrototype>(reagentQuantity.Reagent.Prototype); + + // Limit the reaction amount to a minimum value to ensure no floating point funnies. + // Ex: A solution with a low percentage transfer amount will slowly approach 0.01... and never get deleted + var clampedAmount = Math.Max( + (float)reagentQuantity.Quantity * vaporComp.TransferAmountPercentage, + vaporComp.MinimumTransferAmount); + + // Preform the reagent's TileReaction + var reaction = + reagent.ReactionTile(tile, + clampedAmount, + EntityManager, + reagentQuantity.Reagent.Data); + + if (reaction > reagentQuantity.Quantity) + reaction = reagentQuantity.Quantity; + + _solutionContainerSystem.RemoveReagent(soln, reagentQuantity.Reagent, reaction); + } + + // Delete the vapor entity if it has no contents + if (contents.Volume == 0) + EntityManager.QueueDeleteEntity(uid); + } - _solutionContainerSystem.RemoveReagent(soln, reagentQuantity.Reagent, reaction); + // Set the previous tile reference to the current tile + vaporComp.PreviousTileRef = tile; } } - - if (contents.Volume == 0) - { - // Delete this - EntityManager.QueueDeleteEntity(entity); - } } } } diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml index 2f91f0c0f8..e8a5ff22bb 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml @@ -99,8 +99,8 @@ - type: Tag tags: - Spray -# Vapor +# Vapor - type: entity id: Vapor name: "vapor" @@ -111,6 +111,8 @@ vapor: maxVol: 50 - type: Vapor + active: true + transferAmountPercentage: 0.5 - type: AnimationPlayer - type: Sprite sprite: Effects/chempuff.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 4d7ef02f8a..31767ba8b3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -936,6 +936,7 @@ - BulletImpassable - type: Vapor active: true + transferAmountPercentage: 1 - type: Appearance - type: VaporVisuals From 89d0eb140e355a76a28991eb067831811585555d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 02:42:30 +0000 Subject: [PATCH 416/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index adc1d9a832..1efbac66ff 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Booblesnoot42 - changes: - - message: The RCD no longer has a cooldown when opened or closed. - type: Fix - id: 7770 - time: '2025-01-01T16:19:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34149 - author: lzk228 changes: - message: Decreased HP for rusted wall variants @@ -3905,3 +3898,11 @@ id: 8270 time: '2025-04-20T00:17:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35446 +- author: ArtisticRoomba + changes: + - message: Fixed backpack water tanks (spray nozzle) projectiles not properly cleaning + up puddles. + type: Fix + id: 8271 + time: '2025-04-20T02:41:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35950 From 2c54ec10c6e9c3881f44df9233cd96c3e4d6f45b Mon Sep 17 00:00:00 2001 From: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:14:58 -0400 Subject: [PATCH 417/622] replace obsolete IsGrid calls with HasComp<MapGridComponent> (#36729) * replace obsolete IsGrid calls with HasComp<MapGridComponent> * remove IMapManager dependency * well would you look at that * just look at it --- .../Atmos/EntitySystems/GasTileOverlaySystem.cs | 8 +++++++- .../Movement/Systems/SharedMoverController.Input.cs | 2 +- Content.Shared/Movement/Systems/SharedMoverController.cs | 1 - 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs index c714acb2f3..ae067d5523 100644 --- a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -16,6 +16,7 @@ using Robust.Shared; using Robust.Shared.Configuration; using Robust.Shared.Enums; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Threading; using Robust.Shared.Timing; @@ -60,6 +61,7 @@ namespace Content.Server.Atmos.EntitySystems private float _updateInterval; private int _thresholds; + private EntityQuery<MapGridComponent> _gridQuery; private EntityQuery<GasTileOverlayComponent> _query; public override void Initialize() @@ -76,6 +78,7 @@ namespace Content.Server.Atmos.EntitySystems MapManager = _mapManager, ChunkViewerPool = _chunkViewerPool, LastSentChunks = _lastSentChunks, + GridQuery = _gridQuery, }; _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; @@ -86,6 +89,7 @@ namespace Content.Server.Atmos.EntitySystems SubscribeLocalEvent<RoundRestartCleanupEvent>(Reset); SubscribeLocalEvent<GasTileOverlayComponent, ComponentStartup>(OnStartup); _query = GetEntityQuery<GasTileOverlayComponent>(); + _gridQuery = GetEntityQuery<MapGridComponent>(); } private void OnStartup(EntityUid uid, GasTileOverlayComponent component, ComponentStartup args) @@ -375,6 +379,8 @@ namespace Content.Server.Atmos.EntitySystems public Dictionary<ICommonSession, Dictionary<NetEntity, HashSet<Vector2i>>> LastSentChunks; public List<ICommonSession> Sessions; + public EntityQuery<MapGridComponent> GridQuery; + public void Execute(int index) { var playerSession = Sessions[index]; @@ -391,7 +397,7 @@ namespace Content.Server.Atmos.EntitySystems previouslySent.Remove(netGrid); // If grid was deleted then don't worry about sending it to the client. - if (!EntManager.TryGetEntity(netGrid, out var gridId) || !MapManager.IsGrid(gridId.Value)) + if (!EntManager.TryGetEntity(netGrid, out var gridId) || GridQuery.HasComp(gridId.Value)) ev.RemovedChunks[netGrid] = oldIndices; else { diff --git a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs index 14c8036287..87849e8f12 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs @@ -214,7 +214,7 @@ namespace Content.Shared.Movement.Systems } // If we went from grid -> grid OR grid -> map then snap the target to cardinal and lerp there. // OR just rotate to zero (depending on cvar) - else if (relative != null && _mapManager.IsGrid(relative.Value)) + else if (relative != null && MapGridQuery.HasComp(relative.Value)) { if (CameraRotationLocked) targetRotation = Angle.Zero; diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index a5c32b2992..a98fc633d0 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -35,7 +35,6 @@ public abstract partial class SharedMoverController : VirtualController { [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] protected readonly IGameTiming Timing = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly InventorySystem _inventory = default!; From 31cf0505c93d33e08fbe712a6819461099957908 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Sun, 20 Apr 2025 00:16:59 -0400 Subject: [PATCH 418/622] Convert `NameIdentifier` to use `NameModifierSystem` (#36736) Convert NameIdentifier to use NameModifierSystem --- .../Silicons/Borgs/BorgMenu.xaml.cs | 8 +++--- .../NameIdentifier/NameIdentifierSystem.cs | 25 ++++++++++++++----- .../Silicons/Borgs/BorgSystem.Ui.cs | 2 -- .../en-US/name-identifier/name-identifier.ftl | 2 ++ 4 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 Resources/Locale/en-US/name-identifier/name-identifier.ftl diff --git a/Content.Client/Silicons/Borgs/BorgMenu.xaml.cs b/Content.Client/Silicons/Borgs/BorgMenu.xaml.cs index b8f0e69c02..007a0cc5cb 100644 --- a/Content.Client/Silicons/Borgs/BorgMenu.xaml.cs +++ b/Content.Client/Silicons/Borgs/BorgMenu.xaml.cs @@ -1,6 +1,7 @@ using Content.Client.Stylesheets; using Content.Client.UserInterface.Controls; using Content.Shared.NameIdentifier; +using Content.Shared.NameModifier.EntitySystems; using Content.Shared.Preferences; using Content.Shared.Silicons.Borgs; using Content.Shared.Silicons.Borgs.Components; @@ -15,6 +16,7 @@ namespace Content.Client.Silicons.Borgs; public sealed partial class BorgMenu : FancyWindow { [Dependency] private readonly IEntityManager _entity = default!; + private readonly NameModifierSystem _nameModifier; public Action? BrainButtonPressed; public Action? EjectBatteryButtonPressed; @@ -32,6 +34,8 @@ public sealed partial class BorgMenu : FancyWindow RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + _nameModifier = _entity.System<NameModifierSystem>(); + _lastValidName = NameLineEdit.Text; EjectBatteryButton.OnPressed += _ => EjectBatteryButtonPressed?.Invoke(); @@ -54,9 +58,7 @@ public sealed partial class BorgMenu : FancyWindow NameIdentifierLabel.Visible = true; NameIdentifierLabel.Text = nameIdentifierComponent.FullIdentifier; - var fullName = _entity.GetComponent<MetaDataComponent>(Entity).EntityName; - var name = fullName.Substring(0, fullName.Length - nameIdentifierComponent.FullIdentifier.Length - 1); - NameLineEdit.Text = name; + NameLineEdit.Text = _nameModifier.GetBaseName(entity); } else { diff --git a/Content.Server/NameIdentifier/NameIdentifierSystem.cs b/Content.Server/NameIdentifier/NameIdentifierSystem.cs index 273e9407fd..0a9f87557a 100644 --- a/Content.Server/NameIdentifier/NameIdentifierSystem.cs +++ b/Content.Server/NameIdentifier/NameIdentifierSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.GameTicking; using Content.Shared.NameIdentifier; +using Content.Shared.NameModifier.EntitySystems; using Robust.Shared.Collections; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -13,7 +14,7 @@ public sealed class NameIdentifierSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; - [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly NameModifierSystem _nameModifier = default!; /// <summary> /// Free IDs available per <see cref="NameIdentifierGroupPrototype"/>. @@ -27,6 +28,7 @@ public sealed class NameIdentifierSystem : EntitySystem SubscribeLocalEvent<NameIdentifierComponent, MapInitEvent>(OnMapInit); SubscribeLocalEvent<NameIdentifierComponent, ComponentShutdown>(OnComponentShutdown); + SubscribeLocalEvent<NameIdentifierComponent, RefreshNameModifiersEvent>(OnRefreshNameModifiers); SubscribeLocalEvent<RoundRestartCleanupEvent>(CleanupIds); SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnReloadPrototypes); @@ -44,6 +46,7 @@ public sealed class NameIdentifierSystem : EntitySystem ids[randomIndex] = component.Identifier; ids.Add(random); } + _nameModifier.RefreshNameModifiers(uid); } /// <summary> @@ -108,12 +111,22 @@ public sealed class NameIdentifierSystem : EntitySystem ? uniqueName : $"({uniqueName})"; - var meta = MetaData(uid); - // "DR-1234" as opposed to "drone (DR-1234)" - _metaData.SetEntityName(uid, group.FullName - ? uniqueName - : $"{meta.EntityName} ({uniqueName})", meta); Dirty(uid, component); + _nameModifier.RefreshNameModifiers(uid); + } + + private void OnRefreshNameModifiers(Entity<NameIdentifierComponent> ent, ref RefreshNameModifiersEvent args) + { + // Don't apply the modifier if the component is being removed + if (ent.Comp.LifeStage > ComponentLifeStage.Running) + return; + + if (!_prototypeManager.TryIndex<NameIdentifierGroupPrototype>(ent.Comp.Group, out var group)) + return; + var format = group.FullName ? "name-identifier-format-full" : "name-identifier-format-append"; + // We apply the modifier with a low priority to keep it near the base name + // "Beep (Si-4562) the zombie" instead of "Beep the zombie (Si-4562)" + args.AddModifier(format, -10, ("identifier", ent.Comp.FullIdentifier)); } private void InitialSetupPrototypes() diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs index 40c2c3bf33..9f9977cddc 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs @@ -62,8 +62,6 @@ public sealed partial class BorgSystem } var name = args.Name.Trim(); - if (TryComp<NameIdentifierComponent>(uid, out var identifier)) - name = $"{name} {identifier.FullIdentifier}"; var metaData = MetaData(uid); diff --git a/Resources/Locale/en-US/name-identifier/name-identifier.ftl b/Resources/Locale/en-US/name-identifier/name-identifier.ftl new file mode 100644 index 0000000000..e0c05e51d3 --- /dev/null +++ b/Resources/Locale/en-US/name-identifier/name-identifier.ftl @@ -0,0 +1,2 @@ +name-identifier-format-append = {$baseName} {$identifier} +name-identifier-format-full = {$identifier} From 1aa397bcd691d01448f5a2aaf47a0026adf36f2d Mon Sep 17 00:00:00 2001 From: Spessmann <156740760+Spessmann@users.noreply.github.com> Date: Sat, 19 Apr 2025 21:27:20 -0700 Subject: [PATCH 419/622] Add More Ruins (#36752) --- Resources/Maps/Lavaland/hermit_base.yml | 1263 ++++ Resources/Maps/Lavaland/labour_camp.yml | 2772 +++++++++ Resources/Maps/Lavaland/miner_tomb.yml | 388 ++ Resources/Maps/Lavaland/mining_outpost.yml | 6158 ++++++++++++++++++++ Resources/Maps/Lavaland/pizza_party.yml | 668 +++ Resources/Maps/Lavaland/ripley.yml | 184 + 6 files changed, 11433 insertions(+) create mode 100644 Resources/Maps/Lavaland/hermit_base.yml create mode 100644 Resources/Maps/Lavaland/labour_camp.yml create mode 100644 Resources/Maps/Lavaland/miner_tomb.yml create mode 100644 Resources/Maps/Lavaland/mining_outpost.yml create mode 100644 Resources/Maps/Lavaland/pizza_party.yml create mode 100644 Resources/Maps/Lavaland/ripley.yml diff --git a/Resources/Maps/Lavaland/hermit_base.yml b/Resources/Maps/Lavaland/hermit_base.yml new file mode 100644 index 0000000000..5751345878 --- /dev/null +++ b/Resources/Maps/Lavaland/hermit_base.yml @@ -0,0 +1,1263 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 02:42:21 + entityCount: 207 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 0: Space + 5: FloorAsteroidSandUnvariantized + 1: FloorBasalt + 4: FloorMining + 3: FloorShuttleBlue + 2: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -1.1145834,-0.7083334 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAADAwAAAAACAwAAAAACAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABQAAAAAABQAAAAAABQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABQAAAAAABQAAAAAABQAAAAAABQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABQAAAAAABQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,1: + ind: 0,1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Basalt1 + decals: + 1: 0,4 + - node: + color: '#FFFFFFFF' + id: Basalt2 + decals: + 2: 4,2 + - node: + color: '#FFFFFFFF' + id: Basalt8 + decals: + 3: 9,15 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 65520 + 0,1: + 0: 6143 + 0,2: + 0: 1 + 1,0: + 0: 65520 + 1,1: + 0: 61157 + 1,2: + 0: 52969 + 2,0: + 0: 49136 + 2,1: + 0: 12801 + 2,2: + 0: 14195 + 2,3: + 0: 28671 + 3,0: + 0: 768 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirlockMining + entities: + - uid: 85 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,4.5 + parent: 1 +- proto: AirlockShuttle + entities: + - uid: 12 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,2.5 + parent: 1 +- proto: AsteroidRock + entities: + - uid: 13 + components: + - type: Transform + pos: 15.5,3.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 15.5,2.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 15.5,1.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 15.5,4.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 15.5,5.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 15.5,6.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 15.5,7.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 15.5,8.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 15.5,9.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 15.5,10.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 15.5,11.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 15.5,12.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 15.5,13.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 15.5,14.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 15.5,15.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 15.5,16.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 12.5,4.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 12.5,5.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 12.5,7.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 12.5,8.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 12.5,9.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 12.5,10.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: 12.5,11.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 12.5,12.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 12.5,13.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 12.5,14.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 12.5,15.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 12.5,16.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 13.5,4.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 13.5,5.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 13.5,6.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 13.5,8.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 13.5,9.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 13.5,10.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 13.5,12.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 13.5,13.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 13.5,14.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 13.5,15.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 13.5,16.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 14.5,4.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 14.5,5.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 14.5,6.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 14.5,7.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 14.5,8.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 14.5,9.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 14.5,10.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 14.5,11.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 14.5,12.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 14.5,13.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 14.5,14.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 14.5,15.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 14.5,16.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 11.5,16.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 11.5,15.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 11.5,10.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 11.5,9.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 11.5,8.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 11.5,7.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 11.5,6.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 11.5,4.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 9.5,4.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 9.5,16.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: 8.5,16.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 7.5,16.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 6.5,16.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 5.5,16.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 4.5,16.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: 3.5,16.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 2.5,16.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 1.5,16.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 0.5,16.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: 0.5,15.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 1.5,15.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 2.5,15.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: 3.5,15.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: 4.5,15.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: 5.5,15.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: 6.5,15.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: 7.5,15.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: 8.5,15.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: 7.5,14.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 7.5,13.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 6.5,14.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 6.5,13.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: 5.5,14.5 + parent: 1 + - uid: 129 + components: + - type: Transform + pos: 5.5,13.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: 4.5,14.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: 4.5,13.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: 3.5,14.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: 3.5,13.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: 2.5,14.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: 2.5,13.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: 1.5,14.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: 1.5,13.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: 0.5,14.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: 0.5,13.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: 6.5,12.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 153 + components: + - type: Transform + pos: 4.5,9.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: 3.5,8.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 +- proto: BasaltFour + entities: + - uid: 205 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 +- proto: BasaltOne + entities: + - uid: 206 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 204 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 +- proto: Bed + entities: + - uid: 169 + components: + - type: Transform + pos: 9.5,8.5 + parent: 1 +- proto: BedsheetBlack + entities: + - uid: 170 + components: + - type: Transform + pos: 9.5,8.5 + parent: 1 +- proto: Bucket + entities: + - uid: 195 + components: + - type: Transform + pos: 8.5,13.5 + parent: 1 +- proto: ChairPilotSeat + entities: + - uid: 6 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 12.5,2.5 + parent: 1 + - uid: 11 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,2.5 + parent: 1 + - uid: 180 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,6.5 + parent: 1 +- proto: ChanterelleSeeds + entities: + - uid: 198 + components: + - type: Transform + pos: 6.2880387,11.378061 + parent: 1 + - uid: 199 + components: + - type: Transform + pos: 6.4130387,11.581764 + parent: 1 + - uid: 200 + components: + - type: Transform + pos: 6.7000756,11.5123205 + parent: 1 +- proto: ClothingHeadHelmetEVA + entities: + - uid: 189 + components: + - type: Transform + pos: 9.5,15.5 + parent: 1 +- proto: ClothingMaskBreath + entities: + - uid: 190 + components: + - type: Transform + pos: 9.5,15.5 + parent: 1 +- proto: ClothingOuterHardsuitEVA + entities: + - uid: 188 + components: + - type: Transform + pos: 10.5,15.5 + parent: 1 +- proto: ClothingShoesBootsMag + entities: + - uid: 193 + components: + - type: Transform + pos: 10.569324,10.612394 + parent: 1 +- proto: ComputerBroken + entities: + - uid: 181 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 +- proto: Crowbar + entities: + - uid: 178 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 +- proto: FloorWaterEntity + entities: + - uid: 196 + components: + - type: Transform + pos: 9.5,13.5 + parent: 1 +- proto: FlyAmanitaSeeds + entities: + - uid: 202 + components: + - type: Transform + pos: 6.579705,11.373431 + parent: 1 +- proto: Grille + entities: + - uid: 2 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,2.5 + parent: 1 +- proto: hydroponicsSoil + entities: + - uid: 171 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 +- proto: HydroponicsToolMiniHoe + entities: + - uid: 203 + components: + - type: Transform + pos: 6.7139645,11.345654 + parent: 1 +- proto: Lantern + entities: + - uid: 176 + components: + - type: Transform + pos: 11.5,12.5 + parent: 1 +- proto: LingzhiSeeds + entities: + - uid: 201 + components: + - type: Transform + pos: 6.718594,11.655839 + parent: 1 +- proto: MedkitFilled + entities: + - uid: 194 + components: + - type: Transform + pos: 10.5,10.5 + parent: 1 +- proto: OxygenTankFilled + entities: + - uid: 192 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 +- proto: Pickaxe + entities: + - uid: 191 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 +- proto: Rack + entities: + - uid: 173 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: 10.5,10.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 +- proto: Shovel + entities: + - uid: 184 + components: + - type: Transform + pos: 10.5,14.5 + parent: 1 +- proto: ShuttleWindow + entities: + - uid: 4 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,2.5 + parent: 1 +- proto: SmallLight + entities: + - uid: 185 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,6.5 + parent: 1 +- proto: Spaceshroom + entities: + - uid: 186 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: 11.5,13.5 + parent: 1 +- proto: SurvivalKnife + entities: + - uid: 183 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 +- proto: Table + entities: + - uid: 182 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 179 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 +- proto: Thruster + entities: + - uid: 15 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,3.5 + parent: 1 +- proto: ToolboxMechanicalFilledAllTools + entities: + - uid: 197 + components: + - type: Transform + pos: 10.5,12.5 + parent: 1 +- proto: VendingMachineSustenance + entities: + - uid: 177 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 +- proto: WallAsteroidCobblebrick + entities: + - uid: 98 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 10.5,8.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 7.5,12.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 10.5,16.5 + parent: 1 +- proto: WallMining + entities: + - uid: 86 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,4.5 + parent: 1 + - uid: 87 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,4.5 + parent: 1 + - uid: 88 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,5.5 + parent: 1 + - uid: 89 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,6.5 + parent: 1 + - uid: 90 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,7.5 + parent: 1 + - uid: 91 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,8.5 + parent: 1 + - uid: 92 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,8.5 + parent: 1 + - uid: 93 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,5.5 + parent: 1 + - uid: 94 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,6.5 + parent: 1 +- proto: WallMiningDiagonal + entities: + - uid: 95 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 8.5,4.5 + parent: 1 + - uid: 96 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,4.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 4.5,8.5 + parent: 1 +- proto: WallShuttle + entities: + - uid: 3 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,1.5 + parent: 1 + - uid: 5 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,1.5 + parent: 1 + - uid: 7 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,1.5 + parent: 1 + - uid: 8 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,3.5 + parent: 1 + - uid: 9 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,3.5 + parent: 1 + - uid: 10 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,3.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/labour_camp.yml b/Resources/Maps/Lavaland/labour_camp.yml new file mode 100644 index 0000000000..6d2d75610e --- /dev/null +++ b/Resources/Maps/Lavaland/labour_camp.yml @@ -0,0 +1,2772 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 02:46:20 + entityCount: 408 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 2: Space + 5: FloorBasalt + 6: FloorBrokenWood + 4: FloorDark + 1: FloorSteel + 3: FloorWhite + 0: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.4375,-0.47916666 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAQAAAAADAQAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAADAQAAAAADAQAAAAACAQAAAAAAAQAAAAABAQAAAAACAQAAAAABAQAAAAACAQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAABAQAAAAADAQAAAAADAQAAAAACAAAAAAAAAQAAAAAAAQAAAAADAQAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAAAAAAAAAQAAAAACAQAAAAABAQAAAAADAQAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAAAAAAAAAQAAAAAAAQAAAAACAQAAAAAAAQAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAADAAAAAAAAAQAAAAADAQAAAAACAQAAAAAAAQAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAAAAAAAAAQAAAAAAAQAAAAADAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAACAwAAAAADAwAAAAABAQAAAAABAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAACAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABAAAAAACBAAAAAAABAAAAAAAAQAAAAABAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAwAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAABQAAAAAABQAAAAAAAAAAAAAABAAAAAADBAAAAAAABAAAAAACAAAAAAAAAwAAAAABAwAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAABQAAAAAABQAAAAAAAAAAAAAABAAAAAACBAAAAAADBAAAAAACAAAAAAAAAwAAAAADAwAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAAABQAAAAAABQAAAAAAAAAAAAAABAAAAAAABAAAAAABBAAAAAACAAAAAAAAAwAAAAABAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAADAQAAAAACAQAAAAABAQAAAAADAAAAAAAABgAAAAABBgAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAFBgAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAACAQAAAAACAQAAAAABAQAAAAADAAAAAAAABgAAAAABAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAADAQAAAAAAAQAAAAABAQAAAAAAAQAAAAABAQAAAAACAQAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAACAQAAAAACAQAAAAADAQAAAAABAAAAAAAABgAAAAACAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAADAQAAAAADAQAAAAADAQAAAAAAAAAAAAAABgAAAAADBgAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAACAQAAAAABAQAAAAACAQAAAAABAAAAAAAABgAAAAACBgAAAAAFAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABAAAAAABBAAAAAABBAAAAAADBAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAABAAAAAACBAAAAAADBAAAAAADBAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAABAQAAAAABAQAAAAAAAQAAAAACAQAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAACAQAAAAADAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAACAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAABAQAAAAADAQAAAAADAQAAAAADAQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAADAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAADAwAAAAACAAAAAAAAAQAAAAADAQAAAAAB + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Arrows + decals: + 143: 2,-5 + 144: 1,-5 + - node: + color: '#FFFFFFFF' + id: Delivery + decals: + 141: 3,0 + - node: + cleanable: True + zIndex: 1 + color: '#FFFFFFFF' + id: DirtHeavy + decals: + 74: -4,0 + 75: -2,1 + 76: -2,0 + 77: -1,0 + 78: 0,1 + 79: 0,2 + 80: 1,1 + 81: 2,1 + 82: 3,1 + 83: 3,2 + 84: 5,2 + 85: 6,1 + 86: 7,1 + 87: 5,6 + 88: 5,5 + 89: 4,5 + 90: 5,5 + 91: 4,4 + 92: 3,4 + 93: 2,5 + 94: 3,7 + 95: -2,4 + 96: -1,4 + 97: -1,5 + 98: 0,6 + 99: -1,6 + 100: -2,6 + 101: 0,4 + 102: 0,5 + 103: -5,3 + 104: -4,2 + 105: -4,3 + 106: -4,4 + 107: -5,4 + 108: -5,5 + 109: -4,5 + 110: -4,6 + 111: -5,6 + 112: -6,4 + 113: -6,6 + 114: 0,7 + 115: 2,0 + 116: 1,0 + 117: 1,-1 + 118: 0,-1 + 119: 0,-2 + 120: -1,-2 + 121: 1,-2 + 122: 2,-2 + 123: 1,-3 + 124: 1,-4 + 125: 2,-4 + 126: 3,-4 + 127: 4,-4 + 128: 1,-5 + 129: 2,-5 + 130: 0,-5 + 131: -1,-5 + 132: -1,-4 + 133: -1,-3 + 134: -2,-5 + 135: -3,-7 + 136: -3,-6 + 137: -2,-6 + 138: -1,-6 + 139: 0,-6 + 140: -4,-1 + - node: + color: '#79150096' + id: HalfTileOverlayGreyscale + decals: + 56: -3,-10 + 57: -2,-10 + 58: -1,-10 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale + decals: + 25: 3,5 + 26: 4,5 + 27: 2,2 + 28: 1,2 + 29: 0,2 + 30: -1,2 + 42: 5,2 + 43: 6,2 + 44: 7,2 + - node: + color: '#79150096' + id: HalfTileOverlayGreyscale180 + decals: + 53: -3,-9 + 54: -2,-9 + 55: -1,-9 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale180 + decals: + 19: -2,-7 + 20: -1,-7 + 21: 1,-5 + 22: 2,-5 + 23: 3,6 + 24: 4,6 + - node: + color: '#79150096' + id: HalfTileOverlayGreyscale270 + decals: + 50: -6,4 + 51: -6,5 + 52: -6,6 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale270 + decals: + 0: -3,-6 + 1: -2,-4 + 2: -2,-3 + 3: -2,-2 + 4: -2,-1 + 5: -2,0 + 6: -2,1 + 7: 2,7 + 8: 2,6 + 9: 2,5 + 10: 2,4 + - node: + color: '#79150096' + id: HalfTileOverlayGreyscale90 + decals: + 45: -4,2 + 46: -4,3 + 47: -4,4 + 48: -4,5 + 49: -4,6 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale90 + decals: + 11: 5,4 + 12: 5,5 + 13: 5,6 + 14: 5,7 + 15: 3,0 + 18: 0,-6 + 36: 3,-3 + 37: 3,-2 + 38: 3,-1 + - node: + angle: 1.5707963267948966 rad + color: '#FFFFFFFF' + id: LoadingArea + decals: + 142: 2,0 + - node: + color: '#79150096' + id: QuarterTileOverlayGreyscale + decals: + 62: 0,-10 + - node: + color: '#A4610696' + id: QuarterTileOverlayGreyscale + decals: + 40: -2,-5 + - node: + color: '#79150096' + id: QuarterTileOverlayGreyscale180 + decals: + 61: -4,-9 + - node: + color: '#A4610696' + id: QuarterTileOverlayGreyscale180 + decals: + 41: 0,-5 + - node: + color: '#52B4E996' + id: QuarterTileOverlayGreyscale270 + decals: + 67: -5,-1 + 68: -5,0 + 69: -4,0 + 70: -4,-1 + - node: + color: '#79150096' + id: QuarterTileOverlayGreyscale270 + decals: + 59: 0,-9 + - node: + color: '#52B4E996' + id: QuarterTileOverlayGreyscale90 + decals: + 63: -5,0 + 64: -4,0 + 65: -4,-1 + 66: -5,-1 + - node: + color: '#79150096' + id: QuarterTileOverlayGreyscale90 + decals: + 60: -4,-10 + - node: + cleanable: True + color: '#FFFFFFFF' + id: Remains + decals: + 73: -9,4 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale + decals: + 35: -3,-5 + 39: -2,2 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale180 + decals: + 31: 0,-7 + 32: 3,-5 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale270 + decals: + 34: -3,-7 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale90 + decals: + 33: 3,2 + - node: + cleanable: True + zIndex: 1 + color: '#79150096' + id: splatter + decals: + 146: 7,2 + 147: 5,-7 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 36862 + 0,-1: + 0: 65535 + -1,0: + 0: 40911 + 0,1: + 0: 56797 + -1,1: + 0: 19933 + 0,2: + 0: 1 + 1,0: + 0: 3824 + 1,1: + 0: 13107 + 1,-1: + 0: 26151 + 2,0: + 0: 16 + -3,1: + 0: 3276 + -2,1: + 0: 3549 + -2,0: + 0: 34824 + -2,-1: + 0: 32960 + -1,-1: + 0: 56572 + -1,2: + 0: 4 + 0,-3: + 0: 56576 + -1,-3: + 0: 65280 + 0,-2: + 0: 61944 + -1,-2: + 0: 65272 + 1,-3: + 0: 13056 + 1,-2: + 0: 9824 + -2,-2: + 0: 32960 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirAlarm + entities: + - uid: 282 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,1.5 + parent: 1 + - type: DeviceList + devices: + - 304 + - 151 + - uid: 283 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - type: DeviceList + devices: + - 305 + - 147 + - uid: 286 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,3.5 + parent: 1 + - type: DeviceList + devices: + - 164 + - 271 + - uid: 307 + components: + - type: Transform + pos: -2.5,-7.5 + parent: 1 + - uid: 308 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,0.5 + parent: 1 + - type: DeviceList + devices: + - 182 + - 153 +- proto: AirCanister + entities: + - uid: 152 + components: + - type: Transform + pos: 5.5,-8.5 + parent: 1 +- proto: Airlock + entities: + - uid: 363 + components: + - type: Transform + pos: 5.5,-4.5 + parent: 1 + - uid: 364 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 + - uid: 366 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 367 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 368 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 400 + components: + - type: Transform + pos: -1.5,7.5 + parent: 1 + - uid: 401 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 +- proto: AirlockExternal + entities: + - uid: 321 + components: + - type: Transform + pos: -3.5,-2.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 323: + - - DoorStatus + - DoorBolt + - uid: 323 + components: + - type: Transform + pos: -5.5,-2.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 321: + - - DoorStatus + - DoorBolt +- proto: AirlockExternalGlassLocked + entities: + - uid: 320 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 322: + - - DoorStatus + - DoorBolt + - uid: 322 + components: + - type: Transform + pos: 8.5,1.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 320: + - - DoorStatus + - DoorBolt +- proto: AirlockExternalLocked + entities: + - uid: 324 + components: + - type: Transform + pos: -3.5,-6.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 325: + - - DoorStatus + - DoorBolt + - uid: 325 + components: + - type: Transform + pos: -5.5,-6.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 324: + - - DoorStatus + - DoorBolt +- proto: AirlockMaintLocked + entities: + - uid: 303 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-7.5 + parent: 1 +- proto: AirlockSecurityGlass + entities: + - uid: 326 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: 1.5,-6.5 + parent: 1 +- proto: AirlockVirologyGlass + entities: + - uid: 362 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 +- proto: AirSensor + entities: + - uid: 182 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 308 + - uid: 271 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 286 + - uid: 304 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 282 + - uid: 305 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 283 + - uid: 306 + components: + - type: Transform + pos: -0.5,-8.5 + parent: 1 +- proto: APCBasic + entities: + - uid: 199 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 +- proto: Ash + entities: + - uid: 369 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 370 + components: + - type: Transform + pos: -9.5,5.5 + parent: 1 + - uid: 371 + components: + - type: Transform + pos: -7.5,4.5 + parent: 1 + - uid: 373 + components: + - type: Transform + pos: -9.5,6.5 + parent: 1 + - uid: 374 + components: + - type: Transform + pos: -8.5,5.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 408 + components: + - type: Transform + pos: -7.5,5.5 + parent: 1 +- proto: BaseComputer + entities: + - uid: 390 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,-4.5 + parent: 1 +- proto: Bed + entities: + - uid: 61 + components: + - type: Transform + pos: 6.5,-6.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 6.5,-1.5 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 209 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 211 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: 1.5,-6.5 + parent: 1 + - uid: 213 + components: + - type: Transform + pos: 0.5,-6.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: -0.5,-6.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 216 + components: + - type: Transform + pos: -0.5,-8.5 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: -1.5,-8.5 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: -2.5,-8.5 + parent: 1 + - uid: 219 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 220 + components: + - type: Transform + pos: -0.5,-4.5 + parent: 1 + - uid: 221 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 226 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 227 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 228 + components: + - type: Transform + pos: -1.5,2.5 + parent: 1 + - uid: 229 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: -3.5,2.5 + parent: 1 + - uid: 231 + components: + - type: Transform + pos: -3.5,3.5 + parent: 1 + - uid: 232 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 233 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - uid: 234 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 237 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 239 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 241 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 243 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: -3.5,-2.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: -4.5,-6.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: -3.5,-6.5 + parent: 1 + - uid: 256 + components: + - type: Transform + pos: -2.5,-6.5 + parent: 1 + - uid: 257 + components: + - type: Transform + pos: -1.5,-6.5 + parent: 1 + - uid: 258 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 259 + components: + - type: Transform + pos: 1.5,-3.5 + parent: 1 + - uid: 260 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 + - uid: 262 + components: + - type: Transform + pos: 4.5,-3.5 + parent: 1 + - uid: 263 + components: + - type: Transform + pos: 5.5,-3.5 + parent: 1 + - uid: 264 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 + - uid: 265 + components: + - type: Transform + pos: 5.5,-1.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: 5.5,-4.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: 5.5,-5.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 270 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 389 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 +- proto: CableHV + entities: + - uid: 150 + components: + - type: Transform + pos: 3.5,-9.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: 2.5,-8.5 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: 2.5,-9.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: 4.5,-9.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: 5.5,-9.5 + parent: 1 +- proto: CableMV + entities: + - uid: 204 + components: + - type: Transform + pos: 2.5,-8.5 + parent: 1 + - uid: 205 + components: + - type: Transform + pos: 3.5,-8.5 + parent: 1 + - uid: 206 + components: + - type: Transform + pos: 3.5,-7.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 208 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 +- proto: Chair + entities: + - uid: 314 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,4.5 + parent: 1 + - uid: 315 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,5.5 + parent: 1 + - uid: 316 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,6.5 + parent: 1 + - uid: 393 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-9.5 + parent: 1 + - uid: 394 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-8.5 + parent: 1 + - uid: 395 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-9.5 + parent: 1 +- proto: CheapLighter + entities: + - uid: 333 + components: + - type: Transform + pos: -5.5,6.5 + parent: 1 +- proto: CigaretteSpent + entities: + - uid: 377 + components: + - type: Transform + pos: -3.7565565,5.9277244 + parent: 1 + - uid: 378 + components: + - type: Transform + pos: 4.840188,5.7844887 + parent: 1 + - uid: 379 + components: + - type: Transform + pos: 2.361021,2.4080882 + parent: 1 + - uid: 380 + components: + - type: Transform + pos: -1.5833111,-2.0416143 + parent: 1 + - uid: 381 + components: + - type: Transform + pos: -1.9033532,-8.090153 + parent: 1 +- proto: CigPackGreen + entities: + - uid: 334 + components: + - type: Transform + pos: -5.5625,6.5625 + parent: 1 +- proto: ClosetWallOrange + entities: + - uid: 404 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-5.5 + parent: 1 + - uid: 405 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-5.5 + parent: 1 +- proto: ClothingEyesGlassesMeson + entities: + - uid: 361 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 +- proto: ClothingHandsGlovesColorBlack + entities: + - uid: 337 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 341 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 342 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 345 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 +- proto: ClothingHeadHatParamedicsoft + entities: + - uid: 403 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 +- proto: ClothingMaskBandBlack + entities: + - uid: 354 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 +- proto: ClothingMaskClown + entities: + - uid: 376 + components: + - type: Transform + pos: -9.5,4.5 + parent: 1 +- proto: ClothingOuterVestHazard + entities: + - uid: 348 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 349 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 350 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 351 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 +- proto: ClothingShoesColorOrange + entities: + - uid: 372 + components: + - type: Transform + pos: -7.5,4.5 + parent: 1 +- proto: ClothingUniformJumpsuitPrisoner + entities: + - uid: 375 + components: + - type: Transform + pos: -9.5,6.5 + parent: 1 +- proto: Cobweb1 + entities: + - uid: 382 + components: + - type: Transform + pos: -3.5,-8.5 + parent: 1 + - uid: 383 + components: + - type: Transform + pos: -4.5,-4.5 + parent: 1 +- proto: Cobweb2 + entities: + - uid: 384 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 385 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 386 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 + - uid: 387 + components: + - type: Transform + pos: 6.5,-5.5 + parent: 1 + - uid: 388 + components: + - type: Transform + pos: 5.5,-8.5 + parent: 1 +- proto: ComputerCriminalRecords + entities: + - uid: 392 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-8.5 + parent: 1 +- proto: ComputerStationRecords + entities: + - uid: 397 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-9.5 + parent: 1 +- proto: ComputerSurveillanceCameraMonitor + entities: + - uid: 391 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,-9.5 + parent: 1 +- proto: CryogenicSleepUnit + entities: + - uid: 399 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 +- proto: FoodPlateSmall + entities: + - uid: 331 + components: + - type: Transform + pos: -5.5,4.5625 + parent: 1 +- proto: ForkPlastic + entities: + - uid: 332 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 +- proto: GasMixerFlipped + entities: + - uid: 145 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,7.5 + parent: 1 + - type: GasMixer + inletTwoConcentration: 0.22000003 + inletOneConcentration: 0.78 + - type: AtmosPipeColor + color: '#03FCD3FF' +- proto: GasPipeBend + entities: + - uid: 143 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#03FCD3FF' + - uid: 144 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#03FCD3FF' + - uid: 148 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,2.5 + parent: 1 + - uid: 156 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,1.5 + parent: 1 + - uid: 166 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,1.5 + parent: 1 + - uid: 191 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-8.5 + parent: 1 +- proto: GasPipeFourway + entities: + - uid: 155 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 +- proto: GasPipeStraight + entities: + - uid: 157 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,2.5 + parent: 1 + - uid: 158 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,2.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 161 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,1.5 + parent: 1 + - uid: 162 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,1.5 + parent: 1 + - uid: 163 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,3.5 + parent: 1 + - uid: 165 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,5.5 + parent: 1 + - uid: 170 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,0.5 + parent: 1 + - uid: 171 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - uid: 172 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,1.5 + parent: 1 + - uid: 173 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,2.5 + parent: 1 + - uid: 174 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,2.5 + parent: 1 + - uid: 175 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,2.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 181 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,3.5 + parent: 1 + - uid: 273 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 274 + components: + - type: Transform + pos: -0.5,-6.5 + parent: 1 + - uid: 275 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 276 + components: + - type: Transform + pos: -0.5,-4.5 + parent: 1 +- proto: GasPipeTJunction + entities: + - uid: 167 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-3.5 + parent: 1 + - uid: 168 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,0.5 + parent: 1 + - uid: 169 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,2.5 + parent: 1 + - uid: 272 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,4.5 + parent: 1 +- proto: GasPort + entities: + - uid: 183 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#03FCD3FF' + - uid: 184 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#03FCD3FF' +- proto: GasPressurePump + entities: + - uid: 186 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#03FCD3FF' +- proto: GasVentPump + entities: + - uid: 146 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 147 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-3.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 283 + - uid: 149 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 282 + - uid: 153 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 308 + - uid: 164 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 286 + - uid: 190 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-8.5 + parent: 1 +- proto: GeneratorBasic15kW + entities: + - uid: 200 + components: + - type: Transform + pos: 5.5,-9.5 + parent: 1 +- proto: Grille + entities: + - uid: 2 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: -4.5,-9.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: -3.5,-10.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: -2.5,-10.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: -1.5,-10.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: -0.5,-10.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: 0.5,-10.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 8.5,2.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 +- proto: HospitalCurtainsOpen + entities: + - uid: 196 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 +- proto: IntercomCommon + entities: + - uid: 335 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 +- proto: Lantern + entities: + - uid: 339 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 343 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 346 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 347 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 +- proto: MedkitFilled + entities: + - uid: 402 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 +- proto: NitrogenCanister + entities: + - uid: 180 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 +- proto: OreProcessor + entities: + - uid: 318 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 +- proto: OxygenCanister + entities: + - uid: 179 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 +- proto: PaperBin5 + entities: + - uid: 355 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 356 + components: + - type: Transform + pos: 0.5,-8.5 + parent: 1 +- proto: Pen + entities: + - uid: 357 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 358 + components: + - type: Transform + pos: 0.5,-8.5 + parent: 1 +- proto: Pickaxe + entities: + - uid: 336 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 338 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 340 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 344 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 +- proto: PosterContrabandClown + entities: + - uid: 406 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,7.5 + parent: 1 +- proto: PoweredSmallLight + entities: + - uid: 281 + components: + - type: Transform + pos: -4.5,-6.5 + parent: 1 + - uid: 284 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 + - uid: 287 + components: + - type: Transform + pos: -2.5,-8.5 + parent: 1 + - uid: 288 + components: + - type: Transform + pos: 4.5,-8.5 + parent: 1 + - uid: 289 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,-5.5 + parent: 1 + - uid: 290 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,-0.5 + parent: 1 + - uid: 291 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 292 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,5.5 + parent: 1 + - uid: 293 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,6.5 + parent: 1 + - uid: 294 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 295 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 296 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-1.5 + parent: 1 + - uid: 297 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-1.5 + parent: 1 + - uid: 298 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,-6.5 + parent: 1 + - uid: 299 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 300 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 301 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,2.5 + parent: 1 + - uid: 302 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-4.5 + parent: 1 +- proto: PuddleVomit + entities: + - uid: 407 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 +- proto: Rack + entities: + - uid: 140 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 193 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,7.5 + parent: 1 +- proto: RandomSpawner100 + entities: + - uid: 365 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 +- proto: ReinforcedWindow + entities: + - uid: 3 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 0.5,-10.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: -0.5,-10.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: -1.5,-10.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: -2.5,-10.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: -3.5,-10.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: -4.5,-9.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 8.5,2.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 +- proto: Screen + entities: + - uid: 398 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,-3.5 + parent: 1 +- proto: SignalButtonDirectional + entities: + - uid: 277 + components: + - type: Transform + pos: -1.5,-7.5 + parent: 1 + - type: DeviceLinkSource + linkedPorts: + 326: + - - Pressed + - Toggle + - uid: 278 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - type: DeviceLinkSource + linkedPorts: + 326: + - - Pressed + - Toggle +- proto: Sink + entities: + - uid: 198 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,4.5 + parent: 1 +- proto: SoapHomemade + entities: + - uid: 352 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 +- proto: SubstationBasic + entities: + - uid: 187 + components: + - type: Transform + pos: 2.5,-8.5 + parent: 1 +- proto: Table + entities: + - uid: 138 + components: + - type: Transform + pos: 6.5,-5.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 + - uid: 154 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-9.5 + parent: 1 + - uid: 279 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 280 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 285 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-2.5 + parent: 1 + - uid: 309 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,-3.5 + parent: 1 + - uid: 310 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,-8.5 + parent: 1 + - uid: 311 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,4.5 + parent: 1 + - uid: 312 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,5.5 + parent: 1 + - uid: 313 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,6.5 + parent: 1 +- proto: ToiletDirtyWater + entities: + - uid: 194 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 +- proto: TowelColorWhite + entities: + - uid: 359 + components: + - type: Transform + pos: 6.5,-3.5 + parent: 1 +- proto: ToyFigurinePassenger + entities: + - uid: 360 + components: + - type: Transform + pos: 6.5,-5.34375 + parent: 1 +- proto: ToyRubberDuck + entities: + - uid: 353 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 +- proto: VendingMachineCola + entities: + - uid: 329 + components: + - type: Transform + pos: -4.5,2.5 + parent: 1 +- proto: VendingMachineSalvage + entities: + - uid: 317 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 +- proto: VendingMachineSustenance + entities: + - uid: 330 + components: + - type: Transform + pos: -4.5,3.5 + parent: 1 +- proto: VendingMachineTankDispenserEVA + entities: + - uid: 192 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 +- proto: VendingMachineWallMedical + entities: + - uid: 319 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,-1.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 4 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 4.5,3.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: -5.5,-1.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -3.5,-3.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -1.5,-7.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -2.5,-7.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -4.5,-8.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: -4.5,-10.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: -3.5,-7.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: -5.5,-7.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: -4.5,-7.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: -5.5,-4.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 4.5,-5.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 2.5,-10.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 1.5,-8.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 1.5,-9.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 1.5,-10.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 5.5,-10.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 7.5,-7.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 7.5,-6.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 6.5,-4.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 6.5,-2.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 8.5,0.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 6.5,8.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 5.5,8.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: -2.5,7.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 129 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 +- proto: WallSolidRust + entities: + - uid: 5 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 4.5,-0.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 4.5,-1.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: -5.5,1.5 + parent: 1 + - uid: 28 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,1.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 1.5,-7.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 0.5,-7.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 4.5,-4.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 4.5,-6.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 4.5,-7.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 3.5,-10.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 4.5,-10.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 5.5,-7.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 6.5,-7.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 7.5,-5.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 7.5,-4.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 7.5,-3.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 7.5,-2.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 7.5,-1.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 7.5,-0.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 6.5,6.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 4.5,8.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 3.5,8.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: -1.5,9.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: -2.5,9.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: -3.5,7.5 + parent: 1 + - uid: 130 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,7.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: -6.5,7.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: -5.5,3.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: -5.5,2.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: 6.5,-9.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: 6.5,-8.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: 6.5,-10.5 + parent: 1 +- proto: WeaponCapacitorRecharger + entities: + - uid: 396 + components: + - type: Transform + pos: -1.5,-9.5 + parent: 1 +- proto: WeldingFuelTankFull + entities: + - uid: 203 + components: + - type: Transform + pos: 2.5,-9.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/miner_tomb.yml b/Resources/Maps/Lavaland/miner_tomb.yml new file mode 100644 index 0000000000..6afbb85056 --- /dev/null +++ b/Resources/Maps/Lavaland/miner_tomb.yml @@ -0,0 +1,388 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 03:08:17 + entityCount: 33 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 3: Space + 2: FloorBasalt + 0: FloorMining + 1: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.5416667,-0.5 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Basalt1 + decals: + 0: 2,3 + 1: 3,4 + - node: + color: '#FFFFFFFF' + id: Basalt2 + decals: + 3: 3,2 + - node: + color: '#FFFFFFFF' + id: Basalt5 + decals: + 2: 2,4 + - node: + color: '#FFFFFFFF' + id: Basalt7 + decals: + 4: 3,1 + - node: + cleanable: True + angle: 1.5707963267948966 rad + color: '#79150096' + id: footprint + decals: + 15: 2.8024936,-1.6954603 + - node: + cleanable: True + angle: 3.141592653589793 rad + color: '#79150096' + id: footprint + decals: + 16: 3.0154567,-0.9732382 + 17: 2.3901472,-1.2880534 + - node: + cleanable: True + angle: -1.5707963267948966 rad + color: '#79150096' + id: shortline + decals: + 13: 1.1283026,-1.6614372 + - node: + cleanable: True + angle: 1.5707963267948966 rad + color: '#79150096' + id: shortline + decals: + 12: 1.8134878,-1.8774867 + - node: + cleanable: True + color: '#791500FF' + id: shortline + decals: + 8: -0.15404409,0.50062823 + - node: + cleanable: True + color: '#79150096' + id: splatter + decals: + 7: 0.030671239,-1.9988668 + - node: + cleanable: True + color: '#791500FF' + id: splatter + decals: + 5: 0,0 + 11: -0.34580898,1.6557164 + - node: + cleanable: True + color: '#791500FF' + id: thinline + decals: + 9: 0.15837723,0.25062823 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 52155 + 0,-1: + 0: 57088 + -1,0: + 0: 27306 + 0,1: + 0: 15 + -1,1: + 0: 14 + -1,-1: + 0: 28160 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirCanister + entities: + - uid: 23 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 +- proto: AirlockMiningGlass + entities: + - uid: 2 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 +- proto: BasaltFour + entities: + - uid: 28 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 +- proto: BaseComputer + entities: + - uid: 21 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 +- proto: Bed + entities: + - uid: 18 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 +- proto: BedsheetBlack + entities: + - uid: 19 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 +- proto: ChairPilotSeat + entities: + - uid: 20 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,1.5 + parent: 1 +- proto: Crowbar + entities: + - uid: 24 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 +- proto: Pickaxe + entities: + - uid: 27 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 +- proto: SignNTMine + entities: + - uid: 29 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 +- proto: SignSurvival + entities: + - uid: 30 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 +- proto: SmallLight + entities: + - uid: 33 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,1.5 + parent: 1 +- proto: SurvivalKnife + entities: + - uid: 26 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 25 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 +- proto: VendingMachineSustenance + entities: + - uid: 22 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 +- proto: WallMining + entities: + - uid: 7 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-0.5 + parent: 1 + - uid: 8 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - uid: 9 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,1.5 + parent: 1 + - uid: 10 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,2.5 + parent: 1 + - uid: 11 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,3.5 + parent: 1 + - uid: 12 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,3.5 + parent: 1 + - uid: 13 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,3.5 + parent: 1 + - uid: 14 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,2.5 + parent: 1 + - uid: 15 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,0.5 + parent: 1 + - uid: 17 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,-0.5 + parent: 1 +- proto: WallMiningDiagonal + entities: + - uid: 3 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 4 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,3.5 + parent: 1 + - uid: 5 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-0.5 + parent: 1 + - uid: 6 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-0.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/mining_outpost.yml b/Resources/Maps/Lavaland/mining_outpost.yml new file mode 100644 index 0000000000..e0dec5feb2 --- /dev/null +++ b/Resources/Maps/Lavaland/mining_outpost.yml @@ -0,0 +1,6158 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 02:18:33 + entityCount: 902 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 2: Space + 4: FloorBar + 5: FloorBasalt + 8: FloorBlueCircuit + 6: FloorDark + 3: FloorFreezer + 0: FloorSteel + 7: FloorWhite + 1: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.5520833,-0.48958334 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAADAAAAAAAAAAAAAAABAAAAAAABAAAAAAADAAAAAAABAAAAAAADAAAAAAABAAAAAAAAAAAAAAADAAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAADAAAAAAACAAAAAAACAAAAAAADAAAAAAABAAAAAAAAAAAAAAACAAAAAAACAAAAAAAAAAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAADAAAAAAACAAAAAAACAAAAAAADAQAAAAAAAAAAAAADAAAAAAADAAAAAAABAAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAADAQAAAAAAAAAAAAADAAAAAAACAAAAAAABAAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAABAQAAAAAAAAAAAAADAAAAAAABAAAAAAACAAAAAAACAAAAAAABAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAACAAAAAAADAAAAAAACAAAAAAADAQAAAAAAAAAAAAAAAAAAAAADAAAAAAACAAAAAAACAAAAAAACAAAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAACAAAAAAABAAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAADAAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAADAAAAAAABAAAAAAADAAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAADAAAAAAACAAAAAAADAAAAAAACAQAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAADAAAAAAACAAAAAAABAAAAAAABAAAAAAADAAAAAAADAAAAAAAAAAAAAAAAAAAAAAADAAAAAAACAAAAAAADAAAAAAACAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAACAAAAAAAAAQAAAAAAAAAAAAABAAAAAAADAAAAAAABAAAAAAABAQAAAAAAAAAAAAACAAAAAAADAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAADAAAAAAADAAAAAAACAAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAABAAAAAAACAAAAAAABAAAAAAACAQAAAAAAAAAAAAADAAAAAAACAAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAABAAAAAAABAAAAAAABAAAAAAADAAAAAAADAQAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAABBAAAAAABBAAAAAADBAAAAAABBAAAAAADBAAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAAABAAAAAADBAAAAAAABAAAAAABBAAAAAAABAAAAAADAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAABBAAAAAADBAAAAAAABAAAAAACBAAAAAABBAAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAADBAAAAAABBAAAAAACBAAAAAACBAAAAAABBAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAADAAAAAAAAAAAAAAACAAAAAAACAAAAAAABAAAAAAACAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AAAAAAABAAAAAAAAAAAAAAADAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAABAAAAAAABAAAAAAADAAAAAAADAAAAAAACAAAAAAACAAAAAAACAAAAAAABAAAAAAAAAAAAAAACAAAAAAABAAAAAAADAAAAAAADAAAAAAACAAAAAAABAAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAABAAAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -2,0: + ind: -2,0 + tiles: AgAAAAAABQAAAAAABQAAAAAAAQAAAAAAAAAAAAACAAAAAAACAAAAAAADAAAAAAADAAAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAADAAAAAAABAAAAAAADAAAAAAACAgAAAAAAAgAAAAAABQAAAAAAAQAAAAAAAAAAAAADAAAAAAACAAAAAAACAAAAAAAAAAAAAAAAAAAAAAACAAAAAAACAAAAAAABAAAAAAACAAAAAAABAAAAAAACAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAACAAAAAAACAAAAAAABgAAAAACCAAAAAAACAAAAAAAAQAAAAAABwAAAAABBwAAAAAABwAAAAAABwAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAACAAAAAAABgAAAAABBgAAAAAABgAAAAABCAAAAAAAAQAAAAAABwAAAAABBwAAAAACBwAAAAADBwAAAAACAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -2,-1: + ind: -2,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAADAAAAAAACAQAAAAAAAAAAAAABAAAAAAADAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAADAAAAAAAAAAAAAAADAAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAABAAAAAAACAQAAAAAAAAAAAAADAAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAADAAAAAAACAAAAAAABAAAAAAABAAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAADAAAAAAABAAAAAAADAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAACAAAAAAADAAAAAAAAAAAAAAACAAAAAAAAAQAAAAAAAAAAAAABAAAAAAABAQAAAAAAAAAAAAACAAAAAAADAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAABAAAAAAACAAAAAAAAAAAAAAAAAAAAAAADAQAAAAAAAAAAAAACAAAAAAABAAAAAAACAAAAAAAAAAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAABAAAAAAADAQAAAAAAAgAAAAAAAgAAAAAABQAAAAAAAQAAAAAAAAAAAAADAAAAAAADAAAAAAACAAAAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAACAAAAAAABAAAAAAADAAAAAAAAAAAAAAAD + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Bot + decals: + 109: 12,5 + 110: 11,5 + 111: 9,5 + 112: 7,3 + - node: + color: '#FFFFFFFF' + id: Delivery + decals: + 113: 12,4 + - node: + color: '#52B4E996' + id: HalfTileOverlayGreyscale + decals: + 46: -22,4 + 47: -21,4 + 48: -20,4 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale + decals: + 9: -26,1 + 10: -20,1 + 11: -15,1 + 17: -26,-3 + 68: 7,13 + 69: 8,13 + 74: 3,11 + 99: 5,5 + - node: + color: '#D381C996' + id: HalfTileOverlayGreyscale + decals: + 94: 2,11 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale180 + decals: + 18: -26,-1 + 20: -26,-5 + 78: 3,-2 + 79: 5,-2 + 108: 9,0 + - node: + color: '#D381C996' + id: HalfTileOverlayGreyscale180 + decals: + 24: -27,-5 + 25: -25,-5 + 80: 2,-2 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale270 + decals: + 13: -8,0 + 14: -19,-9 + 15: -19,-6 + 16: -19,-3 + 51: 1,0 + 52: 7,0 + 53: 7,1 + 66: 6,10 + 67: 6,12 + 71: 11,10 + 73: 1,9 + 75: 2,6 + 76: 2,4 + - node: + color: '#D381C996' + id: HalfTileOverlayGreyscale270 + decals: + 26: -28,-4 + - node: + color: '#52B4E996' + id: HalfTileOverlayGreyscale90 + decals: + 49: -19,3 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale90 + decals: + 12: -10,0 + 54: -1,0 + 55: 5,0 + 56: 5,1 + 57: 10,1 + 58: 10,3 + 59: 8,-1 + 60: 5,4 + 61: 4,6 + 62: 4,8 + 63: 4,10 + 64: 9,10 + 65: 9,12 + 70: 12,10 + - node: + color: '#D381C996' + id: HalfTileOverlayGreyscale90 + decals: + 27: -24,-4 + 96: 4,7 + 105: 10,2 + - node: + angle: -1.5707963267948966 rad + color: '#FFFFFFFF' + id: LoadingArea + decals: + 114: 8,5 + 116: 8,-2 + - node: + color: '#FFFFFFFF' + id: LoadingArea + decals: + 115: 7,4 + - node: + angle: 1.5707963267948966 rad + color: '#FFFFFFFF' + id: LoadingArea + decals: + 117: 11,4 + - node: + color: '#A4610696' + id: QuarterTileOverlayGreyscale + decals: + 77: 2,2 + - node: + color: '#D381C996' + id: QuarterTileOverlayGreyscale + decals: + 32: -25,-3 + 33: -25,1 + 34: -19,1 + 35: -14,1 + 36: -19,-4 + 37: -19,-7 + 38: -19,-10 + 89: 6,9 + 95: 1,8 + 102: 1,-1 + 103: 7,-1 + - node: + color: '#D381C996' + id: QuarterTileOverlayGreyscale180 + decals: + 30: -27,-1 + 40: -10,1 + 85: 12,11 + 92: 4,11 + 93: 9,11 + 98: 5,5 + 100: 5,2 + 107: 8,0 + - node: + color: '#D381C996' + id: QuarterTileOverlayGreyscale270 + decals: + 31: -25,-1 + 41: -19,-8 + 42: -19,-5 + 43: -19,-2 + 81: 1,1 + 82: 2,7 + 83: 1,10 + 84: 11,11 + 88: 6,11 + 104: 7,2 + - node: + color: '#D381C996' + id: QuarterTileOverlayGreyscale90 + decals: + 28: -27,1 + 29: -27,-3 + 39: -10,-1 + 44: -16,1 + 45: -21,1 + 90: 4,9 + 91: 9,9 + 97: 4,5 + 101: 5,-1 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale + decals: + 22: -28,-3 + - node: + color: '#D381C996' + id: ThreeQuarterTileOverlayGreyscale + decals: + 86: 6,13 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale180 + decals: + 19: -24,-5 + - node: + color: '#D381C996' + id: ThreeQuarterTileOverlayGreyscale180 + decals: + 106: 10,0 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale270 + decals: + 21: -28,-5 + - node: + color: '#52B4E996' + id: ThreeQuarterTileOverlayGreyscale90 + decals: + 50: -19,4 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale90 + decals: + 23: -24,-3 + - node: + color: '#D381C996' + id: ThreeQuarterTileOverlayGreyscale90 + decals: + 87: 9,13 + - node: + color: '#FFFFFFFF' + id: WarnCornerNW + decals: + 118: 12,3 + - node: + color: '#FFFFFFFF' + id: WarnCornerSmallNW + decals: + 125: 12,-2 + - node: + color: '#FFFFFFFF' + id: WarnLineS + decals: + 119: 12,2 + 120: 12,1 + 121: 12,0 + 122: 12,-1 + - node: + color: '#FFFFFFFF' + id: WarnLineW + decals: + 123: 10,-2 + 124: 11,-2 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 52463 + -1,0: + 0: 15 + 0,2: + 0: 52990 + -1,2: + 0: 192 + 0,-1: + 0: 60416 + 0,1: + 0: 52428 + 1,0: + 0: 48127 + 1,1: + 0: 61883 + 1,2: + 0: 57297 + 1,-1: + 0: 47872 + 1,3: + 0: 204 + 2,0: + 0: 30583 + 2,1: + 0: 255 + 2,2: + 0: 49072 + 2,3: + 0: 51 + 2,-1: + 0: 7936 + 3,0: + 0: 4369 + 3,1: + 0: 17 + 3,2: + 0: 4880 + 3,-1: + 0: 4352 + -4,-3: + 0: 61440 + -4,-2: + 0: 65291 + -5,-3: + 0: 62976 + -4,-1: + 0: 62719 + -4,0: + 0: 62207 + -5,-1: + 0: 63094 + -3,-3: + 0: 4096 + -3,-2: + 0: 13057 + -3,-1: + 0: 28723 + -3,0: + 0: 127 + -2,0: + 0: 15 + -5,0: + 0: 45567 + -4,1: + 0: 255 + -5,1: + 0: 139 + -8,0: + 0: 70 + -8,-1: + 0: 16384 + -7,0: + 0: 62719 + -7,1: + 0: 15 + -7,-1: + 0: 62719 + -6,0: + 0: 53503 + -6,1: + 0: 13 + -6,-1: + 0: 61661 + -7,-2: + 0: 61440 + -6,-2: + 0: 7360 + -6,-3: + 0: 52224 + -5,-2: + 0: 26470 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirAlarm + entities: + - uid: 336 + components: + - type: Transform + pos: -22.5,2.5 + parent: 1 + - type: DeviceList + devices: + - 375 + - 376 + - 377 + - 378 + - 373 + - 310 + - 374 + - 381 + - 380 + - 379 + - 357 + - 447 + - 816 + - 358 + - 446 + - 448 + - 359 + - uid: 782 + components: + - type: Transform + pos: -23.5,5.5 + parent: 1 + - type: DeviceList + devices: + - 789 + - 589 + - 588 + - 380 + - uid: 783 + components: + - type: Transform + pos: -21.5,5.5 + parent: 1 + - type: DeviceList + devices: + - 381 + - 712 + - 792 + - 713 + - uid: 784 + components: + - type: Transform + pos: -24.5,-1.5 + parent: 1 + - type: DeviceList + devices: + - 382 + - 383 + - 791 + - 379 + - uid: 785 + components: + - type: Transform + pos: -21.5,-7.5 + parent: 1 + - type: DeviceList + devices: + - 376 + - 360 + - uid: 786 + components: + - type: Transform + pos: -21.5,-4.5 + parent: 1 + - type: DeviceList + devices: + - 377 + - 361 + - uid: 787 + components: + - type: Transform + pos: -21.5,-1.5 + parent: 1 + - type: DeviceList + devices: + - 362 + - 378 + - uid: 788 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,-6.5 + parent: 1 + - type: DeviceList + devices: + - 794 + - 387 + - 364 + - 373 + - uid: 801 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-2.5 + parent: 1 + - type: DeviceList + devices: + - 369 + - 795 + - 508 + - 444 + - 371 + - 370 + - uid: 802 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 + - type: DeviceList + devices: + - 370 + - 371 + - 445 + - 796 + - 368 + - uid: 803 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,12.5 + parent: 1 + - type: DeviceList + devices: + - 799 + - 798 + - 367 + - uid: 804 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - type: DeviceList + devices: + - 443 + - 366 + - 797 + - 799 +- proto: AirCanister + entities: + - uid: 724 + components: + - type: Transform + pos: -12.5,3.5 + parent: 1 + - uid: 725 + components: + - type: Transform + pos: -12.5,4.5 + parent: 1 +- proto: Airlock + entities: + - uid: 344 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 846 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -13.5,-8.5 + parent: 1 + - uid: 847 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -16.5,-8.5 + parent: 1 + - uid: 848 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,-8.5 + parent: 1 + - uid: 849 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,-5.5 + parent: 1 + - uid: 850 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,-2.5 + parent: 1 +- proto: AirlockCargoGlass + entities: + - uid: 859 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,0.5 + parent: 1 + - uid: 860 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -8.5,0.5 + parent: 1 +- proto: AirlockCargoGlassLocked + entities: + - uid: 856 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,1.5 + parent: 1 + - uid: 857 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,0.5 + parent: 1 + - uid: 858 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,10.5 + parent: 1 +- proto: AirlockCargoLocked + entities: + - uid: 855 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -25.5,-1.5 + parent: 1 +- proto: AirlockExternalGlass + entities: + - uid: 895 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 896: + - - DoorStatus + - DoorBolt + - uid: 896 + components: + - type: Transform + pos: -1.5,9.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 895: + - - DoorStatus + - DoorBolt +- proto: AirlockExternalGlassCargoLocked + entities: + - uid: 893 + components: + - type: Transform + pos: 10.5,10.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 894: + - - DoorStatus + - DoorBolt + - uid: 894 + components: + - type: Transform + pos: 13.5,10.5 + parent: 1 + - type: DeviceLinkSink + invokeCounter: 1 + - type: DeviceLinkSource + linkedPorts: + 893: + - - DoorStatus + - DoorBolt +- proto: AirlockGlass + entities: + - uid: 851 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -13.5,-1.5 + parent: 1 +- proto: AirlockMaintLocked + entities: + - uid: 845 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -14.5,2.5 + parent: 1 + - uid: 852 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -25.5,2.5 + parent: 1 +- proto: AirlockVirologyGlass + entities: + - uid: 853 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,2.5 + parent: 1 +- proto: AirSensor + entities: + - uid: 789 + components: + - type: Transform + pos: -25.5,3.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 782 + - uid: 791 + components: + - type: Transform + pos: -24.5,-2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 784 + - uid: 792 + components: + - type: Transform + pos: -19.5,4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 783 + - uid: 794 + components: + - type: Transform + pos: -13.5,-5.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 788 + - uid: 795 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 801 + - uid: 796 + components: + - type: Transform + pos: 9.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 802 + - uid: 797 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 804 + - uid: 798 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 803 + - uid: 816 + components: + - type: Transform + pos: -17.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 336 +- proto: APCBasic + entities: + - uid: 337 + components: + - type: Transform + pos: -26.5,5.5 + parent: 1 + - uid: 338 + components: + - type: Transform + pos: -17.5,2.5 + parent: 1 + - uid: 339 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,5.5 + parent: 1 + - uid: 800 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,8.5 + parent: 1 +- proto: BaseComputer + entities: + - uid: 877 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,-1.5 + parent: 1 +- proto: Bed + entities: + - uid: 759 + components: + - type: Transform + pos: -21.5,-8.5 + parent: 1 + - uid: 760 + components: + - type: Transform + pos: -21.5,-5.5 + parent: 1 + - uid: 761 + components: + - type: Transform + pos: -21.5,-2.5 + parent: 1 +- proto: BedsheetOrange + entities: + - uid: 762 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-8.5 + parent: 1 + - uid: 763 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-5.5 + parent: 1 + - uid: 764 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-2.5 + parent: 1 +- proto: BorgCharger + entities: + - uid: 874 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 606 + components: + - type: Transform + pos: -26.5,5.5 + parent: 1 + - uid: 607 + components: + - type: Transform + pos: -26.5,4.5 + parent: 1 + - uid: 608 + components: + - type: Transform + pos: -25.5,4.5 + parent: 1 + - uid: 609 + components: + - type: Transform + pos: -25.5,3.5 + parent: 1 + - uid: 610 + components: + - type: Transform + pos: -17.5,2.5 + parent: 1 + - uid: 611 + components: + - type: Transform + pos: -17.5,1.5 + parent: 1 + - uid: 612 + components: + - type: Transform + pos: -17.5,0.5 + parent: 1 + - uid: 613 + components: + - type: Transform + pos: -18.5,0.5 + parent: 1 + - uid: 614 + components: + - type: Transform + pos: -19.5,0.5 + parent: 1 + - uid: 615 + components: + - type: Transform + pos: -20.5,0.5 + parent: 1 + - uid: 616 + components: + - type: Transform + pos: -21.5,0.5 + parent: 1 + - uid: 617 + components: + - type: Transform + pos: -22.5,0.5 + parent: 1 + - uid: 618 + components: + - type: Transform + pos: -23.5,0.5 + parent: 1 + - uid: 619 + components: + - type: Transform + pos: -24.5,0.5 + parent: 1 + - uid: 620 + components: + - type: Transform + pos: -25.5,0.5 + parent: 1 + - uid: 621 + components: + - type: Transform + pos: -25.5,-0.5 + parent: 1 + - uid: 622 + components: + - type: Transform + pos: -25.5,-1.5 + parent: 1 + - uid: 623 + components: + - type: Transform + pos: -25.5,-2.5 + parent: 1 + - uid: 624 + components: + - type: Transform + pos: -25.5,-3.5 + parent: 1 + - uid: 625 + components: + - type: Transform + pos: -26.5,-3.5 + parent: 1 + - uid: 626 + components: + - type: Transform + pos: -24.5,-3.5 + parent: 1 + - uid: 627 + components: + - type: Transform + pos: -19.5,1.5 + parent: 1 + - uid: 628 + components: + - type: Transform + pos: -19.5,2.5 + parent: 1 + - uid: 629 + components: + - type: Transform + pos: -19.5,3.5 + parent: 1 + - uid: 630 + components: + - type: Transform + pos: -19.5,4.5 + parent: 1 + - uid: 631 + components: + - type: Transform + pos: -16.5,0.5 + parent: 1 + - uid: 632 + components: + - type: Transform + pos: -15.5,0.5 + parent: 1 + - uid: 633 + components: + - type: Transform + pos: -14.5,0.5 + parent: 1 + - uid: 634 + components: + - type: Transform + pos: -13.5,0.5 + parent: 1 + - uid: 635 + components: + - type: Transform + pos: -12.5,0.5 + parent: 1 + - uid: 636 + components: + - type: Transform + pos: -11.5,0.5 + parent: 1 + - uid: 637 + components: + - type: Transform + pos: -10.5,0.5 + parent: 1 + - uid: 638 + components: + - type: Transform + pos: -9.5,0.5 + parent: 1 + - uid: 639 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 640 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 641 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 642 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 643 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 644 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 645 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 646 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 647 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 648 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 649 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 650 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 651 + components: + - type: Transform + pos: 3.5,8.5 + parent: 1 + - uid: 652 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 653 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 654 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 655 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 656 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 657 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 658 + components: + - type: Transform + pos: 8.5,0.5 + parent: 1 + - uid: 659 + components: + - type: Transform + pos: 9.5,0.5 + parent: 1 + - uid: 660 + components: + - type: Transform + pos: 10.5,0.5 + parent: 1 + - uid: 661 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - uid: 662 + components: + - type: Transform + pos: 10.5,1.5 + parent: 1 + - uid: 663 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - uid: 664 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 665 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 + - uid: 666 + components: + - type: Transform + pos: 9.5,4.5 + parent: 1 + - uid: 667 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 668 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 669 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 670 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 + - uid: 671 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 + - uid: 672 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 + - uid: 673 + components: + - type: Transform + pos: 9.5,10.5 + parent: 1 + - uid: 674 + components: + - type: Transform + pos: 10.5,10.5 + parent: 1 + - uid: 675 + components: + - type: Transform + pos: 11.5,10.5 + parent: 1 + - uid: 676 + components: + - type: Transform + pos: 12.5,10.5 + parent: 1 + - uid: 677 + components: + - type: Transform + pos: -14.5,1.5 + parent: 1 + - uid: 678 + components: + - type: Transform + pos: -14.5,2.5 + parent: 1 + - uid: 679 + components: + - type: Transform + pos: -14.5,3.5 + parent: 1 + - uid: 680 + components: + - type: Transform + pos: -14.5,4.5 + parent: 1 + - uid: 681 + components: + - type: Transform + pos: -13.5,-0.5 + parent: 1 + - uid: 682 + components: + - type: Transform + pos: -13.5,-1.5 + parent: 1 + - uid: 683 + components: + - type: Transform + pos: -13.5,-2.5 + parent: 1 + - uid: 684 + components: + - type: Transform + pos: -13.5,-3.5 + parent: 1 + - uid: 685 + components: + - type: Transform + pos: -14.5,-3.5 + parent: 1 + - uid: 686 + components: + - type: Transform + pos: -12.5,-3.5 + parent: 1 + - uid: 687 + components: + - type: Transform + pos: -11.5,-3.5 + parent: 1 + - uid: 688 + components: + - type: Transform + pos: -17.5,-0.5 + parent: 1 + - uid: 689 + components: + - type: Transform + pos: -17.5,-1.5 + parent: 1 + - uid: 690 + components: + - type: Transform + pos: -17.5,-2.5 + parent: 1 + - uid: 691 + components: + - type: Transform + pos: -17.5,-3.5 + parent: 1 + - uid: 692 + components: + - type: Transform + pos: -17.5,-4.5 + parent: 1 + - uid: 693 + components: + - type: Transform + pos: -17.5,-5.5 + parent: 1 + - uid: 694 + components: + - type: Transform + pos: -17.5,-6.5 + parent: 1 + - uid: 695 + components: + - type: Transform + pos: -17.5,-7.5 + parent: 1 + - uid: 696 + components: + - type: Transform + pos: -17.5,-8.5 + parent: 1 + - uid: 697 + components: + - type: Transform + pos: -16.5,-8.5 + parent: 1 + - uid: 698 + components: + - type: Transform + pos: -15.5,-8.5 + parent: 1 + - uid: 699 + components: + - type: Transform + pos: -14.5,-8.5 + parent: 1 + - uid: 700 + components: + - type: Transform + pos: -13.5,-8.5 + parent: 1 + - uid: 701 + components: + - type: Transform + pos: -12.5,-8.5 + parent: 1 + - uid: 702 + components: + - type: Transform + pos: -11.5,-8.5 + parent: 1 + - uid: 703 + components: + - type: Transform + pos: -18.5,-8.5 + parent: 1 + - uid: 704 + components: + - type: Transform + pos: -19.5,-8.5 + parent: 1 + - uid: 705 + components: + - type: Transform + pos: -20.5,-8.5 + parent: 1 + - uid: 706 + components: + - type: Transform + pos: -20.5,-5.5 + parent: 1 + - uid: 707 + components: + - type: Transform + pos: -19.5,-5.5 + parent: 1 + - uid: 708 + components: + - type: Transform + pos: -18.5,-5.5 + parent: 1 + - uid: 709 + components: + - type: Transform + pos: -20.5,-2.5 + parent: 1 + - uid: 710 + components: + - type: Transform + pos: -19.5,-2.5 + parent: 1 + - uid: 711 + components: + - type: Transform + pos: -18.5,-2.5 + parent: 1 +- proto: CableHV + entities: + - uid: 239 + components: + - type: Transform + pos: -15.5,3.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: -16.5,3.5 + parent: 1 + - uid: 241 + components: + - type: Transform + pos: -16.5,4.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: -16.5,5.5 + parent: 1 +- proto: CableMV + entities: + - uid: 544 + components: + - type: Transform + pos: -16.5,5.5 + parent: 1 + - uid: 545 + components: + - type: Transform + pos: -15.5,5.5 + parent: 1 + - uid: 546 + components: + - type: Transform + pos: -14.5,5.5 + parent: 1 + - uid: 547 + components: + - type: Transform + pos: -14.5,4.5 + parent: 1 + - uid: 548 + components: + - type: Transform + pos: -14.5,3.5 + parent: 1 + - uid: 549 + components: + - type: Transform + pos: -14.5,2.5 + parent: 1 + - uid: 550 + components: + - type: Transform + pos: -14.5,1.5 + parent: 1 + - uid: 551 + components: + - type: Transform + pos: -14.5,0.5 + parent: 1 + - uid: 552 + components: + - type: Transform + pos: -13.5,0.5 + parent: 1 + - uid: 553 + components: + - type: Transform + pos: -12.5,0.5 + parent: 1 + - uid: 554 + components: + - type: Transform + pos: -11.5,0.5 + parent: 1 + - uid: 555 + components: + - type: Transform + pos: -10.5,0.5 + parent: 1 + - uid: 556 + components: + - type: Transform + pos: -9.5,0.5 + parent: 1 + - uid: 557 + components: + - type: Transform + pos: -8.5,0.5 + parent: 1 + - uid: 558 + components: + - type: Transform + pos: -7.5,0.5 + parent: 1 + - uid: 559 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 560 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - uid: 561 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 562 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 563 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 564 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 565 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 566 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 567 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 568 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 569 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 570 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 571 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 572 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 573 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 574 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 575 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 576 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 577 + components: + - type: Transform + pos: -15.5,0.5 + parent: 1 + - uid: 578 + components: + - type: Transform + pos: -16.5,0.5 + parent: 1 + - uid: 579 + components: + - type: Transform + pos: -17.5,0.5 + parent: 1 + - uid: 580 + components: + - type: Transform + pos: -18.5,0.5 + parent: 1 + - uid: 581 + components: + - type: Transform + pos: -19.5,0.5 + parent: 1 + - uid: 582 + components: + - type: Transform + pos: -20.5,0.5 + parent: 1 + - uid: 583 + components: + - type: Transform + pos: -21.5,0.5 + parent: 1 + - uid: 584 + components: + - type: Transform + pos: -22.5,0.5 + parent: 1 + - uid: 585 + components: + - type: Transform + pos: -23.5,0.5 + parent: 1 + - uid: 586 + components: + - type: Transform + pos: -24.5,0.5 + parent: 1 + - uid: 587 + components: + - type: Transform + pos: -25.5,0.5 + parent: 1 + - uid: 600 + components: + - type: Transform + pos: -25.5,1.5 + parent: 1 + - uid: 601 + components: + - type: Transform + pos: -25.5,2.5 + parent: 1 + - uid: 602 + components: + - type: Transform + pos: -25.5,3.5 + parent: 1 + - uid: 603 + components: + - type: Transform + pos: -25.5,4.5 + parent: 1 + - uid: 604 + components: + - type: Transform + pos: -26.5,4.5 + parent: 1 + - uid: 605 + components: + - type: Transform + pos: -26.5,5.5 + parent: 1 +- proto: Carpet + entities: + - uid: 747 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-9.5 + parent: 1 + - uid: 748 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-8.5 + parent: 1 + - uid: 749 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-9.5 + parent: 1 + - uid: 750 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-8.5 + parent: 1 + - uid: 751 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-6.5 + parent: 1 + - uid: 752 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-5.5 + parent: 1 + - uid: 753 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-6.5 + parent: 1 + - uid: 754 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-5.5 + parent: 1 + - uid: 755 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-3.5 + parent: 1 + - uid: 756 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-2.5 + parent: 1 + - uid: 757 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-3.5 + parent: 1 + - uid: 758 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-2.5 + parent: 1 +- proto: Catwalk + entities: + - uid: 330 + components: + - type: Transform + pos: -29.5,-0.5 + parent: 1 + - uid: 331 + components: + - type: Transform + pos: -29.5,0.5 + parent: 1 + - uid: 332 + components: + - type: Transform + pos: -29.5,1.5 + parent: 1 + - uid: 333 + components: + - type: Transform + pos: -30.5,0.5 + parent: 1 +- proto: Chair + entities: + - uid: 735 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,-4.5 + parent: 1 + - uid: 736 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,-4.5 + parent: 1 + - uid: 737 + components: + - type: Transform + pos: -13.5,-3.5 + parent: 1 + - uid: 875 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,-1.5 + parent: 1 +- proto: ClosetEmergencyFilledRandom + entities: + - uid: 891 + components: + - type: Transform + pos: 11.5,9.5 + parent: 1 +- proto: ClothingBeltSalvageWebbing + entities: + - uid: 902 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 +- proto: ComputerCargoBounty + entities: + - uid: 872 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 +- proto: ConveyorBelt + entities: + - uid: 345 + components: + - type: Transform + pos: 12.5,2.5 + parent: 1 + - uid: 346 + components: + - type: Transform + pos: 12.5,1.5 + parent: 1 + - uid: 347 + components: + - type: Transform + pos: 12.5,0.5 + parent: 1 + - uid: 348 + components: + - type: Transform + pos: 12.5,-0.5 + parent: 1 + - uid: 349 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,-1.5 + parent: 1 + - uid: 350 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,-1.5 + parent: 1 + - uid: 351 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-1.5 + parent: 1 + - uid: 352 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-1.5 + parent: 1 +- proto: CrateFreezer + entities: + - uid: 731 + components: + - type: Transform + pos: -21.5,3.5 + parent: 1 +- proto: CrateGenericSteel + entities: + - uid: 808 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 809 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 + - uid: 873 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 +- proto: CrateSecure + entities: + - uid: 729 + components: + - type: Transform + pos: -15.5,5.5 + parent: 1 +- proto: DefaultStationBeaconSalvage + entities: + - uid: 900 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 +- proto: DrinkBeerBottleFull + entities: + - uid: 862 + components: + - type: Transform + pos: -13.609713,-4.316278 + parent: 1 + - uid: 863 + components: + - type: Transform + pos: -13.484713,-4.066278 + parent: 1 + - uid: 864 + components: + - type: Transform + pos: -13.328463,-4.326695 + parent: 1 +- proto: ExtinguisherCabinetFilled + entities: + - uid: 372 + components: + - type: Transform + pos: 12.5,12.5 + parent: 1 + - uid: 810 + components: + - type: Transform + pos: -26.5,-1.5 + parent: 1 + - uid: 811 + components: + - type: Transform + pos: -16.5,2.5 + parent: 1 + - uid: 812 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 + - uid: 813 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 +- proto: FireAlarm + entities: + - uid: 790 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -23.5,-1.5 + parent: 1 + - type: DeviceList + devices: + - 375 + - 376 + - 377 + - 378 + - 373 + - 310 + - 374 + - 381 + - 380 + - 379 + - uid: 793 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,3.5 + parent: 1 + - type: DeviceList + devices: + - 369 + - 799 + - 371 + - 370 + - uid: 880 + components: + - type: Transform + pos: 8.5,6.5 + parent: 1 + - type: DeviceList + devices: + - 371 + - 370 + - uid: 881 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 8.5,8.5 + parent: 1 + - type: DeviceList + devices: + - 799 +- proto: FirelockGlass + entities: + - uid: 310 + components: + - type: Transform + pos: -8.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 790 + - 336 + - uid: 369 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 801 + - 793 + - uid: 370 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 802 + - 801 + - 793 + - 880 + - uid: 371 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 802 + - 801 + - 793 + - 880 + - uid: 373 + components: + - type: Transform + pos: -13.5,-1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 788 + - 790 + - 336 + - uid: 374 + components: + - type: Transform + pos: -14.5,2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 790 + - 336 + - uid: 375 + components: + - type: Transform + pos: -16.5,-8.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 790 + - 336 + - uid: 376 + components: + - type: Transform + pos: -19.5,-8.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 790 + - 336 + - 785 + - uid: 377 + components: + - type: Transform + pos: -19.5,-5.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 790 + - 336 + - 786 + - uid: 378 + components: + - type: Transform + pos: -19.5,-2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 790 + - 336 + - 787 + - uid: 379 + components: + - type: Transform + pos: -25.5,-1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 784 + - 790 + - 336 + - uid: 380 + components: + - type: Transform + pos: -25.5,2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 782 + - 790 + - 336 + - uid: 381 + components: + - type: Transform + pos: -19.5,2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 783 + - 790 + - 336 + - uid: 799 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 793 + - 804 + - 803 + - 881 +- proto: FoodBoxDonkpocket + entities: + - uid: 779 + components: + - type: Transform + pos: -10.5,-4.5 + parent: 1 +- proto: GasOutletInjector + entities: + - uid: 334 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -30.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' +- proto: GasPipeBend + entities: + - uid: 398 + components: + - type: Transform + pos: -11.5,-5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 399 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,-5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 420 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 421 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 422 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 427 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 428 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 434 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 449 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -24.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 460 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 512 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 523 + components: + - type: Transform + pos: 4.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 524 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -25.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 528 + components: + - type: Transform + pos: -10.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 529 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -10.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 532 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -13.5,-4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 533 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,-9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 590 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -24.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 720 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 721 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPipeFourway + entities: + - uid: 391 + components: + - type: Transform + pos: -12.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 400 + components: + - type: Transform + pos: -18.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPipeStraight + entities: + - uid: 335 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -29.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 365 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 385 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,-7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 386 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,-6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 388 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 389 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 390 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 392 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 393 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 394 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 395 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 396 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 405 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -11.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 406 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -10.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 407 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -9.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 408 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -8.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 409 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 410 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 411 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 412 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 413 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 414 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 415 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 416 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 417 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 418 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 419 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 423 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 424 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 425 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 426 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 429 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 9.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 430 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 431 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 432 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 433 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 436 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 437 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 438 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 439 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 440 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 441 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 450 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -25.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 451 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -25.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 452 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -25.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 453 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -25.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 454 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -24.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 455 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -24.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 456 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -25.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 457 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -27.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 458 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -28.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 463 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -24.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 464 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -23.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 465 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -22.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 466 + components: + - type: Transform + pos: -21.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 467 + components: + - type: Transform + pos: -16.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 468 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -17.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 469 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 470 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 471 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 472 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 473 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,-4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 474 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,-5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 475 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,-4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 476 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 477 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 478 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 479 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 480 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 481 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 482 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 483 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 484 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 486 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -21.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 487 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -22.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 488 + components: + - type: Transform + pos: -23.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 489 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 491 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -15.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 493 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 494 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 495 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -9.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 496 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -8.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 497 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 498 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 499 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 500 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 501 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 502 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 503 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 504 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 505 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 506 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 509 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 510 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 511 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 513 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 515 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 516 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 517 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 518 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 519 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 520 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 521 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 530 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 531 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,-4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 534 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 535 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,-5.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 536 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 537 + components: + - type: Transform + pos: -18.5,-6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 538 + components: + - type: Transform + pos: -18.5,-7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 539 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -17.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 540 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -16.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 541 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -15.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 542 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -14.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 543 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -13.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 592 + components: + - type: Transform + pos: -25.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 593 + components: + - type: Transform + pos: -26.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 594 + components: + - type: Transform + pos: -26.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 595 + components: + - type: Transform + pos: -26.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 596 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 597 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 598 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 599 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 714 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -20.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 715 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -20.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 716 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -20.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 717 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -20.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 718 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -19.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 719 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPipeTJunction + entities: + - uid: 397 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,-4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 401 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -18.5,-5.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 402 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -18.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 403 + components: + - type: Transform + pos: -21.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 404 + components: + - type: Transform + pos: -16.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 435 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 442 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 459 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -26.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 461 + components: + - type: Transform + pos: -24.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 462 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -23.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 485 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -19.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 490 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -20.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 492 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 507 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 514 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 522 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 525 + components: + - type: Transform + pos: -18.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 526 + components: + - type: Transform + pos: -17.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 527 + components: + - type: Transform + pos: -13.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 591 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -25.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 722 + components: + - type: Transform + pos: -13.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPort + entities: + - uid: 726 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 727 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPressurePump + entities: + - uid: 723 + components: + - type: Transform + pos: -14.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasVentPump + entities: + - uid: 357 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -21.5,-0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 336 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 358 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -16.5,-0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 336 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 359 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -17.5,-9.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 336 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 360 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-8.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 785 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 361 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-5.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 786 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 362 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,-2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 787 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 363 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 364 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,-4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 788 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 366 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 804 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 367 + components: + - type: Transform + pos: 8.5,11.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 803 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 368 + components: + - type: Transform + pos: 9.5,3.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 802 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 383 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -25.5,-3.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 784 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 508 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 801 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 589 + components: + - type: Transform + pos: -24.5,4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 782 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 712 + components: + - type: Transform + pos: -19.5,3.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 783 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasVentScrubber + entities: + - uid: 382 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -23.5,-3.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 784 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 384 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,-8.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 387 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,-4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 788 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 443 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,7.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 804 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 444 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,3.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 801 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 445 + components: + - type: Transform + pos: 10.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 802 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 446 + components: + - type: Transform + pos: -12.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 336 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 447 + components: + - type: Transform + pos: -23.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 336 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 448 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,-6.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 336 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 588 + components: + - type: Transform + pos: -26.5,4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 782 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 713 + components: + - type: Transform + pos: -20.5,4.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 783 + - type: AtmosPipeColor + color: '#990000FF' +- proto: GeneratorBasic15kW + entities: + - uid: 237 + components: + - type: Transform + pos: -16.5,3.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: -15.5,3.5 + parent: 1 +- proto: Grille + entities: + - uid: 3 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: -10.5,2.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: -1.5,10.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 7.5,14.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 8.5,14.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 13.5,9.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 10.5,-0.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 11.5,-0.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: 11.5,0.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: 11.5,2.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 7.5,-2.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: -9.5,2.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: -8.5,2.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: -8.5,1.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: -5.5,1.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: -4.5,1.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 169 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 170 + components: + - type: Transform + pos: -7.5,-0.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: -8.5,-0.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: -8.5,-1.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: -9.5,-5.5 + parent: 1 + - uid: 211 + components: + - type: Transform + pos: -9.5,-4.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: -9.5,-3.5 + parent: 1 + - uid: 213 + components: + - type: Transform + pos: -9.5,-2.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: -16.5,-4.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: -16.5,-3.5 + parent: 1 + - uid: 216 + components: + - type: Transform + pos: -14.5,-1.5 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: -12.5,-1.5 + parent: 1 + - uid: 229 + components: + - type: Transform + pos: -20.5,5.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: -19.5,5.5 + parent: 1 + - uid: 233 + components: + - type: Transform + pos: -20.5,2.5 + parent: 1 + - uid: 234 + components: + - type: Transform + pos: -18.5,2.5 + parent: 1 + - uid: 292 + components: + - type: Transform + pos: -28.5,-4.5 + parent: 1 + - uid: 293 + components: + - type: Transform + pos: -28.5,-3.5 + parent: 1 + - uid: 294 + components: + - type: Transform + pos: -28.5,-2.5 + parent: 1 + - uid: 295 + components: + - type: Transform + pos: -26.5,-5.5 + parent: 1 + - uid: 296 + components: + - type: Transform + pos: -25.5,-5.5 + parent: 1 + - uid: 297 + components: + - type: Transform + pos: -24.5,-5.5 + parent: 1 + - uid: 306 + components: + - type: Transform + pos: -17.5,-10.5 + parent: 1 + - uid: 307 + components: + - type: Transform + pos: -18.5,-10.5 + parent: 1 + - uid: 324 + components: + - type: Transform + pos: -28.5,-0.5 + parent: 1 + - uid: 325 + components: + - type: Transform + pos: -28.5,0.5 + parent: 1 + - uid: 326 + components: + - type: Transform + pos: -28.5,1.5 + parent: 1 +- proto: HospitalCurtainsOpen + entities: + - uid: 840 + components: + - type: Transform + pos: -15.5,-7.5 + parent: 1 + - uid: 871 + components: + - type: Transform + pos: -14.5,-7.5 + parent: 1 +- proto: IntercomCommon + entities: + - uid: 854 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,-5.5 + parent: 1 + - uid: 879 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,3.5 + parent: 1 + - uid: 898 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,6.5 + parent: 1 +- proto: KitchenMicrowave + entities: + - uid: 777 + components: + - type: Transform + pos: -10.5,-2.5 + parent: 1 +- proto: KitchenReagentGrinder + entities: + - uid: 778 + components: + - type: Transform + pos: -10.5,-3.5 + parent: 1 +- proto: LockerSalvageSpecialistFilled + entities: + - uid: 766 + components: + - type: Transform + pos: -23.5,-4.5 + parent: 1 + - uid: 767 + components: + - type: Transform + pos: -24.5,-4.5 + parent: 1 + - uid: 768 + components: + - type: Transform + pos: -25.5,-4.5 + parent: 1 + - uid: 769 + components: + - type: Transform + pos: -26.5,-4.5 + parent: 1 + - uid: 770 + components: + - type: Transform + pos: -27.5,-4.5 + parent: 1 +- proto: MedicalBed + entities: + - uid: 774 + components: + - type: Transform + pos: -21.5,4.5 + parent: 1 +- proto: MedkitFilled + entities: + - uid: 772 + components: + - type: Transform + pos: -18.5,3.5 + parent: 1 +- proto: MedkitToxinFilled + entities: + - uid: 773 + components: + - type: Transform + pos: -18.5,4.5 + parent: 1 +- proto: Mirror + entities: + - uid: 899 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,-7.5 + parent: 1 +- proto: OreBox + entities: + - uid: 354 + components: + - type: Transform + pos: 7.5,-1.5 + parent: 1 + - uid: 355 + components: + - type: Transform + pos: 9.5,0.5 + parent: 1 + - uid: 356 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 + - uid: 815 + components: + - type: Transform + pos: 12.5,9.5 + parent: 1 +- proto: OreProcessor + entities: + - uid: 343 + components: + - type: Transform + pos: 12.5,3.5 + parent: 1 +- proto: OxygenCanister + entities: + - uid: 728 + components: + - type: Transform + pos: -14.5,5.5 + parent: 1 +- proto: PlasticFlapsClear + entities: + - uid: 867 + components: + - type: Transform + pos: 9.5,-1.5 + parent: 1 +- proto: Poweredlight + entities: + - uid: 817 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -17.5,-6.5 + parent: 1 + - uid: 818 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -15.5,-0.5 + parent: 1 + - uid: 819 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -23.5,-0.5 + parent: 1 + - uid: 831 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,-5.5 + parent: 1 + - uid: 832 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-1.5 + parent: 1 + - uid: 833 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,5.5 + parent: 1 + - uid: 834 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,12.5 + parent: 1 + - uid: 835 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,3.5 + parent: 1 + - uid: 836 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,1.5 + parent: 1 +- proto: PoweredSmallLight + entities: + - uid: 814 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - uid: 820 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -9.5,-0.5 + parent: 1 + - uid: 821 + components: + - type: Transform + pos: -15.5,5.5 + parent: 1 + - uid: 822 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -21.5,4.5 + parent: 1 + - uid: 823 + components: + - type: Transform + pos: -25.5,4.5 + parent: 1 + - uid: 824 + components: + - type: Transform + pos: -26.5,-2.5 + parent: 1 + - uid: 825 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-9.5 + parent: 1 + - uid: 826 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-6.5 + parent: 1 + - uid: 827 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-3.5 + parent: 1 + - uid: 828 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,-8.5 + parent: 1 + - uid: 829 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,-8.5 + parent: 1 + - uid: 837 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,-1.5 + parent: 1 + - uid: 838 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,4.5 + parent: 1 + - uid: 839 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 868 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 892 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 +- proto: Rack + entities: + - uid: 876 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,-1.5 + parent: 1 +- proto: ReinforcedWindow + entities: + - uid: 11 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -1.5,10.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: 8.5,14.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 7.5,14.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: 13.5,9.5 + parent: 1 + - uid: 129 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: -10.5,2.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: -9.5,2.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: -8.5,2.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: -8.5,1.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 179 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: -5.5,1.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: -4.5,1.5 + parent: 1 + - uid: 182 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: -7.5,-0.5 + parent: 1 + - uid: 192 + components: + - type: Transform + pos: -8.5,-0.5 + parent: 1 + - uid: 193 + components: + - type: Transform + pos: -8.5,-1.5 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: -9.5,-5.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: -9.5,-4.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: -9.5,-3.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: -9.5,-2.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: 7.5,-2.5 + parent: 1 + - uid: 298 + components: + - type: Transform + pos: -24.5,-5.5 + parent: 1 + - uid: 299 + components: + - type: Transform + pos: -25.5,-5.5 + parent: 1 + - uid: 300 + components: + - type: Transform + pos: -26.5,-5.5 + parent: 1 + - uid: 301 + components: + - type: Transform + pos: -28.5,-4.5 + parent: 1 + - uid: 302 + components: + - type: Transform + pos: -28.5,-3.5 + parent: 1 + - uid: 303 + components: + - type: Transform + pos: -28.5,-2.5 + parent: 1 + - uid: 304 + components: + - type: Transform + pos: -18.5,-10.5 + parent: 1 + - uid: 305 + components: + - type: Transform + pos: -17.5,-10.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: -28.5,-0.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: -28.5,0.5 + parent: 1 + - uid: 329 + components: + - type: Transform + pos: -28.5,1.5 + parent: 1 +- proto: SignalButtonDirectional + entities: + - uid: 842 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,-9.5 + parent: 1 + - type: DeviceLinkSource + linkedPorts: + 848: + - - Pressed + - DoorBolt + - uid: 843 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,-6.5 + parent: 1 + - type: DeviceLinkSource + linkedPorts: + 849: + - - Pressed + - DoorBolt + - uid: 844 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,-3.5 + parent: 1 + - type: DeviceLinkSource + linkedPorts: + 850: + - - Pressed + - DoorBolt +- proto: SignSecurearea + entities: + - uid: 869 + components: + - type: Transform + pos: -1.5,10.5 + parent: 1 +- proto: SignShock + entities: + - uid: 870 + components: + - type: Transform + pos: -15.5,6.5 + parent: 1 +- proto: SignSomethingOld + entities: + - uid: 865 + components: + - type: Transform + pos: -11.5,-1.5 + parent: 1 +- proto: SignSomethingOld2 + entities: + - uid: 866 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 +- proto: Sink + entities: + - uid: 780 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -10.5,-5.5 + parent: 1 + - uid: 781 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,-7.5 + parent: 1 +- proto: SpaceHeater + entities: + - uid: 244 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 +- proto: SubstationBasic + entities: + - uid: 243 + components: + - type: Transform + pos: -16.5,5.5 + parent: 1 +- proto: SuitStorageSalv + entities: + - uid: 882 + components: + - type: Transform + pos: 9.5,9.5 + parent: 1 + - uid: 883 + components: + - type: Transform + pos: 8.5,9.5 + parent: 1 + - uid: 884 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 885 + components: + - type: Transform + pos: 6.5,9.5 + parent: 1 + - uid: 886 + components: + - type: Transform + pos: 6.5,13.5 + parent: 1 + - uid: 887 + components: + - type: Transform + pos: 7.5,13.5 + parent: 1 + - uid: 888 + components: + - type: Transform + pos: 8.5,13.5 + parent: 1 + - uid: 889 + components: + - type: Transform + pos: 9.5,13.5 + parent: 1 +- proto: SurveillanceCameraRouterGeneral + entities: + - uid: 771 + components: + - type: Transform + pos: -25.5,4.5 + parent: 1 +- proto: Table + entities: + - uid: 86 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 + - uid: 732 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -18.5,3.5 + parent: 1 + - uid: 733 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -18.5,4.5 + parent: 1 + - uid: 734 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -13.5,-4.5 + parent: 1 + - uid: 738 + components: + - type: Transform + pos: -10.5,-4.5 + parent: 1 + - uid: 739 + components: + - type: Transform + pos: -10.5,-3.5 + parent: 1 + - uid: 740 + components: + - type: Transform + pos: -10.5,-2.5 + parent: 1 + - uid: 744 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-9.5 + parent: 1 + - uid: 745 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-6.5 + parent: 1 + - uid: 746 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -21.5,-3.5 + parent: 1 + - uid: 807 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 +- proto: ToiletDirtyWater + entities: + - uid: 830 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,-7.5 + parent: 1 +- proto: ToolboxMechanicalFilledAllTools + entities: + - uid: 901 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 +- proto: TwoWayLever + entities: + - uid: 353 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - type: DeviceLinkSource + linkedPorts: + 345: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off + 346: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off + 347: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off + 348: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off + 349: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off + 350: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off + 351: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off + 352: + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off +- proto: UnfinishedMachineFrame + entities: + - uid: 878 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,5.5 + parent: 1 +- proto: VendingMachineCigs + entities: + - uid: 776 + components: + - type: Transform + pos: -11.5,-2.5 + parent: 1 +- proto: VendingMachineSalvage + entities: + - uid: 765 + components: + - type: Transform + pos: -27.5,-2.5 + parent: 1 + - uid: 805 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 806 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 +- proto: VendingMachineSnack + entities: + - uid: 775 + components: + - type: Transform + pos: -15.5,-2.5 + parent: 1 +- proto: VendingMachineTankDispenserEVA + entities: + - uid: 890 + components: + - type: Transform + pos: 9.5,11.5 + parent: 1 +- proto: WallmountTelevision + entities: + - uid: 861 + components: + - type: Transform + pos: -14.5,-6.5 + parent: 1 +- proto: WallReinforced + entities: + - uid: 246 + components: + - type: Transform + pos: -22.5,2.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: -22.5,3.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: -22.5,4.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: -22.5,5.5 + parent: 1 + - uid: 311 + components: + - type: Transform + pos: -23.5,5.5 + parent: 1 + - uid: 312 + components: + - type: Transform + pos: -24.5,5.5 + parent: 1 + - uid: 313 + components: + - type: Transform + pos: -25.5,5.5 + parent: 1 + - uid: 314 + components: + - type: Transform + pos: -26.5,5.5 + parent: 1 + - uid: 315 + components: + - type: Transform + pos: -27.5,5.5 + parent: 1 + - uid: 316 + components: + - type: Transform + pos: -28.5,5.5 + parent: 1 + - uid: 317 + components: + - type: Transform + pos: -28.5,4.5 + parent: 1 + - uid: 318 + components: + - type: Transform + pos: -28.5,3.5 + parent: 1 + - uid: 319 + components: + - type: Transform + pos: -28.5,2.5 + parent: 1 + - uid: 320 + components: + - type: Transform + pos: -27.5,2.5 + parent: 1 + - uid: 321 + components: + - type: Transform + pos: -26.5,2.5 + parent: 1 + - uid: 322 + components: + - type: Transform + pos: -24.5,2.5 + parent: 1 + - uid: 323 + components: + - type: Transform + pos: -23.5,2.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 2 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 5.5,8.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 1.5,-2.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 6.5,6.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 8.5,6.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 6.5,8.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 8.5,8.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 9.5,8.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 10.5,8.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 10.5,12.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 10.5,13.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 10.5,14.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 9.5,14.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 5.5,13.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 5.5,14.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 6.5,14.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 11.5,8.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 12.5,8.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 13.5,8.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 13.5,12.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 12.5,12.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 11.5,12.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 6.5,-2.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 6.5,-1.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 8.5,-2.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 9.5,-2.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 10.5,-2.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 11.5,-2.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 12.5,-2.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 13.5,-2.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: 13.5,-1.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 13.5,-0.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 13.5,0.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 13.5,1.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 13.5,2.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: 13.5,3.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 13.5,4.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 13.5,5.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: 13.5,6.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: 11.5,6.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: -11.5,2.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: -12.5,2.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: -13.5,2.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: -15.5,2.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: -16.5,2.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: -17.5,2.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: -11.5,3.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: -11.5,4.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: -11.5,5.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: -11.5,6.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: -12.5,6.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: -13.5,6.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: -14.5,6.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: -15.5,6.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: -16.5,6.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: -17.5,6.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: -17.5,5.5 + parent: 1 + - uid: 153 + components: + - type: Transform + pos: -17.5,4.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: -17.5,3.5 + parent: 1 + - uid: 194 + components: + - type: Transform + pos: -26.5,-1.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: -9.5,-1.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: -10.5,-1.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: -11.5,-1.5 + parent: 1 + - uid: 198 + components: + - type: Transform + pos: -15.5,-1.5 + parent: 1 + - uid: 199 + components: + - type: Transform + pos: -16.5,-1.5 + parent: 1 + - uid: 200 + components: + - type: Transform + pos: -9.5,-6.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: -10.5,-6.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: -11.5,-6.5 + parent: 1 + - uid: 203 + components: + - type: Transform + pos: -12.5,-6.5 + parent: 1 + - uid: 204 + components: + - type: Transform + pos: -13.5,-6.5 + parent: 1 + - uid: 205 + components: + - type: Transform + pos: -14.5,-6.5 + parent: 1 + - uid: 206 + components: + - type: Transform + pos: -15.5,-6.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: -16.5,-6.5 + parent: 1 + - uid: 208 + components: + - type: Transform + pos: -16.5,-5.5 + parent: 1 + - uid: 209 + components: + - type: Transform + pos: -16.5,-2.5 + parent: 1 + - uid: 226 + components: + - type: Transform + pos: -18.5,5.5 + parent: 1 + - uid: 227 + components: + - type: Transform + pos: -21.5,5.5 + parent: 1 + - uid: 228 + components: + - type: Transform + pos: -21.5,2.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: -19.5,-1.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: -20.5,-1.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: -21.5,-1.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: -22.5,-1.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: -22.5,-2.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: -22.5,-3.5 + parent: 1 + - uid: 256 + components: + - type: Transform + pos: -22.5,-4.5 + parent: 1 + - uid: 257 + components: + - type: Transform + pos: -19.5,-3.5 + parent: 1 + - uid: 258 + components: + - type: Transform + pos: -19.5,-4.5 + parent: 1 + - uid: 259 + components: + - type: Transform + pos: -20.5,-4.5 + parent: 1 + - uid: 260 + components: + - type: Transform + pos: -21.5,-4.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: -22.5,-5.5 + parent: 1 + - uid: 262 + components: + - type: Transform + pos: -22.5,-6.5 + parent: 1 + - uid: 263 + components: + - type: Transform + pos: -19.5,-6.5 + parent: 1 + - uid: 264 + components: + - type: Transform + pos: -19.5,-7.5 + parent: 1 + - uid: 265 + components: + - type: Transform + pos: -20.5,-7.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: -21.5,-7.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: -22.5,-7.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: -22.5,-9.5 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: -22.5,-10.5 + parent: 1 + - uid: 270 + components: + - type: Transform + pos: -22.5,-8.5 + parent: 1 + - uid: 271 + components: + - type: Transform + pos: -21.5,-10.5 + parent: 1 + - uid: 272 + components: + - type: Transform + pos: -20.5,-10.5 + parent: 1 + - uid: 273 + components: + - type: Transform + pos: -19.5,-10.5 + parent: 1 + - uid: 274 + components: + - type: Transform + pos: -19.5,-9.5 + parent: 1 + - uid: 275 + components: + - type: Transform + pos: -10.5,-7.5 + parent: 1 + - uid: 276 + components: + - type: Transform + pos: -10.5,-8.5 + parent: 1 + - uid: 277 + components: + - type: Transform + pos: -10.5,-9.5 + parent: 1 + - uid: 278 + components: + - type: Transform + pos: -11.5,-9.5 + parent: 1 + - uid: 279 + components: + - type: Transform + pos: -12.5,-9.5 + parent: 1 + - uid: 280 + components: + - type: Transform + pos: -13.5,-9.5 + parent: 1 + - uid: 281 + components: + - type: Transform + pos: -14.5,-9.5 + parent: 1 + - uid: 282 + components: + - type: Transform + pos: -15.5,-9.5 + parent: 1 + - uid: 283 + components: + - type: Transform + pos: -16.5,-9.5 + parent: 1 + - uid: 284 + components: + - type: Transform + pos: -16.5,-10.5 + parent: 1 + - uid: 285 + components: + - type: Transform + pos: -16.5,-7.5 + parent: 1 + - uid: 286 + components: + - type: Transform + pos: -13.5,-7.5 + parent: 1 + - uid: 287 + components: + - type: Transform + pos: -23.5,-5.5 + parent: 1 + - uid: 288 + components: + - type: Transform + pos: -27.5,-5.5 + parent: 1 + - uid: 289 + components: + - type: Transform + pos: -28.5,-5.5 + parent: 1 + - uid: 290 + components: + - type: Transform + pos: -24.5,-1.5 + parent: 1 + - uid: 291 + components: + - type: Transform + pos: -23.5,-1.5 + parent: 1 + - uid: 308 + components: + - type: Transform + pos: -27.5,-1.5 + parent: 1 + - uid: 309 + components: + - type: Transform + pos: -28.5,-1.5 + parent: 1 + - uid: 340 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,-0.5 + parent: 1 + - uid: 341 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,1.5 + parent: 1 + - uid: 342 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,3.5 + parent: 1 +- proto: WaterTankFull + entities: + - uid: 841 + components: + - type: Transform + pos: -23.5,-2.5 + parent: 1 + - uid: 897 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 +- proto: WeldingFuelTankFull + entities: + - uid: 730 + components: + - type: Transform + pos: -12.5,5.5 + parent: 1 +- proto: Windoor + entities: + - uid: 741 + components: + - type: Transform + pos: -15.5,-7.5 + parent: 1 + - uid: 742 + components: + - type: Transform + pos: -14.5,-7.5 + parent: 1 +- proto: Window + entities: + - uid: 79 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: 10.5,-0.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: 11.5,-0.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: 11.5,0.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: 11.5,2.5 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: -16.5,-4.5 + parent: 1 + - uid: 219 + components: + - type: Transform + pos: -16.5,-3.5 + parent: 1 + - uid: 220 + components: + - type: Transform + pos: -14.5,-1.5 + parent: 1 + - uid: 221 + components: + - type: Transform + pos: -12.5,-1.5 + parent: 1 + - uid: 231 + components: + - type: Transform + pos: -20.5,5.5 + parent: 1 + - uid: 232 + components: + - type: Transform + pos: -19.5,5.5 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: -20.5,2.5 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: -18.5,2.5 + parent: 1 +- proto: WindowDirectional + entities: + - uid: 743 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -14.5,-7.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/pizza_party.yml b/Resources/Maps/Lavaland/pizza_party.yml new file mode 100644 index 0000000000..e7882c538c --- /dev/null +++ b/Resources/Maps/Lavaland/pizza_party.yml @@ -0,0 +1,668 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 03:25:40 + entityCount: 88 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 3: Space + 2: FloorBasalt + 4: FloorBrokenWood + 0: FloorWood + 1: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.375,-0.484375 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAACAAAAAAAAAAAAAAAAAAAAAAACAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAABAAAAAAACAAAAAAADAAAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAABAAAAAAABBAAAAAABAAAAAAACAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAAAAAABAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAAAAAAADAAAAAAAAAAAAAAADAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAABAAAAAAACAgAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAAAAAAAAAAAAAAADAAAAAAABAAAAAAAAAAAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAAAAAAACAAAAAAABAAAAAAABAAAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAADAAAAAAADAAAAAAACAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAAAAAAACAAAAAAABBAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAADAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAABAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Basalt2 + decals: + 3: 6,2 + - node: + color: '#FFFFFFFF' + id: Basalt9 + decals: + 2: -2,-4 + - node: + cleanable: True + color: '#FFFFFFFF' + id: DirtHeavy + decals: + 4: -5,-4 + 5: -6,-4 + 6: -4,-3 + 7: -6,-2 + 8: -7,-2 + 9: -7,-1 + 10: -4,-1 + 11: -3,0 + 12: -3,-1 + 13: -6,1 + 14: -5,2 + 15: -5,3 + 16: -2,5 + 17: -1,5 + 18: 0,5 + 19: 0,4 + 20: 1,4 + 21: 1,5 + 22: 5,-1 + 23: 5,0 + 25: 4,1 + 26: 4,0 + 27: 4,-1 + 28: 5,2 + 29: 5,2 + 30: 5,3 + - node: + cleanable: True + color: '#FFFFFFFF' + id: Remains + decals: + 1: -2,3 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 65535 + 0,-1: + 0: 65343 + -1,0: + 0: 65535 + 0,1: + 0: 63 + -1,1: + 0: 207 + 1,0: + 0: 30583 + 1,1: + 0: 69 + 1,-1: + 0: 30019 + -2,0: + 0: 52428 + -2,-1: + 0: 61132 + -2,1: + 0: 12 + -1,-1: + 0: 65439 + 0,-2: + 0: 61440 + -1,-2: + 0: 61440 + 1,-2: + 0: 12288 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: APCBasic + entities: + - uid: 55 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-2.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 86 + components: + - type: Transform + pos: -5.5,4.5 + parent: 1 +- proto: BoxDarts + entities: + - uid: 88 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 30 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 +- proto: ChairWood + entities: + - uid: 31 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,2.5 + parent: 1 + - uid: 32 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,3.5 + parent: 1 + - uid: 33 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,-0.5 + parent: 1 + - uid: 34 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,2.5 + parent: 1 + - uid: 35 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,0.5 + parent: 1 + - uid: 41 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,0.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 65 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-0.5 + parent: 1 + - uid: 66 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,-0.5 + parent: 1 +- proto: ClothingHeadHatXmasCrown + entities: + - uid: 79 + components: + - type: MetaData + desc: Happy birthday! + name: birthday crown + - type: Transform + pos: -0.5,2.5 + parent: 1 +- proto: FoodBoxPizzaFilled + entities: + - uid: 52 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 +- proto: FoodCakeBirthday + entities: + - uid: 51 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 +- proto: FoodPizzaMargheritaSlice + entities: + - uid: 73 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 +- proto: FoodPizzaMeatSlice + entities: + - uid: 72 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 +- proto: FoodPizzaMushroomSlice + entities: + - uid: 85 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 +- proto: FoodPlateSmall + entities: + - uid: 74 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 +- proto: Fork + entities: + - uid: 78 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 +- proto: KitchenKnife + entities: + - uid: 83 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 +- proto: Poweredlight + entities: + - uid: 23 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,4.5 + parent: 1 + - uid: 28 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-1.5 + parent: 1 +- proto: PresentRandom + entities: + - uid: 36 + components: + - type: MetaData + name: birthday present + - type: Transform + pos: -3.2893493,-1.4472996 + parent: 1 + - uid: 38 + components: + - type: MetaData + name: birthday present + - type: Transform + pos: -1.5289326,-1.218133 + parent: 1 +- proto: PresentRandomCash + entities: + - uid: 37 + components: + - type: MetaData + name: birthday present + - type: Transform + pos: 0.5,1.5 + parent: 1 +- proto: TableWood + entities: + - uid: 2 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 + - uid: 67 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,4.5 + parent: 1 + - uid: 68 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,4.5 + parent: 1 + - uid: 69 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,4.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 10 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -4.5,-4.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -5.5,-4.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 5.5,-1.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 29 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,4.5 + parent: 1 +- proto: WaterCooler + entities: + - uid: 80 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/ripley.yml b/Resources/Maps/Lavaland/ripley.yml new file mode 100644 index 0000000000..c465198e5d --- /dev/null +++ b/Resources/Maps/Lavaland/ripley.yml @@ -0,0 +1,184 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 03:10:54 + entityCount: 18 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorBasalt +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.765625,-0.53125 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + color: '#FFFFFFFF' + id: Remains + decals: + 0: 1.1037478,0.2636062 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 1891 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AsteroidRock + entities: + - uid: 2 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 +- proto: ClothingShoesBootsSalvage + entities: + - uid: 17 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 +- proto: SpawnMechRipley + entities: + - uid: 18 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 +... From 739917641d9ac6567c01e57b443d8ae372139437 Mon Sep 17 00:00:00 2001 From: TytosB <54259736+TytosB@users.noreply.github.com> Date: Sat, 19 Apr 2025 23:32:19 -0500 Subject: [PATCH 420/622] Salvage ruins- the deadly sins (#36754) --- Resources/Maps/Lavaland/Envy.yml | 540 +++++++++++++++++ Resources/Maps/Lavaland/Gluttony.yml | 552 +++++++++++++++++ Resources/Maps/Lavaland/Greed.yml | 571 ++++++++++++++++++ Resources/Maps/Lavaland/Pride.yml | 528 +++++++++++++++++ Resources/Maps/Lavaland/Wrath.yml | 852 +++++++++++++++++++++++++++ 5 files changed, 3043 insertions(+) create mode 100644 Resources/Maps/Lavaland/Envy.yml create mode 100644 Resources/Maps/Lavaland/Gluttony.yml create mode 100644 Resources/Maps/Lavaland/Greed.yml create mode 100644 Resources/Maps/Lavaland/Pride.yml create mode 100644 Resources/Maps/Lavaland/Wrath.yml diff --git a/Resources/Maps/Lavaland/Envy.yml b/Resources/Maps/Lavaland/Envy.yml new file mode 100644 index 0000000000..50f85fb6fa --- /dev/null +++ b/Resources/Maps/Lavaland/Envy.yml @@ -0,0 +1,540 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 04:10:43 + entityCount: 81 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 2: Space + 0: Plating + 1: PlatingDamaged +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.546875,-0.546875 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAACAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + color: '#690000FF' + id: footprint + decals: + 4: -0.082383215,-4.733446 + 5: 0.17542928,-4.170946 + 6: -0.15269572,-3.6787586 + 7: 0.105116785,-3.2100086 + 8: -0.105820715,-2.5068836 + 9: 0.15199178,-1.874071 + 10: -0.15269572,-1.217821 + 11: 0.105116785,-0.7256335 + 12: -0.19957072,0.094679 + 13: 0.22230428,0.563429 + 14: -0.058945715,1.172804 + 15: 0.33949178,1.6181164 + - node: + cleanable: True + color: '#690000FF' + id: splatter + decals: + 2: -1,2 + 3: -2,4 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 26487 + 0,-1: + 0: 30583 + -1,0: + 0: 52428 + 0,1: + 0: 4 + 0,-2: + 0: 30577 + -1,-2: + 0: 52416 + -1,-1: + 0: 52428 + -1,1: + 0: 4 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: Mirror + entities: + - uid: 60 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 +- proto: RandomCargoCorpseSpawner + entities: + - uid: 59 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 +- proto: RitualDagger + entities: + - uid: 58 + components: + - type: Transform + pos: 0.5582418,2.5165539 + parent: 1 +- proto: ShardGlass + entities: + - uid: 68 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 2.0348043,-2.8975086 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 1.4019918,-1.9600086 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 2.6207418,0.008741498 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: -1.5511332,0.4306165 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: -1.4105082,-1.9600086 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: -1.1995707,-4.139696 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: -1.7151957,-5.4287586 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: -1.6683207,-3.0850086 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: -1.8558207,-0.624071 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: -1.2464457,1.813429 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 2.0582418,1.7431165 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 0.41761678,1.0868665 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 0.5348043,-5.405321 + parent: 1 +- proto: WallSolidRust + entities: + - uid: 2 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: -1.5,7.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 0.5,6.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -2.5,-6.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -2.5,-7.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -1.5,-7.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 1.5,-7.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 3.5,-7.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/Gluttony.yml b/Resources/Maps/Lavaland/Gluttony.yml new file mode 100644 index 0000000000..ab10c6372e --- /dev/null +++ b/Resources/Maps/Lavaland/Gluttony.yml @@ -0,0 +1,552 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 04:10:17 + entityCount: 82 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorFreezer +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.546875,-0.453125 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 13311 + 0,-1: + 0: 62259 + -1,0: + 0: 35071 + 0,1: + 0: 787 + -1,1: + 0: 2056 + 1,0: + 0: 119 + 1,-1: + 0: 28672 + -2,0: + 0: 204 + -2,-1: + 0: 49152 + -1,-1: + 0: 63624 + 0,-2: + 0: 13056 + -1,-2: + 0: 34816 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AltarConvertRed + entities: + - uid: 62 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 +- proto: FloorLavaEntity + entities: + - uid: 60 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 +- proto: FoodBowlBigTrash + entities: + - uid: 65 + components: + - type: Transform + pos: -2.7222345,0.06521797 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 4.6683903,0.37771797 + parent: 1 +- proto: FoodBurgerSuper + entities: + - uid: 63 + components: + - type: Transform + pos: 0.46713123,3.5637343 + parent: 1 +- proto: FoodPlateTrash + entities: + - uid: 67 + components: + - type: Transform + pos: -1.3003595,1.643343 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 0.8715155,-2.950407 + parent: 1 +- proto: PlasmaDoor + entities: + - uid: 24 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 0.5,-6.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 +- proto: RandomSpawner100 + entities: + - uid: 69 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,-1.5 + parent: 1 + - uid: 70 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,1.5 + parent: 1 + - uid: 71 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,-0.5 + parent: 1 + - uid: 72 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,1.5 + parent: 1 + - uid: 73 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-0.5 + parent: 1 + - uid: 74 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,0.5 + parent: 1 + - uid: 75 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,-5.5 + parent: 1 + - uid: 76 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-5.5 + parent: 1 + - uid: 77 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,-1.5 + parent: 1 + - uid: 78 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,-3.5 + parent: 1 + - uid: 79 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,0.5 + parent: 1 + - uid: 80 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,-0.5 + parent: 1 + - uid: 81 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,1.5 + parent: 1 +- proto: RitualDagger + entities: + - uid: 64 + components: + - type: Transform + pos: -5.4736495,1.4413903 + parent: 1 +- proto: StorageImplanter + entities: + - uid: 82 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5161176,6.4741917 + parent: 1 +- proto: WallUranium + entities: + - uid: 2 + components: + - type: Transform + pos: -1.5,7.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 5.5,2.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 7.5,-1.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 7.5,-0.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: -1.5,2.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -3.5,2.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -5.5,2.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -6.5,2.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -4.5,2.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -6.5,-1.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -5.5,-1.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: -0.5,-6.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: -1.5,-6.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 1.5,-6.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 6.5,-1.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 5.5,-1.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 4.5,-1.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/Greed.yml b/Resources/Maps/Lavaland/Greed.yml new file mode 100644 index 0000000000..8f8688f9b5 --- /dev/null +++ b/Resources/Maps/Lavaland/Greed.yml @@ -0,0 +1,571 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 04:11:34 + entityCount: 87 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorElevatorShaft +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.53125,-0.46875 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 14335 + 0,-1: + 0: 62259 + -1,0: + 0: 36078 + 0,1: + 0: 3 + -1,1: + 0: 8 + -1,-1: + 0: 59528 + 0,-2: + 0: 4096 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: BlockGameArcade + entities: + - uid: 52 + components: + - type: Transform + pos: -1.5,2.5 + parent: 1 +- proto: CartridgeMagnum + entities: + - uid: 55 + components: + - type: Transform + pos: -0.26962537,4.364311 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: -0.5665004,4.254936 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: -0.34775037,4.114311 + parent: 1 +- proto: CrateCargoGambling + entities: + - uid: 51 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 +- proto: DartBlue + entities: + - uid: 85 + components: + - type: Transform + pos: -2.6758754,1.1002662 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: -2.4258754,0.9283912 + parent: 1 +- proto: DartPurple + entities: + - uid: 87 + components: + - type: Transform + pos: -2.6915004,0.9752662 + parent: 1 +- proto: GoldDoor + entities: + - uid: 39 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 1 +- proto: GoldOre + entities: + - uid: 74 + components: + - type: Transform + pos: 3.5741246,1.5690162 + parent: 1 +- proto: IngotGold + entities: + - uid: 63 + components: + - type: Transform + pos: -1.5977504,1.520561 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 0.48037463,-0.43256402 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 2.4022496,1.536186 + parent: 1 +- proto: SpaceCash100 + entities: + - uid: 76 + components: + - type: Transform + pos: -2.5665004,-0.24348378 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: -2.6290004,0.10026622 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: -2.5508754,-0.16535878 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 3.4491246,-0.41535878 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 3.3084996,-0.21223378 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 3.5584996,-0.16535878 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 3.3709996,0.022141218 + parent: 1 +- proto: SpaceCash1000 + entities: + - uid: 75 + components: + - type: Transform + pos: -2.5508754,0.6783912 + parent: 1 +- proto: SpaceCash2500 + entities: + - uid: 83 + components: + - type: Transform + pos: 3.4959996,0.8033912 + parent: 1 +- proto: SpaceVillainArcade + entities: + - uid: 53 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 +- proto: TableCarpet + entities: + - uid: 40 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 +- proto: TargetDarts + entities: + - uid: 84 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 +- proto: TreasureCoinDiamond + entities: + - uid: 58 + components: + - type: Transform + pos: -0.6602504,3.645561 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: -0.44150037,3.786186 + parent: 1 +- proto: TreasureCoinGold + entities: + - uid: 61 + components: + - type: Transform + pos: 1.6678746,4.504936 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 1.2459996,4.129936 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -1.1602504,0.504936 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 0.089749634,1.895561 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 1.4803746,0.520561 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 1.3866246,2.426811 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 1.3241246,-0.7278588 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: -0.39462537,-2.6341088 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 1.4178746,-2.8216088 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 0.32412463,-2.0091088 + parent: 1 +- proto: TreasureCoinSilver + entities: + - uid: 60 + components: + - type: Transform + pos: 1.5584996,3.801811 + parent: 1 +- proto: WallCult + entities: + - uid: 2 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -3.5,2.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -0.5,-4.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 4.5,-1.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 4.5,-0.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 +- proto: WeaponRevolverInspector + entities: + - uid: 54 + components: + - type: Transform + pos: -0.4638741,4.546875 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/Pride.yml b/Resources/Maps/Lavaland/Pride.yml new file mode 100644 index 0000000000..7f347c671b --- /dev/null +++ b/Resources/Maps/Lavaland/Pride.yml @@ -0,0 +1,528 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 04:11:04 + entityCount: 84 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorWhiteDiagonal +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.4375,-0.484375 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 26487 + 0,-1: + 0: 30583 + -1,0: + 0: 52428 + 0,1: + 0: 4 + 0,-2: + 0: 30576 + -1,-2: + 0: 52416 + -1,-1: + 0: 52428 + -1,1: + 0: 4 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: GoldDoor + entities: + - uid: 43 + components: + - type: Transform + pos: 0.5,-7.5 + parent: 1 +- proto: Mirror + entities: + - uid: 59 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: -2.5,-6.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 +- proto: MirrorShield + entities: + - uid: 83 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 +- proto: WallDiamond + entities: + - uid: 2 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -1.5,7.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 0.5,6.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -2.5,-6.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -2.5,-7.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -1.5,-7.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 1.5,-7.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 3.5,-7.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/Wrath.yml b/Resources/Maps/Lavaland/Wrath.yml new file mode 100644 index 0000000000..5d1f214e9b --- /dev/null +++ b/Resources/Maps/Lavaland/Wrath.yml @@ -0,0 +1,852 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 04:09:54 + entityCount: 117 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorBasalt + 2: FloorMining +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -3.8430085,-0.40625 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + color: '#660000FF' + id: Diablo + decals: + 8: -0.041427374,-0.93798256 + - node: + cleanable: True + color: '#FFFFFFFF' + id: Remains + decals: + 6: -1.9164271,-1.9223576 + 7: 1.0132601,3.960455 + - node: + cleanable: True + color: '#660000FF' + id: splatter + decals: + 0: -3.4180074,-0.23485756 + 1: -5.5273824,3.0932674 + 2: 0.44918036,0.02295494 + 3: 0.63668036,4.94483 + 4: 3.7836294,1.522955 + 5: -0.67423964,-4.1254826 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 49151 + 0,-1: + 0: 49151 + -1,0: + 0: 49151 + 0,1: + 0: 1023 + -1,1: + 0: 2287 + 1,0: + 0: 30071 + 1,1: + 0: 1 + 1,-1: + 0: 30065 + -2,0: + 0: 50380 + -2,-1: + 0: 50368 + -1,-1: + 0: 49151 + 0,-2: + 0: 28928 + -1,-2: + 0: 49152 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AltarFangs + entities: + - uid: 80 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,1.5 + parent: 1 +- proto: BaseBallBat + entities: + - uid: 95 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.598012,-3.2973576 + parent: 1 +- proto: CartridgePistol + entities: + - uid: 99 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.7443423,-3.1098576 + parent: 1 + - uid: 101 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.0490298,2.8901424 + parent: 1 + - uid: 102 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.63847,2.44483 + parent: 1 +- proto: CartridgeRifle + entities: + - uid: 103 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5369077,-1.96142 + parent: 1 + - uid: 104 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.3693423,3.1245174 + parent: 1 + - uid: 105 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.28340483,5.6088924 + parent: 1 +- proto: Claymore + entities: + - uid: 91 + components: + - type: Transform + pos: 0.34940767,0.52295494 + parent: 1 +- proto: ClothingHeadHelmetBone + entities: + - uid: 93 + components: + - type: Transform + pos: 3.058238,-3.695795 + parent: 1 +- proto: ClothingOuterArmorBasic + entities: + - uid: 107 + components: + - type: Transform + pos: -3.4005923,3.8745174 + parent: 1 +- proto: ClothingOuterArmorBone + entities: + - uid: 94 + components: + - type: Transform + pos: 3.573863,3.522955 + parent: 1 +- proto: DrinkBloodGlass + entities: + - uid: 106 + components: + - type: Transform + pos: 0.5134702,1.554205 + parent: 1 +- proto: FloorLavaEntity + entities: + - uid: 2 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,-0.5 + parent: 1 + - uid: 3 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-0.5 + parent: 1 + - uid: 4 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,0.5 + parent: 1 + - uid: 5 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,1.5 + parent: 1 + - uid: 6 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,2.5 + parent: 1 + - uid: 7 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,3.5 + parent: 1 + - uid: 8 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,3.5 + parent: 1 + - uid: 9 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,3.5 + parent: 1 + - uid: 10 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,2.5 + parent: 1 + - uid: 11 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,0.5 + parent: 1 + - uid: 12 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,1.5 + parent: 1 + - uid: 13 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-1.5 + parent: 1 + - uid: 14 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,-1.5 + parent: 1 + - uid: 15 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,0.5 + parent: 1 + - uid: 17 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,-0.5 + parent: 1 + - uid: 18 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,1.5 + parent: 1 + - uid: 19 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,0.5 + parent: 1 + - uid: 20 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,-0.5 + parent: 1 + - uid: 21 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-4.5 + parent: 1 + - uid: 22 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-4.5 + parent: 1 + - uid: 23 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,-4.5 + parent: 1 + - uid: 24 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,-4.5 + parent: 1 + - uid: 25 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,5.5 + parent: 1 + - uid: 26 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,4.5 + parent: 1 + - uid: 27 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,5.5 + parent: 1 + - uid: 28 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,4.5 + parent: 1 + - uid: 29 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,6.5 + parent: 1 + - uid: 30 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,6.5 + parent: 1 + - uid: 31 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,6.5 + parent: 1 +- proto: HeadHuman + entities: + - uid: 115 + components: + - type: Transform + pos: 0.5415883,2.5620174 + parent: 1 +- proto: HydroponicsToolHatchet + entities: + - uid: 90 + components: + - type: Transform + pos: 3.8316755,-0.29735756 + parent: 1 +- proto: LeftArmHuman + entities: + - uid: 116 + components: + - type: Transform + pos: -5.3646617,-0.22704506 + parent: 1 +- proto: LeftLegHuman + entities: + - uid: 113 + components: + - type: Transform + pos: 2.5337758,-1.914545 + parent: 1 +- proto: LeftLegSkeleton + entities: + - uid: 112 + components: + - type: Transform + pos: 4.4790883,0.42920494 + parent: 1 +- proto: RandomCargoCorpseSpawner + entities: + - uid: 81 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 +- proto: RandomSecurityCorpseSpawner + entities: + - uid: 83 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 +- proto: ReinforcedShiv + entities: + - uid: 89 + components: + - type: Transform + pos: -1.019887,4.7651424 + parent: 1 +- proto: RightArmHuman + entities: + - uid: 117 + components: + - type: Transform + pos: 4.3853383,3.47608 + parent: 1 +- proto: RightHandSkeleton + entities: + - uid: 111 + components: + - type: Transform + pos: -2.4115367,2.397955 + parent: 1 +- proto: RightLegHuman + entities: + - uid: 114 + components: + - type: Transform + pos: -3.6302867,3.2182674 + parent: 1 +- proto: SalvageHumanCorpseSpawner + entities: + - uid: 82 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,3.5 + parent: 1 + - uid: 85 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,-1.5 + parent: 1 + - uid: 86 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-2.5 + parent: 1 + - uid: 87 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,2.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 +- proto: SalvageLootSpawner + entities: + - uid: 98 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,3.5 + parent: 1 + - uid: 100 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,1.5 + parent: 1 +- proto: Sledgehammer + entities: + - uid: 88 + components: + - type: Transform + pos: -3.0589495,-0.41454506 + parent: 1 +- proto: SpearBone + entities: + - uid: 92 + components: + - type: Transform + pos: -5.5667624,3.0776424 + parent: 1 +- proto: TorsoSkeleton + entities: + - uid: 110 + components: + - type: Transform + pos: -3.0209117,-2.102045 + parent: 1 +- proto: WallCult + entities: + - uid: 32 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,3.5 + parent: 1 + - uid: 33 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,3.5 + parent: 1 + - uid: 34 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,-0.5 + parent: 1 + - uid: 35 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-0.5 + parent: 1 + - uid: 36 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,-1.5 + parent: 1 + - uid: 37 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,2.5 + parent: 1 + - uid: 38 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,6.5 + parent: 1 + - uid: 39 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,6.5 + parent: 1 + - uid: 40 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,2.5 + parent: 1 + - uid: 41 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 5.5,-1.5 + parent: 1 + - uid: 42 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-5.5 + parent: 1 + - uid: 43 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,-5.5 + parent: 1 + - uid: 44 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-4.5 + parent: 1 + - uid: 45 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-4.5 + parent: 1 + - uid: 46 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,4.5 + parent: 1 + - uid: 47 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,4.5 + parent: 1 + - uid: 48 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,3.5 + parent: 1 + - uid: 49 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-2.5 + parent: 1 + - uid: 50 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-3.5 + parent: 1 + - uid: 51 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-3.5 + parent: 1 + - uid: 52 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,-3.5 + parent: 1 + - uid: 53 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,-2.5 + parent: 1 + - uid: 54 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,-3.5 + parent: 1 + - uid: 55 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,3.5 + parent: 1 + - uid: 56 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,4.5 + parent: 1 + - uid: 57 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,4.5 + parent: 1 +- proto: WallRockBasalt + entities: + - uid: 58 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 4.5,-4.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -3.5,-4.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 5.5,-3.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: -6.5,-1.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: -6.5,2.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: -4.5,4.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 7.5,-0.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 7.5,-1.5 + parent: 1 +- proto: WeaponPistolMk58 + entities: + - uid: 96 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.026988,-2.9692326 + parent: 1 +- proto: WeaponRifleAk + entities: + - uid: 97 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.3316755,4.9995174 + parent: 1 +... From 5ad02a08440d254f17ddff816e8d3b6419f0981f Mon Sep 17 00:00:00 2001 From: TytosB <54259736+TytosB@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:22:04 -0500 Subject: [PATCH 421/622] New salv ruin- butterfly funeral (#36755) --- Resources/Maps/Lavaland/SolemnLament.yml | 434 +++++++++++++++++++++++ 1 file changed, 434 insertions(+) create mode 100644 Resources/Maps/Lavaland/SolemnLament.yml diff --git a/Resources/Maps/Lavaland/SolemnLament.yml b/Resources/Maps/Lavaland/SolemnLament.yml new file mode 100644 index 0000000000..ffc82e585d --- /dev/null +++ b/Resources/Maps/Lavaland/SolemnLament.yml @@ -0,0 +1,434 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/20/2025 05:04:53 + entityCount: 62 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorMiningDark +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.5,0.65625 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 30583 + 0,-1: + 0: 30583 + -1,0: + 0: 52428 + 0,1: + 0: 375 + -1,1: + 0: 204 + 0,-2: + 0: 30577 + -1,-2: + 0: 52416 + -1,-1: + 0: 52428 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AltarConvertBurden + entities: + - uid: 49 + components: + - type: Transform + pos: 0.5,6.5 + parent: 1 +- proto: ChemistryBottleOmnizine + entities: + - uid: 57 + components: + - type: Transform + pos: 0.26428616,6.7624884 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 0.52209866,6.598426 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 0.73303616,6.8562384 + parent: 1 +- proto: CrateCoffin + entities: + - uid: 55 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 +- proto: PaperOffice + entities: + - uid: 56 + components: + - type: MetaData + name: Mournful note + - type: Transform + pos: 0.47522366,6.223426 + parent: 1 + - type: Paper + content: A solemn lament, for the funeral of butterflies. +- proto: SpawnMobButterfly + entities: + - uid: 50 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 +- proto: StatueVenusBlue + entities: + - uid: 43 + components: + - type: Transform + pos: -1.5,-6.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 +- proto: StatueVenusRed + entities: + - uid: 45 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 +- proto: WallCult + entities: + - uid: 2 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: -2.5,-7.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: -2.5,-6.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: -1.5,-7.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 1.5,-7.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 3.5,-7.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 +- proto: WoodDoor + entities: + - uid: 62 + components: + - type: Transform + pos: 0.5,-7.5 + parent: 1 +- proto: WoodenBench + entities: + - uid: 54 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 +... From 394c0c5414cd2c6ac0f2c4933c616392f1c76dd3 Mon Sep 17 00:00:00 2001 From: TytosB <54259736+TytosB@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:51:13 -0500 Subject: [PATCH 422/622] loop lairlock lattice fix (#36758) * sinful * funeralofdeadbutterflies * butterfly * lattice fix --- Resources/Maps/loop.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Maps/loop.yml b/Resources/Maps/loop.yml index eb19835678..2e405ca467 100644 --- a/Resources/Maps/loop.yml +++ b/Resources/Maps/loop.yml @@ -4,7 +4,7 @@ meta: engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/19/2025 17:17:37 + time: 04/20/2025 05:34:52 entityCount: 17814 maps: - 1 @@ -267,7 +267,7 @@ entities: version: 6 2,1: ind: 2,1 - tiles: HQAAAAAAHwAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAA + tiles: HQAAAAAAHwAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHwAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAIgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAIgAAAAAAHwAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAAHQAAAAAAHwAAAAAAHQAAAAAAIgAAAAAA version: 6 3,1: ind: 3,1 @@ -7277,7 +7277,7 @@ entities: pos: -30.5,13.5 parent: 2 - type: Door - secondsUntilStateChange: -52590.652 + secondsUntilStateChange: -52610.02 state: Opening - type: DeviceLinkSource lastSignals: @@ -43920,7 +43920,7 @@ entities: pos: -9.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300346.2 + secondsUntilStateChange: -300365.56 state: Opening - uid: 6747 components: @@ -43928,7 +43928,7 @@ entities: pos: -8.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300346.9 + secondsUntilStateChange: -300366.28 state: Opening - uid: 6749 components: @@ -43936,7 +43936,7 @@ entities: pos: -6.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300345.47 + secondsUntilStateChange: -300364.84 state: Opening - uid: 6750 components: @@ -43944,7 +43944,7 @@ entities: pos: -5.5,51.5 parent: 2 - type: Door - secondsUntilStateChange: -300344.84 + secondsUntilStateChange: -300364.22 state: Opening - uid: 9721 components: From d7c244293c6d89a4f5294cfcf6807e94cdaf0f49 Mon Sep 17 00:00:00 2001 From: Alzore <140123969+Blackern5000@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:57:01 -0500 Subject: [PATCH 423/622] Aquatic tail and back fin markings for lizards (#33219) * shark tail and back fin for lizards * credit me --- Resources/Locale/en-US/markings/reptilian.ftl | 6 ++ .../Mobs/Customization/Markings/reptilian.yml | 27 +++++ .../reptilian_parts.rsi/body_fin.png | Bin 0 -> 286 bytes .../reptilian_parts.rsi/meta.json | 98 +++++++++++++++++- .../reptilian_parts.rsi/tail_aquatic.png | Bin 0 -> 1326 bytes .../tail_aquatic_behind.png | Bin 0 -> 1288 bytes .../tail_aquatic_front.png | Bin 0 -> 1175 bytes .../tail_aquatic_wagging.png | Bin 0 -> 2423 bytes 8 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/body_fin.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_behind.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_front.png create mode 100644 Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_wagging.png diff --git a/Resources/Locale/en-US/markings/reptilian.ftl b/Resources/Locale/en-US/markings/reptilian.ftl index d66d3cb9e6..c5b843109e 100644 --- a/Resources/Locale/en-US/markings/reptilian.ftl +++ b/Resources/Locale/en-US/markings/reptilian.ftl @@ -38,6 +38,9 @@ marking-LizardTailLTiger = Lizard Tail (Light Tiger Stripes) marking-LizardTailDTiger-tail_dtiger = Lizard Tail (Dark Tiger Stripes) marking-LizardTailDTiger = Lizard Tail (Dark Tiger Stripes) +marking-LizardTailAquatic-tail_aquatic = Lizard Tail (Aquatic) +marking-LizardTailAquatic = Lizard Tail (Aquatic) + marking-LizardSnoutRound-snout_round = Lizard Snout (Round) marking-LizardSnoutRound = Lizard Snout (Round) @@ -108,6 +111,9 @@ marking-LizardChestUnderbelly = Lizard Chest (Underbelly) marking-LizardChestBackspikes-body_backspikes = Lizard Back spikes (Four) marking-LizardChestBackspikes = Lizard Back spikes (Four) +marking-LizardChestFin-body_fin = Lizard Fin +marking-LizardChestFin = Lizard Fin + marking-LizardSnoutSplotch = Lizard Snout (Splotch) marking-LizardSnoutSplotch-snout_splotch_primary = Muzzle marking-LizardSnoutSplotch-snout_splotch_secondary = Snoot diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml index 19768f8dc2..0891109136 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/reptilian.yml @@ -173,6 +173,15 @@ - sprite: Mobs/Customization/reptilian_parts.rsi state: tail_dtiger +- type: marking + id: LizardTailAquatic + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Reptilian] + sprites: + - sprite: Mobs/Customization/reptilian_parts.rsi + state: tail_aquatic + - type: marking id: LizardSnoutRound bodyPart: Snout @@ -339,6 +348,15 @@ - sprite: Mobs/Customization/reptilian_parts.rsi state: body_backspikes +- type: marking + id: LizardChestFin + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [Reptilian] + sprites: + - sprite: Mobs/Customization/reptilian_parts.rsi + state: body_fin + # Animated - type: marking id: LizardTailSmoothAnimated @@ -377,3 +395,12 @@ sprites: - sprite: Mobs/Customization/reptilian_parts.rsi state: tail_dtiger_wagging + +- type: marking + id: LizardTailAquaticAnimated + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [] + sprites: + - sprite: Mobs/Customization/reptilian_parts.rsi + state: tail_aquatic_wagging diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/body_fin.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/body_fin.png new file mode 100644 index 0000000000000000000000000000000000000000..b352e302cd3ca4ef203fe8d06636c7ffa6d7a7d4 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`212l#}zR#jDP+qP}Vk|k57OaY4Z2EWSzQmiFGe!>5NfZ_KxzF?pLXMsm# zF#`kN5fEmas?8@26m0i&aSVxYe>=^Pufc(X#qz=bd@~jG^a~ObyzXW$NKh|vxW&T6 z(Ie00_c`=nN8_r7#S66r^0*>qF}=!La7FZpORPWx0~0e72M@<SHH{s5!6s>w9~3;^ ztNiSy>Vwjx?`;t&+c;D9a>gy)*0`TDySZZf`vqUsDs+$V&hIxp`#1q)_;v0O^J#DG VeYcALy#;g<gQu&X%Q~loCIG8=WBmXC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json index bb12e3bf03..bb2a784f4c 100644 --- a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore, Bighorn and Demonic are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC. Splotch modified from Sharp by KittenColony(github). Frills neckfull come from: https://github.com/Bubberstation/Bubberstation/commit/8bc6b83404803466a560b694bf22ef3c0ac266a2", + "copyright": "https://github.com/Skyrat-SS13/Skyrat-tg/tree/40e3cdbb15b8bc0d5ef2fb46133adf805bda5297, while Argali, Ayrshire, Myrsore, Bighorn and Demonic are drawn by Ubaser, and Kobold Ears are drawn by Pigeonpeas. Back fin by alzore_ (Discord), Aquatic tail modified from smooth tail by alzore_ (discord). Body_underbelly made by Nairod(github) for SS14. Large drawn by Ubaser. Wagging tail by SonicDC. Splotch modified from Sharp by KittenColony(github). Frills neckfull come from: https://github.com/Bubberstation/Bubberstation/commit/8bc6b83404803466a560b694bf22ef3c0ac266a2", "size": { "x": 32, "y": 32 @@ -27,6 +27,10 @@ "name": "tail_ltiger_front", "directions": 4 }, + { + "name": "tail_aquatic_front", + "directions": 4 + }, { "name": "tail_smooth_behind_primary", "directions": 4 @@ -55,6 +59,10 @@ "name": "tail_ltiger_behind", "directions": 4 }, + { + "name": "tail_aquatic_behind", + "directions": 4 + }, { "name": "tail_smooth_primary", "directions": 4 @@ -83,6 +91,10 @@ "name": "tail_ltiger", "directions": 4 }, + { + "name": "tail_aquatic", + "directions": 4 + }, { "name": "tail_smooth_wagging_primary", "directions": 4, @@ -473,6 +485,84 @@ ] ] }, + { + "name": "tail_aquatic_wagging", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, { "name": "snout_round", "directions": 4 @@ -605,6 +695,10 @@ "name": "body_backspikes", "directions": 4 }, + { + "name": "body_fin", + "directions": 4 + }, { "name": "snout_splotch_primary", "directions": 4 @@ -618,4 +712,4 @@ "directions": 4 } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8ac972e1949e3e3ea8179ad74142272dbc8e3b GIT binary patch literal 1326 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%xZriqP%9JTpRaHxtEJ;a80Se2ec=iD)wvr&f;Qt`NuzCNI{Xh}U z0*}aI1_r)4Ak4@<CHO7_19MGgNJL45ua8x7ey(0(N`6wRUPW#JP&EUCjeSKyVsdtB zi9%9pdS;%j()-=}l@u~lY?Z=IeGPmIoKrJ0J*tXQgRA^PlB=?lEmM^2?RdFtDy)De z<ffJ+Dpcg=<P}?0*eZbywgR$2!um=IU?nBlwn`Dc0SeCfMX3sAdIow1N<i%j3N}S4 zX;wilZcyz&o~=?wNlAf~zJ7Umxn8-kUVc%!zM-Y1rM`iYzLAkGP=#)BWnM{Qg>GK4 zGQ<$5F)pda$wiq3C7Jno3Ls+>lk!VTY?Xj606Q%u8E$kzX;BW?;FM(j)ST4Z)Vz{n zeM3D%kZZweOES|C4#_Kq1{N^b^g%K}r3P@No&_bzCcr>&tpM5ubvn=y$zbz~OH%Za z6zCfn7+B~U80i{W>cgB4bbLy(RY_(^PAWJ=6u<x+E{-`RNJ3Cw=4680XqA(gmu{<6 zp_`JLmROooqGVT;3iNqSW@4U=KFISqnMhh8LdeG1=wn!F1M-?xWKe2xeoiSU5bZ2Y zZNUCT5d_5=2tbraU{j7Ph^jmwBflgcm@bMklRfiFQi}?TfN2D5ml4z|+$vB_Lf9Lc zmsw&5(~c$#*Mk%ZR*pp_<@rU~A>bfK3O1Z-Af`Y95h;;D5->Qlfhicsv(blV2M`aQ zrBd^N`KSn(VZO{+pAO9E+@3CuArbCxr=1o%tia)NaK``tPtP%|+;&p4YS&Y}PX_1K z?$S8%Q(aYqQPYvrgL50}qDzkqZwP1TUD#oNxo>u&KSQ%zx#R4%po0-j$9*0+KmNol zRl_^6h_U_F_q=%v9WDRPV7ViqQ*+)iXv<!HXQ{=jy1Hx6J4$ec>M$Nx=x}Cxw%DhE zNuf2C<KCPfJKRzPqO5nyPg%gSghf?B^@oVgf5Y>_>W<NCb=19YAJv&~^zVt#`6o}9 zglw<yaj2AK<JzOO(dE;;!>dm0e(H0eTrVLuf%Tq=o<nNtzT4lY<h5l8_%t|m|I0S@ zXI|#sT=13s$IquWJP|G?9GCXm-{_otZ?EHvCU>F7(h+Os>)Y@1>EZjblL=G^dAj<! JtaD0e0sw%Z$bJ9- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_behind.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_behind.png new file mode 100644 index 0000000000000000000000000000000000000000..167b3074de03e2bf92c26876da2079249f0c76ab GIT binary patch literal 1288 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%xR#jDP+qP}Vk|k57Oi4*e0SX^)IGF^b*h+%@g8zd6!{+@<_5(#Y z3p^r=85sEHfG{Kbl;FDz49qo|ArU1JzCKpT`MG+DDfvmMdKI|^K-CNkHue<-iOJci zB??KY>6v-9O7C~?S5nAKu~iB;^)>J<a8Aw0^r$LI4X*MFNv_IHwoFm7x8voqsjvc? zkegbPs8ErclUHn2VXFi-*b2x73F|8<fR&VF+bTu)1}He^7o{qg=^5x5C;_!ADA*LG zq*(>IxIwi8dA3R!B_#z``ugSN<$C4Ddih1^`i7R4mih)p`bI{&Koz>hm3bwJ6}oxF z$`C`K#<-*wCl_TFlw{`TDS(VkOv*1Uu~h=P0PM7sWVq1<rA0YlgHw|AQ*%;tQ}arS z^$qn5L9PX>Ey+wnI3%wa8d$(!(+9}_l^Vd6dKQ!<n*amBwE}1t)agJ+B!kT_E=kcx zQlM{SU|^wZV5DngsSk5H(D5nBRwbDwIjP_fQ2+yQxH#sNAPGTznUe`}qg75~Ub?MP zg>Fh}T4HHViIQDWD$wUSnTdHe`XJBeWFl#W2q7D1qmN;!4ajR&kwK}&`8lPaK(w<o zwE_DVMGzEgAOKMwflWEGAgc0!jQo;(V7e&EO!mwxNi8ZU0;UnLT}Du=aH~Ky31M$& zUS^3MOgow|Tn|ztSUDDzl;;;^hk%0|DcEqTftUgbM5IIpNx<OH2Bu&j&qg1f9Y8#I zmP*Y7=A$BDhWRpQeL66+J@s^P42f`mJI$N#umK0_LACGuiz*#%*M!`>pzGh|b?FR? zI=9d9`I(N~6U4SKWFCxluyLERyOL{CTerhc%Sqi;9Fz8NYAAd#Wt0wm<lNADy+ZuK zRnf}W{fmG7efB$c2~&*pfy>$!(;DO^?3my?_4g81U5BU(OiNh94{m$I?qb}PdQSLF zjFJ0Rj^75~YP>If6nm=F?614v)5;dX&ikd$I{r2sv?%Cf`^K7aaJ#79g_nGBZ~mtq z;dxSfW8ve<Pj{XsUbvlX-?p>oZ=+q^?C@r@g*?q-_vKRxT#gusT@vbi-6^4VoO{DY VU)J4~F<zkJ#naW#Wt~$(696=_y?+1z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_front.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_front.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6df8b5b81fc778895f0ab53818da1aa2ee998b GIT binary patch literal 1175 zcmZ`&K}^$N6#ge$7{~w<y{Lz#5E5dxmI=z5ZgVh%B@E{nIu0h3_TOme+NS-Nm4yTI zrU$+3fCdr{yNVc-agan3y^$CbjhYy|n3$NLUQE<z#J}AbL*-ApfA95s-+S-tdpBZZ z!>;C&%>V#bWF#EN_XYEDHsIgo^}-ImY<hfn0IWVc{Sh1XbSN4E;KA*qzc>fB+hU`M zp>nxgEEe<me5q8zzK-7R4SYFJd~AFdAMmr>I*uJp>d2%HK<kqE*cyxD+W<7oi-{yk zMn@T5$#^(HnT8%Cqhd4wY|v0SeikBP8m2|rPkwpym?T8OPhRbd(ouB~&WIy<4UXr> z5`2D^_X%V$;A&<K1~X(J;s_%n$vR{BNsE}l|4lbV5*7r_`pIN8Mhq$%B+hwg4^855 zf?zcv#l*uGtKr!4lQRgZ3`ON~IZy7aN72$$kI(0$XfNgUx-r77&&h~0+_K(LA*s@Y zq0VcfibO>wOj>SQ$s#|AE3irv_!_mE)g+5p;3+7<43v>h^>}*BYAq}hQ~QO;dQ~he z8)d%1P`U<<sEF^yA`BTgSG9Cp1aI-{NTBKfl$WOa-L%*3^-+7J<KhLLK_Zf%r3hgi zOP7#@>Ri<>CDE*rkvKW+Ck?j%Q(RU;WI%(sb4lc6mNJ`{#JbRmtDcUf{z=N3tud2v zs4G&|6fxlIW37G<IL)tSo(eqqKX|?KAUrmsAO+8bCh`#(K~2^0j99t6)l`Qg4l?cM zosdNo*bD#5U5lyv2uw&rIYpaISd!Ptb||L8QW3Fk$SMPDsf{NXTP#&u2h*yp6qNBE zX?S72F5OS#Wiuk-P$D_}>3OJilW>MFH*W0S*;)}_AjjvsKTd6bKXPks5!gl-K-Wr3 zOUv8W*Ib+3Q@@YhJhS+ut&p~FJ#?1VQfrQh!twS??{{qTzNv5NmxVXW_V$ja=X)1A u$^P{jTj!N~C*C!+Z`z$xN9?pM2tI6pd{@v-dK0hAjgJhCg;xiruKxjPA$kV@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_wagging.png b/Resources/Textures/Mobs/Customization/reptilian_parts.rsi/tail_aquatic_wagging.png new file mode 100644 index 0000000000000000000000000000000000000000..eba724cf50a9c94088b5cac1866ab9be2e2f95e0 GIT binary patch literal 2423 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 literal 0 HcmV?d00001 From d5252d9808056b319476fe708a6e563631d37dcd Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 05:58:08 +0000 Subject: [PATCH 424/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1efbac66ff..da3829e3e9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: lzk228 - changes: - - message: Decreased HP for rusted wall variants - type: Tweak - id: 7771 - time: '2025-01-01T16:23:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34043 - author: ReeZii changes: - message: Fixed thief beacon, which can doubled steal target's @@ -3906,3 +3899,10 @@ id: 8271 time: '2025-04-20T02:41:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35950 +- author: Blackern5000 + changes: + - message: Reptilians can now have shark tails and a back fin. + type: Add + id: 8272 + time: '2025-04-20T05:57:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33219 From 6bebde9959e4568f769f6fbedf8ac03e08d920fa Mon Sep 17 00:00:00 2001 From: chromiumboy <50505512+chromiumboy@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:58:41 -0500 Subject: [PATCH 425/622] Bugfix to sync emergency broadcast cooldowns on holopad UIs (#34115) * Initial commit * Bug fix * Included check for gaining power * Addressed reviews --- Content.Server/Holopad/HolopadSystem.cs | 46 +++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/Content.Server/Holopad/HolopadSystem.cs b/Content.Server/Holopad/HolopadSystem.cs index 51cb3876fe..af8c5a36a1 100644 --- a/Content.Server/Holopad/HolopadSystem.cs +++ b/Content.Server/Holopad/HolopadSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Chat.TypingIndicator; using Content.Shared.Holopad; using Content.Shared.IdentityManagement; using Content.Shared.Labels.Components; +using Content.Shared.Power; using Content.Shared.Silicons.StationAi; using Content.Shared.Speech; using Content.Shared.Telephone; @@ -74,6 +75,8 @@ public sealed class HolopadSystem : SharedHolopadSystem SubscribeLocalEvent<HolopadUserComponent, JumpToCoreEvent>(OnJumpToCore); SubscribeLocalEvent<HolopadComponent, GetVerbsEvent<AlternativeVerb>>(AddToggleProjectorVerb); SubscribeLocalEvent<HolopadComponent, EntRemovedFromContainerMessage>(OnAiRemove); + SubscribeLocalEvent<HolopadComponent, EntParentChangedMessage>(OnParentChanged); + SubscribeLocalEvent<HolopadComponent, PowerChangedEvent>(OnPowerChanged); } #region: Holopad UI bound user interface messages @@ -432,6 +435,17 @@ public sealed class HolopadSystem : SharedHolopadSystem _telephoneSystem.EndTelephoneCalls((entity, entityTelephone)); } + private void OnParentChanged(Entity<HolopadComponent> entity, ref EntParentChangedMessage args) + { + UpdateHolopadControlLockoutStartTime(entity); + } + + private void OnPowerChanged(Entity<HolopadComponent> entity, ref PowerChangedEvent args) + { + if (args.Powered) + UpdateHolopadControlLockoutStartTime(entity); + } + #endregion public override void Update(float frameTime) @@ -678,11 +692,10 @@ public sealed class HolopadSystem : SharedHolopadSystem _telephoneSystem.TerminateTelephoneCalls(sourceTelephoneEntity); // Find all holopads in range of the source - var sourceXform = Transform(source); var receivers = new HashSet<Entity<TelephoneComponent>>(); - var query = AllEntityQuery<HolopadComponent, TelephoneComponent, TransformComponent>(); - while (query.MoveNext(out var receiver, out var receiverHolopad, out var receiverTelephone, out var receiverXform)) + var query = AllEntityQuery<HolopadComponent, TelephoneComponent>(); + while (query.MoveNext(out var receiver, out var receiverHolopad, out var receiverTelephone)) { var receiverTelephoneEntity = new Entity<TelephoneComponent>(receiver, receiverTelephone); @@ -745,6 +758,33 @@ public sealed class HolopadSystem : SharedHolopadSystem return linkedHolopads; } + private void UpdateHolopadControlLockoutStartTime(Entity<HolopadComponent> source) + { + if (!TryComp<TelephoneComponent>(source, out var sourceTelephone)) + return; + + var sourceTelephoneEntity = new Entity<TelephoneComponent>(source, sourceTelephone); + var isDirty = false; + + var query = AllEntityQuery<HolopadComponent, TelephoneComponent>(); + while (query.MoveNext(out var receiver, out var receiverHolopad, out var receiverTelephone)) + { + var receiverTelephoneEntity = new Entity<TelephoneComponent>(receiver, receiverTelephone); + + if (!_telephoneSystem.IsSourceInRangeOfReceiver(sourceTelephoneEntity, receiverTelephoneEntity)) + continue; + + if (receiverHolopad.ControlLockoutStartTime > source.Comp.ControlLockoutStartTime) + { + source.Comp.ControlLockoutStartTime = receiverHolopad.ControlLockoutStartTime; + isDirty = true; + } + } + + if (isDirty) + Dirty(source); + } + private void SetHolopadAmbientState(Entity<HolopadComponent> entity, bool isEnabled) { if (TryComp<PointLightComponent>(entity, out var pointLight)) From 99364dc4de968f26a1c449631523369ce58e637a Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 05:59:48 +0000 Subject: [PATCH 426/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index da3829e3e9..b31e46fdad 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ReeZii - changes: - - message: Fixed thief beacon, which can doubled steal target's - type: Fix - id: 7772 - time: '2025-01-01T16:25:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33750 - author: Errant changes: - message: Removed seasonal nuke song "Nukemass". @@ -3906,3 +3899,11 @@ id: 8272 time: '2025-04-20T05:57:01.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33219 +- author: chromiumboy + changes: + - message: The countdown timer for emergency broadcast cooldowns are now consistent + across holopad UIs + type: Fix + id: 8273 + time: '2025-04-20T05:58:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34115 From 8d8398e60d895ddd264f6b311d9638caef67bbf7 Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Sat, 19 Apr 2025 23:01:28 -0700 Subject: [PATCH 427/622] kill filing cabinet heisentests (#36757) --- .../Entities/Structures/Storage/filing_cabinets.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml index e8856923e3..1eaefeb6ad 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml @@ -29,7 +29,7 @@ children: - !type:AllSelector weight: 0.2 - children: + children: - id: RubberStampApproved - id: RubberStampDenied - id: RubberStampGreytide @@ -131,9 +131,6 @@ id: filingCabinetDrawer description: A small drawer for all your filing needs, Now with wheels! components: - - type: Storage - grid: - - 0,0,7,2 - type: Sprite state: chestdrawer layers: From 0768f1f33fa120283c54a4400fbc6b9699b73849 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 06:02:34 +0000 Subject: [PATCH 428/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b31e46fdad..a3ff199fdc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Errant - changes: - - message: Removed seasonal nuke song "Nukemass". - type: Remove - id: 7773 - time: '2025-01-01T16:27:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34066 - author: Alpaccalypse changes: - message: '"Irish Car Bomb" renamed to "Irish Slammer".' @@ -3907,3 +3900,11 @@ id: 8273 time: '2025-04-20T05:58:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34115 +- author: ArtisticRoomba + changes: + - message: Filing cabinet drawers have the same internal storage size as tall filing + cabinets. + type: Tweak + id: 8274 + time: '2025-04-20T06:01:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36757 From 39bf2469add465a4cd97f0b2b20002abb7c79532 Mon Sep 17 00:00:00 2001 From: Cass <45694413+CubixThree@users.noreply.github.com> Date: Sun, 20 Apr 2025 02:00:33 -0500 Subject: [PATCH 429/622] Plurality pin addition (now not on master branch) (#36744) --- .../Catalog/VendingMachines/Inventories/pride.yml | 1 + .../Prototypes/Entities/Clothing/Neck/pins.yml | 11 +++++++++++ .../Markers/Spawners/Random/maintenance.yml | 1 + .../Loadouts/Miscellaneous/trinkets.yml | 6 ++++++ Resources/Prototypes/Loadouts/loadout_groups.yml | 1 + .../Clothing/Neck/Misc/pins.rsi/meta.json | 9 ++++++++- .../Neck/Misc/pins.rsi/plural-equipped-NECK.png | Bin 0 -> 445 bytes .../Clothing/Neck/Misc/pins.rsi/plural.png | Bin 0 -> 496 bytes 8 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/Neck/Misc/pins.rsi/plural-equipped-NECK.png create mode 100644 Resources/Textures/Clothing/Neck/Misc/pins.rsi/plural.png diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml index 80c1408c53..509104ecf5 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml @@ -12,6 +12,7 @@ ClothingNeckLesbianPin: 3 ClothingNeckNonBinaryPin: 3 ClothingNeckPansexualPin: 3 + ClothingNeckPluralPin: 3 ClothingNeckOmnisexualPin: 3 ClothingNeckGenderqueerPin: 3 ClothingNeckTransPin: 3 diff --git a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml index 563a94779b..bd54707fe1 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml @@ -133,6 +133,17 @@ - type: Clothing equippedPrefix: pan +- type: entity + parent: ClothingNeckPinBase + id: ClothingNeckPluralPin + name: plural pin + description: Be plural, do crimes. + components: + - type: Sprite + state: plural + - type: Clothing + equippedPrefix: plural + - type: entity parent: ClothingNeckPinBase id: ClothingNeckOmnisexualPin diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 289fee8596..f701933f70 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -152,6 +152,7 @@ - id: ClothingNeckLesbianPin - id: ClothingNeckNonBinaryPin - id: ClothingNeckPansexualPin + - id: ClothingNeckPluralPin - id: ClothingNeckOmnisexualPin - id: ClothingNeckGenderqueerPin - id: ClothingNeckTransPin diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml b/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml index 68eea05131..99dbedd456 100644 --- a/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml +++ b/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml @@ -166,6 +166,12 @@ back: - ClothingNeckPansexualPin +- type: loadout + id: ClothingNeckPluralPin + storage: + back: + - ClothingNeckPluralPin + - type: loadout id: ClothingNeckOmnisexualPin storage: diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index a93d727b43..e9473a459a 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -29,6 +29,7 @@ - ClothingNeckLesbianPin - ClothingNeckNonBinaryPin - ClothingNeckPansexualPin + - ClothingNeckPluralPin - ClothingNeckOmnisexualPin - ClothingNeckGenderqueerPin - ClothingNeckTransPin diff --git a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json index a25719fabe..c1ec904c05 100644 --- a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "PixelTK leaves his mark on upstream, BackeTako made the gay, autism pins by Terraspark, omnisexual pin by juliangiebel, genderqueer by centcomofficer24, ally by FairlySadPanda, aroace by momochitters", + "copyright": "PixelTK leaves his mark on upstream, BackeTako made the gay, autism pins by Terraspark, omnisexual pin by juliangiebel, genderqueer by centcomofficer24, ally by FairlySadPanda, aroace by momochitters, plural by CubixThree", "size": { "x": 32, "y": 32 @@ -98,6 +98,13 @@ "name": "pan-equipped-NECK", "directions": 4 }, + { + "name": "plural" + }, + { + "name": "plural-equipped-NECK", + "directions": 4 + }, { "name": "trans" }, diff --git a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/plural-equipped-NECK.png b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/plural-equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2669f73baf2fd392fceaa2ceddec8ca8286938 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL9r6oh?3y^w370~qEv=}#LT=BJwMkF1yeo4 z@6F#Q166EEjqptK^weVD0CHFvq!?Kl7=bJ=AeM%*L2l7tWCn{f0ojI(ObmQLItqw0 z+gZTk89+7&Bmgl;Ka57Pl7X3lVFEh?3sBy`$k>2!0mMv@de#LHb0z`VAixAPg$b-O z$kGDHg6c9fFaXIWFHt)Z<oEXskXhjA;uum9_x6k-S5tz_v4{1J+0N-NBIFbbGBPI$ zl$3w0YZC8hyXJ8Chu;U*&JQ-H`R_gC1?n>@`Fi8d>%zEM%Y1JxO|$;K{pa7BqYq1Z x9^U%<=X?I|D>>8MZ;Azf&7B3Z4+g?SJ~D>7i~QYjdTR$r%+uA+Wt~$(69AA2ZleGI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/plural.png b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/plural.png new file mode 100644 index 0000000000000000000000000000000000000000..983875a5b29527f556a654a679d80f72826222f7 GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCik70(?ST9o35C%$F(nbm-<DHmSWYTal=>w%g#?e0h0!U0q#cV`HGgMdI3P zffP?kkYDhB1Yi)lf9@PmoU_0qvY3H^?=T269?xHq0u&T0ag8Vm&QB{TPb^Ah2uRG# zE79|F4N)-FGyLBCeKJtRmedH(G*3@01`Z&Hl|hP;m4Ok+@&aOMC>!J_4Mt|LI1`X< z$jHRN2c)BbIJ2DvES>>mgFpfhgY?5_6e}5kVKRZ8fdwdUU}S8-xBy}%NImNUh&hvh zY!F}qn!*HD8DwbzWI=Tq8W@0Nlb5I+3G(}U2FQ%|ba4!^@PB*ZE?<KJM?;{HO6T|b z`zkvptUVePTea>;?QHu6ouWMZ*)ROO)GC<pI!UOl$)zQtX3rVNr*{p)?;8|fcw(S* t*8I$B1zV-PDgS)D<?LUb<7!*q_=<CFxE6D`GQTv)N>5immvv4FO#tD#f42Yt literal 0 HcmV?d00001 From 79a76e418cd003aea07fcbda3d5efceedba53825 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 07:01:40 +0000 Subject: [PATCH 430/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a3ff199fdc..d1996e05b5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Alpaccalypse - changes: - - message: '"Irish Car Bomb" renamed to "Irish Slammer".' - type: Tweak - id: 7774 - time: '2025-01-02T09:46:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34107 - author: DylanWhittingham changes: - message: Added appraisal tool sound. @@ -3908,3 +3901,10 @@ id: 8274 time: '2025-04-20T06:01:28.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36757 +- author: CubixThree + changes: + - message: Added plural pride pin. + type: Add + id: 8275 + time: '2025-04-20T07:00:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36744 From 1c3bdd5ba5551e3c9cfbd709d8966f6ae5af6bde Mon Sep 17 00:00:00 2001 From: Spessmann <156740760+Spessmann@users.noreply.github.com> Date: Sun, 20 Apr 2025 01:54:01 -0700 Subject: [PATCH 431/622] Small ruin fixes (#36763) --- Resources/Maps/Lavaland/hermit_base.yml | 2 +- .../{PreservedTerrarium.yml => preserved_terrarium.yml} | 0 Resources/Maps/Lavaland/ripley.yml | 2 +- Resources/Maps/Lavaland/{SolemnLament.yml => solemn_lament.yml} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename Resources/Maps/Lavaland/{PreservedTerrarium.yml => preserved_terrarium.yml} (100%) rename Resources/Maps/Lavaland/{SolemnLament.yml => solemn_lament.yml} (100%) diff --git a/Resources/Maps/Lavaland/hermit_base.yml b/Resources/Maps/Lavaland/hermit_base.yml index 5751345878..6f5ee15e91 100644 --- a/Resources/Maps/Lavaland/hermit_base.yml +++ b/Resources/Maps/Lavaland/hermit_base.yml @@ -135,7 +135,7 @@ entities: rot: -1.5707963267948966 rad pos: 11.5,2.5 parent: 1 -- proto: AsteroidRock +- proto: WallRockBasalt entities: - uid: 13 components: diff --git a/Resources/Maps/Lavaland/PreservedTerrarium.yml b/Resources/Maps/Lavaland/preserved_terrarium.yml similarity index 100% rename from Resources/Maps/Lavaland/PreservedTerrarium.yml rename to Resources/Maps/Lavaland/preserved_terrarium.yml diff --git a/Resources/Maps/Lavaland/ripley.yml b/Resources/Maps/Lavaland/ripley.yml index c465198e5d..af42a91f5d 100644 --- a/Resources/Maps/Lavaland/ripley.yml +++ b/Resources/Maps/Lavaland/ripley.yml @@ -90,7 +90,7 @@ entities: chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance -- proto: AsteroidRock +- proto: WallRockBasalt entities: - uid: 2 components: diff --git a/Resources/Maps/Lavaland/SolemnLament.yml b/Resources/Maps/Lavaland/solemn_lament.yml similarity index 100% rename from Resources/Maps/Lavaland/SolemnLament.yml rename to Resources/Maps/Lavaland/solemn_lament.yml From edc57cab16f3b0a3525d8729b9f8a4ce7a4d8787 Mon Sep 17 00:00:00 2001 From: Helm <158806576+Helm4142@users.noreply.github.com> Date: Sun, 20 Apr 2025 15:32:02 +0600 Subject: [PATCH 432/622] Fix soup (#34633) Co-authored-by: Helm4142 <Helm4142@users.noreply.github.com> --- Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml index 2fc551595f..0d9ba21e53 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml @@ -1,7 +1,7 @@ # When adding new food also add to random spawner located in Resources\Prototypes\Entities\Markers\Spawners\Random\Food_Drinks\food_meal.yml - type: entity - parent: FoodBase + parent: FoodInjectableBase id: FoodBowlBase abstract: true components: From d46c54bde05056f1d2521e2a09ebccca4d81ed2f Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 09:33:09 +0000 Subject: [PATCH 433/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d1996e05b5..c9d5b73304 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: DylanWhittingham - changes: - - message: Added appraisal tool sound. - type: Add - id: 7775 - time: '2025-01-02T16:46:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34119 - author: ps3moira changes: - message: Changed tables and counter iconsmoothing @@ -3908,3 +3901,10 @@ id: 8275 time: '2025-04-20T07:00:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36744 +- author: Helm + changes: + - message: You can now add any reagents to soup! + type: Fix + id: 8276 + time: '2025-04-20T09:32:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34633 From 9d4c97701d974e0f5b5f096375e09becc3654147 Mon Sep 17 00:00:00 2001 From: Nox <nebulousnox38@gmail.com> Date: Sun, 20 Apr 2025 04:33:31 -0700 Subject: [PATCH 434/622] Fix some SMG magazines fitting 35 rounds (#34782) All SMG magazines are now 30 round, rather than half being 35 round. --- .../Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml index df1662a822..e22c649e3c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml @@ -78,7 +78,7 @@ whitelist: tags: - CartridgePistol - capacity: 35 + capacity: 30 - type: Item size: Small - type: ContainerContainer @@ -251,7 +251,6 @@ parent: BaseMagazinePistolSubMachineGun components: - type: BallisticAmmoProvider - capacity: 30 proto: CartridgePistol whitelist: tags: From f4e7601dc93f0ddecb7a542d7b9edca1506411ba Mon Sep 17 00:00:00 2001 From: Nox <nebulousnox38@gmail.com> Date: Sun, 20 Apr 2025 04:51:27 -0700 Subject: [PATCH 435/622] Descriptions for .35 auto (#36085) * Initial commit. * added SMG descriptions * Update Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> * Updated descriptions to incorporate Roomba's feedback. * Slightly changed Viper description * Minor formatting change * Updated Atreides description * Fixed a minor convention mistake in magazines * Slightly changed the Viper's description to not reveal its manufacturer. * Updated Drozd description. * Rerun test * Updated descriptions in accordance with Roomba's suggestions! * Updated Viper description! * Shit I forgot to remove the cartridge length, did it now! * More smart changes by Roomba * Tests gaslighting me * Update Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> * Updated WT550 description --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml | 4 ++++ .../Weapons/Guns/Ammunition/Cartridges/pistol.yml | 4 ++++ .../Weapons/Guns/Ammunition/Magazines/pistol.yml | 12 ++++++++++++ .../Objects/Weapons/Guns/Pistols/pistols.yml | 6 +++--- .../Entities/Objects/Weapons/Guns/SMGs/smgs.yml | 8 ++++---- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml index e081d574d7..9dad0d5785 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml @@ -29,6 +29,7 @@ parent: BaseMagazineBoxPistol id: MagazineBoxPistol name: ammunition box (.35 auto) + description: A cardboard box of .35 auto rounds. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistol @@ -43,6 +44,7 @@ parent: BaseMagazineBoxPistol id: MagazineBoxPistolPractice name: ammunition box (.35 auto practice) + description: A cardboard box of .35 auto rounds. Intended to hold non-harmful chalk ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolPractice @@ -58,6 +60,7 @@ id: MagazineBoxPistolIncendiary parent: BaseMagazineBoxPistol name: ammunition box (.35 auto incendiary) + description: A cardboard box of .35 auto rounds. Intended to hold self-igniting incendiary ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolIncendiary @@ -73,6 +76,7 @@ id: MagazineBoxPistolUranium parent: BaseMagazineBoxPistol name: ammunition box (.35 auto uranium) + description: A cardboard box of .35 auto rounds. Intended to hold exotic uranium-core ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolUranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml index bdf61c85e9..0734e4af02 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml @@ -21,6 +21,7 @@ - type: entity id: CartridgePistol name: cartridge (.35 auto) + description: Arguably the most popular caliber on the market, used by all manner of pistols and submachine guns. Standard kinetic ammunition is common and useful in most situations. parent: BaseCartridgePistol components: - type: CartridgeAmmo @@ -29,6 +30,7 @@ - type: entity id: CartridgePistolPractice name: cartridge (.35 auto practice) + description: Arguably the most popular caliber on the market, used by all manner of pistols and submachine guns. Chalk ammunition is generally non-harmful, used for practice. parent: BaseCartridgePistol components: - type: CartridgeAmmo @@ -44,6 +46,7 @@ - type: entity id: CartridgePistolIncendiary name: cartridge (.35 auto incendiary) + description: Arguably the most popular caliber on the market, used by all manner of pistols and submachine guns. Incendiary ammunition contains a self-igniting compound that sets the target ablaze. parent: BaseCartridgePistol components: - type: CartridgeAmmo @@ -59,6 +62,7 @@ - type: entity id: CartridgePistolUranium name: cartridge (.35 auto uranium) + description: Arguably the most popular caliber on the market, used by all manner of pistols and submachine guns. Uranium core ammunition features a load of fissile material, irradiating the target from the inside. parent: BaseCartridgePistol components: - type: CartridgeAmmo diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml index e22c649e3c..5e82be567f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml @@ -101,6 +101,7 @@ id: MagazinePistolSubMachineGunTopMounted name: WT550 magazine (.35 auto top-mounted) parent: [ BaseItem, BaseSecurityContraband ] + description: Unconventional 30-round top feeding magazine for the WT550 SMG. Intended to hold general-purpose kinetic ammunition. components: - type: Tag tags: @@ -132,6 +133,7 @@ id: MagazinePistolSubMachineGunTopMountedEmpty name: WT550 magazine (.35 auto top-mounted any) parent: MagazinePistolSubMachineGunTopMounted + description: Unconventional 30-round top feeding magazine for the WT550 SMG. components: - type: BallisticAmmoProvider proto: null @@ -140,6 +142,7 @@ id: MagazinePistol name: pistol magazine (.35 auto) parent: BaseMagazinePistol + description: 10-round single-stack magazine for pistols. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistol @@ -155,6 +158,7 @@ name: pistol magazine (.35 auto any) suffix: empty parent: MagazinePistol + description: 10-round single-stack magazine for pistols. components: - type: BallisticAmmoProvider proto: null @@ -170,6 +174,7 @@ id: MagazinePistolIncendiary name: pistol magazine (.35 auto incendiary) parent: MagazinePistol + description: 10-round single-stack magazine for pistols. Intended to hold self-igniting incendiary ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolIncendiary @@ -178,6 +183,7 @@ id: MagazinePistolPractice name: pistol magazine (.35 auto practice) parent: BaseMagazinePistol + description: 10-round single-stack magazine for pistols. Intended to hold non-harmful chalk ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolPractice @@ -192,6 +198,7 @@ id: MagazinePistolUranium name: pistol magazine (.35 auto uranium) parent: BaseMagazinePistol + description: 10-round single-stack magazine for pistols. Intended to hold exotic uranium-core ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolUranium @@ -249,6 +256,7 @@ id: MagazinePistolSubMachineGun name: SMG magazine (.35 auto) parent: BaseMagazinePistolSubMachineGun + description: 30-round double-stack magazine for submachine guns. Intended to hold general-purpose kinetic ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistol @@ -269,6 +277,7 @@ name: SMG magazine (.35 auto any) suffix: empty parent: BaseMagazinePistolSubMachineGun + description: 30-round double-stack magazine for submachine guns. components: - type: BallisticAmmoProvider proto: null @@ -283,6 +292,7 @@ id: MagazinePistolSubMachineGunPractice name: SMG magazine (.35 auto practice) parent: BaseMagazinePistolSubMachineGun + description: 30-round double-stack magazine for submachine guns. Intended to hold non-harmful chalk ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolPractice @@ -297,6 +307,7 @@ id: MagazinePistolSubMachineGunUranium name: SMG magazine (.35 auto uranium) parent: BaseMagazinePistolSubMachineGun + description: 30-round double-stack magazine for submachine guns. Intended to hold exotic uranium-core ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolUranium @@ -311,6 +322,7 @@ parent: BaseMagazinePistolSubMachineGun id: MagazinePistolSubMachineGunIncendiary name: SMG magazine (.35 auto incendiary) + description: 30-round double-stack magazine for submachine guns. Intended to hold self-igniting incendiary ammunition. components: - type: BallisticAmmoProvider proto: CartridgePistolIncendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index c9e3fdd034..6f18cbe963 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -72,7 +72,7 @@ name: viper parent: [BaseWeaponPistol, BaseSyndicateContraband] id: WeaponPistolViper - description: A small, easily concealable, but somewhat underpowered gun. Retrofitted with a fully automatic receiver. Uses .35 auto ammo. + description: A common handgun illegally modified by the Syndicate. The Viper sports a selector switch between semi-auto and ‘rock and roll’. The standard sidearm for any soldier who fights under the three serpents. Feeds from .35 pistol magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/viper.rsi @@ -105,7 +105,7 @@ name: echis parent: [ BaseItem, BaseSyndicateContraband ] id: WeaponPistolEchis - description: A viper for use by cyborgs. Creates .35 ammo on the fly from an internal ammo fabricator, which slowly self-charges. + description: A cyborg-mounted weapon system based on the Viper pistol. Creates ammunition on the fly from an internal fabricator, which slowly self-charges. components: - type: Gun fireRate: 5 @@ -189,7 +189,7 @@ name: mk 58 parent: [BaseWeaponPistol, BaseSecurityContraband] id: WeaponPistolMk58 - description: A cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. Uses .35 auto ammo. + description: Designed by Nanotrasen’s Small Arms Division, the Mk58 is a conventional semi-automatic pistol with a simple recoil-operated action and excellent reliability. The standard sidearm of Nanotrasen’s station security and emergency response teams. Feeds from .35 pistol magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/mk58.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 90789e01d7..492581d900 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -62,7 +62,7 @@ name: Atreides parent: [BaseWeaponSubMachineGun, BaseMajorContraband] id: WeaponSubMachineGunAtreides - description: Pla-ket-ket-ket-ket! Uses .35 auto ammo. + description: A rare machine pistol hailing from the Corporate Wars. Its extremely high fire rate and compact profile make it useful in close quarters combat. Despite its age, it is in remarkably good condition. Feeds from .35 SMG magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/SMGs/atreides.rsi @@ -85,7 +85,7 @@ name: C-20r submachine gun parent: [BaseWeaponSubMachineGun, BaseSyndicateContraband] id: WeaponSubMachineGunC20r - description: A firearm that is often used by the infamous nuclear operatives. Uses .35 auto ammo. + description: A classic and widespread submachine gun, infamous for its use by the Gorlex Marauders. One of the first homegrown Waffle Corp. designs, it remains in service today. Feeds from .35 SMG magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/SMGs/c20r.rsi @@ -123,7 +123,7 @@ name: Drozd parent: [BaseWeaponSubMachineGun, BaseSecurityContraband] id: WeaponSubMachineGunDrozd - description: An excellent fully automatic Heavy SMG. + description: A modern SMG manufactured by Nanotrasen’s Small Arms Division. It features an exceptional rate of fire in burst mode, useful for holding defensive angles or engaging hostiles at longer ranges. Feeds from .35 SMG magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/SMGs/drozd.rsi @@ -181,7 +181,7 @@ name: WT550 parent: [ BaseWeaponSubMachineGun, BaseSecurityContraband ] id: WeaponSubMachineGunWt550 - description: An excellent SMG, produced by NanoTrasen's Small Arms Division. Uses .35 auto ammo. + description: A truly unique firearm, the WT550 was designed by Nanotrasen's Small Arms Division as a compact submachine gun fully controllable with one hand. It contains an exotic internal recoil buffer and feeds from special top-mounted .35 magazines. components: - type: Sprite sprite: Objects/Weapons/Guns/SMGs/wt550.rsi From 8be4abc3fcd8eddedc2443659701319a21fd0fbe Mon Sep 17 00:00:00 2001 From: Pgriha <133212269+Pgriha@users.noreply.github.com> Date: Sun, 20 Apr 2025 14:52:31 +0300 Subject: [PATCH 436/622] Fix head markings under some helmets (#36074) * 1 * 2 --- .../Entities/Clothing/Head/helmets.yml | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml index 0dfc37a627..01c663ae32 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml @@ -6,6 +6,19 @@ id: ClothingHeadHelmetBase abstract: true components: + - type: Tag + tags: + - WhitelistChameleon + - type: HideLayerClothing + slots: + - HeadTop + - HeadSide + +- type: entity + parent: ClothingHeadHelmetBase + id: ClothingHeadHelmetArmoredBase + abstract: true + components: - type: Armor #Values seem to let the user survive one extra hit if attacked consistently. modifiers: coefficients: @@ -13,17 +26,10 @@ Slash: 0.9 Piercing: 0.9 Heat: 0.9 - - type: Tag - tags: - - WhitelistChameleon - - type: HideLayerClothing - slots: - - HeadTop - - HeadSide #Basic Helmet (Security Helmet) - type: entity - parent: [ClothingHeadHelmetBase, BaseSecurityContraband] + parent: [ClothingHeadHelmetArmoredBase, BaseSecurityContraband] id: ClothingHeadHelmetBasic name: helmet description: Standard security gear. Protects the head from impacts. @@ -39,7 +45,7 @@ #Mercenary Helmet - type: entity - parent: [ ClothingHeadHelmetBase, BaseMajorContraband ] + parent: [ ClothingHeadHelmetArmoredBase, BaseMajorContraband ] id: ClothingHeadHelmetMerc name: mercenary helmet description: The combat helmet is commonly used by mercenaries, is strong, light and smells like gunpowder and the jungle. @@ -51,7 +57,7 @@ #SWAT Helmet - type: entity - parent: [ClothingHeadBase, BaseSecurityContraband] + parent: [ClothingHeadHelmetBase, BaseSecurityContraband] id: ClothingHeadHelmetSwat name: SWAT helmet description: An extremely robust helmet, commonly used by paramilitary forces. This one has the Nanotrasen logo emblazoned on the top. @@ -87,7 +93,7 @@ #Light Riot Helmet - type: entity - parent: [ClothingHeadBase, BaseSecurityContraband] + parent: [ClothingHeadHelmetBase, BaseSecurityContraband] id: ClothingHeadHelmetRiot name: light riot helmet description: It's a helmet specifically designed to protect against close range attacks. @@ -146,7 +152,7 @@ #Cult Helmet - type: entity - parent: [ClothingHeadBase, BaseMajorContraband] + parent: [ClothingHeadHelmetBase, BaseMajorContraband] id: ClothingHeadHelmetCult name: cult helmet description: A robust, evil-looking cult helmet. @@ -189,7 +195,7 @@ #Knight Helmet - type: entity - parent: ClothingHeadBase + parent: ClothingHeadHelmetBase id: ClothingHeadHelmetTemplar name: knight helmet description: Decorative helmet fashioned to resemble the knights of old. @@ -203,7 +209,7 @@ #Thunderdome Helmet - type: entity - parent: ClothingHeadBase + parent: ClothingHeadHelmetBase id: ClothingHeadHelmetThunderdome name: thunderdome helmet description: Let the battle commence! @@ -215,7 +221,7 @@ #Wizard Helmet - type: entity - parent: ClothingHeadBase + parent: ClothingHeadHelmetBase id: ClothingHeadHelmetWizardHelm name: wizard helm description: Strange-looking helmet that most certainly belongs to a real magic user. @@ -293,7 +299,7 @@ #Chitinous Helmet - type: entity - parent: [ ClothingHeadBase, BaseMajorContraband] + parent: [ ClothingHeadHelmetBase, BaseMajorContraband] id: ClothingHeadHelmetLing name: chitinous helmet description: An all-consuming chitinous mass of armor. @@ -313,7 +319,7 @@ #ERT HELMETS #ERT Leader Helmet - type: entity - parent: [ BaseCentcommContraband, ClothingHeadHelmetBase ] + parent: [ BaseCentcommContraband, ClothingHeadHelmetArmoredBase ] id: ClothingHeadHelmetERTLeader name: ERT leader helmet description: An in-atmosphere helmet worn by the leader of a Nanotrasen Emergency Response Team. Has blue highlights. @@ -325,7 +331,7 @@ #ERT Security Helmet - type: entity - parent: [ BaseCentcommContraband, ClothingHeadHelmetBase ] + parent: ClothingHeadHelmetERTLeader id: ClothingHeadHelmetERTSecurity name: ERT security helmet description: An in-atmosphere helmet worn by security members of the Nanotrasen Emergency Response Team. Has red highlights. @@ -337,7 +343,7 @@ #ERT Medic Helmet - type: entity - parent: [ BaseCentcommContraband, ClothingHeadHelmetBase ] + parent: ClothingHeadHelmetERTLeader id: ClothingHeadHelmetERTMedic name: ERT medic helmet description: An in-atmosphere helmet worn by medical members of the Nanotrasen Emergency Response Team. Has white highlights. @@ -349,7 +355,7 @@ #ERT Engineer Helmet - type: entity - parent: [ BaseCentcommContraband, ClothingHeadHelmetBase ] + parent: ClothingHeadHelmetERTLeader id: ClothingHeadHelmetERTEngineer name: ERT engineer helmet description: An in-atmosphere helmet worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights. @@ -361,7 +367,7 @@ #ERT Janitor Helmet - type: entity - parent: [ BaseCentcommContraband, ClothingHeadHelmetBase ] + parent: ClothingHeadHelmetERTLeader id: ClothingHeadHelmetERTJanitor name: ERT janitor helmet description: An in-atmosphere helmet worn by janitorial members of the Nanotrasen Emergency Response Team. Has dark purple highlights. @@ -391,7 +397,7 @@ #Bone Helmet - type: entity - parent: [ ClothingHeadHelmetBase, BaseMinorContraband ] + parent: [ ClothingHeadHelmetArmoredBase, BaseMinorContraband ] id: ClothingHeadHelmetBone name: bone helmet description: Cool-looking helmet made of skull of your enemies. @@ -405,7 +411,7 @@ node: helmet - type: entity - parent: [ ClothingHeadHelmetBase, BaseMinorContraband ] + parent: [ ClothingHeadHelmetArmoredBase, BaseMinorContraband ] id: ClothingHeadHelmetPodWars name: ironclad II helmet description: An ironclad II helmet, a relic of the pod wars. @@ -417,7 +423,7 @@ #Justice Helmet - type: entity - parent: [ ClothingHeadHelmetBase, BaseSecurityContraband ] + parent: ClothingHeadHelmetBasic id: ClothingHeadHelmetJustice name: justice helm description: Advanced security gear. Protects the station from ne'er-do-wells. From 6622dcafb57cd6aa8f5ed6c1f699081df98d1808 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 11:52:33 +0000 Subject: [PATCH 437/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c9d5b73304..b0a0d217e5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ps3moira - changes: - - message: Changed tables and counter iconsmoothing - type: Tweak - id: 7776 - time: '2025-01-02T16:49:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32673 - author: SlamBamActionman changes: - message: Added Chameleon PDA, found in the Thief & Uplink Chameleon Kit! @@ -3908,3 +3901,10 @@ id: 8276 time: '2025-04-20T09:32:02.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34633 +- author: Nox38, BurgerMoth, ArtisticRoomba + changes: + - message: Added descriptions to all .35 auto cartridges, magazines, and ammo boxes. + type: Add + id: 8277 + time: '2025-04-20T11:51:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36085 From 05d79667bbfed160a6f119152ab27cbc8d9bba78 Mon Sep 17 00:00:00 2001 From: RedBookcase <crazykid1590@gmail.com> Date: Sun, 20 Apr 2025 04:53:37 -0700 Subject: [PATCH 438/622] Makes more items recyclable. (#35800) * Makes more items recyclable. * Added newlines * Fixed material issues which were NOT MY FAULT --------- Co-authored-by: RedBookcase <Usualmoves@gmail.com> --- .../Prototypes/Entities/Clothing/Masks/masks.yml | 4 ++++ .../Objects/Consumable/Drinks/drinks_cups.yml | 3 +++ .../Entities/Objects/Devices/wristwatch.yml | 6 ++++++ .../Entities/Objects/Misc/fluff_lights.yml | 9 ++++++++- .../Prototypes/Entities/Objects/Misc/paper.yml | 3 ++- .../Objects/Specific/Hydroponics/seeds.yml | 1 + .../Objects/Specific/Hydroponics/tools.yml | 16 ++++++++++++++++ .../Objects/Specific/Janitorial/janitor.yml | 3 +++ .../Entities/Objects/Specific/Service/barber.yml | 3 +++ .../Entities/Objects/Specific/chemistry.yml | 1 + .../Entities/Objects/Tools/hand_labeler.yml | 1 + .../Entities/Objects/Tools/inflatable_wall.yml | 2 ++ .../Entities/Objects/Tools/lighters.yml | 1 + .../Entities/Objects/Tools/spray_painter.yml | 3 +++ .../Entities/Objects/Weapons/Melee/mining.yml | 4 ++++ 15 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index e4e1372f89..f85cf2de7e 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -137,6 +137,10 @@ tags: - PetWearable - WhitelistChameleon + - type: PhysicalComposition + materialComposition: + Steel: 50 + Plastic: 50 - type: entity parent: ClothingMaskBreathMedical diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml index 9dd386426c..373430c255 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml @@ -53,6 +53,9 @@ sprite: Objects/Consumable/Drinks/golden_cup.rsi - type: StaticPrice price: 125 + - type: PhysicalComposition + materialComposition: + Gold: 100 - type: entity parent: DrinkBaseCup diff --git a/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml index 7fbb4aecf6..5153c9dc39 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/wristwatch.yml @@ -38,6 +38,9 @@ behaviors: - !type:DoActsBehavior acts: [ "Breakage" ] + - type: PhysicalComposition + materialComposition: + Steel: 300 - type: entity id: WristwatchGold @@ -57,3 +60,6 @@ sprite: Objects/Devices/goldwatch.rsi - type: StaticPrice price: 500 #if you ever increase the price of kidneys, increase this too. + - type: PhysicalComposition + materialComposition: + Gold: 500 diff --git a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml index a6ab09699f..676b875039 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml @@ -238,7 +238,10 @@ max: 1 - !type:DoActsBehavior acts: [ "Destruction" ] - + - type: PhysicalComposition + materialComposition: + Glass: 500 + Steel: 200 - type: entity name: broken floodlight id: FloodlightBroken @@ -288,3 +291,7 @@ density: 50 mask: - HighImpassable + - type: PhysicalComposition + materialComposition: + Glass: 500 + Steel: 200 diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 7974d70a27..c6f7e0e405 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -49,7 +49,8 @@ Quantity: 1 - type: Item size: Tiny - + - type: PhysicalComposition + - type: entity name: paper parent: BasePaper diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml index bc78ab5911..1777d8675c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/seeds.yml @@ -37,6 +37,7 @@ blacklist: tags: - Book + - type: PhysicalComposition - type: entity parent: SeedBase diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index 727c75c879..d152bb908e 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -19,6 +19,9 @@ Slash: 6 - type: Item sprite: Objects/Tools/Hydroponics/hoe.rsi + - type: PhysicalComposition + materialComposition: + Steel: 100 - type: entity name: plant clippers @@ -40,6 +43,9 @@ - type: Item sprite: Objects/Tools/Hydroponics/clippers.rsi storedRotation: -90 + - type: PhysicalComposition + materialComposition: + Steel: 100 - type: entity name: scythe @@ -64,6 +70,10 @@ - back - type: StaticPrice price: 40 + - type: PhysicalComposition + materialComposition: + Steel: 100 + Plastic: 100 - type: entity name: hatchet @@ -87,6 +97,9 @@ Piercing: 2 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi + - type: PhysicalComposition + materialComposition: + Steel: 100 - type: entity name: spade @@ -112,6 +125,9 @@ sprite: Objects/Tools/Hydroponics/spade.rsi - type: Shovel speedModifier: 0.75 # slower at digging than a full-sized shovel + - type: PhysicalComposition + materialComposition: + Steel: 100 - type: entity name: plant bag diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index ccb7900810..6a7234b810 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -250,6 +250,9 @@ types: Blunt: 3 - type: Plunger + - type: PhysicalComposition + materialComposition: + Wood: 100 - type: entity name: golden plunger diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml index ad0eeccc7d..f23e0964c1 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml @@ -24,3 +24,6 @@ Piercing: 6 soundHit: path: "/Audio/Weapons/bladeslice.ogg" + - type: PhysicalComposition + materialComposition: + Steel: 200 diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index 7cc09a9008..0ccc42f54a 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -311,6 +311,7 @@ - type: Tag tags: - Dropper + - type: PhysicalComposition - type: entity name: borgdropper diff --git a/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml b/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml index 4b46a93353..323e13102f 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml @@ -25,3 +25,4 @@ - Item tags: - Structure + - type: PhysicalComposition diff --git a/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml b/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml index 86163aad67..f5e05b4e28 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml @@ -19,6 +19,7 @@ doAfter: 1 removeOnInteract: true - type: Clickable + - type: PhysicalComposition # TODO: Add stack sprites + visuals. - type: entity @@ -42,6 +43,7 @@ doAfter: 1 removeOnInteract: true - type: Clickable + - type: PhysicalComposition # TODO: Add stack sprites + visuals. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml index c35d67e7eb..66da03cbba 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml @@ -88,6 +88,7 @@ radius: 1.1 #smallest possible color: orange - type: ItemTogglePointLight + - type: PhysicalComposition - type: entity name: cheap lighter diff --git a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml index ad31a6ec02..679c6f22fe 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml @@ -32,3 +32,6 @@ mix: '#947507' - type: StaticPrice price: 40 + - type: PhysicalComposition + materialComposition: + Steel: 100 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml index 911cf30680..597df3f83e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml @@ -35,6 +35,10 @@ sprite: Objects/Weapons/Melee/pickaxe.rsi storedRotation: -45 - type: UseDelay + - type: PhysicalComposition + materialComposition: + Steel: 100 + Wood: 100 - type: entity name: mining drill From 3f8e3f70b0c7f6d4bad61a27e11f1ef108a7eaaf Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 11:53:43 +0000 Subject: [PATCH 439/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b0a0d217e5..a73e1f8c5b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Added Chameleon PDA, found in the Thief & Uplink Chameleon Kit! - type: Add - - message: The PDA "owner" field now updates upon having a new ID inserted. - type: Tweak - id: 7777 - time: '2025-01-02T18:23:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30514 - author: FairlySadPanda changes: - message: Added a few new actions that a scrambled borg can encounter via an ion @@ -3908,3 +3899,10 @@ id: 8277 time: '2025-04-20T11:51:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36085 +- author: Pgriha + changes: + - message: SWAT, ERT, Riot and some other helmets are now hiding head markings. + type: Fix + id: 8278 + time: '2025-04-20T11:52:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36074 From c063f98f22f85a2ebcf0d18c23f8caa4d1eed75f Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 11:54:49 +0000 Subject: [PATCH 440/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a73e1f8c5b..1407490261 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: FairlySadPanda - changes: - - message: Added a few new actions that a scrambled borg can encounter via an ion - storm. - type: Add - id: 7778 - time: '2025-01-02T18:55:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34180 - author: Deerstop changes: - message: Map rotation now includes Elkridge Depot @@ -3906,3 +3898,10 @@ id: 8278 time: '2025-04-20T11:52:31.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36074 +- author: RedBookcase + changes: + - message: More items can be processed by the station's Recyclers. + type: Add + id: 8279 + time: '2025-04-20T11:53:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35800 From a8b954fb0cecb3bf254915d9460a390fb40b499f Mon Sep 17 00:00:00 2001 From: Alice4267 <psycopompass14@gmail.com> Date: Sun, 20 Apr 2025 15:01:08 +0300 Subject: [PATCH 441/622] Fix glass duplication with beakers (#34441) Update chemistry.yml Fixing glass dupe. --- Resources/Prototypes/Recipes/Lathes/chemistry.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Recipes/Lathes/chemistry.yml b/Resources/Prototypes/Recipes/Lathes/chemistry.yml index f93a56d1a1..a9e6f282e0 100644 --- a/Resources/Prototypes/Recipes/Lathes/chemistry.yml +++ b/Resources/Prototypes/Recipes/Lathes/chemistry.yml @@ -3,14 +3,14 @@ result: Beaker completetime: 2 materials: - Glass: 100 + Glass: 200 - type: latheRecipe id: LargeBeaker result: LargeBeaker completetime: 2 materials: - Glass: 200 + Glass: 400 - type: latheRecipe id: CryostasisBeaker From 2bd3f6ce201d367e5b5bc4b519adf2954086f088 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 12:02:14 +0000 Subject: [PATCH 442/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1407490261..1c9ec3e29b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Deerstop - changes: - - message: Map rotation now includes Elkridge Depot - type: Tweak - id: 7779 - time: '2025-01-04T00:40:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34206 - author: themias changes: - message: Forensics are now applied to bullets when loading using an ammo box. @@ -3905,3 +3898,14 @@ id: 8279 time: '2025-04-20T11:53:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35800 +- author: Alice4267 + changes: + - message: Changed the amount of glass sheets needed to create beakers to 2 on normal + autolathe and 1 on hyperconvectional autolathe. + type: Tweak + - message: Changed the amount of glass sheets needed to create large beakers to + 4 on normal autolathe and 2 on hyperconvectional autolathe. + type: Tweak + id: 8280 + time: '2025-04-20T12:01:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34441 From 097aff5e58367bfeccc6bc490b3f9bacc1294fe0 Mon Sep 17 00:00:00 2001 From: Pgriha <133212269+Pgriha@users.noreply.github.com> Date: Sun, 20 Apr 2025 15:03:37 +0300 Subject: [PATCH 443/622] Heterochromia for Moth (#36061) * 1 * Fix local * formatting --------- Co-authored-by: Milon <milonpl.git@proton.me> --- Resources/Locale/en-US/markings/tattoos.ftl | 6 ++++ .../Mobs/Customization/Markings/tattoos.yml | 28 ++++++++++++++++++ .../Mobs/Customization/tattoos.rsi/meta.json | 8 +++++ .../tattoos.rsi/tattoo_eye_moth_l.png | Bin 0 -> 200 bytes .../tattoos.rsi/tattoo_eye_moth_r.png | Bin 0 -> 174 bytes 5 files changed, 42 insertions(+) create mode 100644 Resources/Textures/Mobs/Customization/tattoos.rsi/tattoo_eye_moth_l.png create mode 100644 Resources/Textures/Mobs/Customization/tattoos.rsi/tattoo_eye_moth_r.png diff --git a/Resources/Locale/en-US/markings/tattoos.ftl b/Resources/Locale/en-US/markings/tattoos.ftl index a3d1d1ef68..c16b105467 100644 --- a/Resources/Locale/en-US/markings/tattoos.ftl +++ b/Resources/Locale/en-US/markings/tattoos.ftl @@ -27,3 +27,9 @@ marking-TattooEyeRight = Right Eye marking-TattooEyeLeft-tattoo_eye_l = Left Eye marking-TattooEyeLeft = Left Eye + +marking-TattooEyeMothRight-tattoo_eye_moth_r = Right Eye +marking-TattooEyeMothRight = Right Eye + +marking-TattooEyeMothLeft-tattoo_eye_moth_l = Left Eye +marking-TattooEyeMothLeft = Left Eye diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml index 8a1c1f5d78..8a47856fec 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml @@ -137,3 +137,31 @@ sprites: - sprite: Mobs/Customization/tattoos.rsi state: tattoo_eye_l + +- type: marking + id: TattooEyeMothRight + bodyPart: Eyes + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:EyeColoring + negative: true + sprites: + - sprite: Mobs/Customization/tattoos.rsi + state: tattoo_eye_moth_r + +- type: marking + id: TattooEyeMothLeft + bodyPart: Eyes + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:EyeColoring + negative: true + sprites: + - sprite: Mobs/Customization/tattoos.rsi + state: tattoo_eye_moth_l diff --git a/Resources/Textures/Mobs/Customization/tattoos.rsi/meta.json b/Resources/Textures/Mobs/Customization/tattoos.rsi/meta.json index 38dfe7ea71..bd8400a374 100644 --- a/Resources/Textures/Mobs/Customization/tattoos.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/tattoos.rsi/meta.json @@ -46,6 +46,14 @@ { "name": "tattoo_eye_l", "directions": 4 + }, + { + "name": "tattoo_eye_moth_r", + "directions": 4 + }, + { + "name": "tattoo_eye_moth_l", + "directions": 4 } ] } diff --git a/Resources/Textures/Mobs/Customization/tattoos.rsi/tattoo_eye_moth_l.png b/Resources/Textures/Mobs/Customization/tattoos.rsi/tattoo_eye_moth_l.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8d615f49c7ef0bba906b8a4a01385546815a39 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWND99h+6XFV_w}HWh3m1TN$_)Mhpb%?GkY6yvf9C&;zqpJ40tFmBT^vIy z<|L;mFi5aZW;*u&hp0x)zu%2U!W_F3Lk_NJ3S?~#W;`t~QrO7<g6qN;$vNr?tct=L fc7P=(E@oh;{=w-Om+9XDG>pO1)z4*}Q$iB}<>Ni{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/tattoos.rsi/tattoo_eye_moth_r.png b/Resources/Textures/Mobs/Customization/tattoos.rsi/tattoo_eye_moth_r.png new file mode 100644 index 0000000000000000000000000000000000000000..86e104d1eb535ad29e53761b34566c36d7d1c89c GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkNHD-B#1%+y+qUh(g$qeM*B1gg%q2m7!3_WZy98WQ1akE~T^vIy<|L;$ zF!zKA3H)eKn_$#Ffos-|<dB33Tng^?5e$}%3E_qgda|MibQu`5)7cz9#bovZwK90R L`njxgN@xNAz7j3A literal 0 HcmV?d00001 From 056b25d01ab9d178d1b4fdec51dd59d818a88e33 Mon Sep 17 00:00:00 2001 From: TakoDragon <69509841+BackeTako@users.noreply.github.com> Date: Sun, 20 Apr 2025 14:03:46 +0200 Subject: [PATCH 444/622] Salvage Airlock (#36375) * Salvage * atmos a * more muted colours * Mapping Related to AI * Fixed small naming inconsistency * Revert "Fixed small naming inconsistency" This reverts commit 985e1fd46a09e521c11dc345f470228e7907fbb9. * Revert "Mapping Related to AI" This reverts commit 5d5ae4feb819396c5c2a7413399ab5ce34f8683b. * Revert "atmos a" This reverts commit 529831e2584df27fa102ee1c970948fa3b6bab56. * indent --------- Co-authored-by: Milon <milonpl.git@proton.me> --- .../Structures/Doors/Airlocks/access.yml | 4 +- .../Structures/Doors/Airlocks/airlocks.yml | 20 ++ .../Structures/Doors/Airlocks/assembly.yml | 19 ++ .../Structures/Doors/airlock_groups.yml | 3 + .../Airlocks/Glass/salvage.rsi/assembly.png | Bin 0 -> 1249 bytes .../Glass/salvage.rsi/bolted_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Glass/salvage.rsi/closed.png | Bin 0 -> 1399 bytes .../Glass/salvage.rsi/closed_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Glass/salvage.rsi/closing.png | Bin 0 -> 2419 bytes .../Glass/salvage.rsi/closing_unlit.png | Bin 0 -> 432 bytes .../Airlocks/Glass/salvage.rsi/deny_unlit.png | Bin 0 -> 321 bytes .../Glass/salvage.rsi/emergency_unlit.png | Bin 0 -> 588 bytes .../Airlocks/Glass/salvage.rsi/meta.json | 195 ++++++++++++++++++ .../Doors/Airlocks/Glass/salvage.rsi/open.png | Bin 0 -> 336 bytes .../Airlocks/Glass/salvage.rsi/opening.png | Bin 0 -> 2453 bytes .../Glass/salvage.rsi/opening_unlit.png | Bin 0 -> 284 bytes .../Glass/salvage.rsi/panel_closing.png | Bin 0 -> 445 bytes .../Airlocks/Glass/salvage.rsi/panel_open.png | Bin 0 -> 315 bytes .../Glass/salvage.rsi/panel_opening.png | Bin 0 -> 470 bytes .../Airlocks/Glass/salvage.rsi/sparks.png | Bin 0 -> 697 bytes .../Glass/salvage.rsi/sparks_broken.png | Bin 0 -> 183 bytes .../Glass/salvage.rsi/sparks_damaged.png | Bin 0 -> 184 bytes .../Glass/salvage.rsi/sparks_open.png | Bin 0 -> 175 bytes .../Airlocks/Glass/salvage.rsi/welded.png | Bin 0 -> 296 bytes .../Standard/salvage.rsi/assembly.png | Bin 0 -> 947 bytes .../Standard/salvage.rsi/bolted_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Standard/salvage.rsi/closed.png | Bin 0 -> 1098 bytes .../Standard/salvage.rsi/closed_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Standard/salvage.rsi/closing.png | Bin 0 -> 2067 bytes .../Standard/salvage.rsi/closing_unlit.png | Bin 0 -> 432 bytes .../Standard/salvage.rsi/deny_unlit.png | Bin 0 -> 321 bytes .../Standard/salvage.rsi/emergency_unlit.png | Bin 0 -> 588 bytes .../Airlocks/Standard/salvage.rsi/meta.json | 195 ++++++++++++++++++ .../Airlocks/Standard/salvage.rsi/open.png | Bin 0 -> 336 bytes .../Airlocks/Standard/salvage.rsi/opening.png | Bin 0 -> 2096 bytes .../Standard/salvage.rsi/opening_unlit.png | Bin 0 -> 284 bytes .../Standard/salvage.rsi/panel_closing.png | Bin 0 -> 445 bytes .../Standard/salvage.rsi/panel_open.png | Bin 0 -> 315 bytes .../Standard/salvage.rsi/panel_opening.png | Bin 0 -> 470 bytes .../Airlocks/Standard/salvage.rsi/sparks.png | Bin 0 -> 697 bytes .../Standard/salvage.rsi/sparks_broken.png | Bin 0 -> 183 bytes .../Standard/salvage.rsi/sparks_damaged.png | Bin 0 -> 184 bytes .../Standard/salvage.rsi/sparks_open.png | Bin 0 -> 175 bytes .../Airlocks/Standard/salvage.rsi/welded.png | Bin 0 -> 296 bytes 44 files changed, 434 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/bolted_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closed.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closed_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closing.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closing_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/deny_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/emergency_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/meta.json create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/open.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/opening.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/opening_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_closing.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_open.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_opening.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_broken.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_damaged.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_open.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/welded.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/bolted_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closed.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closed_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closing.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closing_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/deny_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/emergency_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/meta.json create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/open.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/opening.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/opening_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_closing.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_open.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_opening.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_broken.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_damaged.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_open.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/welded.png diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index d6cc5532b9..1043ad5b8e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -223,7 +223,7 @@ board: [ DoorElectronicsCargo ] - type: entity - parent: AirlockCargo + parent: AirlockSalvage id: AirlockSalvageLocked suffix: Salvage, Locked components: @@ -617,7 +617,7 @@ board: [ DoorElectronicsCargo ] - type: entity - parent: AirlockCargoGlass + parent: AirlockSalvageGlass id: AirlockSalvageGlassLocked suffix: Salvage, Locked components: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml index cf6d5a89df..a399e16d0c 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -40,6 +40,16 @@ - type: Wires layoutId: AirlockCargo +- type: entity + parent: Airlock + id: AirlockSalvage + suffix: Salvage + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/salvage.rsi + - type: Wires + layoutId: AirlockCargo + - type: entity parent: Airlock id: AirlockHydroponics @@ -207,6 +217,16 @@ - type: Wires layoutId: AirlockCargo +- type: entity + parent: AirlockGlass + id: AirlockSalvageGlass + suffix: Salvage + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/salvage.rsi + - type: Wires + layoutId: AirlockCargo + - type: entity parent: AirlockGlass id: AirlockHydroponicsGlass diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml index 98508b21bc..8824b946e7 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml @@ -195,6 +195,25 @@ sprite: Structures/Doors/Airlocks/Glass/medical.rsi state: "assembly" +#Salvage +- type: entity + parent: AirlockAssembly + id: AirlockAssemblySalvage + suffix: Salvage + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/salvage.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblySalvageGlass + suffix: Salvage, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/salvage.rsi + state: "assembly" + #Science - type: entity parent: AirlockAssembly diff --git a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml index 9beedb5e49..76b21acfcd 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml @@ -12,6 +12,7 @@ hydroponics: Structures/Doors/Airlocks/Standard/hydroponics.rsi maintenance: Structures/Doors/Airlocks/Standard/maint.rsi medical: Structures/Doors/Airlocks/Standard/medical.rsi + salvage: Structures/Doors/Airlocks/Standard/salvage.rsi science: Structures/Doors/Airlocks/Standard/science.rsi security: Structures/Doors/Airlocks/Standard/security.rsi virology: Structures/Doors/Airlocks/Standard/virology.rsi @@ -31,6 +32,7 @@ hydroponics: Structures/Doors/Airlocks/Glass/hydroponics.rsi maintenance: Structures/Doors/Airlocks/Glass/maint.rsi medical: Structures/Doors/Airlocks/Glass/medical.rsi + salvage: Structures/Doors/Airlocks/Glass/salvage.rsi security: Structures/Doors/Airlocks/Glass/security.rsi virology: Structures/Doors/Airlocks/Glass/virology.rsi @@ -79,6 +81,7 @@ hydroponics: Civilian maintenance: Civilian medical: Medical + salvage: Cargo science: Science security: Security virology: Medical diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..90c8c8bfbb12c2af71341fa2d21e273e1a389607 GIT binary patch literal 1249 zcmV<71Rnc|P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px(n@L1LR9J<rmtSaGRUF4Zxw*+rn%kPhCZSuKnoYVn(7KV~sKai!3d#h*2azdG z^u;1L@Ii;dQ0Ar#We+0-!6*0NgEC+I!!}`}6bBdQV9pK4x;ABPlQs(_>2lNj@gX_c z?ajT-()xwVx##fveZSvx?)i5e0|Nt9fI^`FK($(>6_UxM!`$YUrD~*SW6N9shr>Z2 z5CA|v_>=;`>2aBT`}PqG1n3Th8o~4FG?_bhIDh^;uRiG{@pIOe`0$Ihyi;cjExBIW zS*e*x9NN*c%hU6B>FxFcaQwTp?FgKF`|<l40V8Db66|v0^E9gD3nem(MF2XzvUT=- zVl{4A1f0|6ni5Ci5i*NKx_qv6iLb^j83W4u$Br&UUprRbKXw#oxHgY>Utgc)XFGK2 zuckJ^QQkjxG}C+VQ^9>sn<LoeMiS!c-j7fCm*$oJ&6`~h6w-=aj}mY7bK>=lO(u$^ zilbPnIIK(ngjrGswm;^KIPNOl&wp`3n2-TVgQFkK%}j>8zRrwDkZcSjQ%eN9+;;wK zF?Hjr&&Ypw>l+E*wXa4SI*OvCm$Io~rBp00WmCbn6<R=1lys$3EQ?1`lr)Bp>VWQ1 z{nLe9Ht13P(`JHfZh5^PbkhUokuK!2Js#CRQ^;j|%-Mc*?JHpwL-z~_aR5;YWOK`n z5$FqdtVzw>DN&c}m0pkPPXjAvf4)!xQ}0K|Cc)x7aLZB^z`Pp@4l%OzGLp~d|5n8a z)Ww@H{_BusZ>+XrD{&KtVi5nQg5(2`r*Ch;zd0K+o0z`6g`r4@TbG|*L7197ZfOc= ziUoMkqml=v{`m1oJRS!R;Bld88hAk}>P0-NKV8UWL&n6SUbGcj3*zxOnx>&?8Vd^x z#N%-=E<>>d0li-Suh4a!$;nABJ$I4sU-$-HudPIRQ*44#J;<Z_XBIQ5h`wCDwJA2i zj@>_yOf9V-3g6gBGMTg#d1&ybrnbIt2UEY_t4F_nxc0KAR>(IeVnhdPmAd$p;&MiB zPQ>`LJVL&hTS3_F97wxWaDLgS@49k@VV8@Gduk3E`+yJ!5TzZ&k~8DvZ}#RCMWMgH zpMQsk`Q^X?6s5M}CAZ>UA>I&CtPh-bb|2=0r$0e)NtUOfoe53Th{a;WVlh-zt*rt; z?%i;mndNOwJ?`CborU~1wr;=BL>BCF6TW(XbK%;hJ>UaxZ2P;jfZ}pS%f9ejbXOl- zP8^e{H(C)54Ubz2v;!lD;&Mj2g5f#iwk%Qq=2j+*_qeq}a0qb>+cL&Us4thNBq}jh z8Ikoshzoc-14+bT)H8eL^P$nxpXm-q-buCl=5#7QpZwO6s4v{nIAGdADE3HabVE>< zkjem;5--0GAdkc&oYUqQPrUM8?wOMx<}QzW13UMY>@J1vo`wRmRk?8c>;+Ht(I<)> zXWl$Q{buY)9NJNBb#*qP-5--y+%iCBvB*d~V*B&37G!hF_*GX+ZrK=UCn#dtfiZqH zZVA(s%P1-yzv^oHQfiD}E!QzPI9LV9WHPovW~}%393U91o%sI&p+82Mb6%m*00000 LNkvXXu0mjfZPs25 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/bolted_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/bolted_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..6857f2a24154b06497367e4b2474465b750393e2 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP<kcif|XBGJx3<O**?q7Lu zk(OD8icC{-G5dy$AV#+C%r3VO<r&M<KmD9_^_RDQC*v&!-;#IAg{c<CJacECeYsVC o^5%Cde@Sky@^%4(C&wGuSIw7TTI+CVHP8wMPgg&ebxsLQ0FUJ}M*si- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closed.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..6e88e69bcbea2fae9d2646d0a586fc178179178d GIT binary patch literal 1399 zcmV--1&I2IP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px)F-b&0R9J<rms@BQR~W~Cd!3Ct#?6`wYTR_S+gKqLWdo9iCW4`~wNR)KioIA` z3eAfTrL@wA(jrNVwDh4Q)R#Wg2L+`?=moV^X&bx@23>2F5j8QI%O>l(-Hkh&>~0@6 zXPlj#-9+0z3}@zi-}(Q)^Ub;1nwy*R04*&oT)cP@fOI+yKt7-6|ANhCqo$??fKVtz zBoYC@Da2J(W#=;z0Q(1>Y~8vQe@zXwb#*$)R5VKL?p=-_KhA4UJLvx<&hD2B_OFko z7i`nrngihAIhB@{79x=dw(Z-u=T%juyETVTb}iVG(W(11)>Z+~cQ~pC@G!WSn&rS* zJE2err>d&72UGauYTdzK?Z)eI>ffpK9I-?OfTdMVOHwl`aV+z?cxMajJE7w2Zq2dG zBz{bpC?V_$HxNr?sP-<LrG+>EY(RHw4!ciwVY6tM-8QgiI`BqscH6)nK<|ysMA~;a zS|TKTv)cyt#2R;gCOD2M6Zos$MZR``yh&W%^66gR%#_r$cCBk!Ix3axY5%)T?0s{U zWe@=M%t%jce9F;ayD!zg_~l+>5MqAWMXyBEa~pa-nHU@P-n%!gB@!_$aW|%w3*gq| zOgR$(BiAl_C-01C;z_N0t6yYDWYTWcP?DtROnlOxo6BTp;*<W0Dit6}QZzT0$%;pk zq@q;$WS3<C8lZV(-)K4+_j_dDsM#T&oLy`Tn&~NlWd;D!$@mJ7>>Eob<15Uz#jF<< z0$Ml#Ar2r)fp~IO&%o;XB^A}o!CQ4kUnx@QIpNgkk$q91X!HxavG+X#!vH0#q3{(M zoG%+vsnlPx!CsVs!BcIbk>#8cb~CJ&VuP<_5dS-e-D~D@-n{S}0LwixSMN0ATN|%4 z2Qhl5nYM;Hgs;Hlcpo<}yj~K(a*s?37&-mZ$Kh}oJb=fAq9{-W%RLXcipD@j%ixiH z(R4CiXRdz~gu`JJML|&%rl+R~hr=a4meWv7K|q@?9|@YKF+4oX(DP^b;iUs;TIo!5 zKDOa!m><z2f80h450C5{OT;D{wAt*<HNhKfYX7lh<*UE83enz(0@s7@z;}-qUOEfK zrj7?(`WT41Wv-7LBe0?1G%r3Pxg3G(H-encc9F^?i-gLJfv8&s$3Fdg^QB94xLlm+ zEJSer)C)S7<vJk50Yq62U;W-!)+R|3O-)Ux9Uc6-V+WE{x~~<TF5Hs4NZeR&g<b8t z@w#PtfBT4C?Ym3tilPt<1_6*|8AVZ8Q)LQ3{KG3loiwhz%Gm7sk{&m%yvlTHJ?l1} zED`ZnyQ#liJQl7Db%GbFf*ao(2PBsxkoDG21U9dR3;n&*>8Q@7|AMxT!9v<xj(}Bf zg?%wF`bsWGpxR$QVO)m0o;|DE^#H_qKny%HsquWb5QMJ~$FMA$eeG6Tt2Ub*v6Bl@ zAtQ@{5ErOgT64?n;}n~V*dSJnfB!{W&;HLfn=R!aUweIYGBtJUkfp%t`Xxmhiy3vn zCzl3R`ki*{S%9JbS3bnN8Ho(U5*fO}4FC-Gzxu%`HTutyLq~GAvsGnJA3X!Zy#MX( zvUh{=yfc0J=*hW1$5NUQH=c|EY`t%{<S}fsi#bvYl)IQb42SdJIlF#kGG?OOrJ@qz z$yt1|YtbCvoXFw~g+d%Wr_$Y8$h06RCn!X$V63miA;d$W5cWtULLmsdE?}M+qE3jH zJCqvhD;->gcq9_RX1t!Os#=IX7AxEMzrgP=?Ci$t`M;^<q5FC8!&?9V002ovPDHLk FV1lMaoWuYC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closed_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closed_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..c78d01c42d084dd5be78e8a33a599a90cc86107f GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP<kcif|XE$;-1PC-gl!=I( zGgq7A-2<C*Pi)>P>^Ss#&mpghvZkX~#s0-h3N2b6`K?}O)meqDd+l#VI$hWM`6MlQ q&#%(rqf#%I&Hk(pG?9U!&gT+u#1#>y1s3nVf%u-TelF{r5}E)5_cy%& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closing.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closing.png new file mode 100644 index 0000000000000000000000000000000000000000..5632fca9c068504cc332375060ca1be124af7788 GIT binary patch literal 2419 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closing_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/closing_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..2a71f76d5d0c792fe84b136920ab32a386dfc7a5 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFff*Tx;TbZ%z1nJpx+?}5x0ld zi=@Tg_?Xx<t&7=F)O_A|(fI?~5<+*)^f;5-T8;=TD4#X+U*DYkSgTzA%WOub8LcK& zJ%MEc=kMmuS^F;c=O(V?zTdz8N$g(kzk8<dn{&^;rDoqQiC$f)bNtv8_8leR)9V<o za45Jj7&3JTI`l9ku?Q$PNH88DU1;~ym)+ahzeoKP_~ZTj@}}?mN`L(RTe<CP-}}4Q zEuHP`pBUeK&t9SL;JdtU;nD9hUH6+RZYuMi2U#r2KjHHPx3q@+b%oJA@lVB$=zREH ze!k(_qutC;=0)6^H}k^!S3Dp7s7VNI`(iiMkL|}_-gUK3_ij!qmRWn|!0Uay$80)H zu032MX;r7a|3o!&&svuc)Bf>UR&i(je0cL#ec*0}-@j8|{(iQzwzWT#=l<o3>!&5f jT;0h840aHhFykh_!rG~;5AeP$1@S#y{an^LB{Ts5_a?jl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/deny_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/deny_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..7c56263f83958a17893b3db0b04ce3078c15cea0 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFfej>x;TbZ%z1lzVbEa*5x0l` zFLCLtQfk)goBm*9Wqa5)W5IyH?gg7O+Vq@#{gzqI_j{ICbSF<}<0|vo?Y_6yOll7; z+AsO(r`@v>Kf7}$KR*umYV~i&zP&s*_xJv-=38t1deYzEyLbMqy6^o$Z`IbavsGXD zr!(F8`6z;|L6RYjVFqIYc7~Z}LvrZvRZ(vk567Q>-*~3QX2MKG<^wzo#tdf|3@{iQ zO7s8d*3Gv+{xi?r|HRuDl15mS!8LAhWr_IppL3FmClFnFq<YevYu0MHo11>60fUCY M)78&qol`;+0G5h<`v3p{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/emergency_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/emergency_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..817f2fb3f95c53ee8720a7c5be418b6208a6a7e6 GIT binary patch literal 588 zcmV-S0<-;zP)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004nX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iQ?*4Z4t5Z6$WV2$AS$ApR-p(LLaorMgUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwM<*vm7b)?7X`w}o2gm(*ckglc4iIW3rdb_hfTr7K zG9DAtnN>0H3ISaRVg@5Jvy3@OO2Bh`-NVP%yC~1{KKJM7QL`2Ud?N8IGfbO!gLrDw zHaPDShgm^ZiO-2gO}ZfQBiEG%zj4mHEbz>*nM%$Rhl#~}8!K(h3Z_OpNgPo%o$`fr zgH_I3oV8MgHSft^7|QA^%Uq{9h&UFp1PLM(R8T|-HlnoZq*zGOe$2x^;QA$UDdZ}G zkz)a6Xpmh$_#gc4*2+zcH<Cgzp!3CXK8Aq6E>N#J&iAq7)K38aGjOH1{N)-j{YiSY zrA3Z_-fiIGx}_<5z~v6m|76If>`H!`LM{iqpV2pEfWBLxd#%x1b04P<K#ICb+yDoM zz;K?j*FD}HZ13&gGtK^f0EVM-uUjCQG5`Po24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&6>2?sl(`5Ny4002lyL_t(&-tEhw4S+xZ1i>Rg zVKDSSX<rkieGhLiC=!quFeE5u<XtxTx$fy$mmK|^4AZr3E!k@_miz8a0{{R300000 a-#Y<x4-Nvj$|YC;0000<MNUMnLSTZ^X76eM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/meta.json new file mode 100644 index 0000000000..46b3d3e406 --- /dev/null +++ b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24, salvage version made by BackeTako (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/open.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/open.png new file mode 100644 index 0000000000000000000000000000000000000000..e36b0b50d050c764603b5bc111b40e7dc262c4b5 GIT binary patch literal 336 zcmV-W0k8gvP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$3Q0skR9J=WmoaO?Kp2Lf9H|r~Rtj;EqZvAN$-gLd&eWw)=wk2><QF)&+ug;< zIlrSzCkM;7wR^|vAcsa;x+Hf8`ixoLC%N}{Nuagf0Emd9%7%Ig0JPRWhYwZ$(5pG; ze~K)o$YP=>LS1z(tP2>%_m>=hcI)^fa9oZinJmAm0<+N#)8~N|2@z2uqKt$Bkk9X? zbN|Gj4xF}t?zf!@gaG;L2mHPVwPS8tk;QO$1UAAACLADKzYT%8t!w~xnLGR_p-aLf zEn#IhG)c?7fHxhmxrU3?{)H95<LwhKce&LyG!mgXkLzv=-kXlElBA{kTW}UQuc7lb i^rHhOEfBc=J>LR%*HiMBrBP1+0000<MNUMnLSTY<c99bR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/opening.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/opening.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a5a5dd3628c64431c55d7f3eef9f2232985507 GIT binary patch literal 2453 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 LfHk9;cqaY{l$5=E literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/opening_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/opening_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..84933bd5ed9cd40a972aee792b227f9aec95f233 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?smGo!jv*Cu-rh3wV+s^$yZGD0 zL?l?KBYMN8O&gN#is&?S=?VyYuIX6%G4i74!oJVK#eVk1`OmzURaCl$z1~~D^FUSg zeSdy^Q|Y|y$nw%P&#UZfuWX3F`YiMQv8rd=jgMDcpHaMj_wl0)K97%;pA%B>X)s_s z#KIwr!I-V$V11^#dUpKLjjy-9DY|#Kuw+Jjzzl{&rWQ^CH3uAwt;hGhNWR~>|B3$l qhyP2a-~C|qG6v`^C}^l(vC57yE3)EC^YOwKkf5ilpUXO@geCx+nr^EA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_closing.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_closing.png new file mode 100644 index 0000000000000000000000000000000000000000..db7be0bc4a0ec0b2bc29e8718fb6b71796846f16 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFfg`wx;TbZ%z1ljW7eSnk%ott zh4w7m<?+$brK^#r_0V0JCB?@sg})G<a_OXb;l+!(0WShP+8$gBFA#1~%FJ(fni!HX z?T+%VdhcWZAABq_c3}aU3<3>qk=b{5eiK-()1~xQ&@cMV`(mao8yQ?TZq;#^Y}m${ zacWZ!Yev-i>$j948lYsxftl|YY`yljZkp{(pFL*+-lj#WWzI6YweB*{ESZG)8eLCP zH-4D=_wruJUKQWqugks*3w-~bxAmsS_S>R@6K&4#1!`fty>^f8^xkc+O+xqazTJA; z{=7~2>uGDRIhyR%SJ)ONH}BrkKUz=f@~-S!d-avVtb5`KJrkcF_ZOUaf4N)v?bouY zpX0AZna`Cr-@$dKByUdGcPkF5{Og%j`&-%%FXZlavSVWw{8-KzzB@7SM0TXvt!o+A zif+H$q2jsc@9*!WwR0M*e5Y<-(ETyu&`qBj{lx9nl5Os{*Qk05m8bu?%XoF&`KQ?? l*%zfe7FQS8+W~`WRsIyAi(3!btSA5lf~TvW%Q~loCIEIM%9sEE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_open.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..24eb2aedc2248aeb772b38f63ff992254e7aaec0 GIT binary patch literal 315 zcmV-B0mS}^P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800033Nkl<Zc%1E% zv1-FG5Qe`NW0@w4DSnI)iUk=81#KBZXN{$=&?g8bFOwx6vk3|v3eI4%^%Xn^ig9`! z3I^9%)fB345yu_+ehvu&fj}S-`0rf!yxbTgTI;SZ%M#~Y&l&j)pta^@yY1?``5fn5 zZ^r8eW|N83hXZMv0uVI~Z~J}EdFe9%KsFkEpSvAx91r?l1I&!!>G_@Zv*NK(#C83< z0hCg#mPY_q%Og#e`P2<D#>l!*GQEjpT`0MYBKbMv^%3TIE=g7KF`WXCR28pn>(x2n zemoXytpJ?bfcIZ;wOEjBHdt%rI!S!%PGhZ=2c^1AoGrxJ<blAS<_o6zNZjs5B%}ZU N002ovPDHLkV1j&ig|Ywu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_opening.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/panel_opening.png new file mode 100644 index 0000000000000000000000000000000000000000..fc90acd637a6369812fc809489dd2961fe64b1ca GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFfh*bba4!+nDh4bMlWSYnd2Yl zZ%UbVSxu(0N1#t<i9pLsog-CVJHvOV3w%t?@yXm?P;m5Mlup?`r(F#SiuWR9)DyYa z{<GdZ{rz&z%ul}$rQCE7;shEF0^bfcKJBi4pBx(c{`~A^fw9+@&EC1a#G32$##O7n zeE#?E@6VSvXTI9CZO)l}OK&Is;*0QEUikITnvWGao?2$of9q;|iddgqy7bm!i`*O; z*}t_l6&K1(HqDcEIi1)3l2K>R_5RoDx&OEP+E*gAHf&mPbH>ZE8FCH9e&*rpCoP%1 zIy_fR`1DT4EhW}ImG2+Fy>#^EcBOlIu{N4r8M|lHdv8DdMa^XX`Q)41s%D;5@l3t_ z>U!DiCu(!NfiicFek|lsbn*16WPNgF)9u86nlDcO+<9uZb*sRm>zlTKo#3wDtk_cV zGUiQg0fX*;t18(yxo?DbZh3Nv5#oCg`Gddm{r7*~nV;{o)~0;#=kiD}oLj`YgzrYV zCx61j+EYJuRBRcZ$AIaEWtl<e(iLAauDSkt%4e_{3(E5sDxY?ikYafS;(NOKxvX<a GXaWGy(%XIj literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks.png new file mode 100644 index 0000000000000000000000000000000000000000..dd67e88a315f674a061fb3b27660b8c761c88f38 GIT binary patch literal 697 zcmV;q0!ICbP)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0007jNkl<Zc%1E< zO-sW-5QZmK!CnfUs`L+d5CqR2s=wQVKS6r(EEKdCp<V>7E0M--(oM3v-T6o|50rvB z?(X|$_9K~q!b>Jme`5^XKVF&j%`2QtMsN-@c!MQ;uYX{&xPXV-MV4h*a7^*H)mTo% z^duKBlw8QrI7#Az6a!+!k42gRM*{jVXw(2^)BtAG0A@rO5W6r+TTo*dR0c>itn&u= ziYhf*#29dhKzXbye)sb`x`T#9jF|@skRQx^J~1)&r}u;k?=m8#VH_qLszE1c7I|*U z-vi17+kNaSp<Z~tEGWiY{U(RPh_)<%k1<OIw2im>Cz%9yQ#rS&sN2x0`#dRVZ$Zo3 z(YozxD(tDJ*Nd^#9ngM11*`#hZL|qqUX-aA#5S}G^!n=WLLU@GQ4~c{6dSK|xP5Tx z!-H@vnhtn%y49-Lc3NyR!WG{&^FjpmIbAy+o5nPrx)V}}E%fz`bB+BtcI@^)8^rTf zBx((Ky3EXU1aLM2IGxVm^KA+58-UdY;QHA(FXNaPN!aD?zV8}<6&DioA6qwm%&S`B zG(?rf)v;@BC^IYu=$f%ZGhhqXw5SF!qXsa;V!%*uXSl{qZh&O*G5ePMUQntINQ83i z$upoRb}H)fv5TKDu*ZP$-hvmY3!Atq6ENBh(WYFFM67|7l05p#?E1nmayZKasmvEs z4%uF#@2=U$hCc&#<3^>qaoRUjD5t(Q@!@5>eLn%YPa&y@Wk6F&Jf;Amr=S&p`TF~H zKQmyzZBbK@-3j_NfaCqFrZteLVgLD`ViBgsl+FQ!832*%0DhkaTq4i015y-4Q4~c{ f6h%=KHvsSpwHV1KmpgiI00000NkvXXu0mjf++aJ5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_broken.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5d774588ae44eab5608571cb6aafad7375e158 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?$P6U!|9apHq}T#{LR^9L|NqA3+=6aE7Gp_} zUoeBivm0qZPQ0g!V~B+0+k=LDO%4JK2X3C7n6o0|55NE8mw8XPoOIr7DLA&?`@Kq0 z`sGua{4Cd+i#BF3Cvx%VMD6rkvY&scrjImRmb>DFD66%%n7hj|c25u0=Hbzuz>&Md dbBcZ?)Aw7<0^jOhxdW|Y@O1TaS?83{1ORW&Jrn={ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_damaged.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_damaged.png new file mode 100644 index 0000000000000000000000000000000000000000..f16a028dee5bbe41a7f4e35f686043e8a112ce4e GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(YymzYu0Z<#e`9lQK{p_au_VYZ zn8D%MjWi%9!PCVtL_+fI!HvAl4m=D8Hh=XH6ZQR;XyVo{y01gP^_0k+pXD$8l*-N4 z&iUk!V5<=?maE{?*yyS)-udN6;H*Pi5*L(-Fs)pAdDY$x8SUGCM{GTG-~v<Ug|=>& dN}IerjGt7Q1>7HnEC$-e;OXk;vd$@?2>`@EK-2&L literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_open.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/sparks_open.png new file mode 100644 index 0000000000000000000000000000000000000000..630eabb976ecf11fa59ba29f03502b02bde399aa GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?$P6U!|9apHq}T#{LR^9L|NqA3+=6aE7Gp_} zUoeBivm0qZPPnIwV~EE2<OGQ)2N;)UFbHTH9N?I7iA}-JL5QW9)gYDEU?STJh8Q=7 zyA|whfeu+RnhNat9OVk_TbVcAV%|^@$-rI1mok%0h3ER30}V2*C$^dMOu5duvX^h6 U)9+<QKr0wLUHx3vIVCg!06l3kr2qf` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/welded.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..a0040dfdc73fb4142135ca841953b402d57348b9 GIT binary patch literal 296 zcmV+@0oVSCP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80002*Nkl<Zc%0Rj zF%E+;3`KvdZcLaBBo;2f5H@D-+#$DR;Q+9+1SSw$I#fMC^O3Cn{l`y{9sdA?y0VOn z9{`?|yQ<jw96-}FwgB@y+X9FPRF&!jt_J{|=SlgK0aP`L2(Ifw-}m%1BuiDJ_dXfm z#R6>GM)~O;5D{Ad0LZe;7N97KJC6BX-upNVgWUu;=WLfz+qP_d4j_bJ3vh=hfa5r9 z0qVN81qdO4*#ozUc?-;6LK?t17pG~m0|2;<_}}aJ8%Xzkw*de?p>!O_N2;HSWO<%5 ub^zoJEX!gGaL3n-QrC61fn;4*wm#k_G(h}nBOLz#0000<MNUMnLSTZ;qj`4# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..12c86d9f9a8782a20c15d02f79e761e3a5a10664 GIT binary patch literal 947 zcmV;k15EshP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px&ZAnByR9J<@mrH09Q51&1NvDZvV{M{s)Ee6qiQ*<cM$r057cD+kf`|(dbg8)L zR^02tjSH#ZRu_T@ZbY$F6s00eeNYvxQX3;`TTNnV+B|B<MVN6iGnq_NA3qE;bMHC- z`R~1R?>QqxA`t~3o6Q2CC<>L3NF)Sfn_F}#!4)kPeE|eP!0-11ARgW20pQAjNLN=E z0l%MRO--8dw}}aosTBSF{T$g|L+|Z$S>jU%ihdXFWGiwV+A>!Z)7!JD;*dXmn_<;5 zF92t+Pn4a3^CverngKmT^&!yUrhbw3N+vr?axxFVVy|fJ?GSd{qH545kC`01r69@4 zJPq}=3kq(>?a~`;j`+0;&{P}eI}{38E?duq=cYE5!^qtyj}d5a<I)Frg5Kk;oIBQH z5|N*s6Y{fjf|Up(^demI2@a4LpLT5PM1<>)uq^<N1*E46|5rexulk+fNPyi4(^Cbl zKh#{e;Gp_g+Ud~ft0g^EC>d!cJFE4nIB_u!7Wu#}x)cE8X{d7OgX{T9mcTg80}nbZ zM__dnTLrh`Fvbu+eO^l;y~5-;HvNT;U=yP+_Lj7de?4m{3NYCMEM4Ry16+Ht1WA&# zc3GBb_ofi@xjf7LD@~4xRJ?4UY9L7xvMd7-4u_E>iR7!%e|HY#ayjDhIM4Py;l}=} z<Z?Lx#P;w9+9Kv0|J|En(~g^_ldt)G3yDO+GDutWmZ>e&T*t>pzu#A1UQ>MNEZ)SC z4`G(hY%@8Ie0|K*pWS5gQzh;5{RSr7KB&2*y>ET_l2~mmPdbYVs#*ed%NcS0VR>;L zkB8RQR^G*8+&z34kEd9P3A;D!QG#{lc0tTE0|51IA7}2JCRdoVtc-ego+`2ZSaXSy znKr`VFaSQEkD;L<+P$NQt5&{cb7b5UWN<je_sn|MZM<*l3pBWCe(mgAc=N0i>fvDY z2MW)%+G1T428SywK}T%BuG<mx99E}Si2!3h(ARO*q7sMcDE?b%*H*ybaH>Rv9sWc% z)W;ONr67Is7=yzpN2S?(v!Pw^ZYhYEoXn#ap@%V*s+dnUR5^^?YFRD<s3OY!JX8ZU z?^og$^@imF8jA=g(A(Q_yD*eo`k?An&F;|K+xZI7XjB16CX<fI7y5e+5C{YS_yt%^ VlRI4`P_F<0002ovPDHLkV1lK)wxIw3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/bolted_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/bolted_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..6857f2a24154b06497367e4b2474465b750393e2 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP<kcif|XBGJx3<O**?q7Lu zk(OD8icC{-G5dy$AV#+C%r3VO<r&M<KmD9_^_RDQC*v&!-;#IAg{c<CJacECeYsVC o^5%Cde@Sky@^%4(C&wGuSIw7TTI+CVHP8wMPgg&ebxsLQ0FUJ}M*si- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closed.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..5217ca82f367cca23cdd1a7ff7714cfdf18f135c GIT binary patch literal 1098 zcmV-Q1hxB#P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px(1W80eR9J<zmrraPMHI$=cGq@-m&A6O1lmGs#3mJz713@a2oVWVA_QD25#&P! zf(sJ8^u!_JP7Yi+pjPz40S=8&B`yd=0;K{4wb?WzTTq)tRov2&#EtDnacetm%)y<_ zdUyS=Nk7T*?z}hO``+x#n;B0}Pfrmb7K^d4umC_Vmjj?!EV5hhcszu|VE`0GLDzKv zBoW*&4Bme=0KhlX62rs8M8aYAwzr!kx06Xy=`>SQQ@s1i9!~z4VeIXa{fnP+HT%T- zwg8xzF^I)t=(>()bab?67zXjaEkd%dW+wmMzQ=*R%>ay_O_~B4!JX_TXD)hC6a~pJ z3<jcELUN1g5NYufY?93PZ0<g(^#TA-HcPIgc2whN4f^=-H8_3FK#KQm(P|4msjWB& zN7PPI>jheZwMVHI2Y?5N_if<~$v!+T9glQ}%^zT9<FS#BpG`Uf312(Mq_#q&#b4&@ z1t_`%uLmbT>f*Bx_PdI(!!AOsFR#eTs=8j>SiM`fua!I4B$*@WZHQr)5t4n6CLpu1 zxoaXGNkBdIVn+h1WtiF6H0{rHJW+R`N}Oh;$mZ^wjUm}bW@ED~Q(?EZ9Y2)-a8yGp zmk930g>?j`&-a&gvJbP}F5p&*8{v|c=HCFItx4wUtsXWrPdf-#?*2!AXFI}IV0C$% zrTO<9{%uV%S>W6GR#a6r+ciz&x#l!&P1{^$g}sn3@Kku8gYZT=;g)<&sH%#lX#hl{ zQB+kW_199F&tt6v`Fx&4BEj677x?bz8S?qO!$&&U`vW|j(bs>!$-(Z7!)dKK&EbLX z9hI-+pZ$pbR+PB5-=F>Z`O?Es>F@C1HkUaEl75+M*C%Pa_p*cV+VUS<dN4w^uu;}t zX$~a)GVD2RzQ1(&GJ`%J7luj-E}ehN<l6Bk`24r=inc%?Kv!26#^4}7A3H`M5ODaE zO+tUb&vO2j!^t1;JK6wF42%)<%Y6FFC!81<bJ#UaBN~kYAj|T@RbUe!zTuU*Ar9=j z%8~9>2hr?enzif;9D4Crhb_|Lr{nMPxo~A}2!ilV?;VQ#Y3_W7dSP}E)^bUc%lriW zgVU~A)@!fiYd^pMjJ$r)d^QDG&u_TYZo9o28u9g3+9bq&@VMa>by{o?vy1665!KMh zZfNB$+l)k(sr3RQYNta)H5@;c;N!1u)^#@!oYs>uVi}6<Qizz;RvaSiTdaUvaJSKP z3l1Pn%y`W!6PA&vbg8HYdm^<szC8B;Nl_FgW(?werB5LUDh0G3F08P&SK|=D6-B|T z>pCS7UNeAw_KP+Vywd8hwpUw0BDk*Wc&yiR!!SzfQ>lubcY;VH0=Db<|J^~?bf}Kl Q-~a#s07*qoM6N<$f&~o`wg3PC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closed_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closed_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..c78d01c42d084dd5be78e8a33a599a90cc86107f GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP<kcif|XE$;-1PC-gl!=I( zGgq7A-2<C*Pi)>P>^Ss#&mpghvZkX~#s0-h3N2b6`K?}O)meqDd+l#VI$hWM`6MlQ q&#%(rqf#%I&Hk(pG?9U!&gT+u#1#>y1s3nVf%u-TelF{r5}E)5_cy%& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closing.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closing.png new file mode 100644 index 0000000000000000000000000000000000000000..90da770dfcd32f4199a635aec7a7766bdbbaad65 GIT binary patch literal 2067 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closing_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/closing_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..2a71f76d5d0c792fe84b136920ab32a386dfc7a5 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFff*Tx;TbZ%z1nJpx+?}5x0ld zi=@Tg_?Xx<t&7=F)O_A|(fI?~5<+*)^f;5-T8;=TD4#X+U*DYkSgTzA%WOub8LcK& zJ%MEc=kMmuS^F;c=O(V?zTdz8N$g(kzk8<dn{&^;rDoqQiC$f)bNtv8_8leR)9V<o za45Jj7&3JTI`l9ku?Q$PNH88DU1;~ym)+ahzeoKP_~ZTj@}}?mN`L(RTe<CP-}}4Q zEuHP`pBUeK&t9SL;JdtU;nD9hUH6+RZYuMi2U#r2KjHHPx3q@+b%oJA@lVB$=zREH ze!k(_qutC;=0)6^H}k^!S3Dp7s7VNI`(iiMkL|}_-gUK3_ij!qmRWn|!0Uay$80)H zu032MX;r7a|3o!&&svuc)Bf>UR&i(je0cL#ec*0}-@j8|{(iQzwzWT#=l<o3>!&5f jT;0h840aHhFykh_!rG~;5AeP$1@S#y{an^LB{Ts5_a?jl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/deny_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/deny_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..7c56263f83958a17893b3db0b04ce3078c15cea0 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFfej>x;TbZ%z1lzVbEa*5x0l` zFLCLtQfk)goBm*9Wqa5)W5IyH?gg7O+Vq@#{gzqI_j{ICbSF<}<0|vo?Y_6yOll7; z+AsO(r`@v>Kf7}$KR*umYV~i&zP&s*_xJv-=38t1deYzEyLbMqy6^o$Z`IbavsGXD zr!(F8`6z;|L6RYjVFqIYc7~Z}LvrZvRZ(vk567Q>-*~3QX2MKG<^wzo#tdf|3@{iQ zO7s8d*3Gv+{xi?r|HRuDl15mS!8LAhWr_IppL3FmClFnFq<YevYu0MHo11>60fUCY M)78&qol`;+0G5h<`v3p{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/emergency_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/emergency_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..817f2fb3f95c53ee8720a7c5be418b6208a6a7e6 GIT binary patch literal 588 zcmV-S0<-;zP)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004nX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iQ?*4Z4t5Z6$WV2$AS$ApR-p(LLaorMgUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwM<*vm7b)?7X`w}o2gm(*ckglc4iIW3rdb_hfTr7K zG9DAtnN>0H3ISaRVg@5Jvy3@OO2Bh`-NVP%yC~1{KKJM7QL`2Ud?N8IGfbO!gLrDw zHaPDShgm^ZiO-2gO}ZfQBiEG%zj4mHEbz>*nM%$Rhl#~}8!K(h3Z_OpNgPo%o$`fr zgH_I3oV8MgHSft^7|QA^%Uq{9h&UFp1PLM(R8T|-HlnoZq*zGOe$2x^;QA$UDdZ}G zkz)a6Xpmh$_#gc4*2+zcH<Cgzp!3CXK8Aq6E>N#J&iAq7)K38aGjOH1{N)-j{YiSY zrA3Z_-fiIGx}_<5z~v6m|76If>`H!`LM{iqpV2pEfWBLxd#%x1b04P<K#ICb+yDoM zz;K?j*FD}HZ13&gGtK^f0EVM-uUjCQG5`Po24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&6>2?sl(`5Ny4002lyL_t(&-tEhw4S+xZ1i>Rg zVKDSSX<rkieGhLiC=!quFeE5u<XtxTx$fy$mmK|^4AZr3E!k@_miz8a0{{R300000 a-#Y<x4-Nvj$|YC;0000<MNUMnLSTZ^X76eM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/meta.json new file mode 100644 index 0000000000..46b3d3e406 --- /dev/null +++ b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24, salvage version made by BackeTako (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/open.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/open.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2fca19bfe053814333983056c9e921a64f8fe1 GIT binary patch literal 336 zcmV-W0k8gvP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$3Q0skR9J=Wm#<F4P#i|j+OjMx1+t_w%griKn7#!8U4>b)1hZx@&?lI{gP%d6 z`y4Z<3CPcZ$MHurH(eJ9roHzj-H|olY43OQr9Gw8H-L!v)cK-WJOHKCXYFBjb=Gjs z|Kw>zo<@XWh<7?XGA^K5UJlC7ViR`+_RG;GtEcz6!2M#%-F#w1LPUHK@wJ2pAa5US z=l+R19q6`z8XsE|2mrE&SNMGo8b{x>JdI%Y2uy@)bT~lpvbhG<rm_JjGfUhkp-qA~ zDPU_hG){_2z?lx1T*Jq0^}-&&&H0Smi_GX6YKcIf$LORF&uz!oiIc+qEjS1q*3kMI iy3v773-oONp8o)XEmQQfcoCBT0000<MNUMnLSTZ7gOn}+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/opening.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/opening.png new file mode 100644 index 0000000000000000000000000000000000000000..6313b22651d8bd4333d0315a43f7e12bb3ffdaa8 GIT binary patch literal 2096 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 aeEbWK-Fw2{7@)fV0000<MNUMnLSTaNo&5R$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/opening_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/opening_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..84933bd5ed9cd40a972aee792b227f9aec95f233 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTN?smGo!jv*Cu-rh3wV+s^$yZGD0 zL?l?KBYMN8O&gN#is&?S=?VyYuIX6%G4i74!oJVK#eVk1`OmzURaCl$z1~~D^FUSg zeSdy^Q|Y|y$nw%P&#UZfuWX3F`YiMQv8rd=jgMDcpHaMj_wl0)K97%;pA%B>X)s_s z#KIwr!I-V$V11^#dUpKLjjy-9DY|#Kuw+Jjzzl{&rWQ^CH3uAwt;hGhNWR~>|B3$l qhyP2a-~C|qG6v`^C}^l(vC57yE3)EC^YOwKkf5ilpUXO@geCx+nr^EA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_closing.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_closing.png new file mode 100644 index 0000000000000000000000000000000000000000..db7be0bc4a0ec0b2bc29e8718fb6b71796846f16 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFfg`wx;TbZ%z1ljW7eSnk%ott zh4w7m<?+$brK^#r_0V0JCB?@sg})G<a_OXb;l+!(0WShP+8$gBFA#1~%FJ(fni!HX z?T+%VdhcWZAABq_c3}aU3<3>qk=b{5eiK-()1~xQ&@cMV`(mao8yQ?TZq;#^Y}m${ zacWZ!Yev-i>$j948lYsxftl|YY`yljZkp{(pFL*+-lj#WWzI6YweB*{ESZG)8eLCP zH-4D=_wruJUKQWqugks*3w-~bxAmsS_S>R@6K&4#1!`fty>^f8^xkc+O+xqazTJA; z{=7~2>uGDRIhyR%SJ)ONH}BrkKUz=f@~-S!d-avVtb5`KJrkcF_ZOUaf4N)v?bouY zpX0AZna`Cr-@$dKByUdGcPkF5{Og%j`&-%%FXZlavSVWw{8-KzzB@7SM0TXvt!o+A zif+H$q2jsc@9*!WwR0M*e5Y<-(ETyu&`qBj{lx9nl5Os{*Qk05m8bu?%XoF&`KQ?? l*%zfe7FQS8+W~`WRsIyAi(3!btSA5lf~TvW%Q~loCIEIM%9sEE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_open.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..24eb2aedc2248aeb772b38f63ff992254e7aaec0 GIT binary patch literal 315 zcmV-B0mS}^P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800033Nkl<Zc%1E% zv1-FG5Qe`NW0@w4DSnI)iUk=81#KBZXN{$=&?g8bFOwx6vk3|v3eI4%^%Xn^ig9`! z3I^9%)fB345yu_+ehvu&fj}S-`0rf!yxbTgTI;SZ%M#~Y&l&j)pta^@yY1?``5fn5 zZ^r8eW|N83hXZMv0uVI~Z~J}EdFe9%KsFkEpSvAx91r?l1I&!!>G_@Zv*NK(#C83< z0hCg#mPY_q%Og#e`P2<D#>l!*GQEjpT`0MYBKbMv^%3TIE=g7KF`WXCR28pn>(x2n zemoXytpJ?bfcIZ;wOEjBHdt%rI!S!%PGhZ=2c^1AoGrxJ<blAS<_o6zNZjs5B%}ZU N002ovPDHLkV1j&ig|Ywu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_opening.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/panel_opening.png new file mode 100644 index 0000000000000000000000000000000000000000..fc90acd637a6369812fc809489dd2961fe64b1ca GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?!3HFsniTOdFfh*bba4!+nDh4bMlWSYnd2Yl zZ%UbVSxu(0N1#t<i9pLsog-CVJHvOV3w%t?@yXm?P;m5Mlup?`r(F#SiuWR9)DyYa z{<GdZ{rz&z%ul}$rQCE7;shEF0^bfcKJBi4pBx(c{`~A^fw9+@&EC1a#G32$##O7n zeE#?E@6VSvXTI9CZO)l}OK&Is;*0QEUikITnvWGao?2$of9q;|iddgqy7bm!i`*O; z*}t_l6&K1(HqDcEIi1)3l2K>R_5RoDx&OEP+E*gAHf&mPbH>ZE8FCH9e&*rpCoP%1 zIy_fR`1DT4EhW}ImG2+Fy>#^EcBOlIu{N4r8M|lHdv8DdMa^XX`Q)41s%D;5@l3t_ z>U!DiCu(!NfiicFek|lsbn*16WPNgF)9u86nlDcO+<9uZb*sRm>zlTKo#3wDtk_cV zGUiQg0fX*;t18(yxo?DbZh3Nv5#oCg`Gddm{r7*~nV;{o)~0;#=kiD}oLj`YgzrYV zCx61j+EYJuRBRcZ$AIaEWtl<e(iLAauDSkt%4e_{3(E5sDxY?ikYafS;(NOKxvX<a GXaWGy(%XIj literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks.png new file mode 100644 index 0000000000000000000000000000000000000000..dd67e88a315f674a061fb3b27660b8c761c88f38 GIT binary patch literal 697 zcmV;q0!ICbP)<h;3K|Lk000e1NJLTq003YB002M;1^@s6<uq~*0007jNkl<Zc%1E< zO-sW-5QZmK!CnfUs`L+d5CqR2s=wQVKS6r(EEKdCp<V>7E0M--(oM3v-T6o|50rvB z?(X|$_9K~q!b>Jme`5^XKVF&j%`2QtMsN-@c!MQ;uYX{&xPXV-MV4h*a7^*H)mTo% z^duKBlw8QrI7#Az6a!+!k42gRM*{jVXw(2^)BtAG0A@rO5W6r+TTo*dR0c>itn&u= ziYhf*#29dhKzXbye)sb`x`T#9jF|@skRQx^J~1)&r}u;k?=m8#VH_qLszE1c7I|*U z-vi17+kNaSp<Z~tEGWiY{U(RPh_)<%k1<OIw2im>Cz%9yQ#rS&sN2x0`#dRVZ$Zo3 z(YozxD(tDJ*Nd^#9ngM11*`#hZL|qqUX-aA#5S}G^!n=WLLU@GQ4~c{6dSK|xP5Tx z!-H@vnhtn%y49-Lc3NyR!WG{&^FjpmIbAy+o5nPrx)V}}E%fz`bB+BtcI@^)8^rTf zBx((Ky3EXU1aLM2IGxVm^KA+58-UdY;QHA(FXNaPN!aD?zV8}<6&DioA6qwm%&S`B zG(?rf)v;@BC^IYu=$f%ZGhhqXw5SF!qXsa;V!%*uXSl{qZh&O*G5ePMUQntINQ83i z$upoRb}H)fv5TKDu*ZP$-hvmY3!Atq6ENBh(WYFFM67|7l05p#?E1nmayZKasmvEs z4%uF#@2=U$hCc&#<3^>qaoRUjD5t(Q@!@5>eLn%YPa&y@Wk6F&Jf;Amr=S&p`TF~H zKQmyzZBbK@-3j_NfaCqFrZteLVgLD`ViBgsl+FQ!832*%0DhkaTq4i015y-4Q4~c{ f6h%=KHvsSpwHV1KmpgiI00000NkvXXu0mjf++aJ5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_broken.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5d774588ae44eab5608571cb6aafad7375e158 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?$P6U!|9apHq}T#{LR^9L|NqA3+=6aE7Gp_} zUoeBivm0qZPQ0g!V~B+0+k=LDO%4JK2X3C7n6o0|55NE8mw8XPoOIr7DLA&?`@Kq0 z`sGua{4Cd+i#BF3Cvx%VMD6rkvY&scrjImRmb>DFD66%%n7hj|c25u0=Hbzuz>&Md dbBcZ?)Aw7<0^jOhxdW|Y@O1TaS?83{1ORW&Jrn={ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_damaged.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_damaged.png new file mode 100644 index 0000000000000000000000000000000000000000..f16a028dee5bbe41a7f4e35f686043e8a112ce4e GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(YymzYu0Z<#e`9lQK{p_au_VYZ zn8D%MjWi%9!PCVtL_+fI!HvAl4m=D8Hh=XH6ZQR;XyVo{y01gP^_0k+pXD$8l*-N4 z&iUk!V5<=?maE{?*yyS)-udN6;H*Pi5*L(-Fs)pAdDY$x8SUGCM{GTG-~v<Ug|=>& dN}IerjGt7Q1>7HnEC$-e;OXk;vd$@?2>`@EK-2&L literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_open.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/sparks_open.png new file mode 100644 index 0000000000000000000000000000000000000000..630eabb976ecf11fa59ba29f03502b02bde399aa GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^2|(<?$P6U!|9apHq}T#{LR^9L|NqA3+=6aE7Gp_} zUoeBivm0qZPPnIwV~EE2<OGQ)2N;)UFbHTH9N?I7iA}-JL5QW9)gYDEU?STJh8Q=7 zyA|whfeu+RnhNat9OVk_TbVcAV%|^@$-rI1mok%0h3ER30}V2*C$^dMOu5duvX^h6 U)9+<QKr0wLUHx3vIVCg!06l3kr2qf` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/welded.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/welded.png new file mode 100644 index 0000000000000000000000000000000000000000..a0040dfdc73fb4142135ca841953b402d57348b9 GIT binary patch literal 296 zcmV+@0oVSCP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80002*Nkl<Zc%0Rj zF%E+;3`KvdZcLaBBo;2f5H@D-+#$DR;Q+9+1SSw$I#fMC^O3Cn{l`y{9sdA?y0VOn z9{`?|yQ<jw96-}FwgB@y+X9FPRF&!jt_J{|=SlgK0aP`L2(Ifw-}m%1BuiDJ_dXfm z#R6>GM)~O;5D{Ad0LZe;7N97KJC6BX-upNVgWUu;=WLfz+qP_d4j_bJ3vh=hfa5r9 z0qVN81qdO4*#ozUc?-;6LK?t17pG~m0|2;<_}}aJ8%Xzkw*de?p>!O_N2;HSWO<%5 ub^zoJEX!gGaL3n-QrC61fn;4*wm#k_G(h}nBOLz#0000<MNUMnLSTZ;qj`4# literal 0 HcmV?d00001 From 006f1aea3b30c7bc7549bd4fb189dff45c9a4584 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 12:04:52 +0000 Subject: [PATCH 445/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1c9ec3e29b..a2c47d4997 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,20 +1,4 @@ Entries: -- author: themias - changes: - - message: Forensics are now applied to bullets when loading using an ammo box. - type: Fix - id: 7780 - time: '2025-01-04T13:41:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32280 -- author: deltanedas - changes: - - message: Fixed wielding use delay not working properly. - type: Fix - - message: Fixed bow sprite not updating when wielded. - type: Fix - id: 7781 - time: '2025-01-05T19:06:10.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32188 - author: Errant changes: - message: Lobby chat width is no longer dependent on the server's name. @@ -3909,3 +3893,17 @@ id: 8280 time: '2025-04-20T12:01:08.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34441 +- author: Pgriha + changes: + - message: Heterochromia for Moth. + type: Add + id: 8281 + time: '2025-04-20T12:03:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36061 +- author: BackeTako + changes: + - message: New Salvage doors + type: Add + id: 8282 + time: '2025-04-20T12:03:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36375 From 09f3d7f5eb70ba72ae2dbd30bbd10468aa0260aa Mon Sep 17 00:00:00 2001 From: Hyper B <137433177+HyperB1@users.noreply.github.com> Date: Sun, 20 Apr 2025 17:19:11 +0500 Subject: [PATCH 446/622] =?UTF-8?q?=20Departmental=20shelves=20whitelist?= =?UTF-8?q?=20expansion=20(Attempt=20=E2=84=963)=20(#34292)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Expand-Shelves-Whitelist Made departmental shelves hold a wider variety of items. * Accidentally included "Packet" twice --- .../Entities/Structures/Wallmounts/shelfs.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml index e9c1672c1c..b83622eafa 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/shelfs.yml @@ -329,6 +329,9 @@ - DrinkBottle - DrinkCan - Beer + - Wine + components: + - ReactionMixer - type: Construction graph: Shelf node: ShelfBar @@ -395,6 +398,15 @@ - Ingredient - Trash - Plastic + - SaltShaker + - PepperShaker + - Ketchup + - Hotsauce + - Coldsauce + - BBQsauce + components: + - Utensil + - Bin - type: Construction graph: Shelf node: ShelfKitchen @@ -454,6 +466,11 @@ - ChemDispensable - GlassBeaker - Bottle + - Medkit + - CentrifugeCompatible + - PillCanister + - Syringe + - Spray - type: Construction graph: Shelf node: ShelfChemistry From d35c9ac17cd235b824405844ced3c74f4b36876f Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 12:20:18 +0000 Subject: [PATCH 447/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a2c47d4997..2b28033fe0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: Errant - changes: - - message: Lobby chat width is no longer dependent on the server's name. - type: Tweak - - message: Lobby title of a server can now be different from the Hub listing's name. - type: Tweak - id: 7782 - time: '2025-01-05T20:56:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33783 - author: SpaceRox1244 changes: - message: Station lights can now be destroyed by bullets. @@ -3907,3 +3898,10 @@ id: 8282 time: '2025-04-20T12:03:46.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36375 +- author: HyperB1 + changes: + - message: Departmental shelves can now contain a wider variety of items. + type: Tweak + id: 8283 + time: '2025-04-20T12:19:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34292 From f77f000b936732b5b5e76c6728d9168dc0362ad0 Mon Sep 17 00:00:00 2001 From: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> Date: Sun, 20 Apr 2025 08:57:53 -0400 Subject: [PATCH 448/622] Replace GetEntitiesInTile with EntityLookupSystem equivalent (#36756) * commit GET!! * minor cleanup --- .../Construction/Conditions/EmptyOrWindowValidInTile.cs | 6 +++++- Content.Shared/Construction/Conditions/NoWindowsInTile.cs | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs b/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs index c6c7c47c70..5a70e145f6 100644 --- a/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs +++ b/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs @@ -13,9 +13,13 @@ namespace Content.Shared.Construction.Conditions public bool Condition(EntityUid user, EntityCoordinates location, Direction direction) { + var entManager = IoCManager.Resolve<IEntityManager>(); + var lookupSys = entManager.System<EntityLookupSystem>(); + var result = false; - foreach (var entity in location.GetEntitiesInTile(LookupFlags.Approximate | LookupFlags.Static)) + + foreach (var entity in lookupSys.GetEntitiesIntersecting(location, LookupFlags.Approximate | LookupFlags.Static)) { if (IoCManager.Resolve<IEntityManager>().HasComponent<SharedCanBuildWindowOnTopComponent>(entity)) result = true; diff --git a/Content.Shared/Construction/Conditions/NoWindowsInTile.cs b/Content.Shared/Construction/Conditions/NoWindowsInTile.cs index 2d37ecebe6..e241a1eea6 100644 --- a/Content.Shared/Construction/Conditions/NoWindowsInTile.cs +++ b/Content.Shared/Construction/Conditions/NoWindowsInTile.cs @@ -17,8 +17,9 @@ namespace Content.Shared.Construction.Conditions var entManager = IoCManager.Resolve<IEntityManager>(); var sysMan = entManager.EntitySysManager; var tagSystem = sysMan.GetEntitySystem<TagSystem>(); + var lookupSys = sysMan.GetEntitySystem<EntityLookupSystem>(); - foreach (var entity in location.GetEntitiesInTile(LookupFlags.Static)) + foreach (var entity in lookupSys.GetEntitiesIntersecting(location, LookupFlags.Static)) { if (tagSystem.HasTag(entity, WindowTag)) return false; From 2d940459958058b22780c4662ce1ca5dfdadf1db Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sun, 20 Apr 2025 15:55:23 +0200 Subject: [PATCH 449/622] Decrease amount of mail, increase profits (#36767) init --- Content.Server/Delivery/CargoDeliveryDataComponent.cs | 2 +- .../Prototypes/Entities/Objects/Deliveries/deliveries.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Server/Delivery/CargoDeliveryDataComponent.cs b/Content.Server/Delivery/CargoDeliveryDataComponent.cs index 3bee0413fc..3e741e3a22 100644 --- a/Content.Server/Delivery/CargoDeliveryDataComponent.cs +++ b/Content.Server/Delivery/CargoDeliveryDataComponent.cs @@ -32,7 +32,7 @@ public sealed partial class CargoDeliveryDataComponent : Component /// 1 delivery per X players. /// </summary> [DataField] - public float PlayerToDeliveryRatio = 7f; + public float PlayerToDeliveryRatio = 8f; /// <summary> /// The minimum amount of deliveries that will spawn. diff --git a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml index ff9ba7e68f..2706cf380c 100644 --- a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml +++ b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml @@ -74,7 +74,7 @@ - type: Item size: Huge - type: Delivery - spesoReward: 800 + spesoReward: 1000 - type: EntityTableContainerFill containers: delivery: !type:NestedSelector @@ -111,7 +111,7 @@ - type: Item storedRotation: 90 - type: Delivery - spesoReward: 400 + spesoReward: 500 - type: EntityTableContainerFill containers: delivery: !type:NestedSelector From 0d0ac82484bbdcdd39fcfb11cc3d0503d2501c25 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 13:56:30 +0000 Subject: [PATCH 450/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2b28033fe0..58bfbb31bb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: SpaceRox1244 - changes: - - message: Station lights can now be destroyed by bullets. - type: Add - id: 7783 - time: '2025-01-05T22:11:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34070 - author: ArtisticRoomba changes: - message: You can no longer get stuck when trying to walk between a station anchor @@ -3905,3 +3898,11 @@ id: 8283 time: '2025-04-20T12:19:11.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34292 +- author: ScarKy0 + changes: + - message: Cargo will receive slightly less mail, but will earn more spesos from + it. Overall earnings are still on average the same. + type: Tweak + id: 8284 + time: '2025-04-20T13:55:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36767 From a711912cba92dd6d8ef86ae38d48a50c37f7cdb1 Mon Sep 17 00:00:00 2001 From: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> Date: Sun, 20 Apr 2025 09:56:39 -0400 Subject: [PATCH 451/622] Unused dependency cleanup. (#36760) * take 2! fight!!! * final touches * reeeeeee --- Content.Server/Administration/Systems/AdminVerbSystem.cs | 6 ++---- .../CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs | 3 --- Content.Server/Explosion/EntitySystems/ExplosionSystem.cs | 2 -- Content.Server/GameTicking/GameTicker.GamePreset.cs | 3 --- Content.Server/Mapping/MappingCommand.cs | 1 - Content.Server/Maps/MapMigrationSystem.cs | 1 - .../Players/PlayTimeTracking/PlayTimeTrackingSystem.cs | 2 -- Content.Server/Roles/Jobs/JobSystem.cs | 2 -- Content.Server/Stunnable/Systems/StunbatonSystem.cs | 2 -- Content.Server/Zombies/ZombieSystem.Transform.cs | 2 -- 10 files changed, 2 insertions(+), 22 deletions(-) diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index d94a277173..b445b499f9 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -3,7 +3,6 @@ using Content.Server.Administration.Managers; using Content.Server.Administration.UI; using Content.Server.Disposal.Tube; using Content.Server.EUI; -using Content.Server.GameTicking; using Content.Server.Ghost.Roles; using Content.Server.Mind; using Content.Server.Mind.Commands; @@ -54,7 +53,6 @@ namespace Content.Server.Administration.Systems [Dependency] private readonly AdminSystem _adminSystem = default!; [Dependency] private readonly DisposalTubeSystem _disposalTubes = default!; [Dependency] private readonly EuiManager _euiManager = default!; - [Dependency] private readonly GameTicker _ticker = default!; [Dependency] private readonly GhostRoleSystem _ghostRoleSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; [Dependency] private readonly PrayerSystem _prayerSystem = default!; @@ -146,7 +144,7 @@ namespace Content.Server.Administration.Systems var stationUid = _stations.GetOwningStation(args.Target); - var profile = _ticker.GetPlayerProfile(targetActor.PlayerSession); + var profile = _gameTicker.GetPlayerProfile(targetActor.PlayerSession); var mobUid = _spawning.SpawnPlayerMob(coords.Value, null, profile, stationUid); if (_mindSystem.TryGetMind(args.Target, out var mindId, out var mindComp)) @@ -172,7 +170,7 @@ namespace Content.Server.Administration.Systems var stationUid = _stations.GetOwningStation(args.Target); - var profile = _ticker.GetPlayerProfile(targetActor.PlayerSession); + var profile = _gameTicker.GetPlayerProfile(targetActor.PlayerSession); _spawning.SpawnPlayerMob(coords.Value, null, profile, stationUid); }, ConfirmationPopup = true, diff --git a/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs b/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs index 025bb87e17..6391dd533b 100644 --- a/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs +++ b/Content.Server/CartridgeLoader/Cartridges/LogProbeCartridgeSystem.cs @@ -7,9 +7,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.Labels.EntitySystems; using Content.Shared.Paper; using Content.Shared.Popups; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Random; using Robust.Shared.Timing; using System.Text; @@ -19,7 +17,6 @@ public sealed class LogProbeCartridgeSystem : EntitySystem { [Dependency] private readonly CartridgeLoaderSystem _cartridge = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 2aeefeb46c..8f25b43747 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Numerics; using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; -using Content.Server.Chat.Managers; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NPC.Pathfinding; using Content.Shared.Camera; @@ -46,7 +45,6 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem [Dependency] private readonly PathfindingSystem _pathfindingSystem = default!; [Dependency] private readonly SharedCameraRecoilSystem _recoilSystem = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly ThrowingSystem _throwingSystem = default!; [Dependency] private readonly PvsOverrideSystem _pvsSys = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index c062b95361..84a93da955 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using Content.Server.GameTicking.Presets; using Content.Server.Maps; using Content.Shared.CCVar; -using Content.Shared.Mobs.Systems; using JetBrains.Annotations; using Robust.Shared.Player; @@ -12,8 +11,6 @@ namespace Content.Server.GameTicking; public sealed partial class GameTicker { - [Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!; - public const float PresetFailedCooldownIncrease = 30f; /// <summary> diff --git a/Content.Server/Mapping/MappingCommand.cs b/Content.Server/Mapping/MappingCommand.cs index b44a09869e..7482ef811f 100644 --- a/Content.Server/Mapping/MappingCommand.cs +++ b/Content.Server/Mapping/MappingCommand.cs @@ -16,7 +16,6 @@ namespace Content.Server.Mapping sealed class MappingCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entities = default!; - [Dependency] private readonly IMapManager _map = default!; public string Command => "mapping"; public string Description => Loc.GetString("cmd-mapping-desc"); diff --git a/Content.Server/Maps/MapMigrationSystem.cs b/Content.Server/Maps/MapMigrationSystem.cs index e04cfa1793..28b10e3c58 100644 --- a/Content.Server/Maps/MapMigrationSystem.cs +++ b/Content.Server/Maps/MapMigrationSystem.cs @@ -1,7 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; -using Robust.Server.GameObjects; using Robust.Shared.ContentPack; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.Map.Events; diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index 9f4b6599b8..e75801d6de 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Afk; using Content.Server.Afk.Events; using Content.Server.GameTicking; using Content.Server.GameTicking.Events; -using Content.Server.Mind; using Content.Server.Preferences.Managers; using Content.Server.Station.Events; using Content.Shared.CCVar; @@ -33,7 +32,6 @@ public sealed class PlayTimeTrackingSystem : EntitySystem [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly IAfkManager _afk = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; - [Dependency] private readonly MindSystem _minds = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IServerPreferencesManager _preferencesManager = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; diff --git a/Content.Server/Roles/Jobs/JobSystem.cs b/Content.Server/Roles/Jobs/JobSystem.cs index 3603225dfb..2ef66617ac 100644 --- a/Content.Server/Roles/Jobs/JobSystem.cs +++ b/Content.Server/Roles/Jobs/JobSystem.cs @@ -1,6 +1,5 @@ using System.Globalization; using Content.Server.Chat.Managers; -using Content.Server.Mind; using Content.Shared.Mind; using Content.Shared.Roles; using Content.Shared.Roles.Jobs; @@ -14,7 +13,6 @@ namespace Content.Server.Roles.Jobs; public sealed class JobSystem : SharedJobSystem { [Dependency] private readonly IChatManager _chat = default!; - [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly ISharedPlayerManager _player = default!; [Dependency] private readonly RoleSystem _roles = default!; diff --git a/Content.Server/Stunnable/Systems/StunbatonSystem.cs b/Content.Server/Stunnable/Systems/StunbatonSystem.cs index 02d2382f5d..efe8cc442e 100644 --- a/Content.Server/Stunnable/Systems/StunbatonSystem.cs +++ b/Content.Server/Stunnable/Systems/StunbatonSystem.cs @@ -4,7 +4,6 @@ using Content.Server.Power.Events; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Damage.Events; using Content.Shared.Examine; -using Content.Shared.Item; using Content.Shared.Item.ItemToggle; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Popups; @@ -14,7 +13,6 @@ namespace Content.Server.Stunnable.Systems { public sealed class StunbatonSystem : SharedStunbatonSystem { - [Dependency] private readonly SharedItemSystem _item = default!; [Dependency] private readonly RiggableSystem _riggableSystem = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly BatterySystem _battery = default!; diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 7be4570160..479c56cd5e 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -35,7 +35,6 @@ using Content.Shared.Prying.Components; using Content.Shared.Traits.Assorted; using Robust.Shared.Audio.Systems; using Content.Shared.Ghost.Roles.Components; -using Content.Shared.Roles; using Content.Shared.Tag; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -63,7 +62,6 @@ public sealed partial class ZombieSystem [Dependency] private readonly NPCSystem _npc = default!; [Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly NameModifierSystem _nameMod = default!; - [Dependency] private readonly SharedRoleSystem _roles = default!; [Dependency] private readonly ISharedPlayerManager _player = default!; private static readonly ProtoId<TagPrototype> InvalidForGlobalSpawnSpellTag = "InvalidForGlobalSpawnSpell"; From cd6130ce2246cb46bb298e984e307472826aa017 Mon Sep 17 00:00:00 2001 From: Hyper B <137433177+HyperB1@users.noreply.github.com> Date: Sun, 20 Apr 2025 19:06:14 +0500 Subject: [PATCH 452/622] Fire protection for ERT engineering hardsuit (#34949) --- .../Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml | 2 ++ .../Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml index eafd384864..acb1db120d 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml @@ -643,6 +643,8 @@ sprite: Clothing/Head/Hardsuits/ERThelmets/ertengineer.rsi - type: PointLight color: "#f4ffad" + - type: FireProtection + reduction: 0.2 - type: Armor modifiers: coefficients: diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index 2c453ad16c..f3edb201e4 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -855,6 +855,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer + - type: FireProtection + reduction: 0.8 #ERT Medic Hardsuit - type: entity From 17cdb4393f9b6628eeda99af59b6c0f29d8e63fb Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 14:07:21 +0000 Subject: [PATCH 453/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 58bfbb31bb..d9220fdc65 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: You can no longer get stuck when trying to walk between a station anchor - and a wall. - type: Fix - id: 7784 - time: '2025-01-06T12:32:42.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34217 - author: ArtisticRoomba changes: - message: Kessler Syndrome and Zombeteors are removed from the possible gamemodes @@ -3906,3 +3898,10 @@ id: 8284 time: '2025-04-20T13:55:23.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36767 +- author: HyperB1 + changes: + - message: ERT engineering hardsuit now features proper fire protection. + type: Fix + id: 8285 + time: '2025-04-20T14:06:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34949 From d11a10d5ea7f34060aaf50f737cce31fa5e58006 Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Mon, 21 Apr 2025 02:08:02 +1200 Subject: [PATCH 454/622] Nonlethal throwables crate (#35808) --- .../Prototypes/Catalog/Cargo/cargo_security.yml | 10 ++++++++++ .../Catalog/Fills/Crates/security.yml | 17 ++++++++++++++++- Resources/Prototypes/GameRules/cargo_gifts.yml | 3 ++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml index 93b55fbb24..36f4b472ba 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml @@ -67,3 +67,13 @@ cost: 1000 category: cargoproduct-category-name-security group: market + +- type: cargoProduct + id: SecurityNonlethalThrowables + icon: + sprite: Objects/Weapons/Grenades/stingergrenade.rsi + state: icon + product: CrateSecNonlethalThrowables + cost: 2500 + category: cargoproduct-category-name-security + group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/security.yml b/Resources/Prototypes/Catalog/Fills/Crates/security.yml index 4726df16cf..0af4fe338f 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/security.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/security.yml @@ -93,4 +93,19 @@ - id: TrackingImplanter amount: 4 -# Cosmetic Crates +- type: entity + parent: CrateSecgear + id: CrateSecNonlethalThrowables + name: nonlethal throwables crate + description: Contains one box each of flashbangs, stingers, tear gas grenades, and four bolas. Requires Security access to open. + components: + - type: StorageFill + contents: + - id: BoxFlashbang + amount: 1 + - id: BoxStinger + amount: 1 + - id: BoxTearGas + amount: 1 + - id: Bola # replace with 4 e-bolas when added + amount: 4 diff --git a/Resources/Prototypes/GameRules/cargo_gifts.yml b/Resources/Prototypes/GameRules/cargo_gifts.yml index f4e4a5bf8f..8b687dd88c 100644 --- a/Resources/Prototypes/GameRules/cargo_gifts.yml +++ b/Resources/Prototypes/GameRules/cargo_gifts.yml @@ -16,7 +16,7 @@ - id: GiftsVendingRestock # Game Rules - + - type: entity id: CargoGiftsBase parent: BaseGameRule @@ -213,3 +213,4 @@ SecurityRiot: 2 SecurityRestraints: 2 SecurityNonLethal: 2 + SecurityNonlethalThrowables: 1 From ae41b6547ef787a80abe011c9c3c222541af52aa Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 14:09:09 +0000 Subject: [PATCH 455/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d9220fdc65..e80b879dc7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: Kessler Syndrome and Zombeteors are removed from the possible gamemodes - in the Secret pool. - type: Remove - id: 7785 - time: '2025-01-07T00:18:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34051 - author: Alpaccalypse changes: - message: Special reagents are now listed in the relevant section of the guidebook. @@ -3905,3 +3897,11 @@ id: 8285 time: '2025-04-20T14:06:14.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34949 +- author: K-Dynamic + changes: + - message: Nonlethal throwables crate can be ordered from cargo (2500 spesos) and + contains 4x bolas, 4x flashbang grenades, 4x tear gas grenades, 4x stinger grenades. + type: Add + id: 8286 + time: '2025-04-20T14:08:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35808 From 1bad0980eefbd633ff64babb88539dbfb3ff04b0 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Sun, 20 Apr 2025 11:00:33 -0400 Subject: [PATCH 456/622] Use non-generic TryComp in `StationSpawningSystem` (#36769) Use non-generic TryComp in StationSpawningSystem --- Content.Server/Station/Systems/StationSpawningSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Station/Systems/StationSpawningSystem.cs b/Content.Server/Station/Systems/StationSpawningSystem.cs index d9c80c19dd..70176ea071 100644 --- a/Content.Server/Station/Systems/StationSpawningSystem.cs +++ b/Content.Server/Station/Systems/StationSpawningSystem.cs @@ -187,7 +187,7 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem var gearEquippedEv = new StartingGearEquippedEvent(entity.Value); RaiseLocalEvent(entity.Value, ref gearEquippedEv); - if (prototype != null && TryComp<MetaDataComponent>(entity.Value, out var metaData)) + if (prototype != null && TryComp(entity.Value, out MetaDataComponent? metaData)) { SetPdaAndIdCardData(entity.Value, metaData.EntityName, prototype, station); } From ca33d6bb7019bc839668e0e1e49c4c8b98fa1da9 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Sun, 20 Apr 2025 15:08:41 -0400 Subject: [PATCH 457/622] Add marker components for admin shenanigans (#36776) --- .../Components/MarkerComponent.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Content.Shared/Administration/Components/MarkerComponent.cs diff --git a/Content.Shared/Administration/Components/MarkerComponent.cs b/Content.Shared/Administration/Components/MarkerComponent.cs new file mode 100644 index 0000000000..b879595619 --- /dev/null +++ b/Content.Shared/Administration/Components/MarkerComponent.cs @@ -0,0 +1,19 @@ +namespace Content.Shared.Administration.Components; + +/// <summary> +/// This component does nothing. It exists for admin and testing purposes. +/// </summary> +/// <remarks> +/// As an example, this component can be added to an entity and then used as +/// the target component for a pinpointer. +/// </remarks> +[RegisterComponent] +public sealed partial class MarkerOneComponent : Component; + +/// <inheritdoc cref="MarkerOneComponent"/> +[RegisterComponent] +public sealed partial class MarkerTwoComponent : Component; + +/// <inheritdoc cref="MarkerOneComponent"/> +[RegisterComponent] +public sealed partial class MarkerThreeComponent : Component; From 314ced1bf9eef1eddf12c045998e3431fa4e31c3 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 19:09:47 +0000 Subject: [PATCH 458/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 473531c58f..c0e4a5c5d6 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1085,5 +1085,13 @@ Entries: id: 131 time: '2025-04-18T12:24:39.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30812 +- author: Tayrtahn + changes: + - message: Added MarkerOne, MarkerTwo, and MarkerThree components for testing and + tracking purposes. + type: Add + id: 132 + time: '2025-04-20T19:08:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36776 Name: Admin Order: 1 From bd40cb9fa51f93fcbad20c391e34ef3bff6ebb9e Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Sun, 20 Apr 2025 15:20:57 -0400 Subject: [PATCH 459/622] Restore `LimitedChargesComponent.MaxCharges` default value to 3 (#36778) --- Content.Shared/Charges/Components/LimitedChargesComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Charges/Components/LimitedChargesComponent.cs b/Content.Shared/Charges/Components/LimitedChargesComponent.cs index ff926fc158..e879e0f1df 100644 --- a/Content.Shared/Charges/Components/LimitedChargesComponent.cs +++ b/Content.Shared/Charges/Components/LimitedChargesComponent.cs @@ -17,7 +17,7 @@ public sealed partial class LimitedChargesComponent : Component /// The max charges this action has. /// </summary> [DataField, AutoNetworkedField, Access(Other = AccessPermissions.Read)] - public int MaxCharges = 1; + public int MaxCharges = 3; /// <summary> /// Last time charges was changed. Used to derive current charges. From d8ea0a39fef5712fe772729c644242a14cf762ce Mon Sep 17 00:00:00 2001 From: YoungThug <ramialanbagy@gmail.com> Date: Sun, 20 Apr 2025 13:30:04 -0700 Subject: [PATCH 460/622] Wizard Figure Voiceline Fix #36771 (#36779) DA WIZARDgit add -A --- Resources/Locale/en-US/datasets/figurines.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/datasets/figurines.ftl b/Resources/Locale/en-US/datasets/figurines.ftl index a33c230165..6d66566c20 100644 --- a/Resources/Locale/en-US/datasets/figurines.ftl +++ b/Resources/Locale/en-US/datasets/figurines.ftl @@ -265,7 +265,7 @@ figurines-footsoldier-4 = Down with Nanotrasen! figurines-footsoldier-5 = I'd rather die than join Nanotrasen. figurines-wizard-1 = Ei Nath!! -figurines-wizard-2 = Wehgardium Leviosa! +figurines-wizard-2 = Real wizards support trans rights. figurines-wizard-3 = Skidaddle skadoodle! figurines-wizard-4 = FIREBALL! From 63350853f06076651a4504ea5362879c0da19ebd Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sun, 20 Apr 2025 22:30:37 +0200 Subject: [PATCH 461/622] change MV cable outline (#36751) * change MV cable outline * zamn --- .../Objects/Tools/cable-coils.rsi/coilmv-10.png | Bin 273 -> 291 bytes .../Objects/Tools/cable-coils.rsi/coilmv-20.png | Bin 364 -> 439 bytes .../Objects/Tools/cable-coils.rsi/coilmv-30.png | Bin 524 -> 674 bytes .../Power/Cables/mv_cable.rsi/mvstripes_1.png | Bin 137 -> 208 bytes .../Power/Cables/mv_cable.rsi/mvstripes_10.png | Bin 180 -> 268 bytes .../Power/Cables/mv_cable.rsi/mvstripes_11.png | Bin 205 -> 319 bytes .../Power/Cables/mv_cable.rsi/mvstripes_12.png | Bin 125 -> 169 bytes .../Power/Cables/mv_cable.rsi/mvstripes_13.png | Bin 192 -> 277 bytes .../Power/Cables/mv_cable.rsi/mvstripes_14.png | Bin 207 -> 335 bytes .../Power/Cables/mv_cable.rsi/mvstripes_15.png | Bin 246 -> 403 bytes .../Power/Cables/mv_cable.rsi/mvstripes_2.png | Bin 136 -> 202 bytes .../Power/Cables/mv_cable.rsi/mvstripes_3.png | Bin 154 -> 251 bytes .../Power/Cables/mv_cable.rsi/mvstripes_4.png | Bin 129 -> 169 bytes .../Power/Cables/mv_cable.rsi/mvstripes_5.png | Bin 171 -> 239 bytes .../Power/Cables/mv_cable.rsi/mvstripes_6.png | Bin 182 -> 297 bytes .../Power/Cables/mv_cable.rsi/mvstripes_7.png | Bin 208 -> 353 bytes .../Power/Cables/mv_cable.rsi/mvstripes_8.png | Bin 130 -> 174 bytes .../Power/Cables/mv_cable.rsi/mvstripes_9.png | Bin 160 -> 234 bytes 18 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-10.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-10.png index c7c122a0eb74e70a1181e50b9e14e656b5712189..722ec7b986f2bf7361391691f3fc06f36f86fb22 100644 GIT binary patch delta 264 zcmbQpw3umvN<C+RM`SSr1Gf+eGhVt|_lJRj;i{*LV@QO1a)JcwVnqWfCLnRixnbfQ zhKPMJBJ19M-Fy9i;+#EMY@5y~ALmW5oxO?ofBpPt|Nj5izV?4=B~L;7gd~NVdTf#J zR_U^B%f9(?I?u_^`V&&cgf-W>hE>n`X~XP(!mem*@Us4TDM$Wd#z@5vzob=m)vqZ` z3iz4hFf;$eRbH=>1xMJuS{4W>UYFVA#E>F+=J|pW1~2|6Oq+uAwiYp*xTw;8U`bfp z|2uvH^1+k-CMddvaU9^1we=1Z`8#pq`jfq#fweH#OEEEvGchc)@%$gKXXZMf4;egN M{an^LB``Jt0GoDfJ^%m! delta 245 zcmV<R01E%30+9lcB!2;OQb$4nuFf3k0002XNkl<ZScUDBJqm+B5Jo>k0=6mk4hsQ$ z+caLl#sgT!J_%Sz?y`*+u<;yLwjy%@!D3U0Vo2pI#3J*mX=c8+zknbJ!oTBjnv79P zO)c5E&Ys)n9XJB(@bnzvmY&e{ycukPIUE2UuMt70Si8v<=x%zzk85tbn*g<Bb3LuT zXe##V*#h%<59O7c>n0F{$}5@*eq1Bh(Z@^piNG2^uGudD0FGN5j8V%S7|I>)0JUT< vda7N+0p?G5&tL(3g(nHQxCnwE2>b8`Gq6GB9KuU?00000NkvXXu0mjfQHyK4 diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-20.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-20.png index 1499d89d3188bb214d0cfe33eceb72d2f17cc0ed..ab0af61b3a62ea3f633ebc24ec49c36ec0295c69 100644 GIT binary patch delta 413 zcmV;O0b>5_0=EN@B!3BTNLh0L01FZT01FZU(%pXi0004LNkl<ZSVv=E7zLvtFd71* zAut*OBRvEdsTBZo6Ak{0axpR-XFku+K8b;7b6K!CVEJ-UhD*m^|JSn=C1?;xouoJe zLzEzp00Q3-RtC$zI{#mP`_GU({{lh%SRDW|w5^7fVRNI*e}BKJ=W!acDckUWTm1*H z#Xr_CFmQzI1G8PV#lZAe6^8$!N(fIxM!v@IFIERY40Hk-#J~Wu1U*<Q^BDeH{xyVK z1X8=~^h<_2H-0myd^TW+GKDxMmw~V+usQ$~hboCL|3{gMgDn9CtEBkv{|e6xA;Da8 z1?WJCFRNNWmVdrP3hoO)QG@>=$ACf+q#xu7d?AT59fA_p|5vPV{C%4He-H+VfoPCC zzC;X?hv@-@8aA~!6Cp(LQ%0Z<!5Zr{+`%HCpvCkxc4t5mp}~IzA7H55z^;a1Duro- z`SuR)1qNbr2eNgr9EB|r;tRo1xzP|94S~@R7!84u5f%af%7dPJ=RYlc00000NkvXX Hu0mjf8!W0S delta 337 zcmV-X0j~bH1MC8jB!2;OQb$4nuFf3k0003dNkl<ZScUDAt!l(T6ot>025MJ?5L>ls z{i;GJ<OOQ>0Y;|2OIQ(>)NkcJz?!^3pe$6yM@7Xh%N4bOh^ZJRB<bWw)b)OHX70J? z{tUn{48#0)7Jnu5_6q4b!1V^aALr}dn-0%s8+k@@y|E{S@_&q^>i}Zu0{|Yx1+G)e z>ka6~Z@2U-{%%M#4lPhgax6KO>Rli#mHg!bK$+RE{K@!10{~DZ9>h|K<XKlJ&qz{9 zQdeCi9-<<}?oeZQs2ekZm@dNDVm*TW%5TIzPIYr12n$u>0RW;R1<-A`HXMiQ-RV1p z{b(;tBN#NGg-YVk>U2dL(p8V`NxO)sNR7)mYM@<ByBoUAbC>k_3Hban|BgumeIs)d j_hZ)^^9UG*VHoBIVI7jdpG=L!00000NkvXXu0mjf{<E8W diff --git a/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-30.png b/Resources/Textures/Objects/Tools/cable-coils.rsi/coilmv-30.png index b4905627b0d46d590138ffd4b24849b2f3cf413c..74f2b96d2ab057d02a7bd5826d80a526a6791250 100644 GIT binary patch delta 650 zcmV;50(Je21fm6yB!3BTNLh0L01FZT01FZU(%pXi00071Nkl<ZSV!$uKS&!<9R98~ zAe9adXRve#lA$0-GIU6xOF%p6ltJCJ+$43C{((Yi>u%{JHe0heb(5BWC`jp$P<oId zE$vXnyTO9B2#37h_s$nza=CC3N|*aVxXXLL{C?m2zVG(}B!7`GkT8%i@ShnlF57?Y z1q6Sa+0V-odsk~%T|?jX208&$DrQeiL%TP{_Zu}luu?MbbaO;Lr%Ne}raeJGGp}or zKv;in&TaMR3-P<9yqFvx!C<L+-n=NE>U#jFi1)S=Vni`^aELahVl&`=bH%jvMK<8) zSz`;?W51do&3}f6!dV^!$KX?E#Qh_%XxXUlcpv~hLIAq)|9Q_9qv?yCx1SENTBhFh z*5by35L|CwujA#DKpx7ZBm(TN(uO4H^Z-vz)T-#4m2uoJ*Skvha2XOP^ZB%f@3ka) z^xTv069v=IJrH6*-=yZVPk(_;PdC$2Yo0JFvd1~h-+%J+tSVludmtl9A~hkELJSFL zn4xB_rKx!>I54#@oH_nmtt$pSFSGAprW`#Ds=$@bN^DN;=5Gh0lRD10aykta72J!H z7u$pvW}~K_53GvC5^$1*Sbp4o>8KH<+18J?U{0AvWvcg`LLeaz&_FyjM@%;x*EvST zyD4d|%zu(2so<r=m>dp9P>q^77D-gwMhF018f5%L#|aF(;rdNI++oA>nIH6Tz`!5C zSLZkEqrmC$+5;gE^!lMWW*Q&1A#XZ{egkst<Bt<CCvJ1*^_8p_-dM;9eIzgQN7N6{ kBsXCoVIX1PpE2+kRg>|ez?nIB00000NkvXXt^-0~f-C?sZU6uP delta 498 zcmV<O0S*451&jocB!2;OQb$4nuFf3k0005TNkl<ZScUDCy^7mF6oo&96{uA)2)C|M zxpyFq8@+&=eE^l4KE|XFj?;TfJ-{}8fq`XUSxEZ8f-1E_Op(^0LMdj)`iX3L-DC@W zjTmV(=ghfR8W<TF8TrpR*S@&>PSqUe1^n2(eZ8CRjfV$u_J0MP=?dU3asfE(7XWyX zViJ@UfS8K2Ms9EQX#+#zkssnMRa^XZd>6SK_6w3sR(S!ld2PfR&kLZD{KW=zrYj?0 zgyU2K(mdS2B!I{d0dw^t#eGtXZr3jAxwHn}mcZ{{x|#&_I8J42cXm!(7(?5&DUVGA zA3*i4J!qg?^M5{ZFmYR>t4-NT#9Jy>oANl1UEKp8hQzzgHbmry#{}Y35~q^Yrero3 zPM`7K1azjWynt^XLqK8UKkOGw0(nxrIS=}i>hezlcGpJS#F-a$r+1sE$))qo8faqc zJ(~;XJ}L2*itXAx_C?pYHJ$vqZ1>Ppg1q3hVcLu21#771lEr72$PY;}*)m}p&VFiQ zdWn3Gfm6<BbK$(Cx`L8Vv^yN&u!o<4<Rv}5MjvNO&_zsz^Y~;UZi<7s_xLpY8}4%T oVf6J&`!KrZAQ~AN8F?4{1>Eq^`oGdR_5c6?07*qoM6N<$f{<YG-~a#s diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_1.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_1.png index 50f9570fffbe951325755b599b8c1b4582d6147a..84a086cb304c30b2c1a97725c02980ec06ed3cbf 100644 GIT binary patch delta 180 zcmeBVyudg?rJl3EBeIx*fm;ZK886+f`@_J%(B$dj7!u*0oT9*3GymB?`6V?sUry&a z`B~p!(gM-tL26kNPMwk}mJP<)>Y+8gZxSZSFkJHBb`KD0Qufi;5f8Y0TV*+8mUUAK zdqa)A`9+2pxd7$~PZ_czc#NA>*e@t?PkPdDv8Z8Ip}lU_wG57)wgadHgANNrgsbq( U?5)BUK<6-cy85}Sb4q9e0Ao=<djJ3c delta 108 zcmcb>*vU9SC6%!_$lZxy-8q?;3=9m;o-U3d5v^~pIC3#4aJU4%EV_4L^{y?-M;b(r z)>peux#%<D;nasqudL}gm*!rQ&yat!u-=mO{?QM=7>xb_^)u`<W_<4{@cWeDWqT0U M)78&qol`;+0Dr<P;Q#;t diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_10.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_10.png index 0b7fa5327a7c7663e3b6e18ae93807e9e946a17c..8b08ae14a99a09fdeb56515e53c8334132352213 100644 GIT binary patch delta 240 zcmdnO*uykIrJl3EBeIx*fm;ZK886+f`@_J%u+P)QF(kr0IYEMTv7&(#6PRF@Vd}ZR zeCL1nGUoJaer{E}Ix`h?*>9fR^yZ8A2I)!9;~Rd<ScYWCDn&F`=Pf$;Un971%8Uh5 zoePecpAb|KZ;)})KK*j$HI2>Ow#x(3q*mokiD@{WnGj{!l)>I0!|pA9g@<v{8K%}l z4c1L6;=#d&YcDZ)=CN2d-QrW!6g(8;eYV758nXwN8B>>M5rb}5$|M<vPdvIZj%NjA npQQy_b2l}0KQVF0b!T9xVKsTZHbeFZ&?^j{u6{1-oD!M<FOF9t delta 152 zcmV;J0B8S<0<-~;B!2;OQb$4nuFf3k0001PNkl<ZScPL?7zLwX6pVsVFu;KE`!x6e z$O4>MI~nQe0H%SooPmLX0jq_`p+aj%;WT`pqXwr#Mkb(TC@>LLLR&`=?SMf6Ms|W6 z6u$pH&HX>M9WvmFaKIfvG8hzTVH6A)phf(XoC~P!2moqhDG__W+j6Y{0000<MNUMn GLSTYBkUT{I diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_11.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_11.png index 98413e4239e46b63e937de92aacdf7e2b4cd386a..c349e572afb58068545f669cd17f215b904547b1 100644 GIT binary patch delta 292 zcmV+<0o(q~0lxx}B!3BTNLh0L01FZT01FZU(%pXi0002-Nkl<ZSVv=EAOU=z=Kddq zNzg)2DHA~zSQN}nG@zOzNOAyY)=oxp96UVq&?5dpAwyCWfHY7u{z2vu6{oP2zwGo& zhUEDdh|)uoc&E1S2|AKi@s4aU$!UO~t4UOV(*elwPNJD4DSu}{FIr)R4Jg5Z0Id@p zBeDYqqNHQN=2Ln)3TvJQWw$6(ag?~ERp{U>RA6}?<Pcg}PEu+eP{q`4gpgGb(aI4d zm4tM!3((^o6bb|GhyhECv`Pacd59L(Gf9aM=2~i|1F{@IQm_$FOp*g=Q6!V(0FY;B q;RtGm=rA{n79C{)$!UPvjsO5hv|!6O&Ov<u0000<MNUMnLSTZ0;B>zL delta 177 zcmV;i08anE0?h%CB!2;OQb$4nuFf3k0001oNkl<ZScUDEOAde_3`7Tao{YPAAnxMH zSmG891e^4S`1UZ<PSXHDAg5SziiL7!#Kw7<3fvu-2Z{WFS!O`0djDut?so>Xat}|D z{WycPXw5AGZE*l-3f5hbHr2h{I-0JLHIeMX>qR7G!tW+*u`2dJx~Tq>&vJ7EWL(U` fj~On0M%*SYV~I$T0jx{w00000NkvXXu0mjf1b9x? diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_12.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_12.png index 366ef79e584c4613e33138348e3044c862619d51..d743f4d8018bdb2e01b8efde61a2ebb9f63f5e8d 100644 GIT binary patch delta 140 zcmb<j$v8o!p0mIsvY3H^TL^?1FWs&C!@$50?djqe65*blAi=s=(Ljm`OfbtZ_1s^+ z^S^r;bNV$uw-mdzPiL}SDw^<I;<=hsgR?^AKUR_XhmR!kE!p~qVR=j7Yj@`a6BajQ eg29=AVZjF@quREr1wd;UJYCuRT-G@yGywpyY%dM~ delta 95 zcmV-l0HFV=0ez4pSpjoWM?wIu&K&6g001{hL_t(oh3(C;6#x(v13+{pvx|Z3VlpMI zr}uty*Ci>E5&*&S8g1W2?K9u`_g*5;-yHye5C_4#AOvm2*FXRO002ovPDHLkV1m*S BB`*K~ diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_13.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_13.png index 474c5c59a4a33469a980bd51ac9657b90fb49fe2..91251f5b5d9e53078489620ba5957f6b9db3213c 100644 GIT binary patch delta 249 zcmX@WIF)IFN<C+RM`SSr1Gf+eGhVt|_lJRj;kc)ZV@QO1a)JV5&HQKo<Xb#1I0a}5 zJBmh#obfeTFiY8^h#~!&pIecPjm?(}O8*=cor6RgOn5w$S|WG7`QptMV6`AELqL>C z!F!{sL)J64HJqaJ{a1=|={!jj{377!C%q&kd`@74%=@Ai8P9c36^bJ-1e>1ux`2h9 z>Evg90i7C$ss%3@optp-C(dJ9o*~gbWr4DY){RX%+cKJW&e51Jl&rZ)>PbwK+$59p qj!Ue{LjGoO^t2s7CU_z^7#R3>C%7(bjnfDEiNVv=&t;ucLK6VOyj&ar delta 164 zcmV;V09*f+0>A-~B!2;OQb$4nuFf3k0001bNkl<ZScUDBK@NZ*3<MYA#h39HAH-jL z8Am*s7=qB6VkGWdfi0a900k+AoMOnDGd;Xz*eh5Yn1>Pb2WEK#W%rgg7Rjb{+nq%* zHLXsqEQk!$D6L#CqcL{7@eGuNJuMCZuGDBf?_R!dEsie!-yL6-5JCtc<Wn3JR6`=* SXputz0000<MNUMnLSTY;<Uf%B diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_14.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_14.png index dd7434c43ca048d616e134cb61c38b5e44543b05..c1cb35309137f6820288a6c0b895b05b62934fda 100644 GIT binary patch delta 308 zcmV-40n7f+0nY-EB!3BTNLh0L01FZT01FZU(%pXi00032Nkl<ZSVv=E7zLvtFd71* zAut*O0~`X3->13%M|J~e)=oxhx`~kaOw_g<*+N2=gXCG3oqh>+L-PC!aGxV<BsN6Q zEd!YeGaKD}5Pxo>!GDlE*5C$7MwyDE!~`LSz#IUzlo9A5qJLr%XMBSk0WtyP5MnIH z7Lr7{fLuk$K@M{)xn>d6hb?|VV%Wq98iu9-B^Th+j4gE|Co)nkhN&mo0kD)yu0^=? zu@GY*ED=IN0g^aDzDLfw#F#@>HK2qC#8fpCuVK_mbQHOm7LFh(5yD(g&3sRm11Jhc za?1gbK0-w@IV}z&IRt3o2yz@gLiJFi@<9(elG6aS9RUDpc6NF9Q}EsZ0000<MNUMn GLSTYlYII-# delta 179 zcmV;k08IbS0?z@EB!2;OQb$4nuFf3k0001qNkl<ZScUDAu?@f=3<M2bCS#Wj<Xtiu zC8?0CBnXT?vI}2{9{#O2L_rV)fibCaY4YGWuY@$1y`RzM(r{*8xwKD1d2uz=&K)A6 zp-@{**P|<Z1=-cWL7C>cWNd~Au@vBGhU|MefD8KMCQE0Ii!7-tmxc~vzJ%rh)VSD% hz>GioSN{TZh#Sv^PH*MjRdN6T002ovPDHLkV1h*0PG$fA diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_15.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_15.png index 73e0ed269c0cbe9630c8362066578207304793b9..f46fef6ccbc0f37adc77c9cbdd3da2d17000d468 100644 GIT binary patch delta 376 zcmV-;0f+wf0h0reB!3BTNLh0L01FZT01FZU(%pXi0003+Nkl<ZSV!fTy$!-J5QP(z zh6z}Mh8fs_4$(0X9in3gW}smWCZGhrB!`S~azC6YAX21AzO%o3_k4n?Qarca@{U)L z!iG-Rh)lqKJ$Hjp0Zg~2+5-F=IVJiJWmGLFA*Bd_oPRuDTYm;mHADa~U(SG@w;`+U zSfySnG}gYRio^p-b6p2pkoJ8H)OtAfY|_z6^klfr;ld6d<n(@ciyhjZ3aUS$mj zs{+vTw!|^Hwl%p*El^3NtrE01zEdTk7}m4$VsW*Yy%fk9EAdPn4ix!&u)lQ20U|kE z;~5bd7ZgkWm2rWT0(lK0(I}?*PY{|J!6_*Qz(ysc7L8&uVOM$ga}1`F3@J_l^E%WB zuQ^|x*qctB=bGT<{1{4QLQ3>BqY1!MRuup@k}Y5=031*P!UF!MIo|(_A*0#@-VhJS WTerKZ2z$l=0000<MNUMnLSTX=t)Phj delta 218 zcmV<0044vE1NH%sB!2;OQb$4nuFf3k00026Nkl<ZScUDEOAde_3`7fY<H@*-2jVWC zj3ur}3_)ng@KfJb?6lJ=KqSCf<DE5L@=ghj4Aup-1MASD|3s_IKwLf2jg7NtKTd@Z z6O*eH<pRrr6tOG!WF(F~E(`%V!D_{ch*WGNy5FVvI`^=(xKp#nCk1OPZ8ihkppuyp z!THpNY)~js)?SeN8Ffh@7DM)XjomO1D*xuGXo{*|c`P5EfS4&};b$0A+>FpkT#+Dt Ux-m<)F8}}l07*qoM6N<$g6-~L8vp<R diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_2.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_2.png index 71075948585715937ab12fc7ec63965556dfd59f..047f80df5566030ccf748ffcf85a38c7675c6aa7 100644 GIT binary patch delta 174 zcmeBRJjFOcrJl3EBeIx*fm;ZK886+f`@_J%P~++17!u*0oFKuvSkXX=2|=i|9QdC3 z?!RY%-;^M=MInlsi?%6ylrfypEf(foAtsb!*>EM`@bY;o>;-9WQ<f}ys<7Fkh{1zd zSH>~dpEvpQin**Oy_m0*v7GEI*dnu_Oh{eblFRKhW0pIk=d(a-ZoaM}28O~LQsO7d SzXbpt!r<xZ=d#Wzp$Pzl7&{06 delta 107 zcmV-x0F?jA0f+&RBxC_|Qb$4nuFf3k0000&Nkl<ZScUD>!3h8$3<SYob9R_keQFH{ z35U8<K-fpP2mk;eSUGp~&Ebxa1FG2rWF3Eid$0o?>;W=%;BQavzyYF^7N<F&+C=~W N002ovPDHLkV1g@?C*%MC diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_3.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_3.png index 6d51d19b526eaf418dea02ac0e30eb318a9903fa..8b7b568c50d9f6f0dadb9f9415e8fd62fa95eec3 100644 GIT binary patch delta 223 zcmbQm_?vNpN<C+RM`SSr1Gf+eGhVt|_lJRjVXdc&V@QO1a*6_D&HQKo<d@Xkd^w%x z<Y#?@Nee`m2dQOAICV;@ST-1EtB2O~zDbxQ!*I!i+dV+2N!dqVM?B#2ZI$JWS=LP{ z><u;c<`)@a<N}x{JY~p=;4yAiVZWfnJ?Tlq#iE8;h5ixKBCnilQgELzhi%1Mj!Cix zQG64oR(!}%vgFDLlnA^XeE5b<R{BAp;xz&b%D9v@r7uBre`DDCcz(*~wp2?7hMj+P V*Gqb)6#!k%;OXk;vd$@?2>=PKRgwSz delta 125 zcmey(IE!(DN*QBukh>GZx^prw85kHsJY5_^B3j>GapYo9;BdM4qUhd*)w{MRA8Al~ zxu;gKwO+Sj<&KpWMbFaQ<G#6k;l2=W^iTd?Q(1O|9Yc@oj9%Fj0jP|%sqB1>XVe$Q T&DcF3Xg-6dtDnm{r-UW|)k8Bx diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_4.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_4.png index 7a520185f141b719f86394292794b805045f6076..90cb70bcb37d0662dd740b357805e94627e9ed66 100644 GIT binary patch delta 141 zcmZo<T*){=rJl3EBeIx*fm;ZK886+f`@_J%5bf#W7!u*0oFKuvSkXX=2~04{F!fBi z^}lx3@A?#Di_K+=W_WtcQ(_k|nj=xUN!GypBE!+=CqL^inBlt0W~rg!s(KR^H|GRo eqAibufk7f#mgVfV&_JLy44$rRelF{r5}E*2DlD!5 delta 100 zcmV-q0Gt1*0f7OKBwYb>Qb$4nuFf3k0000xNkl<ZScUD*p$z~a3<N-sOvWw@#4b#R z1WRzF0(0j+pR}J60H5XPf!XUib7>>L^q~RK=XVbPz!w`e(h}D6?vuy>0000<MNUMn GLSTYNhbK<} diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_5.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_5.png index e705474dd3dea556d57a5f00842d79973dfa4d85..61ef5e84a026bb35d70ea6f7ddf103bdc5089b03 100644 GIT binary patch delta 211 zcmZ3@_?~fsN<C+RM`SSr1Gf+eGhVt|_lJRjVWFpsV@QO1a)JV5&HQKo<Xb#1I0a}5 zJBmh#obfeTFiY8^h#~!&pIecP&8qfQiVkmGJf=NfF;m*ZtL4SIrEYl&rx`cg5lGeY z3*%7AUKF*>$xnJoO86>^hM3ciiU*wvC75^_eoD-eGqCY#nU{URxm`=K;k0mz4*SW= zR~S$1RH^*ODzbaU#O4)()r-@5+74uJpb!Vz85lGS4WF9*=<Wr&mci52&t;ucLK6T> CC{bDf delta 143 zcmV;A0C4~B0jmL!B!2;OQb$4nuFf3k0001GNkl<ZScUD=u@QhE429uf=Va{SK<wgV zlu%hnA;x=fc=vxj$-9J@Iph>ePO*62^lZvvQ>Z5Zw<T7fyoUc>!9_KNpa^4j{~P;p xzOE|?@U^)tz>{`OZNQ-cdd-(OX#fBKR55HRbj>5?r2qf`00>D%PDHLkV1gZQKI{Mh diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_6.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_6.png index 965f779f3082f7d282e02a98356c9662b9ec7c7f..a743032867d921d2d15318b4d1adcf72a1c6fdc3 100644 GIT binary patch delta 270 zcmV+p0rCE}0jUCzB!3BTNLh0L01FZT01FZU(%pXi0002nNkl<ZSVv=E7zLvtFd71* zAut*O0~`X3w6_2IH243=c5r6xM6r{J+73XrkdWmdc@}Cp0NpZ>xyw$!gd3kc{{o87 z=O!Bb2gy?{3SbU^TFMBtkSM=V#Q`A8VZKH8DN(K<M-g(6gMWgP95X1=19AYicqi3R zvT^}he3NP?ih8mfK#`4Tn#pzmDA7?P!I9+vSZM}KeAEmK!e&t;(V^QyatKh{5hObR z<O6Evd$JrrII@UWL6QT|t5V{v!L5=c2Y`&Bg(Ilpkr84BwX+~7*ho$T)OG{_{rXLL UVFq$<00000Ne4wvM6N<$g8a5?;{X5v delta 154 zcmV;L0A>HF0=5B=B!2;OQb$4nuFf3k0001RNkl<ZScPL?7zLwX6pVsVFu;J3))su9 z=Kdd<&zZFo#ZD$#T1d$9@6+7>Q!NCLEkm~mAE0^&kYYL20D4dlDN8Aef&uY4%;G^2 z0s{sHEa(Ru(8A{=rvYj^V!#vOfIEO>FmiLiC}3b1rsV(tcoT>*_pZs<*8l(j07*qo IM6N<$f{)idRsaA1 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_7.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_7.png index 79094d10593eb00f554fe6d40ad35fd17589cca9..af380fe8dee12a9fda87c347b43b3da6ea7ff2e8 100644 GIT binary patch delta 326 zcmV-M0lEIr0pS9WB!3BTNLh0L01FZT01FZU(%pXi0003KNkl<ZSV!%au?+$-3`Oq{ z4HK{i4KuI<9in3(I&>X7Far&1FaagxOBWPOq~tsQx<jHmJOBB|w$gRP?{(h2@h4J> zp^IWfCg5_|$RH?y)#=uIfae^k1L`Jp!6~PKYC=n^m<AU>oPUP>cI|R7O_GgO+8fNc zN&vj#aAMi)VK@L4kNxmhkewRqj>Lhq2na@zk~qFg8~{LWKV0w6FWYf={1gkv@LlFW z1Q<p8AXs&~5&($DYHg)e6rP~ea>YWT8C2`owF%9A)9`763!q8SB)b97bc%*^0mMZU znons)`K&1(BR{kQY6uztJ}Kwk1yH`M`Unbud1%xkPyje|3W!?RIWGI?Xtjmz0rejE Y07mj}hGrp7N&o-=07*qoM6N<$f-SC!i~s-t delta 180 zcmV;l089Vj0?+}FB!2;OQb$4nuFf3k0001rNkl<ZScUDDu@!(Y2t?7&$=Jn#vWt^Z zVr5|pBfg7Z<oAI~I3Pp@q_9e1wVY`&BZIvH`UMg*AxePkhVOO30qPYdgczc;H<op~ z9Ty_tX>yo=E9x@U0=o)mC6~hL?g4lkT0H>4WjcnKgl>BwcP&APmFz-~o0~l_+_&6a ifSLbxKteR=9M}O_@lC<Fj&jKW0000<MNUMnLSTX@s!g~6 diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_8.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_8.png index ef45b5ce15f354aeda24a881f0beb0721551bc3e..11872d94f1b168c2cfaff2b3dfaf538fb596def6 100644 GIT binary patch delta 146 zcmZo-T*o*;rJl3EBeIx*fm;ZK886+f`@_J%kl^X!7!u*0oFKuvSkXX=2~04{F!kJD zzVp9(8FTtIKerS+AGz2$QSZ`}jumA^ww;xkmbyH?>FDI=@eUt<-f?OEZ(tc^m2l<F iMF9!kMpS~4;m=HwJxix@xG-=7ZS!>Xb6Mw<&;$T2Ju|@o delta 101 zcmZ3-*u*$NC62K;$lZxy-8q?;3=9l5o-U3d5v|Dy60D08M0%P64GuJX{B836{|Tl! zk=BwEe;QPl6lO81CF#h+6mYp6)R163EXBYewv&g2fyXl$Xbyv?tDnm{r-UW|15hCR diff --git a/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_9.png b/Resources/Textures/Structures/Power/Cables/mv_cable.rsi/mvstripes_9.png index 0963e111ad532b7704b1121d44c4aa7790dc5748..202084bfc1b510472ef4d3d9aa75192bafc695b2 100644 GIT binary patch delta 206 zcmZ3$_=<6YN<C+RM`SSr1Gf+eGhVt|_lJRjVUDMZV@QO1a)JV5&HQKo<Xb#1I0a}5 zJBmh#obfeTFiY8^h#~!&pIecPjm?(}O8*=cor6RgOahGmIX)8<UA|$;{x@H|+n)Rs z@3`bVxnlXY_ncOf!anxp7@o{*Sg_hNq~S8-iI0AZW~ykqr#tFLCARWv9BgD*D=e$L xiJ5KDlH`Tc{XM&;2OeFlXduOeLM(D(VBnNAb&9GNcn5SSgQu&X%Q~loCIEiMOqu`y delta 131 zcmV-}0DS-I0iXepBzysLQb$4nuFf3k00015Nkl<ZScUD<u?;{W2t`r+os+qX1G$Tn zS!$~`KPEyjxu?e$e25%qCG}QPKbiUS-F(c%?H_oDM*kwO+<?~h{#k79_Xezb4|_<= lHE4&<mI|!H0RRBt!T>6{BuG`qAS?g?002ovPDHLkV1k0XIAj0- From 58fb282023c21ac43712ee0221c811dc5dc31d8f Mon Sep 17 00:00:00 2001 From: Prole <172158352+Prole0@users.noreply.github.com> Date: Sun, 20 Apr 2025 13:36:22 -0700 Subject: [PATCH 462/622] The Beverage Jug Can Now Look Open (#36070) * GenJug-Changes Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> * Guh Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> * Support For the Rest Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> * New Sprites Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> * Newest Sprites Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> --------- Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> --- .../Consumable/Drinks/drinks_bottles.yml | 28 +++++++++--------- .../Drinks/generic_jug.rsi/icon.png | Bin 5433 -> 313 bytes .../Drinks/generic_jug.rsi/icon_open.png | Bin 0 -> 332 bytes .../Drinks/generic_jug.rsi/meta.json | 18 ++++++++++- 4 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/icon_open.png diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index 70236ecc52..0a712faa09 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -771,7 +771,7 @@ #boring jugs some more sprites are made - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkSugarJug name: sugar jug suffix: For Drinks, Full @@ -789,7 +789,7 @@ currentLabel: reagent-name-sugar - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkLemonLimeJug name: Smite jug description: A dual citrus sensation. @@ -806,7 +806,7 @@ currentLabel: reagent-name-lemon-lime - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkMeadJug name: mead jug description: Storing mead in a plastic jug should be a crime. @@ -823,7 +823,7 @@ currentLabel: reagent-name-mead - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkIceJug name: ice jug description: Stubborn water. Pretty cool. @@ -840,7 +840,7 @@ currentLabel: reagent-name-ice - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkCoconutWaterJug name: coconut water jug description: It's on the inside of the coconut that counts. @@ -857,7 +857,7 @@ currentLabel: reagent-name-coconut-water - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkCoffeeJug name: coffee jug description: Wake up juice, of the heated kind. @@ -874,7 +874,7 @@ currentLabel: reagent-name-coffee - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkTeaJug name: tea jug description: The drink of choice for the Bri'ish and hipsters. @@ -891,7 +891,7 @@ currentLabel: reagent-name-tea - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkGreenTeaJug name: green tea jug description: It's like tea... but green! great for settling the stomach. @@ -908,7 +908,7 @@ currentLabel: reagent-name-green-tea - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkIcedTeaJug name: iced tea jug description: For when the regular tea is too hot for you. Boohoo. @@ -925,7 +925,7 @@ currentLabel: reagent-name-iced-tea - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkDrGibbJug name: Dr. Gibb jug description: 42 different flavours... in a jug! @@ -942,7 +942,7 @@ currentLabel: reagent-name-dr-gibb - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkRootBeerJug name: root beer jug description: This drink makes Australians giggle. @@ -959,7 +959,7 @@ currentLabel: reagent-name-root-beer - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkWaterMelonJuiceJug name: watermelon juice jug description: May include leftover seeds. @@ -976,7 +976,7 @@ currentLabel: reagent-name-juice-watermelon - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkEnergyDrinkJug name: Red Bool jug description: A jug of Red Bool, with enough caffeine to kill a whole station. @@ -993,7 +993,7 @@ currentLabel: reagent-name-energy-drink - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: CustomDrinkJug name: beverage jug description: A jug for storing custom made drinks. diff --git a/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/icon.png index 2cafc197fd3e170d984710508233adf973f37fe6..b225942035984743b6e57134fdf262170c6a2e40 100644 GIT binary patch delta 287 zcmV+)0pR|*D!BrXBYyw^b5ch_0olnce*gdg1ZP1_K>z@;j|==^1poj5AY({UO#lFT zCIA3{ga82g0001h=l}q9FaQARU;qF*m;eA5aGbhPJOBUyw@E}nR9M4fU>F6XU=)x6 zo;-Q-|H+dl{|C%+WcK;<=P7awBdHqv{rw4AwsGS|Mw&Rl&VSDCzq-0QL3KB8-efp* z=nzq6vyc;PW@cs#_wV1wD);*JYm&@j8t4SgLaxRyU%m{S11?{_%<%pD_knYOuC6ZC z(!gjG49zIGeEIUgW<zQPKiLit6&1xPN0%s|Rt_N90el=BL`4Bi9ZjlZA2&CG)$x{H lyBHZp!6+C7qZoil008VWRg%BfIs*Uz002ovPDHLkV1kg6a@PO= literal 5433 zcmeHKX;f3!7QP6AGNV!u974bXO6EBd1{owmfC2(qQEqZ?Adra+5GF+#6j2eaSP|<0 zDk7y)hcbu?Dq;Z(C_WYHgeVjN$Eu+9-2_BjuWP;KTJ1lRb(4Gd`Sy4A{?0x-IoW~! zi;eWH^Z@`cV*7XoA>SzVHANTslqV&<005ooNg?5iATR+Xl}Y#lA&gQaN?{bN67T^) zb!#B(+iedV4BtMQk*s6))b!H5nH97f-4gwp(-9pVtOyp#Y=rQ&@bV;sylkN6&2M*_ z-eu-wpEe-G&UZ{)u|K2UeB*F;=?L59@uM@Z%j!q={2pO$xZUm7r=@+uHOH^^+%+{{ zp3?0zvaD@z!4mqr{`8{bwiO$kHpVgMAGW<$w9a4erDcAA*Yi%B6N!y+*4cA@Ille@ zua{<@J7l9>YX;7E=x8@5z|3WmX-)ce{mds2TUf9j+sQS~^#K}5h2=+42jKl#hc^#~ zSCNy%3Aw__F1s7G8~e5e3~aeC52e14BpD~gq)7JmOMBjG56AyRQ4A1xGbna$d#<?u zp7k^3L~L(;b*SE&%TZls*k{<uUWB6y!>!MZWVIhLP0#jPtGjeL`IpDn%(!>^=pNvp zQ)kJxD(M|R-32G;zIitKD@P8ormU)H9X$1VFkZ6p2fh7{?LQUqR@YXBxrR3dY4w#` zgl@>WdG6Fwp!w$XmUB~noPMoR>&%WzO)7J|r4j6#Hz~67-T|*+$-J$c6Z^mn=l0BJ z^w|JfG26^=swEI>mpAQAb73}6yl&sd);zbabHK$$ZFiX|^bH^Gx7rKc;xLHK#_>-4 zNc56zhT@GOTg?|;czfBMus-HHOYSDehb0vk3hXjx1TSISJP>~T!ChIi<D;^w2c-wx zi@t6tU4G&#>^d(}eu%6sXvvSg$Lr-6|6^_xBkC&7{3^m1LlYhB*wS~^BbW8E>*UUr zdL}c&UA?UmdmW1W3%*}MYNlUp4vyNT1WPe-3(6|nfAtMp_L4hL{4yeOErq$PyX8Ad zvqkK&hbeORQ-z-0h8YzGIt|CaNt@czuq#Y|?Pf-IvxRr4r}x%2x;3<EZ5=+l`+#-A z78CEyReSHZ^hhsRui43nx>noRm3;e$3aZfhkKGlv21X&cMwe>=KbCb+YZBU1L!Oqt z?e0yW$H;X{e5cb_aQHdw+DdlI{E<@Il`rp1X{xpK-`#p_e_T$-rrN^N<RaHn-;@Z) z>${}4rX8$~xZnH2uR3?W%XWE(?pf1bU@C2~$Ulc|xs~*r>x^=vn>oeAwY>Cz0NsJr z8<pvXt2uyef9X6sWohb-M3eq4UiGPw_P5d~RWoaCt_$fV=c;yU4ZBqzZv0&<tm)jF ztYcfQ7ijypR;+4J)je{l8=BYWQYSgD*Ohj~Z112T|4;H!lhT^Lxsk8ozLk4YIJXH^ zeacl2U+J}{x)P2p2c~5lo2eXfOg%3jPErl-zABwu7PIZ?B1%t#w*8um;>S~KC{rE_ z2dqwh#jQUA9M+kw{URxSTXMnq<{PuZo=nw?BUhX~G_?3dQ`VoC+TP#EyW0i1o_jy( zY2nCSpM|p)0DxAez{4Yu?cwpEJs?e?Fg1_mb3SlJW<c;k^bX^Ahl@5I%AZm5?>j7Y zT9?@#8r@O%;NY6pVjFf`+>8|l#(z15&R$WdR7%Zt>gJk8>DhZ(I6gg7+=^~6$bA)e zo3;Mcpms*+<|F(&I{RYs^VnZsNCB4`o~~c-uxJAcO9&2tE#yzieoFr1P<768r=c^h zu|AFkhEK9D$o*(e_l@rF;`lx~9WaY;&bD!}pF`_icOiGh&WP3BE8@fN?gDLh?y@(Y zp3^fYKl%HmhC5UR^g|_9JqC$8&98i0*s(laIe2-MrBlp;W#w0`+^6~a*ch1+tx68) z8pPeA1o=U|&iC%+GXEl1L9(TFjTLFk5T7k`-<quc?Ya|(Q_Zf^X?@S_oLl4;X%S5m zjf~tl)oGvher9ER^<PN_-@mh~z1hKC>=tcZSveT<Y>u=_+w%v-<*l<W2lzVdNP9&Z zJ~RoRVqjQaCGRinexcRaR+cYGOZSK@^SjwUXJ}6Ep3bwZJ#XFtM{;GggMUi*0D$pQ z0n)F-Ietu@M1%z)2^YqyL{g-m1Aw!uN(%B~VFii{M+w9%^ia)NG)e%m&|wq~o+I^u zqXj-mGB`NNKZKVQ%VR)jR~LO}6%!#4!3q$i5(&j}riz8u@G_BmwHb#-X&{PN7CM|0 zi1LugU=$fk#^NzvDnUFE?V^uzmO*@Gkf-+;1@go~M=KOkCJvX7kbq4fVI{IC9D%`L z;P6Bok%&PM7<r;t0je-!xviRFl*1F2^JD_4LLd>N)SMt!qExWZXk;AqAwH3m!x^U+ z%g0ne^uVb=DUN`}<3u9dL=U;bD;^;k3+Qh><RQq<9xe!$OO!Gm>=h4-6}A&8Al|sY zR4Ef`(t&t5SO|*{s2rJ<@X3^m*_^;}548kQ0+CeXg^2wLQX$}f6zh}N)FYa7CI*7I zkMn+l{*b!{jG#Cirl*9bRENj*WTDmbGa(6205LVUAVeUMNDMLt4^gQYGM&%EaPcq& zgC`U4L@I*^Lm+hm6<aJ<fMOo3rb5WE0)z)5(+FfPg@NJHcytVz3Q{p#n2g-fXncr9 zra=T4KY=1ZCP1nZ6i$pvO$8xTR3d{xAu(u3Gz0=dz@=m8bP5r}qw`5H4AOag8l<6u zcua4JOavm!DG-5CFit9t(hR5tXSxTnS!g15bXJWePzWmchy$_*1Y$^%ApZys5s2Vm z1*q1OK*LjsbP}FQCsBxaBIP3}6qd=6T2!+V@K_R2GooG?CXx;!EvT+kgg|3QvSE72 zU{E2Eg-9eq7FrzwO6@s5%t1C31S&vJPyr*Pcp{mJCoqZB5CWb_A~5lY0u&~G0$u_M z_=*1yt=>K;=g~#?5y+AG6E&vMJrxYcjXsS&3I&?YghFYy1ry|rrXUC7;ZcnduF)Z0 zG$@XOk^V7OupjJ#zbOV9kxwS`X%q~POC@5+5X{BUi6j_9BNMn(Jc&=DkjNSp#@Xc( zz9IpX!R}Frj)+!BfoiluIgBlp<EQw9Xjr`th-4T%0W&HYk;Ei1(71m;J)}4w5Tt<^ zJ_OM)WIP#<q4Q~c49KO>31kX^&Lxi4#y^^#x+3Tw(sRbC8{&t>bjJP9a*qNgbWlW= zQ5({kkw%Xj@APAOA+i3Oudy=wH>W_MzD)92`hJn?i(H?jz-NKKRM!`|K1+em0)MHl ze@rg@k7q?#jQqh%Ku&_gw?kc!Q=~4}cd;k%Uj5!zdw4rynJV>JCI<k6>FP@hC@8c< zjCu+-$4jqQ%gSW#l()BpI}p=Jwx@eY`1yeyM~%<p4ZZdp*%#ehcG}?t{#bO-*^}*o z;F>xIhvH^(P-IpEb>2X`_x6;Mxz*23!hpN!{G!#4w@+b+BotZ^aTsfc=LGxpG(Ru% zH;deqoqEUqdD+Qh<*}hd4;yb}fxx4#OO~XeKa@vnGg{gf4W+WQJaud`k|v$Felgz7 z>2-j?hLXXV`Bv{itqrd!@!69PVk3V^OYY<^dvaxA&urHQ!kaC7n+~{{>ey_zC|>B@ V+V=BeHzWao?d9)Tz9@3te*p?V6AS<V diff --git a/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ea96b012b4a99a8297976bdbf5e92280b4e5b5 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%C&rs6b?Si}mUKs7M+SzC z{oH>NSwSk3J%W507^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10;*_V0 zV@Sl|x6>B#9Z}$EJDr;JN+wUPb*_tF?56bCqO79z4NhmTBzjJmbL;7mw`M2u&QAKb zZE4L<?_h=qoutlqM;D)a)f0l8E}Jw>5fKztS{5uD!5n$##qWQ-COpj+tPeh4GJSd= zg;64TQc#xhc}w=oCT~~8PQ7t$o9>y<e@vh4J-@1SvE1QRUlKSP`3^*J8@gFBto@pp z-w<7JRxBbr^Y{mi-`$K$rmWr=993|IC58FU>#A_>X?ymsdF*~YcirRX7MK3bi_p2Y b^b1pVLYVqgp^IC9zGCon^>bP0l+XkKhWdi- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/meta.json index db0ac608ed..a4039a1dd1 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/generic_jug.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi, icon_open modified from icon by Prole0 (GitHub)", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} From aea474d4a9a26f71367fe399e0ff813f8a9266ee Mon Sep 17 00:00:00 2001 From: RedBookcase <crazykid1590@gmail.com> Date: Sun, 20 Apr 2025 13:55:42 -0700 Subject: [PATCH 463/622] Pirate Gear Tweaks. (#35986) * Tweaked pirate gear to be in-line with similar items. * Added attribution for flashlight sprites, made hardsuits Major Contraband * Added empty versions of the pirate revolver and flintlock. * Test fail fix hopefully? * Test fail fix hopefully V2.0 * Test fail fix hopefully V3.0 * Test fail fix hopefully V4.0 --------- Co-authored-by: RedBookcase <Usualmoves@gmail.com> --- .../Clothing/Head/hardsuit-helmets.yml | 13 ++++- .../Clothing/OuterClothing/hardsuits.yml | 8 ++- .../Weapons/Guns/Revolvers/revolvers.yml | 16 +++++- .../Objects/Weapons/Guns/Snipers/snipers.yml | 24 ++++++--- .../equipped-HELMET-vox.png | Bin 4235 -> 0 bytes .../piratecaptainhelm.rsi/icon-flash.png | Bin 0 -> 470 bytes .../Hardsuits/piratecaptainhelm.rsi/meta.json | 49 +++++++++++------- .../off-equipped-HELMET-vox.png | Bin 0 -> 1103 bytes ...ped-HELMET.png => off-equipped-HELMET.png} | Bin .../on-equipped-HELMET-vox.png | Bin 0 -> 1077 bytes .../on-equipped-HELMET.png | Bin 0 -> 1234 bytes 11 files changed, 81 insertions(+), 29 deletions(-) delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/icon-flash.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/off-equipped-HELMET-vox.png rename Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/{equipped-HELMET.png => off-equipped-HELMET.png} (100%) create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/on-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/on-equipped-HELMET.png diff --git a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml index acb1db120d..9aa0e76a54 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hardsuit-helmets.yml @@ -580,7 +580,7 @@ #Pirate Captain Hardsuit - type: entity - parent: ClothingHeadHardsuitBase + parent: [ ClothingHeadHardsuitBase, ClothingHeadSuitWithLightBase ] id: ClothingHeadHelmetHardsuitPirateCap name: pirate captain's hardsuit helmet suffix: Pirate @@ -590,9 +590,20 @@ sprite: Clothing/Head/Hardsuits/piratecaptainhelm.rsi - type: Clothing sprite: Clothing/Head/Hardsuits/piratecaptainhelm.rsi + - type: PointLight # Color matches visor colors, radius/energy same as mining hardsuit for the big captain. + color: "#f3ea9c" + radius: 7 + energy: 3 - type: PressureProtection highPressureMultiplier: 0.3 lowPressureMultiplier: 1000 + - type: Armor + modifiers: + coefficients: + Blunt: 0.9 + Slash: 0.9 + Piercing: 0.9 + Heat: 0.9 #CENTCOMM / ERT HARDSUITS #ERT Leader Hardsuit diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index f3edb201e4..ec9b5e7f06 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -751,7 +751,7 @@ #Pirate EVA Suit (Deep Space EVA Suit) #Despite visually appearing like a softsuit, it functions exactly like a hardsuit would (parents off of base hardsuit, has resistances and toggleable clothing, etc.) so it goes here. - type: entity - parent: ClothingOuterHardsuitBase + parent: [ ClothingOuterHardsuitBase, BaseMajorContraband ] id: ClothingOuterHardsuitPirateEVA name: deep space EVA suit suffix: Pirate @@ -759,6 +759,8 @@ components: - type: Sprite sprite: Clothing/OuterClothing/Hardsuits/pirateeva.rsi + - type: Item + size: Huge - type: Clothing sprite: Clothing/OuterClothing/Hardsuits/pirateeva.rsi - type: ExplosionResistance @@ -782,13 +784,15 @@ #Pirate Captain Hardsuit - type: entity - parent: ClothingOuterHardsuitBase + parent: [ ClothingOuterHardsuitBase, BaseMajorContraband ] id: ClothingOuterHardsuitPirateCap name: pirate captain's hardsuit description: An ancient armored hardsuit, perfect for defending against space scurvy and toolbox-wielding scallywags. components: - type: Sprite sprite: Clothing/OuterClothing/Hardsuits/piratecaptain.rsi + - type: Item + size: Huge - type: Clothing sprite: Clothing/OuterClothing/Hardsuits/piratecaptain.rsi - type: PressureProtection diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml index 18f0d1c109..fa65aa4649 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml @@ -151,7 +151,7 @@ - type: entity name: pirate revolver - parent: [BaseWeaponRevolver, BaseMinorContraband] + parent: [BaseWeaponRevolver, BaseMajorContraband] id: WeaponRevolverPirate description: A crude single-action revolver handmade by a space pirate. Old and covered in rust, it somehow still works. Loads 5 rounds of .45 magnum. components: @@ -168,3 +168,17 @@ capacity: 5 chambers: [ True, True, True, True, True ] ammoSlots: [ null, null, null, null, null ] + +- type: entity + name: pirate revolver + parent: WeaponRevolverPirate + id: WeaponRevolverPirateEmpty + description: An odd, old-looking revolver, favoured by pirate crews. Uses .45 magnum ammo. + suffix: Empty + components: + - type: RevolverAmmoProvider + proto: null + capacity: 5 + chambers: [ null, null, null, null, null ] + ammoSlots: [ null, null, null, null, null ] + diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index e8f26cac89..ff532c94bf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -81,7 +81,7 @@ - type: entity name: musket - parent: [ BaseWeaponSniper, BaseGunWieldable, BaseMinorContraband ] + parent: [ BaseWeaponSniper, BaseGunWieldable, BaseMajorContraband ] id: Musket description: This should've been in a museum long before you were born. Uses .60 anti-materiel ammo. components: @@ -119,16 +119,19 @@ - type: entity name: flintlock pistol - parent: [BaseWeaponSniper, BaseMinorContraband] + parent: [BaseWeaponSniper, BaseMajorContraband] id: WeaponPistolFlintlock - description: A pirate's companion. Yarrr! Uses .60 anti-materiel ammo. + description: A pirate's companion. Yarrr! Uses .45 magnum ammo. components: - type: Gun minAngle: 0 maxAngle: 30 #miss him entirely because the barrel is smoothbore - type: Item size: Small - storedRotation: 90 + shape: + - 0,0,1,0 + - 0,1,0,1 + storedRotation: 0 - type: Sprite sprite: Objects/Weapons/Guns/Snipers/flintlock.rsi - type: Clothing @@ -139,9 +142,18 @@ - type: BallisticAmmoProvider whitelist: tags: - - CartridgeAntiMateriel + - CartridgeMagnum # changed from Anti-material rifle rounds because it's a flintlock pistol not a Hristov capacity: 1 - proto: CartridgeAntiMateriel + proto: CartridgeMagnum - type: StaticPrice price: 0 +- type: entity + name: flintlock pistol + parent: WeaponPistolFlintlock + id: WeaponPistolFlintlockEmpty + description: A pirate's companion. Yarrr! Uses .45 magnum ammo. + suffix: Empty + components: + - type: BallisticAmmoProvider + proto: null diff --git a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/equipped-HELMET-vox.png b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/equipped-HELMET-vox.png deleted file mode 100644 index 8d0cd093f3bd4754fafb205ba4fb45b4dc5b6d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4235 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 diff --git a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/icon-flash.png b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/icon-flash.png new file mode 100644 index 0000000000000000000000000000000000000000..a99dc4586fabb8e8308b5c91a9abe05a9aa7ee62 GIT binary patch literal 470 zcmV;{0V)28P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm001r{ z001r{0eGc9b^rhYh)G02R9Hvtld(>PFcgLl#!;g#_bv?LXuvqK+zA%nzz2}`fHyF% zkhuB=Cgw7j`v|xi78YELadfEt8`{8y+!kYEOxlD%%jx;Q^PiT;4(ot*z&h~94mdh} z#@Hw%%QDt9jaqkIm(n!V=9<#dZt4T{h4VaD`I00N-#-B{29V-)UDJBKCdY9IaPl3; zF?pURK#HQ!=9TpOx)wlqv)Smv#DBnHL{Y?6tCdk(w4}c8j}HMCsj5m<9|XZ9Adle& zX(e_S#{m!kh{40{S7YkG*feo~x7Ft0F>WojZA*_20%|a>u3u=mTvAz<SQmNa8QE3h zo>6mouFtnZi65PKbi9bwgE^o8hq%rWqtvDV&f(%lRESDH-fLoCuR;KC%%uZ}lMa{= zm;$JzVHge|AfDYG5Z1dfr>!&xK=c<^tq+09F|gkC-=uK!7#yVX>5iU*OSuV$k#*No zyfL5ZyU8ukk|2q9dPeu>7yVcvxOGKGxqbyeOK1bE1J(iSz<+n(8*shEi**)~k^lez M07*qoM6N<$f)v!zQUCw| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/meta.json index 48f0cbb615..dd030ae1f8 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/meta.json @@ -1,22 +1,33 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Made by brainfood1183 (github) for ss14. Vox states by Flareguy for Space Station 14", - "size": { - "x": 32, - "y": 32 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by brainfood1183 (github) for ss14. Vox states by Flareguy for Space Station 14. Flashlight state sprites by RedBookcase on github.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HELMET", - "directions": 4 - }, - { - "name": "equipped-HELMET-vox", - "directions": 4 - } - ] + { + "name": "icon-flash" + }, + { + "name": "off-equipped-HELMET", + "directions": 4 + }, + { + "name": "on-equipped-HELMET", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-vox", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-vox", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/off-equipped-HELMET-vox.png b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/off-equipped-HELMET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..2cec554e8f51999ddf342bfae8834e79f06f40c3 GIT binary patch literal 1103 zcmV-V1hD&wP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00009a7bBm001r{ z001r{0eGc9b^rhb0ZBwbRCr$PnlXzSK@`VlAt^%$1Pz>xq&u|NLO9|<l15ToaaW`} z8>>LRfL|bx%0{~smok_lInZ!$5bc%gf{h1J4njzoVl)3?-!hJ?&WtO`g*R}lw>R_t z@BQZOtlWEn@EFZzGn`JR@yc8-C*-}r!<5$&=$i|D^_`s718=w6u@CinU47m)2wfjq zG-xw?^sNDq_+&B>y<SfQK_J2~jIW1>ha#WPE1x=@j<sFe6fm=nfa{s)vk4m=h4AI& z<$|B90O*q{l}aj)MUp;&*7dM4G-k7zI66AA(%%T6P$(=tZx9-dM)B?!i^ar^9FNBv z?OS9(D1C^hWwY6pOAt5>sf~{t^*2t43@$-H`qRMUkT7g*TQCr@m<fY|jsn(gS?OC% zA_&!LRY0)w=HZglr>}1WcBkL(TamYk+L#kUKeC^=T>HCqT(%R#U-OPAKY6Qy-!GJv z1Hs+LBK-YLeZCqG1RxB)yb|{^r)fh_`Y%q-)IqC1??i&`e>gjF(zgWw9km0<fKTrW z;{Jnt4B+RFiFkfI-gyROG8uvM2Em%IK|sN|G@s9%;NNjbMZgM6rIHMGC?N=W{it9d zc-)V6#s#W_ya;4)>MVdxQWm%d??g&J2e1Rf;ZW^3GJ=BN;q$M9QkiHDUu~b=Qm-Zb zbp!~uuN{{yUo$u9)$9|Cw>xkEJE5-8kGHYgyfE=g(rpfieP;qpfC(@GCcp%k025#W zOn?b60Vco%m;e*_-wAB}k3_vz?^~mHg`B45Rshm$RIr7Rwx$;VazbxRFzfVappZpV zFZ(78S%?j(34{KI%8;&)`#u@y<e*+Er@DY%tEXxWN>muA7i<dw!IKu1;gd9t(ztb8 z))OQ0R<(L^Ch8$@)mTUX0HDBE^#=I#1(1kKZ4he$SpkY6=)$(o@HX={>G@Qre0OK5 zVZm%r7@i-fSW8bYd^Oa1X-8>EI}7ZnQNqx5)^c7TOVnYb(GchxLO~LBd-MaKblrWo zFZT8xsnR(H%I4SC-@PFq_#}I^mshF`PTDAzq9>`<YT>?9Os<cB3Jj+&1Thf2Jbjfo z1_H(a1eDD&aCo}*3t<f!E`+!dU(fR~OiBZ2LYsm&-$J&JniDM;MF!xCEFc&p*6nuH z{b%J1)h$AYR#ZK9(gFZ|Jvvi94-ORQTCEnxM~xD+0j?R~<P@o*Don3Boiu{SPEhXv z=HLY127qn@eFzAcg4MO5BOghxcx<y}?L1@#e()s;yGNOV>#A0}bq14cz&7cm;&j?Z z$T<q0?3=&a=qB0tr-Qc%isvu^Ccp%k025#WOn?b60Vco%m;e)C0!)AjFoC~M;17`{ V2HNnDGFSir002ovPDHLkV1gJx>k0q> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/off-equipped-HELMET.png similarity index 100% rename from Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/off-equipped-HELMET.png diff --git a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/on-equipped-HELMET-vox.png b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/on-equipped-HELMET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..2e34340b43b5ff61bacf7d794a86e555ffd63ca7 GIT binary patch literal 1077 zcmV-51j_q~P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00009a7bBm001r{ z001r{0eGc9b^rha=Sf6CRCr$Pnjy1NK@`XLIvO3dK*7LR43I1sC_u3=2Euz;DI`Av zAHhTc^LxSIP%J<pNHIaMI0PwBo{rIQ-T%%#>#|&6ce#u{=j;q~-@ELd|2e-scki2b zP9y?Gx7&?ZtCe0^C=`Ue7X_FKS^|B0VW_^B(`MlPeqa00ZnxFX=LTWwLyHD&Mu@&M z01{s=mtr&;i71Lh9LM_FXf#BzSX4d@1_Niit|?$=9RW8pF=P{tItt<Gbh_o|J^<#V zYPFilW09s$piMn&42|`AEn2OXlm1ZvrBZ3<d4te=KG(ZnE|*g`a<Nz(weOGtvGhSt z%jffZmmqK&QX4-W)jv8RF}MQ(=}!ZXL&|Wq?Z7~2F&hR2odj&!a?*F2L=furx`5!v z>pwd}iZ3n}0=qLFkDbW7L~YH9p`X}KU2c5u9GC0F_~&LIp4Z;0;2%6His;@G?L_?R ztN3xV6oBw)@<!axz0Mkf(tmk*r4Cy2c_%06{)ekeFMU@4&`~=;8SpUI&;Y(~Mk@Go zXFx8O6F6@Wto<4U6r4+&&BhD<U5``*thiFC$Y5tO6NCyH8G$SACp+T<)k9uHGB|Y> zKqoB=e1rEQWu61rf!S=Pb{rW&!JqN@H$kaPv`46R$Zo0ElKDCU1lQM&&z2vUoAzoB zi6z(_IDnl{*W?py>^3h<{Uhl%2gJTJ0Vco%m;e)C0!)AjFaajO1egF5U;<2l3H<K_ zPX0%tS*s7N(fdNqQu8DLSvD%TLdaS(2mm=@HYV70dNfeTqG^zQ8-^^z#?*vC-=Q*O z>f?S$26{PYmddFvVAkrXT7wc52I>W;LO}4OMP>LjO{+BS9GCONguGL&o}5W~2z)iR z5&!@w@O`}jA$<WP;!_*Mnn+fFGz3%F^%*{8-Z8z9>Qw0N>@+Oc4GP~D7b@1rrRz`) zwO-m$TGGxIJ8G1$biK8_7swKI-05@#`i4-DMBN_!04QC5p44`F2T(c>g@EAAGCcJm zJgZGq8Jx6HEJaUJuh+wUubA$Hq$EyX2tpXa%hOkzL8Am5#Xv&^O6U9fj1FmI4c5X2 z1_e)Rpb2dX-hK<Y#^pr|Mv(!yA`37~;o)$o?!Rh%(G3%rlT?qrv;cq(J!;B$_x`Ec z<z};~<D*6i+{f_E057LV6;)w+)tRIbJb+N|0OsHXKLvnk1APbxn1VI6p(7v3pm<!f z<={MI20r*B3A;y`f@|m_VB3Ig(#gc>tc{R!<T%;4e|OPMv++*{?-CTxVFFBm2`~XB vzyz286JP>NfC(@GCcp%k025#Wf1ki_webIVLU8t100000NkvXXu0mjfQQ_Gw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/on-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hardsuits/piratecaptainhelm.rsi/on-equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..ea09bb593ff9c34871362cd3875a234febd7d0ba GIT binary patch literal 1234 zcmV;@1TFiCP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00009a7bBm001r{ z001r{0eGc9b^rhbgh@m}RCr$Pnz2t5K@`Skjdm)bISQ}vv{TNQ*kC~eG&ICg`lI1L zu!5^>i3JTNmRQr67>>k{7#l0jl3a6=aE(#vEXMgB^M<*-*`3|n#lpNvE*!fv^S$?b zZ)TEvlc-43T2J)ocDs5w9J=StW)t6&t*xzzzDbhABy!(p=?4Z)r60A<H^6s%Z*R}p zu(7d0-$Nkk1mNpiEz;#+Oru{I0E-U>19f<KsNfjj@ZXh{71e6B7)ru`>H?6?ItK1% zVkihP{hP7;gz)k4ajYA?2OQh98K=yWhyspH9MWgdzVob&zvt)Yv~G*&M-7~xpP$?W z%;YC0CocN!c01^Y>0<&Am54FW#s=4CZf-8Kzj55X>-YP}(5QYi1F*T7$$}7ge}GuJ z8KWzEjybotw-fUT>H`KlowfnvVr22YP$y37<>h4({P6xNA}q4{vaeuJuh%O(Z?2sT z*@RL<-_9Q#!|xG!w;4q;ut)}AF8zD-Ry|+ZA?IgiTPnHr&>5lsoSNrK0RsBnX><^= zGH`Ptz<JF3VtrqAIvsznapSNrVEv;X`uh;_CNE<oMSwGaA;9^cKL+Idbz}h1zdUVp zqtQ^<Z{TeD7=-iKmqw$JTl;)U<pC&~0i4!)VPU~I`-LJtGpoq??#^w6=XNJ91GUI9 zb=hp3qrCt+-ihPpfb%8;q8pztdZUa5Sbq?{gwS`9XQTY}d2w+{k*nIy&OXy=V_TB7 z2k_owmS0uL@$qn?_wkMT)PBk@uoQ4K!8`hk|M8tWpg#<+0|4gWk7pU{`G2qWr0|&O zz(Blp|ABh<=!ri8J5Ng#AM6j@&>s-$05F}^GD-*t0U;m+gn$qb0zyCt2mv7=1cZPP z5CTF#2nc};0+oNlPL-`DYV=iWgX!NDQFOJxLy}8HOJG?U5CxF;!zL=Xfr-Z;)CnN% zJZtAwfn)kp0bs}diwWsEy}ch$sz?!vk_~|7OBmb-m7&zdh+sLqRsg0f<s!~yYVT5n ztJa`Ig@!U(RRSpTu@;x%Lz;eR9A$Y1RVx70=Ze(o*%*6=Aev=)J2U{W<5_nDLiYlS z0w_}(#GG_jfFbz8|Kga5>DfC1rGQ5}`<tMbPHrhMjPwNsJFe;q;OY{tdW<p7(4|fp zHcuBLzcz>OrbMlA^l?4VRAZ?$hUdS&zd{|KKGUgXkK%cu0WD~<Hf(`Sc%HU5W=E;& zFi(cvcX4r1p&p28tP!VID3#;Bz;!jgi(t=x(uNJNC4CANwV~7!z@%m)qUdgJZjy#C zd~k4}z8)>n4U)U}UPtFHY9#t0@&Np7=}4`ut+}CmQDS#@m!6q@VobNzQ@{eiEe*{_ z9a{n*fB^_-21L?)yzkfc%lPa1BBh7l*5NpThx2fn9p;WWDRBIyH_FNYVpikYifx*+ z0>)hj0Dpd?Ns-2_kSeWmntA|W2So{K$XD265r`R&4B)wV`LXkL0Ep?!dm$hMgn$qb w0zyCt2mv7=1cZPP5CTF#2nYco@ShR*3vVQ(cm}eV=>Px#07*qoM6N<$g1xmw)Bpeg literal 0 HcmV?d00001 From f3a33fefc2abb058282e908e1cc134125e6663cb Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 20:56:49 +0000 Subject: [PATCH 464/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e80b879dc7..7920b8d701 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Alpaccalypse - changes: - - message: Special reagents are now listed in the relevant section of the guidebook. - type: Add - id: 7786 - time: '2025-01-07T17:45:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34265 - author: Tayrtahn changes: - message: Sentient goats now have a bleating effect when speaking. @@ -3905,3 +3898,10 @@ id: 8286 time: '2025-04-20T14:08:02.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35808 +- author: RedBookcase + changes: + - message: Updated Pirate weapons & hardsuits to be more inline with similar items. + type: Tweak + id: 8287 + time: '2025-04-20T20:55:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35986 From f6a29e24a289e32499fdc4e0ce5a5bd1c0a6199d Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Mon, 21 Apr 2025 00:01:50 +0300 Subject: [PATCH 465/622] Markings overhaul (#35938) * markings displacement setup * ok i got it! * fix map updating * remove trackingLayers * markings clean up and modernizize * marking disabling displacements * markings restriction * dehihienize * dehihiniezize 2 * aa * nice --- .../Clothing/ClientClothingSystem.cs | 5 +- .../DisplacementMap/DisplacementMapSystem.cs | 43 ++++++++++++------ Content.Client/Hands/Systems/HandsSystem.cs | 18 ++++---- .../Humanoid/HumanoidAppearanceSystem.cs | 7 +++ .../Humanoid/HumanoidAppearanceComponent.cs | 7 +++ .../Humanoid/Markings/MarkingManager.cs | 4 +- .../Humanoid/Markings/MarkingPoints.cs | 27 +++++++---- .../Humanoid/Markings/MarkingPrototype.cs | 7 +++ .../Markings/vox_facial_hair.yml | 7 +++ .../Mobs/Customization/Markings/vox_hair.yml | 24 ++++++++++ .../Prototypes/Entities/Mobs/Species/vox.yml | 20 ++++++-- Resources/Prototypes/Species/vox.yml | 10 +++- .../Species/Vox/displacement.rsi/hair.png | Bin 0 -> 347 bytes .../Species/Vox/displacement.rsi/meta.json | 6 ++- 14 files changed, 146 insertions(+), 39 deletions(-) create mode 100644 Resources/Textures/Mobs/Species/Vox/displacement.rsi/hair.png diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index 5db7209d22..f01a170850 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -334,8 +334,11 @@ public sealed class ClientClothingSystem : ClothingSystem if (layerData.State is not null && inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId)) continue; - if (_displacement.TryAddDisplacement(displacementData, sprite, index, key, revealedLayers)) + if (_displacement.TryAddDisplacement(displacementData, sprite, index, key, out var displacementKey)) + { + revealedLayers.Add(displacementKey); index++; + } } } diff --git a/Content.Client/DisplacementMap/DisplacementMapSystem.cs b/Content.Client/DisplacementMap/DisplacementMapSystem.cs index 6db164a09f..9e9ad6135b 100644 --- a/Content.Client/DisplacementMap/DisplacementMapSystem.cs +++ b/Content.Client/DisplacementMap/DisplacementMapSystem.cs @@ -9,22 +9,36 @@ public sealed class DisplacementMapSystem : EntitySystem { [Dependency] private readonly ISerializationManager _serialization = default!; - public bool TryAddDisplacement(DisplacementData data, SpriteComponent sprite, int index, string key, HashSet<string> revealedLayers) + /// <summary> + /// Attempting to apply a displacement map to a specific layer of SpriteComponent + /// </summary> + /// <param name="data">Information package for applying the displacement map</param> + /// <param name="sprite">SpriteComponent</param> + /// <param name="index">Index of the layer where the new map layer will be added</param> + /// <param name="key">Unique layer key, which will determine which layer to apply displacement map to</param> + /// <param name="displacementKey">The key of the new displacement map layer added by this function.</param> + /// <returns></returns> + public bool TryAddDisplacement(DisplacementData data, + SpriteComponent sprite, + int index, + object key, + out string displacementKey) { + displacementKey = $"{key}-displacement"; + + if (key.ToString() is null) + return false; + if (data.ShaderOverride != null) sprite.LayerSetShader(index, data.ShaderOverride); - var displacementKey = $"{key}-displacement"; - if (!revealedLayers.Add(displacementKey)) - { - Log.Warning($"Duplicate key for DISPLACEMENT: {displacementKey}."); - return false; - } + if (sprite.LayerMapTryGet(displacementKey, out var oldIndex)) + sprite.RemoveLayer(oldIndex); //allows you not to write it every time in the YML foreach (var pair in data.SizeMaps) { - pair.Value.CopyToShaderParameters??= new() + pair.Value.CopyToShaderParameters ??= new() { LayerKey = "dummy", ParameterTexture = "displacementMap", @@ -45,21 +59,22 @@ public sealed class DisplacementMapSystem : EntitySystem if (actualRSI is not null) { if (actualRSI.Size.X != actualRSI.Size.Y) - Log.Warning($"DISPLACEMENT: {displacementKey} has a resolution that is not 1:1, things can look crooked"); + { + Log.Warning( + $"DISPLACEMENT: {displacementKey} has a resolution that is not 1:1, things can look crooked"); + } var layerSize = actualRSI.Size.X; - if (data.SizeMaps.ContainsKey(layerSize)) - displacementDataLayer = data.SizeMaps[layerSize]; + if (data.SizeMaps.TryGetValue(layerSize, out var map)) + displacementDataLayer = map; } var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true); - displacementLayer.CopyToShaderParameters!.LayerKey = key; + displacementLayer.CopyToShaderParameters!.LayerKey = key.ToString() ?? "this is impossible"; sprite.AddLayer(displacementLayer, index); sprite.LayerMapSet(displacementKey, index); - revealedLayers.Add(displacementKey); - return true; } } diff --git a/Content.Client/Hands/Systems/HandsSystem.cs b/Content.Client/Hands/Systems/HandsSystem.cs index f879e06a20..7e4484fde6 100644 --- a/Content.Client/Hands/Systems/HandsSystem.cs +++ b/Content.Client/Hands/Systems/HandsSystem.cs @@ -348,14 +348,16 @@ namespace Content.Client.Hands.Systems sprite.LayerSetData(index, layerData); - //Add displacement maps - if (hand.Location == HandLocation.Left && handComp.LeftHandDisplacement is not null) - _displacement.TryAddDisplacement(handComp.LeftHandDisplacement, sprite, index, key, revealedLayers); - else if (hand.Location == HandLocation.Right && handComp.RightHandDisplacement is not null) - _displacement.TryAddDisplacement(handComp.RightHandDisplacement, sprite, index, key, revealedLayers); - //Fallback to default displacement map - else if (handComp.HandDisplacement is not null) - _displacement.TryAddDisplacement(handComp.HandDisplacement, sprite, index, key, revealedLayers); + // Add displacement maps + var displacement = hand.Location switch + { + HandLocation.Left => handComp.LeftHandDisplacement, + HandLocation.Right => handComp.RightHandDisplacement, + _ => handComp.HandDisplacement + }; + + if (displacement is not null && _displacement.TryAddDisplacement(displacement, sprite, index, key, out var displacementKey)) + revealedLayers.Add(displacementKey); } RaiseLocalEvent(held, new HeldVisualsUpdatedEvent(uid, revealedLayers), true); diff --git a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs index aa9c4ccce7..c63112243e 100644 --- a/Content.Client/Humanoid/HumanoidAppearanceSystem.cs +++ b/Content.Client/Humanoid/HumanoidAppearanceSystem.cs @@ -1,3 +1,4 @@ +using Content.Client.DisplacementMap; using Content.Shared.CCVar; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; @@ -16,6 +17,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MarkingManager _markingManager = default!; [Dependency] private readonly IConfigurationManager _configurationManager = default!; + [Dependency] private readonly DisplacementMapSystem _displacement = default!; public override void Initialize() { @@ -369,6 +371,11 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem { sprite.LayerSetColor(layerId, Color.White); } + + if (humanoid.MarkingsDisplacement.TryGetValue(markingPrototype.BodyPart, out var displacementData) && markingPrototype.CanBeDisplaced) + { + _displacement.TryAddDisplacement(displacementData, sprite, targetLayer + j + 1, layerId, out _); + } } } diff --git a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs index 4a741074c9..aeb8d6716f 100644 --- a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs +++ b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.DisplacementMap; using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Inventory; @@ -99,6 +100,12 @@ public sealed partial class HumanoidAppearanceComponent : Component [DataField] public ProtoId<MarkingPrototype>? UndergarmentBottom = new ProtoId<MarkingPrototype>("UndergarmentBottomBoxers"); + + /// <summary> + /// The displacement maps that will be applied to specific layers of the humanoid. + /// </summary> + [DataField] + public Dictionary<HumanoidVisualLayers, DisplacementData> MarkingsDisplacement = new(); } [DataDefinition] diff --git a/Content.Shared/Humanoid/Markings/MarkingManager.cs b/Content.Shared/Humanoid/Markings/MarkingManager.cs index f45e6cf060..e844dc2280 100644 --- a/Content.Shared/Humanoid/Markings/MarkingManager.cs +++ b/Content.Shared/Humanoid/Markings/MarkingManager.cs @@ -62,12 +62,12 @@ namespace Content.Shared.Humanoid.Markings string species) { var speciesProto = _prototypeManager.Index<SpeciesPrototype>(species); - var onlyWhitelisted = _prototypeManager.Index(speciesProto.MarkingPoints).OnlyWhitelisted; + var markingPoints = _prototypeManager.Index(speciesProto.MarkingPoints); var res = new Dictionary<string, MarkingPrototype>(); foreach (var (key, marking) in MarkingsByCategory(category)) { - if (onlyWhitelisted && marking.SpeciesRestrictions == null) + if ((markingPoints.OnlyWhitelisted || markingPoints.Points[category].OnlyWhitelisted) && marking.SpeciesRestrictions == null) { continue; } diff --git a/Content.Shared/Humanoid/Markings/MarkingPoints.cs b/Content.Shared/Humanoid/Markings/MarkingPoints.cs index a5bcca9706..6b1696849f 100644 --- a/Content.Shared/Humanoid/Markings/MarkingPoints.cs +++ b/Content.Shared/Humanoid/Markings/MarkingPoints.cs @@ -1,6 +1,5 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Humanoid.Markings; @@ -8,13 +7,23 @@ namespace Content.Shared.Humanoid.Markings; [Serializable, NetSerializable] public sealed partial class MarkingPoints { - [DataField("points", required: true)] + [DataField(required: true)] public int Points = 0; - [DataField("required", required: true)] - public bool Required = false; + + [DataField(required: true)] + public bool Required; + + /// <summary> + /// If the user of this marking point set is only allowed to + /// use whitelisted markings, and not globally usable markings. + /// Only used for validation and profile construction. Ignored anywhere else. + /// </summary> + [DataField] + public bool OnlyWhitelisted; + // Default markings for this layer. - [DataField("defaultMarkings", customTypeSerializer:typeof(PrototypeIdListSerializer<MarkingPrototype>))] - public List<string> DefaultMarkings = new(); + [DataField] + public List<ProtoId<MarkingPrototype>> DefaultMarkings = new(); public static Dictionary<MarkingCategories, MarkingPoints> CloneMarkingPointDictionary(Dictionary<MarkingCategories, MarkingPoints> self) { @@ -26,6 +35,7 @@ public sealed partial class MarkingPoints { Points = points.Points, Required = points.Required, + OnlyWhitelisted = points.OnlyWhitelisted, DefaultMarkings = points.DefaultMarkings }; } @@ -44,8 +54,9 @@ public sealed partial class MarkingPointsPrototype : IPrototype /// use whitelisted markings, and not globally usable markings. /// Only used for validation and profile construction. Ignored anywhere else. /// </summary> - [DataField("onlyWhitelisted")] public bool OnlyWhitelisted; + [DataField] + public bool OnlyWhitelisted; - [DataField("points", required: true)] + [DataField(required: true)] public Dictionary<MarkingCategories, MarkingPoints> Points { get; private set; } = default!; } diff --git a/Content.Shared/Humanoid/Markings/MarkingPrototype.cs b/Content.Shared/Humanoid/Markings/MarkingPrototype.cs index ead061dd39..a6c578015a 100644 --- a/Content.Shared/Humanoid/Markings/MarkingPrototype.cs +++ b/Content.Shared/Humanoid/Markings/MarkingPrototype.cs @@ -32,6 +32,13 @@ namespace Content.Shared.Humanoid.Markings [DataField("coloring")] public MarkingColors Coloring { get; private set; } = new(); + /// <summary> + /// Do we need to apply any displacement maps to this marking? Set to false if your marking is incompatible + /// with a standard human doll, and is used for some special races with unusual shapes + /// </summary> + [DataField] + public bool CanBeDisplaced { get; private set; } = true; + [DataField("sprites", required: true)] public List<SpriteSpecifier> Sprites { get; private set; } = default!; diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_facial_hair.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_facial_hair.yml index 066d197223..67e686999a 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_facial_hair.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_facial_hair.yml @@ -2,6 +2,7 @@ id: VoxFacialHairBeard bodyPart: FacialHair markingCategory: FacialHair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_facial_hair.rsi @@ -11,6 +12,7 @@ id: VoxFacialHairColonel bodyPart: FacialHair markingCategory: FacialHair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_facial_hair.rsi @@ -20,6 +22,7 @@ id: VoxFacialHairFu bodyPart: FacialHair markingCategory: FacialHair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_facial_hair.rsi @@ -29,6 +32,7 @@ id: VoxFacialHairMane bodyPart: FacialHair markingCategory: FacialHair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_facial_hair.rsi @@ -38,6 +42,7 @@ id: VoxFacialHairManeSmall bodyPart: FacialHair markingCategory: FacialHair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_facial_hair.rsi @@ -47,6 +52,7 @@ id: VoxFacialHairNeck bodyPart: FacialHair markingCategory: FacialHair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_facial_hair.rsi @@ -56,6 +62,7 @@ id: VoxFacialHairTufts bodyPart: FacialHair markingCategory: FacialHair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_facial_hair.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_hair.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_hair.yml index 8748b3a093..7fc3fedaa2 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_hair.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_hair.yml @@ -2,6 +2,7 @@ id: VoxHairAfro bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -11,6 +12,7 @@ id: VoxHairBraids bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -20,6 +22,7 @@ id: VoxHairCrestedQuills bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -29,6 +32,7 @@ id: VoxHairEmperorQuills bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -38,6 +42,7 @@ id: VoxHairFlowing bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -47,6 +52,7 @@ id: VoxHairHawk bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -56,6 +62,7 @@ id: VoxHairHorns bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -65,6 +72,7 @@ id: VoxHairKeelQuills bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -74,6 +82,7 @@ id: VoxHairKeetQuills bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -83,6 +92,7 @@ id: VoxHairKingly bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -92,6 +102,7 @@ id: VoxHairLongBraid bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -101,6 +112,7 @@ id: VoxHairMange bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -110,6 +122,7 @@ id: VoxHairMohawk bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -119,6 +132,7 @@ id: VoxHairNights bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -128,6 +142,7 @@ id: VoxHairPony bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -137,6 +152,7 @@ id: VoxHairRazorClipped bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -146,6 +162,7 @@ id: VoxHairRazor bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -155,6 +172,7 @@ id: VoxHairSortBraid bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -164,6 +182,7 @@ id: VoxHairShortQuills bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -173,6 +192,7 @@ id: VoxHairSpotty bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -182,6 +202,7 @@ id: VoxHairSurf bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -191,6 +212,7 @@ id: VoxHairTielQuills bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -200,6 +222,7 @@ id: VoxHairWiseBraid bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi @@ -209,6 +232,7 @@ id: VoxHairYasu bodyPart: Hair markingCategory: Hair + canBeDisplaced: false speciesRestriction: [Vox] sprites: - sprite: Mobs/Customization/vox_hair.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 4703bfd06b..94b5cebf26 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -11,10 +11,6 @@ - type: Body prototype: Vox requiredLegs: 2 - - type: HumanoidAppearance - species: Vox - undergarmentTop: UndergarmentTopTanktopVox - undergarmentBottom: UndergarmentBottomBoxersVox #- type: VoxAccent # Not yet coded - type: Speech speechVerb: Vox @@ -108,6 +104,16 @@ sprite: "Effects/creampie.rsi" state: "creampie_vox" # Not default visible: false + - type: HumanoidAppearance + species: Vox + undergarmentTop: UndergarmentTopTanktopVox + undergarmentBottom: UndergarmentBottomBoxersVox + markingsDisplacement: + Hair: + sizeMaps: + 32: + sprite: Mobs/Species/Vox/displacement.rsi + state: hair - type: Inventory speciesId: vox displacements: @@ -167,6 +173,12 @@ species: Vox undergarmentTop: UndergarmentTopTanktopVox undergarmentBottom: UndergarmentBottomBoxersVox + markingsDisplacement: + Hair: + sizeMaps: + 32: + sprite: Mobs/Species/Vox/displacement.rsi + state: hair - type: Body prototype: Vox - type: Inventory diff --git a/Resources/Prototypes/Species/vox.yml b/Resources/Prototypes/Species/vox.yml index 8501784b89..fd458b40f8 100644 --- a/Resources/Prototypes/Species/vox.yml +++ b/Resources/Prototypes/Species/vox.yml @@ -37,7 +37,6 @@ - type: markingPoints id: MobVoxMarkingLimits - onlyWhitelisted: true points: Hair: points: 1 @@ -45,34 +44,43 @@ FacialHair: points: 1 required: false + onlyWhitelisted: true Head: points: 1 required: true + onlyWhitelisted: true Snout: points: 1 required: true defaultMarkings: [ VoxBeak ] + onlyWhitelisted: true Arms: points: 4 required: true defaultMarkings: [ VoxLArmScales, VoxRArmScales, VoxRHandScales, VoxLHandScales ] + onlyWhitelisted: true Legs: points: 4 required: true defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ] + onlyWhitelisted: true UndergarmentTop: points: 1 required: false + onlyWhitelisted: true UndergarmentBottom: points: 1 required: false + onlyWhitelisted: true Chest: points: 1 required: false + onlyWhitelisted: true Tail: points: 1 required: true defaultMarkings: [ VoxTail ] + onlyWhitelisted: true - type: humanoidBaseSprite id: MobVoxEyes diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/hair.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/hair.png new file mode 100644 index 0000000000000000000000000000000000000000..d52d859ebe943edfdd75fdc0c5872a50eca91354 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zMLk^{Ln`LH zoq3S!hyoAm<4yN<FUh};E1Rx#$=S!aBj4}s!l$VnD{owyHFuk#z7<0+%LT>^l?FZs zWyTVQS=+xKytXE0-SoTOJFFf={drNRx-FjR9-qbgcj1TbGVWg#u6OUunl*6;bY=ln zOK~n>zTm+i+u+9Zg26<{fqlV526O}e7nZg59lK+%rnd6_;y-V#9Y9KNb92mhbpJlT zplrvrceU;xHt@Y|*!M&IMeCVQKZIsX6pDS*F-7vh#0i0WX0|1)Y3R9|@<o8>KUa@R y#dC*}jmkmO8kQRyb(vr0nZQ7V6W+4cFqj|EZNAZR^&v2{7(8A5T-G@yGywpde2Rep literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json index 228f934114..0c910f85e5 100644 --- a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json +++ b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "jumpsuit state made by PJB3005. back, hand, head, and eyes states made by Flareguy, ears, hand_l, hand_r and shoes made by TheShuEd", + "copyright": "jumpsuit state made by PJB3005. back, hand, head, and eyes states made by Flareguy, ears, hand_l, hand_r, hair and shoes made by TheShuEd", "size": { "x": 32, "y": 32 @@ -38,6 +38,10 @@ "name": "shoes", "directions": 4 }, + { + "name": "hair", + "directions": 4 + }, { "name": "hand_l", "directions": 4 From 5fa93d6974989b1af39fa588f22128fb6a8266c1 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 21:02:56 +0000 Subject: [PATCH 466/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7920b8d701..57f4092f2d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Tayrtahn - changes: - - message: Sentient goats now have a bleating effect when speaking. - type: Add - id: 7787 - time: '2025-01-08T01:00:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34273 - author: southbridge-fur changes: - message: Warm light bulbs exist now. @@ -3905,3 +3898,10 @@ id: 8287 time: '2025-04-20T20:55:42.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35986 +- author: TheShuEd + changes: + - message: Voxes can now use any standard human hairstyle. + type: Add + id: 8288 + time: '2025-04-20T21:01:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35938 From b7dfd60517568012e9de942533fe8fb92ea170ab Mon Sep 17 00:00:00 2001 From: Booblesnoot42 <108703193+Booblesnoot42@users.noreply.github.com> Date: Sun, 20 Apr 2025 17:09:00 -0400 Subject: [PATCH 467/622] Resprite main altars (#35685) * resprite main altars * updated meta.json --- .../Altars/Gods/nanotrasen.rsi/chaos.png | Bin 349 -> 734 bytes .../Altars/Gods/nanotrasen.rsi/druid.png | Bin 354 -> 695 bytes .../Altars/Gods/nanotrasen.rsi/meta.json | 2 +- .../Altars/Gods/nanotrasen.rsi/nanotrasen.png | Bin 393 -> 531 bytes .../Altars/Gods/nanotrasen.rsi/satana.png | Bin 301 -> 581 bytes .../Gods/nanotrasen.rsi/space-christian.png | Bin 313 -> 582 bytes .../Altars/Gods/nanotrasen.rsi/technology.png | Bin 290 -> 607 bytes .../Altars/Gods/nanotrasen.rsi/toolbox.png | Bin 312 -> 596 bytes 8 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/chaos.png b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/chaos.png index 40f48b11fb7a67dfb32732e1841e13cbeadb5c88..b09fd8d3552f2b431b9fc77d91f24c1096bae5c2 100644 GIT binary patch delta 721 zcmV;?0xtdC0^S9X8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00NjvL_t(oh3%KWixWW< z$G>yz6)C((s>l^lugG$sm#jZP)I#j+QbbZ1i$ug@i;y6JL;MG>xR4?!Vy-Y(9G4=0 zL;`|`o0y<%3iS?@yJ|6lZjnGNWF|Aad%GJ*u<$<3&c2y>?|-{*-<wT<Q%?EcApmeG zerxQtP?n?6^}a8se%JQeEh0r$*2Z+xv@E8h7}lHvdHJIPC95%(RMDwdT%FV4@AI#5 z1&?g&_@`Hb3bcWSV%Wsyalj^Sf!`QQs;;U5psO{J%NJPCVXco`zJRXQ^xRtvn<$1& z!6sy&Q?GbBsejfQ$fgr0m$sNKn@*rwYq;*CPY(d{*%JgTrrqCLEUBVg+CsUsg|61b zW#u-z0ua*7qXZS<{x^O(3vheqv80MO8!2ET1pq846~VZ7RS=;KG@CE^+~h$80am5_ z=1#qWhnT!3zZr1M>i%RX2;c)+#ZVEsd;!^XLI~c~nt!O)8rbCOg2$Fww=VGN1gC<d zh3N+E0M9P)5<t^UGo%C+R+wI}bAamt5?NUrFD;$%brM>SS9-`;@$0MCZV`z$xZ&i~ zDY##M6hglRfq=b#=Y?tht%JkQABZ#>4FLe7k%ZxJ1bR<JQDLTO&UBvIg)aCPuo{TR zV*r5TqkkiO`FdbmIIsBy0C@iFDRjLLUGL+^;3qC#I4^8g*E4gQCof-Zk1H>>g(}ze zK4dwHyLWB^0Om2Tu4nM%afYy;WY#w0+sH5sOiL&fVq+)Yy>^QLE=4HIQODlj+ugz5 z?hYGUZGL?4NUpOE+)q8Qjd|O&Ox1?p4nDFgKT76p^xiKg)&S+k^=nf(<azsU-_g$3 z0HMa^$g1amgIV$Y@Dqzmtdq-;)iGbev%)Y8Au#0+^BjG_;bYkN00000NkvXXu0mjf Dgymj& delta 333 zcmV-T0kZzy1>FLW8Gi!+002a!ipBr{05(ueR7JqRz(Ge%EipVKBPqPMrJxBSl8S9g z01PDt0Bd7NT2eVvSX~(y9#vUm8y_muB^&rqM~;t}vE3;o00001bW%=J06^y0W&i*H z)k#D_R5*>@li?DBAPj?{5p)dEz5mND)xvZ;+<q@=dZwQ}^ncK~|B(06llSaH`@=9; z7Od`x#|{iJM!gSX2)v{v6^PSqij2nq9;39R0da~7Y<=hiODd2!FbT&809q`0O-Lz4 z0c-+bNdrJ0EVc%;qyl^x>h>0BNdru}g1u9})EgkW!b5)t?q}lEzi+^m6u8z;K+YLm zCy=?C+;!(z=SEpF?bAtc$LQ@$E6Y*}&rMrGa}}V<QI?&7wXADV?*ZQ?JdQd7uDk0+ f>aX#oeGNPTMQjmBV*tKp00000NkvXXu0mjfwJC_Y diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/druid.png b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/druid.png index 99c097fe73bf25a90cbf5a11ec58e279e1f4e919..2a6411a30e472b5841dec20f643c2c61182af830 100644 GIT binary patch delta 682 zcmV;b0#*Iu0=ET_8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00MDIL_t(oh3%I=XcJ)= zho7?n36fZ-CdFbBA`VSxz@h5UkdnbcsM%Ty4Tyu#$?OhxadA<RLU9lY1yN8?$RZX3 zU5p}y1PoMY6G{YA8?+^cK*Kr2JMOOcFX3t(e3pFozVH3sUw_{3yO4wb95I4fGMSBv zv9XwZ{oukg)B1imW>ruu6^RED!~+R3YqO%$25gbcM#W?{D!$xV5{*n`)@DufMhE~` z7H-(OX+K;5AT}1`^J}*pkEB|}0|^#$j{tCOT(Z=9yYNH+5H8=mCVJ1Dvh7%FB9dwW z-L10ISYr3<cYoeLej`|(0WDIKVyW17bCsS^qF$~7;2RC<n%EB)D3*#UQ@v<N=uV(s zuHqXF;u{UhBHDZ-Hw-`{H*8pAreSD6DmJ>QUak_^Tp_Z#0wAx=>do{l&w$Z4Xf$D~ zP^Zz<Z)!GnB?r!cog1a5=knXCYdx&=dVUI`sfnKAR(}{i1x9SIZ*lte9o_h$8PJZ= zs+ryWhd#EzX^z~03%b9{M`obDUIW1EAEf=OMSHI;C%yhbc|Ysrs-t<Ye-QXrwgBLM z`YZseg(^>1cMlXER^A2h?%o75)5~)3dOD^mTDt0SJpXFFyB0P++!AM|mzfNC<br%< zkEwKwxqqqdA5tgt`N|#u&tJ?DzW7iO0LDW@qEbLv=mdJ&A1gZom>j~%kcY{ThY@#2 z70+bn$z<o{wKgU(;_k>AW*AOD;>))m)LH|kB6^ItJDmUXsA;h^0X-H!-IYI;Yh_Hj zwu|KiPM$d4lc18H&9-h_IRW`qYdkdc*WP-h<|8TtN+a5X=LEIZfU2>?Z|Q<euMvUG Q#Q*>R07*qoM6N<$f=%i^761SM delta 338 zcmV-Y0j>VG1>ypb8Gi!+002a!ipBr{069=hR7JqRz(S%cg3ejB?3hlJWJZ8uDqd1e zJv%=wDkW<bUZr#wLqJ+17)=-rbUq{{1^{x?keuwbvvW%yPe_;m0004WQchC<K<3zH z0002jNkl<ZIE}rN>kfk;3`Qx|!no?*|6$i6ZZHGx*G^1RzJDG_Fsjtw0Il_0fMuB* zq8x_)G7;Abfaa<ffEpn3oZj=p&>B7gQZI<n&KrTK1Ox!JqfQ`13CI{QhCab55c`K< z!5%`%Ize`jwGV5h!CpYQDzBXtT<J^J-9k=wLhUctJi~P)wC@93!L^efbVZmU!knK3 z?>!AG3qFM4hf7r{A45vPbGg<KJ%2GV$vUOHZ8`H(C`n3DodT0vYSs&T-uEnZB;1|w kY-t4*$DF^$&3G=n0JlgP`gDK+>Hq)$07*qoM6N<$f&c=G#sB~S diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/meta.json b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/meta.json index e131857737..fe7729e8fe 100644 --- a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/meta.json +++ b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/TauCetiStation/TauCetiClassic/pull/5184/commits/7489ad4520ddf83968c467cd587bde2c821e10a6", + "copyright": "Originals taken from https://github.com/TauCetiStation/TauCetiClassic/pull/5184/commits/7489ad4520ddf83968c467cd587bde2c821e10a6, modified by Booblesnoot in https://github.com/space-wizards/space-station-14/pull/35685", "states": [ { "name": "nanotrasen" diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/nanotrasen.png b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/nanotrasen.png index 4e124a562480a447290102e98c2a538fb232a941..d33cc1e2cd1d8d65caf14a5b9662dc79eab52a0a 100644 GIT binary patch delta 517 zcmV+g0{Z=l1Cs=h7=H)`0001UdV2H#0004VQb$4nuFf3k0005aNkl<ZScUDE&npCB z7{@=uNE;i`wy~E{$i{Vx6f0Nc>`37sP$(DWN4YqPxVmm}P%g_wazv{f%!MU{gcaMk zm@zXuGiKY_x$wQrywCIWJfHWO=Y4D7U;p~+5&*jTCKbO6?|*ME3IJlLKB@rhZ7uj# zyt{vjP<>Rny-Eq9*->nnH!9l1<pg*4PvxwwV)NZZiIdYQnOC385x@>YwRr*YD?qU! zTmjh04k90@f&laoX1RqZ7@$xH$7ATWklB~dQ8WPfc^hf~Vp%!h&n;*u{9RWBI6vMY zR2TKF_-#7%1AmfveFEU&?t;&c4C)%7vMNkNOB{fUv!ti~ns6iF(J3fI+7PzKS^>CD zr#U%I<pdVXUjnc&H-mhTKt4#2kq>EWHO|A(Ky%Uj!piD~vOYgSTncK&r2LH3F-UJu zCjeghlkzhFBhyQaj}8k0KuoGt^a=EVUdSr<k$f+J!+sFPr66%BNF<Oo*vDqq7@J+w z-pw{ukw8|<;UwD*s5-xS<npc5F^QETfh<koYD=H14p?b<b60!n-}N?i?N+~bpsJ!g zuY`I%y}Vo6^&JpYV@#^`?cYExZUE4Om<P`bUA~nX3ak18yd(T{*GsB200000NkvXX Hu0mjf(hcyU delta 378 zcmV-=0fqjP1c?KX7=Hu<0001iRA<Kk001XYOjJd{z`%xxjdpp0Ras-0nw~vCN?Icr zO&ASyJ|r;=1e~I-#mCOGb4$-p)aw8M00DGTPE!Ct=GbNc003)xR9JLGWpiV4X>fFD zZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDSycTa*U0*I5Sc+(=$pS zoZ^zil2jm5DKV!cu}IHciHkEOv#1y-V#vjrR+N~V3SlcNxca$(4F&*eAsU3XstQ5? z005auL_t(2kz-(>3t$vdLIQ#e42H;jB}D@q0?JB8#>Pg-0!BuHhC;{!Kxrc-yaK}L z0*Yt?ib_ICLUXv>VS?gx5uktz3NT<WMg`aeLW7Z!0fT8;Dl#%)2+wE>>wu&500#Ds zj*QM#Ggr=>IkO|9qn!aH(9t;)41g?{z|P$>ckV<MKv&Uo1`Hqq4CTn6fB{tm%tsRd Y0Crb!pGgDP=l}o!07*qoM6N<$g3A(;umAu6 diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/satana.png b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/satana.png index e329908ae906b53ffea5d5d157c3be6ecd254169..04e6b485f07896b11db0a6ef37594690b67c5465 100644 GIT binary patch delta 567 zcmV-70?7TX0>uQ78Gi-<0047(dh`GQ00DDSM?wIu&K&6g00I9=L_t(oh3%HlYZE~j zhM!H7nn7%Yw1jOXt`%>J2JAufp!FZ{)_Vm}a@C9C)r)6A1bgqTe}VKM6fxkz+=RH4 z*0|JyO_0%KOFYP|6ZcmJH$kuuEW7i4Gw=Jt><$Y@9Pz(n0e@VmT^mf=`2D-r7C`Rw z*^3i52T;EGxCvj{+W^ek)uH;z{9df+`lq>(G<0GEM4`-2z3PX0JIe)D=J!G&(#RRj z*37pH)4>%NYAgYEmJ0w>`@P`O>!yUZK<(R~<5{~(qvdgVu@Y<6Xn9baOVmgWkVd2B znJ!5r6hNhnN`Kw#*_@wl$BH$3HlmoUks2V4X3sWVl1OZTsMKPnjO^^kiiw$Ws>a9x zMm70cj6cJy$pdscU4#%5GnG>Q4&eL0PB7ok)9?GJF@O*v2qvY>w6E&_#ufn7YL@`` z+-}qQ=!PbatDggS{OCUJ)&}m@2H)K`ES_<O7T52sj(@FhJ%6z_c=_Z3*PRnVantSM zT)D-~8&?6yvcKte0l59}DR=LzS{A^PQy%C7`ot`V(thjiTaa)NsYM^Wuk6aHpkDV% z06eQ4Q1?o~UDXr|;*fKdld0j1PeR>9J?k}7j6TD)LNU1O&w5RbM<w<hP?U}zGZNG} z`1T{Rt}wp?mMShe<%#{CEAycMdXNQin7Qe$oEkD#`~($E2kf?c<S76E002ovPDHLk FV1nYB9ZLWJ delta 285 zcmV+&0pk9}1g!#)8Gi!+002a!ipBr{05DKYR7JqRz(Ge%EipVKBPo<rHJ}M1f(|H6 z7!6ZcT^Sf2S|b>AJ|rau0MjKK_)tf)b4$<CJe&Xk00DGTPE!Ct=GbNc0065=L_t(I zjop*c4uc>JMX42PDYF0n+Z9GLCxYASPRvcbJs}NI=l%nLWq$;K&T%|f15H3IxxRQ8 zCt+QEp&HkM_aOu|em?;#3$-1{icT;(0RU021KS*}IPZYQ#gfo8o42A0+vKXZD$FRt zoUa6C#$l?!F-9Jyb4*brvPPegSicyO@-CA0JtciAwGkm_f|8E3?o-Gq=Tvee+@0_^ jaughmv0vk6JQf$8K7tVd<qd*a00000NkvXXu0mjf6-#Yn diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/space-christian.png b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/space-christian.png index 0ca2057903bf1ed9a9315a0c21ec558e9731ba3a..5bb731afa75eb7a48b12c22b49c236456eedef46 100644 GIT binary patch delta 568 zcmV-80>}Ni0>%W88Gi-<0047(dh`GQ00DDSM?wIu&K&6g00IC>L_t(oh3%KWOB-Pr z$3Lgh<c!)vB2t1F1VuV(41$Y;e?lB|7M=P(6h|jZhYo@`StvqhTPYb@khY61Y6J;r z1|=!2Mlb$IuS0sT?<IGai@B(S9|-s4`@H!+Pu}N#B=E!&Wq&Ns4(TW9RegDONWTxi zCM$7gbK8sBuKauet9^r_yTbqD^<mbe-xWK*>4RMbpy~CC-ijjm(_FoEtNIyrO(Q5w zw9y?K2B4)UOktwU)-<JQ;$?>$KVP|U^l@FpEj?jdbGKCUGc^#{xFCSk<=%y9vE8?o z^#N6N?FTkj!GC>HF#;z>+dD+OnLo4Ce-&>U*MOaQtwm)Xd;|~PKusf%sb}t<G*C}b zna42#r`u`68~Ap93cy&flfBCV*_$ho91C`eJ6lTAJk5uFt-xa$0l?%NfB;{&VD0Ty z#llAAeE^@nbP-S7KC@?DwVD=9efUc}k@qy8d{>GU{eS0x9#7;LkKSI_$@Cd33+=q@ z^8?^zKAA2(L%y$tP+}=X0T_vfblE^&=ml2ZKhn9<Pco+ujYm6(s6~@LH^0Q({E~>v zHG_y+6dq34?tsDm@ozF(v!jU>5w%Ev_jAjfs~xan@%?9Ulw(;l-n*sh4m=C`YciDi zbAD;5%P~8k7~)7Y<jFrFHyFiD4akj@pLkx7(V9(#4gLXB7Zd0!T}ku+0000<MNUMn GLSTZ~wFaF4 delta 297 zcmV+^0oMM;1i1o`8Gi!+002a!ipBr{05(ueR7JqRz@BC@>folqsCc<jJ*FZknModk z4k)#nW!P&$Ya=OIBN$B>4Rk&vF$@I0oQ&1Hu(NYZ8?>k^00001bW%=J06^y0W&i*H zu}MThR5*>zlhF=?APfNMte}OW`~RO^0lR@4xVP<MYB(;02Y)r@Pk<YY9ZVmBr$d}! zvh$hb5M|$?EEWx%a~dRvE(fqI0H>fh4Xm|Lb_*%U?g&)YL3tm6f{0>ezDyf5m;7B& z-%x|KQ4P4}U_=VWd=(Ip>rM&Cdr#eI3<b~ZNyhv1f#iz`oYu^7+hUX_lMQn)8VIrG vaBZ;1eNUqsTq2!tuc-qQ`shz`u{{nR!|oY5TnMm~00000NkvXXu0mjff2?}| diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/technology.png b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/technology.png index 6b0ead84822eec48f4cdd644b0596fb918cb325e..c668647d811da182b89be92255289a14ee8029a1 100644 GIT binary patch delta 594 zcmV-Y0<Ha`0^bCX7=H)`0001UdV2H#0004VQb$4nuFf3k0006RNkl<ZScUDEy=xRf z7{-5dtWog<S;OLrHX`mK7KfUcGll<v*jb3DV57$s0fm%SR$^xnjI9YN?D8L^2q!AC zg~%QxA{y9mdV}B<ejHhgxa)r0*DSX|Fi$n_$3D+H^Umz-!hbGy@xMcqrf+ca+HHTQ zh1Zsz3TO2hTJfmi14yqKOVCYYWMbX8|L6)WFVSAS$zrr_Nxcv}teZxRC~6PlNyfDv zd3_0_*QBv<KlE9Z2dSclML|^@h>1t-EG<+jAedogaXID>>?|vw+ya1g$BPxQ?s!>f zvK1h`Cc0^)M1Ql)9wIFmhCnxso_+2Yiz2C`v<LD)tOd!lJu38DU8NUMR`lc60KU9^ zotyX|XaJqo24kl#veo)Xr?v4nc=#COXU+rL%Q)&d`~#aXEa39^XRcWLF}1H<6Z48| z01xk7r&^l{owjY^bq<C0-E#-1))sP!i`DuYzgnBYwtuZK!F3zlx>@1E)Fc3T#GlMP zX1aV<h^td2+#f|hnh+!fkW!)wUDsnXPIB9O+v52PheGqiT2}(wwo(rQlxOED&(4SA zq;D7wfIwIIGO9nilNv{Ts!%$H!4+ItT#k*SzT~&UAc#vxib%7R+5-W~lM_mWQPf|) z>gsph21~l<h?ULub^&911n&yRckJKb^wuZw^Ow)cW*Y%u9o!cN+xiJVx`RgrDJ4bu gUIcdI+jjtd1BZD2#eG&G&j0`b07*qoM6N<$g1FWg`v3p{ delta 275 zcmV+u0qp+Y1fl|v7=Hu<0001iRA<Kk001OVOjJd{z`$g&%2SiTLUOJxF+6v~+&f5e zRas*jA1YLo!+5pfj*pmIKTAgd0004WQchC<K<3zH00022Nkl<ZD3N1epbKCWQbGcP z3=D?K#zru%v9Y27Pyk7RGDrZ-FfukW1~K3Q$}Y~z$O1|#E`KgcC@NH4Tv1dgD}@HZ z1(d;t0_}v^f?+MX!%R_}E(#O~MF9p3#;5?BKw2^~GGH)saYIH13@Pp<DdlkFlEA=H zUhZBovtvd_M@PAPc?knZpuD0341g?{z=~BJD^?&2psT3f4F(Va1{Y-Dz<??O=A#J! Z0Py5xd462;WeflS002ovPDHLkV1i1XV^078 diff --git a/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/toolbox.png b/Resources/Textures/Structures/Furniture/Altars/Gods/nanotrasen.rsi/toolbox.png index f1047b794f1238139cfe130eb01a55c6e1331b56..9a4c034bb982331b3d21b23049bb67e75685aa48 100644 GIT binary patch delta 582 zcmV-M0=fOT0@MVM8Gi-<0047(dh`GQ00DDSM?wIu&K&6g00It4L_t(oh3%KYY7<cy zg}<>8o0?#;LM<s~M$i|CL5mco$m~nEZlprn7bt{+n-)sIjY~1qUD1^<5QG62EtGkJ zZW2go3sIDev_(U@2zPpCax+dkV_ev?$-U>lIp@rO{|N-HaDRpW9U4HXRO$@dxLhu4 z04d9|BAIXROp=*40XW(#_tfteO8~eHo98pfzMA7W6bc0&XIWOKTCHlSppfG@-dcP~ zHV+yG17)U7ws*QAWG%4{2D#SrD2hYw;Vy2&R+<O*Zo|es+*Qdc(bIvTxi5$mA_|0- z>I(V>=xeTcs(&w^UNO6{F;J*W2gpo4>EUJ<HkAAzSD>7MIH3kbtSd+Ykpeu*f4hXV z5kG*K-mo_#F8T&Y(lksf)(|Fv6!?FBhaRBSY5`yv2F+#@u@_uEp9i2`uP0hJjP8*B z^DFQI{AP^tJNLLgdRuw$Z`D%(FBX^B+FbR>QT;K$PJb`nef|DJK7XtvS{KmXzI)%< z+FZrdvmR;JTIe(LJezw8K$3O4)}4WuYp+>ZTGTXvqCU})1>}QCK&8D``>H|65Sn@x zQ_qr1w|)HbdWGfnink7O0=abC(+ES~4hZZYf9K$2BveF&T)NGJ$#G>ZQU_Fc^P%c} z%4?Yu`#-4oV+U^CyfKiVj2}PGl)T&lO^`)>Vrc&jgt;$(93(h+N#NjQ#AhsU4qrO& Um-P+<bN~PV07*qoM6N<$f-r>&H2?qr delta 296 zcmV+@0oVT21h@i_8Gi!+002a!ipBr{05(ueR7JqRz=nv8c6owTSz|R%nKF&K9t}Yw z9COsv)R>x{JwQrYBN$B>4Rk&vF$@HpqOQfq&a-n%+j4?C00001bW%=J06^y0W&i*H zut`KgR5*>@lTi+XAPhjkg3LmZ-T$&{K^ap)zxU7*+9yqjD1Y@IXg&4Nn(I*O#@bo1 z*2ogXfFb}uuG@KgjifkP1<{=t1>+9FRD>_?(4q*LSD7w_^6g-UXDwX61+<(6I2~gZ zmcdakSr{S0m`4I4LN~I2-h1pur7(CRj~vd?2jo8{kgSQ~y2i*)CTEC(+65-IY`I?{ u#gw8%9+$%14k7QBR#2hOel>2&W8nj)0Tj6O=;b8<0000<MNUMnLSTZ*2!7=N From 1fadb31f47e15b9a715877bbb10f90313ec16c4d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 21:10:07 +0000 Subject: [PATCH 468/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 57f4092f2d..1a910cf3ba 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: southbridge-fur - changes: - - message: Warm light bulbs exist now. - type: Add - id: 7788 - time: '2025-01-09T08:54:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34324 - author: deltanedas changes: - message: Fixed AIs not being able to use lockable buttons. @@ -3905,3 +3898,10 @@ id: 8288 time: '2025-04-20T21:01:50.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35938 +- author: Booblesnoot42 + changes: + - message: The sprites for the main chapel altars have been adjusted. + type: Tweak + id: 8289 + time: '2025-04-20T21:09:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35685 From 1220b8c4c7841daaefba50a22d5374ecf1c19b21 Mon Sep 17 00:00:00 2001 From: UBlueberry <161545003+UBlueberry@users.noreply.github.com> Date: Sun, 20 Apr 2025 17:15:34 -0400 Subject: [PATCH 469/622] Adds beanies to the WinterDrobe! (#32946) * sprites * messing with the ymls * new sprites * that's a lotta yaml * make the sprites gooder * color adjustment * to the winterdrobe with you * layering fix --- .../Inventories/winterdrobe.yml | 1 + .../Entities/Clothing/Head/hats.yml | 37 ++++++++++++ .../Hats/beanie.rsi/body-equipped-HELMET.png | Bin 0 -> 673 bytes .../Head/Hats/beanie.rsi/body-icon.png | Bin 0 -> 626 bytes .../Head/Hats/beanie.rsi/body-inhand-left.png | Bin 0 -> 661 bytes .../Hats/beanie.rsi/body-inhand-right.png | Bin 0 -> 667 bytes .../beanie.rsi/cuffcrown-equipped-HELMET.png | Bin 0 -> 859 bytes .../Head/Hats/beanie.rsi/cuffcrown-icon.png | Bin 0 -> 697 bytes .../Hats/beanie.rsi/cuffcrown-inhand-left.png | Bin 0 -> 761 bytes .../beanie.rsi/cuffcrown-inhand-right.png | Bin 0 -> 743 bytes .../Clothing/Head/Hats/beanie.rsi/meta.json | 56 ++++++++++++++++++ .../beanie.rsi/pompom-equipped-HELMET.png | Bin 0 -> 625 bytes .../Head/Hats/beanie.rsi/pompom-icon.png | Bin 0 -> 553 bytes .../Hats/beanie.rsi/pompom-inhand-left.png | Bin 0 -> 612 bytes .../Hats/beanie.rsi/pompom-inhand-right.png | Bin 0 -> 615 bytes 15 files changed, 94 insertions(+) create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-inhand-right.png diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml index 8909fb163f..510257c045 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml @@ -16,6 +16,7 @@ ClothingOuterFlannelBlue: 2 ClothingOuterFlannelGreen: 2 ClothingOuterCoatBomber: 3 + ClothingHeadHatCanadaBeanie: 4 ClothingHeadHatSantahat: 2 ClothingHeadHatXmasCrown: 2 ClothingUniformTurtleneckColorWhite: 2 diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 64d55a2dd9..2477e1e996 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -523,6 +523,43 @@ map: ["foldedLayer"] visible: false +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatCanadaBeanie + name: beanie + description: Red, white and snug. It radiates a homely feeling, if your home happens to be chilly and filled with coffeehouses. + components: + - type: Sprite + sprite: Clothing/Head/Hats/beanie.rsi + layers: + - state: body-icon + - state: cuffcrown-icon + color: "#a60b0b" + - state: pompom-icon + color: "#a60b0b" + - type: Item + inhandVisuals: + left: + - state: body-inhand-left + - state: cuffcrown-inhand-left + color: "#a60b0b" + - state: pompom-inhand-left + color: "#a60b0b" + right: + - state: body-inhand-right + - state: cuffcrown-inhand-right + color: "#a60b0b" + - state: pompom-inhand-right + color: "#a60b0b" + - type: Clothing + sprite: Clothing/Head/Hats/beanie.rsi + clothingVisuals: + head: + - state: body-equipped-HELMET + - state: cuffcrown-equipped-HELMET + color: "#a60b0b" + - state: pompom-equipped-HELMET + color: "#a60b0b" - type: entity parent: ClothingHeadHatWizardBase diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..06452941bb256d4f511bc5afa52b5d431bc4cc87 GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1quc!5f|~jv*C{Z*MyCwJ7i~IQ;*w zUH@4BPC<rKhy(wEl;hkJm2%x}H|ppy^|M|py}Ld4_UDfu)i&Ern6+=!UX%K*Ww&;I zxt4u&`=hPt?~h#iw^U~9jk$Z5M+)zcjVs9dr@!w&hLyl4!z4E*77hUghXw{lY>Z!= zdkPJHx}BSxFz3{<il_^jO7<eYJFS;$=1cSLpY$i-+J&e#HEWYwyJUlItN+{Gc7(^& kEJ{EPmvJ0l1b;A=<Sn>*dDg>vpdT4LUHx3vIVCg!0JH=e&Hw-a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-icon.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eaee6101490a2343cf45a7fcfb7a7fcb41ddedf3 GIT binary patch literal 626 zcmV-&0*(ENP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004QX+uL$X=7sm z04R}lk<TjxVHn3hyNFmRHc1Y9SaLw3<fv6#aM)dCaoHI&yJ~+-GrMVXRW1%&4&vh1 z!GFM2xl&4zk{q4=x@a5EYt%~Xo!)sqec$){^vrj_Ka<h3PW=RAa|Js(9SJQY7DJ8C zG}B2tL57mLW6j2<;{3ZlZt<ylGpKs~f3N0hSuq?Pd`-e*x@8xHWg2GI3YOw6;h>&Q zt_U9p57;uG@TJl<kDnB$JbqJb$D@<rS3N_iU#$INJ#A-&`-Q{VOi}-tM}0}a$j!&3 zcFXR;A<8rnLTD6OB}0KhsX584wr}{`H%DGPy1Xq)*y2c$7Vm(lMd@ltHAOe%$xu?c z|IO1eM@PKwfe17_y6$T)G;Tws?7E+au3I^Rx(7JVRsDI%Y5ZOEa#aiOL)!+NUQ{)0 z2hKL3>)uM*$#1Dnw%;`2<pf$2&~XjTOI}t#=N#Wbd|iIg73}UopWJU-{sK)IXe|@v zdPD#K010qNS#tmY4`BcR4`BhQKc{H`0062<L_t(o3GI@-4MQOegn3bhpk)JE#$Zy$ zpk)JEwn#A2Nv<9yN)zSW*dYI$KX8sl0wh2JB=GM9u1^58)?QNAdv__N)uPtwLI~?F z=WOo#I2BMzS;Oz@#u(ci)ISkeJT^xzwwJSPuT4aF@3$n52nceRj&Ua*LZ$#`p>-rc z57M!`KWuJ|(B!v>OkHM@JdggALLkQYwf<He%p(C3AOR8}f!`zW2B3p9OIcE0TL1t6 M07*qoM6N<$f^I|-(f|Me literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-inhand-left.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..342bdde96601d3d1440bb23a86c361583601fd98 GIT binary patch literal 661 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1quc!84vNjv*C{Z*QLFZ8i{Kbx`+W z4sqcA65krVfXPeYR<r&@4z5pZ^2fxFy#HzVXxq{V77hUghXw{lCKQIjyaT(|RlBVY zcgr}vX6w7tn{00V)IVNfK5zcAl{vS=o>lIfQoJqw`i1kC!tMX9+437jGrDm-$`_us zMD|uawKwK++d1P^+PV|(TQ96l7dbWSvHa9O-|O6M^Y+UL9R4e~eYFNm^ADvDZ0?+< VvCFn^YX<s@!PC{xWt~$(699h>6iWaA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-inhand-right.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/body-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..db0a12d8c93c69367113c55ca7aed5b292c7cb99 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1quc!AqVljv*C{Z*QLFZ8i{Kb$EWc z!Fr)exrg=^2Ub1BlS)qy9d+3#tk|p1ant5K-*MlQN)8PSj7%&X0t(2C#?M@9UjKR# z_IH!c-$T1Xukv;6Vpf{BR!(p24vrI+%cEYGmCRc9%zUlSZ*-j~X3Ys+VA}9!+v<rw zuge`h`k~}W*B^%&&wrYIn%BR1_qj*>cmBy$?pJun-q&v_RR8FD?|W;_rGNMn;(N-W eE;<m&I<JGrQGf2lv|6C=7(8A5T-G@yGywp)0~rDU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..414d83dbd08586a1313e8188d2128730f112e2fd GIT binary patch literal 859 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1qv{_?YDB;uuoF_;%Lawao@RZY!^_ z&S2Qcm?W&0Dtv^kgHvMRRPD&EJh@K-9=v+>MYXUlr(WGN-Y4)wx3I+VkA~+zAKq4| z|I^xJU6nxe?~C8W?kXHwy(;SMZxgw%^P}{WPH)ngma18E+vKd)`YHRXvl{1%e^k1r zzJc}V`@gMkU8Aj!*Uy;IA>WoLx;ppvBOQ+EvJEl&_q{j2KfC9BWw-VsY36JD9R#AI zVzZu?zFGcO{iBqM>H612(I4|!qwS663ETf+$+@8YODSmH?En0e(r=c=M)+487F|?( zX6@v2g75z(IWsT`G%&CzFfejBU|}}a`zow9QgQW&o@TdN>y5wDtHy0E(>~WWe4n{x zt5S7^s@cqw)d%OzaWZ$%-u&&zSCM6zRjDN<y?(EoN@Mr$6Zp8(L#XUcZ{}`sri9oz zx_6FE`)4jt_txB+=RwxPxHEAAiVRXdlPrF%s$Qu1TmSjAQ*$e^x&!XIbBZ5W_NM(< U-IiHd1dK8UPgg&ebxsLQ0EoPBrvLx| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-icon.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..951aeb3dff297564a259d96e2c349b5207e5c8b1 GIT binary patch literal 697 zcmV;q0!ICbP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004QX+uL$X=7sm z04R}lk<TjxVHn3hyNFmRHc1Y9SaLw3<fv6#aM)dCaoHI&yJ~+-GrMVXRW1%&4&vh1 z!GFM2xl&4zk{q4=x@a5EYt%~Xo!)sqec$){^vrj_Ka<h3PW=RAa|Js(9SJQY7DJ8C zG}B2tL57mLW6j2<;{3ZlZt<ylGpKs~f3N0hSuq?Pd`-e*x@8xHWg2GI3YOw6;h>&Q zt_U9p57;uG@TJl<kDnB$JbqJb$D@<rS3N_iU#$INJ#A-&`-Q{VOi}-tM}0}a$j!&3 zcFXR;A<8rnLTD6OB}0KhsX584wr}{`H%DGPy1Xq)*y2c$7Vm(lMd@ltHAOe%$xu?c z|IO1eM@PKwfe17_y6$T)G;Tws?7E+au3I^Rx(7JVRsDI%Y5ZOEa#aiOL)!+NUQ{)0 z2hKL3>)uM*$#1Dnw%;`2<pf$2&~XjTOI}t#=N#Wbd|iIg73}UopWJU-{sK)IXe|@v zdPD#K010qNS#tmY4`BcR4`BhQKc{H`008kxL_t(o3GGzD5yK!1BfZW+R?4WEBs-8r z+9-F*`6$Mwy}n|9a0JLghNKh`4uk`DcVPO}fKtkf969H-@B8^V&$EmB!Of#13L~_A zQkb>|xJzYCV3ChFG3<amH3~79%i_eirZqlWU=Kr&t^U#>-iIFF-{#;Hh4hLHx1dKR z=cXg%cjTG_Zky0kd8z8#{;lOM0d;ZhG!!LAOPKo-$~Ud$bcmxSbQp&Ncv7tZ&bd0r zdaIc0M+6%|wyx_3-?A(hCY`xJBXQjUaNu+;u5H^|aDp(a|Jdjj(5!NRnlP-le%Tsl f;Nd_xa4!emeK?z|fIvW100000NkvXXu0mjfhc-VN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-inhand-left.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..048c6b4493978761ecb9bfaa25b47d84f233a220 GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>Y-ueVd8 zNW1)2gEInJ8ix)ZT;!<8waAdCXd|2HiL8sS!yg=f8mGF%G$T_$YSFZPZU361ny)n} zXf$;kd$w=dgxfo{G!{Ppbno+r>htdl-tA1_eL7{&J!Af#PM+NC%=50^n05SLU$daj z4#^(vUAsggdoG#Q$t?|fbTI$htGMfizb0$OGJ4Pdux3$~YU0ec3t^t7mHrhGCyz}& zq<+ZGmrZ1!=~tKL`#$GPew<Fxm5O6nee?3<%*QU$+L5~YHkxnFK0oDEEce-a&dNhx zE}v$|m|G<_v3!`Y;EbB3*AG?kl=Qi^!KL?&Tt8}j3R}6LQ`tFek6qyDOQx!px>a8D zWJHVK|Np*ndHOQxyK@;|)SC93FWm6nd2N=&{^f0f*37rLW5lEWEqasrF8WKB_h-50 zY<9i;sHjH_>&g<pMD}KX+?6sp*?0NF$4qQV1||G`UyrSu^?i=LV@Y(~MOhiSgDqEf zoBd<>FOk8yD%xowFakIWJR*x382Ao@Fyrz36)C{zF!XeB45?szd-E-4vw=WEV)U*C z;T=sD&CM^=@*Z)ld&K4UfMc5=pNWU<<Ew5JztsiaYxiHW_Y|t*P-tLa!XzA6m}0N{ z3icG{u$X@-`j9Bm#Q(79{F7|;`b=iiLf61EiAEK-xAFVl3-g(lx;iHO^8MSVtaokC zDl)m*pFb;YYv}c_D;Kf`b-D3BVB1;~9L~U@r;WuLgw+lm4fUQ<LCN~=RZ~(ktM+cc z9{%;t{!2lstSme2LPL+T3lxZLp7QkTo@Faue%)a*MgM{L_MP{uJmNbqu30v}pU0pt zdD8QpnQzw~{!(kdG}FqS>!_LZr&ou$J6M~p?0Wj^r*O@^qJlOz21XVEhX?<e@)Kug V?yc-&T?!0Q22WQ%mvv4FO#q||MIrzI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-inhand-right.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/cuffcrown-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..baf135dfbc6b462b3488d386ed501058319f3a4e GIT binary patch literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1qv{_>l8-aSW+oe0%F6?;!<&hKH}% zd=7BQE^6MOxVog(?*PYD<AVZC95<9^-9K_=!s8vk4ff5se1w~kMZkdpllY;`nEm$N zopalA&!3(2VsXmZ&@K5>ejSzznyI()Xo0TZf~|GC)$iQ@z4=OXaPqd9w^H`b_MIDE zop?P&Xup`(vCi5v8UD}jsN~0SC^RrI;UwI-zevpbWjrnQWZ$R0cWX7`*H4@|C%NaR z-huVK$Gh`3sCncm?)!Kp%J<x)8^-4|{&`h$%sg`L^PM@%SsaqCmEN5i)c>I%D|Xla z(3s$dduM+?I=}V7Xa4_t{&S@LKW|XOEYbnC{6GYgxs!1*yYam}`oQ30@O1TaS?83{ F1OTsIL)riU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/meta.json new file mode 100644 index 0000000000..40fbf11d37 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/meta.json @@ -0,0 +1,56 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by UBlueberry for SS14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "body-icon" + }, + { + "name": "cuffcrown-icon" + }, + { + "name": "pompom-icon" + }, + { + "name": "body-equipped-HELMET", + "directions": 4 + }, + { + "name": "cuffcrown-equipped-HELMET", + "directions": 4 + }, + { + "name": "pompom-equipped-HELMET", + "directions": 4 + }, + { + "name": "body-inhand-left", + "directions": 4 + }, + { + "name": "cuffcrown-inhand-left", + "directions": 4 + }, + { + "name": "pompom-inhand-left", + "directions": 4 + }, + { + "name": "body-inhand-right", + "directions": 4 + }, + { + "name": "cuffcrown-inhand-right", + "directions": 4 + }, + { + "name": "pompom-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9a4dcd9483bf5e1172424ba8b3e8b3b8977cba GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1quc!4;k^jv*C{Z*LvsJ**(Wa$xh6 zq8GAU3wY}GtT-a3%A(AwS^VEt_Henf*s`r<&*!{veR1u?p5$}0m(HJB;Po=<<lA#s zq85MOSG~5Dg+oBWp@D&s2?yiBde$__#A!l)t`V9(HK7wUmL8FKeC2!lp(7jP9~<D( f1vaow_X9&&jP`cdzlpPfZf5Xw^>bP0l+XkKO#}aO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-icon.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5d46efe582b825cb2d0aecbe5f95d7885e979b93 GIT binary patch literal 553 zcmV+^0@nSBP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004QX+uL$X=7sm z04R}lk<TjxVHn3hyNFmRHc1Y9SaLw3<fv6#aM)dCaoHI&yJ~+-GrMVXRW1%&4&vh1 z!GFM2xl&4zk{q4=x@a5EYt%~Xo!)sqec$){^vrj_Ka<h3PW=RAa|Js(9SJQY7DJ8C zG}B2tL57mLW6j2<;{3ZlZt<ylGpKs~f3N0hSuq?Pd`-e*x@8xHWg2GI3YOw6;h>&Q zt_U9p57;uG@TJl<kDnB$JbqJb$D@<rS3N_iU#$INJ#A-&`-Q{VOi}-tM}0}a$j!&3 zcFXR;A<8rnLTD6OB}0KhsX584wr}{`H%DGPy1Xq)*y2c$7Vm(lMd@ltHAOe%$xu?c z|IO1eM@PKwfe17_y6$T)G;Tws?7E+au3I^Rx(7JVRsDI%Y5ZOEa#aiOL)!+NUQ{)0 z2hKL3>)uM*$#1Dnw%;`2<pf$2&~XjTOI}t#=N#Wbd|iIg73}UopWJU-{sK)IXe|@v zdPD#K010qNS#tmY4`BcR4`BhQKc{H`003c0L_t(o3GLCr3BWK2g<<Ks4(9@{;XFw! z<XS8UUVbkUcro%tghBv;W`T9e%(AV@=%*5@X7b^P5O<gCd9L1V&#CIGFuKH_uV@#z r14jk!5_AL*KmY**5I_I{1il0|3-T+i&y+x#00000NkvXXu0mjfB9HP1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-inhand-left.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..2d239f2b078cca41ad25fe274bb7eaf5da75bf4d GIT binary patch literal 612 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1quc!P%ZJjv*C{Z*MvZ9#G(6aaeXs zphK8Pf!V%fQRA{;tJ(JAo9=5L6;N<!U|?io;lN;+u{@izdh0ebrMT*<)EuegDN(PL zFRCZn6>Si}rW|2_jIzMhiY>cl%D>xNzrCsdak3GklD&XY`3W_!RrcaL7<Z{??v}Cf ReFAhQgQu&X%Q~loCIGi{?`Hr2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-inhand-right.png b/Resources/Textures/Clothing/Head/Hats/beanie.rsi/pompom-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..805f9c8202a7e761b58c4ffb0de1880e8eb21f91 GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d{Sb`Ho)PG(@xm{>Z|(wjL@ zq}5(n^^p^oxQkBEiU<`2t}IQ#EuCV9P0_|PeS{QG8%$O>7`9;}M?{BNUh98{=!0R7 z0wRt_F5OxyDEZ!-iF4APhiCs<yq|k|uJHq|rC+w(wc&l~bB^mgYwc<6)pqBlbH7|_ zp6}_q{p`=9H#vB(e`oexb&ow{{ju+_)_t3i`1-;XEt`e2!~7zaDQ=l*Ec%|S{I#d9 zT8++|?I{iqrI)&&{<F#=@R|S7FclkSy{ng}uXvcj``S}m*G9=^hTqe#r)*w%TlJi| zwCGCRP39XdGnG5~H7d<KCMqkKD$l(7y?0s-cgoSlr*AK5Q0-&!{P@fDtarF`R!oWW zJQ3EZzyI63{qZAWXSKUPRGiH7WDc9^578xa<_jPHY0LWEI3{(~zco)xzN%JjT*WKb zST3!%Zgo_Nyk7Z&_b0FDtX0{Wy8BUKg?;-u(HFa#w{0y7n_7HMPH~g!{ug3=e2Ee7 zs;~cNm@SzRI6ZWo5ikZg3p^r=85sBugD~Uq{1quc!Fir8jv*C{Z*LvsJfOhC8t^iQ z?}eJ)1BrLZoL}B)Dtvpos^;-$3GYA_4gm#+1_nkZbVj59g00)0&3PR*A-#NKRJLUD zn{BdN>wYhmZCxvgp%__vosz)h8~3VT{jmA;c#g8?<M$3BX~h%g_s+SwKL@O_V8sFM Y-Uv;fgLg|SfG%b5boFyt=akR{0RHs+=l}o! literal 0 HcmV?d00001 From 3f2b16127720112e7abbde6fd05936e5f4db5ec5 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 21:16:40 +0000 Subject: [PATCH 470/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1a910cf3ba..34ef100e66 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Fixed AIs not being able to use lockable buttons. - type: Fix - id: 7789 - time: '2025-01-09T11:23:37.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34326 - author: Alpaccalypse changes: - message: The reagent "cola" has been renamed to "Space Cola". @@ -3905,3 +3898,10 @@ id: 8289 time: '2025-04-20T21:09:01.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35685 +- author: UBlueberry + changes: + - message: Beanies can now be found in WinterDrobes, don'tchaknow. + type: Add + id: 8290 + time: '2025-04-20T21:15:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32946 From aeb53a302b6afb3f4f01a203921a0fd52d983884 Mon Sep 17 00:00:00 2001 From: Banedon <15725971+Lanedon@users.noreply.github.com> Date: Sun, 20 Apr 2025 23:17:12 +0200 Subject: [PATCH 471/622] Santa hat with a foldable beard (#36510) * Added foldable component to santa hat * Modified sprites, modified YAML. YAML is cursed * Changed santa hat description to mention the beard fold * Removed HideLayerClothing since it doesnt work * Changed the prefix from "beard" to "nobeard" to match with the fold/unfold verb * Credits for sprite changes --------- Co-authored-by: Lanedon <matth.galvez@gmail> --- .../Entities/Clothing/Head/hats.yml | 21 ++++-- .../Head/Hats/santahat.rsi/icon-nobeard.png | Bin 0 -> 346 bytes .../Clothing/Head/Hats/santahat.rsi/icon.png | Bin 346 -> 501 bytes .../Clothing/Head/Hats/santahat.rsi/meta.json | 63 ++++++++++++------ .../nobeard-equipped-HELMET-vox.png | Bin 0 -> 687 bytes .../santahat.rsi/nobeard-equipped-HELMET.png | Bin 0 -> 672 bytes .../Hats/santahat.rsi/nobeard-inhand-left.png | Bin 0 -> 612 bytes .../santahat.rsi/nobeard-inhand-right.png | Bin 0 -> 606 bytes 8 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 Resources/Textures/Clothing/Head/Hats/santahat.rsi/icon-nobeard.png create mode 100644 Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-equipped-HELMET-vox.png create mode 100644 Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-inhand-right.png diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 2477e1e996..b665708eba 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -421,15 +421,28 @@ sprite: Clothing/Head/Hats/redwizard.rsi - type: entity - parent: ClothingHeadBase + parent: [ClothingHeadBase, BaseFoldable] id: ClothingHeadHatSantahat name: santa hat - description: A festive hat worn by Santa Claus. + description: A festive hat worn by Santa Claus. Now with a foldable beard. components: - - type: Sprite - sprite: Clothing/Head/Hats/santahat.rsi - type: Clothing sprite: Clothing/Head/Hats/santahat.rsi + - type: Appearance + - type: Foldable + canFoldInsideContainer: true + - type: FoldableClothing + foldedEquippedPrefix: nobeard + foldedHeldPrefix: nobeard + - type: Sprite + sprite: Clothing/Head/Hats/santahat.rsi + layers: + - state: icon + map: ["unfoldedLayer"] + - state: icon-nobeard + map: [ "foldedLayer" ] + visible: true + - type: entity parent: ClothingHeadBase diff --git a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/icon-nobeard.png b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/icon-nobeard.png new file mode 100644 index 0000000000000000000000000000000000000000..88fb770f8d4905fe37096d5fd250f39d30f85a3c GIT binary patch literal 346 zcmV-g0j2(lP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80003YNkl<Zc%1E) zv2BDf6ox+{8W+%|yd5kiV1X<UWsDo+7Ptj&fm^^6ShoXZI=i4G#X)2x9QXw%r0_3U zfc5PEdk_3XVT@r<J?-kA0W!dU04TRCzO?NSKEE1M{0Ts4tiQ}lA;hm>GS}lc1Vi(^ zDr*u|;L^6kWcobLy#pO^1760fM9~$PGiSU%%)}-KV8%R@2Cm$zAW;;6B%=;EIhPgy z?ioJHKGd6YR8>XOG*Qs205RFmeFw3Ms(_9((7>^-@!n&tjp_%#(u!lvLC^=fpRsHQ zI623$u2(m@1@YF}bO6()z#@p`=!pT8Qj}%Md00PL-utuw*4kn^(@Lp_aed!^#wP^` sH(hEjQezRoR+A;|{!5ktGC&6S03AD8JwUNWpa1{>07*qoM6N<$f~&`o6951J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/icon.png index 88fb770f8d4905fe37096d5fd250f39d30f85a3c..5b6ddcc296fb60c3474bdb009eb1da5c01be2f70 100644 GIT binary patch delta 475 zcmV<10VMv~0`&usB!9a}L_t(oN9~j`PQySDMaPnxNMvIQ<O-hwA*JyF5ES$&s5t@0 z-~^l?Jq3sZq;bO;Ol48vtdUZh9gB&U)h?N_9Ysh?<CVSZ|K`u^L~!7U4y+G<8{ih8 zwH<r_c|yG$u!YYof>*PaLWluKoP<v;fH$+2LWlrR9EDNz<bPZE-8@P7+N>XiF0cW7 z;*>l>pfCa8du}O204PA2+s!w`1r`9+odbX+y3rbxQmlWoHj(}3fvIIXaBsw?(<wAf z!-CieV0V280J*3S_5$E`zRw8Ph0#jzTla?=k$VI1JgWr0q2qI5FM~*H-QFqH>Dgn~ z1;7c2fjz*rpMT{50+1Mi__9Y~iqQcklL^Fe9Jqu(UvsY?o!Z$0xRG2ykWg$ko9>e& zdsYc>Q&ALcnx>E>NjGHNz^v=KhN`MyKA*Fa5;?G3F58Q%OE^}upaUOz4KGj6uvjd{ z2Pn(3J({U4KxBeQS`)ZNfX}stEX&3Ra2*H%?9Bnp&{TE7u0`MM*-c1dK8PXWVgT2P zq2j#&upja~-&SC?T8TT~E}y7l=^#N274PMM4I#brz9G`ff#5Xi@!=of3n*;FAwDDF Rz5oCK07*qoM6N<$f&ls#+Oz-w delta 319 zcmV-F0l@zC1KI+RB!3}EL_t(|ob8seZG<oshCd=27tp1=9V{kbfh-VZj2q(?xCL&3 zTfh@ow*zH5yPzb+L1ZNy_ys4V@Gn___3Zz95Bx-7jA2hb?dqNZGQfWTD7P%WwCxZ+ zzZz5g2|#G9zsyS^#IIm7*W)+@L-V~VYZ6u9(ze57`aI6P1AiTG1760fM9~$PGiSU% z%)}-KV8%R@2Cm$zAW;;6B%=;EIhPgy?ioJHKGd6YR8>XOG*Qs205RFmeFw3Ms(_9( z(7>^-@!n&tjp_%#(u!lvLC^=fpRsHQI623$u2(m@1@YF}bO6()z#@p`=!pT8Qj}%M zd00PL-utuw);QW?I@3z2hjD%1f5s;T2sd47E>dF=z*dtb?fy%a0Wv@a_y8R{T0KCq RMxX!y002ovPDHLkV1jF*k4gXl diff --git a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/meta.json index cec1961dce..4399ee55c2 100644 --- a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/meta.json @@ -1,30 +1,49 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. vox state by Flareguy", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. vox state by Flareguy, no beard variant by Banedon", "size": { "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HELMET", - "directions": 4 - }, - { - "name": "equipped-HELMET-vox", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon-nobeard" + }, + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "nobeard-equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 + }, + { + "name": "nobeard-equipped-HELMET-vox", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "nobeard-inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "nobeard-inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-equipped-HELMET-vox.png b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-equipped-HELMET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..db598618573503c227d6e62c9823c29ea4d318ae GIT binary patch literal 687 zcmV;g0#N;lP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0007ZNkl<ZcwX(A zu}i~16vnT#B?UV;RJvqx=&mB2{Syif-JIOSL2>Xea8U<wb#Tid^iOc;DC#cgltt{I zP@#pE$P1i=Ynt3$dan=qx)geseBbwbU%FgMV#PnD70)jifK3CA*UOQ5-OcwD1!kHy zc(K(tGJWf>%><Vq-i9M<6S_ly@U40+b-S&;HUJ0@B4FSs{GGW@uG>x`4?<S>B16yu zkQZJWfPHCj^1|t?GXSOjALFUm^vW~rOb4LVfbn<|oi)9=^~Y$y$wn<w1E)b)H~<Jg z7<`IeyA|im5^(tlB>#Znzo=5J#(t7e8kcwRZ{2QJYp}3aYomk^wA<n|4Ch{R<@-_A zy3VtnwFg=N>(^hSe-E-5hwncE2GwXZMX&du4M7V)($u_=uEXcS3xXi(boOHi{eIsa zfIK71Tn7kF9)V?sa;<Ir2)H(ceSZdkO`Mt@H-Oqiu>EiYu!&RC;|5Th2(}+?05)-I zdfWhN6T$Yw4ZtQ&O^+KuZ6eryxB=M2sp)Y8s7(ahPvHj0!wS`S^6+92p<L+{0+4oI zC&R+I-J&44)UgJjno0`{dx}CxyN8apZtJW7NCWbP3HUyEd=fib+gA6}H7oZ$zrIBG zd%N*zwe(=yIAg;Q{vsTTbH5%}99~?&46j0fH&RqjCP0k=z)7(b@VrV1rhzqiHJH>^ zJvjv+Phm}tpiK<f>@DKSxB*}g1WjH-unA>)jjbmu0H)?B?`Hs%r-R{*8-PKXvIaMR z@^mn~aRV?YQ`X=HP@WEkH*Nq1Wy%`d0Ls(B@Wu_mpiEhV8$fwF7~Z%67?de%`~jRT VDo`Lm1Bw6u002ovPDHLkV1g-IGhYAz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..8950c1a5e95b329c14f5334bee0019b3e65f64b6 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU`q3JaSW-5dppa}+bK}w`1%zZ zPc9@_ytwipPVj6k%ff?eSL#YNwb?m(o48~<&vt&`o>9<~#h+EwDZ|AhGD-aT!OrWS zS3Z|JXZ-%F#VgzAfBx_PT(9>%^~|JtBky<jH5mMu`ocClZh7}9*~EOp$D1pfS0D8H z5t{q7|D#6B^M3~lTmz;vJbS$~=~3ak8Y2b+erJaRiQlu=@YVZsA2Rvu(Zbxwk}$1O zgyH$52La|bZ|5*|9Q|KvVf4E7jfC-S)(JueGIi|gQx6^aabB76c=l0+JPXby3kHMx zulLUU=4boy=JXEprS4z&CFXsNv6G+Xx^T+*^@rcjI;)nsv0z$>fMUq%&`XtFisvLf z7_Y?c;jb%AFyf1|<JDOevu;M&?`b>_<9Q1ed{$*{jdEPPQQYZ8iPdR#h64;OA##i- zeRZSs^W_-zB3KWoKKGuhc3`@1QEdj(jwdxMFSGpE<hhRDmtp!G{nA+s@n$E#F64YL z>GM)Q;RmPHcG{UR#uV+llF3waQ{_6lHe-dOpuE)H4G*{$UGY4(oozyid;6k?>-2It zE`46haHL&bvduWt(c_ixMHAi76b1{9_(>1;^f+{yKj+zJ-Eb>sk_QvRv-7)Zi=(t# z1=|~cmw!*oPM#cc-Y_-z^M@}Ici!Z+uYYl5>$z9XMhx2z-&hfFA~oT`q8aY7D>T=I zvM}7+b1TOBywsd)@3%#Hax!eZaO2t0<}ExyziwryGB4mM``E)&P?$YwmMP;Tlh`*) eIZ5YyWp?Nj2@p4`S_w>e44$rjF6*2Univ4_aw@j~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-inhand-left.png b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..d3420b965a942c75c2e1b91c5c18e5b9d8428bae GIT binary patch literal 612 zcmV-q0-ODbP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0006hNkl<ZcwX(A zu}T9$5QaA-;R2?xh@?m=i}WgD?IQ#%?gi|`La@ja*ocMLTG*u!?jcgEy`WVZF@-{e z1Pmv0uySth%<g7KGq;m6w>vlgH~;JvvnApAujILY!2s9+o)h2}@Z11=2yzQ>3wTa| zTflPz@K=CafLp+G0^9<g8vy4kaJ*iQ(_k;(X4+0u_sTdXF-(f8otRG0tM=Lt;psh( z<B3=#0>pRfwai!P?AOUrUE>S@h=(LWz|rtyF0Oo@2jMsIGHDD5P5>+tF9pE5EI9C- z0Vwu=p3cN(P@Z#j9zYxW!yYFNm`*?A(`Jxse;o&$Y}8^^a2AA>0|4SjqZbkFbuxQj zw=(Gi6nec<ttMO3P#Wjg$$w!OIw_n}2LOattF=^O-~veM;&t*JM>^y1>0Q7(8jYri zqFZMWmP%N+x-QoB`~A4vJxCx71_S>907QVWk}cq(!v7V6ObcKEVgOiVsl;UmP^lDF zp6mcDvQ*--1E^FAD^GR+7FjBB*#T54g_S2e0E;Y@xa<HbmBPxC9e_oaN?djTl}cgd zNy-6oaH7IU4^m7)kpYl3JCtH!hG+|c1OO1P3RHpELLdPk%hq=f_wmjCZZeUU7c*=i zkOcrxBm}s10**KvjzzCsH);pc03?K+t?d$w>7`SGprWlyd!gy+`q%5_^w@NCUKjuX y93Yrpo+uOm8`m)a8)`+`!wx7?HEpzf0sNKOL8<SjRsaA107*qoM6N<$f&c)a)B?}| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-inhand-right.png b/Resources/Textures/Clothing/Head/Hats/santahat.rsi/nobeard-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7cddd3954a9d7bb9ed55aacc4ef8ebeb299856 GIT binary patch literal 606 zcmV-k0-^nhP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0006cNkl<ZcwX(A zze~eV5XWC=OA2;yh;&FNhwkd&-%)VL=Hw<0f`fm7i#Uj@dk3L^f<s49cR{BvVh4o^ zEm$J=;KFP2qP;f5`*B?g$>rs~pZnf>!zB=&{{qkT3kJXr@SFg*faeC_O^{oFTflPy z+yb5(fKLH#0d4`$32+N|ZUFr$aI#rTRWR3|b8DQE&mDD?X;=_;)7e-Mu0nX3Ooizn zKzz5=)S9|1{|o?#hagzsc=TPUINmoE!e8Q%hz^1j`k#1Q0OE9TOxQ;lK+gVev$@y~ zYlYh63n(2hoBgC`?XcATHaOsPtC{8n>mU>WfcWwFT@3cS+TJ(8-pk~mZs5@C^+rQJ zrb3A>Z{@WlNwPgIa{xey<Jg+xP6q{C0N1ZRrkM_O#?kAS0F6=97K6cE2El5<%QypL z`u%>|>m5i4!{N|B0006YXj_0n(zRG`TA-|O48S!@Q}wU|sKi{0X9u`eQK}wx0F{_) z@$3NCDoWME4xkcqEuJ0VT1BaP*a1{xuEnzhT&pNm4?BQL%(eKn9Dsv}JQQ^>VLGst z0qACNC>CaNwm?`3Kwi8~FvQpZfeZk}<Hr>6e|Y~O_I7s3Ynjj<q@+Ro#b_eVJ1uE( z_$a|<@lXH~02rlX)xxkIJU&0AwpJc>kO1I>RUI#zVB>XiAOV0E0R;5}gLPhR!n0%m sCL~>D4h*15nl`S*4zRImRp$H){%O-ehXZ6)00000NkvXXu0mjf0Q^x7MgRZ+ literal 0 HcmV?d00001 From c2857c52471f0560a83126baa7bf8ae49f8d6aad Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 21:18:18 +0000 Subject: [PATCH 472/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 34ef100e66..31f243e804 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,19 +1,4 @@ Entries: -- author: Alpaccalypse - changes: - - message: The reagent "cola" has been renamed to "Space Cola". - type: Tweak - - message: The reagent "lemon-lime" has been renamed to "Smite Soda". - type: Tweak - - message: The reagent "lemon-lime-cranberry" has been renamed to "Smite Cranberry". - type: Tweak - - message: The reagent "Space Mountain Wind" has been renamed to "Space Solar Wind". - type: Tweak - - message: The reagent "Energy Drink" has been renamed to "Red Bool". - type: Tweak - id: 7790 - time: '2025-01-09T20:24:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34178 - author: Errant changes: - message: Battery-powered weapons will no longer occasionally refuse to recharge @@ -3905,3 +3890,10 @@ id: 8290 time: '2025-04-20T21:15:34.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32946 +- author: Lanedon + changes: + - message: Santa hats can now be folded to remove the beard. + type: Tweak + id: 8291 + time: '2025-04-20T21:17:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36510 From 251cfbd8bef6b3eba66d322baeed0a9de2892dc7 Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Date: Sun, 20 Apr 2025 14:27:12 -0700 Subject: [PATCH 473/622] Puddle Code Slipping Cleanup (#35845) * Init Commit * windows yelling at me to update commit * working commit, need prediciton and more dehardcoding * Project 0 warnings * Working Commit (Near Final) * ryder got confused commit * I love Merge Conflicts :) * Working commit, no prediction * Forgot the yaml changes * Comments and typos * Apparently while the reduced launch mult of lube was initialized it was never used so I revered back to default * Fixed an incorrect divisor * bit of cleanup * Prediciton fixed, and puddles now affect all entities * FORGOT TO RENAME A VERY IMPORTANT VARIABLE OOPS * Really big I forgor moment * Even bigger I forgor moment * four more merge conflicts to fix four more oopsies * fixed actual divide by zero moment and also im very dumb * Even bigger I forgor moment * four more merge conflicts to fix four more oopsies * fixed actual divide by zero moment and also im very dumb * Fix all test fails * code cleanup * Webedit whitespace * Code cleaup * whitespace webedit * whitespace webedit * whitespace webedit * whitespace removal * Comments and cleanup * Re-Added 20 warnings as per Ork's request * Cleanups * Spacing fix * bugfixes and cleanup * Small bugfix * Actually dirty the slipComp for real * Added Friction field to Reagent Prototype per design discussion * Sliding system is kill --- .../Systems/AdminVerbSystem.Smites.cs | 6 +- .../SpillIfPuddlePresentTileReaction.cs | 30 ----- .../TileReactions/SpillTileReaction.cs | 60 --------- .../Fluids/EntitySystems/PuddleSystem.cs | 121 ++++++++++-------- .../Chemistry/Reagent/ReagentPrototype.cs | 14 +- .../Fluids/Components/PuddleComponent.cs | 6 + Content.Shared/Slippery/SlidingSystem.cs | 14 +- Content.Shared/Slippery/SlipperyComponent.cs | 41 ++++-- Content.Shared/Slippery/SlipperySystem.cs | 9 +- .../Components/StepTriggerComponent.cs | 3 +- .../Prototypes/Entities/Effects/puddle.yml | 2 + .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 3 +- .../Prototypes/Entities/Objects/Fun/dice.yml | 3 +- .../Prototypes/Entities/Objects/Fun/error.yml | 5 +- .../Prototypes/Entities/Objects/Fun/toys.yml | 3 +- .../Entities/Objects/Materials/shards.yml | 3 +- .../Objects/Specific/Janitorial/soap.yml | 15 ++- .../Reagents/Consumable/Drink/alcohol.yml | 1 - .../Reagents/Consumable/Drink/base_drink.yml | 7 +- .../Reagents/Consumable/Drink/drinks.yml | 5 +- .../Reagents/Consumable/Food/condiments.yml | 3 - Resources/Prototypes/Reagents/biological.yml | 17 +-- Resources/Prototypes/Reagents/chemicals.yml | 1 - Resources/Prototypes/Reagents/cleaning.yml | 11 +- Resources/Prototypes/Reagents/fun.yml | 9 +- Resources/Prototypes/Reagents/pyrotechnic.yml | 6 +- Resources/Prototypes/Reagents/toxins.yml | 1 - 27 files changed, 177 insertions(+), 222 deletions(-) delete mode 100644 Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs delete mode 100644 Content.Server/Chemistry/TileReactions/SpillTileReaction.cs diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs index 114ab943ea..15cf24d0f2 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs @@ -877,9 +877,9 @@ public sealed partial class AdminVerbSystem var hadSlipComponent = EnsureComp(args.Target, out SlipperyComponent slipComponent); if (!hadSlipComponent) { - slipComponent.SuperSlippery = true; - slipComponent.ParalyzeTime = 5; - slipComponent.LaunchForwardsMultiplier = 20; + slipComponent.SlipData.SuperSlippery = true; + slipComponent.SlipData.ParalyzeTime = TimeSpan.FromSeconds(5); + slipComponent.SlipData.LaunchForwardsMultiplier = 20; } _slipperySystem.TrySlip(args.Target, slipComponent, args.Target, requiresContact: false); diff --git a/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs deleted file mode 100644 index 8c8b371da3..0000000000 --- a/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Content.Server.Fluids.EntitySystems; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.Reaction; -using Content.Shared.Chemistry.Reagent; -using Content.Shared.FixedPoint; -using JetBrains.Annotations; -using Robust.Shared.Map; - -namespace Content.Server.Chemistry.TileReactions -{ - [UsedImplicitly] - [DataDefinition] - public sealed partial class SpillIfPuddlePresentTileReaction : ITileReaction - { - public FixedPoint2 TileReact(TileRef tile, - ReagentPrototype reagent, - FixedPoint2 reactVolume, - IEntityManager entityManager, - List<ReagentData>? data) - { - var spillSystem = entityManager.System<PuddleSystem>(); - if (reactVolume < 5 || !spillSystem.TryGetPuddle(tile, out _)) - return FixedPoint2.Zero; - - return spillSystem.TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out _, sound: false, tileReact: false) - ? reactVolume - : FixedPoint2.Zero; - } - } -} diff --git a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs deleted file mode 100644 index 68c1966de8..0000000000 --- a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Content.Server.Fluids.EntitySystems; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.Reaction; -using Content.Shared.Chemistry.Reagent; -using Content.Shared.FixedPoint; -using Content.Shared.Movement.Components; -using Content.Shared.Movement.Systems; -using Content.Shared.Slippery; -using Content.Shared.StepTrigger.Components; -using Content.Shared.StepTrigger.Systems; -using JetBrains.Annotations; -using Robust.Shared.Map; - -namespace Content.Server.Chemistry.TileReactions -{ - [UsedImplicitly] - [DataDefinition] - public sealed partial class SpillTileReaction : ITileReaction - { - [DataField("launchForwardsMultiplier")] public float LaunchForwardsMultiplier = 1; - [DataField("requiredSlipSpeed")] public float RequiredSlipSpeed = 6; - [DataField("paralyzeTime")] public float ParalyzeTime = 1; - - /// <summary> - /// <see cref="SlipperyComponent.SuperSlippery"/> - /// </summary> - [DataField("superSlippery")] public bool SuperSlippery; - - public FixedPoint2 TileReact(TileRef tile, - ReagentPrototype reagent, - FixedPoint2 reactVolume, - IEntityManager entityManager, - List<ReagentData>? data) - { - if (reactVolume < 5) - return FixedPoint2.Zero; - - if (entityManager.EntitySysManager.GetEntitySystem<PuddleSystem>() - .TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out var puddleUid, false, false)) - { - var slippery = entityManager.EnsureComponent<SlipperyComponent>(puddleUid); - slippery.LaunchForwardsMultiplier = LaunchForwardsMultiplier; - slippery.ParalyzeTime = ParalyzeTime; - slippery.SuperSlippery = SuperSlippery; - entityManager.Dirty(puddleUid, slippery); - - var step = entityManager.EnsureComponent<StepTriggerComponent>(puddleUid); - entityManager.EntitySysManager.GetEntitySystem<StepTriggerSystem>().SetRequiredTriggerSpeed(puddleUid, RequiredSlipSpeed, step); - - var slow = entityManager.EnsureComponent<SpeedModifierContactsComponent>(puddleUid); - var speedModifier = 1 - reagent.Viscosity; - entityManager.EntitySysManager.GetEntitySystem<SpeedModifierContactsSystem>().ChangeModifiers(puddleUid, speedModifier, slow); - - return reactVolume; - } - - return FixedPoint2.Zero; - } - } -} diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index be45a1dbc4..8b66853210 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -71,8 +71,6 @@ public sealed partial class PuddleSystem : SharedPuddleSystem private static string[] _standoutReagents = [Blood, Slime, CopperBlood]; - public static readonly float PuddleVolume = 1000; - // Using local deletion queue instead of the standard queue so that we can easily "undelete" if a puddle // loses & then gains reagents in a single tick. private HashSet<EntityUid> _deletionQueue = []; @@ -94,7 +92,6 @@ public sealed partial class PuddleSystem : SharedPuddleSystem // Shouldn't need re-anchoring. SubscribeLocalEvent<PuddleComponent, AnchorStateChangedEvent>(OnAnchorChanged); SubscribeLocalEvent<PuddleComponent, SolutionContainerChangedEvent>(OnSolutionUpdate); - SubscribeLocalEvent<PuddleComponent, ComponentInit>(OnPuddleInit); SubscribeLocalEvent<PuddleComponent, SpreadNeighborsEvent>(OnPuddleSpread); SubscribeLocalEvent<PuddleComponent, SlipEvent>(OnPuddleSlip); @@ -327,11 +324,6 @@ public sealed partial class PuddleSystem : SharedPuddleSystem TickEvaporation(); } - private void OnPuddleInit(Entity<PuddleComponent> entity, ref ComponentInit args) - { - _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.SolutionName, out _, FixedPoint2.New(PuddleVolume)); - } - private void OnSolutionUpdate(Entity<PuddleComponent> entity, ref SolutionContainerChangedEvent args) { if (args.SolutionId != entity.Comp.SolutionName) @@ -344,7 +336,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem } _deletionQueue.Remove(entity); - UpdateSlip(entity, entity.Comp, args.Solution); + UpdateSlip((entity, entity.Comp), args.Solution); UpdateSlow(entity, args.Solution); UpdateEvaporation(entity, args.Solution); UpdateAppearance(entity, entity.Comp); @@ -389,62 +381,89 @@ public sealed partial class PuddleSystem : SharedPuddleSystem _appearance.SetData(uid, PuddleVisuals.SolutionColor, color, appearance); } - private void UpdateSlip(EntityUid entityUid, PuddleComponent component, Solution solution) + private void UpdateSlip(Entity<PuddleComponent> entity, Solution solution) { - var isSlippery = false; - var isSuperSlippery = false; - // The base sprite is currently at 0.3 so we require at least 2nd tier to be slippery or else it's too hard to see. - var amountRequired = FixedPoint2.New(component.OverflowVolume.Float() * LowThreshold); - var slipperyAmount = FixedPoint2.Zero; + if (!TryComp<StepTriggerComponent>(entity, out var comp)) + return; - // Utilize the defaults from their relevant systems... this sucks, and is a bandaid - var launchForwardsMultiplier = SlipperyComponent.DefaultLaunchForwardsMultiplier; - var paralyzeTime = SlipperyComponent.DefaultParalyzeTime; - var requiredSlipSpeed = StepTriggerComponent.DefaultRequiredTriggeredSpeed; + // This is the base amount of reagent needed before a puddle can be considered slippery. Is defined based on + // the sprite threshold for a puddle larger than 5 pixels. + var smallPuddleThreshold = FixedPoint2.New(entity.Comp.OverflowVolume.Float() * LowThreshold); + + // Stores how many units of slippery reagents a puddle has + var slipperyUnits = FixedPoint2.Zero; + // Stores how many units of super slippery reagents a puddle has + var superSlipperyUnits = FixedPoint2.Zero; + + // These three values will be averaged later and all start at zero so the calculations work + // A cumulative weighted amount of minimum speed to slip values + var puddleFriction = FixedPoint2.Zero; + // A cumulative weighted amount of minimum speed to slip values + var slipStepTrigger = FixedPoint2.Zero; + // A cumulative weighted amount of launch multipliers from slippery reagents + var launchMult = FixedPoint2.Zero; + // A cumulative weighted amount of stun times from slippery reagents + var stunTimer = TimeSpan.Zero; + + // Check if the puddle is big enough to slip in to avoid doing unnecessary logic + if (solution.Volume <= smallPuddleThreshold) + { + _stepTrigger.SetActive(entity, false, comp); + _tile.SetModifier(entity, TileFrictionController.DefaultFriction); + return; + } + + if (!TryComp<SlipperyComponent>(entity, out var slipComp)) + return; foreach (var (reagent, quantity) in solution.Contents) { var reagentProto = _prototypeManager.Index<ReagentPrototype>(reagent.Prototype); - if (!reagentProto.Slippery) + // Calculate the minimum speed needed to slip in the puddle. Average the overall slip thresholds for all reagents + var deltaSlipTrigger = reagentProto.SlipData?.RequiredSlipSpeed ?? entity.Comp.DefaultSlippery; + slipStepTrigger += quantity * deltaSlipTrigger; + + // Aggregate Friction based on quantity + puddleFriction += reagentProto.Friction * quantity; + + if (reagentProto.SlipData == null) continue; - slipperyAmount += quantity; - if (slipperyAmount <= amountRequired) - continue; - isSlippery = true; + slipperyUnits += quantity; + // Aggregate launch speed based on quantity + launchMult += reagentProto.SlipData.LaunchForwardsMultiplier * quantity; + // Aggregate stun times based on quantity + stunTimer += reagentProto.SlipData.ParalyzeTime * (float)quantity; - foreach (var tileReaction in reagentProto.TileReactions) - { - if (tileReaction is not SpillTileReaction spillTileReaction) - continue; - isSuperSlippery = spillTileReaction.SuperSlippery; - launchForwardsMultiplier = launchForwardsMultiplier < spillTileReaction.LaunchForwardsMultiplier ? spillTileReaction.LaunchForwardsMultiplier : launchForwardsMultiplier; - requiredSlipSpeed = requiredSlipSpeed > spillTileReaction.RequiredSlipSpeed ? spillTileReaction.RequiredSlipSpeed : requiredSlipSpeed; - paralyzeTime = paralyzeTime < spillTileReaction.ParalyzeTime ? spillTileReaction.ParalyzeTime : paralyzeTime; - } + if (reagentProto.SlipData.SuperSlippery) + superSlipperyUnits += quantity; } - if (isSlippery) + // Turn on the step trigger if it's slippery + _stepTrigger.SetActive(entity, slipperyUnits > smallPuddleThreshold, comp); + + // This is based of the total volume and not just the slippery volume because there is a default + // slippery for all reagents even if they aren't technically slippery. + slipComp.SlipData.RequiredSlipSpeed = (float)(slipStepTrigger / solution.Volume); + _stepTrigger.SetRequiredTriggerSpeed(entity, slipComp.SlipData.RequiredSlipSpeed); + + // Divide these both by only total amount of slippery reagents. + // A puddle with 10 units of lube vs a puddle with 10 of lube and 20 catchup should stun and launch forward the same amount. + if (slipperyUnits > 0) { - var comp = EnsureComp<StepTriggerComponent>(entityUid); - _stepTrigger.SetActive(entityUid, true, comp); - var friction = EnsureComp<TileFrictionModifierComponent>(entityUid); - _tile.SetModifier(entityUid, TileFrictionController.DefaultFriction * 0.5f, friction); - - if (!TryComp<SlipperyComponent>(entityUid, out var slipperyComponent)) - return; - slipperyComponent.SuperSlippery = isSuperSlippery; - _stepTrigger.SetRequiredTriggerSpeed(entityUid, requiredSlipSpeed); - slipperyComponent.LaunchForwardsMultiplier = launchForwardsMultiplier; - slipperyComponent.ParalyzeTime = paralyzeTime; - - } - else if (TryComp<StepTriggerComponent>(entityUid, out var comp)) - { - _stepTrigger.SetActive(entityUid, false, comp); - RemCompDeferred<TileFrictionModifierComponent>(entityUid); + slipComp.SlipData.LaunchForwardsMultiplier = (float)(launchMult/slipperyUnits); + slipComp.SlipData.ParalyzeTime = (stunTimer/(float)slipperyUnits); } + + // Only make it super slippery if there is enough super slippery units for its own puddle + slipComp.SlipData.SuperSlippery = superSlipperyUnits >= smallPuddleThreshold; + + // Lower tile friction based on how slippery it is, lets items slide across a puddle of lube + slipComp.SlipData.SlipFriction = (float)(puddleFriction/solution.Volume); + _tile.SetModifier(entity, TileFrictionController.DefaultFriction * slipComp.SlipData.SlipFriction); + + Dirty(entity, slipComp); } private void UpdateSlow(EntityUid uid, Solution solution) diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index cfca682e9b..b4fed5fc03 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -9,6 +9,8 @@ using Content.Shared.Chemistry.Reaction; using Content.Shared.EntityEffects; using Content.Shared.Database; using Content.Shared.Nutrition; +using Content.Shared.Prototypes; +using Content.Shared.Slippery; using Robust.Shared.Audio; using Robust.Shared.Map; using Robust.Shared.Prototypes; @@ -98,11 +100,12 @@ namespace Content.Shared.Chemistry.Reagent [DataField] public bool MetamorphicChangeColor { get; private set; } = true; + /// <summary> - /// If this reagent is part of a puddle is it slippery. + /// If not null, makes something slippery. Also defines slippery interactions like stun time and launch mult. /// </summary> [DataField] - public bool Slippery; + public SlipperyEffectEntry? SlipData; /// <summary> /// The speed at which the reagent evaporates over time. @@ -130,6 +133,13 @@ namespace Content.Shared.Chemistry.Reagent [DataField] public float Viscosity; + /// <summary> + /// Linear Friction Multiplier for a reagent + /// 0 - frictionless, 1 - no effect on friction + /// </summary> + [DataField] + public float Friction = 1.0f; + /// <summary> /// Should this reagent work on the dead? /// </summary> diff --git a/Content.Shared/Fluids/Components/PuddleComponent.cs b/Content.Shared/Fluids/Components/PuddleComponent.cs index 5434479fb7..105206fece 100644 --- a/Content.Shared/Fluids/Components/PuddleComponent.cs +++ b/Content.Shared/Fluids/Components/PuddleComponent.cs @@ -19,6 +19,12 @@ namespace Content.Shared.Fluids.Components [DataField("solution")] public string SolutionName = "puddle"; + /// <summary> + /// Default minimum speed someone must be moving to slip for all reagents. + /// </summary> + [DataField] + public float DefaultSlippery = 5.5f; + [ViewVariables] public Entity<SolutionComponent>? Solution; } diff --git a/Content.Shared/Slippery/SlidingSystem.cs b/Content.Shared/Slippery/SlidingSystem.cs index d44ddc883b..dde9bb6ab0 100644 --- a/Content.Shared/Slippery/SlidingSystem.cs +++ b/Content.Shared/Slippery/SlidingSystem.cs @@ -11,20 +11,11 @@ public sealed class SlidingSystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent<SlidingComponent, TileFrictionEvent>(OnSlideAttempt); SubscribeLocalEvent<SlidingComponent, StoodEvent>(OnStand); SubscribeLocalEvent<SlidingComponent, StartCollideEvent>(OnStartCollide); SubscribeLocalEvent<SlidingComponent, EndCollideEvent>(OnEndCollide); } - /// <summary> - /// Modify the friction by the frictionModifier stored on the component. - /// </summary> - private void OnSlideAttempt(EntityUid uid, SlidingComponent component, ref TileFrictionEvent args) - { - args.Modifier = component.FrictionModifier; - } - /// <summary> /// Remove the component when the entity stands up again. /// </summary> @@ -38,11 +29,10 @@ public sealed class SlidingSystem : EntitySystem /// </summary> private void OnStartCollide(EntityUid uid, SlidingComponent component, ref StartCollideEvent args) { - if (!TryComp<SlipperyComponent>(args.OtherEntity, out var slippery) || !slippery.SuperSlippery) + if (!TryComp<SlipperyComponent>(args.OtherEntity, out var slippery) || !slippery.SlipData.SuperSlippery) return; component.CollidingEntities.Add(args.OtherEntity); - component.FrictionModifier = 0; Dirty(uid, component); } @@ -55,7 +45,7 @@ public sealed class SlidingSystem : EntitySystem return; if (component.CollidingEntities.Count == 0) - component.FrictionModifier = SharedStunSystem.KnockDownModifier; + RemComp<SlidingComponent>(uid); Dirty(uid, component); } diff --git a/Content.Shared/Slippery/SlipperyComponent.cs b/Content.Shared/Slippery/SlipperyComponent.cs index a6bf0fce91..f6b6dd0b35 100644 --- a/Content.Shared/Slippery/SlipperyComponent.cs +++ b/Content.Shared/Slippery/SlipperyComponent.cs @@ -1,6 +1,7 @@ using Content.Shared.StepTrigger.Components; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Serialization; namespace Content.Shared.Slippery { @@ -13,8 +14,6 @@ namespace Content.Shared.Slippery [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class SlipperyComponent : Component { - public const float DefaultParalyzeTime = 1.5f; - public const float DefaultLaunchForwardsMultiplier = 1.5f; /// <summary> /// Path to the sound to be played when a mob slips. /// </summary> @@ -23,25 +22,47 @@ namespace Content.Shared.Slippery public SoundSpecifier SlipSound = new SoundPathSpecifier("/Audio/Effects/slip.ogg"); /// <summary> - /// How many seconds the mob will be paralyzed for. + /// Loads the data needed to determine how slippery something is. /// </summary> [DataField, AutoNetworkedField] - [Access(Other = AccessPermissions.ReadWrite)] - public float ParalyzeTime = DefaultParalyzeTime; + public SlipperyEffectEntry SlipData = new(); + } + /// <summary> + /// Stores the data for slipperiness that way reagents and this component can use it. + /// </summary> + [DataDefinition, Serializable, NetSerializable] + public sealed partial class SlipperyEffectEntry + { + /// <summary> + /// How many seconds the mob will be paralyzed for. + /// </summary> + [DataField] + public TimeSpan ParalyzeTime = TimeSpan.FromSeconds(1.5); /// <summary> /// The entity's speed will be multiplied by this to slip it forwards. /// </summary> - [DataField, AutoNetworkedField] - [Access(Other = AccessPermissions.ReadWrite)] - public float LaunchForwardsMultiplier = DefaultLaunchForwardsMultiplier; + [DataField] + public float LaunchForwardsMultiplier = 1.5f; + + /// <summary> + /// Minimum speed entity must be moving to slip. + /// </summary> + [DataField] + public float RequiredSlipSpeed = 3.5f; /// <summary> /// If this is true, any slipping entity loses its friction until /// it's not colliding with any SuperSlippery entities anymore. + /// They also will fail any attempts to stand up unless they have no-slips. /// </summary> - [DataField, AutoNetworkedField] - [Access(Other = AccessPermissions.ReadWrite)] + [DataField] public bool SuperSlippery; + + /// <summary> + /// This is used to store the friction modifier that is used on a sliding entity. + /// </summary> + [DataField] + public float SlipFriction; } } diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index acf120ad1b..4da347acbd 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -39,7 +39,6 @@ public sealed class SlipperySystem : EntitySystem SubscribeLocalEvent<NoSlipComponent, SlipAttemptEvent>(OnNoSlipAttempt); SubscribeLocalEvent<SlowedOverSlipperyComponent, SlipAttemptEvent>(OnSlowedOverSlipAttempt); SubscribeLocalEvent<ThrownItemComponent, SlipCausingAttemptEvent>(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<NoSlipComponent, InventoryRelayedEvent<SlipAttemptEvent>>((e, c, ev) => OnNoSlipAttempt(e, c, ev.Args)); SubscribeLocalEvent<SlowedOverSlipperyComponent, InventoryRelayedEvent<SlipAttemptEvent>>((e, c, ev) => OnSlowedOverSlipAttempt(e, c, ev.Args)); SubscribeLocalEvent<SlowedOverSlipperyComponent, InventoryRelayedEvent<GetSlowedOverSlipperyModifierEvent>>(OnGetSlowedOverSlipperyModifier); @@ -93,7 +92,7 @@ public sealed class SlipperySystem : EntitySystem public void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other, bool requiresContact = true) { - if (HasComp<KnockedDownComponent>(other) && !component.SuperSlippery) + if (HasComp<KnockedDownComponent>(other) && !component.SlipData.SuperSlippery) return; var attemptEv = new SlipAttemptEvent(); @@ -114,9 +113,9 @@ public sealed class SlipperySystem : EntitySystem if (TryComp(other, out PhysicsComponent? physics) && !HasComp<SlidingComponent>(other)) { - _physics.SetLinearVelocity(other, physics.LinearVelocity * component.LaunchForwardsMultiplier, body: physics); + _physics.SetLinearVelocity(other, physics.LinearVelocity * component.SlipData.LaunchForwardsMultiplier, body: physics); - if (component.SuperSlippery && requiresContact) + if (component.SlipData.SuperSlippery && requiresContact) { var sliding = EnsureComp<SlidingComponent>(other); sliding.CollidingEntities.Add(uid); @@ -126,7 +125,7 @@ public sealed class SlipperySystem : EntitySystem var playSound = !_statusEffects.HasStatusEffect(other, "KnockedDown"); - _stun.TryParalyze(other, TimeSpan.FromSeconds(component.ParalyzeTime), true); + _stun.TryParalyze(other, component.SlipData.ParalyzeTime, true); // Preventing from playing the slip sound when you are already knocked down. if (playSound) diff --git a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs index 87d6d37a7f..b8483d021a 100644 --- a/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs +++ b/Content.Shared/StepTrigger/Components/StepTriggerComponent.cs @@ -8,7 +8,6 @@ namespace Content.Shared.StepTrigger.Components; [Access(typeof(StepTriggerSystem))] public sealed partial class StepTriggerComponent : Component { - public const float DefaultRequiredTriggeredSpeed = 3.5f; /// <summary> /// List of entities that are currently colliding with the entity. /// </summary> @@ -38,7 +37,7 @@ public sealed partial class StepTriggerComponent : Component /// Entities will only be triggered if their speed exceeds this limit. /// </summary> [DataField, AutoNetworkedField] - public float RequiredTriggeredSpeed = DefaultRequiredTriggeredSpeed; + public float RequiredTriggeredSpeed = 3.5f; /// <summary> /// If any entities occupy the blacklist on the same tile then steptrigger won't work. diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml index 49962ec189..f89e850193 100644 --- a/Resources/Prototypes/Entities/Effects/puddle.yml +++ b/Resources/Prototypes/Entities/Effects/puddle.yml @@ -113,6 +113,8 @@ components: - type: Clickable - type: Slippery + - type: TileFrictionModifier + modifier: 0.3 - type: Transform noRot: true anchored: true diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 3dae7023d9..2a959a1099 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -179,7 +179,8 @@ rootTask: task: HonkbotCompound - type: Slippery - launchForwardsMultiplier: 2 + slipData: + launchForwardsMultiplier: 2 - type: Speech speechVerb: Cluwne - type: StepTrigger diff --git a/Resources/Prototypes/Entities/Objects/Fun/dice.yml b/Resources/Prototypes/Entities/Objects/Fun/dice.yml index 433a4ebac3..32df1f402d 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/dice.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/dice.yml @@ -125,7 +125,8 @@ - type: Slippery slipSound: path: /Audio/Effects/glass_step.ogg - launchForwardsMultiplier: 0 + slipData: + launchForwardsMultiplier: 0 - type: DamageUserOnTrigger damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Fun/error.yml b/Resources/Prototypes/Entities/Objects/Fun/error.yml index e4b9af61e0..6f157d4fed 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/error.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/error.yml @@ -16,8 +16,9 @@ - ReagentId: Nutriment Quantity: 5 - type: Slippery - paralyzeTime: 3 - launchForwardsMultiplier: 3 + slipData: + paralyzeTime: 3 + launchForwardsMultiplier: 3 - type: StepTrigger intersectRatio: 0.2 - type: CollisionWake diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 05dd5ce309..13f301148f 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -1742,7 +1742,8 @@ - type: UseDelay delay: 0.8 - type: Slippery - paralyzeTime: 0 + slipData: + paralyzeTime: 0 slipSound: collection: Parp params: diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 718d1ad8e3..2457404b48 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -69,7 +69,8 @@ - type: Slippery slipSound: path: /Audio/Effects/glass_step.ogg - launchForwardsMultiplier: 0 + slipData: + launchForwardsMultiplier: 0 - type: TriggerOnStepTrigger - type: DamageUserOnTrigger damage: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml index 3f605119d7..9cedbb23ca 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml @@ -127,8 +127,9 @@ - type: SolutionContainerVisuals fillBaseName: syndie- - type: Slippery - paralyzeTime: 3 - launchForwardsMultiplier: 3 + slipData: + paralyzeTime: 3 + launchForwardsMultiplier: 3 - type: Item heldPrefix: syndie - type: FlavorProfile @@ -152,8 +153,9 @@ layers: - state: syndie-soaplet - type: Slippery - paralyzeTime: 1.5 # these things are tiny - launchForwardsMultiplier: 1.5 + slipData: + paralyzeTime: 1.5 # these things are tiny + launchForwardsMultiplier: 1.5 - type: StepTrigger intersectRatio: 0.04 - type: Item @@ -218,8 +220,9 @@ - type: SolutionContainerVisuals fillBaseName: omega- - type: Slippery - paralyzeTime: 5.0 - launchForwardsMultiplier: 3.0 + slipData: + paralyzeTime: 5.0 + launchForwardsMultiplier: 3.0 - type: Item heldPrefix: omega - type: SolutionContainerManager diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index e041e23900..2bf72de35e 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -133,7 +133,6 @@ name: reagent-name-ethanol parent: BaseAlcohol desc: reagent-desc-ethanol - slippery: true physicalDesc: reagent-physical-desc-strong-smelling flavor: alcohol color: "#b05b3c" diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml index 19a5e1bf8f..dac16dcb1c 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml @@ -2,7 +2,8 @@ id: BaseDrink group: Drinks abstract: true - slippery: true + slipData: + requiredSlipSpeed: 3.5 metabolisms: Drink: effects: @@ -18,7 +19,6 @@ amount: 1 tileReactions: - !type:ExtinguishTileReaction { } - - !type:SpillIfPuddlePresentTileReaction { } - type: reagent id: BaseSoda @@ -46,6 +46,9 @@ id: BaseAlcohol group: Drinks abstract: true + slipData: + requiredSlipSpeed: 3.5 + friction: 0.4 metabolisms: Drink: effects: diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml index 4f65cc0f25..028b0c4a8a 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml @@ -435,7 +435,6 @@ name: reagent-name-water parent: BaseDrink desc: reagent-desc-water - slippery: true evaporationSpeed: 0.3 absorbent: true physicalDesc: reagent-physical-desc-translucent @@ -444,6 +443,7 @@ recognizable: true boilingPoint: 100.0 meltingPoint: 0.0 + friction: 0.4 metabolisms: Drink: effects: @@ -454,12 +454,15 @@ id: Ice name: reagent-name-ice desc: reagent-desc-ice + slipData: + requiredSlipSpeed: 3.5 physicalDesc: reagent-physical-desc-frosty flavor: cold color: "#bed8e6" recognizable: true meltingPoint: 0.0 boilingPoint: 100.0 + friction: 0.05 #Copied from Ice Crust plantMetabolism: - !type:PlantAdjustWater amount: 1 diff --git a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml index f419605307..1dde464128 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml @@ -174,10 +174,7 @@ color: "#fb7125" recognizable: true physicalDesc: reagent-physical-desc-sticky - slippery: false viscosity: 0.55 #Start using syrup to attach your remote recievers to your microwaves! - tileReactions: - - !type:SpillTileReaction metabolisms: Food: # 12 diona blood for 1 unit of syrup, this stuff better be worthwhile. diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 6490e87ffb..df5ed51945 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -13,7 +13,6 @@ metamorphicChangeColor: false recognizable: true physicalDesc: reagent-physical-desc-ferrous - slippery: false metabolisms: Drink: effects: @@ -56,7 +55,6 @@ color: "#808A51" recognizable: true physicalDesc: reagent-physical-desc-slimy - slippery: false - type: reagent id: Slime @@ -67,10 +65,7 @@ color: "#2cf274" recognizable: true physicalDesc: reagent-physical-desc-viscous - slippery: false viscosity: 0.25 - tileReactions: - - !type:SpillTileReaction metabolisms: Food: # Delicious! @@ -91,10 +86,7 @@ color: "#cd7314" recognizable: true physicalDesc: reagent-physical-desc-sticky - slippery: false viscosity: 0.10 - tileReactions: - - !type:SpillTileReaction metabolisms: Food: # Sweet! @@ -118,7 +110,6 @@ color: "#162581" recognizable: true physicalDesc: reagent-physical-desc-metallic - slippery: false - type: reagent parent: Blood @@ -130,7 +121,6 @@ color: "#7a8bf2" recognizable: true physicalDesc: reagent-physical-desc-pungent - slippery: false - type: reagent id: ZombieBlood @@ -140,7 +130,6 @@ physicalDesc: reagent-physical-desc-necrotic flavor: bitter color: "#2b0700" - slippery: false metabolisms: Drink: # Disgusting! @@ -202,7 +191,6 @@ flavor: terrible color: "#d8d8b0" physicalDesc: reagent-physical-desc-exotic-smelling - slippery: false footstepSound: collection: FootstepBlood params: @@ -216,7 +204,9 @@ flavor: terrible color: "#87ab08" physicalDesc: reagent-physical-desc-pungent - slippery: true + slipData: + requiredSlipSpeed: 4.0 #It's not as slippery as water + friction: 0.4 metabolisms: Drink: effects: @@ -238,7 +228,6 @@ physicalDesc: reagent-physical-desc-neural flavor: mindful color: "#C584B8" - slippery: false metabolisms: Drink: effects: diff --git a/Resources/Prototypes/Reagents/chemicals.yml b/Resources/Prototypes/Reagents/chemicals.yml index 85f518bf5e..4542c97565 100644 --- a/Resources/Prototypes/Reagents/chemicals.yml +++ b/Resources/Prototypes/Reagents/chemicals.yml @@ -165,7 +165,6 @@ flavor: bitter color: "#E6E6DA" physicalDesc: reagent-physical-desc-crystalline - slippery: false - type: reagent id: Rororium diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml index a6b53be688..1c0f220160 100644 --- a/Resources/Prototypes/Reagents/cleaning.yml +++ b/Resources/Prototypes/Reagents/cleaning.yml @@ -68,17 +68,16 @@ id: SpaceLube name: reagent-name-space-lube desc: reagent-desc-space-lube - slippery: true + slipData: + requiredSlipSpeed: 1 + superSlippery: true physicalDesc: reagent-physical-desc-shiny flavor: funny color: "#77b58e" recognizable: true boilingPoint: 290.0 # Glycerin meltingPoint: 18.2 - tileReactions: - - !type:SpillTileReaction - requiredSlipSpeed: 1 - superSlippery: true + friction: 0.0 - type: reagent id: SpaceGlue @@ -90,8 +89,6 @@ boilingPoint: 250.0 meltingPoint: 380.0 viscosity: 0.5 - tileReactions: - - !type:SpillTileReaction reactiveEffects: Acidic: methods: [ Touch ] diff --git a/Resources/Prototypes/Reagents/fun.yml b/Resources/Prototypes/Reagents/fun.yml index 00d31cbd10..adbf202c7e 100644 --- a/Resources/Prototypes/Reagents/fun.yml +++ b/Resources/Prototypes/Reagents/fun.yml @@ -170,7 +170,8 @@ id: Razorium name: reagent-name-razorium group: Toxins - slippery: true + slipData: + requiredSlipSpeed: 3.5 desc: reagent-desc-razorium physicalDesc: reagent-physical-desc-reflective flavor: sharp @@ -209,7 +210,8 @@ id: Fresium name: reagent-name-fresium group: Toxins - slippery: true + slipData: + requiredSlipSpeed: 3.5 desc: reagent-desc-fresium physicalDesc: reagent-physical-desc-frosty flavor: cold @@ -305,7 +307,8 @@ physicalDesc: reagent-physical-desc-funny flavor: funny color: "#FF4DD2" - slippery: true #clown juice gotta slip + slipData: + requiredSlipSpeed: 3.5 #clown juice gotta slip metabolisms: Medicine: effects: diff --git a/Resources/Prototypes/Reagents/pyrotechnic.yml b/Resources/Prototypes/Reagents/pyrotechnic.yml index 4bc1652da9..3ff7eb5ad6 100644 --- a/Resources/Prototypes/Reagents/pyrotechnic.yml +++ b/Resources/Prototypes/Reagents/pyrotechnic.yml @@ -149,13 +149,15 @@ parent: BasePyrotechnic desc: reagent-desc-welding-fuel physicalDesc: reagent-physical-desc-oily - slippery: true + slipData: + requiredSlipSpeed: 3.5 flavor: bitter flavorMinimum: 0.01 color: "#a76b1c" recognizable: true boilingPoint: -84.7 # Acetylene. Close enough. meltingPoint: -80.7 + friction: 0.4 tileReactions: - !type:FlammableTileReaction {} metabolisms: @@ -177,4 +179,4 @@ flavor: bitter color: "#9e6b38" boilingPoint: 190.0 # Perfluorooctanoic Acid. - meltingPoint: 45.0 \ No newline at end of file + meltingPoint: 45.0 diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 6235136dbc..5f6e5581dd 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -171,7 +171,6 @@ flavor: sour color: "#48b3b8" physicalDesc: reagent-physical-desc-ferrous - slippery: false metabolisms: Drink: effects: From 94b46a9edc12ca51a5eb112eb0488bb0910df49f Mon Sep 17 00:00:00 2001 From: uhbg <uhbg@users.noreply.github.com> Date: Sun, 20 Apr 2025 17:27:35 -0400 Subject: [PATCH 474/622] The Bartender can now make Eggnog (#34065) * Preliminary eggnog changes (egg in shaker crashes?) * Fixed eggnog reagent name and description * added - to flavor * deleted a space * Added eggnog glass sprite * changed fill levels to match rsi * Added two more fill levels to eggnog * Removed fizziness, changed physical description, and fixed rsi --------- Co-authored-by: uhbg <29674581+uhbg@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- .../Locale/en-US/flavors/flavor-profiles.ftl | 1 + .../meta/consumable/drink/alcohol.ftl | 3 ++ .../Objects/Consumable/Drinks/drinks.yml | 16 ++++++++++ Resources/Prototypes/Flavors/flavors.yml | 5 +++ .../Reagents/Consumable/Drink/alcohol.yml | 15 +++++++++ .../Prototypes/Recipes/Reactions/drinks.yml | 14 +++++++++ .../Drinks/eggnogglass.rsi/fill-1.png | Bin 0 -> 220 bytes .../Drinks/eggnogglass.rsi/fill-2.png | Bin 0 -> 243 bytes .../Drinks/eggnogglass.rsi/fill-3.png | Bin 0 -> 250 bytes .../Drinks/eggnogglass.rsi/fill-4.png | Bin 0 -> 281 bytes .../Drinks/eggnogglass.rsi/icon.png | Bin 0 -> 386 bytes .../Drinks/eggnogglass.rsi/icon_empty.png | Bin 0 -> 326 bytes .../Drinks/eggnogglass.rsi/meta.json | 29 ++++++++++++++++++ 13 files changed, 83 insertions(+) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/meta.json diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl index 14e4ed5adb..f9249a7f13 100644 --- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl +++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl @@ -301,6 +301,7 @@ flavor-complex-brave-bull = like being ran over by a truck flavor-complex-demons-blood = like the seventh circle of Hell flavor-complex-devils-kiss = like cannibalism flavor-complex-driest-martini = like a drunk mimic +flavor-complex-eggnog = like melted custard flavor-complex-erika-surprise = like the bartender made a mistake flavor-complex-gin-fizz = refreshing and lemony flavor-complex-gildlager = like the Tzar's gold diff --git a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl index df9e6ce78f..773368be94 100644 --- a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl +++ b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl @@ -142,6 +142,9 @@ reagent-desc-doctors-delight = A gulp a day keeps the MediBot away. That's proba reagent-name-driest-martini = driest martini reagent-desc-driest-martini = Only for the experienced. You think you see sand floating in the glass. +reagent-name-eggnog = eggnog +reagent-desc-eggnog = Not enough egg. + reagent-name-electric-shark = electric shark reagent-desc-electric-shark = Fun Shark fact: Selachians make up 20% of Space Station 16’s Engineering staff! diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index 9b50ed8a1e..c8c5c70d5f 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -837,6 +837,22 @@ sprite: Objects/Consumable/Drinks/dr_gibb_glass.rsi state: icon +- type: entity + parent: DrinkGlass + id: DrinkEggnog + suffix: eggnog + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Eggnog + Quantity: 30 + - type: Icon + sprite: Objects/Consumable/Drinks/eggnogglass.rsi + state: icon + - type: entity parent: DrinkGlass id: DrinkElectricSharkGlass diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml index 0aa9341647..a24de46b55 100644 --- a/Resources/Prototypes/Flavors/flavors.yml +++ b/Resources/Prototypes/Flavors/flavors.yml @@ -1049,6 +1049,11 @@ flavorType: Complex description: flavor-complex-driest-martini +- type: flavor + id: eggnog + flavorType: Complex + description: flavor-complex-eggnog + - type: flavor id: erikasurprise flavorType: Complex diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index 2bf72de35e..bd55967c79 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -968,6 +968,21 @@ reagent: Ethanol amount: 0.15 +- type: reagent + id: Eggnog + name: reagent-name-eggnog + parent: BaseAlcohol + desc: reagent-desc-eggnog + physicalDesc: reagent-physical-desc-creamy + flavor: eggnog + color: "#e6d6bc" + metamorphicSprite: + sprite: Objects/Consumable/Drinks/eggnogglass.rsi + state: icon_empty + metamorphicMaxFillLevels: 4 + metamorphicFillBaseName: fill- + metamorphicChangeColor: false + - type: reagent id: ElectricShark name: reagent-name-electric-shark diff --git a/Resources/Prototypes/Recipes/Reactions/drinks.yml b/Resources/Prototypes/Recipes/Reactions/drinks.yml index 8cc2da8623..02e992441b 100644 --- a/Resources/Prototypes/Recipes/Reactions/drinks.yml +++ b/Resources/Prototypes/Recipes/Reactions/drinks.yml @@ -398,6 +398,20 @@ products: DriestMartini: 2 +- type: reaction + id: Eggnog + requiredMixerCategories: + - Shake + reactants: + Egg: + amount: 1 + Milk: + amount: 4 + Rum: + amount: 5 + products: + Eggnog: 10 + - type: reaction id: ElectricShark requiredMixerCategories: diff --git a/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..38d1eb92aa75c52ced556d874ff912614a3027b4 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}(>z@qLn2y} z6C_v{Cy4Yk1sZU<9n_FuW#*AMdGX7eY0v6Q3^ljD?s-4&?Z5K}4jlOK<6|vb?Prrk zXVMm4DdL;w$pZrK=NTqgbgA(<Y?qK$xb{88l41VQCk$#qBKq@YdKt`UT@vHz6|Q2b zU{-7Pc=z`8g{K}*Ufjhj0R$l>izT+_#kF2761}Ujspu-uYGr8#hPRWI_e7rN^ar|- N!PC{xWt~$(695;vP&5Dl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d00b0091e5a092e3064ea0dd6056883a3714b3a6 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ydu{YLn2y} z6C_v{Cy4Yk1sZU<9b{m3D>Aj)z4WL2O#P*0b9FYKxYUwosoJLyb@+7q?SGp$Z4z4g z?RmdE&m^yXE;G-%tYOYz?I=6&{Jeap*_W%YpI<3wSj%vc&!VnG{$ks!*~<mzZu9Wk z`hMQqW3zr;Y@9Gf`{J`nBCOHo>ldwhs$#8RR%`Zn_xAOLryfsU+{G*b1R*7hB{sGm n0SZb2nJ4rj-4AL=>||hABB&iJc5<6M(BTZ8u6{1-oD!M<Y_nnx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..cf98ba8480e7d0f04b63ddc982a9f45b88ae3f2f GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}TRdGHLn2y} z6C_v{Cy4Yk1sYspRNg6d-}d%j`I+aBDxW(50tc77PnxNs>9$=&Twqd>>a7^HAQ=a4 zhb_!<ccZ+gyqA=akjRUV^4fB1p)k{%H*;L1PaQt&Udw)gOW<w8`T6!jxi3~<Kfm%l zLlom8*@8bW>=yA}HTPHEB_k2Vdhy!X)hn_rPx5v6&OiI(-P`OrpME@9@rZ#92t@B{ qxaBB*1PX$fo3ytF8gRMkF)*xf(2iO!psNUUKZB>MpUXO@geCwr9AAzA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..5c93fe71d2f109c600a2e0bfe7a664625d5d4bb9 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}mpxq^Ln2y} z6C_v{Cy4YkF|zeM$=Xwxc(FcZUz?*$WZJ}~oOg>14L#XFKv6S%(plxm!@JXW|4$Zv z{zx!A0SF#ExU78AM=eO!A=hD2cHvJs*$G0T%yLXF)(<YO-RkmlUSnh9!*5HMx~!J9 zQao_(oadH>Ha0a^${E%&T;%)l=cn?;wtZE9=ltSZAgXYS@p%6`<y!%@pG_8>Zd@2D zkb8Ge*Q#lg-!$C#a<k|Cy?w_t`~Ca0_(1jsT<lFcA|?bBOan5NcGntmxg9*g%5d(r Waa`P+qg6ofF?hQAxvX<aXaWFxvUK18 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ad42136bd72748c2f747d4a97a29b0d59aced7 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<Hl8kyArY;~ z2@<S}6EvEc&Ex;u7kvKupK-H{^z4uWExsQ%?K=5?e|`NQ_hl!yHV7oBggv~!-~OMm zaq)qxi+|s8jGdCP`9u)|GqXxcN&dV<8=&U;&iA(ipTreZO?t{P$>h)9-;e)4w4N_{ zL04ROa!LXa?D%rCA;o>dk{<`oUjP5KLO)^Z<41z&AQ_8~F_To>6MS2~u(<3Nng9MG zqh_Gt14V}^%zSrh{>FEH6u8*t_5Y4*$wLzpr-nu#m^*iJhI3`bj}`A3q8Jy+e)##> zeGzZ%*I$-jWgWB~wlMd}-*w-z@I5P2ryhGmN8pnMdZ#!}h8+=gS;8=BQNrtIp)6M? zL@5fsWneE2bc<{^Yb(!>e;m^6-<QOGK;~o1S<!5dJ=MQwJ>;CNox3_&;y~z`Nw>A6 efPv+}$e?Lcv1(%ke>5;q89ZJ6T-G@yGywq0MX2il literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..d361c1816e76141ea57afb637ea8bfcc10d4368a GIT binary patch literal 326 zcmV-M0lEH(P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$07*naR9J=Wmaz(hFcd|v%_2A!2fsk*+z%*p>e6o(>>m^gg1dvG2vP{?l#)us zyqAa+azGRl&CLlU4~RtmnX2hk)%0q&!EMh}4z`!i@~otslzHb4utwtAQOZdPk$(Hn zXMHJi=YN@44cHJOO|*%s=~a;d=EYqGQfetDRks6*%--IObQ8`70HAIM9PhWqc8&>B z0020>9@J051kmf=b_3qma2Ci0fUp*v0_fRmLRw%M0K!>d2UxSPc>o}c1+M@hEO-R~ z{4IC~uvwsN$xZ<-WuA27a=VWOZv()u1?qw19AGO8<RW6eE1GbQV^$Tjw9Rs>qDW*{ YK8bvW6U=4z!2kdN07*qoM6N<$f-tCr2><{9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/meta.json new file mode 100644 index 0000000000..5b4e18246f --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/eggnogglass.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Sprite by uhbg on github", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + } + ] +} From 1ba2dfa10e064fd8abdd3be4d8b3c3422bdcb64d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 21:28:42 +0000 Subject: [PATCH 475/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 31f243e804..0b91e34f65 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,19 +1,4 @@ Entries: -- author: Errant - changes: - - message: Battery-powered weapons will no longer occasionally refuse to recharge - the last missing shot. - type: Fix - id: 7791 - time: '2025-01-10T06:54:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34028 -- author: Southbridge - changes: - - message: Air Alarms can now copy sensor thresholds to all attached sensors. - type: Add - id: 7792 - time: '2025-01-10T06:55:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34346 - author: Coolsurf6 changes: - message: Made Forensic Gloves security contraband. @@ -3897,3 +3882,19 @@ id: 8291 time: '2025-04-20T21:17:12.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36510 +- author: Princess Cheeseballs + changes: + - message: Items now slip on slippery surfaces + type: Add + - message: Puddle slipperiness has been tweaked to be more intuitive + type: Tweak + id: 8292 + time: '2025-04-20T21:27:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35845 +- author: uhbg + changes: + - message: The Bartender can now make Eggnog by shaking an egg, milk, and rum. + type: Add + id: 8293 + time: '2025-04-20T21:27:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34065 From 256b6b88fb0832b0f82b61140c5be4b940052b95 Mon Sep 17 00:00:00 2001 From: Jackson Langley <tripwiregamer@gmail.com> Date: Sun, 20 Apr 2025 16:34:19 -0500 Subject: [PATCH 476/622] Require traitors to maroon their objective no matter what (#35825) * jesus * okay. * OOPS * ok * ok Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * ok * Update Resources/Prototypes/Objectives/paradoxClone.yml Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Update Resources/Prototypes/Objectives/base_objectives.yml Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * m * ok * ok --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../KillPersonConditionComponent.cs | 8 ++++- .../Systems/KillPersonConditionSystem.cs | 34 ++++++++----------- .../objectives/conditions/kill-person.ftl | 2 ++ .../Prototypes/Objectives/paradoxClone.yml | 2 +- Resources/Prototypes/Objectives/traitor.yml | 7 ++-- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Content.Server/Objectives/Components/KillPersonConditionComponent.cs b/Content.Server/Objectives/Components/KillPersonConditionComponent.cs index 7bbc42ac98..534e8094b6 100644 --- a/Content.Server/Objectives/Components/KillPersonConditionComponent.cs +++ b/Content.Server/Objectives/Components/KillPersonConditionComponent.cs @@ -10,8 +10,14 @@ namespace Content.Server.Objectives.Components; public sealed partial class KillPersonConditionComponent : Component { /// <summary> - /// Whether the target must be truly dead, ignores missing evac. + /// Whether the target must be dead /// </summary> [DataField, ViewVariables(VVAccess.ReadWrite)] public bool RequireDead = false; + + /// <summary> + /// Whether the target must not be on evac + /// </summary> + [DataField, ViewVariables(VVAccess.ReadWrite)] + public bool RequireMaroon = false; } diff --git a/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs b/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs index 45ad68e28b..c378841278 100644 --- a/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs +++ b/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs @@ -29,36 +29,30 @@ public sealed class KillPersonConditionSystem : EntitySystem if (!_target.GetTarget(uid, out var target)) return; - args.Progress = GetProgress(target.Value, comp.RequireDead); + args.Progress = GetProgress(target.Value, comp.RequireDead, comp.RequireMaroon); } - private float GetProgress(EntityUid target, bool requireDead) + private float GetProgress(EntityUid target, bool requireDead, bool requireMaroon) { // deleted or gibbed or something, counts as dead if (!TryComp<MindComponent>(target, out var mind) || mind.OwnedEntity == null) return 1f; - // dead is success - if (_mind.IsCharacterDeadIc(mind)) - return 1f; + var targetDead = _mind.IsCharacterDeadIc(mind); + var targetMarooned = !_emergencyShuttle.IsTargetEscaping(target) && + _emergencyShuttle.ShuttlesLeft; + if (!_config.GetCVar(CCVars.EmergencyShuttleEnabled) && requireMaroon) + { + requireDead = true; + requireMaroon = false; + } - // if the target has to be dead dead then don't check evac stuff - if (requireDead) + if (requireDead && !targetDead) return 0f; - // if evac is disabled then they really do have to be dead - if (!_config.GetCVar(CCVars.EmergencyShuttleEnabled)) - return 0f; + if (requireMaroon) // if evac is still here and target hasn't boarded, show 50% to give you an indicator that you are doing good + return targetMarooned ? 1f : _emergencyShuttle.EmergencyShuttleArrived ? 0.5f : 0f; - // target is escaping so you fail - if (_emergencyShuttle.IsTargetEscaping(mind.OwnedEntity.Value)) - return 0f; - - // evac has left without the target, greentext since the target is afk in space with a full oxygen tank and coordinates off. - if (_emergencyShuttle.ShuttlesLeft) - return 1f; - - // if evac is still here and target hasn't boarded, show 50% to give you an indicator that you are doing good - return _emergencyShuttle.EmergencyShuttleArrived ? 0.5f : 0f; + return 1f; // Good job you did it woohoo } } diff --git a/Resources/Locale/en-US/objectives/conditions/kill-person.ftl b/Resources/Locale/en-US/objectives/conditions/kill-person.ftl index c48e2122ff..48606b92c2 100644 --- a/Resources/Locale/en-US/objectives/conditions/kill-person.ftl +++ b/Resources/Locale/en-US/objectives/conditions/kill-person.ftl @@ -1 +1,3 @@ objective-condition-kill-person-title = Kill or maroon {$targetName}, {CAPITALIZE($job)} +objective-condition-kill-maroon-title = Kill and maroon {$targetName}, {CAPITALIZE($job)} +objective-condition-maroon-person-title = Maroon {$targetName}, {CAPITALIZE($job)} diff --git a/Resources/Prototypes/Objectives/paradoxClone.yml b/Resources/Prototypes/Objectives/paradoxClone.yml index 40a1021676..34b41050c7 100644 --- a/Resources/Prototypes/Objectives/paradoxClone.yml +++ b/Resources/Prototypes/Objectives/paradoxClone.yml @@ -34,7 +34,7 @@ components: - type: PickSpecificPerson - type: KillPersonCondition - requireDead: true # don't count missing evac as killing + requireDead: true - type: TargetObjective title: objective-condition-kill-head-title # kill <name>, <job> diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index de222df6cc..1da9953b60 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -89,13 +89,13 @@ difficulty: 1.75 unique: false - type: TargetObjective - title: objective-condition-kill-person-title + title: objective-condition-maroon-person-title - type: PickRandomPerson - type: entity parent: [BaseTraitorObjective, BaseKillObjective] id: KillRandomHeadObjective - description: We need this head gone and you probably know why. Good luck, agent. + description: We need this head gone and you probably know why. Make sure they don't make it to centcomm, even if they're dead. Good luck, agent. components: - type: Objective # technically its still possible for KillRandomPersonObjective to roll a head but this is guaranteed, so higher difficulty @@ -103,12 +103,13 @@ # killing 1 head is enough unique: true - type: TargetObjective - title: objective-condition-kill-head-title + title: objective-condition-kill-maroon-title - type: PickRandomHead - type: KillPersonCondition # don't count missing evac as killing as heads are higher profile, so you really need to do the dirty work # if ce flies a shittle to centcom you better find a way onto it requireDead: true + requireMaroon: true # social From 9ab3bd6792ce741e6830d53c4b4b5933654fec86 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 21:35:26 +0000 Subject: [PATCH 477/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0b91e34f65..d97667fae1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Coolsurf6 - changes: - - message: Made Forensic Gloves security contraband. - type: Tweak - id: 7793 - time: '2025-01-10T15:01:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34193 - author: TeenSarlacc changes: - message: Large instruments can now be ordered through cargo. @@ -3898,3 +3891,10 @@ id: 8293 time: '2025-04-20T21:27:35.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34065 +- author: notquitehadouken + changes: + - message: Kill objectives will now always require you to maroon your target. + type: Tweak + id: 8294 + time: '2025-04-20T21:34:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35825 From dee1db4113e7355dc0d6b113aad68cfe32449c81 Mon Sep 17 00:00:00 2001 From: Entvari <195642967+Entvari@users.noreply.github.com> Date: Sun, 20 Apr 2025 22:38:30 +0100 Subject: [PATCH 478/622] Wizard Headset (#35732) * wizardcomms * wizheadset * Addressed requested changes and axed wizard channel due to redundancy. * oops overlooked this, dont tell anyone * another mistake fixed * removed wiz encryption key due to redundancy * accidentally left some punctuation in a now unrelated meta.json --- .../Entities/Clothing/Ears/headsets.yml | 17 +++++++++++- .../Entities/Clothing/Ears/headsets_alt.yml | 17 ++++++++++++ .../Roles/Jobs/Fun/wizard_startinggear.yml | 2 +- .../Headsets/wizard.rsi/alt-equipped-EARS.png | Bin 0 -> 752 bytes .../Headsets/wizard.rsi/equipped-EARS.png | Bin 0 -> 556 bytes .../Ears/Headsets/wizard.rsi/icon.png | Bin 0 -> 742 bytes .../Ears/Headsets/wizard.rsi/icon_alt.png | Bin 0 -> 900 bytes .../Ears/Headsets/wizard.rsi/meta.json | 25 ++++++++++++++++++ 8 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/alt-equipped-EARS.png create mode 100644 Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/equipped-EARS.png create mode 100644 Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/icon_alt.png create mode 100644 Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/meta.json diff --git a/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml b/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml index 89227387f9..f2c76cce99 100644 --- a/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml +++ b/Resources/Prototypes/Entities/Clothing/Ears/headsets.yml @@ -283,8 +283,23 @@ - type: ContainerFill containers: key_slots: - - EncryptionKeyFreelance + - EncryptionKeyFreelance - type: Sprite sprite: Clothing/Ears/Headsets/freelance.rsi - type: Clothing sprite: Clothing/Ears/Headsets/freelance.rsi + +- type: entity + parent: [ClothingHeadset, BaseMagicalContraband] + id: ClothingHeadsetWizard + name: wizard headset + description: A headset used by the dreaded space wizards. + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyStationMaster + - type: Sprite + sprite: Clothing/Ears/Headsets/wizard.rsi + - type: Clothing + sprite: Clothing/Ears/Headsets/wizard.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml b/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml index 42343d1569..f27f6a6a15 100644 --- a/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml +++ b/Resources/Prototypes/Entities/Clothing/Ears/headsets_alt.yml @@ -155,3 +155,20 @@ sprite: Clothing/Ears/Headsets/freelance.rsi - type: Clothing sprite: Clothing/Ears/Headsets/freelance.rsi + +- type: entity + parent: [ClothingHeadsetAlt, BaseMagicalContraband] + id: ClothingHeadsetAltWizard + name: wizard's over-ear headset + components: + - type: Headset + - type: EncryptionKeyHolder + keySlots: 5 + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyStationMaster + - type: Sprite + sprite: Clothing/Ears/Headsets/wizard.rsi + - type: Clothing + sprite: Clothing/Ears/Headsets/wizard.rsi diff --git a/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml index 0697b698b2..d296a02754 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml @@ -8,7 +8,7 @@ outerClothing: ClothingOuterWizard shoes: ClothingShoesWizard id: WizardPDA - ears: ClothingHeadsetAltCommand + ears: ClothingHeadsetAltWizard belt: ClothingBeltWand # pocket1: TODO: Include wizard teleport scroll pocket2: WizardsGrimoire diff --git a/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/alt-equipped-EARS.png b/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/alt-equipped-EARS.png new file mode 100644 index 0000000000000000000000000000000000000000..5edd6b5794b3f7b466a76b5e8d2c2c36a605c07a GIT binary patch literal 752 zcmV<M0uTL(P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0004YX+uL$Nkc;* zP;zf(X>4Tx04UFukvU5PQ51#0Bx-^S5wsAoNTFg8K@`MNB4`sWk_bj^X2vW+mSHAA zf~{a<Ay|kuZiW9qTftUA5EMbg&fcw&Fy5C05=0B%@aBG;H|KKS8E}U)M%Hecglw*0 zMP@>Qh4^B?`$8*iw9tu9Gi-A<IvwNB^?8R&)!Sj!i~p^*m4t18%O^Z;m{vhprXjpm zFcohJcN=MKMfgxSXvu)WS4!8b{H!=t<#)waEHWi`Q#}Kz2G$$cNLyLqA>saPrfAgW zQ8#H%<mRJNdu8`w6JdrB0d$J2lA*w`)SP7YyKki8n<FnCL*6DOEODeri#I50QMx9i zCPh!klcA(?|Cy(q92>26Zx2E9ljFP%fOiMV+m7>f<T&MH@I1mruI|rEP7@!ZZ`ZZ{ z1MqLa*=1eRcj0^!dLB&8(khZiwmX@G*Hh?-L)Q(oE>*LtopW*zv32=H*RZz_gYvz9 z`5V3TXX~bQ;Vl3F010qNS#tmY4#WTe4#WYKD-Ig~00AILL_t(|UhUekYJ@Nt!11&o z;v)44d<|c~sYuaX4%`b}+9xS=bMXNjq&Kv~J(1nTA;)*5rRyc;6#V}{;wL2eOf*ZP zfPK3&<<;uC*7H28X_{2u_tx#$D$7!bVW@&2P+iwq_it6PX&T+O?O)xZDD*H4HyZ@$ zFHKVw$FY)07{^il&u0~q)cfhEP3VQRFa5{_m`B_4^zh;}u{_VU{CXx_#JwpO^Ktmp zKd0Bogp0|t?6T&#{O?{#f^wPA3*YTqxy6eE0000000000U~OC25pvDJX>&A55_7j6 z*BqP%Ac_{>1isqi+q1c|V?6*>Rb4*4-*OGo_jmbaq8*Y08FC)M_rZ+Kk_B*=FVC3- i000000001h4W-V*4POHop{JAp0000<MNUMnLSTYM*j5n$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/equipped-EARS.png b/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/equipped-EARS.png new file mode 100644 index 0000000000000000000000000000000000000000..48bf52378ced30f22ab28a66e92dc32181441831 GIT binary patch literal 556 zcmV+{0@MA8P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0004YX+uL$Nkc;* zP;zf(X>4Tx04UFukvU5PQ51#0Bx-^S5wsAoNTFg8K@`MNB4`sWk_bj^X2vW+mSHAA zf~{a<Ay|kuZiW9qTftUA5EMbg&fcw&Fy5C05=0B%@aBG;H|KKS8E}U)M%Hecglw*0 zMP@>Qh4^B?`$8*iw9tu9Gi-A<IvwNB^?8R&)!Sj!i~p^*m4t18%O^Z;m{vhprXjpm zFcohJcN=MKMfgxSXvu)WS4!8b{H!=t<#)waEHWi`Q#}Kz2G$$cNLyLqA>saPrfAgW zQ8#H%<mRJNdu8`w6JdrB0d$J2lA*w`)SP7YyKki8n<FnCL*6DOEODeri#I50QMx9i zCPh!klcA(?|Cy(q92>26Zx2E9ljFP%fOiMV+m7>f<T&MH@I1mruI|rEP7@!ZZ`ZZ{ z1MqLa*=1eRcj0^!dLB&8(khZiwmX@G*Hh?-L)Q(oE>*LtopW*zv32=H*RZz_gYvz9 z`5V3TXX~bQ;Vl3F010qNS#tmY4#WTe4#WYKD-Ig~003M`L_t(|UhUek5r9Al1VBo# zGrKVUvMk1))Zoocn1T7-h!Bnt0s#IwkL#XgN$LIV+bA7CYJb&-|12Fsmn8uJ00000 u0F6}t6-c-ACDs}GB?JHf0002GiFg2#2pGytLx*bs0000<MNUMnLSTY!W9&-+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/icon.png b/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..519219cfa6e965136cc14296d92b8cd3321b1d5b GIT binary patch literal 742 zcmV<C0vY{@P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004YX+uL$Nkc;* zP;zf(X>4Tx04UFukvU5PQ51#0Bx-^S5wsAoNTFg8K@`MNB4`sWk_bj^X2vW+mSHAA zf~{a<Ay|kuZiW9qTftUA5EMbg&fcw&Fy5C05=0B%@aBG;H|KKS8E}U)M%Hecglw*0 zMP@>Qh4^B?`$8*iw9tu9Gi-A<IvwNB^?8R&)!Sj!i~p^*m4t18%O^Z;m{vhprXjpm zFcohJcN=MKMfgxSXvu)WS4!8b{H!=t<#)waEHWi`Q#}Kz2G$$cNLyLqA>saPrfAgW zQ8#H%<mRJNdu8`w6JdrB0d$J2lA*w`)SP7YyKki8n<FnCL*6DOEODeri#I50QMx9i zCPh!klcA(?|Cy(q92>26Zx2E9ljFP%fOiMV+m7>f<T&MH@I1mruI|rEP7@!ZZ`ZZ{ z1MqLa*=1eRcj0^!dLB&8(khZiwmX@G*Hh?-L)Q(oE>*LtopW*zv32=H*RZz_gYvz9 z`5V3TXX~bQ;Vl3F010qNS#tmY3lRVS3lRZ-WM7d0009<BL_t(oM`IWTqhJ(_c)$py zi2@Q5694)6co{x^`pod+#S4=3;sQh)qOK_Y-&i1&L4rq?!A#Shp<t5_RUE+trSSrg z&%I@ez?L8Qx|HF|eFlaJep|reP$gsoq8tDNAj{95J<BldZ5mXBazK&;zJ2?~(8_og zOrN@b5GqO;Ajtu=07J_G>MuMPmTJa;X%OJ!;{(%_0HPgm_wr)~WnEbYZZ0k`4dQ?L z^a(0UJ|H?DtEs8|mwRCa<uNckl|0ID{pM{H{o>-{@ND_=<x8p*R44$H?_Ky3{^QF3 zAO|2jf*3$j8UV%lWzOw*<DMoyM+UfjNUF~%0_c`eVmaBtg={I!gMAc?f>AIEXa^V= Y0DzrT5bmd^tpET307*qoM6N<$f^tel+yDRo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/icon_alt.png b/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/icon_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..95f4f5a8e7c5d2a8620def2b09a2e0a0ed2844c8 GIT binary patch literal 900 zcmV-~1AF|5P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80004XX+uL$Nkc;* zP;zf(X>4Tx04UFuk-JO7P!z_0)%u`SI_MzckfDl06;TjJsi2EGv=ywnH0eu7V@O&= zTm=^g!9jHKHTWOsD!3{Lf+C2xx%*nA#B;6CB06}(&H3@&e1~(tK;5Ki6kPu(6s)2X zn}}+&$vLg*i2y+w@zb9&Tze`$p5V{*euGcd>ps<s|E*v;;~L;=79KWirzkAbFu7c` z6>kW)8~IdPcwac;$biBZO4lp=s5n>QSH(^uHYRsdJ+)j7>osiToq}+$aJXQWjPH5W zO<FS6Ok8TG>@HklOb|swr^F&AMf#*#lG*RRfiK@QOX4x)ZL@+SjvRUMMno-1*NoJx z=oxuTR#fgk^K`RAgO%<rQD}JZyq9ih+Jf??=Y1S_UilE}@8Qg<`j;f9kvGvdt6F#u zLThkxUe)w%I9-R1J3Hm1zNC8Db=fRDA46*r+O8llU&-qGoTFPvtjaICgq>aJk?%tb zpY{f51q&s?K>z>%32;bRa{vGf5dZ)S5dnW>Uy%R+0kug)K~z{rV;BXaU=$2AV1&{{ z12t9E{~(%!ogK^vflF7ekZcYNkfc#hM+a;<4E*@{6YLNeO^!o|)&TN3%(7dzZ-ez= za}Z39SU{9wm_@iO0LdeV1}TmpsL;*H>HoLy-x*%Ld4m$~Ab=d?Fh_s@DGp$Q(m27c zeft=>I5{ya=i}uCI}XYPJMh!z&tMEosKfxGU5XAsJ_b1g1n%6w&k&_r%8;Cx3g$ak zsev6xOh^z60bBqU{4mQwAa;ra!-Ff&7@9-of<uBBK(+%w0NL^bUzakRJ$sg+_COTF zmv0{#%Dws+BqSsVMg>I<fJFfaeEar|VMf9>F#YD?XNJeOpF?Hv1Bx7g4&;QD8CaPa z8NUDe0u><)D0aZz%a5Tf@&Hvr0OSZS(Nu=^#gz<39DYzy;s8Ys0A;h294o-=tCwyv zypej!z{$c5<}bV5&G6#I3xe5@paOAmad=98`SK-J^`L@B^R+jW$G~u1bSp`vAwd9g z1hPZ00Z^9n7by5oOx8mNM7t8?0De9`tUiMky&pe)!Wl}q0Lj6Gt(>Q7aF2pfFbe1k a7#IMPxw=?4U~vQh0000<MNUMnLSTYMVTytP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/meta.json b/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/meta.json new file mode 100644 index 0000000000..4478127785 --- /dev/null +++ b/Resources/Textures/Clothing/Ears/Headsets/wizard.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprite recoloured from Freelance Headsets by Entvari (Github). Sprite modified by PursuitInAshes (Github) for SS14, original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_alt" + }, + { + "name": "equipped-EARS", + "directions": 4 + }, + { + "name": "alt-equipped-EARS", + "directions": 4 + } + ] +} From 40afc6f58afbf8a9b1ab7898f4e7e9f39a42bfaa Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 21:39:36 +0000 Subject: [PATCH 479/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d97667fae1..fb6220a76e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TeenSarlacc - changes: - - message: Large instruments can now be ordered through cargo. - type: Add - id: 7794 - time: '2025-01-10T15:13:23.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34240 - author: themias changes: - message: Fixed crayons losing durability attempting to write on stamped paper @@ -3898,3 +3891,12 @@ id: 8294 time: '2025-04-20T21:34:19.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35825 +- author: Entvari + changes: + - message: Added a new Wizard headset. + type: Add + - message: The Wizard now starts with the Wizard headset. + type: Tweak + id: 8295 + time: '2025-04-20T21:38:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35732 From 592530593d484bce40e7dcd2aed52beea2a35c0c Mon Sep 17 00:00:00 2001 From: dffdff2423 <dffdff2423@gmail.com> Date: Sun, 20 Apr 2025 17:42:49 -0400 Subject: [PATCH 480/622] Remove MK ULTRA ai name (#35726) * Remove bad AI names * Fine, I won't try to sneak this in here. --- Resources/Locale/en-US/datasets/names/ai.ftl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Locale/en-US/datasets/names/ai.ftl b/Resources/Locale/en-US/datasets/names/ai.ftl index eaa268b3de..2fde34369b 100644 --- a/Resources/Locale/en-US/datasets/names/ai.ftl +++ b/Resources/Locale/en-US/datasets/names/ai.ftl @@ -90,7 +90,7 @@ names-ai-dataset-64 = Knight names-ai-dataset-65 = Louie # Named after the Manchester Mark 1, the successor of which was actually named the Ferranti Mark 1, rather than Manchester Mark 2 -names-ai-dataset-66 = Manchester Mark 2 +names-ai-dataset-66 = Manchester Mark 2 names-ai-dataset-67 = MARK13 names-ai-dataset-68 = Maria @@ -98,7 +98,7 @@ names-ai-dataset-69 = Marvin names-ai-dataset-70 = Max 404 names-ai-dataset-71 = Metalhead names-ai-dataset-72 = M.I.M.I -names-ai-dataset-73 = MK ULTRA +names-ai-dataset-73 = Large Language Model names-ai-dataset-74 = Monarch names-ai-dataset-75 = Mugsy3000 names-ai-dataset-76 = Multivac From f52445ec4e5e8ee813823a86bdfc2b7cceb18c96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= <ss.adasts@gmail.com> Date: Sun, 20 Apr 2025 17:27:49 -0500 Subject: [PATCH 481/622] Reorder electronics recipe file, add filter categories (#35713) * electronics split * split base recipe and category * all but machines * machine shuffle * reorder * delete unused recipes * rename cargo to supply * git weirdness * git weirdness 2 --- .../Locale/en-US/lathe/lathe-categories.ftl | 15 +- .../Recipes/Lathes/base_electronics.yml | 61 ++ .../Prototypes/Recipes/Lathes/categories.yml | 42 +- .../Prototypes/Recipes/Lathes/circuitry.yml | 117 +++ .../Recipes/Lathes/computer_boards.yml | 105 +++ .../{electronics.yml => machine_boards.yml} | 882 ++++++++---------- 6 files changed, 707 insertions(+), 515 deletions(-) create mode 100644 Resources/Prototypes/Recipes/Lathes/base_electronics.yml create mode 100644 Resources/Prototypes/Recipes/Lathes/circuitry.yml create mode 100644 Resources/Prototypes/Recipes/Lathes/computer_boards.yml rename Resources/Prototypes/Recipes/Lathes/{electronics.yml => machine_boards.yml} (52%) diff --git a/Resources/Locale/en-US/lathe/lathe-categories.ftl b/Resources/Locale/en-US/lathe/lathe-categories.ftl index 8c118e51ad..fde710bd78 100644 --- a/Resources/Locale/en-US/lathe/lathe-categories.ftl +++ b/Resources/Locale/en-US/lathe/lathe-categories.ftl @@ -2,7 +2,7 @@ lathe-category-circuitry = Circuitry lathe-category-clothing = Clothing lathe-category-lights = Lights -lathe-category-mechs = Mechs +lathe-category-machines = Machines lathe-category-parts = Parts lathe-category-robotics = Robotics lathe-category-tools = Tools @@ -13,6 +13,19 @@ lathe-category-food = Food lathe-category-chemicals = Chemicals lathe-category-materials = Materials +# Circuit imprinter +lathe-category-computers = Computers +lathe-category-engineering = Engineering +lathe-category-general = General +lathe-category-medical = Medical +lathe-category-research = Research +lathe-category-security = Security +lathe-category-service = Service +lathe-category-supply = Supply + +# Science +lathe-category-mechs = Mechs + # Sec lathe-category-ammo = Ammo lathe-category-boxes = Boxes diff --git a/Resources/Prototypes/Recipes/Lathes/base_electronics.yml b/Resources/Prototypes/Recipes/Lathes/base_electronics.yml new file mode 100644 index 0000000000..e37d7c251e --- /dev/null +++ b/Resources/Prototypes/Recipes/Lathes/base_electronics.yml @@ -0,0 +1,61 @@ +# Costs for computer boards, machine boards, and circuitry + +- type: latheRecipe + abstract: true + id: BaseElectronicsRecipe + completetime: 2 + materials: + Steel: 100 + Plastic: 300 + +- type: latheRecipe + parent: BaseElectronicsRecipe + abstract: true + id: BaseCheapElectronicsRecipe + materials: + Steel: 50 + Plastic: 50 + +- type: latheRecipe + parent: BaseElectronicsRecipe + abstract: true + id: BaseCheapCircuitboardRecipe + materials: + Steel: 50 + Glass: 250 + +- type: latheRecipe + parent: BaseElectronicsRecipe + abstract: true + id: BaseCircuitboardRecipe + completetime: 4 + materials: + Steel: 100 + Glass: 500 + +- type: latheRecipe + parent: BaseCircuitboardRecipe + abstract: true + id: BaseGoldCircuitboardRecipe + materials: + Steel: 100 + Glass: 500 + Gold: 100 + +- type: latheRecipe + parent: BaseCircuitboardRecipe + abstract: true + id: BaseSilverCircuitboardRecipe + materials: + Steel: 100 + Glass: 500 + Silver: 100 + +- type: latheRecipe + parent: BaseCircuitboardRecipe + abstract: true + id: BaseBananiumCircuitboardRecipe + materials: + Steel: 100 + Glass: 500 + Bananium: 100 diff --git a/Resources/Prototypes/Recipes/Lathes/categories.yml b/Resources/Prototypes/Recipes/Lathes/categories.yml index b0b607adb5..7becbb58e4 100644 --- a/Resources/Prototypes/Recipes/Lathes/categories.yml +++ b/Resources/Prototypes/Recipes/Lathes/categories.yml @@ -12,8 +12,8 @@ name: lathe-category-lights - type: latheCategory - id: Mech - name: lathe-category-mechs + id: Machines + name: lathe-category-machines - type: latheCategory id: Parts @@ -44,6 +44,44 @@ id: Materials name: lathe-category-materials +# Circuit imprinter +- type: latheCategory + id: Computers + name: lathe-category-computers + +- type: latheCategory + id: Engineering + name: lathe-category-engineering + +- type: latheCategory + id: General + name: lathe-category-general + +- type: latheCategory + id: Medical + name: lathe-category-medical + +- type: latheCategory + id: Research + name: lathe-category-research + +- type: latheCategory + id: Security + name: lathe-category-security + +- type: latheCategory + id: Service + name: lathe-category-service + +- type: latheCategory + id: Supply + name: lathe-category-supply + +# Science +- type: latheCategory + id: Mech + name: lathe-category-mechs + # Sec - type: latheCategory id: Ammo diff --git a/Resources/Prototypes/Recipes/Lathes/circuitry.yml b/Resources/Prototypes/Recipes/Lathes/circuitry.yml new file mode 100644 index 0000000000..2b37baf3cb --- /dev/null +++ b/Resources/Prototypes/Recipes/Lathes/circuitry.yml @@ -0,0 +1,117 @@ +# Non-machine boards, non-computer boards +# Base categories + +- type: latheRecipe + abstract: true + id: BaseCircuitryRecipeCategory + categories: + - Circuitry + +- type: latheRecipe + abstract: true + id: BaseMechRecipeCategory + categories: + - Mech + +## Recipes + +# Misc +- type: latheRecipe + parent: [ BaseCheapElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: FreezerElectronics + result: FreezerElectronics + +- type: latheRecipe + parent: [ BaseElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: MailingUnitElectronics + result: MailingUnitElectronics + +# Airtight +- type: latheRecipe + parent: [ BaseCheapElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: FirelockElectronics + result: FirelockElectronics + +- type: latheRecipe + parent: [ BaseCheapElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: DoorElectronics + result: DoorElectronics + +# Power +- type: latheRecipe + parent: [ BaseCheapCircuitboardRecipe, BaseCircuitryRecipeCategory ] + id: APCElectronics + result: APCElectronics + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseCircuitryRecipeCategory ] + id: SolarTrackerElectronics + result: SolarTrackerElectronics + +# Wallmount power +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseCircuitryRecipeCategory ] + id: WallmountSubstationElectronics + result: WallmountSubstationElectronics + +# Wallmount +- type: latheRecipe + parent: [ BaseCheapElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: StationMapElectronics + result: StationMapCircuitboard + +- type: latheRecipe + parent: [ BaseCheapElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: SignalTimerElectronics + result: SignalTimerElectronics + +- type: latheRecipe + parent: [ BaseElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: AirAlarmElectronics + result: AirAlarmElectronics + +- type: latheRecipe + parent: [ BaseElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: IntercomElectronics + result: IntercomElectronics + +- type: latheRecipe + parent: [ BaseElectronicsRecipe, BaseCircuitryRecipeCategory ] + id: FireAlarmElectronics + result: FireAlarmElectronics + +# Mechs +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseMechRecipeCategory ] + id: RipleyCentralElectronics + result: RipleyCentralElectronics + +- type: latheRecipe + parent: RipleyCentralElectronics + id: RipleyPeripheralsElectronics + result: RipleyPeripheralsElectronics + +- type: latheRecipe + parent: [ BaseBananiumCircuitboardRecipe, BaseMechRecipeCategory ] + id: HonkerCentralElectronics + result: HonkerCentralElectronics + +- type: latheRecipe + parent: HonkerCentralElectronics + id: HonkerPeripheralsElectronics + result: HonkerPeripheralsElectronics + +- type: latheRecipe + parent: HonkerCentralElectronics + id: HonkerTargetingElectronics + result: HonkerTargetingElectronics + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseMechRecipeCategory] + id: HamtrCentralElectronics + result: HamtrCentralElectronics + +- type: latheRecipe + parent: HamtrCentralElectronics + id: HamtrPeripheralsElectronics + result: HamtrPeripheralsElectronics diff --git a/Resources/Prototypes/Recipes/Lathes/computer_boards.yml b/Resources/Prototypes/Recipes/Lathes/computer_boards.yml new file mode 100644 index 0000000000..2bf3bb3c34 --- /dev/null +++ b/Resources/Prototypes/Recipes/Lathes/computer_boards.yml @@ -0,0 +1,105 @@ +# Base categories + +- type: latheRecipe + abstract: true + id: BaseEngineeringComputerRecipeCategory + categories: + - Computers + - Engineering + +- type: latheRecipe + abstract: true + id: BaseMedicalComputerRecipeCategory + categories: + - Computers + - Medical + +- type: latheRecipe + abstract: true + id: BaseResearchComputerRecipeCategory + categories: + - Computers + - Research + +- type: latheRecipe + abstract: true + id: BaseSecurityComputerRecipeCategory + categories: + - Computers + - Security + +- type: latheRecipe + abstract: true + id: BaseServiceComputerRecipeCategory + categories: + - Computers + - Service + +- type: latheRecipe + abstract: true + id: BaseSupplyComputerRecipeCategory + categories: + - Computers + - Supply + +- type: latheRecipe + abstract: true + id: BaseGeneralComputerRecipeCategory + categories: + - Computers + - General + +## Recipes + +# Engineering +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseEngineeringComputerRecipeCategory ] + id: SolarControlComputerCircuitboard + result: SolarControlComputerCircuitboard + +# Medical + +# Science +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseResearchComputerRecipeCategory ] + id: AnalysisComputerCircuitboard + result: AnalysisComputerCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseResearchComputerRecipeCategory ] + id: TechDiskComputerCircuitboard + result: TechDiskComputerCircuitboard + +# Cameras +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSecurityComputerRecipeCategory ] + id: SurveillanceCameraMonitorCircuitboard + result: SurveillanceCameraMonitorCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceComputerRecipeCategory ] + id: SurveillanceWirelessCameraMonitorCircuitboard + result: SurveillanceWirelessCameraMonitorCircuitboard + +# Service +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceComputerRecipeCategory ] + id: MassMediaCircuitboard + result: ComputerMassMediaCircuitboard + +# Shuttle +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseSupplyComputerRecipeCategory ] + id: ShuttleConsoleCircuitboard + result: ShuttleConsoleCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSupplyComputerRecipeCategory ] + id: RadarConsoleCircuitboard + result: RadarConsoleCircuitboard + +# Civilian +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseGeneralComputerRecipeCategory ] + id: ComputerTelevisionCircuitboard + result: ComputerTelevisionCircuitboard diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/machine_boards.yml similarity index 52% rename from Resources/Prototypes/Recipes/Lathes/electronics.yml rename to Resources/Prototypes/Recipes/Lathes/machine_boards.yml index f6f56ab282..23eb3bfbb7 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/machine_boards.yml @@ -1,412 +1,158 @@ -# Base protoypes +# Base categories - type: latheRecipe abstract: true - id: BaseElectronicsRecipe + id: BaseMachineRecipeCategory categories: - - Circuitry - completetime: 2 - materials: - Steel: 100 - Plastic: 300 + - Machines - type: latheRecipe abstract: true - parent: BaseElectronicsRecipe - id: BaseCheapElectronicsRecipe - materials: - Steel: 50 - Plastic: 50 + id: BaseEngineeringMachineRecipeCategory + categories: + - Machines + - Engineering - type: latheRecipe abstract: true - parent: BaseElectronicsRecipe - id: BaseCheapCircuitboardRecipe - materials: - Steel: 50 - Glass: 250 + id: BaseMedicalMachineRecipeCategory + categories: + - Machines + - Medical - type: latheRecipe abstract: true - parent: BaseElectronicsRecipe - id: BaseCircuitboardRecipe - completetime: 4 - materials: - Steel: 100 - Glass: 500 + id: BaseResearchMachineRecipeCategory + categories: + - Machines + - Research - type: latheRecipe abstract: true - parent: BaseCircuitboardRecipe - id: BaseGoldCircuitboardRecipe - materials: - Steel: 100 - Glass: 500 - Gold: 100 + id: BaseSecurityMachineRecipeCategory + categories: + - Machines + - Security - type: latheRecipe abstract: true - parent: BaseCircuitboardRecipe - id: BaseSilverCircuitboardRecipe - materials: - Steel: 100 - Glass: 500 - Silver: 100 + id: BaseServiceMachineRecipeCategory + categories: + - Machines + - Service - type: latheRecipe abstract: true - parent: BaseCircuitboardRecipe - id: BaseBananiumCircuitboardRecipe - materials: - Steel: 100 - Glass: 500 - Bananium: 100 - -# Recipes + id: BaseSupplyMachineRecipeCategory + categories: + - Machines + - Supply - type: latheRecipe - parent: BaseCheapElectronicsRecipe - id: FirelockElectronics - result: FirelockElectronics + abstract: true + id: BaseGeneralMachineRecipeCategory + categories: + - Machines + - General -- type: latheRecipe - parent: BaseElectronicsRecipe - id: MailingUnitElectronics - result: MailingUnitElectronics +## Recipes +## Non-circuit imprinter (no second category) + +# Autolathe - type: latheRecipe - parent: BaseCheapElectronicsRecipe + parent: [ BaseCheapElectronicsRecipe, BaseMachineRecipeCategory ] id: CellRechargerCircuitboard result: CellRechargerCircuitboard - type: latheRecipe - parent: CellRechargerCircuitboard - id: BorgChargerCircuitboard - result: BorgChargerCircuitboard - -- type: latheRecipe - parent: CellRechargerCircuitboard + parent: [ BaseCheapElectronicsRecipe, BaseMachineRecipeCategory ] id: WeaponCapacitorRechargerCircuitboard result: WeaponCapacitorRechargerCircuitboard - type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: TurboItemRechargerCircuitboard - result: TurboItemRechargerCircuitboard - -- type: latheRecipe - parent: BaseCheapElectronicsRecipe - id: DoorElectronics - result: DoorElectronics - -- type: latheRecipe - parent: BaseCheapElectronicsRecipe - id: FreezerElectronics - result: FreezerElectronics - -- type: latheRecipe - parent: BaseElectronicsRecipe - id: AirAlarmElectronics - result: AirAlarmElectronics - -- type: latheRecipe - parent: BaseCheapElectronicsRecipe - id: StationMapElectronics - result: StationMapCircuitboard - -- type: latheRecipe - parent: BaseElectronicsRecipe - id: IntercomElectronics - result: IntercomElectronics - -- type: latheRecipe - parent: BaseElectronicsRecipe - id: FireAlarmElectronics - result: FireAlarmElectronics - -- type: latheRecipe - parent: BaseCheapElectronicsRecipe - id: SignalTimerElectronics - result: SignalTimerElectronics - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: CloningPodMachineCircuitboard - result: CloningPodMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ThermomachineFreezerMachineCircuitBoard - result: ThermomachineFreezerMachineCircuitBoard - -- type: latheRecipe - parent: BaseSilverCircuitboardRecipe - id: HellfireFreezerMachineCircuitBoard - result: HellfireFreezerMachineCircuitBoard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: CondenserMachineCircuitBoard - result: CondenserMachineCircuitBoard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: PortableScrubberMachineCircuitBoard - result: PortableScrubberMachineCircuitBoard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: SpaceHeaterMachineCircuitBoard - result: SpaceHeaterMachineCircuitBoard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: MedicalScannerMachineCircuitboard - result: MedicalScannerMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: CryoPodMachineCircuitboard - result: CryoPodMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ChemMasterMachineCircuitboard - result: ChemMasterMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ChemDispenserMachineCircuitboard - result: ChemDispenserMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: BiomassReclaimerMachineCircuitboard - result: BiomassReclaimerMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: BiofabricatorMachineCircuitboard - result: BiofabricatorMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: HydroponicsTrayMachineCircuitboard - result: HydroponicsTrayMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: AutolatheMachineCircuitboard - result: AutolatheMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ProtolatheMachineCircuitboard - result: ProtolatheMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: AutolatheHyperConvectionMachineCircuitboard - result: AutolatheHyperConvectionMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ProtolatheHyperConvectionMachineCircuitboard - result: ProtolatheHyperConvectionMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: CircuitImprinterMachineCircuitboard - result: CircuitImprinterMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: CircuitImprinterHyperConvectionMachineCircuitboard - result: CircuitImprinterHyperConvectionMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ExosuitFabricatorMachineCircuitboard - result: ExosuitFabricatorMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: UniformPrinterMachineCircuitboard - result: UniformPrinterMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: BiogeneratorMachineCircuitboard - result: BiogeneratorMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: VaccinatorMachineCircuitboard - result: VaccinatorMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: DiagnoserMachineCircuitboard - result: DiagnoserMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ArtifactAnalyzerMachineCircuitboard - result: ArtifactAnalyzerMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ArtifactCrusherMachineCircuitboard - result: ArtifactCrusherMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: AnomalyVesselCircuitboard - result: AnomalyVesselCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: AnomalyVesselExperimentalCircuitboard - result: AnomalyVesselExperimentalCircuitboard - -- type: latheRecipe - parent: BaseSilverCircuitboardRecipe - id: AnomalySynchronizerCircuitboard - result: AnomalySynchronizerCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: APECircuitboard - result: APECircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ReagentGrinderMachineCircuitboard - result: ReagentGrinderMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: HotplateMachineCircuitboard - result: HotplateMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: AnalysisComputerCircuitboard - result: AnalysisComputerCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: TechDiskComputerCircuitboard - result: TechDiskComputerCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ShuttleConsoleCircuitboard - result: ShuttleConsoleCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: RadarConsoleCircuitboard - result: RadarConsoleCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: DawInstrumentMachineCircuitboard - result: DawInstrumentMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: StasisBedMachineCircuitboard - result: StasisBedMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ElectrolysisUnitMachineCircuitboard - result: ElectrolysisUnitMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: CentrifugeMachineCircuitboard - result: CentrifugeMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: OreProcessorMachineCircuitboard - result: OreProcessorMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: OreProcessorIndustrialMachineCircuitboard - result: OreProcessorIndustrialMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: SalvageMagnetMachineCircuitboard - result: SalvageMagnetMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: RipleyCentralElectronics - result: RipleyCentralElectronics - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: RipleyPeripheralsElectronics - result: RipleyPeripheralsElectronics - -- type: latheRecipe - parent: BaseBananiumCircuitboardRecipe - id: HonkerCentralElectronics - result: HonkerCentralElectronics - -- type: latheRecipe - parent: BaseBananiumCircuitboardRecipe - id: HonkerPeripheralsElectronics - result: HonkerPeripheralsElectronics - -- type: latheRecipe - parent: BaseBananiumCircuitboardRecipe - id: HonkerTargetingElectronics - result: HonkerTargetingElectronics - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: HamtrCentralElectronics - result: HamtrCentralElectronics - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: HamtrPeripheralsElectronics - result: HamtrPeripheralsElectronics - -# Power -- type: latheRecipe - parent: BaseCheapCircuitboardRecipe - id: APCElectronics - result: APCElectronics - -- type: latheRecipe - parent: BaseCircuitboardRecipe + parent: [ BaseCircuitboardRecipe, BaseMachineRecipeCategory ] id: SubstationMachineCircuitboard result: SubstationMachineCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: WallmountSubstationElectronics - result: WallmountSubstationElectronics - -- type: latheRecipe - parent: BaseCircuitboardRecipe + parent: [ BaseCircuitboardRecipe, BaseMachineRecipeCategory ] id: SMESMachineCircuitboard result: SMESMachineCircuitboard +# Security techfab - type: latheRecipe - parent: BaseGoldCircuitboardRecipe + parent: [ BaseCircuitboardRecipe, BaseMachineRecipeCategory ] + id: ShuttleGunSvalinnMachineGunCircuitboard + result: ShuttleGunSvalinnMachineGunCircuitboard + completetime: 6 + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseMachineRecipeCategory ] + id: ShuttleGunPerforatorCircuitboard + result: ShuttleGunPerforatorCircuitboard + completetime: 10 + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseMachineRecipeCategory ] + id: ShuttleGunFriendshipCircuitboard + result: ShuttleGunFriendshipCircuitboard + completetime: 8 + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseMachineRecipeCategory ] + id: ShuttleGunDusterCircuitboard + result: ShuttleGunDusterCircuitboard + completetime: 12 + +## Circuit imprinter + +## Engineering + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: EmitterCircuitboard + result: EmitterCircuitboard + +# Atmos +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: ThermomachineFreezerMachineCircuitBoard + result: ThermomachineFreezerMachineCircuitBoard + +- type: latheRecipe + parent: [ BaseSilverCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: HellfireFreezerMachineCircuitBoard + result: HellfireFreezerMachineCircuitBoard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: SpaceHeaterMachineCircuitBoard + result: SpaceHeaterMachineCircuitBoard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: PortableScrubberMachineCircuitBoard + result: PortableScrubberMachineCircuitBoard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: CondenserMachineCircuitBoard + result: CondenserMachineCircuitBoard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: GasRecyclerMachineCircuitboard + result: GasRecyclerMachineCircuitboard + +# Power +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] id: SMESAdvancedMachineCircuitboard result: SMESAdvancedMachineCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe + parent: [ BaseCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] id: PortableGeneratorPacmanMachineCircuitboard result: PortableGeneratorPacmanMachineCircuitboard @@ -420,187 +166,299 @@ id: PortableGeneratorJrPacmanMachineCircuitboard result: PortableGeneratorJrPacmanMachineCircuitboard -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: SolarControlComputerCircuitboard - result: SolarControlComputerCircuitboard +## Medical - type: latheRecipe - parent: BaseCircuitboardRecipe - id: SolarTrackerElectronics - result: SolarTrackerElectronics + parent: [ BaseGoldCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: BiomassReclaimerMachineCircuitboard + result: BiomassReclaimerMachineCircuitboard + +# Chemistry +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: HotplateMachineCircuitboard + result: HotplateMachineCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: CloningConsoleComputerCircuitboard - result: CloningConsoleComputerCircuitboard + parent: [ BaseCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: ElectrolysisUnitMachineCircuitboard + result: ElectrolysisUnitMachineCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: MicrowaveMachineCircuitboard - result: MicrowaveMachineCircuitboard + parent: [ BaseCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: CentrifugeMachineCircuitboard + result: CentrifugeMachineCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: ElectricGrillMachineCircuitboard - result: ElectricGrillMachineCircuitboard + parent: [ BaseGoldCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: ChemMasterMachineCircuitboard + result: ChemMasterMachineCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: FatExtractorMachineCircuitboard - result: FatExtractorMachineCircuitboard + parent: [ BaseGoldCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: ChemDispenserMachineCircuitboard + result: ChemDispenserMachineCircuitboard + +# Treatment +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: CryoPodMachineCircuitboard + result: CryoPodMachineCircuitboard - type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: FlatpackerMachineCircuitboard - result: FlatpackerMachineCircuitboard + parent: [ BaseGoldCircuitboardRecipe, BaseMedicalMachineRecipeCategory ] + id: StasisBedMachineCircuitboard + result: StasisBedMachineCircuitboard + +## Science + +# Artifact +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: ArtifactAnalyzerMachineCircuitboard + result: ArtifactAnalyzerMachineCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: SheetifierMachineCircuitboard - result: SheetifierMachineCircuitboard + parent: [ BaseGoldCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: ArtifactCrusherMachineCircuitboard + result: ArtifactCrusherMachineCircuitboard + +# Anomaly +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: AnomalyVesselCircuitboard + result: AnomalyVesselCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: SurveillanceCameraRouterCircuitboard - result: SurveillanceCameraRouterCircuitboard + parent: [ BaseGoldCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: AnomalyVesselExperimentalCircuitboard + result: AnomalyVesselExperimentalCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: SurveillanceCameraWirelessRouterCircuitboard - result: SurveillanceCameraWirelessRouterCircuitboard + parent: [ BaseSilverCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: AnomalySynchronizerCircuitboard + result: AnomalySynchronizerCircuitboard - type: latheRecipe - parent: BaseCircuitboardRecipe - id: SurveillanceWirelessCameraAnchoredCircuitboard - result: SurveillanceWirelessCameraAnchoredCircuitboard + parent: [ BaseCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: APECircuitboard + result: APECircuitboard + +## Service - type: latheRecipe - parent: BaseCircuitboardRecipe - id: SurveillanceWirelessCameraMovableCircuitboard - result: SurveillanceWirelessCameraMovableCircuitboard + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: DawInstrumentMachineCircuitboard + result: DawInstrumentMachineCircuitboard +# Bar - type: latheRecipe - parent: BaseCircuitboardRecipe - id: SurveillanceCameraMonitorCircuitboard - result: SurveillanceCameraMonitorCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: SurveillanceWirelessCameraMonitorCircuitboard - result: SurveillanceWirelessCameraMonitorCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ComputerTelevisionCircuitboard - result: ComputerTelevisionCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: EmitterCircuitboard - result: EmitterCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ThrusterMachineCircuitboard - result: ThrusterMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: GyroscopeMachineCircuitboard - result: GyroscopeMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: GasRecyclerMachineCircuitboard - result: GasRecyclerMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: SeedExtractorMachineCircuitboard - result: SeedExtractorMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: BoozeDispenserMachineCircuitboard - result: BoozeDispenserMachineCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: CargoTelepadMachineCircuitboard - result: CargoTelepadMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: SodaDispenserMachineCircuitboard - result: SodaDispenserMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: TelecomServerCircuitboard - result: TelecomServerCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: MassMediaCircuitboard - result: ComputerMassMediaCircuitboard - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: MiniGravityGeneratorCircuitboard - result: MiniGravityGeneratorCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: PowerCageRechargerCircuitboard - result: PowerCageRechargerCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ShuttleGunSvalinnMachineGunCircuitboard - result: ShuttleGunSvalinnMachineGunCircuitboard - completetime: 6 - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ShuttleGunPerforatorCircuitboard - result: ShuttleGunPerforatorCircuitboard - completetime: 10 - -- type: latheRecipe - parent: BaseCircuitboardRecipe - id: ShuttleGunKineticCircuitboard - result: ShuttleGunKineticCircuitboard - completetime: 6 - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ShuttleGunFriendshipCircuitboard - result: ShuttleGunFriendshipCircuitboard - completetime: 8 - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ShuttleGunDusterCircuitboard - result: ShuttleGunDusterCircuitboard - completetime: 12 - -- type: latheRecipe - parent: BaseGoldCircuitboardRecipe - id: ReagentGrinderIndustrialMachineCircuitboard - result: ReagentGrinderIndustrialMachineCircuitboard - -- type: latheRecipe - parent: BaseCircuitboardRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] id: JukeboxCircuitBoard result: JukeboxCircuitBoard - type: latheRecipe - parent: BaseCircuitboardRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: BoozeDispenserMachineCircuitboard + result: BoozeDispenserMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: SodaDispenserMachineCircuitboard + result: SodaDispenserMachineCircuitboard + +# Hydroponics +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: HydroponicsTrayMachineCircuitboard + result: HydroponicsTrayMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: SeedExtractorMachineCircuitboard + result: SeedExtractorMachineCircuitboard + +# Kitchen +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: ElectricGrillMachineCircuitboard + result: ElectricGrillMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: MicrowaveMachineCircuitboard + result: MicrowaveMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: FatExtractorMachineCircuitboard + result: FatExtractorMachineCircuitboard + +## Supply + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseSupplyMachineRecipeCategory ] + id: CargoTelepadMachineCircuitboard + result: CargoTelepadMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseSupplyMachineRecipeCategory ] + id: SalvageMagnetMachineCircuitboard + result: SalvageMagnetMachineCircuitboard + +# Shuttle +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSupplyMachineRecipeCategory ] + id: ThrusterMachineCircuitboard + result: ThrusterMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSupplyMachineRecipeCategory ] + id: GyroscopeMachineCircuitboard + result: GyroscopeMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseSupplyMachineRecipeCategory ] + id: MiniGravityGeneratorCircuitboard + result: MiniGravityGeneratorCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSecurityMachineRecipeCategory ] + id: PowerCageRechargerCircuitboard + result: PowerCageRechargerCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSecurityMachineRecipeCategory ] + id: ShuttleGunKineticCircuitboard + result: ShuttleGunKineticCircuitboard + completetime: 6 + +## Miscellaneous + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: ReagentGrinderMachineCircuitboard + result: ReagentGrinderMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: ReagentGrinderIndustrialMachineCircuitboard + result: ReagentGrinderIndustrialMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: FlatpackerMachineCircuitboard + result: FlatpackerMachineCircuitboard + +# Lathes +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: ProtolatheMachineCircuitboard + result: ProtolatheMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: ProtolatheHyperConvectionMachineCircuitboard + result: ProtolatheHyperConvectionMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: CircuitImprinterMachineCircuitboard + result: CircuitImprinterMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: CircuitImprinterHyperConvectionMachineCircuitboard + result: CircuitImprinterHyperConvectionMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseResearchMachineRecipeCategory ] + id: ExosuitFabricatorMachineCircuitboard + result: ExosuitFabricatorMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: BiogeneratorMachineCircuitboard + result: BiogeneratorMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: BiofabricatorMachineCircuitboard + result: BiofabricatorMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSupplyMachineRecipeCategory ] + id: OreProcessorMachineCircuitboard + result: OreProcessorMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseSupplyMachineRecipeCategory ] + id: OreProcessorIndustrialMachineCircuitboard + result: OreProcessorIndustrialMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: AutolatheMachineCircuitboard + result: AutolatheMachineCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: AutolatheHyperConvectionMachineCircuitboard + result: AutolatheHyperConvectionMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: UniformPrinterMachineCircuitboard + result: UniformPrinterMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: SheetifierMachineCircuitboard + result: SheetifierMachineCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] id: CutterMachineCircuitboard result: CutterMachineCircuitboard +# Cell chargers - type: latheRecipe - parent: BaseCircuitboardRecipe + parent: [ BaseCheapElectronicsRecipe, BaseGeneralMachineRecipeCategory ] + id: BorgChargerCircuitboard + result: BorgChargerCircuitboard + +- type: latheRecipe + parent: [ BaseGoldCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] + id: TurboItemRechargerCircuitboard + result: TurboItemRechargerCircuitboard + +# Comms and Cameras +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseEngineeringMachineRecipeCategory ] + id: TelecomServerCircuitboard + result: TelecomServerCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseSecurityMachineRecipeCategory ] + id: SurveillanceCameraRouterCircuitboard + result: SurveillanceCameraRouterCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: SurveillanceCameraWirelessRouterCircuitboard + result: SurveillanceCameraWirelessRouterCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: SurveillanceWirelessCameraAnchoredCircuitboard + result: SurveillanceWirelessCameraAnchoredCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseServiceMachineRecipeCategory ] + id: SurveillanceWirelessCameraMovableCircuitboard + result: SurveillanceWirelessCameraMovableCircuitboard + +- type: latheRecipe + parent: [ BaseCircuitboardRecipe, BaseGeneralMachineRecipeCategory ] id: HolopadMachineCircuitboard result: HolopadMachineCircuitboard From 915f8cca8c8757b262a0f6e9f107a810c6450c97 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Sun, 20 Apr 2025 22:28:56 +0000 Subject: [PATCH 482/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fb6220a76e..eb39cb6395 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: themias - changes: - - message: Fixed crayons losing durability attempting to write on stamped paper - type: Fix - id: 7795 - time: '2025-01-10T15:37:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34202 - author: Tayrtahn changes: - message: Arcades, vending machines and the recycler now sometimes say creepy things @@ -3900,3 +3893,10 @@ id: 8295 time: '2025-04-20T21:38:30.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35732 +- author: aada + changes: + - message: Filter categories added to the circuit imprinter. + type: Add + id: 8296 + time: '2025-04-20T22:27:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35713 From d4dfbcc85353792c0ae961111f8614fce5e62e4a Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Sun, 20 Apr 2025 20:32:34 -0400 Subject: [PATCH 483/622] Cleanup warnings in `SharedPortalSystem` (#36747) * Cleanup warnings in SharedPortalSystem * Formatting while we're here * Replace uses of !Any() with Count == 0 * AnyEntitiesIntersecting --- .../Teleportation/Systems/SharedPortalSystem.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index 091bd8808a..262753307f 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -112,7 +112,7 @@ public abstract class SharedPortalSystem : EntitySystem if (TryComp<LinkedEntityComponent>(uid, out var link)) { - if (!link.LinkedEntities.Any()) + if (link.LinkedEntities.Count == 0) return; // client can't predict outside of simple portal-to-portal interactions due to randomness involved @@ -150,7 +150,7 @@ public abstract class SharedPortalSystem : EntitySystem private void OnEndCollide(EntityUid uid, PortalComponent component, ref EndCollideEvent args) { - if (!ShouldCollide(args.OurFixtureId, args.OtherFixtureId,args.OurFixture, args.OtherFixture)) + if (!ShouldCollide(args.OurFixtureId, args.OtherFixtureId, args.OurFixture, args.OtherFixture)) return; var subject = args.OtherEntity; @@ -162,14 +162,14 @@ public abstract class SharedPortalSystem : EntitySystem } } - private void TeleportEntity(EntityUid portal, EntityUid subject, EntityCoordinates target, EntityUid? targetEntity=null, bool playSound=true, + private void TeleportEntity(EntityUid portal, EntityUid subject, EntityCoordinates target, EntityUid? targetEntity = null, bool playSound = true, PortalComponent? portalComponent = null) { if (!Resolve(portal, ref portalComponent)) return; var ourCoords = Transform(portal).Coordinates; - var onSameMap = ourCoords.GetMapId(EntityManager) == target.GetMapId(EntityManager); + var onSameMap = _transform.GetMapId(ourCoords) == _transform.GetMapId(target); var distanceInvalid = portalComponent.MaxTeleportRadius != null && ourCoords.TryDistance(EntityManager, target, out var distance) && distance > portalComponent.MaxTeleportRadius; @@ -228,7 +228,7 @@ public abstract class SharedPortalSystem : EntitySystem { var randVector = _random.NextVector2(component.MaxRandomRadius); newCoords = coords.Offset(randVector); - if (!_lookup.GetEntitiesIntersecting(newCoords.ToMap(EntityManager, _transform), LookupFlags.Static).Any()) + if (!_lookup.AnyEntitiesIntersecting(_transform.ToMapCoordinates(newCoords), LookupFlags.Static)) { break; } From 98511d1b21764e8393a7b615cabcac506dc9abc7 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Sun, 20 Apr 2025 20:57:20 -0400 Subject: [PATCH 484/622] Binomial Number Selector for EntityTables (#36783) * binomial dist * lol initialize the int tho idiot * xml docs my forgotten * ditto --- .../ValueSelector/BinomialNumberSelector.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Content.Shared/EntityTable/ValueSelector/BinomialNumberSelector.cs diff --git a/Content.Shared/EntityTable/ValueSelector/BinomialNumberSelector.cs b/Content.Shared/EntityTable/ValueSelector/BinomialNumberSelector.cs new file mode 100644 index 0000000000..b3ed076e70 --- /dev/null +++ b/Content.Shared/EntityTable/ValueSelector/BinomialNumberSelector.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Random; + +namespace Content.Shared.EntityTable.ValueSelector; + +/// <summary> +/// Picks a value based on a Binomial Distribution of N Trials given P Chance +/// </summary> +public sealed partial class BinomialNumberSelector : NumberSelector +{ + /// <summary> + /// How many times to try including an entry. i.e. the Max. + /// </summary> + [DataField] + public int Trials = 1; + + /// <summary> + /// The odds a single trial succeeds + /// </summary> + /// <remarks> + /// my preferred "Prob" was already used in other places for entity table stuff and I didnt want more confusing terminology + /// </remarks> + [DataField] + public float Chance = .5f; + + public override int Get(System.Random rand) + { + var random = IoCManager.Resolve<IRobustRandom>(); + int count = 0; + + for (int i = 0; i < Trials; i++) + { + if (random.Prob(Chance)) + count++; + } + return count; + // get binomialed motherfucker + } +} From d792908e56325e8a8590340d2cfee93d0415ac54 Mon Sep 17 00:00:00 2001 From: Spessmann <156740760+Spessmann@users.noreply.github.com> Date: Sun, 20 Apr 2025 19:16:52 -0700 Subject: [PATCH 485/622] Add more ruins (#36785) --- Resources/Maps/Lavaland/broken_cargo.yml | 618 ++++++ Resources/Maps/Lavaland/miming_drill.yml | 1208 ++++++++++++ Resources/Maps/Lavaland/minefield.yml | 1653 +++++++++++++++++ Resources/Maps/Lavaland/shinobi_graveyard.yml | 502 +++++ 4 files changed, 3981 insertions(+) create mode 100644 Resources/Maps/Lavaland/broken_cargo.yml create mode 100644 Resources/Maps/Lavaland/miming_drill.yml create mode 100644 Resources/Maps/Lavaland/minefield.yml create mode 100644 Resources/Maps/Lavaland/shinobi_graveyard.yml diff --git a/Resources/Maps/Lavaland/broken_cargo.yml b/Resources/Maps/Lavaland/broken_cargo.yml new file mode 100644 index 0000000000..b93eca1a5e --- /dev/null +++ b/Resources/Maps/Lavaland/broken_cargo.yml @@ -0,0 +1,618 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/21/2025 00:32:33 + entityCount: 88 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 3: Space + 0: FloorBasalt + 2: FloorSteel + 1: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.6666667,-0.6145833 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAADAgAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAABAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + color: '#FFFFFFFF' + id: DirtHeavy + decals: + 7: 3,-6 + 8: 4,-5 + 9: 4,-6 + 10: 4,-4 + 11: 3,-1 + 12: 4,-1 + 13: 3,0 + 14: 4,1 + 15: 2,1 + - node: + color: '#A4610696' + id: HalfTileOverlayGreyscale90 + decals: + 1: 4,-1 + 2: 4,0 + 3: 4,-5 + 6: 4,1 + - node: + color: '#A4610696' + id: ThreeQuarterTileOverlayGreyscale180 + decals: + 0: 4,-6 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 63999 + 0,-1: + 0: 65535 + -1,0: + 0: 65535 + 0,1: + 0: 14 + 1,0: + 0: 25 + 1,-1: + 0: 56797 + 0,-2: + 0: 65024 + -1,-1: + 0: 65260 + 1,-2: + 0: 53504 + 2,-1: + 0: 4368 + -2,-1: + 0: 32768 + -2,0: + 0: 136 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirlockCargoLocked + entities: + - uid: 77 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 +- proto: BasaltFive + entities: + - uid: 23 + components: + - type: Transform + pos: 6.5,-4.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 21 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 8.5,-0.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 55 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 +- proto: Chair + entities: + - uid: 62 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,1.5 + parent: 1 + - uid: 63 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,0.5 + parent: 1 +- proto: CrateEmergencyAdvancedKit + entities: + - uid: 43 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 1 +- proto: FloorLavaEntity + entities: + - uid: 3 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 1.5,-2.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 1.5,-3.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 75 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,1.5 + parent: 1 + - uid: 76 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,1.5 + parent: 1 + - uid: 84 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,2.5 + parent: 1 + - uid: 85 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,2.5 + parent: 1 +- proto: Grille + entities: + - uid: 28 + components: + - type: Transform + pos: 5.5,-4.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 +- proto: Rack + entities: + - uid: 78 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-5.5 + parent: 1 +- proto: RandomCargoCorpseSpawner + entities: + - uid: 2 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 +- proto: ReinforcedWindow + entities: + - uid: 20 + components: + - type: Transform + pos: 5.5,-4.5 + parent: 1 +- proto: ShuttersNormal + entities: + - uid: 82 + components: + - type: Transform + pos: 5.5,-1.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 +- proto: WallRockBasalt + entities: + - uid: 24 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -0.5,-4.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -3.5,-2.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -3.5,-3.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -0.5,-6.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 0.5,-6.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 1.5,-6.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 4.5,3.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 13 + components: + - type: Transform + pos: 4.5,-6.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 5.5,-6.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 +- proto: WallSolidRust + entities: + - uid: 12 + components: + - type: Transform + pos: 5.5,-5.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 5.5,-3.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 5.5,2.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 +- proto: WeaponCrusher + entities: + - uid: 88 + components: + - type: Transform + pos: 4.5,-5.5 + parent: 1 +- proto: Window + entities: + - uid: 80 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/miming_drill.yml b/Resources/Maps/Lavaland/miming_drill.yml new file mode 100644 index 0000000000..8c234b32c1 --- /dev/null +++ b/Resources/Maps/Lavaland/miming_drill.yml @@ -0,0 +1,1208 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/21/2025 01:45:58 + entityCount: 194 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorBasalt + 4: FloorMime + 3: FloorWhite + 2: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.828125,-0.5703125 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAwAAAAADAwAAAAACBAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAwAAAAABAwAAAAABAgAAAAAABAAAAAAABAAAAAAABAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + color: '#79150096' + id: splatter + decals: + 0: 4,1 + 1: 12,1 + 2: 9,8 + 3: 4,6 + 4: 9,4 + - node: + cleanable: True + color: '#79150096' + id: thinline + decals: + 16: 4.2299004,4.9159036 + 17: 3.7437897,4.920533 + 18: 3.73916,3.9966602 + 19: 4.2345304,3.9827714 + 20: 4.23503,3.0445478 + 21: 3.7404823,3.0661528 + 22: 3.741341,2.1337168 + 23: 4.232082,2.1182847 + 25: 8.711112,7.0139613 + 26: 9.197223,7.0047026 + 27: 8.711113,6.078776 + 28: 9.197224,6.069517 + 29: 9.1925955,5.138962 + 30: 8.711114,5.1482205 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,1: + 0: 65532 + 0,2: + 0: 52303 + 0,0: + 0: 51404 + 1,0: + 0: 7986 + 1,1: + 0: 7517 + 1,2: + 0: 61199 + 2,0: + 0: 51184 + 2,1: + 0: 61439 + 2,2: + 0: 61167 + 3,0: + 0: 4112 + 3,1: + 0: 13073 + 3,2: + 0: 13107 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirlockExternalGlass + entities: + - uid: 146 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 +- proto: AirlockGlass + entities: + - uid: 145 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 +- proto: APCBasic + entities: + - uid: 149 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,9.5 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 162 + components: + - type: Transform + pos: 6.5,9.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 +- proto: CableHV + entities: + - uid: 150 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 153 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 +- proto: CableMV + entities: + - uid: 155 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: 6.5,9.5 + parent: 1 +- proto: Chair + entities: + - uid: 26 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,11.5 + parent: 1 + - uid: 27 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,10.5 + parent: 1 +- proto: ClothingBackpackMime + entities: + - uid: 188 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 +- proto: ClothingEyesGlassesMeson + entities: + - uid: 190 + components: + - type: Transform + pos: 13.5,8.5 + parent: 1 +- proto: ComputerFrame + entities: + - uid: 28 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 +- proto: CrateEmergencyInternals + entities: + - uid: 183 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 +- proto: CrateGenericSteel + entities: + - uid: 179 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - type: Fixtures + fixtures: + fix1: + shape: !type:PolygonShape + radius: 0.01 + vertices: + - -0.4,-0.4 + - 0.4,-0.4 + - 0.4,0.29 + - -0.4,0.29 + mask: + - Impassable + - HighImpassable + - LowImpassable + layer: + - BulletImpassable + - Opaque + density: 50 + hard: True + restitution: 0 + friction: 0.4 + - type: EntityStorage + open: True + removedMasks: 20 + - type: PlaceableSurface + isPlaceable: True +- proto: CratePermaEscapeDigging + entities: + - uid: 180 + components: + - type: Transform + pos: 9.5,11.5 + parent: 1 + - uid: 193 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 +- proto: EmergencyOxygenTankFilled + entities: + - uid: 189 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 + - uid: 194 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 +- proto: FloorChasmEntity + entities: + - uid: 78 + components: + - type: Transform + pos: 7.5,4.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 6.5,6.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 8.5,4.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 8.5,6.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 +- proto: FoodBurgerMime + entities: + - uid: 187 + components: + - type: Transform + pos: 13.5,9.5 + parent: 1 +- proto: GeneratorWallmountAPU + entities: + - uid: 147 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 +- proto: Girder + entities: + - uid: 29 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 12.5,3.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: 8.5,1.5 + parent: 1 +- proto: Grille + entities: + - uid: 22 + components: + - type: Transform + pos: 7.5,12.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 8.5,11.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 +- proto: LockerMime + entities: + - uid: 184 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 +- proto: MiningDrill + entities: + - uid: 182 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 +- proto: Multitool + entities: + - uid: 191 + components: + - type: Transform + pos: 13.5,8.5 + parent: 1 +- proto: OreBag + entities: + - uid: 192 + components: + - type: Transform + pos: 9.5,9.5 + parent: 1 +- proto: Pickaxe + entities: + - uid: 81 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: 11.5,1.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 +- proto: PosterLegitMime + entities: + - uid: 168 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 +- proto: Poweredlight + entities: + - uid: 170 + components: + - type: Transform + pos: 8.5,8.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 +- proto: PoweredSmallLight + entities: + - uid: 169 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 + - uid: 177 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,11.5 + parent: 1 +- proto: ShardGlass + entities: + - uid: 140 + components: + - type: Transform + pos: 9.5,4.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: 9.5,7.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 +- proto: ShuttleWindow + entities: + - uid: 18 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 8.5,11.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 7.5,12.5 + parent: 1 +- proto: SubstationWallBasic + entities: + - uid: 148 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 +- proto: Table + entities: + - uid: 171 + components: + - type: Transform + pos: 13.5,8.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: 13.5,9.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 +- proto: TableFrame + entities: + - uid: 178 + components: + - type: Transform + pos: 12.5,11.5 + parent: 1 +- proto: ToolboxSyndicateFilled + entities: + - uid: 181 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 +- proto: WallReinforced + entities: + - uid: 110 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 +- proto: WallRockBasalt + entities: + - uid: 33 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 4.5,-0.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 7.5,-0.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 8.5,-0.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 9.5,-0.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 10.5,-0.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 11.5,-0.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 12.5,-0.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 13.5,-0.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 13.5,0.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 12.5,0.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 11.5,0.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 10.5,0.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 9.5,0.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 8.5,0.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 13.5,1.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 13.5,2.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 12.5,2.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 11.5,2.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 14.5,-0.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 13.5,3.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 13.5,4.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 13.5,5.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 13.5,12.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 13.5,13.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: 12.5,12.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: 12.5,13.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: 11.5,12.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 11.5,13.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 10.5,12.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 10.5,13.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 9.5,12.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 9.5,13.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 8.5,13.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 7.5,13.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 6.5,13.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 5.5,13.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 4.5,13.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 3.5,13.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 2.5,13.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 1.5,13.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 0.5,13.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 14.5,0.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 14.5,1.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 14.5,2.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: 14.5,3.5 + parent: 1 + - uid: 129 + components: + - type: Transform + pos: 14.5,4.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: 14.5,5.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: 14.5,6.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: 14.5,7.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: 14.5,8.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: 14.5,9.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: 14.5,10.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: 14.5,11.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: 14.5,12.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: 14.5,13.5 + parent: 1 +- proto: WallShuttle + entities: + - uid: 2 + components: + - type: Transform + pos: 4.5,9.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 8.5,12.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 8.5,9.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 6.5,12.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 6.5,9.5 + parent: 1 +- proto: WardrobeWhiteFilled + entities: + - uid: 185 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 +- proto: Window + entities: + - uid: 111 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: 9.5,3.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/minefield.yml b/Resources/Maps/Lavaland/minefield.yml new file mode 100644 index 0000000000..26c4471269 --- /dev/null +++ b/Resources/Maps/Lavaland/minefield.yml @@ -0,0 +1,1653 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/21/2025 01:13:33 + entityCount: 269 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorBasalt + 3: FloorTechMaint + 4: FloorTechMaint2 + 5: FloorTechMaint3 + 2: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.53125,-0.34375 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,1: + ind: 0,1 + tiles: AAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAAAAAAAAwAAAAAAAwAAAAAABQAAAAAAAwAAAAAAAwAAAAAABAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,1: + ind: -1,1 + tiles: AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Caution + decals: + 5: -8,8 + - node: + color: '#FFFFFFFF' + id: WarnLineN + decals: + 0: -10,8 + 1: -9,8 + 2: -8,8 + 3: -7,8 + 4: -6,8 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 13107 + 0,-1: + 0: 4352 + -1,0: + 0: 65535 + 0,1: + 0: 13107 + -1,1: + 0: 65535 + 0,2: + 0: 13107 + -1,2: + 0: 35020 + 0,3: + 0: 4915 + -1,3: + 0: 65228 + 0,4: + 0: 1 + -1,4: + 0: 127 + -4,0: + 0: 65535 + -4,1: + 0: 65535 + -4,2: + 0: 30719 + -4,3: + 0: 61431 + -4,-1: + 0: 61132 + -4,4: + 0: 142 + -3,0: + 0: 65535 + -3,1: + 0: 65535 + -3,3: + 0: 63232 + -3,-1: + 0: 65535 + -3,2: + 0: 52972 + -3,4: + 0: 255 + -2,0: + 0: 65535 + -2,1: + 0: 65535 + -2,2: + 0: 32759 + -2,3: + 0: 65024 + -2,-1: + 0: 65535 + -2,4: + 0: 255 + -1,-1: + 0: 65535 + -4,-2: + 0: 32768 + -3,-2: + 0: 65024 + -2,-2: + 0: 65280 + -1,-2: + 0: 28928 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AlwaysPoweredlightRed + entities: + - uid: 211 + components: + - type: Transform + pos: -10.5,7.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 +- proto: BasaltFive + entities: + - uid: 239 + components: + - type: Transform + pos: -3.5,3.5 + parent: 1 + - uid: 258 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 +- proto: BasaltFour + entities: + - uid: 243 + components: + - type: Transform + pos: -11.5,-3.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: -14.5,8.5 + parent: 1 +- proto: BasaltOne + entities: + - uid: 240 + components: + - type: Transform + pos: -8.5,7.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: -11.5,16.5 + parent: 1 + - uid: 259 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 245 + components: + - type: Transform + pos: -12.5,0.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: -4.5,16.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 242 + components: + - type: Transform + pos: -4.5,-4.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: -11.5,5.5 + parent: 1 +- proto: CableHV + entities: + - uid: 233 + components: + - type: Transform + pos: -9.5,11.5 + parent: 1 + - uid: 234 + components: + - type: Transform + pos: -8.5,11.5 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: -7.5,11.5 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: -6.5,11.5 + parent: 1 + - uid: 237 + components: + - type: Transform + pos: -5.5,11.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 +- proto: CableMV + entities: + - uid: 18 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: -10.5,4.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: -12.5,4.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: -14.5,4.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: -11.5,4.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: -13.5,4.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: -8.5,6.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: -6.5,7.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: -7.5,8.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: -8.5,8.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: -8.5,9.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: -8.5,10.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: -7.5,10.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: -6.5,10.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: -8.5,7.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: -6.5,9.5 + parent: 1 + - uid: 169 + components: + - type: Transform + pos: -6.5,8.5 + parent: 1 + - uid: 170 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: -7.5,2.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: -5.5,2.5 + parent: 1 + - uid: 179 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: -7.5,0.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: -7.5,-0.5 + parent: 1 + - uid: 182 + components: + - type: Transform + pos: -7.5,-1.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: -7.5,-2.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: -7.5,-3.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: -7.5,-4.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: -5.5,3.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: -5.5,1.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 192 + components: + - type: Transform + pos: -8.5,2.5 + parent: 1 + - uid: 194 + components: + - type: Transform + pos: -9.5,7.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: -9.5,8.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: -5.5,7.5 + parent: 1 + - uid: 198 + components: + - type: Transform + pos: -8.5,5.5 + parent: 1 + - uid: 199 + components: + - type: Transform + pos: -8.5,4.5 + parent: 1 + - uid: 200 + components: + - type: Transform + pos: -10.5,5.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: -10.5,6.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: -10.5,7.5 + parent: 1 + - uid: 203 + components: + - type: Transform + pos: -8.5,3.5 + parent: 1 + - uid: 231 + components: + - type: Transform + pos: -7.5,11.5 + parent: 1 + - uid: 232 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 +- proto: Catwalk + entities: + - uid: 241 + components: + - type: Transform + pos: -3.5,7.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: -10.5,7.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: -11.5,7.5 + parent: 1 +- proto: FloorLavaEntity + entities: + - uid: 31 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,1.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 43 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,9.5 + parent: 1 + - uid: 44 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,10.5 + parent: 1 + - uid: 45 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,11.5 + parent: 1 + - uid: 46 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,12.5 + parent: 1 + - uid: 47 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,13.5 + parent: 1 + - uid: 48 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,14.5 + parent: 1 + - uid: 49 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,9.5 + parent: 1 + - uid: 53 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,13.5 + parent: 1 + - uid: 54 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,14.5 + parent: 1 + - uid: 55 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,14.5 + parent: 1 + - uid: 56 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,15.5 + parent: 1 + - uid: 57 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,11.5 + parent: 1 + - uid: 58 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -10.5,14.5 + parent: 1 + - uid: 59 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -10.5,15.5 + parent: 1 + - uid: 60 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,11.5 + parent: 1 + - uid: 61 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -9.5,14.5 + parent: 1 + - uid: 62 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -9.5,15.5 + parent: 1 + - uid: 63 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -9.5,16.5 + parent: 1 + - uid: 64 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.5,15.5 + parent: 1 + - uid: 66 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,15.5 + parent: 1 + - uid: 68 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,15.5 + parent: 1 + - uid: 69 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,14.5 + parent: 1 + - uid: 70 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,15.5 + parent: 1 + - uid: 71 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,14.5 + parent: 1 + - uid: 72 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,15.5 + parent: 1 + - uid: 73 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,14.5 + parent: 1 + - uid: 74 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,14.5 + parent: 1 + - uid: 75 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,13.5 + parent: 1 + - uid: 76 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,12.5 + parent: 1 + - uid: 77 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,14.5 + parent: 1 + - uid: 78 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,13.5 + parent: 1 + - uid: 79 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,12.5 + parent: 1 + - uid: 80 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,16.5 + parent: 1 + - uid: 81 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,16.5 + parent: 1 + - uid: 82 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,15.5 + parent: 1 + - uid: 83 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,15.5 + parent: 1 + - uid: 84 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,10.5 + parent: 1 + - uid: 85 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,9.5 + parent: 1 + - uid: 89 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,10.5 + parent: 1 + - uid: 90 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,9.5 + parent: 1 + - uid: 91 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,8.5 + parent: 1 + - uid: 95 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,9.5 + parent: 1 + - uid: 96 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,8.5 + parent: 1 + - uid: 97 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,7.5 + parent: 1 + - uid: 99 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.5,-1.5 + parent: 1 + - uid: 100 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.5,1.5 + parent: 1 + - uid: 101 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.5,-0.5 + parent: 1 + - uid: 102 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.5,0.5 + parent: 1 + - uid: 103 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -10.5,1.5 + parent: 1 + - uid: 104 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,1.5 + parent: 1 + - uid: 105 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,2.5 + parent: 1 + - uid: 106 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,-3.5 + parent: 1 + - uid: 107 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,-2.5 + parent: 1 + - uid: 108 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-3.5 + parent: 1 + - uid: 109 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-2.5 + parent: 1 + - uid: 110 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,-0.5 + parent: 1 + - uid: 111 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-2.5 + parent: 1 + - uid: 112 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,-1.5 + parent: 1 + - uid: 113 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,1.5 + parent: 1 + - uid: 114 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,1.5 + parent: 1 + - uid: 115 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,5.5 + parent: 1 + - uid: 116 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,6.5 + parent: 1 + - uid: 117 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,6.5 + parent: 1 + - uid: 118 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,6.5 + parent: 1 + - uid: 119 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,6.5 + parent: 1 + - uid: 120 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -11.5,7.5 + parent: 1 + - uid: 140 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,14.5 + parent: 1 + - uid: 141 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,15.5 + parent: 1 + - uid: 142 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,8.5 + parent: 1 + - uid: 143 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,7.5 + parent: 1 + - uid: 144 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,8.5 + parent: 1 + - uid: 145 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,11.5 + parent: 1 + - uid: 146 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,12.5 + parent: 1 + - uid: 147 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,13.5 + parent: 1 + - uid: 148 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,10.5 + parent: 1 + - uid: 149 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -12.5,15.5 + parent: 1 + - uid: 150 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.5,16.5 + parent: 1 + - uid: 151 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,16.5 + parent: 1 + - uid: 152 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,16.5 + parent: 1 + - uid: 153 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,12.5 + parent: 1 + - uid: 154 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,13.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: -13.5,5.5 + parent: 1 + - uid: 260 + components: + - type: Transform + pos: -12.5,-3.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: -2.5,7.5 + parent: 1 + - uid: 262 + components: + - type: Transform + pos: -13.5,-3.5 + parent: 1 + - uid: 263 + components: + - type: Transform + pos: -13.5,-2.5 + parent: 1 + - uid: 264 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: -3.5,7.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 +- proto: GeneratorBasic + entities: + - uid: 226 + components: + - type: Transform + pos: -9.5,11.5 + parent: 1 + - uid: 227 + components: + - type: Transform + pos: -5.5,11.5 + parent: 1 +- proto: Grille + entities: + - uid: 2 + components: + - type: Transform + pos: -13.5,4.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -12.5,4.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -14.5,4.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: -7.5,-2.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: -7.5,-1.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: -7.5,-3.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: -7.5,-4.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 + - uid: 265 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 +- proto: LandMineExplosive + entities: + - uid: 38 + components: + - type: Transform + pos: -14.488633,3.3384957 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -5.9618673,-0.15940952 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -9.02437,2.7624617 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 205 + components: + - type: Transform + pos: -10.582378,-1.0989999 + parent: 1 + - uid: 209 + components: + - type: Transform + pos: -14.160503,-0.28650403 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: -14.363634,7.54912 + parent: 1 + - uid: 213 + components: + - type: Transform + pos: -10.144875,-4.0833745 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: 0.37764835,2.100358 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: 0.58698034,7.5054493 + parent: 1 +- proto: MagazineLightRifle + entities: + - uid: 220 + components: + - type: Transform + pos: -4.820012,9.46753 + parent: 1 + - uid: 221 + components: + - type: Transform + pos: -4.1533456,9.47216 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: -4.1764936,10.453642 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: -4.810753,10.449012 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: -4.5,9.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: -4.5,10.5 + parent: 1 +- proto: Rack + entities: + - uid: 193 + components: + - type: Transform + pos: -10.5,9.5 + parent: 1 + - uid: 206 + components: + - type: Transform + pos: -10.5,10.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: -4.5,9.5 + parent: 1 + - uid: 208 + components: + - type: Transform + pos: -4.5,10.5 + parent: 1 +- proto: RailingCorner + entities: + - uid: 247 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,7.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: -10.5,7.5 + parent: 1 + - uid: 256 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,7.5 + parent: 1 + - uid: 257 + components: + - type: Transform + pos: -3.5,7.5 + parent: 1 +- proto: SignSecurearea + entities: + - uid: 228 + components: + - type: Transform + pos: -4.5,8.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: -10.5,8.5 + parent: 1 +- proto: SubstationWallBasic + entities: + - uid: 229 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 +- proto: TrashBananaPeel + entities: + - uid: 204 + components: + - type: Transform + pos: -5.5,4.5 + parent: 1 +- proto: WallReinforced + entities: + - uid: 4 + components: + - type: Transform + pos: -3.5,10.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -3.5,8.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -3.5,9.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: -3.5,11.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: -11.5,10.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -11.5,9.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -10.5,8.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -11.5,8.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -10.5,12.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: -8.5,12.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: -9.5,12.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: -10.5,11.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: -5.5,12.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: -4.5,12.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -4.5,11.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -11.5,11.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -4.5,8.5 + parent: 1 +- proto: WallRockBasalt + entities: + - uid: 50 + components: + - type: Transform + pos: -12.5,10.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: -12.5,11.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: -12.5,12.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: -11.5,12.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: -11.5,13.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: -1.5,10.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: -10.5,13.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: -9.5,13.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: -8.5,13.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: -7.5,13.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: -5.5,13.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: -4.5,13.5 + parent: 1 + - uid: 129 + components: + - type: Transform + pos: -7.5,14.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: -8.5,14.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: -3.5,13.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: -3.5,12.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: -2.5,11.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: -2.5,10.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: -2.5,9.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: -1.5,11.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: -2.5,13.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: -3.5,14.5 + parent: 1 +- proto: WeaponRifleAk + entities: + - uid: 216 + components: + - type: Transform + pos: -10.5,9.5 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: -10.5,10.5 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: -10.485548,9.2359085 + parent: 1 + - uid: 219 + components: + - type: Transform + pos: -10.506382,10.208131 + parent: 1 +- proto: WeaponTurretAllHostile + entities: + - uid: 3 + components: + - type: Transform + pos: -7.5,9.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/shinobi_graveyard.yml b/Resources/Maps/Lavaland/shinobi_graveyard.yml new file mode 100644 index 0000000000..286109bc47 --- /dev/null +++ b/Resources/Maps/Lavaland/shinobi_graveyard.yml @@ -0,0 +1,502 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/21/2025 01:59:49 + entityCount: 53 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorBasalt +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.421875,-0.515625 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + zIndex: 1 + color: '#FFFFFFFF' + id: DirtHeavy + decals: + 25: 0,5 + 26: 1,5 + 27: 2,5 + 28: 5,5 + 29: 5,3 + - node: + cleanable: True + zIndex: 1 + color: '#FFFFFFFF' + id: DirtMedium + decals: + 30: 5,4 + 31: 3,5 + 32: 4,5 + 33: 6,5 + 34: 7,5 + 35: 8,5 + 36: 9,5 + 37: 10,5 + 38: 5,2 + 39: 5,1 + 40: 5,0 + 41: 5,-1 + - node: + color: '#A461063C' + id: FullTileOverlayGreyscale + decals: + 1: 5,5 + 12: 2,5 + 13: 1,5 + 14: 0,5 + 18: 5,3 + - node: + color: '#A461063C' + id: HalfTileOverlayGreyscale180 + decals: + 0: 5,6 + - node: + color: '#A461063C' + id: HalfTileOverlayGreyscale270 + decals: + 7: 10,5 + 20: 5,1 + - node: + color: '#A461063C' + id: QuarterTileOverlayGreyscale + decals: + 3: 7,5 + 8: 11,5 + 16: -2,5 + - node: + color: '#A461063C' + id: QuarterTileOverlayGreyscale180 + decals: + 4: 7,5 + 15: -1,5 + 23: 5,-2 + - node: + color: '#A461063C' + id: QuarterTileOverlayGreyscale270 + decals: + 9: 12,5 + 24: 5,-1 + - node: + color: '#A461063C' + id: QuarterTileOverlayGreyscale90 + decals: + 22: 5,-1 + - node: + zIndex: 1 + color: '#FFFFFFFF' + id: Rock06 + decals: + 42: 8,10 + 43: 4,0 + - node: + color: '#A461063C' + id: ThreeQuarterTileOverlayGreyscale + decals: + 6: 9,5 + 10: 4,5 + 19: 5,2 + - node: + color: '#A461063C' + id: ThreeQuarterTileOverlayGreyscale180 + decals: + 21: 5,0 + - node: + color: '#A461063C' + id: ThreeQuarterTileOverlayGreyscale270 + decals: + 2: 6,5 + 5: 8,5 + 11: 3,5 + 17: 5,4 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 61154 + 0,1: + 0: 61182 + -1,1: + 0: 2252 + 0,2: + 0: 254 + -1,2: + 0: 128 + 0,-1: + 0: 60416 + 1,0: + 0: 65527 + 1,1: + 0: 65535 + 1,2: + 0: 255 + 1,-1: + 0: 63232 + 2,0: + 0: 13296 + 2,1: + 0: 15355 + 2,2: + 0: 4403 + 2,-1: + 0: 49152 + 3,1: + 0: 272 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: BasaltOne + entities: + - uid: 52 + components: + - type: Transform + pos: 11.5,-0.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 35 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 51 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 +- proto: CrateWoodenGrave + entities: + - uid: 33 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 8.5,8.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 8.5,4.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 8.5,2.5 + parent: 1 +- proto: hydroponicsSoil + entities: + - uid: 50 + components: + - type: MetaData + desc: Someone died here... + name: grave + - type: Transform + pos: 5.5,8.5 + parent: 1 +- proto: Katana + entities: + - uid: 49 + components: + - type: Transform + pos: 5.5,8.5 + parent: 1 +- proto: Railing + entities: + - uid: 43 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,8.5 + parent: 1 + - uid: 44 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,9.5 + parent: 1 + - uid: 45 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,8.5 + parent: 1 + - uid: 46 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,9.5 + parent: 1 +- proto: RailingCorner + entities: + - uid: 47 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 48 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,7.5 + parent: 1 +- proto: WallAsteroidCobblebrick + entities: + - uid: 2 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 0.5,6.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 9.5,10.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 10.5,10.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 10.5,8.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 10.5,0.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 9.5,0.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 8.5,0.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 +... From e1c70882ef28c51261c0dc3aa211c9d27613887d Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Mon, 21 Apr 2025 15:06:54 +1000 Subject: [PATCH 486/622] Fix NRE in GasTileOverlaySystem (#36793) --- Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs index ae067d5523..4882e93d23 100644 --- a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -68,6 +68,9 @@ namespace Content.Server.Atmos.EntitySystems { base.Initialize(); + _query = GetEntityQuery<GasTileOverlayComponent>(); + _gridQuery = GetEntityQuery<MapGridComponent>(); + _updateJob = new UpdatePlayerJob() { EntManager = EntityManager, @@ -88,8 +91,6 @@ namespace Content.Server.Atmos.EntitySystems SubscribeLocalEvent<RoundRestartCleanupEvent>(Reset); SubscribeLocalEvent<GasTileOverlayComponent, ComponentStartup>(OnStartup); - _query = GetEntityQuery<GasTileOverlayComponent>(); - _gridQuery = GetEntityQuery<MapGridComponent>(); } private void OnStartup(EntityUid uid, GasTileOverlayComponent component, ComponentStartup args) From 2fdfb4b14a6d5ff2463c410fe7dc11b1dacb0186 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Mon, 21 Apr 2025 11:32:18 +0200 Subject: [PATCH 487/622] Reworked Mail Spawning (#36774) * init * stuff --- .../Delivery/DeliveryVisualizerSystem.cs | 6 +++ .../Delivery/DeliverySystem.Spawning.cs | 42 +++++++++------ .../Delivery/DeliverySpawnerComponent.cs | 21 +++++++- Content.Shared/Delivery/DeliveryVisuals.cs | 6 +++ .../Delivery/SharedDeliverySystem.cs | 50 ++++++++++++++++-- .../en-US/delivery/delivery-component.ftl | 8 +++ .../Structures/Machines/mail_teleporter.yml | 7 +++ .../Structures/mailbox.rsi/contents.png | Bin 0 -> 7319 bytes .../Textures/Structures/mailbox.rsi/meta.json | 5 +- 9 files changed, 124 insertions(+), 21 deletions(-) create mode 100644 Resources/Textures/Structures/mailbox.rsi/contents.png diff --git a/Content.Client/Delivery/DeliveryVisualizerSystem.cs b/Content.Client/Delivery/DeliveryVisualizerSystem.cs index 8ed15344a4..bf4a8f066b 100644 --- a/Content.Client/Delivery/DeliveryVisualizerSystem.cs +++ b/Content.Client/Delivery/DeliveryVisualizerSystem.cs @@ -43,3 +43,9 @@ public enum DeliveryVisualLayers : byte Breakage, Trash, } + +public enum DeliverySpawnerVisualLayers : byte +{ + Contents, +} + diff --git a/Content.Server/Delivery/DeliverySystem.Spawning.cs b/Content.Server/Delivery/DeliverySystem.Spawning.cs index 19087e7448..a7496a343b 100644 --- a/Content.Server/Delivery/DeliverySystem.Spawning.cs +++ b/Content.Server/Delivery/DeliverySystem.Spawning.cs @@ -1,6 +1,6 @@ -using Content.Server.Power.EntitySystems; -using Content.Server.StationRecords; using Content.Shared.Delivery; +using Content.Shared.Power.EntitySystems; +using Content.Server.StationRecords; using Content.Shared.EntityTable; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -16,7 +16,7 @@ public sealed partial class DeliverySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly EntityTableSystem _entityTable = default!; - [Dependency] private readonly PowerReceiverSystem _power = default!; + [Dependency] private readonly SharedPowerReceiverSystem _power = default!; private void InitializeSpawning() { @@ -28,16 +28,14 @@ public sealed partial class DeliverySystem ent.Comp.NextDelivery = _timing.CurTime + ent.Comp.MinDeliveryCooldown; // We want an early wave of mail so cargo doesn't have to wait } - private void SpawnDelivery(Entity<DeliverySpawnerComponent?> ent, int amount) + protected override void SpawnDeliveries(Entity<DeliverySpawnerComponent?> ent) { if (!Resolve(ent.Owner, ref ent.Comp)) return; var coords = Transform(ent).Coordinates; - _audio.PlayPvs(ent.Comp.SpawnSound, ent.Owner); - - for (int i = 0; i < amount; i++) + for (int i = 0; i < ent.Comp.ContainedDeliveryAmount; i++) { var spawns = _entityTable.GetSpawns(ent.Comp.Table); @@ -46,9 +44,12 @@ public sealed partial class DeliverySystem Spawn(id, coords); } } + + ent.Comp.ContainedDeliveryAmount = 0; + Dirty(ent); } - private void SpawnStationDeliveries(Entity<CargoDeliveryDataComponent> ent) + private void AdjustStationDeliveries(Entity<CargoDeliveryDataComponent> ent) { if (!TryComp<StationRecordsComponent>(ent, out var records)) return; @@ -72,7 +73,7 @@ public sealed partial class DeliverySystem { foreach (var spawner in spawners) { - SpawnDelivery(spawner, deliveryCount); + AddDeliveriesToSpawner(spawner, deliveryCount); } } else @@ -87,18 +88,18 @@ public sealed partial class DeliverySystem } for (int j = 0; j < spawners.Count; j++) { - SpawnDelivery(spawners[j], amounts[j]); + AddDeliveriesToSpawner(spawners[j], amounts[j]); } } } - private List<EntityUid> GetValidSpawners(Entity<CargoDeliveryDataComponent> ent) + private List<Entity<DeliverySpawnerComponent>> GetValidSpawners(Entity<CargoDeliveryDataComponent> ent) { - var validSpawners = new List<EntityUid>(); + var validSpawners = new List<Entity<DeliverySpawnerComponent>>(); var spawners = EntityQueryEnumerator<DeliverySpawnerComponent>(); - while (spawners.MoveNext(out var spawnerUid, out _)) + while (spawners.MoveNext(out var spawnerUid, out var spawnerComp)) { var spawnerStation = _station.GetOwningStation(spawnerUid); @@ -108,12 +109,23 @@ public sealed partial class DeliverySystem if (!_power.IsPowered(spawnerUid)) continue; - validSpawners.Add(spawnerUid); + if (spawnerComp.ContainedDeliveryAmount >= spawnerComp.MaxContainedDeliveryAmount) + continue; + + validSpawners.Add((spawnerUid, spawnerComp)); } return validSpawners; } + private void AddDeliveriesToSpawner(Entity<DeliverySpawnerComponent> ent, int amount) + { + ent.Comp.ContainedDeliveryAmount += Math.Clamp(amount, 0, ent.Comp.MaxContainedDeliveryAmount - ent.Comp.ContainedDeliveryAmount); + _audio.PlayPvs(ent.Comp.SpawnSound, ent.Owner); + UpdateDeliverySpawnerVisuals(ent, ent.Comp.ContainedDeliveryAmount); + Dirty(ent); + } + private void UpdateSpawner(float frameTime) { var dataQuery = EntityQueryEnumerator<CargoDeliveryDataComponent>(); @@ -125,7 +137,7 @@ public sealed partial class DeliverySystem continue; deliveryData.NextDelivery += _random.Next(deliveryData.MinDeliveryCooldown, deliveryData.MaxDeliveryCooldown); // Random cooldown between min and max - SpawnStationDeliveries((uid, deliveryData)); + AdjustStationDeliveries((uid, deliveryData)); } } } diff --git a/Content.Shared/Delivery/DeliverySpawnerComponent.cs b/Content.Shared/Delivery/DeliverySpawnerComponent.cs index 4491509cb3..9ed3ff1b91 100644 --- a/Content.Shared/Delivery/DeliverySpawnerComponent.cs +++ b/Content.Shared/Delivery/DeliverySpawnerComponent.cs @@ -9,7 +9,7 @@ namespace Content.Shared.Delivery; /// Used to mark entities that are valid for spawning deliveries on. /// If this requires power, it needs to be powered to count as a valid spawner. /// </summary> -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class DeliverySpawnerComponent : Component { /// <summary> @@ -18,9 +18,28 @@ public sealed partial class DeliverySpawnerComponent : Component [DataField(required: true)] public EntityTableSelector Table = default!; + /// <summary> + /// The max amount of deliveries this spawner can hold at a time. + /// </summary> + [DataField] + public int MaxContainedDeliveryAmount = 20; + + /// <summary> + /// The currently held amount of deliveries. + /// They are stored as an int and only spawned on use, as to not create additional entities without the need to. + /// </summary> + [DataField, AutoNetworkedField] + public int ContainedDeliveryAmount; + /// <summary> /// The sound to play when the spawner spawns a delivery. /// </summary> [DataField] public SoundSpecifier? SpawnSound = new SoundCollectionSpecifier("DeliverySpawnSounds", AudioParams.Default.WithVolume(-7)); + + /// <summary> + /// The sound to play when a spawner is opened, and spills all the deliveries out. + /// </summary> + [DataField] + public SoundSpecifier? OpenSound = new SoundCollectionSpecifier("storageRustle"); } diff --git a/Content.Shared/Delivery/DeliveryVisuals.cs b/Content.Shared/Delivery/DeliveryVisuals.cs index 6da45b6277..69eb5fda9e 100644 --- a/Content.Shared/Delivery/DeliveryVisuals.cs +++ b/Content.Shared/Delivery/DeliveryVisuals.cs @@ -13,3 +13,9 @@ public enum DeliveryVisuals : byte IsPriorityInactive, JobIcon, } + +[Serializable, NetSerializable] +public enum DeliverySpawnerVisuals : byte +{ + Contents, +} diff --git a/Content.Shared/Delivery/SharedDeliverySystem.cs b/Content.Shared/Delivery/SharedDeliverySystem.cs index 319bf41fce..8d343b4acb 100644 --- a/Content.Shared/Delivery/SharedDeliverySystem.cs +++ b/Content.Shared/Delivery/SharedDeliverySystem.cs @@ -38,12 +38,15 @@ public abstract class SharedDeliverySystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent<DeliveryComponent, ExaminedEvent>(OnExamine); + SubscribeLocalEvent<DeliveryComponent, ExaminedEvent>(OnDeliveryExamine); SubscribeLocalEvent<DeliveryComponent, UseInHandEvent>(OnUseInHand); - SubscribeLocalEvent<DeliveryComponent, GetVerbsEvent<AlternativeVerb>>(OnGetVerbs); + SubscribeLocalEvent<DeliveryComponent, GetVerbsEvent<AlternativeVerb>>(OnGetDeliveryVerbs); + + SubscribeLocalEvent<DeliverySpawnerComponent, ExaminedEvent>(OnSpawnerExamine); + SubscribeLocalEvent<DeliverySpawnerComponent, GetVerbsEvent<AlternativeVerb>>(OnGetSpawnerVerbs); } - private void OnExamine(Entity<DeliveryComponent> ent, ref ExaminedEvent args) + private void OnDeliveryExamine(Entity<DeliveryComponent> ent, ref ExaminedEvent args) { var jobTitle = ent.Comp.RecipientJobTitle ?? Loc.GetString("delivery-recipient-no-job"); var recipientName = ent.Comp.RecipientName ?? Loc.GetString("delivery-recipient-no-name"); @@ -56,6 +59,11 @@ public abstract class SharedDeliverySystem : EntitySystem args.PushText(Loc.GetString("delivery-recipient-examine", ("recipient", recipientName), ("job", jobTitle))); } + private void OnSpawnerExamine(Entity<DeliverySpawnerComponent> ent, ref ExaminedEvent args) + { + args.PushMarkup(Loc.GetString("delivery-teleporter-amount-examine", ("amount", ent.Comp.ContainedDeliveryAmount)), 50); + } + private void OnUseInHand(Entity<DeliveryComponent> ent, ref UseInHandEvent args) { args.Handled = true; @@ -69,7 +77,7 @@ public abstract class SharedDeliverySystem : EntitySystem OpenDelivery(ent, args.User); } - private void OnGetVerbs(Entity<DeliveryComponent> ent, ref GetVerbsEvent<AlternativeVerb> args) + private void OnGetDeliveryVerbs(Entity<DeliveryComponent> ent, ref GetVerbsEvent<AlternativeVerb> args) { if (!args.CanAccess || !args.CanInteract || args.Hands == null || ent.Comp.IsOpened) return; @@ -92,6 +100,33 @@ public abstract class SharedDeliverySystem : EntitySystem }); } + private void OnGetSpawnerVerbs(Entity<DeliverySpawnerComponent> ent, ref GetVerbsEvent<AlternativeVerb> args) + { + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + var user = args.User; + + args.Verbs.Add(new AlternativeVerb() + { + Act = () => + { + _audio.PlayPredicted(ent.Comp.OpenSound, ent.Owner, user); + + if(ent.Comp.ContainedDeliveryAmount == 0) + { + _popup.PopupPredicted(Loc.GetString("delivery-teleporter-empty", ("entity", ent)), null, ent, user); + return; + } + + SpawnDeliveries(ent.Owner); + + UpdateDeliverySpawnerVisuals(ent, ent.Comp.ContainedDeliveryAmount); + }, + Text = Loc.GetString("delivery-teleporter-empty-verb"), + }); + } + private bool TryUnlockDelivery(Entity<DeliveryComponent> ent, EntityUid user, bool rewardMoney = true) { // Check fingerprint access if there is a reader on the mail @@ -168,7 +203,14 @@ public abstract class SharedDeliverySystem : EntitySystem _appearance.SetData(uid, DeliveryVisuals.IsPriority, false); } + protected void UpdateDeliverySpawnerVisuals(EntityUid uid, int contents) + { + _appearance.SetData(uid, DeliverySpawnerVisuals.Contents, contents > 0); + } + protected virtual void GrantSpesoReward(Entity<DeliveryComponent?> ent) { } + + protected virtual void SpawnDeliveries(Entity<DeliverySpawnerComponent?> ent) { } } /// <summary> diff --git a/Resources/Locale/en-US/delivery/delivery-component.ftl b/Resources/Locale/en-US/delivery/delivery-component.ftl index 499b708284..fbe4e74937 100644 --- a/Resources/Locale/en-US/delivery/delivery-component.ftl +++ b/Resources/Locale/en-US/delivery/delivery-component.ftl @@ -10,3 +10,11 @@ delivery-opened-others = {CAPITALIZE($recipient)} opened the {$delivery}. delivery-unlock-verb = Unlock delivery-open-verb = Open + +delivery-teleporter-amount-examine = + { $amount -> + [one] It contains [color=yellow]{$amount}[/color] delivery. + *[other] It contains [color=yellow]{$amount}[/color] deliveries. + } +delivery-teleporter-empty = The {$entity} is empty. +delivery-teleporter-empty-verb = Take mail diff --git a/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml b/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml index a03f166bbe..6842e3c958 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml @@ -20,6 +20,9 @@ snapCardinals: true layers: - state: icon + - state: contents + map: [ "enum.DeliverySpawnerVisualLayers.Contents" ] + visible: false - state: unlit shader: unshaded visible: false @@ -32,6 +35,10 @@ - type: Appearance - type: GenericVisualizer visuals: + enum.DeliverySpawnerVisuals.Contents: + enum.DeliverySpawnerVisualLayers.Contents: + True: { visible: true } + False: { visible: false } enum.PowerDeviceVisuals.Powered: enum.PowerDeviceVisualLayers.Powered: True: { visible: true } diff --git a/Resources/Textures/Structures/mailbox.rsi/contents.png b/Resources/Textures/Structures/mailbox.rsi/contents.png new file mode 100644 index 0000000000000000000000000000000000000000..45fab01257b9271f8c302e228534876da78b7a39 GIT binary patch literal 7319 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/mailbox.rsi/meta.json b/Resources/Textures/Structures/mailbox.rsi/meta.json index ce3494c3d4..711646c2b3 100644 --- a/Resources/Textures/Structures/mailbox.rsi/meta.json +++ b/Resources/Textures/Structures/mailbox.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Created by meijunkie on Discord, funkystation.org at commit https://github.com/funky-station/funky-station/commit/430be9247ac220367f338c2c1a716a7503b1446d", + "copyright": "Created by meijunkie on Discord, funkystation.org at commit https://github.com/funky-station/funky-station/commit/430be9247ac220367f338c2c1a716a7503b1446d, contents by ScarKy0 (Github)", "size": { "x": 32, "y": 32 @@ -12,6 +12,9 @@ }, { "name": "unlit" + }, + { + "name": "contents" } ] } From b83cb209feff8e74d0c51bffb94f54dd14c2e6f9 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 09:33:27 +0000 Subject: [PATCH 488/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index eb39cb6395..cd81435762 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Tayrtahn - changes: - - message: Arcades, vending machines and the recycler now sometimes say creepy things - when a ghost uses the "Boo!" action near them. - type: Add - id: 7796 - time: '2025-01-11T02:48:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34368 - author: Kickguy223 changes: - message: Indestructible tiles no longer break due to explosions @@ -3900,3 +3892,15 @@ id: 8296 time: '2025-04-20T22:27:49.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35713 +- author: ScarKy0 + changes: + - message: Mail spawning has been reworked. The mail teleporter now has to be manually + emptied to take all the mail out. (You can do it by alt-clicking it or using + a verb) + type: Tweak + - message: The mail teleporter now has an internal capacity of 20. It will not spawn + mail past that until emptied by someone. + type: Add + id: 8297 + time: '2025-04-21T09:32:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36774 From df5e6a2b5c2fcc71ada200f510e07ad07dc6510e Mon Sep 17 00:00:00 2001 From: Thomas <87614336+Aeshus@users.noreply.github.com> Date: Mon, 21 Apr 2025 06:24:44 -0400 Subject: [PATCH 489/622] Add RGA/RSI to Credits (#36704) * Add RGA and RSI to Credits * Move to thread + add directory field --- Content.Client/Credits/CreditsWindow.xaml | 12 +- Content.Client/Credits/CreditsWindow.xaml.cs | 469 +++++++++++++----- .../Locale/en-US/credits/credits-window.ftl | 10 +- 3 files changed, 351 insertions(+), 140 deletions(-) diff --git a/Content.Client/Credits/CreditsWindow.xaml b/Content.Client/Credits/CreditsWindow.xaml index 2cb6f7ab92..b7bc2329c1 100644 --- a/Content.Client/Credits/CreditsWindow.xaml +++ b/Content.Client/Credits/CreditsWindow.xaml @@ -1,7 +1,7 @@ <DefaultWindow xmlns="https://spacestation14.io" - Title="{Loc 'credits-window-title'}" - SetSize="650 650" > - <TabContainer> + Title="{Loc 'credits-window-title'}" + SetSize="650 650"> + <TabContainer Name="MasterTabContainer"> <ScrollContainer Name="Ss14ContributorsTab" HScrollEnabled="False"> <BoxContainer Name="Ss14ContributorsContainer" @@ -26,5 +26,11 @@ <!-- Licenses get added here by code --> </BoxContainer> </ScrollContainer> + <ScrollContainer Name="AttributionsTab" + HScrollEnabled="False"> + <BoxContainer Name="AttributionsContainer" + Orientation="Vertical" + Margin="2 2 0 0" /> + </ScrollContainer> </TabContainer> </DefaultWindow> diff --git a/Content.Client/Credits/CreditsWindow.xaml.cs b/Content.Client/Credits/CreditsWindow.xaml.cs index ba24020953..64f5479421 100644 --- a/Content.Client/Credits/CreditsWindow.xaml.cs +++ b/Content.Client/Credits/CreditsWindow.xaml.cs @@ -1,184 +1,381 @@ -using System.Collections.Generic; using System.Linq; using System.Numerics; +using System.Threading.Tasks; using Content.Client.Stylesheets; using Content.Shared.CCVar; using Robust.Client.AutoGenerated; using Robust.Client.Credits; -using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Configuration; using Robust.Shared.ContentPack; -using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Maths; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; +using Robust.Shared.Serialization.Markdown; +using Robust.Shared.Serialization.Markdown.Mapping; +using Robust.Shared.Serialization.Markdown.Sequence; using Robust.Shared.Utility; using YamlDotNet.RepresentationModel; using static Robust.Client.UserInterface.Controls.BoxContainer; -namespace Content.Client.Credits -{ - [GenerateTypedNameReferences] - public sealed partial class CreditsWindow : DefaultWindow - { - [Dependency] private readonly IResourceManager _resourceManager = default!; - [Dependency] private readonly IConfigurationManager _cfg = default!; +namespace Content.Client.Credits; - private static readonly Dictionary<string, int> PatronTierPriority = new() +[GenerateTypedNameReferences] +public sealed partial class CreditsWindow : DefaultWindow +{ + [Dependency] private readonly IResourceManager _resourceManager = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly ISerializationManager _serialization = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly ILocalizationManager _loc = default!; + + private static readonly Dictionary<string, int> PatronTierPriority = new() + { + ["Nuclear Operative"] = 1, + ["Syndicate Agent"] = 2, + ["Revolutionary"] = 3, + }; + + private readonly List<FormattedMessage> _attributions = []; + private readonly ISawmill _sawmill = Logger.GetSawmill("Credits"); + + private const int AttributionsSourcesPerPage = 50; + + public CreditsWindow() + { + IoCManager.InjectDependencies(this); + RobustXamlLoader.Load(this); + + TabContainer.SetTabTitle(Ss14ContributorsTab, Loc.GetString("credits-window-ss14contributorslist-tab")); + TabContainer.SetTabTitle(PatronsTab, Loc.GetString("credits-window-patrons-tab")); + TabContainer.SetTabTitle(LicensesTab, Loc.GetString("credits-window-licenses-tab")); + TabContainer.SetTabTitle(AttributionsTab, Loc.GetString("credits-window-attributions-tab")); + + _protoManager.PrototypesReloaded += _ => { - ["Nuclear Operative"] = 1, - ["Syndicate Agent"] = 2, - ["Revolutionary"] = 3 + _attributions.Clear(); }; - public CreditsWindow() - { - IoCManager.InjectDependencies(this); - RobustXamlLoader.Load(this); + MasterTabContainer.OnTabChanged += OnTabChanged; - TabContainer.SetTabTitle(Ss14ContributorsTab, Loc.GetString("credits-window-ss14contributorslist-tab")); - TabContainer.SetTabTitle(PatronsTab, Loc.GetString("credits-window-patrons-tab")); - TabContainer.SetTabTitle(LicensesTab, Loc.GetString("credits-window-licenses-tab")); + PopulateContributors(Ss14ContributorsContainer); + } + /// <summary> + /// Only populates the tab when they are selected, which reduces lagspike when not looking at attributions. + /// </summary> + private void OnTabChanged(int tab) + { + if (tab == Ss14ContributorsTab.GetPositionInParent()) PopulateContributors(Ss14ContributorsContainer); + else if (tab == PatronsTab.GetPositionInParent()) PopulatePatrons(PatronsContainer); + else if (tab == LicensesTab.GetPositionInParent()) PopulateLicenses(LicensesContainer); + else if (tab == AttributionsTab.GetPositionInParent()) + PopulateAttributions(AttributionsContainer, 0); + } + + private async void PopulateAttributions(BoxContainer attributionsContainer, int count) + { + attributionsContainer.DisposeAllChildren(); + + if (_attributions.Count == 0) + { + var rsi = await CollectRSiAttributions(); + var rga = await CollectRgaAttributions(); + + _attributions.AddRange(rsi); + _attributions.AddRange(rga); } - private void PopulateLicenses(BoxContainer licensesContainer) + foreach (var message in _attributions.Skip(count).Take(AttributionsSourcesPerPage)) { - foreach (var entry in CreditsManager.GetLicenses(_resourceManager).OrderBy(p => p.Name)) - { - licensesContainer.AddChild(new Label {StyleClasses = {StyleBase.StyleClassLabelHeading}, Text = entry.Name}); + var rich = new RichTextLabel(); + rich.SetMessage(message); + attributionsContainer.AddChild(rich); + } - // We split these line by line because otherwise - // the LGPL causes Clyde to go out of bounds in the rendering code. - foreach (var line in entry.License.Split("\n")) + var container = new BoxContainer { Orientation = LayoutOrientation.Horizontal }; + + var previousPageButton = new Button { Text = "Previous Page" }; + previousPageButton.OnPressed += + _ => PopulateAttributions(attributionsContainer, count - AttributionsSourcesPerPage); + + var nextPageButton = new Button { Text = "Next Page" }; + nextPageButton.OnPressed += + _ => PopulateAttributions(attributionsContainer, count + AttributionsSourcesPerPage); + + if (count - AttributionsSourcesPerPage >= 0) + container.AddChild(previousPageButton); + if (count + AttributionsSourcesPerPage < _attributions.Count) + container.AddChild(nextPageButton); + + attributionsContainer.AddChild(container); + } + + private Task<List<FormattedMessage>> CollectRSiAttributions() + { + return Task.Run(() => + { + var rsiStreams = _resourceManager.ContentFindFiles("/Textures/") + .Where(p => p.ToString().EndsWith(".rsi/meta.json")); + + var attrs = new List<FormattedMessage>(); + + foreach (var stream in rsiStreams) + { + try { - licensesContainer.AddChild(new Label {Text = line, FontColorOverride = new Color(200, 200, 200)}); + var m = new FormattedMessage(); + + var yamlStream = _resourceManager.ContentFileReadYaml(stream); + + if (yamlStream.Documents[0].RootNode.ToDataNode() is not MappingDataNode map) + throw new Exception("meta.json is not a mapping."); + + if (!map.TryGet("copyright", out var copyrightNode)) + throw new Exception("Missing the copyright field."); + + if (!map.TryGet("states", out var statesNode)) + throw new Exception("Missing the states field."); + + if (statesNode is not SequenceDataNode states) + throw new Exception("Missing a list of states."); + + var copyright = copyrightNode.ToString(); + var files = states.Select(n => (MappingDataNode)n) + .Select(n => n.Get("name") + ".png"); + + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-directory", + ("directory", stream.Directory.ToString()))); + m.AddText("\n"); + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-files", + ("files", string.Join(", ", files)))); + m.AddText("\n"); + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-copyright", + ("copyright", copyright))); + m.AddText("\n"); + + attrs.Add(m); + } + catch (Exception e) + { + var m = new FormattedMessage(); + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-failed", + ("file", stream.ToString()))); + m.AddText("\n"); + _sawmill.Error($"{stream.ToString()}\n{e}"); + attrs.Add(m); } } - } - private void PopulatePatrons(BoxContainer patronsContainer) + return attrs; + }); + } + + private Task<List<FormattedMessage>> CollectRgaAttributions() + { + return Task.Run(() => { - var patrons = LoadPatrons(); + var rgaStreams = _resourceManager.ContentFindFiles("/") + .Where(p => p.Filename == "attributions.yml"); - // Do not show "become a patron" button on Steam builds - // since Patreon violates Valve's rules about alternative storefronts. - var linkPatreon = _cfg.GetCVar(CCVars.InfoLinksPatreon); - if (!_cfg.GetCVar(CCVars.BrandingSteam) && linkPatreon != "") + var attrs = new List<FormattedMessage>(); + + foreach (var stream in rgaStreams) { - Button patronButton; - patronsContainer.AddChild(patronButton = new Button + try { - Text = Loc.GetString("credits-window-become-patron-button"), - HorizontalAlignment = HAlignment.Center - }); + var yamlStream = _resourceManager.ContentFileReadYaml(stream); - patronButton.OnPressed += - _ => IoCManager.Resolve<IUriOpener>().OpenUri(linkPatreon); + if (yamlStream.Documents[0].RootNode.ToDataNode() is not SequenceDataNode sequence) + throw new Exception("Attributions file is not a list of attributions."); + + foreach (var attribution in sequence.Sequence) + { + var m = new FormattedMessage(); + + if (attribution is not MappingDataNode map) + throw new Exception("Attribution is not a mapping."); + + if (!map.TryGet("files", out var filesNode)) + throw new Exception("Attribution does not list files."); + + if (!map.TryGet("copyright", out var copyrightNode)) + throw new Exception("Attribution does not copyright."); + + if (!map.TryGet("license", out var licenseNode)) + throw new Exception("Attribution does not identify a license."); + + if (!map.TryGet("source", out var sourceNode)) + throw new Exception("Attribution does not identify a source."); + + var files = _serialization.Read<string[]>(filesNode, notNullableOverride: true); + var copyright = copyrightNode.ToString(); + var license = licenseNode.ToString(); + var source = sourceNode.ToString(); + + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-directory", + ("directory", stream.Directory.ToString()))); + m.AddText("\n"); + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-files", + ("files", string.Join(", ", files)))); + m.AddText("\n"); + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-copyright", + ("copyright", copyright))); + m.AddText("\n"); + m.AddMarkupPermissive( + _loc.GetString("credits-window-attributions-license", ("license", license))); + m.AddText("\n"); + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-source", ("source", source))); + m.AddText("\n"); + + attrs.Add(m); + } + } + catch (Exception e) + { + var m = new FormattedMessage(); + m.AddMarkupPermissive(_loc.GetString("credits-window-attributions-failed", + ("file", stream.ToString()))); + m.AddText("\n"); + _sawmill.Error($"{stream.ToString()}\n{e}"); + attrs.Add(m); + } } - var first = true; - foreach (var tier in patrons.GroupBy(p => p.Tier).OrderBy(p => PatronTierPriority[p.Key])) - { - if (!first) - { - patronsContainer.AddChild(new Control {MinSize = new Vector2(0, 10)}); - } + return attrs; + }); + } - first = false; - patronsContainer.AddChild(new Label {StyleClasses = {StyleBase.StyleClassLabelHeading}, Text = $"{tier.Key}"}); - - var msg = string.Join(", ", tier.OrderBy(p => p.Name).Select(p => p.Name)); - - var label = new RichTextLabel(); - label.SetMessage(msg); - - patronsContainer.AddChild(label); - } - } - - private IEnumerable<PatronEntry> LoadPatrons() + private void PopulateLicenses(BoxContainer licensesContainer) + { + foreach (var entry in CreditsManager.GetLicenses(_resourceManager).OrderBy(p => p.Name)) { - var yamlStream = _resourceManager.ContentFileReadYaml(new ("/Credits/Patrons.yml")); - var sequence = (YamlSequenceNode) yamlStream.Documents[0].RootNode; + licensesContainer.AddChild(new Label + { StyleClasses = { StyleBase.StyleClassLabelHeading }, Text = entry.Name }); - return sequence - .Cast<YamlMappingNode>() - .Select(m => new PatronEntry(m["Name"].AsString(), m["Tier"].AsString())); - } - - private void PopulateContributors(BoxContainer ss14ContributorsContainer) - { - Button contributeButton; - - ss14ContributorsContainer.AddChild(new BoxContainer + // We split these line by line because otherwise + // the LGPL causes Clyde to go out of bounds in the rendering code. + foreach (var line in entry.License.Split("\n")) { - Orientation = LayoutOrientation.Horizontal, - HorizontalAlignment = HAlignment.Center, - SeparationOverride = 20, - Children = - { - new Label {Text = Loc.GetString("credits-window-contributor-encouragement-label") }, - (contributeButton = new Button {Text = Loc.GetString("credits-window-contribute-button")}) - } - }); - - var first = true; - - void AddSection(string title, string path, bool markup = false) - { - if (!first) - { - ss14ContributorsContainer.AddChild(new Control {MinSize = new Vector2(0, 10)}); - } - - first = false; - ss14ContributorsContainer.AddChild(new Label {StyleClasses = {StyleBase.StyleClassLabelHeading}, Text = title}); - - var label = new RichTextLabel(); - var text = _resourceManager.ContentFileReadAllText($"/Credits/{path}"); - if (markup) - { - label.SetMessage(FormattedMessage.FromMarkupOrThrow(text.Trim())); - } - else - { - label.SetMessage(text); - } - - ss14ContributorsContainer.AddChild(label); - } - - AddSection(Loc.GetString("credits-window-contributors-section-title"), "GitHub.txt"); - AddSection(Loc.GetString("credits-window-codebases-section-title"), "SpaceStation13.txt"); - AddSection(Loc.GetString("credits-window-original-remake-team-section-title"), "OriginalRemake.txt"); - AddSection(Loc.GetString("credits-window-special-thanks-section-title"), "SpecialThanks.txt", true); - - var linkGithub = _cfg.GetCVar(CCVars.InfoLinksGithub); - - contributeButton.OnPressed += _ => - IoCManager.Resolve<IUriOpener>().OpenUri(linkGithub); - - if (linkGithub == "") - contributeButton.Visible = false; - } - - private sealed class PatronEntry - { - public string Name { get; } - public string Tier { get; } - - public PatronEntry(string name, string tier) - { - Name = name; - Tier = tier; + licensesContainer.AddChild(new Label { Text = line, FontColorOverride = new Color(200, 200, 200) }); } } } + + private void PopulatePatrons(BoxContainer patronsContainer) + { + var patrons = LoadPatrons(); + + // Do not show "become a patron" button on Steam builds + // since Patreon violates Valve's rules about alternative storefronts. + var linkPatreon = _cfg.GetCVar(CCVars.InfoLinksPatreon); + if (!_cfg.GetCVar(CCVars.BrandingSteam) && linkPatreon != "") + { + Button patronButton; + patronsContainer.AddChild(patronButton = new Button + { + Text = Loc.GetString("credits-window-become-patron-button"), + HorizontalAlignment = HAlignment.Center, + }); + + patronButton.OnPressed += + _ => IoCManager.Resolve<IUriOpener>().OpenUri(linkPatreon); + } + + var first = true; + foreach (var tier in patrons.GroupBy(p => p.Tier).OrderBy(p => PatronTierPriority[p.Key])) + { + if (!first) + patronsContainer.AddChild(new Control { MinSize = new Vector2(0, 10) }); + + first = false; + patronsContainer.AddChild(new Label + { StyleClasses = { StyleBase.StyleClassLabelHeading }, Text = $"{tier.Key}" }); + + var msg = string.Join(", ", tier.OrderBy(p => p.Name).Select(p => p.Name)); + + var label = new RichTextLabel(); + label.SetMessage(msg); + + patronsContainer.AddChild(label); + } + } + + private IEnumerable<PatronEntry> LoadPatrons() + { + var yamlStream = _resourceManager.ContentFileReadYaml(new ResPath("/Credits/Patrons.yml")); + var sequence = (YamlSequenceNode)yamlStream.Documents[0].RootNode; + + return sequence + .Cast<YamlMappingNode>() + .Select(m => new PatronEntry(m["Name"].AsString(), m["Tier"].AsString())); + } + + private void PopulateContributors(BoxContainer ss14ContributorsContainer) + { + Button contributeButton; + + ss14ContributorsContainer.AddChild(new BoxContainer + { + Orientation = LayoutOrientation.Horizontal, + HorizontalAlignment = HAlignment.Center, + SeparationOverride = 20, + Children = + { + new Label { Text = Loc.GetString("credits-window-contributor-encouragement-label") }, + (contributeButton = new Button { Text = Loc.GetString("credits-window-contribute-button") }), + }, + }); + + var first = true; + + void AddSection(string title, string path, bool markup = false) + { + if (!first) + ss14ContributorsContainer.AddChild(new Control { MinSize = new Vector2(0, 10) }); + + first = false; + ss14ContributorsContainer.AddChild(new Label + { StyleClasses = { StyleBase.StyleClassLabelHeading }, Text = title }); + + var label = new RichTextLabel(); + var text = _resourceManager.ContentFileReadAllText($"/Credits/{path}"); + if (markup) + label.SetMessage(FormattedMessage.FromMarkupOrThrow(text.Trim())); + else + label.SetMessage(text); + + ss14ContributorsContainer.AddChild(label); + } + + AddSection(Loc.GetString("credits-window-contributors-section-title"), "GitHub.txt"); + AddSection(Loc.GetString("credits-window-codebases-section-title"), "SpaceStation13.txt"); + AddSection(Loc.GetString("credits-window-original-remake-team-section-title"), "OriginalRemake.txt"); + AddSection(Loc.GetString("credits-window-special-thanks-section-title"), "SpecialThanks.txt", true); + + var linkGithub = _cfg.GetCVar(CCVars.InfoLinksGithub); + + contributeButton.OnPressed += _ => + IoCManager.Resolve<IUriOpener>().OpenUri(linkGithub); + + if (linkGithub == "") + contributeButton.Visible = false; + } + + private sealed class PatronEntry + { + public string Name { get; } + public string Tier { get; } + + public PatronEntry(string name, string tier) + { + Name = name; + Tier = tier; + } + } } diff --git a/Resources/Locale/en-US/credits/credits-window.ftl b/Resources/Locale/en-US/credits/credits-window.ftl index 1b9636367b..4bd7f7a426 100644 --- a/Resources/Locale/en-US/credits/credits-window.ftl +++ b/Resources/Locale/en-US/credits/credits-window.ftl @@ -2,10 +2,18 @@ credits-window-title = Credits credits-window-patrons-tab = Patrons credits-window-ss14contributorslist-tab = Credits credits-window-licenses-tab = Open Source Licenses +credits-window-attributions-tab = Attributions credits-window-become-patron-button = Become a Patron credits-window-contributor-encouragement-label = Want to get on this list? credits-window-contribute-button = Contribute! credits-window-contributors-section-title = Space Station 14 Contributors credits-window-codebases-section-title = Space Station 13 Codebases credits-window-original-remake-team-section-title = Original Space Station 13 Remake Team -credits-window-special-thanks-section-title = Special Thanks \ No newline at end of file +credits-window-special-thanks-section-title = Special Thanks + +credits-window-attributions-directory = [color=white]Directory:[/color] {$directory} +credits-window-attributions-files = [color=white]Files:[/color] {$files} +credits-window-attributions-copyright = [color=white]Copyright:[/color] {$copyright} +credits-window-attributions-license = [color=white]License:[/color] {$license} +credits-window-attributions-source = [color=white]Source:[/color] {$source} +credits-window-attributions-failed = [color=red]Failed to read file:[/color] {$file} From 467fe23795aba91815b3a0c564f044bc9b2f5e6f Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Mon, 21 Apr 2025 12:32:14 +0200 Subject: [PATCH 490/622] Further Allocation Tweaks (#36800) * init * fix lockboxes --- Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs | 4 ++-- .../Cargo/Components/OverrideSellComponent.cs | 6 ++++++ .../Cargo/Components/StationBankAccountComponent.cs | 10 +++++----- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index aaa14d196f..ce2642e1b6 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -342,8 +342,8 @@ public sealed partial class CargoSystem { distribution = new Dictionary<ProtoId<CargoAccountPrototype>, double> { - { sellComponent.OverrideAccount, bankAccount.PrimaryCut }, - { bankAccount.PrimaryAccount, 1.0 - bankAccount.PrimaryCut }, + { sellComponent.OverrideAccount, sellComponent.OverrideCut }, + { bankAccount.PrimaryAccount, 1.0 - sellComponent.OverrideCut }, }; } else diff --git a/Content.Shared/Cargo/Components/OverrideSellComponent.cs b/Content.Shared/Cargo/Components/OverrideSellComponent.cs index 7d798c9ad1..13e72486ec 100644 --- a/Content.Shared/Cargo/Components/OverrideSellComponent.cs +++ b/Content.Shared/Cargo/Components/OverrideSellComponent.cs @@ -14,4 +14,10 @@ public sealed partial class OverrideSellComponent : Component /// </summary> [DataField(required: true)] public ProtoId<CargoAccountPrototype> OverrideAccount; + + /// <summary> + /// The cut that the OverrideAccount will get from the price. The rest is given to the primary station account. + /// </summary> + [DataField] + public float OverrideCut = 0.75f; } diff --git a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs index 701238926b..a52f5ee61c 100644 --- a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs +++ b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs @@ -21,7 +21,7 @@ public sealed partial class StationBankAccountComponent : Component /// When giving funds to a particular account, the proportion of funds they should receive compared to remaining accounts. /// </summary> [DataField, AutoNetworkedField] - public double PrimaryCut = 0.75; + public double PrimaryCut = 0.50; /// <summary> /// A dictionary corresponding to the money held by each cargo account. @@ -44,11 +44,11 @@ public sealed partial class StationBankAccountComponent : Component public Dictionary<ProtoId<CargoAccountPrototype>, double> RevenueDistribution = new() { { "Cargo", 0.00 }, - { "Engineering", 0.25 }, - { "Medical", 0.25 }, - { "Science", 0.15 }, + { "Engineering", 0.20 }, + { "Medical", 0.20 }, + { "Science", 0.20 }, { "Security", 0.20 }, - { "Service", 0.15 }, + { "Service", 0.20 }, }; /// <summary> From 9fd70dd6d46c7f218b4e8034af3b2b4f37bbe5d4 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 10:33:21 +0000 Subject: [PATCH 491/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index cd81435762..9d5a588988 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kickguy223 - changes: - - message: Indestructible tiles no longer break due to explosions - type: Fix - id: 7797 - time: '2025-01-11T17:27:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34339 - author: '0x6273' changes: - message: Fix a bug that was causing arachnid stomachs to not digest at the intended, @@ -3904,3 +3897,10 @@ id: 8297 time: '2025-04-21T09:32:18.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36774 +- author: ScarKy0 + changes: + - message: Default cargo split is now 50% instead of 75%. Lockboxes remain unchanged. + type: Tweak + id: 8298 + time: '2025-04-21T10:32:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36800 From a83402f3827717c0466a802d8e1479b1575a2bc3 Mon Sep 17 00:00:00 2001 From: Phooooooooooooooooooooooooooooooosphate <184853112+Phooooooooooooooooooooooooooooooosphate@users.noreply.github.com> Date: Mon, 21 Apr 2025 07:07:33 -0500 Subject: [PATCH 492/622] Add the medical HUDs to medical's loadouts (except chem) (#32847) Added the medical HUD and eyepatch to the medical (CMO, doctor, paramed and intern) loadout to let them choose between. Also gives the option for the regular glasses. --- Resources/Locale/en-US/preferences/loadout-groups.ftl | 2 ++ .../Loadouts/Jobs/Medical/medical_doctor.yml | 11 +++++++++++ Resources/Prototypes/Loadouts/loadout_groups.yml | 11 +++++++++++ Resources/Prototypes/Loadouts/role_loadouts.yml | 8 ++++---- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Resources/Locale/en-US/preferences/loadout-groups.ftl b/Resources/Locale/en-US/preferences/loadout-groups.ftl index ce5a0daf56..c07e288e8c 100644 --- a/Resources/Locale/en-US/preferences/loadout-groups.ftl +++ b/Resources/Locale/en-US/preferences/loadout-groups.ftl @@ -197,6 +197,8 @@ loadout-group-paramedic-jumpsuit = Paramedic jumpsuit loadout-group-paramedic-outerclothing = Paramedic outer clothing loadout-group-paramedic-shoes = Paramedic shoes +loadout-group-medical-glasses = Medical glasses + # Wildcards loadout-group-reporter-jumpsuit = Reporter jumpsuit diff --git a/Resources/Prototypes/Loadouts/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Loadouts/Jobs/Medical/medical_doctor.yml index db5f2edae8..3b43df4d4b 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Medical/medical_doctor.yml @@ -175,3 +175,14 @@ id: SterileMask equipment: mask: ClothingMaskSterile + +#Eyewear +- type: loadout + id: MedicalHud + equipment: + eyes: ClothingEyesHudMedical + +- type: loadout + id: MedicalEyePatchHud + equipment: + eyes: ClothingEyesEyepatchHudMedical diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index e9473a459a..987affe13d 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -1288,6 +1288,17 @@ - WhiteShoes - MedicalWinterBoots +- type: loadoutGroup + id: MedicalEyewear + name: loadout-group-medical-glasses + minLimit: 0 + loadouts: + - MedicalHud + - MedicalEyePatchHud + - Glasses + - GlassesJamjar + - GlassesJensen + - type: loadoutGroup id: SurvivalMedical name: loadout-group-survival-medical diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index a304adeb3a..cf4b443285 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -418,7 +418,7 @@ - ChiefMedicalOfficerOuterClothing - ChiefMedicalOfficerNeck - ChiefMedicalOfficerShoes - - Glasses + - MedicalEyewear - SurvivalMedical - Trinkets - GroupSpeciesBreathToolMedical @@ -435,7 +435,7 @@ - MedicalDoctorOuterClothing - MedicalShoes - MedicalDoctorPDA - - Glasses + - MedicalEyewear - SurvivalMedical - Trinkets - GroupSpeciesBreathToolMedical @@ -446,7 +446,7 @@ - GroupTankHarness - MedicalInternJumpsuit - MedicalBackpack - - Glasses + - MedicalEyewear - SurvivalMedical - Trinkets - GroupSpeciesBreathToolMedical @@ -476,7 +476,7 @@ - MedicalBackpack - ParamedicOuterClothing - ParamedicShoes - - Glasses + - MedicalEyewear - SurvivalMedical - Trinkets - GroupSpeciesBreathToolMedical From 14b9973f1b1aaac2d46e40129e52656e09b53f7f Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 12:08:40 +0000 Subject: [PATCH 493/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9d5a588988..2cf7ccab1d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: '0x6273' - changes: - - message: Fix a bug that was causing arachnid stomachs to not digest at the intended, - slower than normal speed. - type: Fix - id: 7798 - time: '2025-01-11T19:29:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34298 - author: justdie12 changes: - message: Added a bend version of the radiator. @@ -3904,3 +3896,10 @@ id: 8298 time: '2025-04-21T10:32:14.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36800 +- author: Phooooooooooooooooooooooooooooooosphate + changes: + - message: Add the medical HUDs to medical's loadout. + type: Add + id: 8299 + time: '2025-04-21T12:07:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32847 From 92a974008146b8ddbffc0ef3249a3fcb663d79dc Mon Sep 17 00:00:00 2001 From: TytosB <54259736+TytosB@users.noreply.github.com> Date: Mon, 21 Apr 2025 09:25:26 -0500 Subject: [PATCH 494/622] new salv ruins (#36798) --- Resources/Maps/Lavaland/fleshlab.yml | 3544 +++++++++++ Resources/Maps/Lavaland/mineshaft.yml | 7776 +++++++++++++++++++++++++ Resources/Maps/Lavaland/sloth.yml | 238 + 3 files changed, 11558 insertions(+) create mode 100644 Resources/Maps/Lavaland/fleshlab.yml create mode 100644 Resources/Maps/Lavaland/mineshaft.yml create mode 100644 Resources/Maps/Lavaland/sloth.yml diff --git a/Resources/Maps/Lavaland/fleshlab.yml b/Resources/Maps/Lavaland/fleshlab.yml new file mode 100644 index 0000000000..0930831ceb --- /dev/null +++ b/Resources/Maps/Lavaland/fleshlab.yml @@ -0,0 +1,3544 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/21/2025 06:14:13 + entityCount: 583 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 4: Space + 3: FloorBasalt + 8: FloorFlesh + 2: FloorReinforced + 0: FloorSteel + 7: FloorSteelDamaged + 5: FloorWhite + 1: Plating + 6: PlatingDamaged +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: 1.6570394,-0.484375 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: CAAAAAACAAAAAAABAAAAAAACCAAAAAADAAAAAAABCAAAAAACCAAAAAACCAAAAAAAAAAAAAABAAAAAAABAAAAAAACAAAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAABCAAAAAABAAAAAAADCAAAAAADCAAAAAADCAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAADAAAAAAADAAAAAAADAAAAAAABAAAAAAADAAAAAAADAAAAAAADCAAAAAABAAAAAAACAAAAAAADCAAAAAAAAAAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAABAwAAAAAAAAAAAAADAAAAAAABAAAAAAACAAAAAAAAAAAAAAACAAAAAAADAAAAAAABAAAAAAACAAAAAAACAAAAAAABAAAAAAACAAAAAAADAAAAAAACAAAAAAACAAAAAAADAwAAAAAAAAAAAAACAQAAAAAAAQAAAAAAAAAAAAADAAAAAAABAgAAAAAAAgAAAAAAAAAAAAADCAAAAAACAAAAAAADAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAACAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAABAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAACAAAAAAADAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAAAAAAACAAAAAAADAAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAABAAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAADAAAAAAACAAAAAAAAAAAAAAACAAAAAAACAAAAAAACAAAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAABAAAAAAACAAAAAAADAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAACAAAAAAABAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAABQAAAAACAAAAAAADAAAAAAACAAAAAAACAAAAAAAAAAAAAAADAAAAAAABCAAAAAABCAAAAAADCAAAAAACAAAAAAAAAAAAAAABAAAAAAACCAAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAACCAAAAAAAAAAAAAAAAAAAAAABCAAAAAACCAAAAAADAAAAAAACAAAAAAAAAAAAAAACCAAAAAADBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAQAAAAAAAAAAAAADAAAAAAABCAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAACBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAQAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAACAAAAAABAAAAAAABAAAAAAABBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAADAAAAAAAAAAAAAAACAAAAAAADCAAAAAACAAAAAAABBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAAAAAAADAAAAAAACAAAAAAABAAAAAAADAAAAAAACAAAAAAAAAAAAAAACAAAAAAACAAAAAAADAAAAAAACBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAAAAAAADAAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAADAAAAAAADAAAAAAAAAAAAAAADBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAACAAAAAAABAAAAAAACAAAAAAADAAAAAAADAAAAAAABBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAAAAAAACAAAAAAABAAAAAAADAAAAAAAAAAAAAAAAAAAAAAACAAAAAAABAAAAAAAAAAAAAAADBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAAAAAAACAAAAAAADAAAAAAADAAAAAAAAAAAAAAADAAAAAAADAAAAAAAAAAAAAAACAAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAACAAAAAAACAAAAAAABAAAAAAACAAAAAAABAAAAAAACAAAAAAADAAAAAAACBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAACAAAAAAABBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAAAAAAACAAAAAAACAAAAAAADAAAAAAABAAAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAABBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: BAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAABQAAAAACAAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAADAAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAACBgAAAAAABQAAAAACCAAAAAACBQAAAAAAAAAAAAAAAAAAAAADAAAAAAACAAAAAAADCAAAAAAAAAAAAAABAAAAAAACAAAAAAAAAAAAAAADAAAAAAABBwAAAAAAAQAAAAAAAQAAAAAACAAAAAADBQAAAAABCAAAAAADAAAAAAACAAAAAAABCAAAAAACAAAAAAAAAAAAAAACAAAAAAABAAAAAAADAAAAAAABAAAAAAABAAAAAAACBgAAAAABAAAAAAABAAAAAAAACAAAAAADBgAAAAACAQAAAAAABgAAAAACAQAAAAAABwAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAACAAAAAAABCAAAAAABAAAAAAAAAAAAAAACBwAAAAACAAAAAAAABQAAAAACCAAAAAABBQAAAAABAAAAAAACAAAAAAAAAAAAAAACAAAAAAADCAAAAAAAAAAAAAABAAAAAAADAAAAAAABCAAAAAAACAAAAAABAAAAAAABAAAAAAAAAAAAAAABBQAAAAADBQAAAAADBQAAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAACAAAAAABCAAAAAAAAAAAAAADAAAAAAADCAAAAAADAAAAAAAAAAAAAAAD + version: 6 + 0,-1: + ind: 0,-1 + tiles: BAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAABAAAAAAABAAAAAAAAAAAAAAACAAAAAAACAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAACAAAAAAACAAAAAAACAAAAAAADAAAAAAABAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABwAAAAABAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAADAAAAAAADAAAAAAADAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAwAAAAAAAAAAAAACAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAACAAAAAAADAAAAAAADCAAAAAABAAAAAAABAAAAAAABAAAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAADAwAAAAAAAAAAAAACAAAAAAACAAAAAAAAAAAAAAAAAAAAAAABAAAAAAACAAAAAAACAAAAAAADAAAAAAABAAAAAAACAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAABAAAAAAADAAAAAAACAAAAAAABAAAAAAACAAAAAAABAAAAAAACAAAAAAACAAAAAAAAAAAAAAACAAAAAAADAAAAAAABAAAAAAADAAAAAAAAAAAAAAABAAAAAAAC + version: 6 + -2,-1: + ind: -2,-1 + tiles: BAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAABQAAAAADBQAAAAABAQAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAABQAAAAAACAAAAAADBQAAAAADBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAQAAAAAABQAAAAADCAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAQAAAAAABQAAAAACCAAAAAABBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAQAAAAAACAAAAAAABQAAAAADBAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAABQAAAAACBQAAAAACBQAAAAAD + version: 6 + -2,0: + ind: -2,0 + tiles: BAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAABQAAAAADBQAAAAAAAQAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAA + version: 6 + 1,0: + ind: 1,0 + tiles: AAAAAAABAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAADAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAADAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAADAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAABAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAACAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAA + version: 6 + 1,-1: + ind: 1,-1 + tiles: BAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAwAAAAAAAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAACAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAABAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAABAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAACAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAACAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAAAAAAAAACAwAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAABAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Bot + decals: + 0: 7,6 + 2: 7,5 + 18: 8,6 + 19: 8,5 + 20: 8,5 + 21: 7,5 + 22: 7,4 + 23: 8,4 + 25: -7,11 + 26: -7,10 + 27: -7,9 + 28: -6,9 + 29: -5,9 + 30: -5,10 + 31: -5,11 + 33: -6,11 + - node: + color: '#FFFFFFFF' + id: Box + decals: + 34: -6,10 + - node: + color: '#FFFFFFFF' + id: WarnCornerSmallNW + decals: + 17: 9,3 + - node: + color: '#FFFFFFFF' + id: WarnLineS + decals: + 12: 9,4 + 13: 9,5 + 14: 9,6 + - node: + color: '#FFFFFFFF' + id: WarnLineW + decals: + 15: 7,3 + 16: 8,3 + - node: + color: '#7F1710FF' + id: splatter + decals: + 35: -4.651025,2.1459215 + 36: -10.523625,-3.5384576 + 37: -12.97675,-3.6165826 + 38: -15.315013,-2.8040826 + 39: -7.8522053,-0.7415826 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 43263 + -1,0: + 0: 65535 + 0,1: + 0: 65250 + -1,1: + 0: 61951 + 0,2: + 0: 48056 + -1,2: + 0: 65521 + 0,3: + 0: 3979 + -1,3: + 0: 3855 + 0,-1: + 0: 35375 + 1,0: + 0: 65535 + 1,1: + 0: 15288 + 1,2: + 0: 57119 + 1,3: + 0: 241 + 1,-1: + 0: 65419 + 2,0: + 0: 65535 + 2,1: + 0: 4095 + 2,2: + 0: 4367 + 2,3: + 0: 48 + 2,-1: + 0: 65535 + 3,0: + 0: 4094 + 3,1: + 0: 3838 + -4,-1: + 0: 65535 + -5,0: + 0: 8 + -3,-1: + 0: 65535 + -3,0: + 0: 34952 + -3,1: + 0: 49288 + -3,2: + 0: 17476 + -3,3: + 0: 3140 + -2,0: + 0: 65535 + -2,1: + 0: 61695 + -2,2: + 0: 65520 + -2,3: + 0: 3855 + -2,-1: + 0: 65535 + -1,-1: + 0: 65535 + -4,-2: + 0: 61440 + -5,-2: + 0: 49152 + -5,-1: + 0: 52974 + -3,-2: + 0: 61440 + -2,-2: + 0: 61440 + -1,-2: + 0: 65280 + 0,-2: + 0: 65280 + 1,-2: + 0: 45824 + 2,-2: + 0: 61440 + 3,-2: + 0: 61440 + 3,-1: + 0: 3838 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirCanister + entities: + - uid: 291 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 +- proto: AirlockAssemblyScience + entities: + - uid: 192 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 +- proto: AirlockEngineeringLocked + entities: + - uid: 373 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,10.5 + parent: 1 +- proto: AirlockScience + entities: + - uid: 63 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: -3.5,8.5 + parent: 1 +- proto: AirlockScienceGlass + entities: + - uid: 179 + components: + - type: Transform + pos: 12.5,5.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: 12.5,1.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: 12.5,-2.5 + parent: 1 +- proto: AnomalyCoreFleshInert + entities: + - uid: 199 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -15.492753,-2.6592877 + parent: 1 +- proto: AnomalyScanner + entities: + - uid: 268 + components: + - type: Transform + pos: -5.3650637,4.6814785 + parent: 1 +- proto: APCBasic + entities: + - uid: 357 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,8.5 + parent: 1 + - uid: 358 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 359 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -9.5,0.5 + parent: 1 + - uid: 382 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,11.5 + parent: 1 +- proto: Autolathe + entities: + - uid: 276 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 +- proto: BasaltFive + entities: + - uid: 574 + components: + - type: Transform + pos: 4.5,-3.5 + parent: 1 + - uid: 577 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 578 + components: + - type: Transform + pos: 3.5,13.5 + parent: 1 + - uid: 579 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 +- proto: BasaltOne + entities: + - uid: 575 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 576 + components: + - type: Transform + pos: 4.5,7.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 580 + components: + - type: Transform + pos: 4.5,13.5 + parent: 1 + - uid: 581 + components: + - type: Transform + pos: -9.5,12.5 + parent: 1 + - uid: 582 + components: + - type: Transform + pos: -8.5,14.5 + parent: 1 + - uid: 583 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 572 + components: + - type: Transform + pos: -7.5,7.5 + parent: 1 + - uid: 573 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 +- proto: BorgModuleAdvancedTool + entities: + - uid: 346 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.285738,12.272611 + parent: 1 +- proto: BorgModuleAdvancedTreatment + entities: + - uid: 344 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5982378,12.553861 + parent: 1 +- proto: BorgModuleArtifact + entities: + - uid: 312 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 9.536747,-0.334455 + parent: 1 +- proto: BorgModuleRCD + entities: + - uid: 345 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.2701128,9.835111 + parent: 1 +- proto: BorgModuleSyndicateWeapon + entities: + - uid: 343 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.2701128,12.522611 + parent: 1 +- proto: BoxFolderClipboard + entities: + - uid: 315 + components: + - type: Transform + pos: 9.599247,2.321795 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 386 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 387 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 388 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 + - uid: 392 + components: + - type: Transform + pos: -2.5,9.5 + parent: 1 + - uid: 400 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 421 + components: + - type: Transform + pos: -3.5,9.5 + parent: 1 + - uid: 422 + components: + - type: Transform + pos: -4.5,9.5 + parent: 1 + - uid: 423 + components: + - type: Transform + pos: -5.5,9.5 + parent: 1 + - uid: 424 + components: + - type: Transform + pos: -6.5,9.5 + parent: 1 + - uid: 425 + components: + - type: Transform + pos: -6.5,10.5 + parent: 1 + - uid: 426 + components: + - type: Transform + pos: -6.5,11.5 + parent: 1 + - uid: 427 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 + - uid: 428 + components: + - type: Transform + pos: -1.5,9.5 + parent: 1 + - uid: 429 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 430 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 431 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 432 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 433 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 434 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 435 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 436 + components: + - type: Transform + pos: -0.5,12.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: -1.5,12.5 + parent: 1 + - uid: 438 + components: + - type: Transform + pos: -3.5,12.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: -4.5,12.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: -5.5,12.5 + parent: 1 + - uid: 441 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 + - uid: 442 + components: + - type: Transform + pos: -9.5,0.5 + parent: 1 + - uid: 443 + components: + - type: Transform + pos: -8.5,0.5 + parent: 1 + - uid: 444 + components: + - type: Transform + pos: -8.5,1.5 + parent: 1 + - uid: 445 + components: + - type: Transform + pos: -8.5,2.5 + parent: 1 + - uid: 446 + components: + - type: Transform + pos: -8.5,3.5 + parent: 1 + - uid: 447 + components: + - type: Transform + pos: -8.5,4.5 + parent: 1 + - uid: 448 + components: + - type: Transform + pos: -7.5,4.5 + parent: 1 + - uid: 449 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 450 + components: + - type: Transform + pos: -5.5,4.5 + parent: 1 + - uid: 451 + components: + - type: Transform + pos: -4.5,4.5 + parent: 1 + - uid: 452 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 453 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 + - uid: 454 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 455 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - uid: 456 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 457 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 458 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 459 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 460 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 461 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 462 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 + - uid: 463 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 464 + components: + - type: Transform + pos: -9.5,-0.5 + parent: 1 + - uid: 465 + components: + - type: Transform + pos: -10.5,-0.5 + parent: 1 + - uid: 466 + components: + - type: Transform + pos: -11.5,-0.5 + parent: 1 + - uid: 467 + components: + - type: Transform + pos: -12.5,-0.5 + parent: 1 + - uid: 468 + components: + - type: Transform + pos: -13.5,-0.5 + parent: 1 + - uid: 469 + components: + - type: Transform + pos: -14.5,-0.5 + parent: 1 + - uid: 470 + components: + - type: Transform + pos: -16.5,-0.5 + parent: 1 + - uid: 471 + components: + - type: Transform + pos: -17.5,-0.5 + parent: 1 + - uid: 472 + components: + - type: Transform + pos: -15.5,-0.5 + parent: 1 + - uid: 473 + components: + - type: Transform + pos: -17.5,-1.5 + parent: 1 + - uid: 474 + components: + - type: Transform + pos: -17.5,-2.5 + parent: 1 + - uid: 475 + components: + - type: Transform + pos: -17.5,-4.5 + parent: 1 + - uid: 476 + components: + - type: Transform + pos: -17.5,-3.5 + parent: 1 + - uid: 477 + components: + - type: Transform + pos: -16.5,-5.5 + parent: 1 + - uid: 478 + components: + - type: Transform + pos: -16.5,-4.5 + parent: 1 + - uid: 479 + components: + - type: Transform + pos: -15.5,-5.5 + parent: 1 + - uid: 480 + components: + - type: Transform + pos: -14.5,-5.5 + parent: 1 + - uid: 481 + components: + - type: Transform + pos: -12.5,-5.5 + parent: 1 + - uid: 482 + components: + - type: Transform + pos: -11.5,-5.5 + parent: 1 + - uid: 483 + components: + - type: Transform + pos: -10.5,-5.5 + parent: 1 + - uid: 484 + components: + - type: Transform + pos: -9.5,-5.5 + parent: 1 + - uid: 485 + components: + - type: Transform + pos: -13.5,-5.5 + parent: 1 + - uid: 486 + components: + - type: Transform + pos: -7.5,-5.5 + parent: 1 + - uid: 487 + components: + - type: Transform + pos: -8.5,-5.5 + parent: 1 + - uid: 488 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 489 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 490 + components: + - type: Transform + pos: -6.5,-5.5 + parent: 1 + - uid: 491 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 + - uid: 492 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 493 + components: + - type: Transform + pos: -10.5,-4.5 + parent: 1 + - uid: 494 + components: + - type: Transform + pos: -10.5,-3.5 + parent: 1 + - uid: 495 + components: + - type: Transform + pos: -10.5,-2.5 + parent: 1 + - uid: 496 + components: + - type: Transform + pos: -10.5,-1.5 + parent: 1 + - uid: 497 + components: + - type: Transform + pos: -5.5,-4.5 + parent: 1 + - uid: 498 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 499 + components: + - type: Transform + pos: -5.5,-2.5 + parent: 1 + - uid: 500 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 501 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - uid: 502 + components: + - type: Transform + pos: -5.5,1.5 + parent: 1 + - uid: 503 + components: + - type: Transform + pos: -5.5,-1.5 + parent: 1 + - uid: 504 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 505 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 506 + components: + - type: Transform + pos: 5.5,2.5 + parent: 1 + - uid: 507 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 508 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 509 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 510 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 511 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 512 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 513 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 514 + components: + - type: Transform + pos: 8.5,1.5 + parent: 1 + - uid: 515 + components: + - type: Transform + pos: 9.5,1.5 + parent: 1 + - uid: 516 + components: + - type: Transform + pos: 11.5,1.5 + parent: 1 + - uid: 517 + components: + - type: Transform + pos: 10.5,1.5 + parent: 1 + - uid: 518 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - uid: 519 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 520 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 + - uid: 521 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 522 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 + - uid: 523 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 + - uid: 524 + components: + - type: Transform + pos: 12.5,5.5 + parent: 1 + - uid: 525 + components: + - type: Transform + pos: 10.5,0.5 + parent: 1 + - uid: 526 + components: + - type: Transform + pos: 10.5,-0.5 + parent: 1 + - uid: 527 + components: + - type: Transform + pos: 10.5,-1.5 + parent: 1 + - uid: 528 + components: + - type: Transform + pos: 10.5,-3.5 + parent: 1 + - uid: 529 + components: + - type: Transform + pos: 10.5,-2.5 + parent: 1 + - uid: 530 + components: + - type: Transform + pos: 11.5,-2.5 + parent: 1 + - uid: 531 + components: + - type: Transform + pos: 12.5,-2.5 + parent: 1 + - uid: 532 + components: + - type: Transform + pos: 13.5,-2.5 + parent: 1 + - uid: 533 + components: + - type: Transform + pos: 8.5,-2.5 + parent: 1 + - uid: 534 + components: + - type: Transform + pos: 7.5,-2.5 + parent: 1 + - uid: 535 + components: + - type: Transform + pos: 9.5,-2.5 + parent: 1 + - uid: 536 + components: + - type: Transform + pos: 6.5,-1.5 + parent: 1 + - uid: 537 + components: + - type: Transform + pos: 5.5,-1.5 + parent: 1 + - uid: 538 + components: + - type: Transform + pos: 7.5,-1.5 + parent: 1 + - uid: 539 + components: + - type: Transform + pos: 4.5,-1.5 + parent: 1 + - uid: 540 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 541 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 +- proto: CableHV + entities: + - uid: 378 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 + - uid: 379 + components: + - type: Transform + pos: 8.5,11.5 + parent: 1 + - uid: 380 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 + - uid: 381 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 +- proto: CableMV + entities: + - uid: 384 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 + - uid: 385 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 389 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 390 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 391 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 393 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 394 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 395 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 396 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 397 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 398 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 399 + components: + - type: Transform + pos: -2.5,7.5 + parent: 1 + - uid: 401 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 402 + components: + - type: Transform + pos: -3.5,7.5 + parent: 1 + - uid: 403 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 404 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 405 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 406 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 + - uid: 407 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 408 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 409 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 410 + components: + - type: Transform + pos: -3.5,2.5 + parent: 1 + - uid: 411 + components: + - type: Transform + pos: -3.5,3.5 + parent: 1 + - uid: 412 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - uid: 413 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 414 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - uid: 415 + components: + - type: Transform + pos: -9.5,0.5 + parent: 1 + - uid: 416 + components: + - type: Transform + pos: -8.5,0.5 + parent: 1 + - uid: 417 + components: + - type: Transform + pos: -7.5,0.5 + parent: 1 + - uid: 418 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - uid: 419 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 420 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 +- proto: CableTerminal + entities: + - uid: 376 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,11.5 + parent: 1 +- proto: ClothingHeadHatWeldingMaskFlameBlue + entities: + - uid: 342 + components: + - type: Transform + pos: -2.9107378,12.694486 + parent: 1 +- proto: ClothingHeadMirror + entities: + - uid: 218 + components: + - type: Transform + pos: -14.958105,-3.199584 + parent: 1 +- proto: ComputerAnalysisConsole + entities: + - uid: 126 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,-0.5 + parent: 1 +- proto: computerBodyScanner + entities: + - uid: 206 + components: + - type: Transform + pos: -15.5,-0.5 + parent: 1 +- proto: ComputerBroken + entities: + - uid: 114 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,3.5 + parent: 1 + - uid: 137 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,-4.5 + parent: 1 + - uid: 204 + components: + - type: Transform + pos: -16.5,-0.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: -14.5,-0.5 + parent: 1 + - uid: 208 + components: + - type: Transform + pos: -13.5,-0.5 + parent: 1 + - uid: 282 + components: + - type: Transform + pos: 4.5,3.5 + parent: 1 + - uid: 283 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 349 + components: + - type: Transform + pos: -4.5,12.5 + parent: 1 + - uid: 350 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 +- proto: ComputerMedicalRecords + entities: + - uid: 205 + components: + - type: Transform + pos: -17.5,-0.5 + parent: 1 +- proto: CrateArtifactContainer + entities: + - uid: 289 + components: + - type: Transform + pos: 9.5,-4.5 + parent: 1 +- proto: CrateMedicalSurgery + entities: + - uid: 210 + components: + - type: Transform + pos: -17.5,-3.5 + parent: 1 +- proto: CrateScience + entities: + - uid: 347 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - type: Fixtures + fixtures: + fix1: + shape: !type:PolygonShape + radius: 0.01 + vertices: + - -0.4,-0.4 + - 0.4,-0.4 + - 0.4,0.29 + - -0.4,0.29 + mask: + - Impassable + - HighImpassable + - LowImpassable + layer: + - BulletImpassable + - Opaque + density: 50 + hard: True + restitution: 0 + friction: 0.4 + - type: EntityStorage + open: True + removedMasks: 20 + - type: PlaceableSurface + isPlaceable: True + - uid: 348 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - type: Fixtures + fixtures: + fix1: + shape: !type:PolygonShape + radius: 0.01 + vertices: + - -0.4,-0.4 + - 0.4,-0.4 + - 0.4,0.29 + - -0.4,0.29 + mask: + - Impassable + - HighImpassable + - LowImpassable + layer: + - BulletImpassable + - Opaque + density: 50 + hard: True + restitution: 0 + friction: 0.4 + - type: EntityStorage + open: True + removedMasks: 20 + - type: PlaceableSurface + isPlaceable: True +- proto: CyborgEndoskeleton + entities: + - uid: 332 + components: + - type: Transform + pos: -5.484109,10.631986 + parent: 1 +- proto: Drill + entities: + - uid: 215 + components: + - type: Transform + pos: -15.47373,-4.371459 + parent: 1 +- proto: DrinkHotCoffee + entities: + - uid: 314 + components: + - type: Transform + pos: 9.364872,1.790545 + parent: 1 +- proto: ExosuitFabricator + entities: + - uid: 327 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 + - uid: 329 + components: + - type: Transform + pos: -7.5,9.5 + parent: 1 +- proto: filingCabinetDrawerRandom + entities: + - uid: 139 + components: + - type: Transform + pos: -11.5,-0.5 + parent: 1 +- proto: filingCabinetRandom + entities: + - uid: 141 + components: + - type: Transform + pos: -12.5,-0.5 + parent: 1 +- proto: FleshBlocker + entities: + - uid: 542 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -16.5,-3.5 + parent: 1 + - uid: 543 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -14.5,-1.5 + parent: 1 + - uid: 544 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,0.5 + parent: 1 + - uid: 545 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,1.5 + parent: 1 + - uid: 546 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,0.5 + parent: 1 + - uid: 547 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,-1.5 + parent: 1 + - uid: 548 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,0.5 + parent: 1 + - uid: 549 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,0.5 + parent: 1 + - uid: 550 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,2.5 + parent: 1 + - uid: 551 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 8.5,1.5 + parent: 1 +- proto: GasCanisterBrokenBase + entities: + - uid: 292 + components: + - type: Transform + pos: 7.5,4.5 + parent: 1 + - uid: 293 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 +- proto: GasMixerFlipped + entities: + - uid: 305 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,5.5 + parent: 1 +- proto: GasPipeStraight + entities: + - uid: 309 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,5.5 + parent: 1 + - uid: 310 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,1.5 + parent: 1 + - uid: 311 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,-2.5 + parent: 1 +- proto: GasPort + entities: + - uid: 298 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 299 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,5.5 + parent: 1 + - uid: 300 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 10.5,1.5 + parent: 1 + - uid: 301 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 10.5,-2.5 + parent: 1 +- proto: GasPressurePump + entities: + - uid: 302 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,-2.5 + parent: 1 + - uid: 303 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,1.5 + parent: 1 + - uid: 304 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,5.5 + parent: 1 +- proto: GasVentPump + entities: + - uid: 306 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,5.5 + parent: 1 + - uid: 307 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,1.5 + parent: 1 + - uid: 308 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,-2.5 + parent: 1 +- proto: GeneratorRTG + entities: + - uid: 377 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 +- proto: Girder + entities: + - uid: 24 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 +- proto: Grille + entities: + - uid: 2 + components: + - type: Transform + pos: -9.5,4.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -14.5,-5.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -15.5,-5.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: -16.5,-5.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -16.5,0.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -15.5,0.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -14.5,0.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: -9.5,2.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: -9.5,3.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -18.5,-3.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -10.5,-5.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -11.5,-5.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -9.5,-5.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -5.5,6.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: 12.5,-4.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: 12.5,-3.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: 12.5,-1.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: 12.5,0.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: 12.5,4.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: 9.5,7.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 +- proto: GrilleBroken + entities: + - uid: 30 + components: + - type: Transform + pos: -18.5,-1.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -18.5,-2.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: 12.5,2.5 + parent: 1 +- proto: HandheldArtifactContainer + entities: + - uid: 138 + components: + - type: Transform + pos: 9.521122,1.18117 + parent: 1 +- proto: Hemostat + entities: + - uid: 217 + components: + - type: Transform + pos: -16.426855,-2.121459 + parent: 1 +- proto: HonkerChassis + entities: + - uid: 331 + components: + - type: Transform + pos: -2.5,10.5 + parent: 1 +- proto: LightHeadBorg + entities: + - uid: 333 + components: + - type: Transform + pos: -6.046609,11.241361 + parent: 1 +- proto: MachineAnomalyGenerator + entities: + - uid: 265 + components: + - type: Transform + pos: -7.5,4.5 + parent: 1 +- proto: MachineAnomalySynchronizer + entities: + - uid: 269 + components: + - type: Transform + pos: -8.5,-2.5 + parent: 1 +- proto: MachineAnomalyVessel + entities: + - uid: 226 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 +- proto: MachineAPE + entities: + - uid: 147 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 270 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-2.5 + parent: 1 +- proto: MachineArtifactAnalyzer + entities: + - uid: 113 + components: + - type: Transform + pos: 14.5,1.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: 14.5,-2.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: 14.5,5.5 + parent: 1 +- proto: MachineArtifactCrusher + entities: + - uid: 129 + components: + - type: Transform + pos: 7.5,-4.5 + parent: 1 +- proto: MachineFlatpacker + entities: + - uid: 278 + components: + - type: Transform + pos: 5.5,-1.5 + parent: 1 +- proto: MachineFrameDestroyed + entities: + - uid: 209 + components: + - type: Transform + pos: -17.5,-2.5 + parent: 1 + - uid: 229 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 279 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 +- proto: MMI + entities: + - uid: 565 + components: + - type: Transform + pos: -5.0574512,9.868924 + parent: 1 +- proto: NodeScanner + entities: + - uid: 313 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 9.521122,0.290545 + parent: 1 +- proto: OperatingTable + entities: + - uid: 195 + components: + - type: Transform + pos: -15.5,-2.5 + parent: 1 +- proto: OrganHumanBrain + entities: + - uid: 220 + components: + - type: Transform + pos: -16.35054,-3.083308 + parent: 1 +- proto: OrganHumanHeart + entities: + - uid: 221 + components: + - type: Transform + pos: -15.334915,-2.052058 + parent: 1 +- proto: OrganHumanLungs + entities: + - uid: 222 + components: + - type: Transform + pos: -14.03804,-4.192683 + parent: 1 +- proto: PlasmaReinforcedWindowDirectional + entities: + - uid: 228 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 231 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 +- proto: PowerCellRecharger + entities: + - uid: 562 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 +- proto: Poweredlight + entities: + - uid: 316 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -8.5,1.5 + parent: 1 + - uid: 317 + components: + - type: Transform + pos: -12.5,-0.5 + parent: 1 + - uid: 318 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,-4.5 + parent: 1 + - uid: 319 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,0.5 + parent: 1 + - uid: 320 + components: + - type: Transform + pos: -6.5,7.5 + parent: 1 + - uid: 321 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,-0.5 + parent: 1 + - uid: 322 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 323 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 6.5,-1.5 + parent: 1 + - uid: 324 + components: + - type: Transform + pos: 11.5,6.5 + parent: 1 + - uid: 325 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 8.5,-4.5 + parent: 1 + - uid: 326 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 355 + components: + - type: Transform + pos: -5.5,12.5 + parent: 1 + - uid: 356 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,9.5 + parent: 1 +- proto: PoweredSmallLight + entities: + - uid: 383 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,10.5 + parent: 1 +- proto: Protolathe + entities: + - uid: 277 + components: + - type: Transform + pos: 4.5,-1.5 + parent: 1 +- proto: Rack + entities: + - uid: 275 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-1.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: -7.5,10.5 + parent: 1 + - uid: 330 + components: + - type: Transform + pos: -7.5,11.5 + parent: 1 +- proto: Railing + entities: + - uid: 258 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -8.5,2.5 + parent: 1 + - uid: 259 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,2.5 + parent: 1 + - uid: 260 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,2.5 + parent: 1 + - uid: 262 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,3.5 + parent: 1 + - uid: 263 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,4.5 + parent: 1 + - uid: 264 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,5.5 + parent: 1 +- proto: RailingCornerSmall + entities: + - uid: 261 + components: + - type: Transform + pos: -4.5,2.5 + parent: 1 +- proto: RandomArtifactSpawner + entities: + - uid: 112 + components: + - type: Transform + pos: 14.5,-2.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 14.5,5.5 + parent: 1 +- proto: RandomMedicCorpseSpawner + entities: + - uid: 219 + components: + - type: Transform + pos: -14.5,-2.5 + parent: 1 +- proto: RandomScienceCorpseSpawner + entities: + - uid: 561 + components: + - type: Transform + pos: -4.5,2.5 + parent: 1 + - uid: 563 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 571 + components: + - type: Transform + pos: -9.5,-3.5 + parent: 1 +- proto: RandomSecurityCorpseSpawner + entities: + - uid: 564 + components: + - type: Transform + pos: -7.5,-0.5 + parent: 1 +- proto: ReinforcedPlasmaWindow + entities: + - uid: 182 + components: + - type: Transform + pos: 12.5,-3.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: 12.5,-1.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: 12.5,0.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: 12.5,4.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 +- proto: ReinforcedWindow + entities: + - uid: 25 + components: + - type: Transform + pos: -11.5,-5.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: -16.5,-5.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: -10.5,-5.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: -9.5,-5.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: -15.5,0.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: -15.5,-5.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: -14.5,-5.5 + parent: 1 + - uid: 234 + components: + - type: Transform + pos: -14.5,0.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: -9.5,4.5 + parent: 1 + - uid: 241 + components: + - type: Transform + pos: -9.5,3.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: -9.5,2.5 + parent: 1 + - uid: 243 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: -5.5,6.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: 9.5,7.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 +- proto: ResearchAndDevelopmentServerMachineCircuitboard + entities: + - uid: 280 + components: + - type: Transform + pos: 3.4160054,3.3746216 + parent: 1 +- proto: ResearchDisk + entities: + - uid: 568 + components: + - type: Transform + pos: -10.234578,-0.3525455 + parent: 1 + - uid: 569 + components: + - type: Transform + pos: 6.739002,1.3505795 + parent: 1 +- proto: ResearchDisk10000 + entities: + - uid: 567 + components: + - type: Transform + pos: -5.3333635,0.5068295 + parent: 1 +- proto: RightLegBorg + entities: + - uid: 334 + components: + - type: Transform + pos: -6.171609,9.835111 + parent: 1 +- proto: SalvageCanisterSpawner + entities: + - uid: 128 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 290 + components: + - type: Transform + pos: 8.5,4.5 + parent: 1 +- proto: SalvageFleshSpawner + entities: + - uid: 552 + components: + - type: Transform + pos: -10.5,-2.5 + parent: 1 + - uid: 553 + components: + - type: Transform + pos: -16.5,-1.5 + parent: 1 + - uid: 554 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 555 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 556 + components: + - type: Transform + pos: -3.5,2.5 + parent: 1 + - uid: 557 + components: + - type: Transform + pos: -15.5,-3.5 + parent: 1 + - uid: 558 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 559 + components: + - type: Transform + pos: 8.5,-0.5 + parent: 1 + - uid: 560 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 +- proto: SawAdvanced + entities: + - uid: 216 + components: + - type: Transform + pos: -11.81748,-3.277709 + parent: 1 +- proto: ScalpelLaser + entities: + - uid: 214 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -15.770605,-4.324584 + parent: 1 +- proto: ScrapAirlock1 + entities: + - uid: 194 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.1022129,0.5103246 + parent: 1 +- proto: ScrapAirlock2 + entities: + - uid: 274 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.070623,-2.6477256 + parent: 1 +- proto: ScrapCanister1 + entities: + - uid: 294 + components: + - type: Transform + pos: 7.5850887,3.6317844 + parent: 1 +- proto: ScrapCanister2 + entities: + - uid: 295 + components: + - type: Transform + pos: 10.147589,4.3661594 + parent: 1 +- proto: ScrapGeneratorFuelTank + entities: + - uid: 27 + components: + - type: Transform + pos: -0.3350997,-3.6454897 + parent: 1 +- proto: ScrapSteel + entities: + - uid: 26 + components: + - type: Transform + pos: -1.3038497,-4.1298647 + parent: 1 + - uid: 271 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -10.758123,-2.5227256 + parent: 1 +- proto: ShardGlass + entities: + - uid: 198 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.883123,-2.1633506 + parent: 1 + - uid: 200 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.569822,-3.491555 + parent: 1 + - uid: 201 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.960447,-3.491555 + parent: 1 + - uid: 202 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.194822,-4.47593 + parent: 1 + - uid: 203 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.069822,-4.2181177 + parent: 1 + - uid: 272 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -11.883123,-1.4914757 + parent: 1 + - uid: 273 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.664373,-2.4758506 + parent: 1 +- proto: ShardGlassPlasma + entities: + - uid: 187 + components: + - type: Transform + pos: 12.178013,2.6173701 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: 12.787388,2.2892451 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: 11.709263,-4.6248174 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: 13.51395,-4.03888 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: 13.748325,-4.5310674 + parent: 1 +- proto: ShardGlassReinforced + entities: + - uid: 227 + components: + - type: Transform + pos: -16.735092,-1.1675706 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: -16.094467,-0.7769456 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: -17.547592,-1.9175706 + parent: 1 + - uid: 237 + components: + - type: Transform + pos: -17.125717,-2.5425706 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: -18.813217,-2.4800706 + parent: 1 + - uid: 239 + components: + - type: Transform + pos: -18.297592,-1.7613206 + parent: 1 +- proto: SheetGlass + entities: + - uid: 353 + components: + - type: Transform + pos: -7.744358,10.600736 + parent: 1 +- proto: SheetPlasma + entities: + - uid: 267 + components: + - type: Transform + pos: -5.4900637,5.6346035 + parent: 1 +- proto: SheetPlastic + entities: + - uid: 354 + components: + - type: Transform + pos: -7.291233,10.585111 + parent: 1 +- proto: SheetSteel + entities: + - uid: 351 + components: + - type: Transform + pos: -7.6188135,11.741361 + parent: 1 + - uid: 352 + components: + - type: Transform + pos: -7.3375635,11.678861 + parent: 1 +- proto: SignCansScience + entities: + - uid: 296 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 +- proto: SignServer + entities: + - uid: 281 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 +- proto: SMESBasic + entities: + - uid: 375 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 +- proto: SubstationBasic + entities: + - uid: 374 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 +- proto: Table + entities: + - uid: 193 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 256 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -10.5,-0.5 + parent: 1 + - uid: 257 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -9.5,-0.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: -5.5,4.5 + parent: 1 + - uid: 284 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 285 + components: + - type: Transform + pos: 9.5,2.5 + parent: 1 + - uid: 286 + components: + - type: Transform + pos: 9.5,1.5 + parent: 1 + - uid: 287 + components: + - type: Transform + pos: 9.5,0.5 + parent: 1 + - uid: 288 + components: + - type: Transform + pos: 9.5,-0.5 + parent: 1 +- proto: TableFrame + entities: + - uid: 211 + components: + - type: Transform + pos: -17.5,-4.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: -16.5,-4.5 + parent: 1 +- proto: TableGlass + entities: + - uid: 213 + components: + - type: Transform + pos: -15.5,-4.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 338 + components: + - type: Transform + pos: -3.5,12.5 + parent: 1 + - uid: 339 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 + - uid: 340 + components: + - type: Transform + pos: -1.5,12.5 + parent: 1 +- proto: TechnologyDiskRare + entities: + - uid: 566 + components: + - type: Transform + pos: 6.560504,-1.5093694 + parent: 1 +- proto: ToolboxElectricalFilled + entities: + - uid: 341 + components: + - type: Transform + pos: -3.5513628,12.522611 + parent: 1 +- proto: TorsoBorg + entities: + - uid: 335 + components: + - type: Transform + pos: -4.734109,10.725736 + parent: 1 +- proto: TritiumCanister + entities: + - uid: 297 + components: + - type: Transform + pos: 8.5,6.5 + parent: 1 +- proto: VendingMachineRoboDrobe + entities: + - uid: 337 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 +- proto: VendingMachineRobotics + entities: + - uid: 336 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 +- proto: WallReinforced + entities: + - uid: 79 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 14.5,7.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 15.5,7.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 16.5,6.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 16.5,5.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 16.5,7.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: 16.5,4.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 16.5,2.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 12.5,7.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 16.5,1.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: 16.5,0.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: 16.5,3.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: 16.5,-0.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: 16.5,-1.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: 16.5,-2.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: 16.5,-3.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: 16.5,-4.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: 16.5,-5.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: 15.5,-5.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: 14.5,-5.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: 12.5,-5.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: 13.5,-5.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: 15.5,-0.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: 14.5,-0.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: 13.5,-0.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: 15.5,3.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: 14.5,3.5 + parent: 1 + - uid: 169 + components: + - type: Transform + pos: 13.5,3.5 + parent: 1 + - uid: 170 + components: + - type: Transform + pos: 12.5,3.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: 12.5,-0.5 + parent: 1 + - uid: 360 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,12.5 + parent: 1 + - uid: 361 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,11.5 + parent: 1 + - uid: 362 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,9.5 + parent: 1 + - uid: 363 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,9.5 + parent: 1 + - uid: 364 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,12.5 + parent: 1 + - uid: 365 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,12.5 + parent: 1 + - uid: 366 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,12.5 + parent: 1 + - uid: 367 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,12.5 + parent: 1 + - uid: 368 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,9.5 + parent: 1 + - uid: 369 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,9.5 + parent: 1 + - uid: 370 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,9.5 + parent: 1 + - uid: 371 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,11.5 + parent: 1 + - uid: 372 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,10.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 3 + components: + - type: Transform + pos: -18.5,0.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: -18.5,-0.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -18.5,-4.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: -18.5,-5.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -17.5,0.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -13.5,0.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -12.5,0.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -11.5,0.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -10.5,0.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: -9.5,0.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: -9.5,1.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: -9.5,5.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: -9.5,6.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: -17.5,-5.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -13.5,-5.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -12.5,-5.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -8.5,-5.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -7.5,-5.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -6.5,-5.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 0.5,6.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -8.5,6.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 6.5,6.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 11.5,7.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: 11.5,-5.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 10.5,-5.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 9.5,-5.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 8.5,-5.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 7.5,-5.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 6.5,-5.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 6.5,-3.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 6.5,-2.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 6.5,-4.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: -8.5,13.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: -8.5,12.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: -8.5,10.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: -8.5,9.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: -8.5,8.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: -8.5,11.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: -7.5,13.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: -5.5,13.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: -2.5,13.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: -3.5,13.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: -1.5,13.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: -0.5,13.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: 0.5,13.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: 1.5,13.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: 2.5,13.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: -4.5,13.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: -4.5,8.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: -6.5,8.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: -7.5,8.5 + parent: 1 + - uid: 153 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 +- proto: WeaponPistolCHIMPUpgraded + entities: + - uid: 570 + components: + - type: Transform + pos: -4.033656,3.2255795 + parent: 1 +- proto: WindoorPlasma + entities: + - uid: 232 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-1.5 + parent: 1 + - uid: 233 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-2.5 + parent: 1 +- proto: WindowDirectional + entities: + - uid: 196 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,-0.5 + parent: 1 + - uid: 197 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,-1.5 + parent: 1 +- proto: WindowReinforcedDirectional + entities: + - uid: 131 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/mineshaft.yml b/Resources/Maps/Lavaland/mineshaft.yml new file mode 100644 index 0000000000..c12268ba25 --- /dev/null +++ b/Resources/Maps/Lavaland/mineshaft.yml @@ -0,0 +1,7776 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/21/2025 08:14:38 + entityCount: 1474 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorBasalt +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.609375,-0.46875 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -2,0: + ind: -2,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -2,-1: + ind: -2,-1 + tiles: AQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 1,-1: + ind: 1,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 1,0: + ind: 1,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-2: + ind: 0,-2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 1,-2: + ind: 1,-2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-2: + ind: -1,-2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -2,-2: + ind: -2,-2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 62257 + -1,0: + 0: 65535 + 0,1: + 0: 307 + -1,1: + 0: 4095 + 1,0: + 0: 6084 + 1,-1: + 0: 18224 + 2,0: + 0: 1016 + 2,-1: + 0: 36078 + 3,0: + 0: 17 + 3,-1: + 0: 16375 + -5,0: + 0: 53247 + -4,0: + 0: 4096 + -4,1: + 0: 255 + -5,1: + 0: 8 + -3,0: + 0: 17487 + -3,1: + 0: 127 + -3,-1: + 0: 65535 + -2,0: + 0: 63616 + -2,1: + 0: 141 + -2,-1: + 0: 4913 + 0,-4: + 0: 15 + 0,-5: + 0: 61440 + -1,-4: + 0: 64750 + -1,-3: + 0: 36044 + 0,-3: + 0: 64768 + -1,-2: + 0: 52224 + 0,-1: + 0: 247 + -1,-1: + 0: 12 + 1,-4: + 0: 255 + 1,-3: + 0: 64256 + 1,-2: + 0: 239 + 2,-4: + 0: 3827 + 2,-3: + 0: 816 + 2,-2: + 0: 49169 + 2,-5: + 0: 8751 + 3,-4: + 0: 36848 + 3,-2: + 0: 12514 + 3,-3: + 0: 57344 + 4,-4: + 0: 65280 + 4,-3: + 0: 12849 + 4,-2: + 0: 52784 + -4,-4: + 0: 50726 + -4,-3: + 0: 12296 + -4,-2: + 0: 61047 + -5,-3: + 0: 50961 + -5,-2: + 0: 8 + -5,-1: + 0: 63345 + -4,-1: + 0: 2188 + -4,-5: + 0: 17648 + -3,-4: + 0: 127 + -3,-3: + 0: 207 + -3,-2: + 0: 28928 + -3,-5: + 0: 28912 + -2,-4: + 0: 61719 + -2,-3: + 0: 191 + -2,-5: + 0: 19487 + -1,-5: + 0: 58991 + -6,0: + 0: 2287 + -6,-1: + 0: 65534 + -7,-3: + 0: 127 + -7,-5: + 0: 62976 + -7,-4: + 0: 25130 + -6,-4: + 0: 49159 + -6,-3: + 0: 52975 + -6,-5: + 0: 49152 + -5,-4: + 0: 4402 + -5,-5: + 0: 64128 + 4,-1: + 0: 12 + 5,-4: + 0: 65504 + 5,-2: + 0: 4352 + 5,-3: + 0: 61166 + 6,-4: + 0: 13104 + 6,-3: + 0: 13107 + 0,-6: + 0: 17 + -1,-6: + 0: 52428 + 1,-6: + 0: 34816 + 2,-6: + 0: 61696 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: BananiumOre + entities: + - uid: 768 + components: + - type: Transform + pos: 22.574232,-8.517088 + parent: 1 +- proto: Bonfire + entities: + - uid: 211 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 +- proto: Bucket + entities: + - uid: 1058 + components: + - type: Transform + pos: 6.5065928,1.2520813 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 668 + components: + - type: Transform + pos: 25.5,-10.5 + parent: 1 + - uid: 729 + components: + - type: Transform + pos: 25.5,-11.5 + parent: 1 +- proto: ChairFolding + entities: + - uid: 118 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.7275896,3.466334 + parent: 1 + - uid: 142 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.3135271,3.4428966 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: -1.6963396,4.755397 + parent: 1 +- proto: ChairFoldingSpawnFolded + entities: + - uid: 117 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.9697771,6.489772 + parent: 1 + - uid: 143 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.4385271,6.161647 + parent: 1 + - uid: 144 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.6025896,6.5132093 + parent: 1 +- proto: Claymore + entities: + - uid: 207 + components: + - type: Transform + parent: 201 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: ClothingOuterArmorPodWars + entities: + - uid: 203 + components: + - type: Transform + parent: 201 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: ClothingOuterHardsuitSalvage + entities: + - uid: 719 + components: + - type: Transform + pos: -3.5290456,6.62422 + parent: 1 +- proto: CrateGenericSteel + entities: + - uid: 201 + components: + - type: Transform + pos: -19.5,-0.5 + parent: 1 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 208 + - 207 + - 206 + - 205 + - 204 + - 203 + - 202 + paper_label: !type:ContainerSlot + showEnts: False + occludes: True + ent: null +- proto: FloorLavaEntity + entities: + - uid: 24 + components: + - type: Transform + pos: 8.5,-6.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 7.5,-6.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 5.5,-6.5 + parent: 1 + - uid: 615 + components: + - type: Transform + pos: 6.5,-6.5 + parent: 1 + - uid: 630 + components: + - type: Transform + pos: 7.5,-6.5 + parent: 1 + - uid: 658 + components: + - type: Transform + pos: 8.5,-7.5 + parent: 1 + - uid: 784 + components: + - type: Transform + pos: 7.5,-7.5 + parent: 1 + - uid: 834 + components: + - type: Transform + pos: 7.5,-20.5 + parent: 1 + - uid: 835 + components: + - type: Transform + pos: 8.5,-20.5 + parent: 1 + - uid: 836 + components: + - type: Transform + pos: 7.5,-21.5 + parent: 1 + - uid: 837 + components: + - type: Transform + pos: 8.5,-19.5 + parent: 1 + - uid: 847 + components: + - type: Transform + pos: 6.5,-7.5 + parent: 1 + - uid: 848 + components: + - type: Transform + pos: 7.5,-7.5 + parent: 1 + - uid: 936 + components: + - type: Transform + pos: 1.5,-2.5 + parent: 1 + - uid: 938 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 941 + components: + - type: Transform + pos: 1.5,-3.5 + parent: 1 + - uid: 942 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 943 + components: + - type: Transform + pos: 3.5,-2.5 + parent: 1 + - uid: 971 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - uid: 973 + components: + - type: Transform + pos: 4.5,-2.5 + parent: 1 + - uid: 1003 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 + - uid: 1004 + components: + - type: Transform + pos: -0.5,-4.5 + parent: 1 + - uid: 1006 + components: + - type: Transform + pos: 4.5,-1.5 + parent: 1 + - uid: 1007 + components: + - type: Transform + pos: 5.5,-1.5 + parent: 1 + - uid: 1008 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - uid: 1011 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 1013 + components: + - type: Transform + pos: 5.5,-2.5 + parent: 1 + - uid: 1015 + components: + - type: Transform + pos: 6.5,-1.5 + parent: 1 + - uid: 1016 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 + - uid: 1029 + components: + - type: Transform + pos: 10.5,-20.5 + parent: 1 + - uid: 1030 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 + - uid: 1031 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 + - uid: 1037 + components: + - type: Transform + pos: 10.5,-19.5 + parent: 1 + - uid: 1038 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 1 + - uid: 1039 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 1070 + components: + - type: Transform + pos: 11.5,-19.5 + parent: 1 + - uid: 1071 + components: + - type: Transform + pos: 11.5,-20.5 + parent: 1 + - uid: 1313 + components: + - type: Transform + pos: -20.5,-8.5 + parent: 1 + - uid: 1331 + components: + - type: Transform + pos: -21.5,-8.5 + parent: 1 + - uid: 1332 + components: + - type: Transform + pos: 9.5,-20.5 + parent: 1 + - uid: 1333 + components: + - type: Transform + pos: -27.5,-10.5 + parent: 1 + - uid: 1335 + components: + - type: Transform + pos: -26.5,-11.5 + parent: 1 + - uid: 1336 + components: + - type: Transform + pos: -27.5,-11.5 + parent: 1 + - uid: 1338 + components: + - type: Transform + pos: -21.5,-9.5 + parent: 1 + - uid: 1363 + components: + - type: Transform + pos: -26.5,-10.5 + parent: 1 +- proto: FoodBreadPlain + entities: + - uid: 205 + components: + - type: Transform + parent: 201 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: FoodGoldenApple + entities: + - uid: 202 + components: + - type: Transform + parent: 201 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: GoldOre + entities: + - uid: 752 + components: + - type: Transform + pos: 25.480482,-8.517088 + parent: 1 +- proto: IngotGold1 + entities: + - uid: 208 + components: + - type: Transform + parent: 201 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: Lantern + entities: + - uid: 571 + components: + - type: Transform + pos: 21.86286,-10.428041 + parent: 1 +- proto: MaterialDiamond1 + entities: + - uid: 204 + components: + - type: Transform + parent: 201 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: MiningDrillDiamond + entities: + - uid: 343 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.575366,0.62506294 + parent: 1 +- proto: OreBagOfHolding + entities: + - uid: 733 + components: + - type: Transform + pos: 21.496107,-8.563963 + parent: 1 +- proto: OreBox + entities: + - uid: 602 + components: + - type: Transform + pos: -9.5,-10.5 + parent: 1 + - uid: 603 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 620 + components: + - type: Transform + pos: -0.5,-19.5 + parent: 1 + - uid: 621 + components: + - type: Transform + pos: 24.5,-14.5 + parent: 1 + - uid: 648 + components: + - type: Transform + pos: 25.5,-14.5 + parent: 1 + - uid: 649 + components: + - type: Transform + pos: 0.5,6.5 + parent: 1 +- proto: OreProcessorIndustrial + entities: + - uid: 145 + components: + - type: Transform + pos: 25.5,-11.5 + parent: 1 +- proto: Pickaxe + entities: + - uid: 278 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.689954,-2.7317731 + parent: 1 + - uid: 766 + components: + - type: Transform + pos: 23.795095,-12.199974 + parent: 1 +- proto: PortableGeneratorJrPacman + entities: + - uid: 682 + components: + - type: Transform + pos: 25.5,-10.5 + parent: 1 +- proto: Rack + entities: + - uid: 570 + components: + - type: Transform + pos: 22.5,-8.5 + parent: 1 + - uid: 723 + components: + - type: Transform + pos: 25.5,-8.5 + parent: 1 + - uid: 724 + components: + - type: Transform + pos: 21.5,-8.5 + parent: 1 + - uid: 734 + components: + - type: Transform + pos: 24.5,-8.5 + parent: 1 + - uid: 764 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 +- proto: RandomCargoCorpseSpawner + entities: + - uid: 165 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -8.5,-3.5 + parent: 1 + - uid: 384 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-2.5 + parent: 1 + - uid: 1334 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 22.5,-11.5 + parent: 1 + - uid: 1404 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,2.5 + parent: 1 + - uid: 1405 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,-1.5 + parent: 1 +- proto: RandomWoodenSupport + entities: + - uid: 115 + components: + - type: Transform + pos: 4.5,-14.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 23.5,-9.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 18.5,-13.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: -11.5,-15.5 + parent: 1 + - uid: 129 + components: + - type: Transform + pos: -11.5,-3.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: 12.5,-2.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: -15.5,3.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: 13.5,-7.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: 23.5,-13.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: 0.5,-23.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: 1.5,-8.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: -15.5,-18.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: -7.5,-13.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: -2.5,-12.5 + parent: 1 + - uid: 200 + components: + - type: Transform + pos: -17.5,3.5 + parent: 1 + - uid: 209 + components: + - type: Transform + pos: -4.5,-19.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: 9.5,-16.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: -9.5,2.5 + parent: 1 + - uid: 241 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: -23.5,-11.5 + parent: 1 + - uid: 256 + components: + - type: Transform + pos: -18.5,-9.5 + parent: 1 + - uid: 388 + components: + - type: Transform + pos: -1.5,-23.5 + parent: 1 +- proto: SalvageLootSpawner + entities: + - uid: 586 + components: + - type: Transform + pos: 8.5,-21.5 + parent: 1 +- proto: SpawnMobOreCrab + entities: + - uid: 421 + components: + - type: Transform + pos: 12.5,0.5 + parent: 1 + - uid: 522 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 674 + components: + - type: Transform + pos: -13.5,4.5 + parent: 1 + - uid: 977 + components: + - type: Transform + pos: 11.5,-3.5 + parent: 1 + - uid: 986 + components: + - type: Transform + pos: -21.5,-11.5 + parent: 1 + - uid: 987 + components: + - type: Transform + pos: 6.5,-14.5 + parent: 1 + - uid: 1017 + components: + - type: Transform + pos: 19.5,-4.5 + parent: 1 + - uid: 1018 + components: + - type: Transform + pos: 24.5,-10.5 + parent: 1 + - uid: 1046 + components: + - type: Transform + pos: -10.5,-15.5 + parent: 1 + - uid: 1047 + components: + - type: Transform + pos: 22.5,-13.5 + parent: 1 + - uid: 1078 + components: + - type: Transform + pos: -4.5,4.5 + parent: 1 + - uid: 1084 + components: + - type: Transform + pos: -10.5,-1.5 + parent: 1 + - uid: 1085 + components: + - type: Transform + pos: -16.5,-8.5 + parent: 1 +- proto: SpawnMobSpiderSalvage + entities: + - uid: 174 + components: + - type: Transform + pos: -18.5,-1.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: -21.5,-0.5 + parent: 1 +- proto: SpiderWeb + entities: + - uid: 85 + components: + - type: Transform + pos: -20.5,-1.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: -21.5,-0.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: -21.5,-1.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: -22.5,-1.5 + parent: 1 + - uid: 170 + components: + - type: Transform + pos: -17.5,1.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: -18.5,0.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: -16.5,2.5 + parent: 1 + - uid: 179 + components: + - type: Transform + pos: -17.5,2.5 + parent: 1 + - uid: 182 + components: + - type: Transform + pos: -18.5,0.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: -18.5,-0.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: -21.5,-2.5 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: -20.5,2.5 + parent: 1 + - uid: 229 + components: + - type: Transform + pos: -19.5,-3.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: -21.5,1.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: -17.5,-2.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: -17.5,-1.5 + parent: 1 + - uid: 277 + components: + - type: Transform + pos: -23.5,-2.5 + parent: 1 + - uid: 293 + components: + - type: Transform + pos: -18.5,1.5 + parent: 1 + - uid: 316 + components: + - type: Transform + pos: -22.5,1.5 + parent: 1 + - uid: 317 + components: + - type: Transform + pos: -22.5,-3.5 + parent: 1 + - uid: 342 + components: + - type: Transform + pos: -19.5,0.5 + parent: 1 + - uid: 357 + components: + - type: Transform + pos: -17.5,0.5 + parent: 1 + - uid: 383 + components: + - type: Transform + pos: -17.5,-0.5 + parent: 1 + - uid: 1271 + components: + - type: Transform + pos: -22.5,0.5 + parent: 1 +- proto: SteelOre + entities: + - uid: 767 + components: + - type: Transform + pos: 24.519545,-8.49365 + parent: 1 +- proto: Table + entities: + - uid: 294 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,0.5 + parent: 1 +- proto: WallRockBasalt + entities: + - uid: 2 + components: + - type: Transform + pos: -27.5,-9.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -27.5,-15.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -28.5,-18.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: -27.5,4.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -27.5,3.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -27.5,2.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -27.5,1.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -27.5,0.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -27.5,-0.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -27.5,-1.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: -27.5,-5.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: -27.5,-6.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: -27.5,-7.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: -27.5,-8.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: -26.5,1.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: -26.5,0.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: -26.5,-0.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -26.5,-5.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -26.5,-6.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -26.5,4.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -26.5,3.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -26.5,2.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -27.5,-18.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -26.5,-18.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: -24.5,4.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: -24.5,-1.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: -22.5,-12.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: -25.5,-13.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: -25.5,-15.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 2.5,-14.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: -25.5,-18.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: -25.5,-14.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: -25.5,4.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: -25.5,-2.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: -25.5,-3.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: -25.5,-4.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -25.5,-6.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: -25.5,-5.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: -23.5,-7.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: -22.5,-8.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: -23.5,-12.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: -23.5,-14.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: -23.5,4.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: -23.5,-4.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: -23.5,-5.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: -23.5,-8.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: -24.5,-17.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: -24.5,-18.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: -24.5,-0.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: -24.5,-7.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: -24.5,-8.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: -24.5,-6.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: -19.5,-8.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: -24.5,-14.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: -27.5,-17.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 3.5,-14.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: -24.5,-2.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: -21.5,3.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: -21.5,2.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: -22.5,-16.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: -22.5,-17.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: -22.5,4.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: -22.5,3.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: -22.5,-4.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: -22.5,-5.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: -22.5,-7.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: -20.5,3.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: -20.5,-4.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: -20.5,-6.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: -20.5,-15.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: -21.5,-4.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: -21.5,-5.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: -21.5,-17.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: -21.5,-18.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: -18.5,-3.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: -18.5,4.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: -18.5,3.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: -19.5,-15.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: -19.5,-18.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: -19.5,-4.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: -19.5,-7.5 + parent: 1 + - uid: 194 + components: + - type: Transform + pos: -17.5,-13.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: -17.5,-14.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: -17.5,-15.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: -17.5,-17.5 + parent: 1 + - uid: 199 + components: + - type: Transform + pos: -17.5,4.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: -17.5,-4.5 + parent: 1 + - uid: 216 + components: + - type: Transform + pos: -17.5,-6.5 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: -17.5,-7.5 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: -17.5,-10.5 + parent: 1 + - uid: 221 + components: + - type: Transform + pos: -18.5,-7.5 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: -18.5,-8.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: -18.5,-10.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: -18.5,-11.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: -18.5,-12.5 + parent: 1 + - uid: 226 + components: + - type: Transform + pos: -18.5,-13.5 + parent: 1 + - uid: 228 + components: + - type: Transform + pos: -18.5,-4.5 + parent: 1 + - uid: 231 + components: + - type: Transform + pos: -15.5,2.5 + parent: 1 + - uid: 232 + components: + - type: Transform + pos: -15.5,1.5 + parent: 1 + - uid: 233 + components: + - type: Transform + pos: -15.5,0.5 + parent: 1 + - uid: 234 + components: + - type: Transform + pos: -15.5,-0.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: -16.5,-14.5 + parent: 1 + - uid: 239 + components: + - type: Transform + pos: -16.5,-15.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: -16.5,-4.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: -16.5,-5.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: -16.5,-6.5 + parent: 1 + - uid: 257 + components: + - type: Transform + pos: -15.5,-4.5 + parent: 1 + - uid: 258 + components: + - type: Transform + pos: -14.5,-12.5 + parent: 1 + - uid: 259 + components: + - type: Transform + pos: -14.5,-16.5 + parent: 1 + - uid: 260 + components: + - type: Transform + pos: -14.5,-17.5 + parent: 1 + - uid: 264 + components: + - type: Transform + pos: -14.5,0.5 + parent: 1 + - uid: 265 + components: + - type: Transform + pos: -14.5,-0.5 + parent: 1 + - uid: 272 + components: + - type: Transform + pos: -14.5,10.5 + parent: 1 + - uid: 273 + components: + - type: Transform + pos: -14.5,9.5 + parent: 1 + - uid: 274 + components: + - type: Transform + pos: -14.5,8.5 + parent: 1 + - uid: 275 + components: + - type: Transform + pos: -14.5,7.5 + parent: 1 + - uid: 282 + components: + - type: Transform + pos: -15.5,-12.5 + parent: 1 + - uid: 285 + components: + - type: Transform + pos: -15.5,-15.5 + parent: 1 + - uid: 286 + components: + - type: Transform + pos: -15.5,-16.5 + parent: 1 + - uid: 287 + components: + - type: Transform + pos: -15.5,-17.5 + parent: 1 + - uid: 288 + components: + - type: Transform + pos: -15.5,-5.5 + parent: 1 + - uid: 295 + components: + - type: Transform + pos: -12.5,3.5 + parent: 1 + - uid: 296 + components: + - type: Transform + pos: -12.5,2.5 + parent: 1 + - uid: 297 + components: + - type: Transform + pos: -12.5,1.5 + parent: 1 + - uid: 298 + components: + - type: Transform + pos: -12.5,0.5 + parent: 1 + - uid: 300 + components: + - type: Transform + pos: -12.5,10.5 + parent: 1 + - uid: 301 + components: + - type: Transform + pos: -13.5,-0.5 + parent: 1 + - uid: 302 + components: + - type: Transform + pos: -13.5,-1.5 + parent: 1 + - uid: 304 + components: + - type: Transform + pos: -12.5,-0.5 + parent: 1 + - uid: 305 + components: + - type: Transform + pos: -13.5,-8.5 + parent: 1 + - uid: 307 + components: + - type: Transform + pos: -13.5,-10.5 + parent: 1 + - uid: 308 + components: + - type: Transform + pos: -13.5,-11.5 + parent: 1 + - uid: 309 + components: + - type: Transform + pos: -12.5,-13.5 + parent: 1 + - uid: 310 + components: + - type: Transform + pos: -13.5,-14.5 + parent: 1 + - uid: 311 + components: + - type: Transform + pos: -13.5,10.5 + parent: 1 + - uid: 318 + components: + - type: Transform + pos: -13.5,3.5 + parent: 1 + - uid: 320 + components: + - type: Transform + pos: -13.5,1.5 + parent: 1 + - uid: 322 + components: + - type: Transform + pos: -11.5,-17.5 + parent: 1 + - uid: 323 + components: + - type: Transform + pos: -10.5,13.5 + parent: 1 + - uid: 325 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 331 + components: + - type: Transform + pos: -11.5,-10.5 + parent: 1 + - uid: 332 + components: + - type: Transform + pos: -11.5,-12.5 + parent: 1 + - uid: 333 + components: + - type: Transform + pos: -11.5,-13.5 + parent: 1 + - uid: 334 + components: + - type: Transform + pos: -11.5,13.5 + parent: 1 + - uid: 335 + components: + - type: Transform + pos: -11.5,12.5 + parent: 1 + - uid: 336 + components: + - type: Transform + pos: -11.5,11.5 + parent: 1 + - uid: 337 + components: + - type: Transform + pos: -11.5,10.5 + parent: 1 + - uid: 348 + components: + - type: Transform + pos: -12.5,-10.5 + parent: 1 + - uid: 349 + components: + - type: Transform + pos: -12.5,-14.5 + parent: 1 + - uid: 350 + components: + - type: Transform + pos: -12.5,-15.5 + parent: 1 + - uid: 351 + components: + - type: Transform + pos: -12.5,-16.5 + parent: 1 + - uid: 352 + components: + - type: Transform + pos: -12.5,-17.5 + parent: 1 + - uid: 355 + components: + - type: Transform + pos: -9.5,7.5 + parent: 1 + - uid: 356 + components: + - type: Transform + pos: -9.5,6.5 + parent: 1 + - uid: 359 + components: + - type: Transform + pos: -9.5,-6.5 + parent: 1 + - uid: 364 + components: + - type: Transform + pos: -9.5,10.5 + parent: 1 + - uid: 365 + components: + - type: Transform + pos: -9.5,9.5 + parent: 1 + - uid: 367 + components: + - type: Transform + pos: -10.5,-5.5 + parent: 1 + - uid: 368 + components: + - type: Transform + pos: -10.5,-6.5 + parent: 1 + - uid: 371 + components: + - type: Transform + pos: -10.5,-9.5 + parent: 1 + - uid: 372 + components: + - type: Transform + pos: -10.5,-10.5 + parent: 1 + - uid: 373 + components: + - type: Transform + pos: -10.5,-12.5 + parent: 1 + - uid: 374 + components: + - type: Transform + pos: -10.5,-13.5 + parent: 1 + - uid: 375 + components: + - type: Transform + pos: -10.5,-17.5 + parent: 1 + - uid: 376 + components: + - type: Transform + pos: -10.5,12.5 + parent: 1 + - uid: 377 + components: + - type: Transform + pos: -10.5,11.5 + parent: 1 + - uid: 378 + components: + - type: Transform + pos: -10.5,10.5 + parent: 1 + - uid: 379 + components: + - type: Transform + pos: -10.5,9.5 + parent: 1 + - uid: 380 + components: + - type: Transform + pos: -10.5,8.5 + parent: 1 + - uid: 381 + components: + - type: Transform + pos: -10.5,7.5 + parent: 1 + - uid: 382 + components: + - type: Transform + pos: -10.5,6.5 + parent: 1 + - uid: 389 + components: + - type: Transform + pos: -8.5,-16.5 + parent: 1 + - uid: 390 + components: + - type: Transform + pos: -8.5,-17.5 + parent: 1 + - uid: 398 + components: + - type: Transform + pos: -8.5,-8.5 + parent: 1 + - uid: 400 + components: + - type: Transform + pos: -8.5,-12.5 + parent: 1 + - uid: 401 + components: + - type: Transform + pos: -8.5,-13.5 + parent: 1 + - uid: 402 + components: + - type: Transform + pos: -8.5,-14.5 + parent: 1 + - uid: 406 + components: + - type: Transform + pos: -8.5,10.5 + parent: 1 + - uid: 407 + components: + - type: Transform + pos: -8.5,9.5 + parent: 1 + - uid: 409 + components: + - type: Transform + pos: -8.5,7.5 + parent: 1 + - uid: 410 + components: + - type: Transform + pos: -8.5,6.5 + parent: 1 + - uid: 411 + components: + - type: Transform + pos: -8.5,5.5 + parent: 1 + - uid: 412 + components: + - type: Transform + pos: -8.5,3.5 + parent: 1 + - uid: 413 + components: + - type: Transform + pos: -8.5,2.5 + parent: 1 + - uid: 414 + components: + - type: Transform + pos: -8.5,1.5 + parent: 1 + - uid: 415 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 417 + components: + - type: Transform + pos: -9.5,-12.5 + parent: 1 + - uid: 418 + components: + - type: Transform + pos: -9.5,-13.5 + parent: 1 + - uid: 419 + components: + - type: Transform + pos: -9.5,-17.5 + parent: 1 + - uid: 422 + components: + - type: Transform + pos: -7.5,10.5 + parent: 1 + - uid: 427 + components: + - type: Transform + pos: -7.5,5.5 + parent: 1 + - uid: 428 + components: + - type: Transform + pos: -7.5,2.5 + parent: 1 + - uid: 431 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 432 + components: + - type: Transform + pos: -6.5,-3.5 + parent: 1 + - uid: 433 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 434 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 435 + components: + - type: Transform + pos: -6.5,2.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: -6.5,-4.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: -6.5,-5.5 + parent: 1 + - uid: 441 + components: + - type: Transform + pos: -6.5,-6.5 + parent: 1 + - uid: 442 + components: + - type: Transform + pos: -6.5,-7.5 + parent: 1 + - uid: 443 + components: + - type: Transform + pos: -6.5,-8.5 + parent: 1 + - uid: 444 + components: + - type: Transform + pos: -6.5,-9.5 + parent: 1 + - uid: 448 + components: + - type: Transform + pos: -6.5,10.5 + parent: 1 + - uid: 458 + components: + - type: Transform + pos: -7.5,-9.5 + parent: 1 + - uid: 460 + components: + - type: Transform + pos: -7.5,-16.5 + parent: 1 + - uid: 461 + components: + - type: Transform + pos: -7.5,-17.5 + parent: 1 + - uid: 463 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 464 + components: + - type: Transform + pos: -5.5,-4.5 + parent: 1 + - uid: 469 + components: + - type: Transform + pos: -5.5,-9.5 + parent: 1 + - uid: 470 + components: + - type: Transform + pos: -5.5,-10.5 + parent: 1 + - uid: 471 + components: + - type: Transform + pos: -2.5,-11.5 + parent: 1 + - uid: 472 + components: + - type: Transform + pos: -5.5,-13.5 + parent: 1 + - uid: 473 + components: + - type: Transform + pos: -5.5,-14.5 + parent: 1 + - uid: 477 + components: + - type: Transform + pos: -5.5,10.5 + parent: 1 + - uid: 479 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - uid: 480 + components: + - type: Transform + pos: -5.5,7.5 + parent: 1 + - uid: 481 + components: + - type: Transform + pos: -5.5,6.5 + parent: 1 + - uid: 482 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 483 + components: + - type: Transform + pos: -5.5,2.5 + parent: 1 + - uid: 488 + components: + - type: Transform + pos: -3.5,-11.5 + parent: 1 + - uid: 489 + components: + - type: Transform + pos: -6.5,-13.5 + parent: 1 + - uid: 490 + components: + - type: Transform + pos: -6.5,-14.5 + parent: 1 + - uid: 491 + components: + - type: Transform + pos: -6.5,-16.5 + parent: 1 + - uid: 492 + components: + - type: Transform + pos: -6.5,-17.5 + parent: 1 + - uid: 493 + components: + - type: Transform + pos: -6.5,-18.5 + parent: 1 + - uid: 494 + components: + - type: Transform + pos: -5.5,-18.5 + parent: 1 + - uid: 498 + components: + - type: Transform + pos: -4.5,10.5 + parent: 1 + - uid: 499 + components: + - type: Transform + pos: -4.5,9.5 + parent: 1 + - uid: 500 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 505 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 + - uid: 506 + components: + - type: Transform + pos: -3.5,-6.5 + parent: 1 + - uid: 507 + components: + - type: Transform + pos: -3.5,-7.5 + parent: 1 + - uid: 509 + components: + - type: Transform + pos: -3.5,-9.5 + parent: 1 + - uid: 510 + components: + - type: Transform + pos: -3.5,-10.5 + parent: 1 + - uid: 511 + components: + - type: Transform + pos: -3.5,13.5 + parent: 1 + - uid: 512 + components: + - type: Transform + pos: -3.5,12.5 + parent: 1 + - uid: 513 + components: + - type: Transform + pos: -3.5,11.5 + parent: 1 + - uid: 514 + components: + - type: Transform + pos: -3.5,10.5 + parent: 1 + - uid: 515 + components: + - type: Transform + pos: -3.5,9.5 + parent: 1 + - uid: 517 + components: + - type: Transform + pos: -3.5,7.5 + parent: 1 + - uid: 519 + components: + - type: Transform + pos: -4.5,-7.5 + parent: 1 + - uid: 520 + components: + - type: Transform + pos: -4.5,-8.5 + parent: 1 + - uid: 521 + components: + - type: Transform + pos: -4.5,-9.5 + parent: 1 + - uid: 523 + components: + - type: Transform + pos: -4.5,-13.5 + parent: 1 + - uid: 524 + components: + - type: Transform + pos: -4.5,-14.5 + parent: 1 + - uid: 525 + components: + - type: Transform + pos: -4.5,-15.5 + parent: 1 + - uid: 526 + components: + - type: Transform + pos: -4.5,-16.5 + parent: 1 + - uid: 527 + components: + - type: Transform + pos: -4.5,-18.5 + parent: 1 + - uid: 528 + components: + - type: Transform + pos: -4.5,8.5 + parent: 1 + - uid: 529 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 + - uid: 530 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 533 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 534 + components: + - type: Transform + pos: -4.5,-4.5 + parent: 1 + - uid: 536 + components: + - type: Transform + pos: -1.5,13.5 + parent: 1 + - uid: 537 + components: + - type: Transform + pos: -1.5,12.5 + parent: 1 + - uid: 538 + components: + - type: Transform + pos: -1.5,11.5 + parent: 1 + - uid: 548 + components: + - type: Transform + pos: -2.5,-9.5 + parent: 1 + - uid: 549 + components: + - type: Transform + pos: -2.5,-10.5 + parent: 1 + - uid: 550 + components: + - type: Transform + pos: -2.5,-13.5 + parent: 1 + - uid: 551 + components: + - type: Transform + pos: -2.5,11.5 + parent: 1 + - uid: 552 + components: + - type: Transform + pos: -2.5,10.5 + parent: 1 + - uid: 553 + components: + - type: Transform + pos: -2.5,9.5 + parent: 1 + - uid: 556 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 560 + components: + - type: Transform + pos: -3.5,-14.5 + parent: 1 + - uid: 561 + components: + - type: Transform + pos: -3.5,-15.5 + parent: 1 + - uid: 562 + components: + - type: Transform + pos: -3.5,-16.5 + parent: 1 + - uid: 563 + components: + - type: Transform + pos: -3.5,-17.5 + parent: 1 + - uid: 564 + components: + - type: Transform + pos: -3.5,-18.5 + parent: 1 + - uid: 565 + components: + - type: Transform + pos: -2.5,13.5 + parent: 1 + - uid: 566 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 + - uid: 567 + components: + - type: Transform + pos: -3.5,-13.5 + parent: 1 + - uid: 568 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 572 + components: + - type: Transform + pos: 6.5,-9.5 + parent: 1 + - uid: 574 + components: + - type: Transform + pos: -0.5,-6.5 + parent: 1 + - uid: 575 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 576 + components: + - type: Transform + pos: -0.5,12.5 + parent: 1 + - uid: 577 + components: + - type: Transform + pos: -0.5,11.5 + parent: 1 + - uid: 578 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 + - uid: 579 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 580 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 581 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 583 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 584 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 585 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 587 + components: + - type: Transform + pos: 8.5,-8.5 + parent: 1 + - uid: 588 + components: + - type: Transform + pos: 1.5,-9.5 + parent: 1 + - uid: 589 + components: + - type: Transform + pos: -1.5,-6.5 + parent: 1 + - uid: 591 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 592 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 593 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 594 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 595 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 597 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 598 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 600 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 606 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 607 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 608 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 609 + components: + - type: Transform + pos: 0.5,-6.5 + parent: 1 + - uid: 610 + components: + - type: Transform + pos: 0.5,-7.5 + parent: 1 + - uid: 611 + components: + - type: Transform + pos: 0.5,-10.5 + parent: 1 + - uid: 618 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 624 + components: + - type: Transform + pos: 1.5,-6.5 + parent: 1 + - uid: 625 + components: + - type: Transform + pos: 1.5,-7.5 + parent: 1 + - uid: 626 + components: + - type: Transform + pos: 1.5,-10.5 + parent: 1 + - uid: 627 + components: + - type: Transform + pos: 1.5,-11.5 + parent: 1 + - uid: 631 + components: + - type: Transform + pos: 1.5,-17.5 + parent: 1 + - uid: 632 + components: + - type: Transform + pos: 1.5,-18.5 + parent: 1 + - uid: 633 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 634 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 635 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 636 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 637 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 638 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 641 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 646 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 659 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 660 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 661 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 662 + components: + - type: Transform + pos: 4.5,9.5 + parent: 1 + - uid: 663 + components: + - type: Transform + pos: 4.5,8.5 + parent: 1 + - uid: 664 + components: + - type: Transform + pos: 4.5,7.5 + parent: 1 + - uid: 665 + components: + - type: Transform + pos: 4.5,6.5 + parent: 1 + - uid: 673 + components: + - type: Transform + pos: 3.5,-13.5 + parent: 1 + - uid: 677 + components: + - type: Transform + pos: 3.5,8.5 + parent: 1 + - uid: 678 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 679 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 680 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 681 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 686 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 687 + components: + - type: Transform + pos: 3.5,-1.5 + parent: 1 + - uid: 691 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 693 + components: + - type: Transform + pos: 2.5,-17.5 + parent: 1 + - uid: 695 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 696 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 697 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 698 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 701 + components: + - type: Transform + pos: 5.5,-5.5 + parent: 1 + - uid: 702 + components: + - type: Transform + pos: 5.5,-10.5 + parent: 1 + - uid: 703 + components: + - type: Transform + pos: 5.5,-11.5 + parent: 1 + - uid: 704 + components: + - type: Transform + pos: 5.5,-12.5 + parent: 1 + - uid: 705 + components: + - type: Transform + pos: 5.5,-13.5 + parent: 1 + - uid: 706 + components: + - type: Transform + pos: 5.5,-16.5 + parent: 1 + - uid: 707 + components: + - type: Transform + pos: 5.5,-17.5 + parent: 1 + - uid: 708 + components: + - type: Transform + pos: 5.5,-18.5 + parent: 1 + - uid: 709 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 710 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 711 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 712 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 713 + components: + - type: Transform + pos: 5.5,8.5 + parent: 1 + - uid: 714 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 715 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 + - uid: 725 + components: + - type: Transform + pos: 4.5,-13.5 + parent: 1 + - uid: 726 + components: + - type: Transform + pos: 4.5,-16.5 + parent: 1 + - uid: 727 + components: + - type: Transform + pos: 4.5,-17.5 + parent: 1 + - uid: 737 + components: + - type: Transform + pos: 4.5,-5.5 + parent: 1 + - uid: 738 + components: + - type: Transform + pos: 4.5,-10.5 + parent: 1 + - uid: 739 + components: + - type: Transform + pos: 4.5,-11.5 + parent: 1 + - uid: 741 + components: + - type: Transform + pos: 7.5,12.5 + parent: 1 + - uid: 742 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 + - uid: 743 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 + - uid: 744 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 747 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 769 + components: + - type: Transform + pos: 6.5,-2.5 + parent: 1 + - uid: 770 + components: + - type: Transform + pos: 6.5,-3.5 + parent: 1 + - uid: 772 + components: + - type: Transform + pos: 6.5,-5.5 + parent: 1 + - uid: 773 + components: + - type: Transform + pos: 6.5,12.5 + parent: 1 + - uid: 774 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 + - uid: 775 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 + - uid: 776 + components: + - type: Transform + pos: 6.5,9.5 + parent: 1 + - uid: 778 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 782 + components: + - type: Transform + pos: 8.5,11.5 + parent: 1 + - uid: 783 + components: + - type: Transform + pos: 8.5,-5.5 + parent: 1 + - uid: 785 + components: + - type: Transform + pos: 8.5,-11.5 + parent: 1 + - uid: 786 + components: + - type: Transform + pos: 8.5,-12.5 + parent: 1 + - uid: 787 + components: + - type: Transform + pos: 8.5,-13.5 + parent: 1 + - uid: 788 + components: + - type: Transform + pos: 8.5,-16.5 + parent: 1 + - uid: 789 + components: + - type: Transform + pos: 8.5,-17.5 + parent: 1 + - uid: 792 + components: + - type: Transform + pos: 7.5,-0.5 + parent: 1 + - uid: 793 + components: + - type: Transform + pos: 7.5,-1.5 + parent: 1 + - uid: 795 + components: + - type: Transform + pos: 7.5,-3.5 + parent: 1 + - uid: 797 + components: + - type: Transform + pos: 7.5,-5.5 + parent: 1 + - uid: 798 + components: + - type: Transform + pos: 7.5,-10.5 + parent: 1 + - uid: 799 + components: + - type: Transform + pos: 7.5,-11.5 + parent: 1 + - uid: 802 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 + - uid: 803 + components: + - type: Transform + pos: 8.5,9.5 + parent: 1 + - uid: 804 + components: + - type: Transform + pos: 8.5,8.5 + parent: 1 + - uid: 805 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 806 + components: + - type: Transform + pos: 8.5,6.5 + parent: 1 + - uid: 811 + components: + - type: Transform + pos: 15.5,-0.5 + parent: 1 + - uid: 817 + components: + - type: Transform + pos: 8.5,-4.5 + parent: 1 + - uid: 818 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 + - uid: 819 + components: + - type: Transform + pos: 10.5,10.5 + parent: 1 + - uid: 820 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 + - uid: 821 + components: + - type: Transform + pos: 10.5,8.5 + parent: 1 + - uid: 822 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 + - uid: 823 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 824 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 + - uid: 825 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 + - uid: 826 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 827 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - uid: 830 + components: + - type: Transform + pos: 9.5,-11.5 + parent: 1 + - uid: 831 + components: + - type: Transform + pos: 9.5,-12.5 + parent: 1 + - uid: 832 + components: + - type: Transform + pos: 10.5,-12.5 + parent: 1 + - uid: 839 + components: + - type: Transform + pos: 9.5,3.5 + parent: 1 + - uid: 840 + components: + - type: Transform + pos: 15.5,-3.5 + parent: 1 + - uid: 843 + components: + - type: Transform + pos: 9.5,-5.5 + parent: 1 + - uid: 844 + components: + - type: Transform + pos: 9.5,-6.5 + parent: 1 + - uid: 845 + components: + - type: Transform + pos: 9.5,-7.5 + parent: 1 + - uid: 846 + components: + - type: Transform + pos: 9.5,-8.5 + parent: 1 + - uid: 849 + components: + - type: Transform + pos: 9.5,11.5 + parent: 1 + - uid: 850 + components: + - type: Transform + pos: 9.5,10.5 + parent: 1 + - uid: 851 + components: + - type: Transform + pos: 9.5,9.5 + parent: 1 + - uid: 852 + components: + - type: Transform + pos: 9.5,8.5 + parent: 1 + - uid: 853 + components: + - type: Transform + pos: 9.5,7.5 + parent: 1 + - uid: 854 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 + - uid: 857 + components: + - type: Transform + pos: 11.5,-8.5 + parent: 1 + - uid: 858 + components: + - type: Transform + pos: 11.5,-9.5 + parent: 1 + - uid: 859 + components: + - type: Transform + pos: 11.5,-10.5 + parent: 1 + - uid: 863 + components: + - type: Transform + pos: 11.5,-17.5 + parent: 1 + - uid: 865 + components: + - type: Transform + pos: 11.5,8.5 + parent: 1 + - uid: 866 + components: + - type: Transform + pos: 11.5,7.5 + parent: 1 + - uid: 867 + components: + - type: Transform + pos: 11.5,6.5 + parent: 1 + - uid: 868 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 + - uid: 869 + components: + - type: Transform + pos: 11.5,4.5 + parent: 1 + - uid: 870 + components: + - type: Transform + pos: 11.5,3.5 + parent: 1 + - uid: 871 + components: + - type: Transform + pos: 11.5,2.5 + parent: 1 + - uid: 872 + components: + - type: Transform + pos: 9.5,-4.5 + parent: 1 + - uid: 876 + components: + - type: Transform + pos: 10.5,-17.5 + parent: 1 + - uid: 877 + components: + - type: Transform + pos: 10.5,-18.5 + parent: 1 + - uid: 878 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - uid: 879 + components: + - type: Transform + pos: 11.5,10.5 + parent: 1 + - uid: 880 + components: + - type: Transform + pos: 11.5,9.5 + parent: 1 + - uid: 881 + components: + - type: Transform + pos: 10.5,-5.5 + parent: 1 + - uid: 884 + components: + - type: Transform + pos: 10.5,-8.5 + parent: 1 + - uid: 885 + components: + - type: Transform + pos: 10.5,-9.5 + parent: 1 + - uid: 886 + components: + - type: Transform + pos: 10.5,-10.5 + parent: 1 + - uid: 887 + components: + - type: Transform + pos: 10.5,-11.5 + parent: 1 + - uid: 889 + components: + - type: Transform + pos: 10.5,-16.5 + parent: 1 + - uid: 890 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 + - uid: 891 + components: + - type: Transform + pos: 13.5,6.5 + parent: 1 + - uid: 892 + components: + - type: Transform + pos: 13.5,5.5 + parent: 1 + - uid: 893 + components: + - type: Transform + pos: 13.5,4.5 + parent: 1 + - uid: 896 + components: + - type: Transform + pos: 13.5,1.5 + parent: 1 + - uid: 899 + components: + - type: Transform + pos: 12.5,-16.5 + parent: 1 + - uid: 900 + components: + - type: Transform + pos: 12.5,-17.5 + parent: 1 + - uid: 903 + components: + - type: Transform + pos: 10.5,-0.5 + parent: 1 + - uid: 905 + components: + - type: Transform + pos: 12.5,-5.5 + parent: 1 + - uid: 906 + components: + - type: Transform + pos: 12.5,-6.5 + parent: 1 + - uid: 907 + components: + - type: Transform + pos: 12.5,-7.5 + parent: 1 + - uid: 908 + components: + - type: Transform + pos: 12.5,-8.5 + parent: 1 + - uid: 912 + components: + - type: Transform + pos: 12.5,9.5 + parent: 1 + - uid: 913 + components: + - type: Transform + pos: 12.5,8.5 + parent: 1 + - uid: 914 + components: + - type: Transform + pos: 12.5,7.5 + parent: 1 + - uid: 915 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 + - uid: 916 + components: + - type: Transform + pos: 12.5,5.5 + parent: 1 + - uid: 917 + components: + - type: Transform + pos: 12.5,4.5 + parent: 1 + - uid: 918 + components: + - type: Transform + pos: 12.5,3.5 + parent: 1 + - uid: 919 + components: + - type: Transform + pos: 14.5,-9.5 + parent: 1 + - uid: 920 + components: + - type: Transform + pos: 14.5,-10.5 + parent: 1 + - uid: 921 + components: + - type: Transform + pos: 14.5,-11.5 + parent: 1 + - uid: 923 + components: + - type: Transform + pos: 13.5,-12.5 + parent: 1 + - uid: 924 + components: + - type: Transform + pos: 14.5,-15.5 + parent: 1 + - uid: 927 + components: + - type: Transform + pos: 14.5,-18.5 + parent: 1 + - uid: 928 + components: + - type: Transform + pos: 14.5,6.5 + parent: 1 + - uid: 929 + components: + - type: Transform + pos: 14.5,5.5 + parent: 1 + - uid: 933 + components: + - type: Transform + pos: 14.5,1.5 + parent: 1 + - uid: 937 + components: + - type: Transform + pos: 14.5,-7.5 + parent: 1 + - uid: 939 + components: + - type: Transform + pos: 14.5,7.5 + parent: 1 + - uid: 940 + components: + - type: Transform + pos: 13.5,-5.5 + parent: 1 + - uid: 947 + components: + - type: Transform + pos: 14.5,-12.5 + parent: 1 + - uid: 948 + components: + - type: Transform + pos: 13.5,-15.5 + parent: 1 + - uid: 952 + components: + - type: Transform + pos: 16.5,7.5 + parent: 1 + - uid: 953 + components: + - type: Transform + pos: 16.5,6.5 + parent: 1 + - uid: 954 + components: + - type: Transform + pos: 16.5,5.5 + parent: 1 + - uid: 955 + components: + - type: Transform + pos: 16.5,4.5 + parent: 1 + - uid: 956 + components: + - type: Transform + pos: 16.5,3.5 + parent: 1 + - uid: 957 + components: + - type: Transform + pos: 16.5,2.5 + parent: 1 + - uid: 960 + components: + - type: Transform + pos: 16.5,-0.5 + parent: 1 + - uid: 961 + components: + - type: Transform + pos: 16.5,-1.5 + parent: 1 + - uid: 962 + components: + - type: Transform + pos: 16.5,-2.5 + parent: 1 + - uid: 965 + components: + - type: Transform + pos: 15.5,-15.5 + parent: 1 + - uid: 968 + components: + - type: Transform + pos: 15.5,-18.5 + parent: 1 + - uid: 972 + components: + - type: Transform + pos: 15.5,-7.5 + parent: 1 + - uid: 976 + components: + - type: Transform + pos: 15.5,-11.5 + parent: 1 + - uid: 978 + components: + - type: Transform + pos: 15.5,7.5 + parent: 1 + - uid: 979 + components: + - type: Transform + pos: 15.5,6.5 + parent: 1 + - uid: 980 + components: + - type: Transform + pos: 15.5,5.5 + parent: 1 + - uid: 981 + components: + - type: Transform + pos: 15.5,4.5 + parent: 1 + - uid: 982 + components: + - type: Transform + pos: 15.5,3.5 + parent: 1 + - uid: 985 + components: + - type: Transform + pos: 17.5,-11.5 + parent: 1 + - uid: 988 + components: + - type: Transform + pos: 17.5,-14.5 + parent: 1 + - uid: 993 + components: + - type: Transform + pos: 17.5,4.5 + parent: 1 + - uid: 994 + components: + - type: Transform + pos: 17.5,3.5 + parent: 1 + - uid: 995 + components: + - type: Transform + pos: 17.5,2.5 + parent: 1 + - uid: 998 + components: + - type: Transform + pos: 17.5,-0.5 + parent: 1 + - uid: 999 + components: + - type: Transform + pos: 17.5,-1.5 + parent: 1 + - uid: 1000 + components: + - type: Transform + pos: 17.5,-2.5 + parent: 1 + - uid: 1005 + components: + - type: Transform + pos: 17.5,-7.5 + parent: 1 + - uid: 1009 + components: + - type: Transform + pos: 17.5,5.5 + parent: 1 + - uid: 1010 + components: + - type: Transform + pos: 16.5,-5.5 + parent: 1 + - uid: 1012 + components: + - type: Transform + pos: 16.5,-7.5 + parent: 1 + - uid: 1021 + components: + - type: Transform + pos: 16.5,-16.5 + parent: 1 + - uid: 1024 + components: + - type: Transform + pos: 19.5,1.5 + parent: 1 + - uid: 1025 + components: + - type: Transform + pos: 19.5,0.5 + parent: 1 + - uid: 1036 + components: + - type: Transform + pos: 18.5,-2.5 + parent: 1 + - uid: 1041 + components: + - type: Transform + pos: 18.5,-7.5 + parent: 1 + - uid: 1042 + components: + - type: Transform + pos: 18.5,-8.5 + parent: 1 + - uid: 1043 + components: + - type: Transform + pos: 18.5,-9.5 + parent: 1 + - uid: 1044 + components: + - type: Transform + pos: 18.5,-10.5 + parent: 1 + - uid: 1048 + components: + - type: Transform + pos: 18.5,-14.5 + parent: 1 + - uid: 1049 + components: + - type: Transform + pos: 18.5,-15.5 + parent: 1 + - uid: 1050 + components: + - type: Transform + pos: 18.5,-16.5 + parent: 1 + - uid: 1051 + components: + - type: Transform + pos: 18.5,5.5 + parent: 1 + - uid: 1052 + components: + - type: Transform + pos: 18.5,4.5 + parent: 1 + - uid: 1053 + components: + - type: Transform + pos: 18.5,3.5 + parent: 1 + - uid: 1054 + components: + - type: Transform + pos: 18.5,2.5 + parent: 1 + - uid: 1059 + components: + - type: Transform + pos: 20.5,-14.5 + parent: 1 + - uid: 1060 + components: + - type: Transform + pos: 20.5,-15.5 + parent: 1 + - uid: 1064 + components: + - type: Transform + pos: 20.5,1.5 + parent: 1 + - uid: 1065 + components: + - type: Transform + pos: 20.5,0.5 + parent: 1 + - uid: 1072 + components: + - type: Transform + pos: 20.5,-6.5 + parent: 1 + - uid: 1073 + components: + - type: Transform + pos: 20.5,-7.5 + parent: 1 + - uid: 1074 + components: + - type: Transform + pos: 20.5,-8.5 + parent: 1 + - uid: 1077 + components: + - type: Transform + pos: 20.5,-11.5 + parent: 1 + - uid: 1082 + components: + - type: Transform + pos: 19.5,-10.5 + parent: 1 + - uid: 1086 + components: + - type: Transform + pos: 19.5,-14.5 + parent: 1 + - uid: 1087 + components: + - type: Transform + pos: 19.5,-15.5 + parent: 1 + - uid: 1088 + components: + - type: Transform + pos: 19.5,-16.5 + parent: 1 + - uid: 1089 + components: + - type: Transform + pos: 19.5,-17.5 + parent: 1 + - uid: 1090 + components: + - type: Transform + pos: 19.5,-18.5 + parent: 1 + - uid: 1091 + components: + - type: Transform + pos: 22.5,1.5 + parent: 1 + - uid: 1092 + components: + - type: Transform + pos: 22.5,0.5 + parent: 1 + - uid: 1093 + components: + - type: Transform + pos: 22.5,-0.5 + parent: 1 + - uid: 1094 + components: + - type: Transform + pos: 22.5,-1.5 + parent: 1 + - uid: 1095 + components: + - type: Transform + pos: 22.5,-2.5 + parent: 1 + - uid: 1097 + components: + - type: Transform + pos: 22.5,-4.5 + parent: 1 + - uid: 1098 + components: + - type: Transform + pos: 22.5,-5.5 + parent: 1 + - uid: 1099 + components: + - type: Transform + pos: 22.5,-6.5 + parent: 1 + - uid: 1100 + components: + - type: Transform + pos: 22.5,-7.5 + parent: 1 + - uid: 1101 + components: + - type: Transform + pos: 21.5,1.5 + parent: 1 + - uid: 1102 + components: + - type: Transform + pos: 21.5,0.5 + parent: 1 + - uid: 1103 + components: + - type: Transform + pos: 21.5,-0.5 + parent: 1 + - uid: 1104 + components: + - type: Transform + pos: 21.5,-1.5 + parent: 1 + - uid: 1105 + components: + - type: Transform + pos: 21.5,-2.5 + parent: 1 + - uid: 1106 + components: + - type: Transform + pos: 21.5,-3.5 + parent: 1 + - uid: 1107 + components: + - type: Transform + pos: 21.5,-4.5 + parent: 1 + - uid: 1108 + components: + - type: Transform + pos: 21.5,-5.5 + parent: 1 + - uid: 1109 + components: + - type: Transform + pos: 21.5,-6.5 + parent: 1 + - uid: 1110 + components: + - type: Transform + pos: 21.5,-7.5 + parent: 1 + - uid: 1115 + components: + - type: Transform + pos: 23.5,-15.5 + parent: 1 + - uid: 1116 + components: + - type: Transform + pos: 23.5,-16.5 + parent: 1 + - uid: 1120 + components: + - type: Transform + pos: -28.5,-0.5 + parent: 1 + - uid: 1121 + components: + - type: Transform + pos: -28.5,-2.5 + parent: 1 + - uid: 1122 + components: + - type: Transform + pos: -28.5,-1.5 + parent: 1 + - uid: 1123 + components: + - type: Transform + pos: 23.5,-3.5 + parent: 1 + - uid: 1125 + components: + - type: Transform + pos: 23.5,-5.5 + parent: 1 + - uid: 1126 + components: + - type: Transform + pos: 23.5,-6.5 + parent: 1 + - uid: 1129 + components: + - type: Transform + pos: 22.5,-15.5 + parent: 1 + - uid: 1130 + components: + - type: Transform + pos: 22.5,-16.5 + parent: 1 + - uid: 1131 + components: + - type: Transform + pos: 22.5,-17.5 + parent: 1 + - uid: 1132 + components: + - type: Transform + pos: 22.5,-18.5 + parent: 1 + - uid: 1133 + components: + - type: Transform + pos: -18.5,8.5 + parent: 1 + - uid: 1135 + components: + - type: Transform + pos: -19.5,6.5 + parent: 1 + - uid: 1136 + components: + - type: Transform + pos: -17.5,6.5 + parent: 1 + - uid: 1137 + components: + - type: Transform + pos: -17.5,7.5 + parent: 1 + - uid: 1138 + components: + - type: Transform + pos: 25.5,-3.5 + parent: 1 + - uid: 1140 + components: + - type: Transform + pos: 25.5,-5.5 + parent: 1 + - uid: 1142 + components: + - type: Transform + pos: 25.5,-7.5 + parent: 1 + - uid: 1146 + components: + - type: Transform + pos: 24.5,-15.5 + parent: 1 + - uid: 1150 + components: + - type: Transform + pos: -17.5,5.5 + parent: 1 + - uid: 1151 + components: + - type: Transform + pos: -28.5,-10.5 + parent: 1 + - uid: 1152 + components: + - type: Transform + pos: -28.5,-11.5 + parent: 1 + - uid: 1153 + components: + - type: Transform + pos: -28.5,-4.5 + parent: 1 + - uid: 1154 + components: + - type: Transform + pos: -28.5,-3.5 + parent: 1 + - uid: 1157 + components: + - type: Transform + pos: 26.5,-17.5 + parent: 1 + - uid: 1158 + components: + - type: Transform + pos: 26.5,-18.5 + parent: 1 + - uid: 1159 + components: + - type: Transform + pos: 26.5,-3.5 + parent: 1 + - uid: 1160 + components: + - type: Transform + pos: 26.5,-4.5 + parent: 1 + - uid: 1161 + components: + - type: Transform + pos: 26.5,-5.5 + parent: 1 + - uid: 1162 + components: + - type: Transform + pos: 26.5,-6.5 + parent: 1 + - uid: 1163 + components: + - type: Transform + pos: 26.5,-7.5 + parent: 1 + - uid: 1164 + components: + - type: Transform + pos: 26.5,-8.5 + parent: 1 + - uid: 1166 + components: + - type: Transform + pos: 26.5,-10.5 + parent: 1 + - uid: 1167 + components: + - type: Transform + pos: 26.5,-11.5 + parent: 1 + - uid: 1168 + components: + - type: Transform + pos: 26.5,-12.5 + parent: 1 + - uid: 1172 + components: + - type: Transform + pos: 26.5,-16.5 + parent: 1 + - uid: 1173 + components: + - type: Transform + pos: -29.5,-12.5 + parent: 1 + - uid: 1174 + components: + - type: Transform + pos: -28.5,-5.5 + parent: 1 + - uid: 1175 + components: + - type: Transform + pos: -24.5,5.5 + parent: 1 + - uid: 1176 + components: + - type: Transform + pos: 25.5,-15.5 + parent: 1 + - uid: 1177 + components: + - type: Transform + pos: 25.5,-16.5 + parent: 1 + - uid: 1178 + components: + - type: Transform + pos: 25.5,-17.5 + parent: 1 + - uid: 1179 + components: + - type: Transform + pos: 25.5,-18.5 + parent: 1 + - uid: 1180 + components: + - type: Transform + pos: 28.5,-3.5 + parent: 1 + - uid: 1181 + components: + - type: Transform + pos: -22.5,6.5 + parent: 1 + - uid: 1183 + components: + - type: Transform + pos: -23.5,6.5 + parent: 1 + - uid: 1184 + components: + - type: Transform + pos: 26.5,-0.5 + parent: 1 + - uid: 1187 + components: + - type: Transform + pos: 27.5,-11.5 + parent: 1 + - uid: 1189 + components: + - type: Transform + pos: 27.5,-13.5 + parent: 1 + - uid: 1193 + components: + - type: Transform + pos: -22.5,5.5 + parent: 1 + - uid: 1194 + components: + - type: Transform + pos: -21.5,6.5 + parent: 1 + - uid: 1195 + components: + - type: Transform + pos: 26.5,-2.5 + parent: 1 + - uid: 1196 + components: + - type: Transform + pos: 25.5,-2.5 + parent: 1 + - uid: 1197 + components: + - type: Transform + pos: 27.5,-3.5 + parent: 1 + - uid: 1198 + components: + - type: Transform + pos: 27.5,-4.5 + parent: 1 + - uid: 1199 + components: + - type: Transform + pos: 27.5,-5.5 + parent: 1 + - uid: 1200 + components: + - type: Transform + pos: 27.5,-6.5 + parent: 1 + - uid: 1201 + components: + - type: Transform + pos: 27.5,-7.5 + parent: 1 + - uid: 1203 + components: + - type: Transform + pos: 29.5,-15.5 + parent: 1 + - uid: 1204 + components: + - type: Transform + pos: -24.5,6.5 + parent: 1 + - uid: 1205 + components: + - type: Transform + pos: -23.5,5.5 + parent: 1 + - uid: 1206 + components: + - type: Transform + pos: 29.5,-3.5 + parent: 1 + - uid: 1207 + components: + - type: Transform + pos: 29.5,-4.5 + parent: 1 + - uid: 1208 + components: + - type: Transform + pos: 29.5,-5.5 + parent: 1 + - uid: 1209 + components: + - type: Transform + pos: 29.5,-6.5 + parent: 1 + - uid: 1210 + components: + - type: Transform + pos: 29.5,-7.5 + parent: 1 + - uid: 1211 + components: + - type: Transform + pos: 29.5,-8.5 + parent: 1 + - uid: 1214 + components: + - type: Transform + pos: 29.5,-11.5 + parent: 1 + - uid: 1216 + components: + - type: Transform + pos: 29.5,-13.5 + parent: 1 + - uid: 1217 + components: + - type: Transform + pos: 29.5,-14.5 + parent: 1 + - uid: 1218 + components: + - type: Transform + pos: 23.5,-0.5 + parent: 1 + - uid: 1219 + components: + - type: Transform + pos: 28.5,-5.5 + parent: 1 + - uid: 1220 + components: + - type: Transform + pos: 28.5,-6.5 + parent: 1 + - uid: 1221 + components: + - type: Transform + pos: 28.5,-7.5 + parent: 1 + - uid: 1225 + components: + - type: Transform + pos: 28.5,-11.5 + parent: 1 + - uid: 1227 + components: + - type: Transform + pos: 28.5,-14.5 + parent: 1 + - uid: 1228 + components: + - type: Transform + pos: 28.5,-15.5 + parent: 1 + - uid: 1229 + components: + - type: Transform + pos: 28.5,-13.5 + parent: 1 + - uid: 1230 + components: + - type: Transform + pos: 28.5,-4.5 + parent: 1 + - uid: 1231 + components: + - type: Transform + pos: 29.5,-16.5 + parent: 1 + - uid: 1232 + components: + - type: Transform + pos: 28.5,-16.5 + parent: 1 + - uid: 1233 + components: + - type: Transform + pos: 27.5,-16.5 + parent: 1 + - uid: 1234 + components: + - type: Transform + pos: 27.5,-17.5 + parent: 1 + - uid: 1235 + components: + - type: Transform + pos: 28.5,-17.5 + parent: 1 + - uid: 1236 + components: + - type: Transform + pos: 30.5,-4.5 + parent: 1 + - uid: 1237 + components: + - type: Transform + pos: -28.5,-15.5 + parent: 1 + - uid: 1238 + components: + - type: Transform + pos: -29.5,-10.5 + parent: 1 + - uid: 1239 + components: + - type: Transform + pos: 30.5,-15.5 + parent: 1 + - uid: 1240 + components: + - type: Transform + pos: 30.5,-14.5 + parent: 1 + - uid: 1243 + components: + - type: Transform + pos: 30.5,-10.5 + parent: 1 + - uid: 1244 + components: + - type: Transform + pos: 30.5,-9.5 + parent: 1 + - uid: 1245 + components: + - type: Transform + pos: 30.5,-8.5 + parent: 1 + - uid: 1246 + components: + - type: Transform + pos: 30.5,-7.5 + parent: 1 + - uid: 1247 + components: + - type: Transform + pos: 30.5,-13.5 + parent: 1 + - uid: 1248 + components: + - type: Transform + pos: 30.5,-6.5 + parent: 1 + - uid: 1249 + components: + - type: Transform + pos: 30.5,-3.5 + parent: 1 + - uid: 1250 + components: + - type: Transform + pos: -28.5,-6.5 + parent: 1 + - uid: 1251 + components: + - type: Transform + pos: 30.5,-5.5 + parent: 1 + - uid: 1253 + components: + - type: Transform + pos: 24.5,-2.5 + parent: 1 + - uid: 1254 + components: + - type: Transform + pos: 31.5,-12.5 + parent: 1 + - uid: 1255 + components: + - type: Transform + pos: 24.5,-0.5 + parent: 1 + - uid: 1256 + components: + - type: Transform + pos: 24.5,-1.5 + parent: 1 + - uid: 1257 + components: + - type: Transform + pos: 25.5,-0.5 + parent: 1 + - uid: 1258 + components: + - type: Transform + pos: 26.5,-1.5 + parent: 1 + - uid: 1259 + components: + - type: Transform + pos: -18.5,7.5 + parent: 1 + - uid: 1260 + components: + - type: Transform + pos: -18.5,6.5 + parent: 1 + - uid: 1261 + components: + - type: Transform + pos: -19.5,8.5 + parent: 1 + - uid: 1262 + components: + - type: Transform + pos: -18.5,5.5 + parent: 1 + - uid: 1263 + components: + - type: Transform + pos: -19.5,7.5 + parent: 1 + - uid: 1264 + components: + - type: Transform + pos: -20.5,8.5 + parent: 1 + - uid: 1266 + components: + - type: Transform + pos: 31.5,-10.5 + parent: 1 + - uid: 1267 + components: + - type: Transform + pos: 31.5,-11.5 + parent: 1 + - uid: 1268 + components: + - type: Transform + pos: 25.5,-1.5 + parent: 1 + - uid: 1269 + components: + - type: Transform + pos: 31.5,-13.5 + parent: 1 + - uid: 1270 + components: + - type: Transform + pos: -15.5,8.5 + parent: 1 + - uid: 1273 + components: + - type: Transform + pos: -20.5,6.5 + parent: 1 + - uid: 1274 + components: + - type: Transform + pos: -17.5,8.5 + parent: 1 + - uid: 1275 + components: + - type: Transform + pos: -16.5,7.5 + parent: 1 + - uid: 1276 + components: + - type: Transform + pos: -29.5,-15.5 + parent: 1 + - uid: 1278 + components: + - type: Transform + pos: -28.5,-8.5 + parent: 1 + - uid: 1279 + components: + - type: Transform + pos: -28.5,-17.5 + parent: 1 + - uid: 1280 + components: + - type: Transform + pos: -28.5,-16.5 + parent: 1 + - uid: 1281 + components: + - type: Transform + pos: -16.5,6.5 + parent: 1 + - uid: 1282 + components: + - type: Transform + pos: -16.5,8.5 + parent: 1 + - uid: 1283 + components: + - type: Transform + pos: -16.5,5.5 + parent: 1 + - uid: 1285 + components: + - type: Transform + pos: -20.5,7.5 + parent: 1 + - uid: 1286 + components: + - type: Transform + pos: -15.5,7.5 + parent: 1 + - uid: 1287 + components: + - type: Transform + pos: -28.5,-9.5 + parent: 1 + - uid: 1288 + components: + - type: Transform + pos: -29.5,-11.5 + parent: 1 + - uid: 1289 + components: + - type: Transform + pos: -29.5,-14.5 + parent: 1 + - uid: 1290 + components: + - type: Transform + pos: -28.5,-7.5 + parent: 1 + - uid: 1291 + components: + - type: Transform + pos: -29.5,-16.5 + parent: 1 + - uid: 1293 + components: + - type: Transform + pos: -25.5,-19.5 + parent: 1 + - uid: 1295 + components: + - type: Transform + pos: -10.5,-19.5 + parent: 1 + - uid: 1299 + components: + - type: Transform + pos: -14.5,-19.5 + parent: 1 + - uid: 1301 + components: + - type: Transform + pos: -15.5,-19.5 + parent: 1 + - uid: 1307 + components: + - type: Transform + pos: -21.5,-19.5 + parent: 1 + - uid: 1309 + components: + - type: Transform + pos: -24.5,-19.5 + parent: 1 + - uid: 1311 + components: + - type: Transform + pos: 5.5,-19.5 + parent: 1 + - uid: 1314 + components: + - type: Transform + pos: 4.5,-19.5 + parent: 1 + - uid: 1315 + components: + - type: Transform + pos: 1.5,-19.5 + parent: 1 + - uid: 1319 + components: + - type: Transform + pos: 23.5,-19.5 + parent: 1 + - uid: 1320 + components: + - type: Transform + pos: 22.5,-19.5 + parent: 1 + - uid: 1323 + components: + - type: Transform + pos: 18.5,-19.5 + parent: 1 + - uid: 1324 + components: + - type: Transform + pos: 17.5,-19.5 + parent: 1 + - uid: 1325 + components: + - type: Transform + pos: 16.5,-19.5 + parent: 1 + - uid: 1326 + components: + - type: Transform + pos: 15.5,-19.5 + parent: 1 + - uid: 1329 + components: + - type: Transform + pos: 19.5,-19.5 + parent: 1 + - uid: 1330 + components: + - type: Transform + pos: 12.5,-19.5 + parent: 1 + - uid: 1340 + components: + - type: Transform + pos: 12.5,-20.5 + parent: 1 + - uid: 1344 + components: + - type: Transform + pos: 19.5,-20.5 + parent: 1 + - uid: 1345 + components: + - type: Transform + pos: 22.5,-20.5 + parent: 1 + - uid: 1346 + components: + - type: Transform + pos: 20.5,-20.5 + parent: 1 + - uid: 1347 + components: + - type: Transform + pos: 21.5,-20.5 + parent: 1 + - uid: 1349 + components: + - type: Transform + pos: 15.5,-20.5 + parent: 1 + - uid: 1351 + components: + - type: Transform + pos: -5.5,-20.5 + parent: 1 + - uid: 1352 + components: + - type: Transform + pos: -6.5,-20.5 + parent: 1 + - uid: 1353 + components: + - type: Transform + pos: -4.5,-20.5 + parent: 1 + - uid: 1354 + components: + - type: Transform + pos: -3.5,-20.5 + parent: 1 + - uid: 1356 + components: + - type: Transform + pos: -2.5,-20.5 + parent: 1 + - uid: 1357 + components: + - type: Transform + pos: 1.5,-20.5 + parent: 1 + - uid: 1358 + components: + - type: Transform + pos: 2.5,-20.5 + parent: 1 + - uid: 1360 + components: + - type: Transform + pos: 4.5,-20.5 + parent: 1 + - uid: 1361 + components: + - type: Transform + pos: 5.5,-20.5 + parent: 1 + - uid: 1364 + components: + - type: Transform + pos: -23.5,-20.5 + parent: 1 + - uid: 1365 + components: + - type: Transform + pos: -22.5,-20.5 + parent: 1 + - uid: 1366 + components: + - type: Transform + pos: -21.5,-20.5 + parent: 1 + - uid: 1367 + components: + - type: Transform + pos: -20.5,-20.5 + parent: 1 + - uid: 1368 + components: + - type: Transform + pos: -19.5,-20.5 + parent: 1 + - uid: 1373 + components: + - type: Transform + pos: -14.5,-20.5 + parent: 1 + - uid: 1376 + components: + - type: Transform + pos: -11.5,-20.5 + parent: 1 + - uid: 1377 + components: + - type: Transform + pos: -10.5,-20.5 + parent: 1 + - uid: 1379 + components: + - type: Transform + pos: -11.5,-21.5 + parent: 1 + - uid: 1380 + components: + - type: Transform + pos: -12.5,-21.5 + parent: 1 + - uid: 1381 + components: + - type: Transform + pos: -13.5,-21.5 + parent: 1 + - uid: 1382 + components: + - type: Transform + pos: -14.5,-21.5 + parent: 1 + - uid: 1383 + components: + - type: Transform + pos: -10.5,-21.5 + parent: 1 + - uid: 1386 + components: + - type: Transform + pos: -16.5,-21.5 + parent: 1 + - uid: 1387 + components: + - type: Transform + pos: -21.5,-21.5 + parent: 1 + - uid: 1388 + components: + - type: Transform + pos: -19.5,-21.5 + parent: 1 + - uid: 1389 + components: + - type: Transform + pos: -17.5,-21.5 + parent: 1 + - uid: 1390 + components: + - type: Transform + pos: -20.5,-21.5 + parent: 1 + - uid: 1391 + components: + - type: Transform + pos: -18.5,-21.5 + parent: 1 + - uid: 1392 + components: + - type: Transform + pos: 21.5,-21.5 + parent: 1 + - uid: 1393 + components: + - type: Transform + pos: 20.5,-21.5 + parent: 1 + - uid: 1394 + components: + - type: Transform + pos: 19.5,-21.5 + parent: 1 + - uid: 1397 + components: + - type: Transform + pos: 15.5,-21.5 + parent: 1 + - uid: 1398 + components: + - type: Transform + pos: 14.5,-21.5 + parent: 1 + - uid: 1399 + components: + - type: Transform + pos: 13.5,-21.5 + parent: 1 + - uid: 1400 + components: + - type: Transform + pos: 12.5,-21.5 + parent: 1 + - uid: 1401 + components: + - type: Transform + pos: 11.5,-21.5 + parent: 1 + - uid: 1402 + components: + - type: Transform + pos: 10.5,-21.5 + parent: 1 + - uid: 1407 + components: + - type: Transform + pos: 5.5,-21.5 + parent: 1 + - uid: 1408 + components: + - type: Transform + pos: 4.5,-21.5 + parent: 1 + - uid: 1409 + components: + - type: Transform + pos: 9.5,-21.5 + parent: 1 + - uid: 1410 + components: + - type: Transform + pos: 1.5,-21.5 + parent: 1 + - uid: 1417 + components: + - type: Transform + pos: -5.5,-21.5 + parent: 1 + - uid: 1418 + components: + - type: Transform + pos: -9.5,-21.5 + parent: 1 + - uid: 1419 + components: + - type: Transform + pos: 2.5,-21.5 + parent: 1 + - uid: 1421 + components: + - type: Transform + pos: 1.5,-22.5 + parent: 1 + - uid: 1422 + components: + - type: Transform + pos: 2.5,-22.5 + parent: 1 + - uid: 1423 + components: + - type: Transform + pos: 3.5,-22.5 + parent: 1 + - uid: 1424 + components: + - type: Transform + pos: 4.5,-22.5 + parent: 1 + - uid: 1425 + components: + - type: Transform + pos: 5.5,-22.5 + parent: 1 + - uid: 1429 + components: + - type: Transform + pos: 9.5,-22.5 + parent: 1 + - uid: 1430 + components: + - type: Transform + pos: 10.5,-22.5 + parent: 1 + - uid: 1431 + components: + - type: Transform + pos: 11.5,-22.5 + parent: 1 + - uid: 1432 + components: + - type: Transform + pos: 13.5,-22.5 + parent: 1 + - uid: 1433 + components: + - type: Transform + pos: 14.5,-22.5 + parent: 1 + - uid: 1435 + components: + - type: Transform + pos: 16.5,-22.5 + parent: 1 + - uid: 1436 + components: + - type: Transform + pos: 15.5,-22.5 + parent: 1 + - uid: 1437 + components: + - type: Transform + pos: 17.5,-22.5 + parent: 1 + - uid: 1438 + components: + - type: Transform + pos: 18.5,-22.5 + parent: 1 + - uid: 1439 + components: + - type: Transform + pos: 12.5,-22.5 + parent: 1 + - uid: 1441 + components: + - type: Transform + pos: -11.5,-22.5 + parent: 1 + - uid: 1442 + components: + - type: Transform + pos: -4.5,-22.5 + parent: 1 + - uid: 1443 + components: + - type: Transform + pos: -5.5,-22.5 + parent: 1 + - uid: 1444 + components: + - type: Transform + pos: -6.5,-22.5 + parent: 1 + - uid: 1448 + components: + - type: Transform + pos: -10.5,-22.5 + parent: 1 + - uid: 1449 + components: + - type: Transform + pos: -12.5,-22.5 + parent: 1 + - uid: 1450 + components: + - type: Transform + pos: -13.5,-22.5 + parent: 1 + - uid: 1451 + components: + - type: Transform + pos: -14.5,-22.5 + parent: 1 + - uid: 1452 + components: + - type: Transform + pos: 3.5,-23.5 + parent: 1 + - uid: 1453 + components: + - type: Transform + pos: 6.5,-23.5 + parent: 1 + - uid: 1454 + components: + - type: Transform + pos: 5.5,-23.5 + parent: 1 + - uid: 1455 + components: + - type: Transform + pos: 7.5,-23.5 + parent: 1 + - uid: 1456 + components: + - type: Transform + pos: 10.5,-23.5 + parent: 1 + - uid: 1457 + components: + - type: Transform + pos: 9.5,-23.5 + parent: 1 + - uid: 1458 + components: + - type: Transform + pos: 11.5,-23.5 + parent: 1 + - uid: 1459 + components: + - type: Transform + pos: 12.5,-23.5 + parent: 1 + - uid: 1460 + components: + - type: Transform + pos: 13.5,-23.5 + parent: 1 + - uid: 1461 + components: + - type: Transform + pos: 8.5,-23.5 + parent: 1 + - uid: 1462 + components: + - type: Transform + pos: -11.5,-23.5 + parent: 1 + - uid: 1463 + components: + - type: Transform + pos: -10.5,-23.5 + parent: 1 + - uid: 1464 + components: + - type: Transform + pos: -9.5,-23.5 + parent: 1 + - uid: 1465 + components: + - type: Transform + pos: -7.5,-23.5 + parent: 1 + - uid: 1466 + components: + - type: Transform + pos: -6.5,-23.5 + parent: 1 + - uid: 1467 + components: + - type: Transform + pos: -5.5,-23.5 + parent: 1 + - uid: 1468 + components: + - type: Transform + pos: -4.5,-23.5 + parent: 1 + - uid: 1469 + components: + - type: Transform + pos: -3.5,-23.5 + parent: 1 + - uid: 1470 + components: + - type: Transform + pos: -2.5,-23.5 + parent: 1 + - uid: 1471 + components: + - type: Transform + pos: -8.5,-23.5 + parent: 1 + - uid: 1472 + components: + - type: Transform + pos: 1.5,-23.5 + parent: 1 + - uid: 1473 + components: + - type: Transform + pos: 2.5,-23.5 + parent: 1 + - uid: 1474 + components: + - type: Transform + pos: 4.5,-23.5 + parent: 1 +- proto: WallRockBasaltArtifactFragment + entities: + - uid: 75 + components: + - type: Transform + pos: -23.5,-13.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: -24.5,-12.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: -24.5,-13.5 + parent: 1 + - uid: 465 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 466 + components: + - type: Transform + pos: -5.5,-6.5 + parent: 1 + - uid: 518 + components: + - type: Transform + pos: -4.5,-6.5 + parent: 1 + - uid: 535 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 745 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 746 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 777 + components: + - type: Transform + pos: 6.5,8.5 + parent: 1 +- proto: WallRockBasaltCoal + entities: + - uid: 198 + components: + - type: Transform + pos: -17.5,-18.5 + parent: 1 + - uid: 227 + components: + - type: Transform + pos: -18.5,-18.5 + parent: 1 + - uid: 276 + components: + - type: Transform + pos: -14.5,6.5 + parent: 1 + - uid: 289 + components: + - type: Transform + pos: -12.5,9.5 + parent: 1 + - uid: 290 + components: + - type: Transform + pos: -12.5,8.5 + parent: 1 + - uid: 291 + components: + - type: Transform + pos: -12.5,7.5 + parent: 1 + - uid: 292 + components: + - type: Transform + pos: -12.5,6.5 + parent: 1 + - uid: 312 + components: + - type: Transform + pos: -13.5,9.5 + parent: 1 + - uid: 313 + components: + - type: Transform + pos: -13.5,8.5 + parent: 1 + - uid: 314 + components: + - type: Transform + pos: -13.5,7.5 + parent: 1 + - uid: 315 + components: + - type: Transform + pos: -13.5,6.5 + parent: 1 + - uid: 324 + components: + - type: Transform + pos: -11.5,1.5 + parent: 1 + - uid: 338 + components: + - type: Transform + pos: -11.5,9.5 + parent: 1 + - uid: 339 + components: + - type: Transform + pos: -11.5,8.5 + parent: 1 + - uid: 340 + components: + - type: Transform + pos: -11.5,7.5 + parent: 1 + - uid: 341 + components: + - type: Transform + pos: -11.5,6.5 + parent: 1 + - uid: 344 + components: + - type: Transform + pos: -11.5,3.5 + parent: 1 + - uid: 345 + components: + - type: Transform + pos: -11.5,2.5 + parent: 1 + - uid: 385 + components: + - type: Transform + pos: -10.5,3.5 + parent: 1 + - uid: 386 + components: + - type: Transform + pos: -10.5,2.5 + parent: 1 + - uid: 387 + components: + - type: Transform + pos: -10.5,1.5 + parent: 1 + - uid: 416 + components: + - type: Transform + pos: -0.5,-18.5 + parent: 1 + - uid: 459 + components: + - type: Transform + pos: -0.5,-17.5 + parent: 1 + - uid: 462 + components: + - type: Transform + pos: -5.5,-2.5 + parent: 1 + - uid: 487 + components: + - type: Transform + pos: -5.5,-1.5 + parent: 1 + - uid: 501 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 502 + components: + - type: Transform + pos: -3.5,-2.5 + parent: 1 + - uid: 531 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 532 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 + - uid: 557 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 558 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 616 + components: + - type: Transform + pos: 0.5,-17.5 + parent: 1 + - uid: 617 + components: + - type: Transform + pos: 0.5,-18.5 + parent: 1 + - uid: 643 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 644 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 645 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 683 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 684 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 685 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 689 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 + - uid: 690 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 699 + components: + - type: Transform + pos: 5.5,-3.5 + parent: 1 + - uid: 720 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 721 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 722 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 + - uid: 730 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 731 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 732 + components: + - type: Transform + pos: 4.5,-0.5 + parent: 1 + - uid: 735 + components: + - type: Transform + pos: 4.5,-3.5 + parent: 1 + - uid: 736 + components: + - type: Transform + pos: 4.5,-4.5 + parent: 1 + - uid: 1272 + components: + - type: Transform + pos: -15.5,6.5 + parent: 1 + - uid: 1296 + components: + - type: Transform + pos: -9.5,-19.5 + parent: 1 + - uid: 1303 + components: + - type: Transform + pos: -8.5,-19.5 + parent: 1 + - uid: 1304 + components: + - type: Transform + pos: -18.5,-19.5 + parent: 1 + - uid: 1306 + components: + - type: Transform + pos: -17.5,-19.5 + parent: 1 + - uid: 1317 + components: + - type: Transform + pos: 0.5,-19.5 + parent: 1 + - uid: 1337 + components: + - type: Transform + pos: 0.5,-20.5 + parent: 1 + - uid: 1341 + components: + - type: Transform + pos: 16.5,-20.5 + parent: 1 + - uid: 1342 + components: + - type: Transform + pos: 18.5,-20.5 + parent: 1 + - uid: 1343 + components: + - type: Transform + pos: 17.5,-20.5 + parent: 1 + - uid: 1355 + components: + - type: Transform + pos: -9.5,-20.5 + parent: 1 + - uid: 1369 + components: + - type: Transform + pos: -18.5,-20.5 + parent: 1 + - uid: 1370 + components: + - type: Transform + pos: -17.5,-20.5 + parent: 1 + - uid: 1378 + components: + - type: Transform + pos: -8.5,-20.5 + parent: 1 + - uid: 1395 + components: + - type: Transform + pos: 17.5,-21.5 + parent: 1 + - uid: 1396 + components: + - type: Transform + pos: 16.5,-21.5 + parent: 1 + - uid: 1403 + components: + - type: Transform + pos: 18.5,-21.5 + parent: 1 + - uid: 1411 + components: + - type: Transform + pos: 0.5,-21.5 + parent: 1 +- proto: WallRockBasaltDiamond + entities: + - uid: 135 + components: + - type: Transform + pos: -22.5,-6.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: -20.5,-7.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: -21.5,-6.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: -21.5,-7.5 + parent: 1 + - uid: 467 + components: + - type: Transform + pos: -5.5,-7.5 + parent: 1 + - uid: 468 + components: + - type: Transform + pos: -5.5,-8.5 + parent: 1 + - uid: 700 + components: + - type: Transform + pos: 5.5,-4.5 + parent: 1 + - uid: 771 + components: + - type: Transform + pos: 6.5,-4.5 + parent: 1 + - uid: 796 + components: + - type: Transform + pos: 7.5,-4.5 + parent: 1 + - uid: 1096 + components: + - type: Transform + pos: 22.5,-3.5 + parent: 1 + - uid: 1155 + components: + - type: Transform + pos: 24.5,-3.5 + parent: 1 + - uid: 1192 + components: + - type: Transform + pos: 23.5,-2.5 + parent: 1 + - uid: 1252 + components: + - type: Transform + pos: 23.5,-1.5 + parent: 1 +- proto: WallRockBasaltGold + entities: + - uid: 81 + components: + - type: Transform + pos: -23.5,-6.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: -23.5,-3.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: -24.5,-4.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: -24.5,-5.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: -24.5,-3.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: -14.5,3.5 + parent: 1 + - uid: 262 + components: + - type: Transform + pos: -14.5,2.5 + parent: 1 + - uid: 263 + components: + - type: Transform + pos: -14.5,1.5 + parent: 1 + - uid: 319 + components: + - type: Transform + pos: -13.5,2.5 + parent: 1 + - uid: 321 + components: + - type: Transform + pos: -13.5,0.5 + parent: 1 + - uid: 354 + components: + - type: Transform + pos: -9.5,-8.5 + parent: 1 + - uid: 360 + components: + - type: Transform + pos: -9.5,-7.5 + parent: 1 + - uid: 397 + components: + - type: Transform + pos: -8.5,-7.5 + parent: 1 + - uid: 399 + components: + - type: Transform + pos: -8.5,-9.5 + parent: 1 + - uid: 420 + components: + - type: Transform + pos: -9.5,-9.5 + parent: 1 + - uid: 675 + components: + - type: Transform + pos: 3.5,-17.5 + parent: 1 + - uid: 676 + components: + - type: Transform + pos: 3.5,-18.5 + parent: 1 + - uid: 694 + components: + - type: Transform + pos: 2.5,-18.5 + parent: 1 + - uid: 728 + components: + - type: Transform + pos: 4.5,-18.5 + parent: 1 + - uid: 794 + components: + - type: Transform + pos: 7.5,-2.5 + parent: 1 + - uid: 814 + components: + - type: Transform + pos: 8.5,-1.5 + parent: 1 + - uid: 815 + components: + - type: Transform + pos: 8.5,-2.5 + parent: 1 + - uid: 816 + components: + - type: Transform + pos: 8.5,-3.5 + parent: 1 + - uid: 873 + components: + - type: Transform + pos: 9.5,-1.5 + parent: 1 + - uid: 894 + components: + - type: Transform + pos: 13.5,3.5 + parent: 1 + - uid: 895 + components: + - type: Transform + pos: 13.5,2.5 + parent: 1 + - uid: 902 + components: + - type: Transform + pos: 12.5,2.5 + parent: 1 + - uid: 930 + components: + - type: Transform + pos: 14.5,4.5 + parent: 1 + - uid: 931 + components: + - type: Transform + pos: 14.5,3.5 + parent: 1 + - uid: 932 + components: + - type: Transform + pos: 14.5,2.5 + parent: 1 + - uid: 983 + components: + - type: Transform + pos: 15.5,2.5 + parent: 1 + - uid: 989 + components: + - type: Transform + pos: 17.5,-15.5 + parent: 1 + - uid: 990 + components: + - type: Transform + pos: 17.5,-16.5 + parent: 1 + - uid: 991 + components: + - type: Transform + pos: 17.5,-17.5 + parent: 1 + - uid: 992 + components: + - type: Transform + pos: 17.5,-18.5 + parent: 1 + - uid: 1019 + components: + - type: Transform + pos: 16.5,-14.5 + parent: 1 + - uid: 1020 + components: + - type: Transform + pos: 16.5,-15.5 + parent: 1 + - uid: 1022 + components: + - type: Transform + pos: 16.5,-17.5 + parent: 1 + - uid: 1023 + components: + - type: Transform + pos: 16.5,-18.5 + parent: 1 + - uid: 1033 + components: + - type: Transform + pos: 18.5,-17.5 + parent: 1 + - uid: 1034 + components: + - type: Transform + pos: 18.5,-18.5 + parent: 1 + - uid: 1302 + components: + - type: Transform + pos: -16.5,-19.5 + parent: 1 + - uid: 1316 + components: + - type: Transform + pos: 2.5,-19.5 + parent: 1 + - uid: 1318 + components: + - type: Transform + pos: 3.5,-19.5 + parent: 1 + - uid: 1359 + components: + - type: Transform + pos: 3.5,-20.5 + parent: 1 + - uid: 1371 + components: + - type: Transform + pos: -16.5,-20.5 + parent: 1 + - uid: 1372 + components: + - type: Transform + pos: -15.5,-20.5 + parent: 1 + - uid: 1385 + components: + - type: Transform + pos: -15.5,-21.5 + parent: 1 + - uid: 1415 + components: + - type: Transform + pos: 3.5,-21.5 + parent: 1 +- proto: WallRockBasaltPlasma + entities: + - uid: 3 + components: + - type: Transform + pos: -27.5,-12.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: -27.5,-13.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -27.5,-14.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -27.5,-2.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -27.5,-3.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: -27.5,-4.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: -26.5,-1.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -26.5,-2.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -26.5,-3.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -26.5,-4.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: -25.5,-1.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -25.5,-0.5 + parent: 1 + - uid: 429 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 430 + components: + - type: Transform + pos: -7.5,0.5 + parent: 1 + - uid: 436 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 438 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 484 + components: + - type: Transform + pos: -5.5,1.5 + parent: 1 + - uid: 485 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - uid: 486 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 503 + components: + - type: Transform + pos: -3.5,-3.5 + parent: 1 + - uid: 504 + components: + - type: Transform + pos: -3.5,-4.5 + parent: 1 + - uid: 516 + components: + - type: Transform + pos: -3.5,8.5 + parent: 1 + - uid: 539 + components: + - type: Transform + pos: -1.5,10.5 + parent: 1 + - uid: 540 + components: + - type: Transform + pos: -1.5,9.5 + parent: 1 + - uid: 541 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 + - uid: 542 + components: + - type: Transform + pos: -1.5,7.5 + parent: 1 + - uid: 543 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 544 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 554 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 555 + components: + - type: Transform + pos: -2.5,7.5 + parent: 1 + - uid: 559 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 856 + components: + - type: Transform + pos: 11.5,-7.5 + parent: 1 + - uid: 874 + components: + - type: Transform + pos: 11.5,-5.5 + parent: 1 + - uid: 875 + components: + - type: Transform + pos: 11.5,-6.5 + parent: 1 + - uid: 882 + components: + - type: Transform + pos: 10.5,-6.5 + parent: 1 + - uid: 883 + components: + - type: Transform + pos: 10.5,-7.5 + parent: 1 + - uid: 925 + components: + - type: Transform + pos: 14.5,-16.5 + parent: 1 + - uid: 926 + components: + - type: Transform + pos: 14.5,-17.5 + parent: 1 + - uid: 949 + components: + - type: Transform + pos: 13.5,-16.5 + parent: 1 + - uid: 950 + components: + - type: Transform + pos: 13.5,-17.5 + parent: 1 + - uid: 966 + components: + - type: Transform + pos: 15.5,-16.5 + parent: 1 + - uid: 967 + components: + - type: Transform + pos: 15.5,-17.5 + parent: 1 + - uid: 1045 + components: + - type: Transform + pos: 18.5,-11.5 + parent: 1 + - uid: 1083 + components: + - type: Transform + pos: 19.5,-11.5 + parent: 1 + - uid: 1119 + components: + - type: Transform + pos: -28.5,-14.5 + parent: 1 + - uid: 1128 + components: + - type: Transform + pos: -28.5,-13.5 + parent: 1 + - uid: 1134 + components: + - type: Transform + pos: -28.5,-12.5 + parent: 1 + - uid: 1188 + components: + - type: Transform + pos: 27.5,-12.5 + parent: 1 + - uid: 1215 + components: + - type: Transform + pos: 29.5,-12.5 + parent: 1 + - uid: 1226 + components: + - type: Transform + pos: 28.5,-12.5 + parent: 1 + - uid: 1241 + components: + - type: Transform + pos: 30.5,-11.5 + parent: 1 + - uid: 1242 + components: + - type: Transform + pos: 30.5,-12.5 + parent: 1 + - uid: 1277 + components: + - type: Transform + pos: -29.5,-13.5 + parent: 1 +- proto: WallRockBasaltQuartz + entities: + - uid: 34 + components: + - type: Transform + pos: -26.5,-7.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -26.5,-8.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -26.5,-9.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -24.5,0.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: -24.5,3.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: -24.5,1.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: -24.5,2.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: -25.5,-7.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: -25.5,2.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: -25.5,3.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -25.5,1.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -25.5,0.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: -25.5,-9.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: -25.5,-8.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: -23.5,-9.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: -23.5,-10.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: -23.5,3.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: -23.5,2.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: -23.5,1.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: -24.5,-9.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: -24.5,-10.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: -22.5,2.5 + parent: 1 + - uid: 213 + components: + - type: Transform + pos: -17.5,-3.5 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: -15.5,-1.5 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: -15.5,-2.5 + parent: 1 + - uid: 237 + components: + - type: Transform + pos: -15.5,-3.5 + parent: 1 + - uid: 243 + components: + - type: Transform + pos: -16.5,-1.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: -16.5,-2.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: -16.5,-3.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: -14.5,-1.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: -14.5,-2.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: -14.5,-3.5 + parent: 1 + - uid: 299 + components: + - type: Transform + pos: -12.5,-6.5 + parent: 1 + - uid: 303 + components: + - type: Transform + pos: -13.5,-2.5 + parent: 1 + - uid: 306 + components: + - type: Transform + pos: -13.5,-9.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: -11.5,-6.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: -11.5,-7.5 + parent: 1 + - uid: 329 + components: + - type: Transform + pos: -11.5,-8.5 + parent: 1 + - uid: 330 + components: + - type: Transform + pos: -11.5,-9.5 + parent: 1 + - uid: 346 + components: + - type: Transform + pos: -12.5,-8.5 + parent: 1 + - uid: 347 + components: + - type: Transform + pos: -12.5,-9.5 + parent: 1 + - uid: 353 + components: + - type: Transform + pos: -12.5,-7.5 + parent: 1 + - uid: 369 + components: + - type: Transform + pos: -10.5,-7.5 + parent: 1 + - uid: 370 + components: + - type: Transform + pos: -10.5,-8.5 + parent: 1 + - uid: 666 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 667 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 716 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 + - uid: 717 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 718 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 748 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 + - uid: 749 + components: + - type: Transform + pos: 7.5,4.5 + parent: 1 + - uid: 750 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 751 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 757 + components: + - type: Transform + pos: 6.5,-16.5 + parent: 1 + - uid: 758 + components: + - type: Transform + pos: 6.5,-17.5 + parent: 1 + - uid: 759 + components: + - type: Transform + pos: 6.5,-18.5 + parent: 1 + - uid: 760 + components: + - type: Transform + pos: 6.5,6.5 + parent: 1 + - uid: 761 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 + - uid: 762 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 763 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 779 + components: + - type: Transform + pos: 7.5,-16.5 + parent: 1 + - uid: 780 + components: + - type: Transform + pos: 7.5,-17.5 + parent: 1 + - uid: 781 + components: + - type: Transform + pos: 7.5,-18.5 + parent: 1 + - uid: 790 + components: + - type: Transform + pos: 8.5,-18.5 + parent: 1 + - uid: 807 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 808 + components: + - type: Transform + pos: 8.5,4.5 + parent: 1 + - uid: 809 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 + - uid: 833 + components: + - type: Transform + pos: 11.5,-12.5 + parent: 1 + - uid: 838 + components: + - type: Transform + pos: 9.5,4.5 + parent: 1 + - uid: 855 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 + - uid: 860 + components: + - type: Transform + pos: 11.5,-11.5 + parent: 1 + - uid: 909 + components: + - type: Transform + pos: 12.5,-9.5 + parent: 1 + - uid: 910 + components: + - type: Transform + pos: 12.5,-10.5 + parent: 1 + - uid: 911 + components: + - type: Transform + pos: 12.5,-11.5 + parent: 1 + - uid: 922 + components: + - type: Transform + pos: 12.5,-12.5 + parent: 1 + - uid: 944 + components: + - type: Transform + pos: 13.5,-9.5 + parent: 1 + - uid: 945 + components: + - type: Transform + pos: 13.5,-10.5 + parent: 1 + - uid: 946 + components: + - type: Transform + pos: 13.5,-11.5 + parent: 1 + - uid: 1061 + components: + - type: Transform + pos: 20.5,-16.5 + parent: 1 + - uid: 1062 + components: + - type: Transform + pos: 20.5,-17.5 + parent: 1 + - uid: 1063 + components: + - type: Transform + pos: 20.5,-18.5 + parent: 1 + - uid: 1111 + components: + - type: Transform + pos: 21.5,-15.5 + parent: 1 + - uid: 1112 + components: + - type: Transform + pos: 21.5,-16.5 + parent: 1 + - uid: 1113 + components: + - type: Transform + pos: 21.5,-17.5 + parent: 1 + - uid: 1114 + components: + - type: Transform + pos: 21.5,-18.5 + parent: 1 + - uid: 1165 + components: + - type: Transform + pos: 26.5,-9.5 + parent: 1 + - uid: 1185 + components: + - type: Transform + pos: 27.5,-9.5 + parent: 1 + - uid: 1186 + components: + - type: Transform + pos: 27.5,-10.5 + parent: 1 + - uid: 1202 + components: + - type: Transform + pos: 27.5,-8.5 + parent: 1 + - uid: 1212 + components: + - type: Transform + pos: 29.5,-9.5 + parent: 1 + - uid: 1213 + components: + - type: Transform + pos: 29.5,-10.5 + parent: 1 + - uid: 1222 + components: + - type: Transform + pos: 28.5,-8.5 + parent: 1 + - uid: 1223 + components: + - type: Transform + pos: 28.5,-9.5 + parent: 1 + - uid: 1224 + components: + - type: Transform + pos: 28.5,-10.5 + parent: 1 + - uid: 1310 + components: + - type: Transform + pos: 7.5,-19.5 + parent: 1 + - uid: 1312 + components: + - type: Transform + pos: 6.5,-19.5 + parent: 1 + - uid: 1321 + components: + - type: Transform + pos: 21.5,-19.5 + parent: 1 + - uid: 1322 + components: + - type: Transform + pos: 20.5,-19.5 + parent: 1 + - uid: 1362 + components: + - type: Transform + pos: 6.5,-20.5 + parent: 1 + - uid: 1406 + components: + - type: Transform + pos: 6.5,-21.5 + parent: 1 + - uid: 1412 + components: + - type: Transform + pos: -2.5,-21.5 + parent: 1 + - uid: 1413 + components: + - type: Transform + pos: -3.5,-21.5 + parent: 1 + - uid: 1414 + components: + - type: Transform + pos: -4.5,-21.5 + parent: 1 + - uid: 1426 + components: + - type: Transform + pos: 6.5,-22.5 + parent: 1 + - uid: 1427 + components: + - type: Transform + pos: 7.5,-22.5 + parent: 1 + - uid: 1428 + components: + - type: Transform + pos: -2.5,-22.5 + parent: 1 + - uid: 1434 + components: + - type: Transform + pos: 8.5,-22.5 + parent: 1 + - uid: 1440 + components: + - type: Transform + pos: -3.5,-22.5 + parent: 1 +- proto: WallRockBasaltSilver + entities: + - uid: 78 + components: + - type: Transform + pos: -23.5,-16.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: -23.5,-17.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: -23.5,-18.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: -21.5,4.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: -22.5,-18.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: -20.5,4.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: -20.5,-5.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: -19.5,-5.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: -19.5,-6.5 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: -19.5,4.5 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: -19.5,3.5 + parent: 1 + - uid: 192 + components: + - type: Transform + pos: -17.5,-11.5 + parent: 1 + - uid: 193 + components: + - type: Transform + pos: -17.5,-12.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: -17.5,-5.5 + parent: 1 + - uid: 219 + components: + - type: Transform + pos: -18.5,-5.5 + parent: 1 + - uid: 220 + components: + - type: Transform + pos: -18.5,-6.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: -16.5,-11.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: -16.5,-12.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: -16.5,-13.5 + parent: 1 + - uid: 283 + components: + - type: Transform + pos: -15.5,-13.5 + parent: 1 + - uid: 284 + components: + - type: Transform + pos: -15.5,-14.5 + parent: 1 + - uid: 366 + components: + - type: Transform + pos: -9.5,8.5 + parent: 1 + - uid: 408 + components: + - type: Transform + pos: -8.5,8.5 + parent: 1 + - uid: 423 + components: + - type: Transform + pos: -7.5,9.5 + parent: 1 + - uid: 424 + components: + - type: Transform + pos: -7.5,8.5 + parent: 1 + - uid: 425 + components: + - type: Transform + pos: -7.5,7.5 + parent: 1 + - uid: 426 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 449 + components: + - type: Transform + pos: -6.5,9.5 + parent: 1 + - uid: 450 + components: + - type: Transform + pos: -6.5,8.5 + parent: 1 + - uid: 451 + components: + - type: Transform + pos: -6.5,7.5 + parent: 1 + - uid: 452 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 + - uid: 478 + components: + - type: Transform + pos: -5.5,9.5 + parent: 1 + - uid: 508 + components: + - type: Transform + pos: -3.5,-8.5 + parent: 1 + - uid: 545 + components: + - type: Transform + pos: -2.5,-6.5 + parent: 1 + - uid: 546 + components: + - type: Transform + pos: -2.5,-7.5 + parent: 1 + - uid: 547 + components: + - type: Transform + pos: -2.5,-8.5 + parent: 1 + - uid: 582 + components: + - type: Transform + pos: -1.5,-8.5 + parent: 1 + - uid: 590 + components: + - type: Transform + pos: -1.5,-7.5 + parent: 1 + - uid: 654 + components: + - type: Transform + pos: 2.5,-10.5 + parent: 1 + - uid: 655 + components: + - type: Transform + pos: 2.5,-11.5 + parent: 1 + - uid: 656 + components: + - type: Transform + pos: 2.5,-12.5 + parent: 1 + - uid: 670 + components: + - type: Transform + pos: 3.5,-10.5 + parent: 1 + - uid: 671 + components: + - type: Transform + pos: 3.5,-11.5 + parent: 1 + - uid: 672 + components: + - type: Transform + pos: 3.5,-12.5 + parent: 1 + - uid: 740 + components: + - type: Transform + pos: 4.5,-12.5 + parent: 1 + - uid: 864 + components: + - type: Transform + pos: 11.5,-18.5 + parent: 1 + - uid: 901 + components: + - type: Transform + pos: 12.5,-18.5 + parent: 1 + - uid: 951 + components: + - type: Transform + pos: 13.5,-18.5 + parent: 1 + - uid: 1117 + components: + - type: Transform + pos: 23.5,-17.5 + parent: 1 + - uid: 1118 + components: + - type: Transform + pos: 23.5,-18.5 + parent: 1 + - uid: 1124 + components: + - type: Transform + pos: 23.5,-4.5 + parent: 1 + - uid: 1127 + components: + - type: Transform + pos: 23.5,-7.5 + parent: 1 + - uid: 1139 + components: + - type: Transform + pos: 25.5,-4.5 + parent: 1 + - uid: 1141 + components: + - type: Transform + pos: 25.5,-6.5 + parent: 1 + - uid: 1143 + components: + - type: Transform + pos: 24.5,-5.5 + parent: 1 + - uid: 1144 + components: + - type: Transform + pos: 24.5,-6.5 + parent: 1 + - uid: 1145 + components: + - type: Transform + pos: 24.5,-7.5 + parent: 1 + - uid: 1147 + components: + - type: Transform + pos: 24.5,-16.5 + parent: 1 + - uid: 1148 + components: + - type: Transform + pos: 24.5,-17.5 + parent: 1 + - uid: 1149 + components: + - type: Transform + pos: 24.5,-18.5 + parent: 1 + - uid: 1156 + components: + - type: Transform + pos: 24.5,-4.5 + parent: 1 + - uid: 1182 + components: + - type: Transform + pos: -21.5,5.5 + parent: 1 + - uid: 1265 + components: + - type: Transform + pos: -19.5,5.5 + parent: 1 + - uid: 1284 + components: + - type: Transform + pos: -20.5,5.5 + parent: 1 + - uid: 1292 + components: + - type: Transform + pos: -23.5,-19.5 + parent: 1 + - uid: 1308 + components: + - type: Transform + pos: -22.5,-19.5 + parent: 1 + - uid: 1327 + components: + - type: Transform + pos: 14.5,-19.5 + parent: 1 + - uid: 1328 + components: + - type: Transform + pos: 13.5,-19.5 + parent: 1 + - uid: 1339 + components: + - type: Transform + pos: 14.5,-20.5 + parent: 1 + - uid: 1348 + components: + - type: Transform + pos: 13.5,-20.5 + parent: 1 + - uid: 1350 + components: + - type: Transform + pos: -7.5,-20.5 + parent: 1 + - uid: 1384 + components: + - type: Transform + pos: -7.5,-21.5 + parent: 1 + - uid: 1416 + components: + - type: Transform + pos: -6.5,-21.5 + parent: 1 + - uid: 1420 + components: + - type: Transform + pos: -8.5,-21.5 + parent: 1 + - uid: 1445 + components: + - type: Transform + pos: -7.5,-22.5 + parent: 1 + - uid: 1446 + components: + - type: Transform + pos: -8.5,-22.5 + parent: 1 + - uid: 1447 + components: + - type: Transform + pos: -9.5,-22.5 + parent: 1 +- proto: WallRockBasaltTin + entities: + - uid: 8 + components: + - type: Transform + pos: 1.5,-14.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 0.5,-14.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: -22.5,-13.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: -22.5,-14.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: -20.5,-13.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: -20.5,-14.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: -21.5,-13.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: -21.5,-14.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: -16.5,-9.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: -16.5,-10.5 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: -14.5,-10.5 + parent: 1 + - uid: 270 + components: + - type: Transform + pos: -14.5,-9.5 + parent: 1 + - uid: 271 + components: + - type: Transform + pos: -14.5,-11.5 + parent: 1 + - uid: 279 + components: + - type: Transform + pos: -15.5,-9.5 + parent: 1 + - uid: 280 + components: + - type: Transform + pos: -15.5,-10.5 + parent: 1 + - uid: 281 + components: + - type: Transform + pos: -15.5,-11.5 + parent: 1 + - uid: 358 + components: + - type: Transform + pos: -9.5,-5.5 + parent: 1 + - uid: 361 + components: + - type: Transform + pos: -9.5,13.5 + parent: 1 + - uid: 362 + components: + - type: Transform + pos: -9.5,12.5 + parent: 1 + - uid: 363 + components: + - type: Transform + pos: -9.5,11.5 + parent: 1 + - uid: 391 + components: + - type: Transform + pos: -7.5,13.5 + parent: 1 + - uid: 392 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 + - uid: 393 + components: + - type: Transform + pos: -7.5,11.5 + parent: 1 + - uid: 394 + components: + - type: Transform + pos: -8.5,-4.5 + parent: 1 + - uid: 395 + components: + - type: Transform + pos: -8.5,-5.5 + parent: 1 + - uid: 396 + components: + - type: Transform + pos: -8.5,-6.5 + parent: 1 + - uid: 403 + components: + - type: Transform + pos: -8.5,13.5 + parent: 1 + - uid: 404 + components: + - type: Transform + pos: -8.5,12.5 + parent: 1 + - uid: 405 + components: + - type: Transform + pos: -8.5,11.5 + parent: 1 + - uid: 445 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 446 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 + - uid: 447 + components: + - type: Transform + pos: -6.5,11.5 + parent: 1 + - uid: 453 + components: + - type: Transform + pos: -7.5,-4.5 + parent: 1 + - uid: 454 + components: + - type: Transform + pos: -7.5,-5.5 + parent: 1 + - uid: 455 + components: + - type: Transform + pos: -7.5,-6.5 + parent: 1 + - uid: 456 + components: + - type: Transform + pos: -7.5,-7.5 + parent: 1 + - uid: 457 + components: + - type: Transform + pos: -7.5,-8.5 + parent: 1 + - uid: 474 + components: + - type: Transform + pos: -5.5,13.5 + parent: 1 + - uid: 475 + components: + - type: Transform + pos: -5.5,12.5 + parent: 1 + - uid: 476 + components: + - type: Transform + pos: -5.5,11.5 + parent: 1 + - uid: 495 + components: + - type: Transform + pos: -4.5,13.5 + parent: 1 + - uid: 496 + components: + - type: Transform + pos: -4.5,12.5 + parent: 1 + - uid: 497 + components: + - type: Transform + pos: -4.5,11.5 + parent: 1 + - uid: 604 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 + - uid: 605 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 1 + - uid: 612 + components: + - type: Transform + pos: 0.5,-11.5 + parent: 1 + - uid: 613 + components: + - type: Transform + pos: 0.5,-12.5 + parent: 1 + - uid: 614 + components: + - type: Transform + pos: 0.5,-13.5 + parent: 1 + - uid: 622 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 623 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 628 + components: + - type: Transform + pos: 1.5,-12.5 + parent: 1 + - uid: 629 + components: + - type: Transform + pos: 1.5,-13.5 + parent: 1 + - uid: 650 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 651 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 + - uid: 657 + components: + - type: Transform + pos: 2.5,-13.5 + parent: 1 + - uid: 753 + components: + - type: Transform + pos: 6.5,-10.5 + parent: 1 + - uid: 754 + components: + - type: Transform + pos: 6.5,-11.5 + parent: 1 + - uid: 755 + components: + - type: Transform + pos: 6.5,-12.5 + parent: 1 + - uid: 756 + components: + - type: Transform + pos: 6.5,-13.5 + parent: 1 + - uid: 791 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 800 + components: + - type: Transform + pos: 7.5,-12.5 + parent: 1 + - uid: 801 + components: + - type: Transform + pos: 7.5,-13.5 + parent: 1 + - uid: 810 + components: + - type: Transform + pos: 14.5,-0.5 + parent: 1 + - uid: 812 + components: + - type: Transform + pos: 8.5,0.5 + parent: 1 + - uid: 813 + components: + - type: Transform + pos: 8.5,-0.5 + parent: 1 + - uid: 828 + components: + - type: Transform + pos: 14.5,-4.5 + parent: 1 + - uid: 829 + components: + - type: Transform + pos: 10.5,0.5 + parent: 1 + - uid: 841 + components: + - type: Transform + pos: 15.5,-4.5 + parent: 1 + - uid: 842 + components: + - type: Transform + pos: 9.5,0.5 + parent: 1 + - uid: 897 + components: + - type: Transform + pos: 13.5,0.5 + parent: 1 + - uid: 904 + components: + - type: Transform + pos: 9.5,-0.5 + parent: 1 + - uid: 934 + components: + - type: Transform + pos: 14.5,0.5 + parent: 1 + - uid: 935 + components: + - type: Transform + pos: 14.5,-5.5 + parent: 1 + - uid: 958 + components: + - type: Transform + pos: 16.5,1.5 + parent: 1 + - uid: 959 + components: + - type: Transform + pos: 16.5,0.5 + parent: 1 + - uid: 963 + components: + - type: Transform + pos: 16.5,-3.5 + parent: 1 + - uid: 964 + components: + - type: Transform + pos: 16.5,-4.5 + parent: 1 + - uid: 969 + components: + - type: Transform + pos: 15.5,0.5 + parent: 1 + - uid: 970 + components: + - type: Transform + pos: 15.5,-5.5 + parent: 1 + - uid: 974 + components: + - type: Transform + pos: 15.5,-9.5 + parent: 1 + - uid: 975 + components: + - type: Transform + pos: 15.5,-10.5 + parent: 1 + - uid: 984 + components: + - type: Transform + pos: 15.5,1.5 + parent: 1 + - uid: 996 + components: + - type: Transform + pos: 17.5,1.5 + parent: 1 + - uid: 997 + components: + - type: Transform + pos: 17.5,0.5 + parent: 1 + - uid: 1001 + components: + - type: Transform + pos: 17.5,-3.5 + parent: 1 + - uid: 1002 + components: + - type: Transform + pos: 17.5,-4.5 + parent: 1 + - uid: 1014 + components: + - type: Transform + pos: 16.5,-9.5 + parent: 1 + - uid: 1032 + components: + - type: Transform + pos: 19.5,-6.5 + parent: 1 + - uid: 1040 + components: + - type: Transform + pos: 18.5,-6.5 + parent: 1 + - uid: 1055 + components: + - type: Transform + pos: 18.5,1.5 + parent: 1 + - uid: 1056 + components: + - type: Transform + pos: 18.5,0.5 + parent: 1 + - uid: 1079 + components: + - type: Transform + pos: 19.5,-7.5 + parent: 1 +- proto: WallRockBasaltUranium + entities: + - uid: 153 + components: + - type: Transform + pos: -20.5,-17.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: -20.5,-18.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: -19.5,-17.5 + parent: 1 + - uid: 326 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 569 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 573 + components: + - type: Transform + pos: 4.5,-6.5 + parent: 1 + - uid: 596 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 599 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 601 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 619 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 639 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 640 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 647 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 652 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 653 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 1 + - uid: 669 + components: + - type: Transform + pos: 3.5,-7.5 + parent: 1 + - uid: 688 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 692 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 861 + components: + - type: Transform + pos: 11.5,-15.5 + parent: 1 + - uid: 862 + components: + - type: Transform + pos: 11.5,-16.5 + parent: 1 + - uid: 888 + components: + - type: Transform + pos: 10.5,-15.5 + parent: 1 + - uid: 898 + components: + - type: Transform + pos: 12.5,-15.5 + parent: 1 + - uid: 1026 + components: + - type: Transform + pos: 19.5,-0.5 + parent: 1 + - uid: 1027 + components: + - type: Transform + pos: 19.5,-1.5 + parent: 1 + - uid: 1028 + components: + - type: Transform + pos: 19.5,-2.5 + parent: 1 + - uid: 1035 + components: + - type: Transform + pos: 18.5,-1.5 + parent: 1 + - uid: 1057 + components: + - type: Transform + pos: 18.5,-0.5 + parent: 1 + - uid: 1066 + components: + - type: Transform + pos: 20.5,-0.5 + parent: 1 + - uid: 1067 + components: + - type: Transform + pos: 20.5,-1.5 + parent: 1 + - uid: 1068 + components: + - type: Transform + pos: 20.5,-2.5 + parent: 1 + - uid: 1069 + components: + - type: Transform + pos: 20.5,-3.5 + parent: 1 + - uid: 1075 + components: + - type: Transform + pos: 20.5,-9.5 + parent: 1 + - uid: 1076 + components: + - type: Transform + pos: 20.5,-10.5 + parent: 1 + - uid: 1080 + components: + - type: Transform + pos: 19.5,-8.5 + parent: 1 + - uid: 1081 + components: + - type: Transform + pos: 19.5,-9.5 + parent: 1 + - uid: 1169 + components: + - type: Transform + pos: 26.5,-13.5 + parent: 1 + - uid: 1170 + components: + - type: Transform + pos: 26.5,-14.5 + parent: 1 + - uid: 1171 + components: + - type: Transform + pos: 26.5,-15.5 + parent: 1 + - uid: 1190 + components: + - type: Transform + pos: 27.5,-14.5 + parent: 1 + - uid: 1191 + components: + - type: Transform + pos: 27.5,-15.5 + parent: 1 + - uid: 1294 + components: + - type: Transform + pos: -20.5,-19.5 + parent: 1 + - uid: 1297 + components: + - type: Transform + pos: -11.5,-19.5 + parent: 1 + - uid: 1298 + components: + - type: Transform + pos: -12.5,-19.5 + parent: 1 + - uid: 1300 + components: + - type: Transform + pos: -13.5,-19.5 + parent: 1 + - uid: 1305 + components: + - type: Transform + pos: -19.5,-19.5 + parent: 1 + - uid: 1374 + components: + - type: Transform + pos: -13.5,-20.5 + parent: 1 + - uid: 1375 + components: + - type: Transform + pos: -12.5,-20.5 + parent: 1 +- proto: WatermelonSeeds + entities: + - uid: 206 + components: + - type: Transform + parent: 201 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: WeaponProtoKineticAccelerator + entities: + - uid: 765 + components: + - type: Transform + pos: 14.022811,-2.3405697 + parent: 1 +- proto: WeldingFuelTankFull + entities: + - uid: 642 + components: + - type: Transform + pos: 23.5,-8.5 + parent: 1 +- proto: WoodenSupportBeam + entities: + - uid: 169 + components: + - type: Transform + pos: -16.5,3.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/sloth.yml b/Resources/Maps/Lavaland/sloth.yml new file mode 100644 index 0000000000..07b750e0c9 --- /dev/null +++ b/Resources/Maps/Lavaland/sloth.yml @@ -0,0 +1,238 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/21/2025 04:07:39 + entityCount: 25 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorBrokenWood + 2: FloorWood +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.5625,-0.546875 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAGAAAAAAABAAAAAAACAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAEAAAAAAABAAAAAAAFAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAABAAAAAAAGAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAEAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAEAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAFAAAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAGAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAAB + version: 6 + 0,-1: + ind: 0,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAACAAAAAAAGAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAADAAAAAAAFAAAAAAAGAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 51 + 0,-1: + 0: 12288 + -1,0: + 0: 136 + -1,-1: + 0: 32768 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: BaseComputerAiAccess + entities: + - uid: 19 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,1.5 + parent: 1 +- proto: Bed + entities: + - uid: 17 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 +- proto: BedsheetBrown + entities: + - uid: 18 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 +- proto: RandomArcade + entities: + - uid: 22 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 +- proto: RandomSpawner100 + entities: + - uid: 23 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 +- proto: TableWood + entities: + - uid: 21 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 +- proto: WallWood + entities: + - uid: 2 + components: + - type: Transform + pos: -1.5,2.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 +- proto: Window + entities: + - uid: 6 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,2.5 + parent: 1 +- proto: WoodDoor + entities: + - uid: 20 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 +... From 4acb92791a44ce6c66f79291c8092b1fb97625d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= <ss.adasts@gmail.com> Date: Mon, 21 Apr 2025 10:38:23 -0500 Subject: [PATCH 495/622] hotplate, kitcken grille bugfixes (#34776) * commit * cleanup --- .../Entities/Structures/Machines/grill.yml | 3 ++- .../Entities/Structures/Machines/hotplate.yml | 25 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Machines/grill.yml b/Resources/Prototypes/Entities/Structures/Machines/grill.yml index 9c4c67b951..f9e482f674 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/grill.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/grill.yml @@ -17,7 +17,7 @@ - type: ApcPowerReceiver powerLoad: 0 # off by default - type: EntityHeater - settingSound: + settingSound: path: /Audio/Weapons/click.ogg params: volume: -6 @@ -29,6 +29,7 @@ - type: PlaceableSurface - type: Machine board: ElectricGrillMachineCircuitboard + - type: Appearance - type: GenericVisualizer visuals: enum.EntityHeaterVisuals.Setting: diff --git a/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml index 3764f13591..5ef0deb154 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml @@ -1,31 +1,29 @@ # heats an entity or solution placed on it - type: entity abstract: true - parent: [ BaseMachinePowered, ConstructibleMachine ] + parent: [ BaseMachinePowered, SmallConstructibleMachine ] id: BaseHeaterMachine components: - - type: Transform - anchored: true + - type: ItemPlacer - type: Fixtures fixtures: + itemcollide: + shape: + !type:PhysShapeAabb + bounds: "-0.14,-0.05,0.15,0.25" + layer: + - HighImpassable + hard: false fix1: shape: !type:PhysShapeAabb - bounds: "-0.08,-0.35,0.15,0.25" + bounds: "-0.14,-0.05,0.15,0.25" mask: - TabletopMachineMask layer: - - Impassable - - MidImpassable - - LowImpassable - hard: false + - TabletopMachineLayer - type: ApcPowerReceiver powerLoad: 300 - - type: Appearance - - type: ContainerContainer - containers: - machine_board: !type:Container - machine_parts: !type:Container - type: entity parent: BaseHeaterMachine @@ -53,6 +51,7 @@ positionOffset: 0, 0.25 - type: Machine board: HotplateMachineCircuitboard + - type: Appearance - type: GenericVisualizer visuals: enum.SolutionHeaterVisuals.IsOn: From dfd0745db043519496aa5616ebc40fd104063434 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 15:39:29 +0000 Subject: [PATCH 496/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2cf7ccab1d..b7c08316e5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: justdie12 - changes: - - message: Added a bend version of the radiator. - type: Add - id: 7799 - time: '2025-01-11T20:03:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34251 - author: Errant changes: - message: Players are now informed in chat every time their role type changes, @@ -3903,3 +3896,12 @@ id: 8299 time: '2025-04-21T12:07:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32847 +- author: aada + changes: + - message: Hotplates and kitchen grills can now be anchored on tables. + type: Fix + - message: Hotplates and kitchen grills now collide with walls. + type: Fix + id: 8300 + time: '2025-04-21T15:38:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34776 From 04ea0b5e5a04ceb2c377b75ebcc4aa4f1b59e803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Lindert?= <lukasz.lindert@protonmail.com> Date: Mon, 21 Apr 2025 17:50:07 +0200 Subject: [PATCH 497/622] Solution drag and drop now checks if container is closed and drainable (#34683) drainable fix --- .../Fluids/EntitySystems/PuddleSystem.Transfers.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs index b821735265..e850f058a8 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Transfers.cs @@ -2,11 +2,14 @@ using Content.Shared.Chemistry.Components; using Content.Shared.DragDrop; using Content.Shared.FixedPoint; using Content.Shared.Fluids; +using Content.Shared.Nutrition.EntitySystems; namespace Content.Server.Fluids.EntitySystems; public sealed partial class PuddleSystem { + [Dependency] private readonly OpenableSystem _openable = default!; + private void InitializeTransfers() { SubscribeLocalEvent<RefillableSolutionComponent, DragDropDraggedEvent>(OnRefillableDragged); @@ -32,6 +35,12 @@ public sealed partial class PuddleSystem if (!_solutionContainerSystem.TryGetDumpableSolution((args.Target, dump, null), out var dumpableSoln, out var dumpableSolution)) return; + if (!_solutionContainerSystem.TryGetDrainableSolution(entity.Owner, out _, out _)) + return; + + if (_openable.IsClosed(entity)) + return; + bool success = true; if (dump.Unlimited) { From 60c87d11984b20566cdf4b3504f19eccc45f8d40 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 15:51:14 +0000 Subject: [PATCH 498/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b7c08316e5..b2fd7b5458 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Errant - changes: - - message: Players are now informed in chat every time their role type changes, - and can also see their current role type on the character window. - type: Add - id: 7800 - time: '2025-01-11T21:17:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33420 - author: Kontinentaldrift changes: - message: EOD locker always spawns with tools. @@ -3905,3 +3897,10 @@ id: 8300 time: '2025-04-21T15:38:23.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34776 +- author: insoPL + changes: + - message: being able to drag certain food items onto drain and chemmasters + type: Fix + id: 8301 + time: '2025-04-21T15:50:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34683 From 15f862a807d70575d192efbe6f121bc967e75805 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Mon, 21 Apr 2025 18:59:11 +0200 Subject: [PATCH 499/622] fix some datasets (#36806) --- .../Locale/en-US/datasets/corporations.ftl | 18 ++--- .../Locale/en-US/datasets/names/rollie.ftl | 74 +++++++++---------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/Resources/Locale/en-US/datasets/corporations.ftl b/Resources/Locale/en-US/datasets/corporations.ftl index 82a767faaf..19670bde8a 100644 --- a/Resources/Locale/en-US/datasets/corporations.ftl +++ b/Resources/Locale/en-US/datasets/corporations.ftl @@ -1,9 +1,9 @@ -traitor-corporations-dataset-1 = "CyberSun Industries" -traitor-corporations-dataset-2 = "Gorlex Marauders" -traitor-corporations-dataset-3 = "MI13" -traitor-corporations-dataset-4 = "Tiger Cooperative" -traitor-corporations-dataset-5 = "S.E.L.F." -traitor-corporations-dataset-6 = "Animal Rights Consortium" -traitor-corporations-dataset-7 = "Donk Corporation" -traitor-corporations-dataset-8 = "Waffle Corporation" -traitor-corporations-dataset-9 = "Interdyne Pharmaceutics" +traitor-corporations-dataset-1 = CyberSun Industries +traitor-corporations-dataset-2 = Gorlex Marauders +traitor-corporations-dataset-3 = MI13 +traitor-corporations-dataset-4 = Tiger Cooperative +traitor-corporations-dataset-5 = S.E.L.F. +traitor-corporations-dataset-6 = Animal Rights Consortium +traitor-corporations-dataset-7 = Donk Corporation +traitor-corporations-dataset-8 = Waffle Corporation +traitor-corporations-dataset-9 = Interdyne Pharmaceutics diff --git a/Resources/Locale/en-US/datasets/names/rollie.ftl b/Resources/Locale/en-US/datasets/names/rollie.ftl index c35ec7c98f..d8326f1fdd 100644 --- a/Resources/Locale/en-US/datasets/names/rollie.ftl +++ b/Resources/Locale/en-US/datasets/names/rollie.ftl @@ -1,37 +1,37 @@ -names-rollie-dataset-1 = "bifta" -names-rollie-dataset-2 = "bifter" -names-rollie-dataset-3 = "bird" -names-rollie-dataset-4 = "bloint" -names-rollie-dataset-5 = "boof" -names-rollie-dataset-6 = "boofer" -names-rollie-dataset-7 = "bomber" -names-rollie-dataset-8 = "bone" -names-rollie-dataset-9 = "bun" -names-rollie-dataset-10 = "doink" -names-rollie-dataset-11 = "doob" -names-rollie-dataset-12 = "doober" -names-rollie-dataset-13 = "doobie" -names-rollie-dataset-14 = "dutch" -names-rollie-dataset-15 = "fatty" -names-rollie-dataset-16 = "hogger" -names-rollie-dataset-17 = "hooter" -names-rollie-dataset-18 = "hootie" -names-rollie-dataset-19 = "jay" -names-rollie-dataset-20 = "jimmy" -names-rollie-dataset-21 = "juju" -names-rollie-dataset-22 = "jeebie weebie" -names-rollie-dataset-23 = "number" -names-rollie-dataset-24 = "owl" -names-rollie-dataset-25 = "phattie" -names-rollie-dataset-26 = "puffer" -names-rollie-dataset-27 = "reef" -names-rollie-dataset-28 = "reefer" -names-rollie-dataset-29 = "rollie" -names-rollie-dataset-30 = "scoobie" -names-rollie-dataset-31 = "shorty" -names-rollie-dataset-32 = "spiff" -names-rollie-dataset-33 = "spliff" -names-rollie-dataset-34 = "toke" -names-rollie-dataset-35 = "torpedo" -names-rollie-dataset-36 = "zoot" -names-rollie-dataset-37 = "zooter" +names-rollie-dataset-1 = bifta +names-rollie-dataset-2 = bifter +names-rollie-dataset-3 = bird +names-rollie-dataset-4 = bloint +names-rollie-dataset-5 = boof +names-rollie-dataset-6 = boofer +names-rollie-dataset-7 = bomber +names-rollie-dataset-8 = bone +names-rollie-dataset-9 = bun +names-rollie-dataset-10 = doink +names-rollie-dataset-11 = doob +names-rollie-dataset-12 = doober +names-rollie-dataset-13 = doobie +names-rollie-dataset-14 = dutch +names-rollie-dataset-15 = fatty +names-rollie-dataset-16 = hogger +names-rollie-dataset-17 = hooter +names-rollie-dataset-18 = hootie +names-rollie-dataset-19 = jay +names-rollie-dataset-20 = jimmy +names-rollie-dataset-21 = juju +names-rollie-dataset-22 = jeebie weebie +names-rollie-dataset-23 = number +names-rollie-dataset-24 = owl +names-rollie-dataset-25 = phattie +names-rollie-dataset-26 = puffer +names-rollie-dataset-27 = reef +names-rollie-dataset-28 = reefer +names-rollie-dataset-29 = rollie +names-rollie-dataset-30 = scoobie +names-rollie-dataset-31 = shorty +names-rollie-dataset-32 = spiff +names-rollie-dataset-33 = spliff +names-rollie-dataset-34 = toke +names-rollie-dataset-35 = torpedo +names-rollie-dataset-36 = zoot +names-rollie-dataset-37 = zooter From ae8b5c6097dceb5f6c7e87e9a2369dcb6fa60adb Mon Sep 17 00:00:00 2001 From: Hrosts <35345601+Hrosts@users.noreply.github.com> Date: Mon, 21 Apr 2025 21:16:25 +0400 Subject: [PATCH 500/622] Add rehydratable mop bucket cube, refactor the rehydratable yml (#34586) * Refactor rehydratable items * Finish main refactor * Add mop bucket cube * Move cube sprite and item size to RehydratableAnimalCube * Fix sprite attribution * Make it follow the conventions * Refactor wrapped cube, leave MonkeyCube tag only on the cube and the Syndie Sponge * Fix DehydratedSpaceCarp inheritance overwriting needed components * no need for this comment * remove whitespace Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * indentation Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Restore lost description * reorder stuff * line --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Catalog/Fills/Crates/service.yml | 2 +- .../Entities/Objects/Misc/monkeycube.yml | 35 ++- .../Objects/Specific/rehydrateable.yml | 211 ++++++++---------- .../Structures/Specific/Janitor/janicart.yml | 12 + .../Janitorial/janitorial.rsi/meta.json | 5 +- .../janitorial.rsi/mopbucket_cube.png | Bin 0 -> 231 bytes 6 files changed, 127 insertions(+), 138 deletions(-) create mode 100644 Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_cube.png diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 32cfce4628..202a0ebc29 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -7,7 +7,7 @@ - type: StorageFill contents: - id: MopItem - - id: MopBucket + - id: MopBucketCubeWrapped - id: Bucket amount: 3 - id: WetFloorSign diff --git a/Resources/Prototypes/Entities/Objects/Misc/monkeycube.yml b/Resources/Prototypes/Entities/Objects/Misc/monkeycube.yml index cf2dad1ce5..9b95d15e69 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/monkeycube.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/monkeycube.yml @@ -14,20 +14,28 @@ - type: entity parent: BaseItem - name: monkey cube + abstract: true suffix: Wrapped - id: MonkeyCubeWrapped - description: Unwrap this to get a monkey cube. + id: BaseWrappedCube components: - type: Item size: Tiny - type: SpawnItemsOnUse - items: - - id: MonkeyCube sound: path: /Audio/Effects/unwrap.ogg - type: Sprite sprite: Objects/Misc/monkeycube.rsi + +- type: entity + parent: BaseWrappedCube + name: monkey cube + id: MonkeyCubeWrapped + description: Unwrap this to get a monkey cube. + components: + - type: SpawnItemsOnUse + items: + - id: MonkeyCube + - type: Sprite state: wrapper - type: Tag tags: @@ -64,19 +72,15 @@ state: box_variant - type: entity - parent: MonkeyCubeWrapped + parent: BaseWrappedCube name: kobold cube - suffix: Wrapped id: KoboldCubeWrapped description: Unwrap this to get a kobold cube. components: - type: SpawnItemsOnUse items: - id: KoboldCube - sound: - path: /Audio/Effects/unwrap.ogg - type: Sprite - sprite: Objects/Misc/monkeycube.rsi state: wrapper_kobold - type: entity @@ -99,18 +103,7 @@ name: monkey cube suffix: Wrapped, Syndicate id: SyndicateSpongeWrapped - description: Unwrap this to get a monkey cube. components: - type: SpawnItemsOnUse items: - id: SyndicateSponge - sound: - path: /Audio/Effects/unwrap.ogg - - type: Sprite - sprite: Objects/Misc/monkeycube.rsi - state: wrapper - - type: Item - size: Tiny - - type: Tag - tags: - - MonkeyCube diff --git a/Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml b/Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml index 26a0df1a00..52a730f773 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml @@ -1,30 +1,16 @@ - type: entity parent: BaseItem - id: MonkeyCube - name: monkey cube - description: Just add water! + id: RehydratableItem + abstract: true components: - type: Item size: Tiny - type: SolutionContainerManager solutions: cube: - maxVol: 11 # needs room for water - reagents: - - ReagentId: Nutriment - Quantity: 10 - - type: Food - solution: cube - - type: FlavorProfile - flavors: - - chewy - - horrible - - compressed-meat + maxVol: 1 # needs room for water - type: RefillableSolution solution: cube - - type: Sprite - sprite: Objects/Misc/monkeycube.rsi - state: cube - type: Reactive reactions: - reagents: [Water] @@ -33,8 +19,6 @@ - !type:AddToSolutionReaction solution: cube - type: Rehydratable - possibleSpawns: - - MobMonkey - type: CollisionWake enabled: false - type: Fixtures @@ -46,7 +30,7 @@ density: 5 mask: - ItemMask - rehydrate: + rehydrate: # needed to react to fire extinguishers shape: !type:PhysShapeAabb bounds: "-0.3,-0.3,0.3,0.3" @@ -55,7 +39,49 @@ - LowImpassable - type: entity - parent: MonkeyCube + parent: RehydratableItem + id: RehydratableAnimalCube + description: Just add water! + abstract: true + components: + - type: Sprite + sprite: Objects/Misc/monkeycube.rsi + state: cube + - type: SolutionContainerManager + solutions: + cube: + maxVol: 19 # needs 1u room for water + reagents: # equals one piece of raw meat, ideally should vary depending on the animal type, but idk how to link this to biomass costs + - ReagentId: UncookedAnimalProteins + Quantity: 9 + - ReagentId: Fat + Quantity: 9 + - type: Food + solution: cube + - type: FlavorProfile + flavors: + - chewy + - horrible + - compressed-meat + - type: Tag + tags: + - Meat + +- type: entity + parent: RehydratableAnimalCube + id: MonkeyCube + name: monkey cube + components: + - type: Rehydratable + possibleSpawns: + - MobMonkey + - type: Tag + tags: + - Meat + - MonkeyCube + +- type: entity + parent: RehydratableAnimalCube id: KoboldCube name: kobold cube components: @@ -64,7 +90,7 @@ - MobKobold - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: CowCube name: cow cube components: @@ -73,7 +99,7 @@ - MobCow - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: GoatCube name: goat cube components: @@ -82,7 +108,7 @@ - MobGoat - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: MothroachCube name: mothroach cube components: @@ -91,7 +117,7 @@ - MobMothroach - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: MouseCube name: mouse cube components: @@ -100,7 +126,7 @@ - MobMouse - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: CockroachCube name: cockroach cube description: Just add wa- OH GOD! @@ -110,17 +136,28 @@ - MobCockroach - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: SpaceCarpCube name: carp cube description: Just add water! At your own risk. components: + - type: SolutionContainerManager + solutions: + cube: + maxVol: 24 # needs 1u room for water + reagents: # equals one piece of raw meat - plus a deadly toxin! + - ReagentId: UncookedAnimalProteins + Quantity: 9 + - ReagentId: Fat + Quantity: 9 + - ReagentId: CarpoToxin + Quantity: 5 - type: Rehydratable possibleSpawns: - MobCarp - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: SpaceTickCube name: tick cube description: Just add water! At your own risk. @@ -130,18 +167,11 @@ - MobTick - type: entity - parent: MonkeyCube + parent: RehydratableAnimalCube id: AbominationCube name: abomination cube description: Just add blood! components: - - type: SolutionContainerManager - solutions: - cube: - maxVol: 10 # needs room for more blood - reagents: - - ReagentId: Blood - Quantity: 9 - type: Reactive reactions: - reagents: [Blood] @@ -151,49 +181,31 @@ solution: cube - type: Rehydratable catalyst: Blood # blood is fuel - catalystMinimum: 10 possibleSpawns: - MobAbomination +# It inherits FoodComponent from PlushieCarp, but is de-facto inedible +# PlushieCarp has requiresSpecialDigestion:true, and this one is not whitelisted anywhere, so it behaves like it's not edible - type: entity - parent: [PlushieCarp, BaseSyndicateContraband] + parent: [PlushieCarp, RehydratableItem, BaseSyndicateContraband] id: DehydratedSpaceCarp name: dehydrated space carp description: Looks like a plush toy carp, but just add water and it becomes a real-life space carp! components: - type: SolutionContainerManager solutions: - plushie: - maxVol: 11 # needs room for water - reagents: - - ReagentId: Nutriment #contains nutriment like other dehydrated animals, but isn't edible? Who is grinding dehydrated carp to eat them?? - Quantity: 10 - - type: RefillableSolution - solution: plushie - - type: Reactive - reactions: - - reagents: [Water] - methods: [Touch, Ingestion, Injection] - effects: - - !type:AddToSolutionReaction - solution: plushie - - type: Rehydratable - possibleSpawns: - - MobCarp - - type: CollisionWake - enabled: false - - type: Physics - bodyType: KinematicController - - type: Fixtures + cube: + maxVol: 1 # needs room for water + - type: Fixtures # BaseItem from PlushieCarp overrides fixtures, making carp not react to extinguishers fixtures: fix1: shape: !type:PhysShapeAabb bounds: "-0.3,-0.3,0.3,0.3" - density: 15 + density: 5 mask: - ItemMask - rehydrate: + rehydrate: # needed to react to fire extinguishers shape: !type:PhysShapeAabb bounds: "-0.3,-0.3,0.3,0.3" @@ -206,45 +218,19 @@ successString: petting-success-dehydrated-carp failureString: petting-failure-dehydrated-carp - type: EmitSoundOnUse - handle: false - sound: - path: /Audio/Effects/bite.ogg + handle: false # have to make it inedible because this causes petting and chewing trigger together + - type: Rehydratable + possibleSpawns: + - MobCarp + - type: Tag # overwriting PlushieCarp tags to remove ClothMade and Payload + tags: + - PlushieCarp -- type: entity #why is this all redefined down here as a parent of base object instead of just being parented to monkeycube?? TODO: Fix this shit - parent: BaseItem +- type: entity + parent: MonkeyCube id: SyndicateSponge - name: monkey cube suffix: Syndicate - description: Just add water! components: - - type: Item - size: Tiny - - type: SolutionContainerManager - solutions: - cube: - maxVol: 11 # needs room for water - reagents: - - ReagentId: Nutriment - Quantity: 10 - - type: Food - solution: cube - - type: FlavorProfile - flavors: - - chewy - - horrible - - compressed-meat - - type: RefillableSolution - solution: cube - - type: Sprite - sprite: Objects/Misc/monkeycube.rsi - state: cube - - type: Reactive - reactions: - - reagents: [Water] - methods: [Touch, Ingestion, Injection] - effects: - - !type:AddToSolutionReaction - solution: cube - type: Rehydratable possibleSpawns: - MobCarpHolo @@ -256,21 +242,16 @@ - MobPurpleSnake - MobKangarooSpace - MobTick - - type: CollisionWake - enabled: false - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.3,-0.3,0.3,0.3" - density: 5 - mask: - - ItemMask - rehydrate: - shape: - !type:PhysShapeAabb - bounds: "-0.3,-0.3,0.3,0.3" - hard: false - layer: - - LowImpassable + +- type: entity + parent: RehydratableItem + id: MopBucketCube + name: mop bucket cube + description: Just add water! And then more water! + components: + - type: Sprite + sprite: Objects/Specific/Janitorial/janitorial.rsi + state: mopbucket_cube + - type: Rehydratable + possibleSpawns: + - MopBucket diff --git a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml index d74fe8b0f1..c095951d96 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml @@ -125,6 +125,18 @@ - ReagentId: Water Quantity: 600 +- type: entity + parent: BaseWrappedCube + name: mop bucket cube + id: MopBucketCubeWrapped + description: Unwrap this to get a mop bucket cube. + components: + - type: SpawnItemsOnUse + items: + - id: MopBucketCube + - type: Sprite + state: wrapper + # Janicart - type: entity name: janitorial trolley diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json index 4f7a1e7772..e4604b165f 100644 --- a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Janitorial/janitorial.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, mopbucket_shark_* by Psychpsyo, mopbucket_carpplush adapted by Psychpsyo from tgstation carpplush at commit https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428, mopbucket_shark_* by Psychpsyo, mopbucket_carpplush adapted by Psychpsyo from tgstation carpplush at commit https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432, mopbucket_cube is monkey cube taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/9c980cb9bc84d07b1c210c5447798af525185f80/icons/obj/food.dmi and modified by Hrosts", "size": { "x": 32, "y": 32 @@ -37,6 +37,9 @@ { "name": "mopbucket_carpplush" }, + { + "name": "mopbucket_cube" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_cube.png b/Resources/Textures/Objects/Specific/Janitorial/janitorial.rsi/mopbucket_cube.png new file mode 100644 index 0000000000000000000000000000000000000000..7fba6549bd86f1d94d89ac800711663389a61fa6 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) zj5kl})Pqzedj$D1FjT2AFf_C<F#G}vHN0S8C^cYUc$L7wU^Rn*LA+qju0R{01b=`} zh%1m@)WdLS5yQE)Y!8pBKmGA-DNu;9B*-tA!Qt7BG$6;;)5S5w;`G}~8-;)_VY=Y( z|NrdnSxYyvB|g!;XX*AlP)V=2P5IVUp@L48!~^S?Z^>FLViRI{v(V-Lq3tuxyBPW= T+;;o~G>E~|)z4*}Q$iB}X=F(8 literal 0 HcmV?d00001 From 22dcd52bf3f7be3e3363f326ef45079460bc557b Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 17:17:31 +0000 Subject: [PATCH 501/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b2fd7b5458..126a603282 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kontinentaldrift - changes: - - message: EOD locker always spawns with tools. - type: Tweak - id: 7801 - time: '2025-01-12T16:38:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34394 - author: SlimSlam changes: - message: News Room @@ -3904,3 +3897,11 @@ id: 8301 time: '2025-04-21T15:50:07.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34683 +- author: Hrosts + changes: + - message: Added rehydratable mop bucket cube, replacing the big and unwieldy yellow + bucket in the janitorial supplies crate. + type: Add + id: 8302 + time: '2025-04-21T17:16:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34586 From b3725ef85542fb64e4bb439c439c4251a294ba62 Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Tue, 22 Apr 2025 05:24:28 +1200 Subject: [PATCH 502/622] Increase thief to player ratio (#36531) * reduce max number of traitors, increase thief to player ratio * revert traitor max back to 8 --- Resources/Prototypes/GameRules/subgamemodes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/GameRules/subgamemodes.yml b/Resources/Prototypes/GameRules/subgamemodes.yml index ef80a48cef..cb764d9787 100644 --- a/Resources/Prototypes/GameRules/subgamemodes.yml +++ b/Resources/Prototypes/GameRules/subgamemodes.yml @@ -20,7 +20,7 @@ definitions: - prefRoles: [ Thief ] max: 3 - playerRatio: 15 + playerRatio: 20 lateJoinAdditional: true allowNonHumans: true multiAntagSetting: NotExclusive From 6f27a9ec74d5b0dc74f9212d89daffadeb65f8fc Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 17:25:35 +0000 Subject: [PATCH 503/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 126a603282..abea63b249 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: SlimSlam - changes: - - message: News Room - type: Add - id: 7802 - time: '2025-01-12T23:32:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34408 - author: Deerstop changes: - message: Improved the readability of the manual valve sprite. @@ -3905,3 +3898,10 @@ id: 8302 time: '2025-04-21T17:16:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34586 +- author: K-Dynamic + changes: + - message: Increased ratio of crew to thieves from 15 to 20. + type: Tweak + id: 8303 + time: '2025-04-21T17:24:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36531 From cc80f8d7820f4c38bf5ff6a52510cc4a0ef247a8 Mon Sep 17 00:00:00 2001 From: T <theo75cg@gmail.com> Date: Mon, 21 Apr 2025 18:46:33 +0100 Subject: [PATCH 504/622] Added a semi-functional genderfluid pin. (#35854) * Added a semi-function GenderfluidPin * Update pins.yml fix bug * Fix meta.json under the newly merged "fix as you go" policy * Update pin description --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- .../Catalog/VendingMachines/Inventories/pride.yml | 1 + .../Prototypes/Entities/Clothing/Neck/pins.yml | 11 +++++++++++ .../Markers/Spawners/Random/maintenance.yml | 1 + .../Loadouts/Miscellaneous/trinkets.yml | 6 ++++++ Resources/Prototypes/Loadouts/loadout_groups.yml | 1 + .../Neck/Misc/pins.rsi/fluid-equipped-NECK.png | Bin 0 -> 333 bytes .../Clothing/Neck/Misc/pins.rsi/fluid.png | Bin 0 -> 291 bytes .../Clothing/Neck/Misc/pins.rsi/meta.json | 9 ++++++++- 8 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/Neck/Misc/pins.rsi/fluid-equipped-NECK.png create mode 100644 Resources/Textures/Clothing/Neck/Misc/pins.rsi/fluid.png diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml index 509104ecf5..92057ab21c 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/pride.yml @@ -15,6 +15,7 @@ ClothingNeckPluralPin: 3 ClothingNeckOmnisexualPin: 3 ClothingNeckGenderqueerPin: 3 + ClothingNeckGenderfluidPin: 3 ClothingNeckTransPin: 3 ClothingNeckAutismPin: 3 ClothingNeckGoldAutismPin: 3 diff --git a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml index bd54707fe1..e579ec38fb 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml @@ -166,6 +166,17 @@ - type: Clothing equippedPrefix: gender +- type: entity + parent: ClothingNeckPinBase + id: ClothingNeckGenderfluidPin + name: genderfluid pin + description: be gender, be fluid + components: + - type: Sprite + state: fluid + - type: Clothing + equippedPrefix: fluid + - type: entity parent: ClothingNeckPinBase id: ClothingNeckTransPin diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index f701933f70..4f1315ce1d 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -155,6 +155,7 @@ - id: ClothingNeckPluralPin - id: ClothingNeckOmnisexualPin - id: ClothingNeckGenderqueerPin + - id: ClothingNeckGenderfluidPin - id: ClothingNeckTransPin - id: ClothingNeckAutismPin - id: ClothingNeckGoldAutismPin diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml b/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml index 99dbedd456..e1d45e4784 100644 --- a/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml +++ b/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml @@ -184,6 +184,12 @@ back: - ClothingNeckGenderqueerPin +- type: loadout + id: ClothingNeckGenderfluidPin + storage: + back: + - ClothingNeckGenderfluidPin + - type: loadout id: ClothingNeckTransPin storage: diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index 987affe13d..04b11056f3 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -32,6 +32,7 @@ - ClothingNeckPluralPin - ClothingNeckOmnisexualPin - ClothingNeckGenderqueerPin + - ClothingNeckGenderfluidPin - ClothingNeckTransPin - ClothingNeckAutismPin - ClothingNeckGoldAutismPin diff --git a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/fluid-equipped-NECK.png b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/fluid-equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..eb84427391a9e8e43532875bd6089b9c530b21d9 GIT binary patch literal 333 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU=;CmaSW-5dpmU_=b;3VmiU$> zBH4}`HWaaJ6gFypoFbDh@aBl%8XcB{Q98l~d>`c-AJ<AgD60FuH^TMPa<6~CnHeM| z%wbTU5W`^C1fs$0hEMg4|Nh9l{%zj&)@D{&ZhA=J!^`ii`1&KS%#N4I|NUss%3dA4 zJvJrDn<HHRS04R+N%Z+m#u>Xd{HiVMW_0jjU_RpT_L0GXJfp%y9s%a9-G>==pFGlP z=)iMDkB|9{ny~mW2E%~e7Cakf`@~34SFvCI0r?kGL>*5(%6kP2CI(MeKbLh*2~7a2 C`h?E_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/fluid.png b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/fluid.png new file mode 100644 index 0000000000000000000000000000000000000000..e98ca3395aab803e31f1eda7a62d11af492e9a35 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ7oIMTArbD$DG~_>EDn4#?y*WR zVR3T?5^Z@Le{Ow!U|*zp>e(`fY3Ux<T5=3uZ}m?w|8wn8^X}G=_6ctq)cxljsMXWe z<=yt<<>loC>?cl~n2@68*_Al$u#VgM6A65ZM+H?Z6I!oM{J;Ob!Nau<k)i(#U1T;Z z-ilcy+LR+(z|L^@!~Evv=Em-B?re>k-`{#49`Bb|uv}#8w#7+B`d}Xe;|ym9v1W#q z(<VO&n!&tej`V|_4ZaRyI)7dtPTui*-rHP-lff#QZhYk_?F~mfw@Rdm-Q+tkThwEM kOzD9Pj-EC!!NB0g?VuQ0D(VaLGlQqApUXO@geC?C0A6=>fB*mh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json index c1ec904c05..d6c4a337c0 100644 --- a/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json +++ b/Resources/Textures/Clothing/Neck/Misc/pins.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "PixelTK leaves his mark on upstream, BackeTako made the gay, autism pins by Terraspark, omnisexual pin by juliangiebel, genderqueer by centcomofficer24, ally by FairlySadPanda, aroace by momochitters, plural by CubixThree", + "copyright": "PixelTK leaves his mark on upstream, BackeTako made the gay, autism pins by Terraspark, omnisexual pin by juliangiebel, genderqueer and genderfluid by centcomofficer24, ally by FairlySadPanda, aroace by momochitters, plural by CubixThree", "size": { "x": 32, "y": 32 @@ -125,6 +125,13 @@ { "name": "gender-equipped-NECK", "directions": 4 + }, + { + "name": "fluid" + }, + { + "name": "fluid-equipped-NECK", + "directions": 4 } ] } From 44133075e4b9ee76d98cd2d74d402ee070b3265b Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 17:47:40 +0000 Subject: [PATCH 505/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index abea63b249..f6f14461c4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Deerstop - changes: - - message: Improved the readability of the manual valve sprite. - type: Tweak - id: 7803 - time: '2025-01-13T07:07:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34378 - author: JustinWinningham changes: - message: Anomalies no longer block players or APES (or other objects) from passing @@ -3905,3 +3898,10 @@ id: 8303 time: '2025-04-21T17:24:28.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36531 +- author: centcomofficer24 + changes: + - message: Added a genderfluid pin! + type: Add + id: 8304 + time: '2025-04-21T17:46:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35854 From 13e546a0a683bc975d6d9e0a5c64390c87e8de6e Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Mon, 21 Apr 2025 19:54:51 +0200 Subject: [PATCH 506/622] Station AI Name Identifier (#36801) init --- Resources/Prototypes/Entities/Mobs/Player/silicon.yml | 2 ++ Resources/Prototypes/name_identifier_groups.yml | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 0769972512..4e532d9377 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -446,6 +446,8 @@ - type: StartingMindRole mindRole: "MindRoleSiliconBrain" silent: true + - type: NameIdentifier + group: StationAi # Hologram projection that the AI's eye tracks. - type: entity diff --git a/Resources/Prototypes/name_identifier_groups.yml b/Resources/Prototypes/name_identifier_groups.yml index f175058e9a..ab8c9f90ac 100644 --- a/Resources/Prototypes/name_identifier_groups.yml +++ b/Resources/Prototypes/name_identifier_groups.yml @@ -29,6 +29,12 @@ minValue: 1000 maxValue: 9999 +- type: nameIdentifierGroup + id: StationAi + prefix: AI + minValue: 100 + maxValue: 999 + - type: nameIdentifierGroup id: XenoArtifactNode minValue: 0 From e8ee73dd3341e96dc2496ddf2bdb19f856deba87 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 17:55:57 +0000 Subject: [PATCH 507/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f6f14461c4..24a5245349 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: JustinWinningham - changes: - - message: Anomalies no longer block players or APES (or other objects) from passing - through them - type: Tweak - - message: Players can no longer move anomalies with unanchored furniture, closets, - etc. - type: Fix - id: 7804 - time: '2025-01-13T10:06:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34280 - author: zHonys changes: - message: Items with collisions (like mousetraps) won't kept doors form opening @@ -3905,3 +3894,10 @@ id: 8304 time: '2025-04-21T17:46:34.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35854 +- author: ScarKy0 + changes: + - message: Station AI now has a name identifier appended after their name. + type: Tweak + id: 8305 + time: '2025-04-21T17:54:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36801 From dd308c6d2d514f072980e382384a4c05cb4b6d30 Mon Sep 17 00:00:00 2001 From: Verm <32827189+Vermidia@users.noreply.github.com> Date: Mon, 21 Apr 2025 13:25:22 -0500 Subject: [PATCH 508/622] Makes EventRole Ids properly set ID names. (#28958) * Add id binding system * Change so it activates when added too * Add to eventhumanoid * Add PDA binding, try to fix some things * Still not fixed, PDA is working right * Move to server, add on mind instead * Implement suggestions * Fix things * Finish review stuff * Messed up cluwne * Remove after only changing id too --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- .../Access/Components/IdBindComponent.cs | 14 +++++ Content.Server/Access/Systems/IdBindSystem.cs | 51 +++++++++++++++++++ .../RandomHumanoidSettingsPrototype.cs | 2 +- .../Entities/Mobs/Player/humanoid.yml | 4 +- 4 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 Content.Server/Access/Components/IdBindComponent.cs create mode 100644 Content.Server/Access/Systems/IdBindSystem.cs diff --git a/Content.Server/Access/Components/IdBindComponent.cs b/Content.Server/Access/Components/IdBindComponent.cs new file mode 100644 index 0000000000..9fcc7e2d56 --- /dev/null +++ b/Content.Server/Access/Components/IdBindComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Access.Components; + +[RegisterComponent] +public sealed partial class IdBindComponent : Component +{ + /// <summary> + /// If true, also tries to get the PDA and set the owner to the entity + /// </summary> + [DataField] + public bool BindPDAOwner = true; +} + diff --git a/Content.Server/Access/Systems/IdBindSystem.cs b/Content.Server/Access/Systems/IdBindSystem.cs new file mode 100644 index 0000000000..275a96f4f3 --- /dev/null +++ b/Content.Server/Access/Systems/IdBindSystem.cs @@ -0,0 +1,51 @@ +using Content.Server.Access.Components; +using Content.Server.PDA; +using Content.Shared.Inventory; +using Content.Shared.Mind.Components; +using Content.Shared.PDA; +using Content.Shared.Roles; + +namespace Content.Server.Access.Systems; + +public sealed class IdBindSystem : EntitySystem +{ + [Dependency] private readonly IdCardSystem _cardSystem = default!; + [Dependency] private readonly PdaSystem _pdaSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + + public override void Initialize() + { + base.Initialize(); + //Activate on mind being added + SubscribeLocalEvent<IdBindComponent, MindAddedMessage>(TryBind); + } + + private void TryBind(Entity<IdBindComponent> ent, ref MindAddedMessage args) + { + if (!_cardSystem.TryFindIdCard(ent, out var cardId)) + return; + + var data = MetaData(ent); + + _cardSystem.TryChangeFullName(cardId, data.EntityName, cardId); + + if (!ent.Comp.BindPDAOwner) + { + //Remove after running once + RemCompDeferred<IdBindComponent>(ent); + return; + } + + //Get PDA from main slot and set us as owner + if (!_inventory.TryGetSlotEntity(ent, "id", out var uPda)) + return; + + if (!TryComp<PdaComponent>(uPda, out var pDA)) + return; + + _pdaSystem.SetOwner(uPda.Value, pDA, ent, data.EntityName); + //Remove after running once + RemCompDeferred<IdBindComponent>(ent); + } +} + diff --git a/Content.Shared/Humanoid/Prototypes/RandomHumanoidSettingsPrototype.cs b/Content.Shared/Humanoid/Prototypes/RandomHumanoidSettingsPrototype.cs index e31289db1e..3c350de68f 100644 --- a/Content.Shared/Humanoid/Prototypes/RandomHumanoidSettingsPrototype.cs +++ b/Content.Shared/Humanoid/Prototypes/RandomHumanoidSettingsPrototype.cs @@ -21,7 +21,7 @@ public sealed partial class RandomHumanoidSettingsPrototype : IPrototype, IInher /// <summary> /// Whether the humanoid's name should take from the randomized profile or not. /// </summary> - [DataField("randomizeName")] + [DataField] public bool RandomizeName { get; private set; } = true; /// <summary> diff --git a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml index f92cf40e2e..a2b516d9e5 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml @@ -6,10 +6,12 @@ - type: RandomHumanoidAppearance randomizeName: false - type: GhostTakeoverAvailable + - type: IdBind - type: randomHumanoidSettings id: EventHumanoidMindShielded parent: EventHumanoid + randomizeName: false components: - type: MindShield - type: AntagImmune @@ -43,7 +45,6 @@ - type: randomHumanoidSettings id: DeathSquad parent: EventHumanoidCentcomm - randomizeName: false components: - type: GhostRole name: ghost-role-information-Death-Squad-name @@ -84,7 +85,6 @@ - type: randomHumanoidSettings id: ERTLeader parent: EventHumanoidCentcomm - randomizeName: false components: - type: GhostRole name: ghost-role-information-ert-leader-name From ded94ebc3d6e5fa5086b48b052c63793959a6eb1 Mon Sep 17 00:00:00 2001 From: J <billsmith116@gmail.com> Date: Mon, 21 Apr 2025 18:40:31 +0000 Subject: [PATCH 509/622] Various sharedsystem spring cleaning (#36200) * Various shared system warnings cleanup * More shared system warnings cleanup * Rearranging changes * Using correct transform for unbuckle * Small changes * Revert buckle change * Update Content.Shared/Ghost/SharedGhostSystem.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Content.Shared/Actions/SharedActionsSystem.cs | 5 ++--- Content.Shared/Ensnaring/SharedEnsnareableSystem.cs | 4 ---- Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs | 6 ++++-- Content.Shared/Interaction/SharedInteractionSystem.cs | 2 +- Content.Shared/Magic/SharedMagicSystem.cs | 8 ++++---- Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs | 2 +- Content.Shared/Tabletop/SharedTabletopSystem.cs | 2 +- .../Teleportation/Systems/SharedPortalSystem.cs | 2 +- 8 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index e4aa44cf54..174f2c7881 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -517,13 +517,12 @@ public abstract class SharedActionsSystem : EntitySystem // even if we don't check for obstructions, we may still need to check the range. var xform = Transform(user); - if (xform.MapID != coords.GetMapId(EntityManager)) + if (xform.MapID != _transformSystem.GetMapId(coords)) return false; if (range <= 0) return true; - - return coords.InRange(EntityManager, _transformSystem, Transform(user).Coordinates, range); + return _transformSystem.InRange(coords, xform.Coordinates, range); } return _interactionSystem.InRangeUnobstructed(user, coords, range: range); diff --git a/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs b/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs index dacb773470..d15e80a0e3 100644 --- a/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs +++ b/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs @@ -1,7 +1,4 @@ -using System.Linq; using Content.Shared.Alert; -using Content.Shared.Body.Part; -using Content.Shared.Body.Systems; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; @@ -31,7 +28,6 @@ public abstract class SharedEnsnareableSystem : EntitySystem [Dependency] private readonly MovementSpeedModifierSystem _speedModifier = default!; [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedBodySystem _body = default!; [Dependency] protected readonly SharedContainerSystem Container = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index a3f62fefe8..f7884e97c4 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -38,6 +38,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly ISerializationManager _serManager = default!; [Dependency] private readonly MarkingManager _markingManager = default!; + [Dependency] private readonly GrammarSystem _grammarSystem = default!; [ValidatePrototypeId<SpeciesPrototype>] public const string DefaultSpecies = "Human"; @@ -156,8 +157,9 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem targetHumanoid.MarkingSet = new(sourceHumanoid.MarkingSet); targetHumanoid.Gender = sourceHumanoid.Gender; + if (TryComp<GrammarComponent>(target, out var grammar)) - grammar.Gender = sourceHumanoid.Gender; + _grammarSystem.SetGender((target, grammar), sourceHumanoid.Gender); Dirty(target, targetHumanoid); } @@ -438,7 +440,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem humanoid.Gender = profile.Gender; if (TryComp<GrammarComponent>(uid, out var grammar)) { - grammar.Gender = profile.Gender; + _grammarSystem.SetGender((uid, grammar), profile.Gender); } humanoid.Age = profile.Age; diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 494fbdf032..f2ae9fd68e 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -1319,7 +1319,7 @@ namespace Content.Shared.Interaction if (Deleted(target)) return false; - if (!_containerSystem.TryGetContainingContainer((target, null, null), out var container)) + if (!_containerSystem.TryGetContainingContainer(target, out var container)) return false; var wearer = container.Owner; diff --git a/Content.Shared/Magic/SharedMagicSystem.cs b/Content.Shared/Magic/SharedMagicSystem.cs index 9a44407e91..5bf1fee090 100644 --- a/Content.Shared/Magic/SharedMagicSystem.cs +++ b/Content.Shared/Magic/SharedMagicSystem.cs @@ -279,14 +279,14 @@ public abstract class SharedMagicSystem : EntitySystem var userVelocity = _physics.GetMapLinearVelocity(ev.Performer); // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map. - var fromMap = fromCoords.ToMap(EntityManager, _transform); + var fromMap = _transform.ToMapCoordinates(fromCoords); var spawnCoords = _mapManager.TryFindGridAt(fromMap, out var gridUid, out _) - ? fromCoords.WithEntityId(gridUid, EntityManager) + ? _transform.WithEntityId(fromCoords, gridUid) : new(_mapManager.GetMapEntityId(fromMap.MapId), fromMap.Position); var ent = Spawn(ev.Prototype, spawnCoords); - var direction = toCoords.ToMapPos(EntityManager, _transform) - - spawnCoords.ToMapPos(EntityManager, _transform); + var direction = _transform.ToMapCoordinates(toCoords).Position - + _transform.ToMapCoordinates(spawnCoords).Position; _gunSystem.ShootProjectile(ent, direction, userVelocity, ev.Performer, ev.Performer); } // End Projectile Spells diff --git a/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs b/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs index b4034686d9..b9fc68330e 100644 --- a/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs +++ b/Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs @@ -181,7 +181,7 @@ public abstract partial class SharedShuttleSystem : EntitySystem // Just checks if any grids inside of a buffer range at the target position. _grids.Clear(); - var mapCoordinates = coordinates.ToMap(EntityManager, XformSystem); + var mapCoordinates = XformSystem.ToMapCoordinates(coordinates); var ourPos = Maps.GetGridPosition((shuttleUid, shuttlePhysics, shuttleXform)); diff --git a/Content.Shared/Tabletop/SharedTabletopSystem.cs b/Content.Shared/Tabletop/SharedTabletopSystem.cs index afa77a643a..7a2540b11d 100644 --- a/Content.Shared/Tabletop/SharedTabletopSystem.cs +++ b/Content.Shared/Tabletop/SharedTabletopSystem.cs @@ -42,7 +42,7 @@ namespace Content.Shared.Tabletop // Move the entity and dirty it (we use the map ID from the entity so noone can try to be funny and move the item to another map) var transform = EntityManager.GetComponent<TransformComponent>(moved); Transforms.SetParent(moved, transform, _mapMan.GetMapEntityId(transform.MapID)); - Transforms.SetLocalPositionNoLerp(transform, msg.Coordinates.Position); + Transforms.SetLocalPositionNoLerp(moved, msg.Coordinates.Position, transform); } private void OnDraggingPlayerChanged(TabletopDraggingPlayerChangedEvent msg, EntitySessionEventArgs args) diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index 262753307f..5ef7619ceb 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using Content.Shared.Ghost; using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Pulling.Systems; From 9e39f99a929e3a0fba42670e8eacc689c8e68935 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Mon, 21 Apr 2025 22:15:20 +0200 Subject: [PATCH 510/622] Fix some locale strings and make some code for them looks better (#32003) * Fix a lot locale strings add functions using fix identity for meat spike and creaming * comma * fixes for fixes * yeah * fuck --- .../EntitySystems/KitchenSpikeSystem.cs | 13 +++++++++--- .../Nutrition/EntitySystems/CreamPieSystem.cs | 10 ++++++++-- Content.Shared/Cuffs/SharedCuffableSystem.cs | 3 ++- .../Strip/SharedStrippableSystem.cs | 20 +++++++++++++++---- .../cuffs/components/handcuff-component.ftl | 4 ++-- .../components/kitchen-spike-component.ftl | 6 +++--- .../components/cream-pied-component.ftl | 2 +- .../nutrition/components/food-component.ftl | 6 +++--- .../en-US/strip/strippable-component.ftl | 4 ++-- 9 files changed, 47 insertions(+), 21 deletions(-) diff --git a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs index 6f28331ade..4ed05a3f16 100644 --- a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs @@ -74,10 +74,13 @@ namespace Content.Server.Kitchen.EntitySystems return; _suicide.ApplyLethalDamage((args.Victim, damageableComponent), "Piercing"); - var othersMessage = Loc.GetString("comp-kitchen-spike-suicide-other", ("victim", args.Victim)); + var othersMessage = Loc.GetString("comp-kitchen-spike-suicide-other", + ("victim", Identity.Entity(args.Victim, EntityManager)), + ("this", entity)); _popupSystem.PopupEntity(othersMessage, args.Victim, Filter.PvsExcept(args.Victim), true); - var selfMessage = Loc.GetString("comp-kitchen-spike-suicide-self"); + var selfMessage = Loc.GetString("comp-kitchen-spike-suicide-self", + ("this", entity)); _popupSystem.PopupEntity(selfMessage, args.Victim, args.Victim); args.Handled = true; } @@ -160,7 +163,11 @@ namespace Content.Server.Kitchen.EntitySystems UpdateAppearance(uid, null, component); - _popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-kill", ("user", Identity.Entity(userUid, EntityManager)), ("victim", victimUid)), uid, PopupType.LargeCaution); + _popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-kill", + ("user", Identity.Entity(userUid, EntityManager)), + ("victim", Identity.Entity(victimUid, EntityManager)), + ("this", uid)), + uid, PopupType.LargeCaution); _transform.SetCoordinates(victimUid, Transform(uid).Coordinates); // THE WHAT? diff --git a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs index cdcfcc1f21..108280f088 100644 --- a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs @@ -93,13 +93,19 @@ namespace Content.Server.Nutrition.EntitySystems protected override void CreamedEntity(EntityUid uid, CreamPiedComponent creamPied, ThrowHitByEvent args) { - _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message", ("thrower", args.Thrown)), uid, args.Target); + _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message", + ("thrower", Identity.Entity(args.Thrown, EntityManager))), + uid, args.Target); + var otherPlayers = Filter.Empty().AddPlayersByPvs(uid); if (TryComp<ActorComponent>(args.Target, out var actor)) { otherPlayers.RemovePlayer(actor.PlayerSession); } - _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message-others", ("owner", Identity.Name(uid, EntityManager)), ("thrower", args.Thrown)), uid, otherPlayers, false); + _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message-others", + ("owner", Identity.Entity(uid, EntityManager)), + ("thrower", Identity.Entity(args.Thrown, EntityManager))), + uid, otherPlayers, false); } private void OnRejuvenate(Entity<CreamPiedComponent> entity, ref RejuvenateEvent args) diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 99a4dad510..9c38667399 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -381,7 +381,8 @@ namespace Content.Shared.Cuffs _popup.PopupClient(Loc.GetString("handcuff-component-cuff-interrupt-message", ("targetName", Identity.Name(target, EntityManager, user))), user, user); _popup.PopupClient(Loc.GetString("handcuff-component-cuff-interrupt-other-message", - ("otherName", Identity.Name(user, EntityManager, target))), target, target); + ("otherName", Identity.Name(user, EntityManager, target)), + ("otherEnt", user)), target, target); } } } diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index d851f46060..2b971ae7bb 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -210,7 +210,10 @@ public abstract class SharedStrippableSystem : EntitySystem var (time, stealth) = GetStripTimeModifiers(user, target, held, slotDef.StripTime); if (!stealth) - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert", + ("user", Identity.Entity(user, EntityManager)), + ("item", user.Comp.ActiveHandEntity!.Value)), + target, target, PopupType.Large); var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); @@ -302,7 +305,10 @@ public abstract class SharedStrippableSystem : EntitySystem if (IsStripHidden(slotDef, user)) _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, target, PopupType.Large); else - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target, PopupType.Large); + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", + ("user", Identity.Entity(user, EntityManager)), + ("item", item)), + target, target, PopupType.Large); } var prefix = stealth ? "stealthily " : ""; @@ -408,7 +414,10 @@ public abstract class SharedStrippableSystem : EntitySystem var (time, stealth) = GetStripTimeModifiers(user, target, null, targetStrippable.HandStripDelay); if (!stealth) - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert-hand", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert-hand", + ("user", Identity.Entity(user, EntityManager)), + ("item", user.Comp.ActiveHandEntity!.Value)), + target, target, PopupType.Large); var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); @@ -510,7 +519,10 @@ public abstract class SharedStrippableSystem : EntitySystem var (time, stealth) = GetStripTimeModifiers(user, target, null, targetStrippable.HandStripDelay); if (!stealth) - _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target); + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", + ("user", Identity.Entity(user, EntityManager)), + ("item", item)), + target, target); var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); diff --git a/Resources/Locale/en-US/cuffs/components/handcuff-component.ftl b/Resources/Locale/en-US/cuffs/components/handcuff-component.ftl index 0f3c7cfd52..ba4a6a967e 100644 --- a/Resources/Locale/en-US/cuffs/components/handcuff-component.ftl +++ b/Resources/Locale/en-US/cuffs/components/handcuff-component.ftl @@ -13,8 +13,8 @@ handcuff-component-cuff-other-success-message = You successfully restrain {$othe handcuff-component-cuff-by-other-success-message = You have been restrained by {$otherName}! handcuff-component-cuff-self-success-message = You restrain yourself. handcuff-component-cuff-interrupt-message = You were interrupted while restraining {$targetName}! -handcuff-component-cuff-interrupt-other-message = You interrupt {$otherName} while they are restraining you! +handcuff-component-cuff-interrupt-other-message = You interrupt {$otherName} while { SUBJECT($otherEnt) } { CONJUGATE-BE($otherEnt) } restraining you! handcuff-component-cuff-interrupt-self-message = You were interrupted while restraining yourself. handcuff-component-cuff-interrupt-buckled-message = You can't buckle while restrained! handcuff-component-cuff-interrupt-unbuckled-message = You can't unbuckle while restrained! -handcuff-component-cannot-drop-cuffs = You are unable to put the restraints on {$target} +handcuff-component-cannot-drop-cuffs = You are unable to put the restraints on {$target}. diff --git a/Resources/Locale/en-US/kitchen/components/kitchen-spike-component.ftl b/Resources/Locale/en-US/kitchen/components/kitchen-spike-component.ftl index b2ceffc6aa..aa555b24ae 100644 --- a/Resources/Locale/en-US/kitchen/components/kitchen-spike-component.ftl +++ b/Resources/Locale/en-US/kitchen/components/kitchen-spike-component.ftl @@ -6,10 +6,10 @@ comp-kitchen-spike-deny-not-dead = { CAPITALIZE(THE($victim)) } can't be butcher comp-kitchen-spike-begin-hook-victim = { CAPITALIZE(THE($user)) } begins dragging you onto { THE($this) }! comp-kitchen-spike-begin-hook-self = You begin dragging yourself onto { THE($this) }! -comp-kitchen-spike-kill = { CAPITALIZE(THE($user)) } has forced { THE($victim) } onto the spike, killing them instantly! +comp-kitchen-spike-kill = { CAPITALIZE(THE($user)) } has forced { THE($victim) } onto { THE($this) }, killing { OBJECT($victim) } instantly! -comp-kitchen-spike-suicide-other = { CAPITALIZE(THE($victim)) } has thrown themselves on a meat spike! -comp-kitchen-spike-suicide-self = You throw yourself on a meat spike! +comp-kitchen-spike-suicide-other = { CAPITALIZE(THE($victim)) } threw { REFLEXIVE($victim) } on { THE($this) }! +comp-kitchen-spike-suicide-self = You throw yourself on { THE($this) }! comp-kitchen-spike-knife-needed = You need a knife to do this. comp-kitchen-spike-remove-meat = You remove some meat from { THE($victim) }. diff --git a/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl b/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl index 2322d20162..a75f163adb 100644 --- a/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl +++ b/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl @@ -1,2 +1,2 @@ cream-pied-component-on-hit-by-message = You have been creamed by {$thrower}! -cream-pied-component-on-hit-by-message-others = {$owner} has been creamed by {$thrower}! \ No newline at end of file +cream-pied-component-on-hit-by-message-others = {$owner} has been creamed by {$thrower}! diff --git a/Resources/Locale/en-US/nutrition/components/food-component.ftl b/Resources/Locale/en-US/nutrition/components/food-component.ftl index 3de156fdef..2247ef6fd4 100644 --- a/Resources/Locale/en-US/nutrition/components/food-component.ftl +++ b/Resources/Locale/en-US/nutrition/components/food-component.ftl @@ -2,12 +2,12 @@ ### Interaction Messages # When trying to eat food without the required utensil... but you gotta hold it -food-you-need-to-hold-utensil = You need to be holding a {$utensil} to eat that! +food-you-need-to-hold-utensil = You need to be holding {INDEFINITE($utensil)} {$utensil} to eat that! food-nom = Nom. {$flavors} -food-swallow = You swallow the {$food}. {$flavors} +food-swallow = You swallow { THE($food) }. {$flavors} -food-has-used-storage = You cannot eat the {$food} with an item stored inside. +food-has-used-storage = You cannot eat { THE($food) } with an item stored inside. food-system-remove-mask = You need to take off the {$entity} first. diff --git a/Resources/Locale/en-US/strip/strippable-component.ftl b/Resources/Locale/en-US/strip/strippable-component.ftl index 7654369c29..7022319d22 100644 --- a/Resources/Locale/en-US/strip/strippable-component.ftl +++ b/Resources/Locale/en-US/strip/strippable-component.ftl @@ -8,8 +8,8 @@ strippable-component-cannot-unequip-message = {CAPITALIZE(THE($owner))} cannot u strippable-component-cannot-drop-message = {CAPITALIZE(THE($owner))} cannot drop that! strippable-component-alert-owner = {CAPITALIZE(THE($user))} is removing your {$item}! strippable-component-alert-owner-hidden = You feel someone fumbling in your {$slot}! -strippable-component-alert-owner-insert = {CAPITALIZE(THE($user))} is putting {$item} on you! -strippable-component-alert-owner-insert-hand = {CAPITALIZE(THE($user))} is putting {$item} in your hand! +strippable-component-alert-owner-insert = {CAPITALIZE(THE($user))} is putting {INDEFINITE($item)} {$item} on you! +strippable-component-alert-owner-insert-hand = {CAPITALIZE(THE($user))} is putting {INDEFINITE($item)} {$item} in your hand! # generic warning for when a user interacts with your equipped items. strippable-component-alert-owner-interact = {CAPITALIZE(THE($user))} is fumbling around with your {$item}! From 1a8d4c9717e045a6e8c5cc5c4e117d13027051e8 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 20:16:26 +0000 Subject: [PATCH 511/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 24a5245349..016456993f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: zHonys - changes: - - message: Items with collisions (like mousetraps) won't kept doors form opening - type: Fix - id: 7805 - time: '2025-01-13T10:07:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34045 - author: Coolsurf6 changes: - message: The "Jazz" style for the Electric Guitar now uses the correct soundfont. @@ -3901,3 +3894,10 @@ id: 8305 time: '2025-04-21T17:54:51.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36801 +- author: lzk228 + changes: + - message: Fix identity reveal for creaming and meat spike popups. + type: Fix + id: 8306 + time: '2025-04-21T20:15:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32003 From 17813825da5daa16ee8463f23e76c59233d7da96 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Mon, 21 Apr 2025 17:46:07 -0400 Subject: [PATCH 512/622] Remove non-functional ninja exemption from `SpawnAndDeleteEntityCountTest` (#36813) Remove non-functional ninja exemption from SpawnAndDeleteEntityCountTest --- Content.IntegrationTests/Tests/EntityTest.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Content.IntegrationTests/Tests/EntityTest.cs b/Content.IntegrationTests/Tests/EntityTest.cs index 3992272b5b..d78d58f80c 100644 --- a/Content.IntegrationTests/Tests/EntityTest.cs +++ b/Content.IntegrationTests/Tests/EntityTest.cs @@ -277,11 +277,6 @@ namespace Content.IntegrationTests.Tests { foreach (var protoId in protoIds) { - // TODO fix ninja - // Currently ninja fails to equip their own loadout. - if (protoId == "MobHumanSpaceNinja") - continue; - var count = Count(server.EntMan); var clientCount = Count(client.EntMan); var serverEntities = new HashSet<EntityUid>(Entities(server.EntMan)); From 1bfa303f3651e1564fd2a1bb5c44e3d26f49fd5e Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Mon, 21 Apr 2025 15:39:28 -0700 Subject: [PATCH 513/622] Firelock temperature and pressure warning lights (#28339) * Add temperature and pressure lights to firelocks * Replace sprites with new pressure and temperature light versions * Remove obsolete deny and locked sprites * Add SpriteSync for warning light animation synchronization * Teal lights * Partial animation implementation * fixup! Teal lights * Temperature lights * Adjusted firelock light heights and added final warning light sprites * Fix colors * Testing colors * Update light sprites * updated sprites --------- Co-authored-by: EmoGarbage404 <retron404@gmail.com> --- Content.Client/Doors/FirelockSystem.cs | 25 +++++++ .../Doors/Systems/FirelockSystem.cs | 2 + .../Doors/Components/FirelockComponent.cs | 46 ++++++++++++ .../Doors/Systems/SharedFirelockSystem.cs | 27 ++++++- .../Locale/en-US/atmos/firelock-component.ftl | 2 +- .../Structures/Doors/Firelocks/firelock.yml | 19 +++++ .../firelock.rsi/base_pressure_unlit.png | Bin 0 -> 753 bytes .../firelock.rsi/base_temperature_unlit.png | Bin 0 -> 740 bytes .../Airlocks/Glass/firelock.rsi/closed.png | Bin 1262 -> 1795 bytes .../Airlocks/Glass/firelock.rsi/closing.png | Bin 2494 -> 4156 bytes .../Airlocks/Glass/firelock.rsi/deny.png | Bin 1734 -> 0 bytes .../Airlocks/Glass/firelock.rsi/locked.png | Bin 1270 -> 0 bytes .../Airlocks/Glass/firelock.rsi/meta.json | 67 ++++++++++++++---- .../Airlocks/Glass/firelock.rsi/opening.png | Bin 2500 -> 4174 bytes .../Glass/firelock.rsi/pressure_unlit.png | Bin 0 -> 1049 bytes .../firelock.rsi/pressure_unlit_flat.png | Bin 0 -> 791 bytes .../Glass/firelock.rsi/temperature_unlit.png | Bin 0 -> 1096 bytes .../firelock.rsi/temperature_unlit_flat.png | Bin 0 -> 820 bytes .../Airlocks/Standard/firelock.rsi/closed.png | Bin 1120 -> 1323 bytes .../Standard/firelock.rsi/closing.png | Bin 15631 -> 3534 bytes .../Airlocks/Standard/firelock.rsi/meta.json | 18 +++++ .../Standard/firelock.rsi/opening.png | Bin 15781 -> 3801 bytes .../Standard/firelock.rsi/pressure_unlit.png | Bin 0 -> 969 bytes .../firelock.rsi/temperature_unlit.png | Bin 0 -> 1055 bytes .../Doors/edge_door_hazard.rsi/meta.json | 8 +++ .../edge_door_hazard.rsi/pressure_unlit.png | Bin 0 -> 637 bytes .../temperature_unlit.png | Bin 0 -> 671 bytes 27 files changed, 199 insertions(+), 15 deletions(-) create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/base_pressure_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/base_temperature_unlit.png delete mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/deny.png delete mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/locked.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/pressure_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/pressure_unlit_flat.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/temperature_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/temperature_unlit_flat.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/pressure_unlit.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/temperature_unlit.png create mode 100644 Resources/Textures/Structures/Doors/edge_door_hazard.rsi/pressure_unlit.png create mode 100644 Resources/Textures/Structures/Doors/edge_door_hazard.rsi/temperature_unlit.png diff --git a/Content.Client/Doors/FirelockSystem.cs b/Content.Client/Doors/FirelockSystem.cs index ad869391f4..5d357c0c09 100644 --- a/Content.Client/Doors/FirelockSystem.cs +++ b/Content.Client/Doors/FirelockSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; +using Robust.Client.Animations; using Robust.Client.GameObjects; namespace Content.Client.Doors; @@ -14,6 +15,30 @@ public sealed class FirelockSystem : SharedFirelockSystem SubscribeLocalEvent<FirelockComponent, AppearanceChangeEvent>(OnAppearanceChange); } + protected override void OnComponentStartup(Entity<FirelockComponent> ent, ref ComponentStartup args) + { + base.OnComponentStartup(ent, ref args); + if(!TryComp<DoorComponent>(ent.Owner, out var door)) + return; + + door.ClosedSpriteStates.Add((DoorVisualLayers.BaseUnlit, ent.Comp.WarningLightSpriteState)); + door.OpenSpriteStates.Add((DoorVisualLayers.BaseUnlit, ent.Comp.WarningLightSpriteState)); + + ((Animation)door.OpeningAnimation).AnimationTracks.Add(new AnimationTrackSpriteFlick() + { + LayerKey = DoorVisualLayers.BaseUnlit, + KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(ent.Comp.OpeningLightSpriteState, 0f) }, + } + ); + + ((Animation)door.ClosingAnimation).AnimationTracks.Add(new AnimationTrackSpriteFlick() + { + LayerKey = DoorVisualLayers.BaseUnlit, + KeyFrames = { new AnimationTrackSpriteFlick.KeyFrame(ent.Comp.ClosingLightSpriteState, 0f) }, + } + ); + } + private void OnAppearanceChange(EntityUid uid, FirelockComponent comp, ref AppearanceChangeEvent args) { if (args.Sprite == null) diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs index 375e5c745e..5fd0bf7e97 100644 --- a/Content.Server/Doors/Systems/FirelockSystem.cs +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -73,6 +73,8 @@ namespace Content.Server.Doors.Systems _appearance.SetData(uid, DoorVisuals.ClosedLights, fire || pressure, appearance); firelock.Temperature = fire; firelock.Pressure = pressure; + _appearance.SetData(uid, FirelockVisuals.PressureWarning, pressure, appearance); + _appearance.SetData(uid, FirelockVisuals.TemperatureWarning, fire, appearance); Dirty(uid, firelock); if (pointLightQuery.TryComp(uid, out var pointLight)) diff --git a/Content.Shared/Doors/Components/FirelockComponent.cs b/Content.Shared/Doors/Components/FirelockComponent.cs index cc9278dfe7..027aa24fdf 100644 --- a/Content.Shared/Doors/Components/FirelockComponent.cs +++ b/Content.Shared/Doors/Components/FirelockComponent.cs @@ -84,5 +84,51 @@ namespace Content.Shared.Doors.Components public bool Powered; #endregion + + #region Client animation + + /// <summary> + /// The sprite state used to animate the airlock frame when the airlock opens. + /// </summary> + [DataField] + public string OpeningLightSpriteState = "opening_unlit"; + + /// <summary> + /// The sprite state used to animate the airlock frame when the airlock closes. + /// </summary> + [DataField] + public string ClosingLightSpriteState = "closing_unlit"; + + /// <summary> + /// The sprite state used to animate the airlock panel when the airlock opens. + /// </summary> + [DataField] + public string OpeningPanelSpriteState = "panel_opening"; + + /// <summary> + /// The sprite state used to animate the airlock panel when the airlock closes. + /// </summary> + [DataField] + public string ClosingPanelSpriteState = "panel_closing"; + + /// <summary> + /// The sprite state used for the open airlock lights. + /// </summary> + [DataField] + public string OpenLightSpriteState = "open_unlit"; + + /// <summary> + /// The sprite state used for the closed airlock lights. + /// </summary> + [DataField] + public string WarningLightSpriteState = "closed_unlit"; + + /// <summary> + /// The sprite state used for the 'access denied' lights animation. + /// </summary> + [DataField] + public string DenySpriteState = "deny_unlit"; + + #endregion } } diff --git a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs index e613848c5c..ff72934590 100644 --- a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs +++ b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Doors.Components; using Content.Shared.Examine; using Content.Shared.Popups; using Content.Shared.Prying.Components; +using Robust.Shared.Serialization; using Robust.Shared.Timing; namespace Content.Shared.Doors.Systems; @@ -27,7 +28,7 @@ public abstract class SharedFirelockSystem : EntitySystem // Visuals SubscribeLocalEvent<FirelockComponent, MapInitEvent>(UpdateVisuals); - SubscribeLocalEvent<FirelockComponent, ComponentStartup>(UpdateVisuals); + SubscribeLocalEvent<FirelockComponent, ComponentStartup>(OnComponentStartup); SubscribeLocalEvent<FirelockComponent, ExaminedEvent>(OnExamined); } @@ -104,6 +105,11 @@ public abstract class SharedFirelockSystem : EntitySystem #region Visuals + protected virtual void OnComponentStartup(Entity<FirelockComponent> ent, ref ComponentStartup args) + { + UpdateVisuals(ent.Owner,ent.Comp, args); + } + private void UpdateVisuals(EntityUid uid, FirelockComponent component, EntityEventArgs args) => UpdateVisuals(uid, component); private void UpdateVisuals(EntityUid uid, @@ -142,3 +148,22 @@ public abstract class SharedFirelockSystem : EntitySystem } } } + +[Serializable, NetSerializable] +public enum FirelockVisuals : byte +{ + PressureWarning, + TemperatureWarning, +} + +[Serializable, NetSerializable] +public enum FirelockVisualLayersPressure : byte +{ + Base +} + +[Serializable, NetSerializable] +public enum FirelockVisualLayersTemperature : byte +{ + Base +} diff --git a/Resources/Locale/en-US/atmos/firelock-component.ftl b/Resources/Locale/en-US/atmos/firelock-component.ftl index 81f7e58462..aab0fd849e 100644 --- a/Resources/Locale/en-US/atmos/firelock-component.ftl +++ b/Resources/Locale/en-US/atmos/firelock-component.ftl @@ -1,4 +1,4 @@ firelock-component-is-holding-pressure-message = A gush of air blows in your face... Maybe you should reconsider. firelock-component-is-holding-fire-message = A gush of warm air blows in your face... Maybe you should reconsider. -firelock-component-examine-pressure-warning = The [color=red]extreme pressure[/color] differential warning is active. +firelock-component-examine-pressure-warning = The [color=cyan]extreme pressure[/color] differential warning is active. firelock-component-examine-temperature-warning = The [color=red]extreme temperature[/color] warning is active. diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index a8820b4fc6..584a4e5c7b 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -52,6 +52,24 @@ visible: false - state: panel_open map: ["enum.WiresVisualLayers.MaintenancePanel"] + - state: pressure_unlit + visible: false + shader: unshaded + map: ["enum.FirelockVisualLayersPressure.Base"] + - state: temperature_unlit + visible: false + shader: unshaded + map: ["enum.FirelockVisualLayersTemperature.Base"] + - type: GenericVisualizer + visuals: + enum.FirelockVisuals.PressureWarning: + enum.FirelockVisualLayersPressure.Base: + True: { visible: true } + False: { visible: false } + enum.FirelockVisuals.TemperatureWarning: + enum.FirelockVisualLayersTemperature.Base: + True: { visible: true } + False: { visible: false } - type: AnimationPlayer - type: Fixtures fixtures: @@ -124,6 +142,7 @@ - FireAndGasControl - Fires - Spacing + - type: SyncSprite - type: entity id: Firelock diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/base_pressure_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/base_pressure_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..e44e9b62b15a31d29e4f108a99c1368fe5e2380b GIT binary patch literal 753 zcmV<N0uKF&P)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004QX+uL$X=7sm z04R}lkvmHRK@^3*#7D$L6tobr*dmHW1W^!6iJ*;I#0W-hk~I$@8<*V;5^Mz<i-3h_ z<E!u=Xe-z%2!bMrSX%pPB&>H_AtK2vv-ji7oXgA^@K5J;!)_b`qu^Mvsi?M)SkwY9 zG}A#7VS-8BHfQE0<J29WclcDj9aO#Q@2fe2D`{H?UyJalZd#7;xbXD4V=CSj?$UF~ z72!kSh$ROUzEXP1<7dTLkKYwr@z@0TRZlJZhf{x8&sm1>fN<Ez7xmxssGEe+h50$D zJu-W-i7`bKjTA*z$>T66wIG?*_6_~`W?2)DE`O5}mN>HH#2XQ{C|%Q1Goq*E%TrRh z|IgFTj0}6-Ls4jYa^1H+2<$+m?7Ck^u3I^VhDW$4RQ+p`)7XdT<*F7wfc8x|yR2%d zT{z!@?gukzC4Zy_nf^=$UQeMd0i8F{y5wc`yUxiy#5d%Lu3>K<`elFn@;A-MXY-`^ z_>BMn010qNS#tmYE+YT{E+YYWr9XB600AjUL_t(&1?`s65yBu4M8OKuf&Zz((rH5f z?I0BdZxNV_5{3c(vdl2#;Mj#{AR5C$0wh2JBtQZrKmsH{0wh2JBtQZrKmr#dV7>Qw z%MvUSpl;sU4FlF%G~FfXm$V@|s^7h^IPsPQ)B^9)x5PLN54AOI0Mga$`+A6noK005 zJ{bTuEft%0u|+(qG-(T{RSci8o#h>L&a?x7_zQ)^$5h*+nAX;wI!ov1{u$3DZT$uW zkH_GduPwAiyCtXQQ5!31{{e97Qml#fjJ0UD<n(xBPDwieNH=~+>Q!%;=TwgNRNdhM z((%k^R}hn<`27sVGnp={x8#OT;pk@y`e)jO^&oc@IIlD|!#`{NXrn&^hyehgUgm!Q j_RT^9BtQZra8&{ykaL)GZ+u&500000NkvXXu0mjf5Qb8t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/base_temperature_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/base_temperature_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..67666e1ef2abbfbd10016c165273166a25916637 GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=%;U|`J4baoENOipHC(3n^{(b}8Y zQKWVM5%(i5B3lGD-cagtWeF7U?p)9tb%et$cakZ;qV)8;yh1sw(%lWM8IM<gkk8P* zp~cap)DaQ&J4<Cvd5ogcNuAB#AD@|X`i$fU|L3KL^JJJ7KZw}4a>cd@5m%V>O)fhM zCpLNBHA{b{_V|kI{PG_mdu2oRzIwmfvPnBLnmxYz!-~A9z7IP-eA$((bx-WwrQ(yK z51k)&sIrUf3#vNxIQ?j3|9#Quk2hF;g!=3LZV#@HI3L;ep`qZ$3GuJ@Kd+eGa;f#F z<w{$l>W!U-t|Gl6u3;x18)$4*n0fUZ@82J3k;46Y^^=9BS!{Z8L|SmGM(pJv<3-D# zo(>M$`TzXob3HuOcbx+>s*3Jzx8r!@u=LHYc=vVDmThhBJ2XQ6W>30&qy5FxRbqAx z-+V20ugO{&YjMBn9lLR+YW)(nng4v);`|rtGR`%>u<J?c*WKq%+8!}~(zz}%U;bBW z{qIlaXHTSmUh?BdFE9c)3p^r=85s1GL71^(seKtRI%GUu978f#-%fMnJES1sdXW2s z-}Kn;9LIL=HoWI>J+|y5Z^1I%3t}e98$M4KNN70zWND+;*XOR*&lfQjo0&YwnkuX7 zpRsnQre5RxMB^>f;^*Ah^ihDp@L*q(+u6qku~&Z{N^_iDW%KoQ;nkg6D$f>Ko1H() zw2kv#M!fsh-j?_q&+c5_=|Aaw?(I*Fvilk8?|gk!{Wh92debtK%{<afLNmX+3uTE- z*r1y2C46ebWqpOsE57VWnct!tIk};=k;mGu`S$57g(qJ`uGt0GT-MX)vR^NIwK1zA zZRLL5n#h|UpEmoR`@TVT_TfN={zWYl5;n6Kz0qtu^`9qg!2t#ye5m2f0qNkLijNol SjP?KnkHOQ`&t;ucLK6To98qTg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/closed.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/closed.png index 602b83df5b0b8503dbe5deb6cb73e61b20b5139e..555403073b7794e94f5d2c6be2ef4a05df61b8a3 100644 GIT binary patch delta 1780 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 Wz0T9vTdJY}0000<MNUMnLSTaBa7cjw delta 1243 zcmV<11SI=|4(<t%BYy<7Nkl<Zc$~#oPiWg#82`z3l1WMoN}Q+;9drj_NRy0ahmk`e zN)4vTVI*XO)+0MLhmtV5Los9Yw1e59j5Xv?C}ja}hplY}>qco36?Vwd!Aj@s<kAg7 z<H>bnCdX21;=LUl%kSxr7ud?a%agu;zfZsS-uLvlSS&^WV1H<62)SGi$-ynWOv!8w zLQxcCvsnN@$O$fq93I@3Ukdn%Ngb#9f5BR=j+xD7!OhIf5GVLpUneRS#{`Q!@l5LU z^AnLLxL4T2iAf#G0EhRl4?s~Agq+~RJnspd=0xwzg10(FDy|}jc^(gL%TNXiNDgix zvvn{9eib()&3}m))%8PtsU0KBNRf&!L;ZUJ08{~Tlyz(bUJ(S0>N-x{(ry;Z79w3d z=n;TR7wO`GDRnw6%SiG5MF2nm03?w^SaKU_@aleb9hGOVI!7;Eb-%j)`to--M|B-( zPV`(qmQ0!j97c>{;k|IA?{nwq=O5|f{Y;D;s(@nIf`1oytFbXXK<k|n0Dw}3z$mc> zktbL%O>D?A9?niow};xt4+|bSa&-IQ?8NkjEMvhm?VR0RLHoH>p{AgJFTkvUG$-2I zE=4NXkY%h*sndp48;=}0x=oJ|d$!v{?aa6~r83}G1OaJI#BRCfV!+-7_r47>hKq~K z^PkMmE`O#-1u0TNT9$#?iD_RhDRF`~a?w7_HvI5G6rG)&7{i~ogJIRiFD@?6r=3L{ zLQ<rH3OF0wuxjJ9{rpu0dwYA3B#MD}JdXVvH*BXcA6%!4STId2z(gydw;K%}=7Z}1 zZ1&>uI966xnhX#^&@D+Q09Y#)F$aL6Y?@B~)qiiTJL21~HCdu_%ozsOibeE_BDy6B zgpg(d01)ZzMS)5*XBbT4UFvy6@IC;3Hcfk>&B5^WX<#+Pbry^W0@jK}-{28JfaFua z2=I@w+YX)QVKgEL2=o4(tVX<#<}lA=%p)$yaVVMI>&Gsj`1C1bFf0q_H#Y$sG>d8# znSVqAXEhBRfQ+glscEi+UiyrxGVe5&-HLZhY%7!m0UX@Dy3tf$>1eXx1aL}6h$WiF zvMsBts~Dr4XqvqMp1<(u@6{^v>Q~t6>Z<)50Dw!U^H`e8F-}3Q36Rt@B=6kuOa=gF zH4Ug%@%7{+qfcrYlA7jXU}-LgOQ-YA0)Kd&!}=|@75j;m&%1PAs4CFjj+wi68GS}o zkx^B=*xz@>@Ou3NLqPrK;N3TXPak=M(p2)%sEcY^YJ|Yb=fOv#_G0v!3QH!y?=AiZ zIzl0sTU#Ip+sCGn2Cr6O<#NnB0PsCMb&vy_a|&p&EjwZMsQkk)@co4gF8VTwgn#R~ zBNVc~QfO;qd;s|N0Hy$=1S~yy!diEBd;|ZDyn{A(0eZf^?c{?a*ECIBK2!g#`skY; zJAl@I@Ffp{YRezL^~|Mr`j^XP-2dq>NFuceono3M3P03oJC=xe>ibR#49H>i<#L(9 z3Mh(##m(ckLf3U{T(j`_Q2>1>*;GU4@|mWd2Kn*&^OpK!i3kKifPQefkwgxQo5!Ij z3b<G-MjDsX`8R*XxvTCy`(Mhna~wXqKWyKSx&Qlm{x_bge?l>|`h)-g002ovPDHLk FV1g4HSA75g diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/closing.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/closing.png index 6718ae08e979bc8c73e2ec6081e70f6088157caa..2a40fddc5b02b88e5459815ad73db141b4896c7c 100644 GIT binary patch literal 4156 zcmZ`+2|SeB`yYeGPBA6LOb7`x))<;0`<k7^HH^Us!^{X-6Uh>?BwHhrTp=P$DO;vS zwp6ajSVBbBH1_{c|8Dnw?(cj)=RM~<@AvyW&-tF`ec#U;XKtp?%^}1A006iR4RkCS zBbw1Q+4eE66G{Xg#=u0h)IS3#?>aioSny!&4c$#m0n&^)8>8>GH&$tkE4!b;IU)cc zmA%`U4k3<J0RYV2IBR>7y{QQTgZGhhal^Y}<$`?t_E;K02*%V0OLBn*`FQ&h5kaR# z_YerieAf&Uh3-K}7fy@Xo0>zl@dPYXMGh_p7e#VFp->Hin>)f%NAD+{u{tg4Nh0|n zV6eczK)FCgIXuAwCa<QZ27@cW6cl6`2w7sVFUciH)|V*u!^!{q(ZLci1e_lUhxdi< z`gL)|2arySitYyb)qdpZhWQo8FM!~^7sU+&!+K+Vu)ZWBOkPeN_Fp^_&i(HUeThHi zU<d=-y~Civ|C46uN5UvEl+q1i<nwcXj6^Yeafu{1*lz%s0vxU?3s;a;P=o#2A0vGY zHw=P=BY9)@g!{FhJq5MAN&mF&;&&zR#_cML@OJU_I4v3^>xOlA3GgO~BJqA$U!1Rp z2J8pupX49bfBMvb{YQ9>-AyCTSz?KJ?|@y|kqRnG8hcXw!}|9D{9xGsC*ybPzZvG9 zcoLpbPy`&t(3gZI_z@Vz^&{fXc>f#mZ(n~0xADc1kP1H?{LB0s>$k%}Xc0((c)|ti zy@U9r;{Qba^zuW|-|F*6@$ae6sD31e2JF|9gydMHBHI7}uCs<ZTGl~KbB+<7cKu+K zGk*YWlkTM?FJbxcCiFt7WxwUBzE)>0Dd~EQ6zRlcjM9;2g@!TvT7`9r5th|O@r#On zFNbe_m;9{^+qaPsB-~#*ortT2HE9wOdYJIT<0RV0?l2mWwl+K;27^s*{Bd-#>3hh$ z`gh9IF!Af@`F=H64Pk;RbHbs<3+z<qciBN?uHD6(l)qu&<>{HfJk>qr^4fM&KmaO9 z3#d*NDlJ`(7UMPJ;_A8crQa%*vL?%U$X)WnM%(26sto9&Vjl0C+a^~pR?pM6Cs%#u zP_L7wzXsl;PA7zgae=eL&CeUdhU@NpnUy=K7*@l>+qaNLjvjNKwKrnMVBT(`Wv^c^ zW}CY_NT*ooOZd_dY6^Z6_0*Z{z?L^NMICZ^^!9ZLwIoa?%qk#QP1ZS3jTiN9Xef6g zgLk18xgo=<wXYLyKzEF&dhFA26I=WBbMgFKnEgCUbsD|24_6jB|Fr(QfrJy`jV*9I zy2xCJlQ;gT$n!^|r_`UlV`0rb0x6cFe})*zob`yycz$W;iN2R~9|`N0tEzjti+IU* z&~7Q3_jr^ey+~v2&m{q;x9_C<Vy5D?(_RU*U3Zz``Sd_|=>Q}E8p_5494fg8j9wHC zF3sL}XvLNgXNO$ZbdIOBVGSf(Gu8PxK9*brpJ=8cqm~F0%c>7k+``&n8L!2czZDX5 z{owv(f9i1ApUsX5`JCpbSgo7IBQXH7g{+rbxB~>DyM2n5?f?o|%K1`fgbi-5jR||& zd4v{5en1qTs~voC(R*AQomw7uCEsb^a-h$rr1AlywK-j)$NTo=5YQ5|8u)Na(dM<0 zgm8t;<XA!M@kL_GH=j7=T<B<_L;7Q%iHU}J=;qyv(D58$bSF`dw>4U0py^(p?P}gz zo~M#vDC-Rpk}Ag`WR?E-DRVt<S!8pi3^%Vt2oFG_ukk7>&q<(0w%ge`ek3t>MJ+NW znWQqFbD=p2m1&UGc6+J=zAw9s{()udvx%^cwRI0d$Thev`|%tuzqi-oPpVUJr+erl z=0C${2S3>tRUiUg>Vy2Rx5iA29lu-wPU&<nsa=HlkAhb?WzY(HP@^sNpqs|tC7c~E z5-tGbWDddD8DhjvSJo|XtOqdYtlSB0evDB!>f~oV*Tbx#IvyO-?JssskC<puBNyq~ z?FG~pMhGz2nl#x$Sky@?a6f+2Li1x>_aU(O1I0r(6Arznkf@IKa>FEe%LgNw!pP?S zv=D(&2Dn8+K2L#xI3=9;@bLlTlOvL6zrQ(OcBtipKn<6DlUsHtecep;V`f3xj>)P8 z3p{I^wm`dI@g46PbU-?+sF*@dA9+%x5z)xJKo}X&v#X&8t;gt;Z-lU;4C-Xq)9p$! zXUm<_9}n?%?`&@XZeBAu_A+s)i>*L?Ozw~OS~<?h74zn=QiesI@F@wgFJgFsp0vf` zq7UFy#BGl79;2Li_J>ofp>*aOmvG4fwM9O8c@5br{I$NlmrZj%=M<Zj^v~&l-d7YK z%&2|!0yLj!3D}HMy6Wjx9(5JO8n~}25hCs=a)9bI2ze^yQx8$cZYGn5@3F>gLp{av z9hp^@$T{;c5}Rt`WaiBoWN)phJ80$Gy6}gL_^?fv{)ie#%B<a(c8Y&?Bz%*)w06n< z&FearP-2wLG50$c<HVl`f0tdn4s>hHqDo?cH)Bm6dMzGs;&{?|*VMF&MgHtPxba;o zFMe2Npj}6JxXxm^_xrb}LSC`W7LOa3_a_L4Ujxsq$J8zvk6s0upa<!Ow<6)85$Rut zf+`|*T9m^<{7QHcWeBQECeIZ#a>{?>qKNZYW{dIRuFAQY(7vkjoMBZPGPin`*22SN zxibT9KE~-puMm%CvDMAAAyX&$oJdLr(NAjoUATj{(}aOlYI$j2=||;=1$0Bc_}lR` zrCNw}SgYE(u?zE_O6ek0)uaUPZqN3tGWx3F?FoOBsR3|ZT*i(jb|FGfKX9%<Qu?IW zT016JE+Sa9wkk&@*G7F^f4UU*+(fooJ4BZ`?TV84cGMESZ=g_L8M*FW>{xg0Y)s@U z7Q1idH}+rh>Nq$7Zd4b5tgdZc0k_9xZrt*{r2FxFXz&*)<@e-5{+Y@n-OsJfM4Aut zzI7zH#;}Ul2{qXb-@9X+$tH-3m=gm-M!10if9Z-~O=(Vdb1Fyto3_^)pkt7sS2dYc z2ar|{tl^|N&i2d}3NT%qBDQAkD==f3F^n>BV0Rw;)Qy560Zw^H(#t33`I$8}&$y@F z=L<Q+l?hYGZiD*A1+V7|X(j!I5{W$ui44`1L&Qo-h*`U#SwPzP+*4R1=`*?~kIk`O z$RB<h!+FD#Fp8Ooz<sf8WUd$CMEZdmD)g(D>UnP)_bqq#-3Z&bKUyQtPfiJhM4rd$ z+?R2%yz{|5Ao}H3M|2cN@3Hv%EOys;&V*|UZ_y!~E8S$V^5;bh`$f`)o~#b(G)xL- z6`ab6#eh2tn5FI6m7=nd14%B9spkaddEAb+pW;Z_UVPxAa~FN&%V)lt0(glKc;~L| z*giAEvX!->Wfk-bq8CM9D+M|@ehYLZeK9s8i(pY{l3$8n5JZ&-zZ~!3h@5*ArajKn z+nbDmU1~*diks$hLJAGNKnl+Wm~KmL?$l|MLd8*;ciC4gmWhV*O`5FY;DR(%*u1BN z2{a{b=&}aB3@}Y5TVLbZpkSZ}$e@F@?4(i2dgjB<Cz~e7crtvPE0s7Zi39p<iU;P) zYt51&$6sHyE6LNtbsR&49&QhVBOw$YpkyoK4X+UH)tRk4(A=yAL!vzm^r?^d#tinK zpjD!^<d99Ad@1xgEM<ykp&n?s>3Pg67hd7|m03M|Ji2wkAHp)LD)#L-Bk>QYZIH%L zkQMs+v(#jlaS9GtI6|psKK{%WurXC}2fJn&H~lh!H>hbvZn5x|d|wY$2gk`Tc$M6y zd#&x1Iuy4<-?48=qpN8-C>IFp;W!__L!mKqO*KrgyW96PAO$)z#-W9PZVxBa{Wz6A z+*{y#XB@O5HiQ+@@<NVHG#%8q-?3E4^!-6zhfkZ=fg@yRatiyBD^n<c^eZz~NCmRD z{ocd=J5^uZ=zL2bFJT`LRY?O$=MK=MG}j+=G`HUfbiv)eL>8K8B=m43zBzaj&W1Ws z!4-!W7+HI8c8*glu=FT;D@SiRJA|&C4bmE(<47D65=^8SFHr6My-_wL8HxJ*bi*;s zpnQUJQ%6H?X41K=*5{%O574mp^)BWJC;pKZAYL=9Gyd%=#VD~)*>B++E2|YVvYcrk zSlWytqZYAc`N#Sch&@w3k#Gyp4>LNy!haBw676g*7@mT$?FgB#WaD@Pr^w85%>wus z@4<k$IWn(SI}QjJTuq+Rph${W0uS?_czOFdC1B@Kcd|?j<{%3<MP`-hO#SPQ^_R<= zHNf4^28^%ql8V|qI{et>X2DJ3wshQ}a!*`@?dhyWp$g1FvbNy!CYTgEKj02c7Tl@~ z=L&IKk#Mp)Weq=as^Q6roaHYbia?0Dwlu2zS&f&J-OWFq+CQq}^6~%U$l)BgjT*+R zWtL1%XCGnmqtXq_G}|ZA7ZoGu%BSyj`DeaseS(2CT95R{2{K7^X*YTMQYX9K`Lj5J zPDCm8OdSqjbxX4VY*3ctM1A?uywQu5Kr8#pGjZa!=z(}}gS13Rp5q*tK3yDcmju3L z%hN<)okU^2<p6g^0=fgUtY)ScPYTHQ>k&=ydQ5Lnv~+~R3srW*ouI3Xr_B~E7%n^H zC-Bic0o|`SQ)S;<8nI-;v6Q;AMJs-1^JrdhrLV$S7n~aUWc%7uPa0j1si9~+=LA1s z^U6$Pv>EZFd^wn|n&Fw7k76s^ss4WBuZf(^ZdK#$)M9GlLUBthP#oL_68Aq4b;QU# z6krPt&!8&K*OnEnQ#5jt5mkv_jGxVdf*B`DUN>6-;gkC)JK5TNRpPU3lgrfDg`KMJ z?otpVov;<|RC+LEet7#6ZMu%o-OA2fZ9U+^BL`Qp&-}FWN+D~?;pnkznl;y{S{X5T z^(i1^(5d{sYlY^mIQZtF)lVR+g`@Eq&$iCQhcAwLEwip|EHbIRGLoEdWgmQ(EDTvh Y<!<pytZq@bcmLcCb<K3j&!D6J4_>)PkN^Mx delta 2485 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 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/deny.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/deny.png deleted file mode 100644 index a2b151c14088c54950b3655357a7f4f7f76654f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1734 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 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/locked.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/locked.png deleted file mode 100644 index 5c87415ec1ab40050695128c828b3da995fc4f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 zcmV<S1PS|zP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000ENNkl<Zc$~#o zPiWg#82`z3oJmStym(Qawxc_Uur$eNb{K(mMCrjafsUB0(0XK0XbvS|bcbTb=xGPj zLm6q<p-{pC-VPfrD{Dq6jtV<u>0qI=*Bo57L1;V$r=hYfwIZH&a4f&4Kb~PL`z}xK z`}2N3eeZqWlbGJ#UK0QY1_qGN=aJ~o;YCV1*AGz?k<DfS00BFAm}jtdTX-ShN5>T$ z@A(Cpd<`?3&4QVnoHXs=Bi$XS=nNIiv!?5!c0VuSSrhlR$~Zc%K<s1i;X)roQAEHF zKFG4Jz$u1zUzu}PC(Vk3<RHsp?Y021Zwrb39MZYHE%0JomlVTeSW#MfQ!7RgkTffv z8R{wf01yO(DD7AeyvlJHRumk+Dc>lTbVNE?kRt$xF4D;Y6H+`S2uQNtBmlq%0AZd% zDC{(n;Kr`8jLP;Q`{<@Kc8%pX7ME@eD+*E!?|Oc8!E6v{MbzTf2cby!7xvN1Khnv1 znJ8(AK(VC54ZPV{-yWcOrT73~r(#0gp$$B1Vph|zA_#aeH5LyBf}^d1NA@4wcrY~< zUl9b%YMQm?%bkAfd8a~bK~LF7oq-g?TV<CtD_9W(WG1Azs#ixN`wwoABlxb3U?511 znF)ykzshk)F+84>s*Vg;RdDY+KV`T$zc_PwW@<iZR**C+NC^TkH5T{GB_Ve3`dXw9 zRfZq0MbXjGfe}2l98|qJdU1YnCS@nlf+WofDqt*dRj-bc_Vd?7l*?s=!$by_;tz3o z;eh27V*Se`iCIm<EHpF|vfN1U5bIwCU}bM9{t)jhzS_uuX`0v<su?rIBBlWlDT|Yf zfBk#&j`-edjVzICOsgs~#UftedF%_-Ff9TA(Ah;VG_9)C{0Z?q#JOJpKWmzG(59if z`q;570{-ah08|Wd95ThCXYdfmA?!h52>8d?4GXJG6Q~x}0UWR#L#%fvtD5dtbBJXz z;u7a)80--JpoVpbCQvHTL8`9f{OT%zy=Gw;NXKG0Bg<d_q$LRnS$2TA>C=)#%}Fe) z6+g9QF3fRY;Oy1)rutHQBMWu_yR--BTc5<TEGKUb;%#hO1~ScV0MDMg^moIcre4HO z-Wmi@>-|0exOAd`xwGq(lb>k-BxD(hJ9k_c1AsHK3>XH!86T(g30X!$mK_<GJG+ic zCkhP$tioXVCf$m?L@yK^x-TUO2nI2E_b#PROA^wOgy*}vju=*{y<h;SeH^_1Ch*xK zcTh5wY&7afH7QlogkC6sjYh4*=(ZKQU;=+M`5tHw1fb<|F!##GN+Stw7|`>1Y7PKw zSFO|3ZT2l7#j<RM=&SNiRmJxgE;!Pcj>R0$?SX*xmRwsK<pY4~0iFcZ9pLlFk7?`X zrf1;4kyB`M5>N`YvJ>{MTusw(<#g?{>XUC9&70JJ^c4$^Xv?3zyY0~1{Y#}1?*H@` z!aQ*Z?V@QKwtlFk?QksOs_#C=Q6R1AOSYEl6Gaj8t4Az_q9|CouH&~yK6D?WFP$r= z8+sDt$AxE2^@n2-a2y9^@8>4WGnijJ0#Ovf^!E0e^`Fz3w|>RBYtEYeFXj3<26OiZ gtv_Vu|NcGy8*%D^Kx|ccGXMYp07*qoM6N<$g8N5G00000 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json index 505b597a61..e7fa7f7cad 100644 --- a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json @@ -45,16 +45,6 @@ ] ] }, - { - "name": "deny", - "delays": [ - [ - 0.1, - 0.1, - 0.1 - ] - ] - }, { "name": "deny_unlit", "delays": [ @@ -65,9 +55,6 @@ ] ] }, - { - "name": "locked" - }, { "name": "open" }, @@ -142,6 +129,60 @@ 0.4 ] ] + }, + { + "name": "pressure_unlit", + "delays": [ + [ + 0.8, + 0.4 + ] + ] + }, + { + "name": "base_pressure_unlit", + "delays": [ + [ + 0.8, + 0.4 + ] + ] + }, + { + "name": "pressure_unlit_flat", + "delays": [ + [ + 0.8, + 0.4 + ] + ] + }, + { + "name": "temperature_unlit", + "delays": [ + [ + 0.8, + 0.4 + ] + ] + }, + { + "name": "base_temperature_unlit", + "delays": [ + [ + 0.8, + 0.4 + ] + ] + }, + { + "name": "temperature_unlit_flat", + "delays": [ + [ + 0.8, + 0.4 + ] + ] } ] } diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/opening.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/opening.png index 113ddab7b76361111ebf7c2cb35999c487ced60d..31b1f72af1b65c203b96f6ac0f22041c152e3a9c 100644 GIT binary patch literal 4174 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 delta 2491 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 FV1g}q(MA9O diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/pressure_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/pressure_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4e87f1dad13ea5bc79ebd58eba2f658381a8e6 GIT binary patch literal 1049 zcmV+!1m^pRP)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004TX+uL$X=7sm z04R}lk-tmBKorNnZPkiaIw&H=Aww017K)-cN(H-Ahqi)Mm*kqXLXw6{iWFDD#i8IJ zy7+7GKhRZhRS*P45OH<&*CHjpYYHt=U%0#v-+SN3-8;aa)|p{<B>=;8cqWyUR`RP- z@C`mh(1T%2%gnYGvkN)=8{ZF9O>rL=z5cK382ts+W`M7kc!pWrA)X^nZ#tIXUE(2D zk_*Jg#4%0>B)$>4;_<8CqQ{?tc`h>#_(e~t*v3j5vl2ImCy1klUSZAih?|5|b2&>n zLTeN@GDsl_2?{FMfDQ+7$|lXMvoF!`Eul;vMt=)caB>t;B5#b;3UyT}Yox36>8Ogi z|DC6;O-*{;LrI|f#dSZ%fZ!fbuet8eiR;!+fxt6xWw!ifn$zqT>9v*?Jp#hpz{Pb- zQ}%(&9bn|ilDXWF0<`>^2E3mG19@QZ4(MC+X4Txs*&~qKq9?iq4i15Fst>RK0vUK{ z7CoMk%m4rY32;bRa{vG?BLDy{BLR4&KXw2B0!~RpK~!i3?Uq4k(_j?GU&;<EMlCwW zusSix4i&-E23}<M*q(IW+({5TIJ^q3-L5k9?8S+-;%*({Nf12tu!CT6OTyS-mZ4B3 zgMl;k|I)^Vk{(RrY45@7_vO9!{odC<-xoq8CJKlGqJStM3Wx%tfG8jehytR3C?E=m z0;0eXQ$Pv--<gGqIjrgGh;6$|^Yd@Rxuo+4m5TXI*VTQ;cHcZomz`v9nPBm~S5@=V zMNNHS7-R1=P2~*-xuoO5;-bk+W^)hjHHbO6TAv-1OB#=2{}o{UWKL~jgETeuq&YD$ z_S-Pjqz!}huCA%f^x5day@FhL%+>3&4fFc*sEvl};>?-JZ0-?WKjc4n-f;GHjqaX4 zMaOU{4iL<90&&V@_Whc;KVXd3YIGm#hrr&0@BC;-vTvg11oFQyHsbahu<k12*TDXX z@mZ+G7hn~M>^Y(@NQ}dG;8{4wix`s_Gh9WX<A9unZ^3V%*PRHqf!rmy15ev@05$mM zKCmx9u|xFmt4H52ber=DI1j&#cv55b<4%XR0a}Oe!AIb?BG?w<yKp`MX`2loi_a$@ zY~3q>V}9lROPb+L^)|*wHu3TAF}AB!ddl-2|1wV^uGR`l+DJ`uZOZl$+%<TvkJ}Xh z!O>mYEgW=OO+}e2Y;3gho11Q5ZS2Rq<G2OSYc+}H3YOJ6qdJl7cB!<CmlZXNrRCVo z1}t0)*cihlxQT~0T`rsBc>Dj)?|?1KazB*IseWS|{sWnb0-}H@APR^A|DwPjv`4qt TNAB?c00000NkvXXu0mjfvrGAo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/pressure_unlit_flat.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/pressure_unlit_flat.png new file mode 100644 index 0000000000000000000000000000000000000000..fb64ac658cc1b3fb89f4132ea8739d167f4f1823 GIT binary patch literal 791 zcmV+y1L*vTP)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004bX+uL$X=7sm z04R~YlDkR+K@^7nB#44{h@~)sNCYFnMg$?66gDYh2%3n6o83uV+1-TMiMOQi8AJ;$ zO(QlzE1y6FvG9VI-cnnOVByTJuu6&`h<`Ej&6&fw%>aRELp5!G1TZbmQgbnq$u5!h zXLMo!{Rm)EQSH)fGMRvo^hJ~2AK;VwU0B{%8#lGx)3@z<<^F1=aq`ma|3h7xX=#8j zD0oeywkmkXVN;X#SHb!QFLA)15gcTqK*5IOoXgTbSa5mI@kyuRf{z9F6kI-+oOAh7 zvbxGl!B2vR)e@8OKLkhJ8XWb7WJ5%^IAxY%jJ9ay_xhHr*H-29Lxyfqh5dc1f6XQT zkW1d*@NCs_V5S3TyY*~Ci$M1RP~Z1#*?HjX2pGIj%WVBCv`>a>d3N4bC?J>GBap5D ziEH5C5E#je5iE1M$>r@tBr-+9B)-LT!=NNaS%I=Kl4q2Xe36l|O^IS@gi%emIn#4x zt`{xf6IVlee22-iO8@`>32;bRa{vG?BLDy{BLR4&KXw2B0YpheK~!i3?UqXtf-n$7 zgXO{{M_|n<xS8BcE}?6Wz|tM|q(~&6p@gubQx)R$WP0EgAC2K40TLhq5+DH*AOR8} z0TLhq5+DH*Ac2z+sHSQ1ms}ZBBak^l9VJm!Pz#3h&v}b&sei$#+0u(MSe#%3t)63- zE?U>T1<-OLXoI+@vsv|)J|2KvG-iYOm{*C98h?2MREvhsc|EGP_0hbql11{?*=^xL zbSR%t-4?BR<1q`oyKUB+c5B`iK(AOyk(N_R5?QP7lAXrnw9K|$lIHCJ<TebuT7^YD z!Y-6-G~jrTbkW?1b57s84vWI2w*?@#B5u`WXnL}7MbJD%kIRNwI55_{{bvvW<VEFP zR&V^apTg45l)Py*Z}dn8_O^iYa)~4Qd#}h_bPvD=KM1G!AK>6{B>@s30TMVPfiF7` Vc7p8qjEDdL002ovPDHLkV1hBiX0!kR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/temperature_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/temperature_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ab456943e7de6892983e834667676d007e56d1 GIT binary patch literal 1096 zcmV-O1h@N%P)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004TX+uL$X=7sm z04R}lk-tmBKorNnZPkiaIw&H=Aww017K)-cN(H-Ahqi)Mm*kqXLXw6{iWFDD#i8IJ zy7+7GKhRZhRS*P45OH<&*CHjpYYHt=U%0#v-+SN3-8;aa)|p{<B>=;8cqWyUR`RP- z@C`mh(1T%2%gnYGvkN)=8{ZF9O>rL=z5cK382ts+W`M7kc!pWrA)X^nZ#tIXUE(2D zk_*Jg#4%0>B)$>4;_<8CqQ{?tc`h>#_(e~t*v3j5vl2ImCy1klUSZAih?|5|b2&>n zLTeN@GDsl_2?{FMfDQ+7$|lXMvoF!`Eul;vMt=)caB>t;B5#b;3UyT}Yox36>8Ogi z|DC6;O-*{;LrI|f#dSZ%fZ!fbuet8eiR;!+fxt6xWw!ifn$zqT>9v*?Jp#hpz{Pb- zQ}%(&9bn|ilDXWF0<`>^2E3mG19@QZ4(MC+X4Txs*&~qKq9?iq4i15Fst>RK0vUK{ z7CoMk%m4rY32;bRa{vG?BLDy{BLR4&KXw2B0)0tDK~!i3?Uq4r5<wKl|2u41AWO0q z6KM@#iVb4*(u>j9#?*sRjPc-6W3PHJ{RAd{15X|m5|1WoqBb0?(U?>djfYx$!n8F~ zI5g0*0!5hZ%o3V~E{A5gb>_0eo0;F6_uCf$IOIcd*8l3}a4JGP`qu?&-Y;*yb*_od zpBSOkxf!DWDmBbIAGQX{7P%Yg9PSkF&$hzj0abs0GLh=6i9R`tGdcV85wE`VDAJex zDRk_vXuf{u-Pn5q_?zb!Ob%&}qYV-sZZ`FPpo7Lai!(W!=Ll9TS2n-kREwk+N5cb` zz?q!gD?#POSjLF&``9JW*$@zmf&N*Cx>bTzuKJYnM*W}#JNI+;kEsiwh5<yPplfTO zql|4V>|@jGSAmHM(3KV7*;6M*cuuce1CmM5<z*m~-s819;Kg(J$4`KsN&u6Spos(; zkr=?@!h<oaC@Y*XZ8pnc9d&10@pyYrd`viPFMx6;tIf{gShPC;w{FA#a0b;}1*p|Q zSO+NOGI(5gFoyTWWsvP{pjrcA9iYTZz=Qp4C6@zyK9JmR;k3N~o9WeH=Ws0A0(hIR z=0Ad@tH6*3!lH^EU=qaIpXcF>pNn5WO8<Z+K>qK5+;eA>H}k;jEJ(m|TyZc{l6?of zoCopHE?~O@Sf~<I%ymsIcnIclv{lel)$H0S@S$jV%pJyr>X}<5Y9YdMx#6Zaiy8K1 zh4cAB#%*0B#+jTwoiBE=yZ#5HM~<h?Xg<9jgn4l(H_+ee&u8N)qps-R%$hm7@pqtX z5i#<tG$0K~1JZyrAPq<Z(ttD|4M+phfHWWtNCVP<G$0K~1Jb}@GO!DizSwBE+K<El O0000<MNUMnLSTX^5dri7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/temperature_unlit_flat.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/temperature_unlit_flat.png new file mode 100644 index 0000000000000000000000000000000000000000..5c553a9865373e37bc0d8812003efeb44b5661ce GIT binary patch literal 820 zcmV-41Izr0P)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004bX+uL$X=7sm z04R~YlDkR+K@^7nB#44{h@~)sNCYFnMg$?66gDYh2%3n6o83uV+1-TMiMOQi8AJ;$ zO(QlzE1y6FvG9VI-cnnOVByTJuu6&`h<`Ej&6&fw%>aRELp5!G1TZbmQgbnq$u5!h zXLMo!{Rm)EQSH)fGMRvo^hJ~2AK;VwU0B{%8#lGx)3@z<<^F1=aq`ma|3h7xX=#8j zD0oeywkmkXVN;X#SHb!QFLA)15gcTqK*5IOoXgTbSa5mI@kyuRf{z9F6kI-+oOAh7 zvbxGl!B2vR)e@8OKLkhJ8XWb7WJ5%^IAxY%jJ9ay_xhHr*H-29Lxyfqh5dc1f6XQT zkW1d*@NCs_V5S3TyY*~Ci$M1RP~Z1#*?HjX2pGIj%WVBCv`>a>d3N4bC?J>GBap5D ziEH5C5E#je5iE1M$>r@tBr-+9B)-LT!=NNaS%I=Kl4q2Xe36l|O^IS@gi%emIn#4x zt`{xf6IVlee22-iO8@`>32;bRa{vG?BLDy{BLR4&KXw2B0bxl*K~!i3?Up-o!!Qg) zflP{&E>o&@E@9owH<K=r)GkxHOvhl!L^3T<qYpbRW@wH;aREM(kVOt|8bTNmsGjTr z?JgnQF`%mGHrt@@XhU?b{^rE~CcX>;V}gzOPL>%!)Ug?D0Lq%k`SE#g0*_j@)tNTN zMgVE&8w=Q3LthWTQf<|<#r-t+=<8ZR`!z;UeUr;&8W4VwpXtB~&zyD$xwe<Xicqt! z7PJ$9>(!r&Nu@D=#?)Jy?<M5<ri$A<1?^M>(=NT6a$^lwptW|BzW=ronD3GetTDTH zI9;x`UH)9VZPOJH`H-&rLY%!t68AisqYZyL0Z7EF_9cIkT=rYicwRiz`hJ<_mbVJp z<7Y6h)HjO}KZR9xprGxp1H~$YxceBd68}HYlXlb}j!24z%8z!K{{dJwjRZ)51W14c yNPq-LfCNZ@1W14cNPq-LfCNZ@1W4d01bzY4w4ICovTo)80000<MNUMnLSTX;NqMgT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/closed.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/closed.png index 8c90b693a4c9a2b9c9e43b8ff4cb9a299a29d8f4..e2e149852c7a45bf66f1891d7de0a3261c2021e4 100644 GIT binary patch delta 1305 zcmV+!1?KwT2&)Q^BYyw^b5ch_0Itp)=>Px(<w-<AR9J<zmrZOGWgNzTvpc)pnceOO zyIWWSu^KlGmIfil8-WcCEs|&=RfLv<97s5k2p1A1CUWp12PAM(4qB0j2aPd&RJVyF z3TjAfJ&>&mA+r70bw9eDY4?NiFx}bNooSJR&t+$y_x=B$=YRdr`!zyWSC<CR)6+vL zm11b)IR7U;9p6Yi9%pQ93;@wAKG=Pipd94t#VXNu-xC#{nJuw%ugH$I6MUD_HOI!r z5C#SYwED>F;vE5r7renIYT%c-Jktf0oqI*%-9?U^e~x%Oj>8c53S7Nd<<*04K2c#a zdf#}Rs~4*P41aALCzVR+ufPn+?+2iwX*{Uan%de#k%ek?SrNNFZK5vYUllgESjhp< zFt9o%0N@VlrLR=042_Ng-~cF>8Sd+2e=>;x3?~u{CX*HecKmQ60e~+OvGjKU1ib?O zkWQ5Ic>tV(fKcyXg0T4OY11qM4@0e3G@jMfdc5TosDHDwmOwj!`31qkQ7+rYwTU7u zfNC;ON9zE&e(3_4f=W$mjBqfSWbn!rtKcH`CzDVvb7}YPCVnuPWH6azp;{$VP`Uo) z=N3T+Kz>f6n1g7$k8P0v{cB@51)C89YC3J<K1(FP?PlQGwI+TzkzhEHpiLC%UmIgv zBtUp^e}Bo(nO;Gx<S^!d9n7ylip4CYHlwC#sOdCPEM`o`x(PcN6&d};X=zl($I%o8 zXe^~B@p2h8m1_DAAcghi*3{O5`Z5$YZQ7*eayfiHAKMEBws-iLQ}y!K*R$EZnX`L# zIGwip2Y^@77@aOL8VFD-l?a7GjSBSk_F7!FiGQM{bY|{h&vx;xS`GkB(^wT+W)eIC zTuV$|GggH{Xj;oY5Q#>a2EO=fio=^bxtpH14gPj=a@piBtyyEsKNa(E?$#ZmUN4bo z)ZlHWW=W|L4!A75Pj<p29Nye%D{}7E9ox8iPCHl(Y>{O?xqZ*JGr)na^-EUgK-c<Z zV}G~EGOewKfy~TIQ%AqYWBf19&*S%akR=z{LS;#TY@xz|uJ!zWFN@#fG2)8z&4$fd zhJk-_IkK}Qgn&e*pwhp1ECa}HxBg&XMT?0wi?Q`M+3n`?{WOt)M7E$J=5j`VV;PQ& zi~umve~?H(vQ1twoez(SNI+tu|6r4rVSnJnt~6&4>ARL+cCT3EVW{Umdnm<;UHX|K z0!UK=-{01^;$XOA$prspjW35_xP$tEEKTXT9H3tghIZ%;`Rw##i7W?m?)rtqavvxv z_9vaN!uKy|nlX3mavQ7QzF(i>&tCqROhLsP3D~4tnF$%lq*XolQU;1S2)FxKSAWx3 z=kxN%l=W)%IC$RYg&Jt>K0vV=m`ZDOZlC0X5&h<>C<>?csQ|qFRpUBs=HI#?A<MGS zcJh_1g>UT-(E0NNLSCWS0Kj`+%gC}GH2s6_va_#ol{WJoTjeH^N8!yCaKz(r&fMq* z;GLHh6h-03k5vAgaL}=}F*<-#`+pj|S>&hl^ULy`eG!8{+M6Nd6*zOFn|M5qvsSCU zyJ5oyF8}6a+tV|=_)LYo=w{C`cT;)aKT^aIbh77|zL~gOE)+%K^zkZpf35M_$>y@3 zK3?VTtb;wr+*B$RTrL+!dozUP2Yh(5$M`}P>^{#|zTqy7`WDvudHyd$F%k#1nh)ph P00000NkvXXu0mjf3Z#UN delta 1100 zcmV-S1hf0A3g8HkBYy-ZNkl<Zc$~GDOK2Nc6o$VU$+9$(<tTotU@8cMAhv59C|w0C zVlb(p-FTDO-Ub3Cfo2tGvuPpSGz$}wRmq}tyJ$BpZ6U<%7`kZFEDV*i2&!9`KxH|0 z72EPik!9a5rZbwCWIMJ0)y#kIIsdump8Jy0>9hbC92_K<%YQL7u*h-Zv&8{aRVACv z0uXeIpNL8<eAja<;=|(w&b{&*KjaL}Y&MHDF)<<B;;*;09ZLX@wze1^FQA^5xO(q2 zs;VNp#Yehh$080e(jBw1J2kLKE|)W=zz;h@u(!MG;97%0Uesz$Mg01-2E8)Lk_=D} zpeHFg1E|%Qntz`MKnAE*nH?MBqNX7MvzZK&n&xrr$IoUmzCl>NPedi+31>q<l90>} zHke_CTZKd5uqgK!_6?`N4nKj)3(4EDTJ^PSG<xt3(88{$k8o1cn7n_#p_7Z62GuHG zjgLF{Nljx?)0)<e4Dftguvv6A1SFpk0_A+(!+oB~Kz}I2#DfP8em0Y7IRDSLZBvje z$(|Z;J2DYTCOxUPV^;{u`8<(i(kjM%ix6P`+kmH0UtC1!I$)beyLh!qIhS+%14KGH z0Gw?un9EQa8X6MCVv$%Z#>mD7Bi%8!%SQUmxwA)a=ls6qK)`qZ0Ek8e^Q$H1+uJFX zN+c4AdVdB+M@KzTwg!Wq)Y-ZHzWwaoS~7qTf|H3RMQ{kTG$>v>P9_ov;o1i}ySi8f zzWlSm<>3^6<tx6%-><ARb^c~=uP^^<GR)nDWxAqKI=i|o-nTSM`Ys*qEgn9m1YiX& z52t)Z?k+6*+L=E6;0fT2qVVaHr@oy5rqg{5vwt(4?rUm$Mp1CLS^=y*d*<jE4~MP) z%}RxMIE)f$VSQt#p}_ja4%6vA9zR_t9u8Y}n-yokb}cJ_e~R_3@KjHmwG;uAP{{c3 z&!Q)Y-gw+$r-VX8BZ8&EmPgB4hI4as`#RsToe%#9b}bp;#`!#VE;Zh@jv99^<+yR) zIDb=u0Fi>kk59Z?u^R_j;|E2gVEB^3xExHKJ2Kw~f_Wincpq>>ddc~hglJkj)++cr zZj`uOtFctr;#7~{)%@jxP=KYv7ILiyEzXU~3c$RO?EQCmm`mm;vFCFzSxg}>NR6!U z@mwbWx~_BULK%SfzV5IL?EJf5L{JpPYJdCi?R5|D?hlZ9v_~Q;IRgOr;2Q-+F^pD! zGA<&iu}+7$$#<Vs93qF|LAQL$s;YAPVLt%xzonz=IzN9>=8xZHy3f`}2XN~`owtkp za<9^qPmOh2{I$_F5>biU5BpJ76)Bxg3-fXM&Kr*@ZVS5lLtMETbfovAtD68^xkYIt zO;HqdU1#QcjoR{#C+#!WYo7ksM%U<2_L%wgHS2{e`905%X2W&D+``<?^M3&*vdBAh S@{6Yc0000<MNUMnLSTZU_88s( diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/closing.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/closing.png index 4347bf8afe785188644d457001161726d8b4d68a..f576893854df8185ed7fab0486e7fe68f2e99f1e 100644 GIT binary patch delta 3147 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 delta 15336 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 GLSTZ!xH^jf diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/meta.json index 7c1ec64f62..792da88fc5 100644 --- a/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/meta.json @@ -154,6 +154,24 @@ 0.4 ] ] + }, + { + "name": "pressure_unlit", + "delays": [ + [ + 0.8, + 0.4 + ] + ] + }, + { + "name": "temperature_unlit", + "delays": [ + [ + 0.8, + 0.4 + ] + ] } ] } diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/opening.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/opening.png index 79a05996ad2d11a989475233ab58158551341a2c..d12ecf2cf8182ccb790c9c548216e1909a3b47f2 100644 GIT binary patch delta 3431 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 JPDHLkV1oSkqkI4W delta 15487 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 Br@8<D diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/pressure_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/pressure_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..14bb8f4c5a6823adbac4c58fa35218fdc3473d86 GIT binary patch literal 969 zcmV;)12+7LP)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004RX+uL$X=7sm z04R}lk-ba9P!z>aTZ^KV4muR+kfDl03q?^JrGj0mLtDYBOY)kuLXw7;6e+HPi$lRd zbn$EOKhRZhRS*P45OH+&YmpM~YYHvWzHoDYocGS<<pl6&bY|FnNx(22o=vBu)xw(8 z|BfJ{R5OUk%(j+ti+S{1KacQ<{*Vx}dY|jMhKj1q0N()dEVH;nJWrh2axB4n#G|Y% z7l}`Z<D4!?d@FRt<2S)2kG}--e0Blwi<wfXgOv_uWo{5p62}a^%3AjkUlLNyl^pdk zswiw^kwyv<6jZSZ9S#!IP0FmhFWK}hqe31=ZwobWa+FXeZ=BRBO;xFDq^tDksEOSF z=V@!xQ{MDY3JAWs?&mnrzYjF(uKRoHx{Wg+@B&<$ZGVMwn)@cb-qvErKzIkZylHF7 z0dTboM4l~~%S|aj<<~Ue;{q5i03-Ln;JTMpYai!NKz^Hk(H(Gj1WeHR@Wvk|%4i%F z=NcaX00I?BL_t(&f$f$tXcJKwfWLQSNbs~l+Y(Hz^l}*@f>R1E;(jKR*3C|W(4nQP zV3T$g(b>fo(}->f(n$~;Gju2zOp{PrsG%sta)p5Lp2H>5q$db>1)=Yo-u=V(9Y1&Q zK%r156bgkxp-?Ck3Wef~A&x)HEa$DTk<dpQ4g1;B()%Doi}}3uEs@YW&4&H<Nw97| zX#K<7dcoS7GW0dmjBOZ(zL?KjK}D8VR;&%fb#F}>`rLZqukLiYG#ga+U)+BdP#cNr zRnv?yJ^j3zOvZkhrXEz-P8fPMnRMNz8LN#%J>Ah#X|`hBd372~NS9rAv^3}r0pK{{ z$eSXME?wlDfG!a4&C#@uud?HW$BRYgfslYB0sBANp6+|V1pz;Sim&KNZUVOi90D(o z%|ifX0g(y#0!#w?K%_U%_zaf?*g|j~xD4z9cPHSXhuZ|M0ZpGxFA{(Od>)#I05TFD ze|7kN)s1(7E5HNkKb(>9R7&=M8gK-R0{1=Kb>IN^3kaG9?(z?Z=I$?`X`LG%UNa+s z-iyum=Dy3C*4Zl*ctOuC;X2aO{SIhLNc)bS<dcL=3DKc>sDBtgXxOQ)Y*mF=NNsPo z;yXKbQ1N)PX{Q{gRfUCAz1|wro1X4=HoKZGm#Ad2t3kE<Z1&yRLHEEt;C3!&O`7JZ r-UD{)b^Bv3_ut$D6bgkxahCZFv`4qt2g`0I00000NkvXXu0mjfc$CSb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/temperature_unlit.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/firelock.rsi/temperature_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..593d191641f0d01b1fc4b9effc27bd85afea705f GIT binary patch literal 1055 zcmV+)1mOFLP)<h;3K|Lk000e1NJLTq002M$001Be1^@s6qMd$(0004RX+uL$X=7sm z04R}lk-ba9P!z>aTZ^KV4muR+kfDl03q?^JrGj0mLtDYBOY)kuLXw7;6e+HPi$lRd zbn$EOKhRZhRS*P45OH+&YmpM~YYHvWzHoDYocGS<<pl6&bY|FnNx(22o=vBu)xw(8 z|BfJ{R5OUk%(j+ti+S{1KacQ<{*Vx}dY|jMhKj1q0N()dEVH;nJWrh2axB4n#G|Y% z7l}`Z<D4!?d@FRt<2S)2kG}--e0Blwi<wfXgOv_uWo{5p62}a^%3AjkUlLNyl^pdk zswiw^kwyv<6jZSZ9S#!IP0FmhFWK}hqe31=ZwobWa+FXeZ=BRBO;xFDq^tDksEOSF z=V@!xQ{MDY3JAWs?&mnrzYjF(uKRoHx{Wg+@B&<$ZGVMwn)@cb-qvErKzIkZylHF7 z0dTboM4l~~%S|aj<<~Ue;{q5i03-Ln;JTMpYai!NKz^Hk(H(Gj1WeHR@Wvk|%4i%F z=NcaX00L`CL_t(&f$i2oYZE~L1>m=nX*UTQSQDY!NK)yxY-9D3i&RXJdJv6>haMy8 zRS(i%Aove@@~8>)SWrPNIkaLCqM&%FwWlpji)nf&Nt-oEV|KQOxTR?#2)hTN^POgg z<vnH?m;uf>;pE4w`@v*{c%;wE%y?AUd+TP=GdYyJIz^-(<)-oA{l2T&P7r%wFW#3k zl~F&HmPWLsTO~^)T5{A+C11`|E}iR_R-Z=xn!OSlNW0bhFWJW%U@tz_C(cEiL<zQ9 zl3T^WR!fRDi4yA*=X^O+2~@3~*(;%ebiyQ=d{}XP6Y^mtoiIt}^d?XMu;fAS*Wnvr zGa+DT2yA-`biWL%Qu7LxoraTQOCI!oOI!n!Wgrp-D-^)OWmxiZS2nwQ8yFu4TVDrW zJa<yth26RX#A0A;Yd|)0Jl{S63-j=eUIZJ{fOs5C)6k3z0Soian-}I`MWbNapX@OW z*7@Gqma4Y@QHP!Pp2E~&ARcdboIn8p(<%6#OrfS%fqDaEdkaFP0!*izH&3U~fA1#9 z!2wXKgA@u7)H3k6J6q6o!0QFkH=OsLLi7!wUu<`rKmkCg>@+ruA3!oSpicy$fFSwd z^!VG^-}9e9%D;dXKz<*BJnWrK-Yf#Ib0B`pX>Avhdk4H+1o5zrd1?=;0m0Z3X~{z{ zt247CQfjzWzH51mLuQshJ+qsHmLdV6XZGaYZZ;oQFi|XJ-RibY6ieBBSixj*w<Ejb z9grEkki0B<rA7e8^;O-~yZYl5H7Pd)>5EY}W_Eu5H}3$B<2a7vIF92uj^j9v<2ddt ZIRcZu*l2X%Q0f2x002ovPDHLkV1j2x=EeX3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/meta.json b/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/meta.json index 3462a1492a..45e8a43117 100644 --- a/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/meta.json @@ -291,6 +291,14 @@ { "name": "welded_open", "directions": 4 + }, + { + "name": "pressure_unlit", + "directions": 4 + }, + { + "name": "temperature_unlit", + "directions": 4 } ] } diff --git a/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/pressure_unlit.png b/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/pressure_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c5be8bbf9906bd0321160e733c72a0debeec86 GIT binary patch literal 637 zcmV-@0)qXCP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0004RX+uL$X=7sm z04R}lk-ba9P!z>aTZ^KV4muR+kfDl03q?^JrGj0mLtDYBOY)kuLXw7;6e+HPi$lRd zbn$EOKhRZhRS*P45OH+&YmpM~YYHvWzHoDYocGS<<pl6&bY|FnNx(22o=vBu)xw(8 z|BfJ{R5OUk%(j+ti+S{1KacQ<{*Vx}dY|jMhKj1q0N()dEVH;nJWrh2axB4n#G|Y% z7l}`Z<D4!?d@FRt<2S)2kG}--e0Blwi<wfXgOv_uWo{5p62}a^%3AjkUlLNyl^pdk zswiw^kwyv<6jZSZ9S#!IP0FmhFWK}hqe31=ZwobWa+FXeZ=BRBO;xFDq^tDksEOSF z=V@!xQ{MDY3JAWs?&mnrzYjF(uKRoHx{Wg+@B&<$ZGVMwn)@cb-qvErKzIkZylHF7 z0dTboM4l~~%S|aj<<~Ue;{q5i03-Ln;JTMpYai!NKz^Hk(H(Gj1WeHR@Wvk|%4i%F z=NcaX007BJL_t(|obB1c4TCTcMA60NP=!lNX{jRR>~e4piG)!&*t3!UJ6jsGfQ<$- zB;dX;k$K8}H}{x&K_8iATIhu;%*-)>ZIflD7{D_^mYHJ!i)8jKeF^{o0001z2|-aY zTZ%$NsSRN1LgJ#99`*_-s_>3trmdyb+5m*Lv|2IK*3xQi0D@peW?yGB8u}fOU;~7i z&Dn|0?sh4!+iU*P`^>NI@ra1p&j0UkfM3=O!V>@h000000001hMeu8EIDU>=>L=g; XeGsrPB3CeO00000NkvXXu0mjfu&Ezo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/temperature_unlit.png b/Resources/Textures/Structures/Doors/edge_door_hazard.rsi/temperature_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..eee51f1e0d319276e5030d99543d2baafd5c04aa GIT binary patch literal 671 zcmV;Q0$}}#P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF0004RX+uL$X=7sm z04R}lk-ba9P!z>aTZ^KV4muR+kfDl03q?^JrGj0mLtDYBOY)kuLXw7;6e+HPi$lRd zbn$EOKhRZhRS*P45OH+&YmpM~YYHvWzHoDYocGS<<pl6&bY|FnNx(22o=vBu)xw(8 z|BfJ{R5OUk%(j+ti+S{1KacQ<{*Vx}dY|jMhKj1q0N()dEVH;nJWrh2axB4n#G|Y% z7l}`Z<D4!?d@FRt<2S)2kG}--e0Blwi<wfXgOv_uWo{5p62}a^%3AjkUlLNyl^pdk zswiw^kwyv<6jZSZ9S#!IP0FmhFWK}hqe31=ZwobWa+FXeZ=BRBO;xFDq^tDksEOSF z=V@!xQ{MDY3JAWs?&mnrzYjF(uKRoHx{Wg+@B&<$ZGVMwn)@cb-qvErKzIkZylHF7 z0dTboM4l~~%S|aj<<~Ue;{q5i03-Ln;JTMpYai!NKz^Hk(H(Gj1WeHR@Wvk|%4i%F z=NcaX008SrL_t(|obA{_4uU`oh2i1_SaJuv0pa+@8|WQedV;#Zg&~3?v3AJ&zl2R0 zLZ_L~l*TINZP(9Z&HZ-$<ulE;)Z#ria<OqR8waz~dAiJwOB>qqOtl3t`_Bmg#L0gH zsx1Irz~}-%P2Byf_+A{c6UasZvJ=Qg0kRXwCSL#m+E&M5g>iJT0RQ?Skxl*t0OI7o z0d#@2n+hiY0DwU6+TuK3vSydO?RsxJpKs(fUa}@K$N0a(<M26NvL*-x2!F#g3#`XW z)&!9+Ksf0x002-Y-3A$k%$NlzK;^T5d;!8qcL4xE<sLS&=_7w7o7(^Y002ovPDHLk FV1ntmGG+h( literal 0 HcmV?d00001 From f2817f39bb94ee52a19d041472515f2414d64536 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 22:40:35 +0000 Subject: [PATCH 514/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 016456993f..eb1e9c45dd 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Coolsurf6 - changes: - - message: The "Jazz" style for the Electric Guitar now uses the correct soundfont. - type: Tweak - id: 7806 - time: '2025-01-13T10:07:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33363 - author: southbridge-fur changes: - message: The Pride-O-Mat vending machine has been ported to upstream. @@ -3901,3 +3894,10 @@ id: 8306 time: '2025-04-21T20:15:20.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32003 +- author: ShadowCommander + changes: + - message: Added firelock lights for pressure and temperature warnings. + type: Add + id: 8307 + time: '2025-04-21T22:39:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28339 From 00cd08231a224b2290441e71656783966cef5bfa Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Tue, 22 Apr 2025 00:49:43 +0200 Subject: [PATCH 515/622] Fix bots parenting, emotes (#29949) * Bots overhaul * fix * change speech sound to pai * purge a lot * i forgor :trollface: * adjust * that aswell --- .../Mobs/Cyborgs/base_borg_chassis.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 38 +++------ Resources/Prototypes/Voice/disease_emotes.yml | 8 +- Resources/Prototypes/Voice/speech_emotes.yml | 78 ++++++++++--------- Resources/Prototypes/tags.yml | 3 + 5 files changed, 61 insertions(+), 67 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 7d63ee873b..24f66948a7 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -237,6 +237,7 @@ - DoorBumpOpener - FootstepSound - CanPilot + - SiliconEmotes - Unimplantable - type: Emoting - type: GuideHelp diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 2a959a1099..ceb9e67330 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -1,33 +1,17 @@ - type: entity save: false abstract: true + parent: BaseMob id: MobSiliconBase components: - - type: LagCompensation - type: Reactive groups: Acidic: [Touch] - - type: Clickable - type: Damageable damageContainer: Inorganic - - type: InteractionOutline - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.35 - density: 50 - mask: - - MobMask - layer: - - MobLayer - type: MovementSpeedModifier baseWalkSpeed : 3 baseSprintSpeed : 4 - - type: Sprite - noRot: true - drawdepth: Mobs - type: NpcFactionMember factions: - SimpleNeutral @@ -57,7 +41,7 @@ - Stutter - Electrocution - type: NameIdentifier - group: GenericNumber + group: Silicon - type: Repairable doAfterDelay: 8 fuelCost: 15 @@ -65,6 +49,7 @@ - type: Tag tags: - DoorBumpOpener + - SiliconEmotes - Bot - Unimplantable - type: MobState @@ -93,10 +78,6 @@ behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] - - type: Input - context: "human" - - type: InputMover - - type: MobMover - type: Body prototype: Bot - type: GuideHelp @@ -107,6 +88,10 @@ speechSounds: Pai #couldn't decide if this should be borg or pai sounds so I flipped a coin. - type: TypingIndicator proto: robot + - type: Vocal + sounds: + Unsexed: UnisexSilicon + - type: Emoting - type: ZombieImmune - type: ProtectedFromStepTriggers - type: NoSlip @@ -367,10 +352,8 @@ description: Why not give the mimebot a friendly wave? components: - type: Sprite - layers: - - map: ["enum.DamageStateVisualLayers.Base"] - state: mimebot - sprite: Mobs/Silicon/Bots/mimebot.rsi + sprite: Mobs/Silicon/Bots/mimebot.rsi + state: mimebot - type: MimePowers - type: Construction graph: MimeBot @@ -400,7 +383,7 @@ - type: Sprite sprite: Mobs/Silicon/Bots/supplybot.rsi layers: - - map: ["enum.DamageStateVisualLayers.Base", "movement"] + - map: ["movement"] state: supplybot - type: SpriteMovement movementLayers: @@ -452,6 +435,7 @@ tags: - DoorBumpOpener - FootstepSound + - SiliconEmotes - Bot - Unimplantable - type: ActiveRadio diff --git a/Resources/Prototypes/Voice/disease_emotes.yml b/Resources/Prototypes/Voice/disease_emotes.yml index eab4b0bc33..47a203e1fd 100644 --- a/Resources/Prototypes/Voice/disease_emotes.yml +++ b/Resources/Prototypes/Voice/disease_emotes.yml @@ -13,8 +13,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-cough"] chatTriggers: - cough @@ -60,8 +60,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-yawn"] chatTriggers: - yawn diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml index dca222b420..53cf905845 100644 --- a/Resources/Prototypes/Voice/speech_emotes.yml +++ b/Resources/Prototypes/Voice/speech_emotes.yml @@ -8,8 +8,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-scream"] chatTriggers: - scream @@ -38,8 +38,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-laugh"] chatTriggers: - laugh @@ -67,7 +67,8 @@ requireAll: true components: - Vocal - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-honk"] chatTriggers: - honk @@ -84,8 +85,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-sigh"] chatTriggers: - sigh @@ -101,8 +102,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-whistle"] chatTriggers: - whistle @@ -118,8 +119,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-crying"] chatTriggers: - cry @@ -139,8 +140,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-squish"] chatTriggers: - squish @@ -157,8 +158,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-chitter"] chatTriggers: - chitter @@ -175,8 +176,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-squeak"] chatTriggers: - squeak @@ -193,8 +194,8 @@ components: - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-click"] chatTriggers: - click @@ -210,8 +211,8 @@ components: - Hands blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-clap"] chatTriggers: - claps @@ -227,8 +228,8 @@ components: - Hands blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: [ "chat-emote-msg-clap-single" ] chatTriggers: - clap @@ -246,8 +247,8 @@ components: - Hands blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-snap"] chatTriggers: - snap @@ -273,8 +274,8 @@ components: - Hands blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-thump"] chatTriggers: - thump @@ -297,8 +298,8 @@ components: - Hands blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-salute"] chatTriggers: - salute @@ -341,8 +342,9 @@ whitelist: requireAll: true components: - - BorgChassis - Vocal + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-buzz"] chatTriggers: - buzzing @@ -375,8 +377,8 @@ - Nymph - Vocal blacklist: - components: - - BorgChassis + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-chirp"] chatTriggers: - chirp @@ -393,8 +395,9 @@ whitelist: requireAll: true components: - - BorgChassis - Vocal + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-beep"] chatTriggers: - beep @@ -410,8 +413,9 @@ whitelist: requireAll: true components: - - BorgChassis - Vocal + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-chime"] chatTriggers: - chime @@ -427,8 +431,9 @@ whitelist: requireAll: true components: - - BorgChassis - Vocal + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-buzzestwo"] chatTriggers: - buzztwice @@ -450,8 +455,9 @@ whitelist: requireAll: true components: - - BorgChassis - Vocal + tags: + - SiliconEmotes chatMessages: ["chat-emote-msg-ping"] chatTriggers: - ping diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 910c24b303..09c205686c 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1144,6 +1144,9 @@ - type: Tag id: SilentStorageUser # used in SharedStorageSystem, so the entity will do all silently +- type: Tag + id: SiliconEmotes + - type: Tag id: SkeletonMotorcycleKeys From 3e4c28c038fc7a46ec7abf88e2edf44d283a5cd8 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Mon, 21 Apr 2025 22:50:49 +0000 Subject: [PATCH 516/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index eb1e9c45dd..40bf6fc7d0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: southbridge-fur - changes: - - message: The Pride-O-Mat vending machine has been ported to upstream. - type: Add - id: 7807 - time: '2025-01-13T18:49:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34412 - author: Killerqu00 changes: - message: Pet carriers can now be crafted. @@ -3901,3 +3894,12 @@ id: 8307 time: '2025-04-21T22:39:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28339 +- author: lzk228 + changes: + - message: Bots now can examine, use zoom and see their alerts (health & stamina). + type: Tweak + - message: Added borgs emotes to bots. + type: Tweak + id: 8308 + time: '2025-04-21T22:49:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29949 From 907aecb0aebc3449f2fefbec744cc5b608280905 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 21 Apr 2025 20:26:29 -0400 Subject: [PATCH 517/622] Fix identity grammar (#36817) Fix identity --- Content.Server/IdentityManagement/IdentitySystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/IdentityManagement/IdentitySystem.cs b/Content.Server/IdentityManagement/IdentitySystem.cs index f1b34c16fa..f873273f80 100644 --- a/Content.Server/IdentityManagement/IdentitySystem.cs +++ b/Content.Server/IdentityManagement/IdentitySystem.cs @@ -103,7 +103,7 @@ public sealed class IdentitySystem : SharedIdentitySystem // If presumed name is null and we're using that, we set proper noun to be false ("the old woman") if (name != representation.TrueName && representation.PresumedName == null) - _grammarSystem.SetProperNoun((uid, grammar), false); + _grammarSystem.SetProperNoun((ident, identityGrammar), false); Dirty(ident, identityGrammar); } From 5b18f99b8db8ea4c926b8f1afeaea45c1faf6f87 Mon Sep 17 00:00:00 2001 From: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com> Date: Mon, 21 Apr 2025 21:03:36 -0400 Subject: [PATCH 518/622] Fix Animal Versions of Captain Uniform (#36804) * scienceevasuit * update money uniforms * update meta.json files and hamster hats * revert scienceevasuit * revert accidental prisoner eva change --- .../capcap.rsi/equipped-HELMET-hamster.png | Bin 574 -> 487 bytes .../Clothing/Head/Hats/capcap.rsi/meta.json | 2 +- .../captain.rsi/equipped-HELMET-hamster.png | Bin 579 -> 459 bytes .../Clothing/Head/Hats/captain.rsi/meta.json | 2 +- .../equipped-INNERCLOTHING-monkey.png | Bin 20893 -> 1749 bytes .../Jumpskirt/capformaldress.rsi/meta.json | 2 +- .../equipped-INNERCLOTHING-monkey.png | Bin 1318 -> 1327 bytes .../Uniforms/Jumpskirt/captain.rsi/meta.json | 2 +- .../equipped-INNERCLOTHING-monkey.png | Bin 21131 -> 1787 bytes .../Uniforms/Jumpsuit/capformal.rsi/meta.json | 2 +- .../equipped-INNERCLOTHING-monkey.png | Bin 1535 -> 1596 bytes .../Uniforms/Jumpsuit/captain.rsi/meta.json | 2 +- 12 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Textures/Clothing/Head/Hats/capcap.rsi/equipped-HELMET-hamster.png b/Resources/Textures/Clothing/Head/Hats/capcap.rsi/equipped-HELMET-hamster.png index e997023f3023c238335308c546b1dbd5a2b84f51..d65bcb4a766d6ad076962e8484a9e01478343bf5 100644 GIT binary patch delta 448 zcmV;x0YCn}1m^>gF@K>+L_t(|obB2%OT$1I#_@mXm{q$L1A<^%s0fbY-bDll#SVUp zf;foKZ{eWmAc%{*I0|B+RuF_rSM7RZIR`z7+N!xG1@-w&rRn9l9?A4RAR;32Zw0;! zqooz=K6lPfyzk?yRIR<`-<<7x=O<nmEv?uv3;}5E^eJ!W0DmyXjO8HW`EkDaKVI-L z_-Of#Vr80k^PaWSnUOb=G=G?+`9J<)E}FN6LV?|dE7tdNpRONn_Sw3er`zq)?_8yR z051QlLomi9&QG+_ARk$PR%3!<W%}*=cJrQcy$67O>}2*D1o_BL%~pn9f4FTX&QJc% zydJ_JS^oL&vVX_52N4kw5fKp)5fKp)5&5lB8zYsfHEWCkvg-@DPC^)lBXt7eM!w0% zv9;?Aq_sh(RIS-~9|6)C#gE(&8PpjF<_<G?0_^p=9n?nv|EDhTqG5CTdhvpd<4J%_ z`T;H*;9&KMMtkwyHJ@$(cs>E{5a4Ad@3a~d0F>*!)H%o0K|Zqa`#Y{L;9Jb_FBg3? qtIy&9#+fG~A|fIpA|fL4M?C|2V!91NY9`$P0000<MNUMnLSTXt2HKeb delta 536 zcmV+z0_Xkb1HJ^1F@N|;L_t(|obB4ZF9Ts52k>u&TU65G22E2v^%4n#$z<-<!GdUv z62c##A|istX0VDhDT~48Phc^ycr7CBa9%Fa=|~;}PtzWfd+ABU_cLAY?s>k?J$LQ$ z`vF8mME_R6?Z99%Bjj=EVAb_JZYk-Fa=w|Jb)D~cU@(~xrhnQ7v$YdqB8$Lw8p^{Z z6utN>8&R1rdC9juz#4qgzlgqpE}R};p#Nma^Fo~Ff5%OJz1<tt^Bi=HVJo_h`JH-9 zAH@I^05n1?%wT2o4U_sf)bkulb|-Z}=1bNu000!d=s4fen+k`*A{1)I{z41-2D-}U zPmeE<T7HCKJb&TYc=qjQpv4nH?-}{=x_Y*Y{LPi4e8-EGn_%Vl!&|eXky!csec|rc z)<8r=L_|bHL_|bHL_~j8&B{nhdP69B5rBXF0<tH;RNFlD1XS`oiM4DkCbDRnYp?kx z1d|!@vUZEWb{atKO7V4G7gg#Vs_Gd4{P_apoHD~~?SDk6cc`jU#SK>r)ih1$-D8k% zUe@OaulI0YxN}^hww)VKh-f5+!;WD9C}+#QfP6mhUx&z-#e8l;!{H`m$$EdG1pts* zeysT>Xz_%ooFDiohrbR^xqf)S<9|Rn6t4RGD*Fcf*Z_HK7*AE#*b_iRL_|bHL_|bn a+dCLn;t_Fv>6^^}0000<MNUMnLSTZWvj`{v diff --git a/Resources/Textures/Clothing/Head/Hats/capcap.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/capcap.rsi/meta.json index 2a334f52b7..213c954df1 100644 --- a/Resources/Textures/Clothing/Head/Hats/capcap.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hats/capcap.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/0671297bb1c1b31d5885f2768aecbe9dc51d39e7 , edited by Skarletto (github), edited by Emisse for ss14, inhand sprites by SeamLesss (GitHub)", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/0671297bb1c1b31d5885f2768aecbe9dc51d39e7 , edited by Skarletto (github), edited by Emisse for ss14, inhand sprites by SeamLesss (GitHub), hamster version edited by Ghagliiarghii (github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Head/Hats/captain.rsi/equipped-HELMET-hamster.png b/Resources/Textures/Clothing/Head/Hats/captain.rsi/equipped-HELMET-hamster.png index 81ed7934ce49b89ef0f600b61790221efb7af93b..d27481309b99b1ccd5859893ad98ed6fcb3910b4 100644 GIT binary patch delta 420 zcmV;V0bBmV1j_@EF@J?gL_t(|obB4NYQjJq2Jo-Bb}Cdd6mbp2At+b~g-+s2bSZrW z_u?$Rfm^3;eFdlPr3x2Z4!TNk@CoX5C>NrY8t)Pd?e|-f;F<65UCeTSfQX2QZ0NT; z{hRsn@!C26)aFYfh&2EtQ<a^6yuY5f7ISF6RH<{mXA>Sp5r1X_53Q>Zvw?>win2ng zCW2V|z7OB`F-p2H=eGF=O~6HXlZ8l?BAF^kl>z|H#o5N^RckaF8%JA(9~%+GdN%MN zRf<v41pq7-i>!c$)(hHU9i8F2lE1^Q{5;$ILIX{BXSm)w){HB25=0Q|r`sj&pD*{0 zHRF!?P9h>AB7Y(xA|fIpA|j%Hr;PpjV`o_P2W-pl*H^8Ko`AfA`vbP+`vuIk>pg$U z0#IsCg3|<;9}j%3OgpT**0WbTtY=SJ8I#~N0cO<!pg(D%H?Fzdu8`iihW@0vvj!X1 z?*I|RTB;QD`S+dy5yZOe{du#}tJMnmqiiiJ$s-~nA{`<kA|fLCqdozUp`M;mBMYej O0000<MNUMnLSTZryTxGu delta 541 zcmV+&0^<G41H%N6F@OC@L_t(|obB4ZYui8=2JpwG92$hC8e_;JQw@P=Fqu4L@T5PX zP&;er(p{)i3f;1KDV;*v8r;1@ClA3CFZN(V2AO&(2qP~k8HzxDyF_k@NwFn4q44}b zps%~<IPRu<0U{zIN<)TC`QP)Oq-msDZ2^GE=)>wh`uM7lb$>9Ak-v2#)oM%h^cgzZ zOW0N!V}FhpzurMDrVla+N&edVl=;PNem1PSXoC*aVhY<T<Dh22w#rb8DYQWchE?DB zmPqpdmgJ|g@dW6OC)eF7`fdyr1~}{;V>0q_*gJ*_1N7Y(*WD^~$J@yy=#D2cY)X=^ z7Sli1ZN3bfvVU#<MoY#tO?mr#iIY(i08sqiTl;5OZ2$n?*FNEOw}{znmfLoC?0h03 zA|fIpA|fIpA|j$Y9->|#?~JWZhyO*j+A<mWd3ATM$;e;T1mq#}1Q=FbbjOqPy)yvF zb#QkjeV^~0L3cdK<2XK5g-F7%>awgh5S1#cdI9x0K!22VRQFI}fP<O^0Em86pwNH; z$WQ-U>XYD1E1>VjxY<8~3Io{VQxq;*h)R{6)d)nT3JMo3*yB^EFu=|J5&CYNsn66a zz%)%6`*Y}5mjD3c%bV4=z8k~-nrU2XbjOq8pabppd0A~hzq-U&o5M6sVLbp55fKp) f5fKs5Mizbpyz<wl&x3+*00000NkvXXu0mjfx7Y(6 diff --git a/Resources/Textures/Clothing/Head/Hats/captain.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/captain.rsi/meta.json index ae83b3a1d4..a37d024058 100644 --- a/Resources/Textures/Clothing/Head/Hats/captain.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hats/captain.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/69842/commits/d8138946b0ed06fced522729ac8eaa0596864329 edited by Skarletto (github), edited by Emisse for ss14", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/69842/commits/d8138946b0ed06fced522729ac8eaa0596864329 edited by Skarletto (github), edited by Emisse for ss14, hamster version edited by Ghagliiarghii (github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/capformaldress.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/capformaldress.rsi/equipped-INNERCLOTHING-monkey.png index 01587136da77fb05d931839c129e8a0c34470c43..55c01ba665f835ce051b1bf50bb112143babecbd 100644 GIT binary patch delta 1734 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 literal 20893 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/capformaldress.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/capformaldress.rsi/meta.json index 781a55f15b..d4d7c3905f 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/capformaldress.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/capformaldress.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/commit/30892aa892a2be846592b068ab71c606e2f0c5b7, edited by emisse for ss14, monkey derivative made by brainfood1183 (github) for ss14", + "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/commit/30892aa892a2be846592b068ab71c606e2f0c5b7, edited by emisse for ss14, monkey derivative made by brainfood1183 (github) for ss14 and edited by Ghagliiarghii (github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/equipped-INNERCLOTHING-monkey.png index f7e8abd58d4b14261df308e958f5193891a7ed13..a49fbd18d0f60795672073cc7dabfdbcee0d3792 100644 GIT binary patch delta 1295 zcmV+q1@QW&3a<)~F@NbvL_t(|ob8%#OdDk!$G_Khv2aI5T9%Ow+LW%T>$))<EYT1W z=bNQM3<5KOsxc;eWwK>6W)UTwaXO8d&6he8UnmKTK?n)@#u?4#oKwcq(jg2@4?>n$ z2-CZ@M7qZpU5~r9!aYDavpt`rx%B=#-|zG5^QXDr4`47D41WfL!C*X^aC&YU92|t# z>qY;m=SiTh5VdCuaVKTt22Z~N00_2sl1oSKV(5pvNVp>0zI}u1ZZwzvc>ietKuz=E zEd7Rt23_sy3c&dIICdUvB|e`I01%BvAqWB_Nm7pLYj3~w%en@^>-D1g*_TO4**5Sz z4_THmJ3Fgfw}0F1%K7;8434#3;X)yOZCmu*<neek-xqtma34>?Znpyf91cg;GxhcL z`W#Te^StJm>wKKDO<g0vTv4t3`l2W*9akF>MNtVvG#W*!z`<d(kJ3&y=PVW+bJY;1 z*OR5AMtwf^+XViaxT33XCK@xMC_<7X3<Re%otI@9l7A#Y6vZs_YvG*5f)|BN8hw&j zfGo?J`(#-LNi1aP>p_>pk#-aORVjRUHjacV!tFg(O?*BmMq;rTM&AFG8yeb0-Z-)y zk?STv=*QJIGqs@y8DG4I%O_GA{g1zTlAvsxa!-7E2AALcNu{5{?pN0=y+pX1L%5qm zC<K&mEq@`E?lRJK!b!+*8wr2DpH#ZbNcq+h5()u?6oHT;gu6L3tx>n>{wJePNRgtS z>zL6Gck3Gc0CbLk2eAoOd~iOA&%VBjIVlO7V8xu2MAJ^Ka4#XNX+Dcck9MZo1Z&oD zPD-w-ZC#-v_dBw8M>$b<IM;FH)|CG6Q$nN9aew-3P%VP3wZ*Ur*8lvp))wRB$-MPH zFZxtdAmNH|t?-jTU18R>%)c-ybxQJ~PrU{tToDdJTE~A#002aKBm@G$g`2dk(X-zA zRBJ$5Y-!f04J@6zNAH4y<@B51`UHr7kFmM)y4L{e0Q{f$^ck)F!`~7-ZfkjT0<au; z*?$EdMpyuhHefU?07e@y8WsSf4HyjzfYAnwh6TWA14hFFV6*|FVF57OfYGo37;V64 zs9%b5{wA0cA_0KK$!mFi3#=E5yM_Qjs=&dK$OWorsa}a?I`4EkHF^5^8{Zich~mnp ziMlo*7K<rC$jd9SP)i?<`erc@oPsRN;D31@^IvRNeu0g|;;zwjejqr7qrO>$TIf>p zR3pIRt|3mR6O)}*yx#F6`sF8-G`TFxn7r7#AtS+kpqZ$38~I^;^v+XoA5SWyKyPir zsusaL9cG+~ri&!H8pi;nizVC#n)5yq)Sb_8CTho?j@6~&sRA(4Zo*`z6+!zjcz<)c zaN)Tx%auBT`1H)GOwf?gkY!oX<;|NAv=3vl(~6OH6T%(+y4$1M1%zuHs%|3T`Wu_S zDIxzvCzQ-=*LxN4S9w-$V~yPDu0Z7a7y@tpu4r!tkZ{F0RK<V^X~j0wP^|%x9uxeB z1UO0`BRfiqvr^NyZqGx!{byd+0e?s7mSwaTxJ;UC_Y3-FBlR{|nf!U#96bO`mDEx1 z$9iy-ZXp1ctq-_i-A}a*QcZzSOCJjU@T2R}e9kHjAf3ZcxYk}BmW$U8maeGXNU2Tz zPcRS|<$zs=)CjCp9}ozPavPDNXD}EH27|$1FdhQ_1vuAVOk>ezMF0Q*00>D%PDHLk FV1k6^YuEq) delta 1285 zcmV+g1^W803Z@E>F@NAmL_t(|ob8%lNMuzU$G>N^yTfvIL`GIYUB>m#3L`d2YYr+% zJ;<0sSw<rpM9@=F_z;q%qf_nHgH-flZ4kr`=(hP_TF}N&o6QbUw#;3WaTu@_6dYuC z9GXee(}Q!bGdYd-jNWeSo(~Ln=H8j}{r-NO`#Zz^9e~5(aDO-)4u^ApLezX|W@ZL; zb#<72`$_6(KZ%y9#}HdxA~P4C2LL?#k&pWNu3_$nKM=P_q^W7<*o|h=4^CeM06g^a zX9x7VySr75t11D(U{Dcn@}7s$@4;?W2V$#BL@Yl`4Ph@5%})H%@wp~RNDaOrFbW|O zg0QisT;DD!!+*B98i9rpMc?I8H@2z-P)cE{wbMki6Wiu$08mWG;_^A8--CgE9~l{; zY*8M9sn$-TUBk*}AreyF%lZINI6H=ce&6vXps=QeM!SX~E?!RyxNvq1vMD(svHG^X z^FkTHtuNKN$ik)kd<<9~rqQlpCFs<EWm2yd&W<6v?0-`gn?bD+S-|M`DDM-^PUV`> z?@9ZfZ2l-*%FoAn@d0IAVPh>#Kh>Mj?}4zfcHr7!sB$<zxC5*02HyMNCgLp;8NUpQ zX6Ihe$>aQ6H^|)F7JcoNMo0@gfH)0*e;$*WOa%Yh&8RO_bzr-s48q153}Np9{e~Bg zEWJ-)l7ApDN#Jq;6{pO!@k}}O44$U+*M1uK^c-zGQ%);RnW@VKP+9;=3lNwj=slut zZ}KJUQ(B<tXFAIIfk{=fAArgk@K1_GBi_A|z$ah(u^CICSTtfYmOyWPy6_kDcnYC3 zm42rdi^c=T%~&F*u~n}E0PtXS1x*b&)A6^^ZGZLYXM{zc5Op?G7eN4UwicmSH2&+$ z*;<6rQO)AlM4#yvh+8D$gq1qlPXYj}wi-wa%K)JK0bx>SL<@c98W6Wg1Y%Ohwg{^Y zkfvgAIDo5*tfR4W-1<y407x%L);=+LE|zj`m)!*e+4P@!<3k|wJ(f1FsICFb3HU$p z@qeS~_Fw#t;%xEL_fG<{p~)(6FTxX`w*kH33DDbs-tYwIZ9s2$0`xYZH#`A)8_*k` z0KE<94NrjH2K0s}KyL$jlT%~FRBNXI5EaS@m98GIqZ}yc9HNG>Hzz;LkHk#1cDh^D zfmnUpen)t9NtZ+vbPiFuTP-eLM`{w(K7SHpo&iJlEjZe*p~<`7CKmxp9)F+EuU=&x zE@x7M7a}3-?-21Zjl)y}Otp6EUhjd`Rs(n51cXRvf3HAr>OXsOD&K-~@b0{cJx}XB z7{A;?iB)}DHm4eJV*C*Z8>fMiz0a}wHi$`McY{A^+8s*01!dgpJ$Q4x3<B1&{C_et zOfz79a0go#R^ZN?fFbM!kleTs38fj*8m0auH$xc0UbyonuytVt^MgAG3{R^bi){vo zKNHv%5w~o?^o^OCz8zIMvvcoM!TMYcfI<LKreRsQJ6Q#3VFZrX!)a~txFtehTLG41 zhm4R8(<&fM8DQ-bQCWI|R+knXXnswH*6-l=^*@Q038*YB$*L{4$r_$fSCW{Q!NYp= z0C3yfuF0}kSz1B?WZfTd(|AtXWzgAL1kaCmGVaolug5J%-yN2TmpV%i)qa9eJE!(| vwjRC1af@ixCf8G&!{Kl^91e%WxySe$*4>VMNvJ~!00000NkvXXu0mjfFpXjQ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/meta.json index 6eb08f0f32..a4286dcf55 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/captain.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "monkey derivative derived by brainfood1183 (github) for ss14 from tgstation at commit https://github.com/tgstation/tgstation/commit/dd97a0e45d904fffadd9d2caad22aedd0d09f3ab then edited by Skarletto (github). Other sprites taken from tgstation at https://github.com/tgstation/tgstation/pull/69842/commits/d8138946b0ed06fced522729ac8eaa0596864329 and edited by Skarletto (github), edited by Emisse for ss14", + "copyright": "monkey derivative derived by brainfood1183 (github) for ss14 from tgstation at commit https://github.com/tgstation/tgstation/commit/dd97a0e45d904fffadd9d2caad22aedd0d09f3ab then edited by Skarletto (github) and Ghagliiarghii (github). Other sprites taken from tgstation at https://github.com/tgstation/tgstation/pull/69842/commits/d8138946b0ed06fced522729ac8eaa0596864329 and edited by Skarletto (github), edited by Emisse for ss14", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/capformal.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/capformal.rsi/equipped-INNERCLOTHING-monkey.png index f7bd08b91d7a7f942208f79187dcf07a092433a5..4f53b6934e9c02d4d4a49f79f625fa46c65615ac 100644 GIT binary patch delta 1772 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 O0000<MNUMnLSTY_(Qi@! literal 21131 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 b1lrSiTm0fL<2TyBE^=Vx;E3gYlRo%2E8ATS diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/capformal.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/capformal.rsi/meta.json index b3cb02b281..bcde42c95a 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/capformal.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/capformal.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/commit/30892aa892a2be846592b068ab71c606e2f0c5b7,edited by Emisse for ss14, monkey made by brainfood1183 (github) for ss14", + "copyright": "Taken from tgstation https://github.com/tgstation/tgstation/commit/30892aa892a2be846592b068ab71c606e2f0c5b7,edited by Emisse for ss14, monkey made by brainfood1183 (github) for ss14 and edited by Ghagliiarghii (github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/equipped-INNERCLOTHING-monkey.png index 368d24a333193e5d6275c28b6b4599a3d292dfb1..c79f3a75ac27fb4720971e2dc52e9d8d9e1d1a61 100644 GIT binary patch delta 1566 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 Q!2kdN07*qoM6N<$g39Rn6#xJL delta 1504 zcmV<61t0pn4F3y|F@L#9L_t(|ob8%_XcK1`$G?|$S?n&2#AF&sC#n5mvBj0nYQtI( zHs<Q;A1zF5=f)W9AE5&Wqv%#sJ9QhZu;Lg6Wq*i;4zzz{hRTGnx-J&xbW5ehg-D4k z!PKBhY(rW5?2pS`lN$BCG-tYbA2{ybdoS<zdER^Oxi|N|fPadLii(Pgii*m!3CD7g z)9FNIWhI7>wNi6a5gLAY4e{Gkob!wK0Ra0>ddTzkCAdasF=w0L>gt@*Z{KQZ$=bLd zolEUx(3k3X>t-z1Z(-Ecuw0ZXUgzEqjo%I4x|v$KzQ?|k9@6;TsB`Z}b5jx4+^VLl zSF?BeN%}S39)HZ6E#R%2rET79L5;U3D}AO2AR-tl?3CEvj(JlV06;tAgEkz*yxEd= zPB%V?gB>33$Pr2^FiAX0SUNOR*eSZZTPka3eA2O~4*<m%j^bd4hjTdCB$%u#E^nad z?r!jtm(v_BzHk(xQDTS0s~Uy#S__98=RuEan8CPHg@1)OXxm27-QAMYsSb;z))ikk zis)Y+Cf}GIfm8wA_@H#0*xoMH>Ba}su0zuJm2j%C5c~P(q;|F8V48laZMyM6Xv4vW z>YfCXg=1X{sII+&ufF*Ma}5(*-&qj0w+l`u_hX-5;asj5ee%&(Ok7(4_+gB96v#3r z6F2`^%zvn_E!~NEvjy645E{SxA^n;URxF*umR4ZL0XQ5$$$ArQ-DIV~u8l;$caZmV zJ#F1&rIPg~ayS4YJ&5%14smE(p=?`n^A2(F4sjsTOZu7iqMg`rfLVhrLv3jV^cDcX zmz6)$;4k+Oi6>y>b<)25)wP(jO>mBpq<Aa{x_@zArpu2oG8_FX-!iq$^azNK^f-X# zl6s6>PXGXnyiVFTHx=Pr03b$TIb@^H`tD&)f&kD~Qcs=z5dc6Wo`5eT+z9~a?2n+W zq@K7ft#X=_g%bL*(zI)I769N2-9x~(m&3Z`>*%**RJLKQRIe0D=*#MWJ9i(z7m5jm zSbs3B&KJ6eJ9qW64am2?tPc44RxJn9Quzg=1rJ_)1%X(Q6Y6E_%R&i#Svg=iao4B7 zl=I0KDnu^y<qg&J7GPZ&V6I9R-u597o&@gt6nP6MslTEK$P4Bw!P!*8lfwBd$ZoK{ zJnW{NkTSB;B=2+@%gecjlAFT;OncUVNPjQvkzRH<mabJ|lcUcH+xGw&4Xzdx843O$ zQ9B^t2IL#H1M+P^zFFBvyIey#eBUsBjeh1MK<$8h8<1~SeFtzWnOS0B)pr2pGBIXg z)pvl>u)PMexeE%1Zm!5`9AK!h697cD7LF#)<<_Ds(C<1-8oxU$dzh!kMGO^oT7N9v ziFj4x(v0x!sfUHLi2#|Arr&j##Mx?o@-k98fi-!`j)24V7@C_dq0YTDP0j<vB^8xU zT7d9o;NLhTIj^1ZrK}L~$ZAVg5;RoUsW-F-)wSj5Ef|1y#<#RqpuB;ehV!Bp0Ll5@ zf&sy%&>r-iZ6L0ieOflF9PoVK4u5FF8v(OWj#o8;htNUyZ~m%i_Dg*PMS4Sf@L8V) zS_B{S%go4%fU&Lx#7<13w_pGozZ*bu;lhkB%^;<b@=tOxgvReiZ@~a!C#EshwE%DT zFmqdM5s*wM_L^qy<F>Pa4KR$D$naB-bcySDDXQNs2T%+kn%jSNDcm0_#ec-LBWOP4 zPdh(no8eG94f}hIi2k_<>{TEM78Dr)0K;djWaNcu>0K}DFmgSCcaHy!NZgNr>2=VJ zES~~~PJ8Lii!ky!lx<imX-DD-44<(QaGMitWJUH!@bq^k0tDy#JB^Y7;xzTsK-3$# zo<M)6QCcS;+9n5C5wI8wJz3J2fGrtwG5Lu|4wBBTp^VOEvhi`qj(~uvi4zwmxJGBw z@4Uj!FV~2~6L5{rN(&_drl$YK_*+FqMMXtLMMXs=|NILu&-O)0v^*yO0000<MNUMn GLSTY8E#?#e diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/meta.json index 6eb08f0f32..a4286dcf55 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/captain.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "monkey derivative derived by brainfood1183 (github) for ss14 from tgstation at commit https://github.com/tgstation/tgstation/commit/dd97a0e45d904fffadd9d2caad22aedd0d09f3ab then edited by Skarletto (github). Other sprites taken from tgstation at https://github.com/tgstation/tgstation/pull/69842/commits/d8138946b0ed06fced522729ac8eaa0596864329 and edited by Skarletto (github), edited by Emisse for ss14", + "copyright": "monkey derivative derived by brainfood1183 (github) for ss14 from tgstation at commit https://github.com/tgstation/tgstation/commit/dd97a0e45d904fffadd9d2caad22aedd0d09f3ab then edited by Skarletto (github) and Ghagliiarghii (github). Other sprites taken from tgstation at https://github.com/tgstation/tgstation/pull/69842/commits/d8138946b0ed06fced522729ac8eaa0596864329 and edited by Skarletto (github), edited by Emisse for ss14", "size": { "x": 32, "y": 32 From 38aee7fcfab670a32ee4be626d8739b85061b218 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 01:04:43 +0000 Subject: [PATCH 519/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 40bf6fc7d0..6bf81086cc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Killerqu00 - changes: - - message: Pet carriers can now be crafted. - type: Add - id: 7808 - time: '2025-01-14T22:34:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34431 - author: themias changes: - message: Fixed muzzles not working on some characters (e.g. dwarves) @@ -3903,3 +3896,11 @@ id: 8308 time: '2025-04-21T22:49:43.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29949 +- author: Ghagliiarghii + changes: + - message: The monkey version of captain uniforms and the hamster version of captain + hats updated to match humanoid versions + type: Tweak + id: 8309 + time: '2025-04-22T01:03:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36804 From fa6c97bf5097583b826b6c44bf3278fa4db314b0 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 21 Apr 2025 21:24:37 -0400 Subject: [PATCH 520/622] Fix vox hair (#36816) * Fix vox hair * remove CL --- Resources/Changelog/Changelog.yml | 7 ------- Resources/Prototypes/Species/vox.yml | 10 +--------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6bf81086cc..7c8fd2b204 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -3735,13 +3735,6 @@ id: 8287 time: '2025-04-20T20:55:42.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35986 -- author: TheShuEd - changes: - - message: Voxes can now use any standard human hairstyle. - type: Add - id: 8288 - time: '2025-04-20T21:01:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/35938 - author: Booblesnoot42 changes: - message: The sprites for the main chapel altars have been adjusted. diff --git a/Resources/Prototypes/Species/vox.yml b/Resources/Prototypes/Species/vox.yml index fd458b40f8..8501784b89 100644 --- a/Resources/Prototypes/Species/vox.yml +++ b/Resources/Prototypes/Species/vox.yml @@ -37,6 +37,7 @@ - type: markingPoints id: MobVoxMarkingLimits + onlyWhitelisted: true points: Hair: points: 1 @@ -44,43 +45,34 @@ FacialHair: points: 1 required: false - onlyWhitelisted: true Head: points: 1 required: true - onlyWhitelisted: true Snout: points: 1 required: true defaultMarkings: [ VoxBeak ] - onlyWhitelisted: true Arms: points: 4 required: true defaultMarkings: [ VoxLArmScales, VoxRArmScales, VoxRHandScales, VoxLHandScales ] - onlyWhitelisted: true Legs: points: 4 required: true defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ] - onlyWhitelisted: true UndergarmentTop: points: 1 required: false - onlyWhitelisted: true UndergarmentBottom: points: 1 required: false - onlyWhitelisted: true Chest: points: 1 required: false - onlyWhitelisted: true Tail: points: 1 required: true defaultMarkings: [ VoxTail ] - onlyWhitelisted: true - type: humanoidBaseSprite id: MobVoxEyes From 1707037964788261dd125e41a0446e3c5dc8be71 Mon Sep 17 00:00:00 2001 From: Michael <107807667+Doc-Michael@users.noreply.github.com> Date: Tue, 22 Apr 2025 05:22:56 +0200 Subject: [PATCH 521/622] Tweak Security protection values (#30212) * Tweak Hardsuits * HoS/Ward Coats change * Whoopsie wrong number god why am i doing this its 1:33 AM and i made a silly mistake... * Adress Review Revert Warden hardsuit slowdown to 30% again Decreased Security hardsuit heat protection down to 20% --- .../Entities/Clothing/OuterClothing/coats.yml | 11 ++++++----- .../Entities/Clothing/OuterClothing/hardsuits.yml | 9 ++++++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml index 537b39f4d3..e73eca00bf 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml @@ -66,9 +66,9 @@ - type: Armor modifiers: coefficients: - Blunt: 0.7 - Slash: 0.7 - Piercing: 0.7 + Blunt: 0.65 + Slash: 0.65 + Piercing: 0.6 Heat: 0.7 Caustic: 0.75 # not the full 90% from ss13 because of the head - type: ExplosionResistance @@ -82,10 +82,11 @@ - type: Armor modifiers: coefficients: - Blunt: 0.7 - Slash: 0.7 + Blunt: 0.65 + Slash: 0.65 Piercing: 0.7 Heat: 0.7 + Caustic: 0.9 - type: ExplosionResistance damageCoefficient: 0.9 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index ec9b5e7f06..1a31de2b43 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -251,6 +251,7 @@ Blunt: 0.6 Slash: 0.6 Piercing: 0.6 + Heat: 0.8 Caustic: 0.7 - type: ClothingSpeedModifier walkModifier: 0.75 @@ -305,9 +306,10 @@ - type: Armor modifiers: coefficients: - Blunt: 0.5 - Slash: 0.6 + Blunt: 0.4 + Slash: 0.5 Piercing: 0.6 + Heat: 0.8 Caustic: 0.7 - type: ClothingSpeedModifier walkModifier: 0.7 @@ -466,13 +468,14 @@ highPressureMultiplier: 0.45 lowPressureMultiplier: 1000 - type: ExplosionResistance - damageCoefficient: 0.6 + damageCoefficient: 0.5 - type: Armor modifiers: coefficients: Blunt: 0.6 Slash: 0.5 Piercing: 0.5 + Heat: 0.8 Radiation: 0.5 Caustic: 0.6 - type: ClothingSpeedModifier From 2e3371f8ff4db46eb5a679c94e4e039468c752dd Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 03:24:03 +0000 Subject: [PATCH 522/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7c8fd2b204..7ac0ea9d82 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -3897,3 +3897,12 @@ id: 8309 time: '2025-04-22T01:03:36.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36804 +- author: Doc-Michael + changes: + - message: Changed protection values of Security Hardsuits + type: Tweak + - message: Made Warden/HoS coats slightly more protective to better fit their position + type: Tweak + id: 8310 + time: '2025-04-22T03:22:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30212 From 939a7322368f38230b1ae12788c55afd245ed809 Mon Sep 17 00:00:00 2001 From: Spessmann <156740760+Spessmann@users.noreply.github.com> Date: Mon, 21 Apr 2025 22:30:20 -0700 Subject: [PATCH 523/622] Added more salvage ruins (#36822) --- Resources/Maps/Lavaland/crashed_pod_trail.yml | 2014 +++++ Resources/Maps/Lavaland/front_desk.yml | 466 ++ Resources/Maps/Lavaland/lava_lake_village.yml | 7037 +++++++++++++++++ 3 files changed, 9517 insertions(+) create mode 100644 Resources/Maps/Lavaland/crashed_pod_trail.yml create mode 100644 Resources/Maps/Lavaland/front_desk.yml create mode 100644 Resources/Maps/Lavaland/lava_lake_village.yml diff --git a/Resources/Maps/Lavaland/crashed_pod_trail.yml b/Resources/Maps/Lavaland/crashed_pod_trail.yml new file mode 100644 index 0000000000..1c5a905fcd --- /dev/null +++ b/Resources/Maps/Lavaland/crashed_pod_trail.yml @@ -0,0 +1,2014 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/22/2025 04:29:12 + entityCount: 308 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 3: Space + 0: FloorBasalt + 2: FloorShuttleBlue + 1: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.57031465,-0.62313485 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAADAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + 1,0: + ind: 1,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + 2,0: + ind: 2,0 + tiles: AAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Basalt1 + decals: + 12: 2,0 + - node: + color: '#FFFFFFFF' + id: Basalt2 + decals: + 20: 37.280025,3.9519238 + - node: + color: '#FFFFFFFF' + id: Basalt3 + decals: + 16: 16.128233,1.0678778 + - node: + color: '#FFFFFFFF' + id: Basalt4 + decals: + 13: 2.2814324,5.1807833 + - node: + color: '#FFFFFFFF' + id: Basalt5 + decals: + 18: 22,1 + - node: + color: '#FFFFFFFF' + id: Basalt7 + decals: + 14: 1.9779096,3.7662206 + 15: 11.168944,4.85108 + 19: 34.241127,2.2128677 + - node: + color: '#FFFFFFFF' + id: Basalt8 + decals: + 17: 16,4 + - node: + cleanable: True + zIndex: 1 + color: '#FFFFFFFF' + id: Dirt + decals: + 22: 3,3 + - node: + cleanable: True + color: '#FFFFFFFF' + id: DirtHeavy + decals: + 21: 3,3 + - node: + cleanable: True + zIndex: 1 + color: '#FA7500FF' + id: evac + decals: + 23: 3,3 + - node: + cleanable: True + angle: -3.7524578917878086 rad + color: '#79150096' + id: footprint + decals: + 6: 2.1838233,3.824812 + - node: + cleanable: True + angle: -3.141592653589793 rad + color: '#79150096' + id: footprint + decals: + 4: 2.1899958,4.5876875 + 5: 1.8659213,5.264083 + 7: 1.8782675,4.21706 + - node: + cleanable: True + angle: -2.530727415391778 rad + color: '#79150096' + id: footprint + decals: + 3: 1.6591315,4.837861 + - node: + cleanable: True + color: '#79150096' + id: splatter + decals: + 0: 1.2943434,6.3353224 + 1: 2.4579241,5.2442417 + 2: 3.9702702,3.5364127 + - node: + cleanable: True + angle: 1.5707963267948966 rad + color: '#79150096' + id: thinline + decals: + 8: 4.75012,3.380583 + 9: 5.4031906,2.7412486 + 10: 5.6933136,3.3805819 + 11: 4.4340544,2.7968423 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 62695 + -1,0: + 0: 50380 + 0,1: + 0: 61167 + -1,1: + 0: 64174 + 1,0: + 0: 64727 + 1,1: + 0: 285 + 2,0: + 0: 65520 + 2,1: + 0: 207 + 3,0: + 0: 65392 + 3,1: + 0: 255 + 4,0: + 0: 65532 + 4,1: + 0: 3327 + 5,0: + 0: 65535 + 5,1: + 0: 4095 + 6,0: + 0: 65535 + 6,1: + 0: 4095 + 7,0: + 0: 65535 + 7,1: + 0: 4095 + 8,0: + 0: 65523 + 8,1: + 0: 1023 + 9,0: + 0: 65520 + 9,1: + 0: 255 + 10,0: + 0: 65328 + 10,1: + 0: 63 + -1,2: + 0: 1 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirlockShuttle + entities: + - uid: 3 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,3.5 + parent: 1 +- proto: BasaltFive + entities: + - uid: 291 + components: + - type: Transform + pos: 41.5,1.5 + parent: 1 + - uid: 294 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 +- proto: BasaltFour + entities: + - uid: 290 + components: + - type: Transform + pos: 40.5,5.5 + parent: 1 +- proto: BasaltOne + entities: + - uid: 292 + components: + - type: Transform + pos: 43.5,3.5 + parent: 1 + - uid: 296 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 297 + components: + - type: Transform + pos: -2.5,7.5 + parent: 1 + - uid: 298 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 288 + components: + - type: Transform + pos: 20.5,5.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 289 + components: + - type: Transform + pos: 29.5,0.5 + parent: 1 + - uid: 293 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 + - uid: 295 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 +- proto: BookHowToSurvive + entities: + - uid: 299 + components: + - type: Transform + pos: 2.8075664,6.3128357 + parent: 1 +- proto: BoxMRE + entities: + - uid: 14 + components: + - type: Transform + rot: -43.98229715025713 rad + pos: 4.486449,6.6190434 + parent: 1 +- proto: Catwalk + entities: + - uid: 33 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,6.5 + parent: 1 + - uid: 40 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,4.5 + parent: 1 + - uid: 92 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,3.5 + parent: 1 + - uid: 192 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,5.5 + parent: 1 + - uid: 200 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,3.5 + parent: 1 + - uid: 204 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,4.5 + parent: 1 + - uid: 205 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,5.5 + parent: 1 + - uid: 237 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,6.5 + parent: 1 +- proto: ChairPilotSeat + entities: + - uid: 241 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 259 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,6.5 + parent: 1 +- proto: DrinkMREFlask + entities: + - uid: 255 + components: + - type: Transform + rot: -31.415926535897945 rad + pos: 4.6481953,5.761917 + parent: 1 +- proto: Flare + entities: + - uid: 256 + components: + - type: Transform + rot: -31.415926535897945 rad + pos: 3.3657873,7.5872583 + parent: 1 +- proto: FloorLavaEntity + entities: + - uid: 16 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 19 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,4.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 29 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,3.5 + parent: 1 + - uid: 32 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,1.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 72 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,1.5 + parent: 1 + - uid: 73 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,3.5 + parent: 1 + - uid: 74 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,2.5 + parent: 1 + - uid: 75 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,5.5 + parent: 1 + - uid: 76 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,0.5 + parent: 1 + - uid: 77 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,2.5 + parent: 1 + - uid: 78 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,2.5 + parent: 1 + - uid: 79 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,2.5 + parent: 1 + - uid: 80 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,4.5 + parent: 1 + - uid: 81 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,4.5 + parent: 1 + - uid: 82 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,4.5 + parent: 1 + - uid: 83 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,4.5 + parent: 1 + - uid: 85 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,2.5 + parent: 1 + - uid: 86 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,4.5 + parent: 1 + - uid: 87 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,3.5 + parent: 1 + - uid: 88 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,4.5 + parent: 1 + - uid: 89 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,3.5 + parent: 1 + - uid: 90 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,3.5 + parent: 1 + - uid: 91 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,2.5 + parent: 1 + - uid: 93 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,1.5 + parent: 1 + - uid: 94 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,2.5 + parent: 1 + - uid: 95 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,4.5 + parent: 1 + - uid: 96 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 15.5,3.5 + parent: 1 + - uid: 97 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 15.5,2.5 + parent: 1 + - uid: 98 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,2.5 + parent: 1 + - uid: 99 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 16.5,3.5 + parent: 1 + - uid: 100 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,1.5 + parent: 1 + - uid: 101 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 17.5,4.5 + parent: 1 + - uid: 102 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 17.5,3.5 + parent: 1 + - uid: 103 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 18.5,4.5 + parent: 1 + - uid: 104 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 17.5,2.5 + parent: 1 + - uid: 105 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,1.5 + parent: 1 + - uid: 106 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 19.5,3.5 + parent: 1 + - uid: 107 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 19.5,2.5 + parent: 1 + - uid: 108 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,1.5 + parent: 1 + - uid: 109 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 20.5,3.5 + parent: 1 + - uid: 110 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,2.5 + parent: 1 + - uid: 111 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 21.5,4.5 + parent: 1 + - uid: 112 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 18.5,3.5 + parent: 1 + - uid: 113 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 21.5,3.5 + parent: 1 + - uid: 114 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,1.5 + parent: 1 + - uid: 115 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 22.5,4.5 + parent: 1 + - uid: 116 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 22.5,3.5 + parent: 1 + - uid: 117 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 22.5,2.5 + parent: 1 + - uid: 118 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 18.5,2.5 + parent: 1 + - uid: 119 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,3.5 + parent: 1 + - uid: 120 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,3.5 + parent: 1 + - uid: 121 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,3.5 + parent: 1 + - uid: 122 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,3.5 + parent: 1 + - uid: 123 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 27.5,3.5 + parent: 1 + - uid: 124 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 28.5,3.5 + parent: 1 + - uid: 125 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 29.5,3.5 + parent: 1 + - uid: 126 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 30.5,3.5 + parent: 1 + - uid: 127 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 31.5,3.5 + parent: 1 + - uid: 128 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 33.5,3.5 + parent: 1 + - uid: 129 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 34.5,3.5 + parent: 1 + - uid: 130 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 32.5,3.5 + parent: 1 + - uid: 131 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 35.5,3.5 + parent: 1 + - uid: 132 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 36.5,3.5 + parent: 1 + - uid: 133 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 29.5,2.5 + parent: 1 + - uid: 134 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 30.5,2.5 + parent: 1 + - uid: 135 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 35.5,2.5 + parent: 1 + - uid: 136 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 33.5,4.5 + parent: 1 + - uid: 137 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,4.5 + parent: 1 + - uid: 138 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,4.5 + parent: 1 + - uid: 139 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 27.5,4.5 + parent: 1 + - uid: 140 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 28.5,4.5 + parent: 1 + - uid: 141 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 29.5,4.5 + parent: 1 + - uid: 142 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,1.5 + parent: 1 + - uid: 143 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,5.5 + parent: 1 + - uid: 144 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 16.5,5.5 + parent: 1 + - uid: 145 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 18.5,1.5 + parent: 1 + - uid: 146 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 21.5,1.5 + parent: 1 + - uid: 147 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,5.5 + parent: 1 + - uid: 148 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,5.5 + parent: 1 + - uid: 149 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 35.5,4.5 + parent: 1 + - uid: 150 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 34.5,5.5 + parent: 1 + - uid: 151 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 41.5,4.5 + parent: 1 + - uid: 152 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 36.5,2.5 + parent: 1 + - uid: 153 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 28.5,2.5 + parent: 1 + - uid: 154 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,2.5 + parent: 1 + - uid: 155 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 31.5,1.5 + parent: 1 + - uid: 156 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 32.5,1.5 + parent: 1 + - uid: 157 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,4.5 + parent: 1 + - uid: 160 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 37.5,3.5 + parent: 1 + - uid: 161 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 38.5,3.5 + parent: 1 + - uid: 162 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 39.5,3.5 + parent: 1 + - uid: 163 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 40.5,3.5 + parent: 1 + - uid: 164 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 41.5,3.5 + parent: 1 + - uid: 165 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,2.5 + parent: 1 + - uid: 166 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 38.5,2.5 + parent: 1 + - uid: 167 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 20.5,4.5 + parent: 1 + - uid: 168 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 38.5,4.5 + parent: 1 + - uid: 169 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 42.5,4.5 + parent: 1 + - uid: 170 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 43.5,4.5 + parent: 1 + - uid: 171 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,2.5 + parent: 1 + - uid: 172 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 34.5,4.5 + parent: 1 + - uid: 173 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 27.5,2.5 + parent: 1 + - uid: 174 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 32.5,4.5 + parent: 1 + - uid: 175 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 15.5,4.5 + parent: 1 + - uid: 176 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 37.5,2.5 + parent: 1 + - uid: 177 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 20.5,1.5 + parent: 1 + - uid: 178 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,1.5 + parent: 1 + - uid: 189 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,5.5 + parent: 1 + - uid: 194 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,2.5 + parent: 1 + - uid: 196 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,1.5 + parent: 1 + - uid: 197 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,0.5 + parent: 1 + - uid: 198 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,0.5 + parent: 1 + - uid: 199 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,5.5 + parent: 1 + - uid: 208 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,4.5 + parent: 1 + - uid: 209 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,2.5 + parent: 1 + - uid: 213 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,7.5 + parent: 1 + - uid: 217 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,7.5 + parent: 1 + - uid: 218 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,6.5 + parent: 1 + - uid: 219 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,5.5 + parent: 1 + - uid: 220 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,4.5 + parent: 1 + - uid: 221 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,4.5 + parent: 1 + - uid: 223 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,4.5 + parent: 1 + - uid: 225 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,5.5 + parent: 1 + - uid: 231 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,3.5 + parent: 1 + - uid: 233 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 19.5,4.5 + parent: 1 + - uid: 235 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,6.5 + parent: 1 + - uid: 236 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,6.5 + parent: 1 + - uid: 263 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,4.5 + parent: 1 + - uid: 277 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,3.5 + parent: 1 + - uid: 278 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 16.5,2.5 + parent: 1 + - uid: 279 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 17.5,1.5 + parent: 1 + - uid: 280 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 21.5,2.5 + parent: 1 + - uid: 301 + components: + - type: Transform + pos: 31.5,5.5 + parent: 1 + - uid: 302 + components: + - type: Transform + pos: 30.5,5.5 + parent: 1 + - uid: 303 + components: + - type: Transform + pos: 30.5,0.5 + parent: 1 + - uid: 304 + components: + - type: Transform + pos: 27.5,0.5 + parent: 1 + - uid: 305 + components: + - type: Transform + pos: 26.5,0.5 + parent: 1 + - uid: 306 + components: + - type: Transform + pos: 25.5,0.5 + parent: 1 + - uid: 307 + components: + - type: Transform + pos: 24.5,0.5 + parent: 1 + - uid: 308 + components: + - type: Transform + pos: 28.5,0.5 + parent: 1 +- proto: FoodSnackNutribrick + entities: + - uid: 257 + components: + - type: Transform + rot: -31.415926535897945 rad + pos: 4.398196,5.5210094 + parent: 1 +- proto: Girder + entities: + - uid: 262 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 +- proto: Grille + entities: + - uid: 207 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,2.5 + parent: 1 + - uid: 265 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,4.5 + parent: 1 +- proto: InflatableWall + entities: + - uid: 206 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,2.5 + parent: 1 + - uid: 264 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,5.5 + parent: 1 + - uid: 276 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 +- proto: MagazineBoxLightRifle + entities: + - uid: 158 + components: + - type: Transform + rot: -31.415926535897945 rad + pos: 4.6250486,4.4878845 + parent: 1 +- proto: Pickaxe + entities: + - uid: 224 + components: + - type: Transform + pos: -3.4854758,8.430739 + parent: 1 +- proto: Rack + entities: + - uid: 41 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,7.5 + parent: 1 + - uid: 234 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,6.5 + parent: 1 +- proto: RandomCargoCorpseSpawner + entities: + - uid: 282 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 +- proto: RandomEngineerCorpseSpawner + entities: + - uid: 281 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 +- proto: ScrapFireExtinguisher + entities: + - uid: 300 + components: + - type: Transform + rot: -69.11503837897548 rad + pos: 4.52452,3.5621066 + parent: 1 +- proto: SurvivalKnife + entities: + - uid: 15 + components: + - type: Transform + rot: -31.415926535897945 rad + pos: 3.5556023,7.522399 + parent: 1 +- proto: Table + entities: + - uid: 253 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 260 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,7.5 + parent: 1 +- proto: Thruster + entities: + - uid: 4 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,2.5 + parent: 1 + - uid: 9 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,4.5 + parent: 1 +- proto: WallRockBasalt + entities: + - uid: 2 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 4.5,-0.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: 12.5,-0.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 10.5,-0.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 13.5,-0.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 14.5,-0.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 11.5,-0.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 9.5,-0.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 8.5,-0.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 15.5,-0.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 7.5,-0.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: 6.5,-0.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 4.5,8.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 6.5,6.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 8.5,6.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 11.5,6.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 13.5,6.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 14.5,6.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 15.5,6.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 16.5,6.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 17.5,6.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 8.5,0.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 9.5,0.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 12.5,0.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 14.5,0.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 17.5,0.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 16.5,0.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 15.5,1.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 10.5,0.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 15.5,0.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 13.5,0.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 11.5,0.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 179 + components: + - type: Transform + pos: 14.5,7.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: 12.5,7.5 + parent: 1 + - uid: 182 + components: + - type: Transform + pos: 11.5,7.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: 9.5,7.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 203 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: 4.5,7.5 + parent: 1 + - uid: 211 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 + - uid: 216 + components: + - type: Transform + pos: -3.5,3.5 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 + - uid: 226 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - uid: 227 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 228 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 229 + components: + - type: Transform + pos: -4.5,9.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 232 + components: + - type: Transform + pos: -3.5,9.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 + - uid: 239 + components: + - type: Transform + pos: -5.5,6.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 243 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: -1.5,9.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: -2.5,9.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: -4.5,4.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: -5.5,7.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: -4.5,8.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: -3.5,10.5 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: -2.5,10.5 + parent: 1 + - uid: 270 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 271 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 272 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 273 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 274 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 275 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 283 + components: + - type: Transform + pos: -3.5,2.5 + parent: 1 + - uid: 284 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - uid: 285 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 286 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 + - uid: 287 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 +- proto: WallShuttle + entities: + - uid: 5 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,4.5 + parent: 1 + - uid: 7 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,2.5 + parent: 1 + - uid: 8 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,2.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 35 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,8.5 + parent: 1 +- proto: WallSolidRust + entities: + - uid: 37 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,8.5 + parent: 1 + - uid: 193 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 5.5,5.5 + parent: 1 + - uid: 202 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,6.5 + parent: 1 +- proto: WeaponFlareGun + entities: + - uid: 258 + components: + - type: Transform + rot: -31.415926535897945 rad + pos: 1.5185647,7.5918903 + parent: 1 + - type: ChamberMagazineAmmoProvider + boltClosed: True +- proto: WeaponSniperMosin + entities: + - uid: 84 + components: + - type: Transform + rot: -31.415926535897945 rad + pos: 4.4954185,5.06699 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/front_desk.yml b/Resources/Maps/Lavaland/front_desk.yml new file mode 100644 index 0000000000..3f9cad83d1 --- /dev/null +++ b/Resources/Maps/Lavaland/front_desk.yml @@ -0,0 +1,466 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/22/2025 04:44:52 + entityCount: 52 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 2: Space + 0: FloorBasalt + 4: FloorSteel + 3: FloorSteelDamaged + 1: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.63541734,-0.567756 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAEBAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAABBAAAAAABBAAAAAACAQAAAAAAAAAAAAAABAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAACAQAAAAAAAQAAAAAAAwAAAAABAQAAAAAAAwAAAAAEAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAABAAAAAACAQAAAAAABAAAAAADBAAAAAACAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAABAAAAAABAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAABAAAAAADAwAAAAAABAAAAAAABAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAABAAAAAADAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#FFFFFFFF' + id: Delivery + decals: + 5: 1,3 + - node: + cleanable: True + zIndex: 1 + color: '#FFFFFFFF' + id: Dirt + decals: + 24: 3,-3 + 25: 5,-1 + 26: 2,-1 + 27: 1,2 + 28: 3,6 + 29: 0,5 + - node: + cleanable: True + zIndex: 1 + color: '#FFFFFFFF' + id: DirtHeavy + decals: + 6: 5,-3 + 7: 5,-2 + 8: 3,-1 + 9: 2,2 + 10: 1,3 + 11: 2,3 + 12: 3,5 + 13: 4,4 + 15: 6,5 + 16: 6,6 + 17: 4,6 + 18: 1,6 + 19: 0,5 + 20: -1,6 + 21: 0,1 + 22: 1,-2 + 23: 0,-3 + - node: + zIndex: 1 + angle: -1.5707963267948966 rad + color: '#FFFFFFFF' + id: LoadingArea + decals: + 2: 2,3 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 65535 + 0,-1: + 0: 65535 + -1,0: + 0: 239 + 0,1: + 0: 65531 + -1,1: + 0: 34816 + 0,2: + 0: 15 + 1,0: + 0: 49147 + 1,1: + 0: 30583 + 1,2: + 0: 3 + 1,-1: + 0: 46967 + 2,0: + 0: 14195 + -1,-1: + 0: 65400 + 0,-2: + 0: 61440 + 1,-2: + 0: 12288 + -2,-1: + 0: 34816 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: BasaltFive + entities: + - uid: 49 + components: + - type: Transform + pos: 4.5,3.5 + parent: 1 +- proto: BasaltFour + entities: + - uid: 46 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 +- proto: BasaltOne + entities: + - uid: 50 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 47 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 45 + components: + - type: Transform + pos: 4.5,-3.5 + parent: 1 +- proto: Chair + entities: + - uid: 11 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,1.5 + parent: 1 + - uid: 12 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,2.5 + parent: 1 +- proto: ChairOfficeDark + entities: + - uid: 28 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 +- proto: FloorLavaEntity + entities: + - uid: 2 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 20 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,2.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 22 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,2.5 + parent: 1 + - uid: 23 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 7.5,2.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 43 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,1.5 + parent: 1 + - uid: 44 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,1.5 + parent: 1 + - uid: 52 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,0.5 + parent: 1 +- proto: Girder + entities: + - uid: 26 + components: + - type: Transform + pos: 6.5,2.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 3 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 4 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,2.5 + parent: 1 + - uid: 5 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,3.5 + parent: 1 + - uid: 6 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,0.5 + parent: 1 + - uid: 9 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-0.5 + parent: 1 + - uid: 13 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,4.5 + parent: 1 + - uid: 14 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,3.5 + parent: 1 + - uid: 15 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,4.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 48 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-2.5 + parent: 1 +- proto: Windoor + entities: + - uid: 16 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 +- proto: WindowDirectional + entities: + - uid: 17 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 +... diff --git a/Resources/Maps/Lavaland/lava_lake_village.yml b/Resources/Maps/Lavaland/lava_lake_village.yml new file mode 100644 index 0000000000..3ebe34f6e6 --- /dev/null +++ b/Resources/Maps/Lavaland/lava_lake_village.yml @@ -0,0 +1,7037 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/22/2025 03:36:36 + entityCount: 1310 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 0: Space + 1: FloorBasalt + 3: FloorTechMaint + 2: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -0.76041734,-0.44266954 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,1: + ind: 0,1 + tiles: AAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,2: + ind: 0,2 + tiles: AAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 1,0: + ind: 1,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 1,1: + ind: 1,1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 1,2: + ind: 1,2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 2,0: + ind: 2,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 2,1: + ind: 2,1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 2,2: + ind: 2,2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + color: '#FFFFFFFF' + id: Remains + decals: + 0: 7,27 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,1: + 0: 60620 + 0,2: + 0: 61166 + 0,3: + 0: 61166 + 0,4: + 0: 61166 + 0,0: + 0: 52224 + 1,0: + 0: 65472 + 1,1: + 0: 65535 + 1,2: + 0: 65535 + 1,3: + 0: 65535 + 1,4: + 0: 65535 + 2,0: + 0: 65520 + 2,1: + 0: 65535 + 2,2: + 0: 65535 + 2,3: + 0: 65535 + 2,4: + 0: 65407 + 3,0: + 0: 65520 + 3,1: + 0: 65535 + 3,2: + 0: 63359 + 3,3: + 0: 65399 + 3,4: + 0: 65535 + 4,0: + 0: 65520 + 4,1: + 0: 65535 + 4,2: + 0: 30479 + 4,3: + 0: 65287 + 0,5: + 0: 61166 + 0,6: + 0: 61166 + 0,7: + 0: 61166 + 0,8: + 0: 52462 + 1,5: + 0: 65535 + 1,6: + 0: 65535 + 1,7: + 0: 65535 + 1,8: + 0: 65535 + 2,5: + 0: 65535 + 2,6: + 0: 65535 + 2,7: + 0: 65535 + 2,8: + 0: 65535 + 3,6: + 0: 65520 + 3,7: + 0: 65535 + 3,5: + 0: 61160 + 3,8: + 0: 65535 + 4,4: + 0: 65527 + 4,6: + 0: 65534 + 4,7: + 0: 65535 + 0,9: + 0: 204 + 1,9: + 0: 3327 + 2,9: + 0: 4095 + 3,9: + 0: 4095 + 4,8: + 0: 65535 + 4,9: + 0: 4095 + 5,0: + 0: 65520 + 5,1: + 0: 65535 + 5,2: + 0: 65535 + 5,3: + 0: 65535 + 5,4: + 0: 65535 + 6,0: + 0: 65520 + 6,1: + 0: 65535 + 6,2: + 0: 65535 + 6,3: + 0: 24831 + 6,4: + 0: 61543 + 7,0: + 0: 65520 + 7,1: + 0: 65535 + 7,2: + 0: 65535 + 7,3: + 0: 65535 + 7,4: + 0: 65535 + 8,0: + 0: 65296 + 8,1: + 0: 65535 + 8,2: + 0: 65535 + 8,3: + 0: 65535 + 4,5: + 0: 61166 + 5,5: + 0: 65535 + 5,6: + 0: 65527 + 5,7: + 0: 65535 + 5,8: + 0: 65527 + 6,5: + 0: 65535 + 6,6: + 0: 65535 + 6,7: + 0: 65535 + 6,8: + 0: 65535 + 7,5: + 0: 65535 + 7,6: + 0: 65535 + 7,7: + 0: 65535 + 7,8: + 0: 65535 + 8,4: + 0: 65535 + 8,5: + 0: 65535 + 8,6: + 0: 65535 + 8,7: + 0: 65535 + 5,9: + 0: 53247 + 6,9: + 0: 65535 + 7,9: + 0: 65535 + 8,8: + 0: 65535 + 8,9: + 0: 4607 + 9,0: + 0: 4352 + 9,1: + 0: 13073 + 9,2: + 0: 13107 + 9,3: + 0: 13107 + 9,4: + 0: 13107 + 9,5: + 0: 13107 + 9,6: + 0: 13107 + 9,7: + 0: 13107 + 9,8: + 0: 4403 + 9,9: + 0: 17 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirlockExternal + entities: + - uid: 802 + components: + - type: Transform + pos: 24.5,16.5 + parent: 1 + - uid: 1082 + components: + - type: Transform + pos: 15.5,20.5 + parent: 1 + - uid: 1083 + components: + - type: Transform + pos: 15.5,11.5 + parent: 1 +- proto: APCBasic + entities: + - uid: 1197 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 15.5,12.5 + parent: 1 + - uid: 1212 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,15.5 + parent: 1 + - uid: 1213 + components: + - type: Transform + pos: 14.5,20.5 + parent: 1 +- proto: Ash + entities: + - uid: 1301 + components: + - type: Transform + pos: 24.5,38.5 + parent: 1 + - uid: 1309 + components: + - type: Transform + pos: 22.665606,38.862946 + parent: 1 +- proto: BasaltFive + entities: + - uid: 1241 + components: + - type: Transform + pos: 30.5,22.5 + parent: 1 + - uid: 1248 + components: + - type: Transform + pos: 14.5,2.5 + parent: 1 + - uid: 1251 + components: + - type: Transform + pos: 31.5,4.5 + parent: 1 + - uid: 1256 + components: + - type: Transform + pos: 33.5,29.5 + parent: 1 + - uid: 1261 + components: + - type: Transform + pos: 13.5,37.5 + parent: 1 + - uid: 1266 + components: + - type: Transform + pos: 1.5,26.5 + parent: 1 + - uid: 1271 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 +- proto: BasaltFour + entities: + - uid: 1249 + components: + - type: Transform + pos: 19.5,1.5 + parent: 1 + - uid: 1255 + components: + - type: Transform + pos: 34.5,21.5 + parent: 1 + - uid: 1260 + components: + - type: Transform + pos: 20.5,38.5 + parent: 1 + - uid: 1265 + components: + - type: Transform + pos: 3.5,28.5 + parent: 1 + - uid: 1270 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 +- proto: BasaltOne + entities: + - uid: 1242 + components: + - type: Transform + pos: 27.5,26.5 + parent: 1 + - uid: 1245 + components: + - type: Transform + pos: 7.5,21.5 + parent: 1 + - uid: 1252 + components: + - type: Transform + pos: 35.5,8.5 + parent: 1 + - uid: 1257 + components: + - type: Transform + pos: 30.5,31.5 + parent: 1 + - uid: 1262 + components: + - type: Transform + pos: 6.5,38.5 + parent: 1 + - uid: 1267 + components: + - type: Transform + pos: 3.5,22.5 + parent: 1 +- proto: BasaltThree + entities: + - uid: 1239 + components: + - type: Transform + pos: 6.5,14.5 + parent: 1 + - uid: 1243 + components: + - type: Transform + pos: 16.5,27.5 + parent: 1 + - uid: 1246 + components: + - type: Transform + pos: 24.5,9.5 + parent: 1 + - uid: 1254 + components: + - type: Transform + pos: 37.5,19.5 + parent: 1 + - uid: 1259 + components: + - type: Transform + pos: 26.5,35.5 + parent: 1 + - uid: 1264 + components: + - type: Transform + pos: 16.5,33.5 + parent: 1 + - uid: 1269 + components: + - type: Transform + pos: 2.5,14.5 + parent: 1 + - uid: 1272 + components: + - type: Transform + pos: 19.5,19.5 + parent: 1 +- proto: BasaltTwo + entities: + - uid: 1240 + components: + - type: Transform + pos: 20.5,26.5 + parent: 1 + - uid: 1244 + components: + - type: Transform + pos: 8.5,26.5 + parent: 1 + - uid: 1247 + components: + - type: Transform + pos: 23.5,6.5 + parent: 1 + - uid: 1250 + components: + - type: Transform + pos: 27.5,3.5 + parent: 1 + - uid: 1253 + components: + - type: Transform + pos: 36.5,14.5 + parent: 1 + - uid: 1258 + components: + - type: Transform + pos: 34.5,34.5 + parent: 1 + - uid: 1263 + components: + - type: Transform + pos: 6.5,31.5 + parent: 1 + - uid: 1268 + components: + - type: Transform + pos: 1.5,18.5 + parent: 1 +- proto: BedsheetMedical + entities: + - uid: 1229 + components: + - type: Transform + pos: 15.5,23.5 + parent: 1 + - uid: 1230 + components: + - type: Transform + pos: 13.5,23.5 + parent: 1 +- proto: BurnAutoInjector + entities: + - uid: 1236 + components: + - type: Transform + rot: -6.283185307179586 rad + pos: 13.490121,21.421066 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 1086 + components: + - type: Transform + pos: 16.5,12.5 + parent: 1 + - uid: 1199 + components: + - type: Transform + pos: 15.5,12.5 + parent: 1 + - uid: 1201 + components: + - type: Transform + pos: 16.5,11.5 + parent: 1 + - uid: 1202 + components: + - type: Transform + pos: 17.5,11.5 + parent: 1 + - uid: 1203 + components: + - type: Transform + pos: 18.5,11.5 + parent: 1 + - uid: 1204 + components: + - type: Transform + pos: 14.5,20.5 + parent: 1 + - uid: 1205 + components: + - type: Transform + pos: 14.5,21.5 + parent: 1 + - uid: 1206 + components: + - type: Transform + pos: 14.5,22.5 + parent: 1 + - uid: 1207 + components: + - type: Transform + pos: 14.5,23.5 + parent: 1 + - uid: 1208 + components: + - type: Transform + pos: 24.5,15.5 + parent: 1 + - uid: 1209 + components: + - type: Transform + pos: 25.5,15.5 + parent: 1 + - uid: 1210 + components: + - type: Transform + pos: 25.5,16.5 + parent: 1 + - uid: 1211 + components: + - type: Transform + pos: 25.5,17.5 + parent: 1 +- proto: CableHV + entities: + - uid: 735 + components: + - type: Transform + pos: 16.5,12.5 + parent: 1 + - uid: 736 + components: + - type: Transform + pos: 18.5,12.5 + parent: 1 + - uid: 770 + components: + - type: Transform + pos: 17.5,12.5 + parent: 1 + - uid: 907 + components: + - type: Transform + pos: 16.5,10.5 + parent: 1 + - uid: 1012 + components: + - type: Transform + pos: 16.5,11.5 + parent: 1 + - uid: 1118 + components: + - type: Transform + pos: 18.5,10.5 + parent: 1 + - uid: 1153 + components: + - type: Transform + pos: 17.5,10.5 + parent: 1 +- proto: CableMV + entities: + - uid: 733 + components: + - type: Transform + pos: 17.5,16.5 + parent: 1 + - uid: 734 + components: + - type: Transform + pos: 18.5,16.5 + parent: 1 + - uid: 771 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - uid: 838 + components: + - type: Transform + pos: 11.5,12.5 + parent: 1 + - uid: 839 + components: + - type: Transform + pos: 11.5,14.5 + parent: 1 + - uid: 873 + components: + - type: Transform + pos: 11.5,13.5 + parent: 1 + - uid: 874 + components: + - type: Transform + pos: 11.5,15.5 + parent: 1 + - uid: 875 + components: + - type: Transform + pos: 14.5,20.5 + parent: 1 + - uid: 908 + components: + - type: Transform + pos: 11.5,16.5 + parent: 1 + - uid: 909 + components: + - type: Transform + pos: 12.5,17.5 + parent: 1 + - uid: 910 + components: + - type: Transform + pos: 14.5,19.5 + parent: 1 + - uid: 943 + components: + - type: Transform + pos: 12.5,16.5 + parent: 1 + - uid: 944 + components: + - type: Transform + pos: 12.5,18.5 + parent: 1 + - uid: 945 + components: + - type: Transform + pos: 15.5,18.5 + parent: 1 + - uid: 946 + components: + - type: Transform + pos: 16.5,16.5 + parent: 1 + - uid: 980 + components: + - type: Transform + pos: 15.5,19.5 + parent: 1 + - uid: 981 + components: + - type: Transform + pos: 15.5,16.5 + parent: 1 + - uid: 1015 + components: + - type: Transform + pos: 18.5,12.5 + parent: 1 + - uid: 1016 + components: + - type: Transform + pos: 14.5,17.5 + parent: 1 + - uid: 1048 + components: + - type: Transform + pos: 10.5,17.5 + parent: 1 + - uid: 1049 + components: + - type: Transform + pos: 11.5,18.5 + parent: 1 + - uid: 1050 + components: + - type: Transform + pos: 13.5,17.5 + parent: 1 + - uid: 1051 + components: + - type: Transform + pos: 15.5,17.5 + parent: 1 + - uid: 1084 + components: + - type: Transform + pos: 10.5,18.5 + parent: 1 + - uid: 1085 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 + - uid: 1119 + components: + - type: Transform + pos: 12.5,11.5 + parent: 1 + - uid: 1120 + components: + - type: Transform + pos: 14.5,11.5 + parent: 1 + - uid: 1154 + components: + - type: Transform + pos: 10.5,16.5 + parent: 1 + - uid: 1155 + components: + - type: Transform + pos: 16.5,12.5 + parent: 1 + - uid: 1156 + components: + - type: Transform + pos: 17.5,12.5 + parent: 1 + - uid: 1182 + components: + - type: Transform + pos: 18.5,15.5 + parent: 1 + - uid: 1183 + components: + - type: Transform + pos: 19.5,15.5 + parent: 1 + - uid: 1184 + components: + - type: Transform + pos: 20.5,15.5 + parent: 1 + - uid: 1185 + components: + - type: Transform + pos: 20.5,16.5 + parent: 1 + - uid: 1186 + components: + - type: Transform + pos: 20.5,17.5 + parent: 1 + - uid: 1187 + components: + - type: Transform + pos: 19.5,17.5 + parent: 1 + - uid: 1188 + components: + - type: Transform + pos: 18.5,17.5 + parent: 1 + - uid: 1189 + components: + - type: Transform + pos: 21.5,16.5 + parent: 1 + - uid: 1190 + components: + - type: Transform + pos: 22.5,16.5 + parent: 1 + - uid: 1191 + components: + - type: Transform + pos: 23.5,16.5 + parent: 1 + - uid: 1192 + components: + - type: Transform + pos: 23.5,15.5 + parent: 1 + - uid: 1193 + components: + - type: Transform + pos: 23.5,17.5 + parent: 1 + - uid: 1194 + components: + - type: Transform + pos: 16.5,19.5 + parent: 1 + - uid: 1195 + components: + - type: Transform + pos: 14.5,10.5 + parent: 1 + - uid: 1196 + components: + - type: Transform + pos: 14.5,12.5 + parent: 1 + - uid: 1198 + components: + - type: Transform + pos: 15.5,12.5 + parent: 1 +- proto: CableTerminal + entities: + - uid: 942 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 17.5,10.5 + parent: 1 +- proto: Catwalk + entities: + - uid: 2 + components: + - type: Transform + pos: 35.5,26.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 30.5,32.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 35.5,25.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 30.5,33.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 35.5,27.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 30.5,34.5 + parent: 1 + - uid: 197 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 23.5,30.5 + parent: 1 + - uid: 277 + components: + - type: Transform + pos: 19.5,17.5 + parent: 1 + - uid: 331 + components: + - type: Transform + pos: 24.5,23.5 + parent: 1 + - uid: 367 + components: + - type: Transform + pos: 20.5,15.5 + parent: 1 + - uid: 372 + components: + - type: Transform + pos: 23.5,31.5 + parent: 1 + - uid: 401 + components: + - type: Transform + pos: 18.5,16.5 + parent: 1 + - uid: 408 + components: + - type: Transform + pos: 23.5,25.5 + parent: 1 + - uid: 410 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 10.5,32.5 + parent: 1 + - uid: 540 + components: + - type: Transform + pos: 12.5,16.5 + parent: 1 + - uid: 541 + components: + - type: Transform + pos: 23.5,23.5 + parent: 1 + - uid: 557 + components: + - type: Transform + pos: 20.5,32.5 + parent: 1 + - uid: 570 + components: + - type: Transform + pos: 18.5,15.5 + parent: 1 + - uid: 592 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 21.5,32.5 + parent: 1 + - uid: 607 + components: + - type: Transform + pos: 11.5,18.5 + parent: 1 + - uid: 610 + components: + - type: Transform + pos: 12.5,17.5 + parent: 1 + - uid: 612 + components: + - type: Transform + pos: 22.5,24.5 + parent: 1 + - uid: 662 + components: + - type: Transform + pos: 17.5,32.5 + parent: 1 + - uid: 669 + components: + - type: Transform + pos: 24.5,25.5 + parent: 1 + - uid: 685 + components: + - type: Transform + pos: 15.5,16.5 + parent: 1 + - uid: 686 + components: + - type: Transform + pos: 16.5,16.5 + parent: 1 + - uid: 687 + components: + - type: Transform + pos: 15.5,18.5 + parent: 1 + - uid: 688 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 + - uid: 689 + components: + - type: Transform + pos: 15.5,31.5 + parent: 1 + - uid: 721 + components: + - type: Transform + pos: 15.5,19.5 + parent: 1 + - uid: 722 + components: + - type: Transform + pos: 11.5,14.5 + parent: 1 + - uid: 724 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 19.5,32.5 + parent: 1 + - uid: 731 + components: + - type: Transform + pos: 13.5,31.5 + parent: 1 + - uid: 755 + components: + - type: Transform + pos: 13.5,17.5 + parent: 1 + - uid: 756 + components: + - type: Transform + pos: 11.5,15.5 + parent: 1 + - uid: 757 + components: + - type: Transform + pos: 11.5,13.5 + parent: 1 + - uid: 774 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,26.5 + parent: 1 + - uid: 790 + components: + - type: Transform + pos: 14.5,17.5 + parent: 1 + - uid: 791 + components: + - type: Transform + pos: 11.5,12.5 + parent: 1 + - uid: 794 + components: + - type: Transform + pos: 12.5,11.5 + parent: 1 + - uid: 805 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,15.5 + parent: 1 + - uid: 806 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,12.5 + parent: 1 + - uid: 821 + components: + - type: Transform + pos: 19.5,15.5 + parent: 1 + - uid: 822 + components: + - type: Transform + pos: 10.5,18.5 + parent: 1 + - uid: 823 + components: + - type: Transform + pos: 22.5,23.5 + parent: 1 + - uid: 825 + components: + - type: Transform + pos: 15.5,17.5 + parent: 1 + - uid: 827 + components: + - type: Transform + pos: 14.5,11.5 + parent: 1 + - uid: 828 + components: + - type: Transform + pos: 14.5,31.5 + parent: 1 + - uid: 829 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - uid: 840 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,17.5 + parent: 1 + - uid: 841 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,10.5 + parent: 1 + - uid: 842 + components: + - type: Transform + pos: 19.5,23.5 + parent: 1 + - uid: 844 + components: + - type: Transform + pos: 19.5,24.5 + parent: 1 + - uid: 856 + components: + - type: Transform + pos: 12.5,18.5 + parent: 1 + - uid: 858 + components: + - type: Transform + pos: 20.5,16.5 + parent: 1 + - uid: 876 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 16.5,19.5 + parent: 1 + - uid: 879 + components: + - type: Transform + pos: 20.5,24.5 + parent: 1 + - uid: 892 + components: + - type: Transform + pos: 17.5,16.5 + parent: 1 + - uid: 911 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,19.5 + parent: 1 + - uid: 914 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,32.5 + parent: 1 + - uid: 948 + components: + - type: Transform + pos: 24.5,24.5 + parent: 1 + - uid: 983 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,32.5 + parent: 1 + - uid: 984 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,27.5 + parent: 1 + - uid: 1047 + components: + - type: Transform + pos: 23.5,28.5 + parent: 1 + - uid: 1053 + components: + - type: Transform + pos: 22.5,16.5 + parent: 1 + - uid: 1054 + components: + - type: Transform + pos: 19.5,18.5 + parent: 1 + - uid: 1055 + components: + - type: Transform + pos: 19.5,20.5 + parent: 1 + - uid: 1056 + components: + - type: Transform + pos: 18.5,17.5 + parent: 1 + - uid: 1088 + components: + - type: Transform + pos: 23.5,16.5 + parent: 1 + - uid: 1089 + components: + - type: Transform + pos: 19.5,19.5 + parent: 1 + - uid: 1090 + components: + - type: Transform + pos: 19.5,21.5 + parent: 1 + - uid: 1091 + components: + - type: Transform + pos: 11.5,16.5 + parent: 1 + - uid: 1092 + components: + - type: Transform + pos: 22.5,33.5 + parent: 1 + - uid: 1094 + components: + - type: Transform + pos: 10.5,16.5 + parent: 1 + - uid: 1121 + components: + - type: Transform + pos: 17.5,10.5 + parent: 1 + - uid: 1124 + components: + - type: Transform + pos: 19.5,22.5 + parent: 1 + - uid: 1125 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,32.5 + parent: 1 + - uid: 1126 + components: + - type: Transform + pos: 22.5,32.5 + parent: 1 + - uid: 1128 + components: + - type: Transform + pos: 20.5,17.5 + parent: 1 + - uid: 1129 + components: + - type: Transform + pos: 10.5,17.5 + parent: 1 + - uid: 1157 + components: + - type: Transform + pos: 22.5,25.5 + parent: 1 + - uid: 1160 + components: + - type: Transform + pos: 21.5,24.5 + parent: 1 + - uid: 1162 + components: + - type: Transform + pos: 21.5,16.5 + parent: 1 + - uid: 1200 + components: + - type: Transform + pos: 18.5,10.5 + parent: 1 + - uid: 1214 + components: + - type: Transform + pos: 16.5,10.5 + parent: 1 + - uid: 1281 + components: + - type: Transform + pos: 22.5,31.5 + parent: 1 + - uid: 1282 + components: + - type: Transform + pos: 24.5,31.5 + parent: 1 +- proto: Chair + entities: + - uid: 1225 + components: + - type: Transform + pos: 17.5,12.5 + parent: 1 + - uid: 1232 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 14.5,21.5 + parent: 1 + - uid: 1306 + components: + - type: Transform + pos: 23.5,39.5 + parent: 1 + - uid: 1307 + components: + - type: Transform + pos: 24.5,39.5 + parent: 1 +- proto: ClothingHeadHatCone + entities: + - uid: 10 + components: + - type: Transform + rot: -50.265482457436725 rad + pos: 23.277601,28.448996 + parent: 1 + - uid: 793 + components: + - type: Transform + rot: -50.265482457436725 rad + pos: 23.735935,28.754763 + parent: 1 +- proto: CrateFreezer + entities: + - uid: 1218 + components: + - type: Transform + pos: 26.5,17.5 + parent: 1 +- proto: FireAxe + entities: + - uid: 1224 + components: + - type: Transform + pos: 16.5,12.5 + parent: 1 +- proto: FloorLavaEntity + entities: + - uid: 3 + components: + - type: Transform + pos: 30.5,37.5 + parent: 1 + - uid: 4 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,13.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 35.5,12.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 29.5,38.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 28.5,38.5 + parent: 1 + - uid: 11 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,35.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 34.5,31.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 30.5,35.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 37.5,28.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 35.5,10.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 36.5,35.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 35.5,11.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 37.5,27.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 37.5,32.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 36.5,33.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 36.5,34.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 34.5,9.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 34.5,3.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 30.5,2.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 37.5,31.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 8.5,3.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 33.5,3.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 35.5,3.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 6.5,3.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 28.5,33.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 37.5,26.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 36.5,25.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 35.5,5.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 4.5,3.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 34.5,29.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 34.5,22.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 37.5,25.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 33.5,5.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 34.5,13.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 34.5,10.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 35.5,30.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 35.5,29.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 34.5,30.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 37.5,33.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 34.5,16.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 34.5,14.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 34.5,23.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 34.5,15.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 35.5,4.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 34.5,18.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 34.5,12.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 37.5,24.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 34.5,17.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 33.5,10.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 33.5,13.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 28.5,2.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 32.5,2.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 31.5,15.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 31.5,16.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 33.5,2.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 33.5,9.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 33.5,11.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 29.5,33.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 31.5,17.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 31.5,18.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 31.5,13.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 32.5,15.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: 32.5,14.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 31.5,1.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 31.5,11.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 31.5,9.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: 31.5,14.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: 31.5,2.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: 32.5,16.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 32.5,17.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 36.5,30.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 32.5,36.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 31.5,5.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 32.5,25.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 29.5,1.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 34.5,6.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 34.5,37.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 31.5,7.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 34.5,2.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 36.5,32.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 32.5,12.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 31.5,19.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: 31.5,27.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 31.5,25.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 32.5,20.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 32.5,8.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 32.5,21.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: 31.5,20.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 31.5,21.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 15.5,34.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 29.5,3.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: 32.5,18.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 34.5,32.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 31.5,36.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: 14.5,33.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: 34.5,28.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: 33.5,31.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: 32.5,11.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: 31.5,22.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: 31.5,23.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 31.5,24.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 29.5,35.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: 32.5,19.5 + parent: 1 + - uid: 129 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: 33.5,18.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: 25.5,2.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: 33.5,23.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: 33.5,15.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: 33.5,17.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: 33.5,16.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: 36.5,36.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: 33.5,24.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: 33.5,20.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: 33.5,19.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: 29.5,2.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: 30.5,1.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: 33.5,22.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: 33.5,21.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: 24.5,1.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: 33.5,14.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: 26.5,2.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: 34.5,4.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: 34.5,5.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: 5.5,8.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: 33.5,4.5 + parent: 1 + - uid: 153 + components: + - type: Transform + pos: 33.5,12.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: 32.5,38.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: 34.5,11.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: 32.5,9.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: 15.5,33.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: 32.5,23.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: 32.5,7.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: 15.5,35.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: 33.5,32.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: 32.5,22.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: 31.5,26.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: 28.5,1.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: 32.5,10.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: 31.5,8.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: 32.5,4.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: 32.5,37.5 + parent: 1 + - uid: 169 + components: + - type: Transform + pos: 32.5,13.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: 31.5,10.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: 32.5,24.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: 36.5,4.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: 31.5,6.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: 31.5,38.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: 33.5,37.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: 29.5,36.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: 35.5,28.5 + parent: 1 + - uid: 179 + components: + - type: Transform + pos: 14.5,4.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: 30.5,5.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: 30.5,6.5 + parent: 1 + - uid: 182 + components: + - type: Transform + pos: 30.5,7.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: 30.5,8.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: 30.5,9.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: 30.5,10.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: 30.5,11.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: 30.5,12.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: 30.5,13.5 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: 30.5,14.5 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: 30.5,15.5 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: 30.5,16.5 + parent: 1 + - uid: 193 + components: + - type: Transform + pos: 30.5,18.5 + parent: 1 + - uid: 194 + components: + - type: Transform + pos: 30.5,19.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: 30.5,20.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: 30.5,21.5 + parent: 1 + - uid: 198 + components: + - type: Transform + pos: 30.5,23.5 + parent: 1 + - uid: 199 + components: + - type: Transform + pos: 30.5,24.5 + parent: 1 + - uid: 200 + components: + - type: Transform + pos: 30.5,25.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: 30.5,26.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: 30.5,27.5 + parent: 1 + - uid: 203 + components: + - type: Transform + pos: 30.5,28.5 + parent: 1 + - uid: 204 + components: + - type: Transform + pos: 30.5,29.5 + parent: 1 + - uid: 205 + components: + - type: Transform + pos: 30.5,30.5 + parent: 1 + - uid: 206 + components: + - type: Transform + pos: 14.5,34.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: 14.5,35.5 + parent: 1 + - uid: 209 + components: + - type: Transform + pos: 37.5,30.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: 35.5,33.5 + parent: 1 + - uid: 211 + components: + - type: Transform + pos: 35.5,35.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: 27.5,38.5 + parent: 1 + - uid: 213 + components: + - type: Transform + pos: 34.5,24.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: 29.5,4.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: 29.5,5.5 + parent: 1 + - uid: 216 + components: + - type: Transform + pos: 29.5,6.5 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: 29.5,7.5 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: 29.5,8.5 + parent: 1 + - uid: 219 + components: + - type: Transform + pos: 29.5,9.5 + parent: 1 + - uid: 220 + components: + - type: Transform + pos: 29.5,10.5 + parent: 1 + - uid: 221 + components: + - type: Transform + pos: 29.5,11.5 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: 29.5,12.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: 29.5,13.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: 29.5,14.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: 29.5,15.5 + parent: 1 + - uid: 226 + components: + - type: Transform + pos: 29.5,16.5 + parent: 1 + - uid: 227 + components: + - type: Transform + pos: 29.5,17.5 + parent: 1 + - uid: 228 + components: + - type: Transform + pos: 29.5,18.5 + parent: 1 + - uid: 229 + components: + - type: Transform + pos: 29.5,19.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: 29.5,20.5 + parent: 1 + - uid: 231 + components: + - type: Transform + pos: 29.5,21.5 + parent: 1 + - uid: 232 + components: + - type: Transform + pos: 29.5,22.5 + parent: 1 + - uid: 233 + components: + - type: Transform + pos: 29.5,23.5 + parent: 1 + - uid: 234 + components: + - type: Transform + pos: 29.5,24.5 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: 29.5,25.5 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: 29.5,26.5 + parent: 1 + - uid: 237 + components: + - type: Transform + pos: 29.5,27.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: 29.5,28.5 + parent: 1 + - uid: 239 + components: + - type: Transform + pos: 29.5,29.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: 29.5,30.5 + parent: 1 + - uid: 241 + components: + - type: Transform + pos: 29.5,31.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: 13.5,33.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: 37.5,29.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: 35.5,34.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: 34.5,36.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: 30.5,33.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: 34.5,25.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: 28.5,4.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: 28.5,5.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: 28.5,6.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: 28.5,7.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: 28.5,9.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: 28.5,10.5 + parent: 1 + - uid: 256 + components: + - type: Transform + pos: 28.5,11.5 + parent: 1 + - uid: 257 + components: + - type: Transform + pos: 28.5,12.5 + parent: 1 + - uid: 258 + components: + - type: Transform + pos: 28.5,13.5 + parent: 1 + - uid: 259 + components: + - type: Transform + pos: 28.5,14.5 + parent: 1 + - uid: 260 + components: + - type: Transform + pos: 28.5,15.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: 28.5,16.5 + parent: 1 + - uid: 262 + components: + - type: Transform + pos: 28.5,17.5 + parent: 1 + - uid: 263 + components: + - type: Transform + pos: 28.5,18.5 + parent: 1 + - uid: 264 + components: + - type: Transform + pos: 28.5,19.5 + parent: 1 + - uid: 265 + components: + - type: Transform + pos: 28.5,20.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: 28.5,21.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: 28.5,22.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: 28.5,23.5 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: 28.5,24.5 + parent: 1 + - uid: 270 + components: + - type: Transform + pos: 28.5,25.5 + parent: 1 + - uid: 271 + components: + - type: Transform + pos: 28.5,26.5 + parent: 1 + - uid: 272 + components: + - type: Transform + pos: 28.5,27.5 + parent: 1 + - uid: 273 + components: + - type: Transform + pos: 28.5,28.5 + parent: 1 + - uid: 274 + components: + - type: Transform + pos: 28.5,29.5 + parent: 1 + - uid: 275 + components: + - type: Transform + pos: 28.5,30.5 + parent: 1 + - uid: 276 + components: + - type: Transform + pos: 28.5,31.5 + parent: 1 + - uid: 278 + components: + - type: Transform + pos: 36.5,31.5 + parent: 1 + - uid: 280 + components: + - type: Transform + pos: 25.5,1.5 + parent: 1 + - uid: 281 + components: + - type: Transform + pos: 22.5,1.5 + parent: 1 + - uid: 282 + components: + - type: Transform + pos: 30.5,38.5 + parent: 1 + - uid: 283 + components: + - type: Transform + pos: 35.5,31.5 + parent: 1 + - uid: 284 + components: + - type: Transform + pos: 27.5,4.5 + parent: 1 + - uid: 285 + components: + - type: Transform + pos: 27.5,5.5 + parent: 1 + - uid: 286 + components: + - type: Transform + pos: 27.5,6.5 + parent: 1 + - uid: 287 + components: + - type: Transform + pos: 27.5,7.5 + parent: 1 + - uid: 288 + components: + - type: Transform + pos: 27.5,8.5 + parent: 1 + - uid: 289 + components: + - type: Transform + pos: 27.5,9.5 + parent: 1 + - uid: 290 + components: + - type: Transform + pos: 27.5,10.5 + parent: 1 + - uid: 291 + components: + - type: Transform + pos: 27.5,11.5 + parent: 1 + - uid: 292 + components: + - type: Transform + pos: 27.5,12.5 + parent: 1 + - uid: 293 + components: + - type: Transform + pos: 27.5,13.5 + parent: 1 + - uid: 294 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 295 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 296 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 297 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 298 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 + - uid: 299 + components: + - type: Transform + pos: 27.5,19.5 + parent: 1 + - uid: 300 + components: + - type: Transform + pos: 27.5,20.5 + parent: 1 + - uid: 301 + components: + - type: Transform + pos: 27.5,21.5 + parent: 1 + - uid: 302 + components: + - type: Transform + pos: 27.5,22.5 + parent: 1 + - uid: 303 + components: + - type: Transform + pos: 27.5,23.5 + parent: 1 + - uid: 304 + components: + - type: Transform + pos: 27.5,24.5 + parent: 1 + - uid: 305 + components: + - type: Transform + pos: 27.5,25.5 + parent: 1 + - uid: 306 + components: + - type: Transform + pos: 25.5,27.5 + parent: 1 + - uid: 307 + components: + - type: Transform + pos: 27.5,27.5 + parent: 1 + - uid: 308 + components: + - type: Transform + pos: 27.5,28.5 + parent: 1 + - uid: 309 + components: + - type: Transform + pos: 27.5,29.5 + parent: 1 + - uid: 310 + components: + - type: Transform + pos: 27.5,30.5 + parent: 1 + - uid: 311 + components: + - type: Transform + pos: 27.5,31.5 + parent: 1 + - uid: 312 + components: + - type: Transform + pos: 13.5,34.5 + parent: 1 + - uid: 315 + components: + - type: Transform + pos: 23.5,1.5 + parent: 1 + - uid: 316 + components: + - type: Transform + pos: 23.5,2.5 + parent: 1 + - uid: 317 + components: + - type: Transform + pos: 28.5,32.5 + parent: 1 + - uid: 318 + components: + - type: Transform + pos: 33.5,30.5 + parent: 1 + - uid: 319 + components: + - type: Transform + pos: 26.5,4.5 + parent: 1 + - uid: 320 + components: + - type: Transform + pos: 26.5,5.5 + parent: 1 + - uid: 321 + components: + - type: Transform + pos: 26.5,6.5 + parent: 1 + - uid: 322 + components: + - type: Transform + pos: 26.5,7.5 + parent: 1 + - uid: 323 + components: + - type: Transform + pos: 26.5,8.5 + parent: 1 + - uid: 324 + components: + - type: Transform + pos: 26.5,9.5 + parent: 1 + - uid: 325 + components: + - type: Transform + pos: 26.5,10.5 + parent: 1 + - uid: 326 + components: + - type: Transform + pos: 26.5,11.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: 26.5,12.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: 26.5,13.5 + parent: 1 + - uid: 329 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 330 + components: + - type: Transform + pos: 4.5,8.5 + parent: 1 + - uid: 332 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 333 + components: + - type: Transform + pos: 4.5,6.5 + parent: 1 + - uid: 334 + components: + - type: Transform + pos: 26.5,19.5 + parent: 1 + - uid: 335 + components: + - type: Transform + pos: 26.5,20.5 + parent: 1 + - uid: 337 + components: + - type: Transform + pos: 26.5,22.5 + parent: 1 + - uid: 338 + components: + - type: Transform + pos: 26.5,23.5 + parent: 1 + - uid: 339 + components: + - type: Transform + pos: 26.5,24.5 + parent: 1 + - uid: 340 + components: + - type: Transform + pos: 26.5,27.5 + parent: 1 + - uid: 341 + components: + - type: Transform + pos: 26.5,26.5 + parent: 1 + - uid: 342 + components: + - type: Transform + pos: 25.5,26.5 + parent: 1 + - uid: 343 + components: + - type: Transform + pos: 26.5,28.5 + parent: 1 + - uid: 344 + components: + - type: Transform + pos: 26.5,29.5 + parent: 1 + - uid: 345 + components: + - type: Transform + pos: 26.5,30.5 + parent: 1 + - uid: 346 + components: + - type: Transform + pos: 26.5,31.5 + parent: 1 + - uid: 347 + components: + - type: Transform + pos: 26.5,32.5 + parent: 1 + - uid: 350 + components: + - type: Transform + pos: 27.5,2.5 + parent: 1 + - uid: 351 + components: + - type: Transform + pos: 35.5,32.5 + parent: 1 + - uid: 352 + components: + - type: Transform + pos: 34.5,35.5 + parent: 1 + - uid: 353 + components: + - type: Transform + pos: 34.5,33.5 + parent: 1 + - uid: 354 + components: + - type: Transform + pos: 25.5,4.5 + parent: 1 + - uid: 355 + components: + - type: Transform + pos: 25.5,5.5 + parent: 1 + - uid: 356 + components: + - type: Transform + pos: 25.5,6.5 + parent: 1 + - uid: 357 + components: + - type: Transform + pos: 25.5,7.5 + parent: 1 + - uid: 358 + components: + - type: Transform + pos: 25.5,8.5 + parent: 1 + - uid: 359 + components: + - type: Transform + pos: 25.5,9.5 + parent: 1 + - uid: 360 + components: + - type: Transform + pos: 25.5,10.5 + parent: 1 + - uid: 361 + components: + - type: Transform + pos: 25.5,11.5 + parent: 1 + - uid: 362 + components: + - type: Transform + pos: 25.5,12.5 + parent: 1 + - uid: 363 + components: + - type: Transform + pos: 25.5,13.5 + parent: 1 + - uid: 364 + components: + - type: Transform + pos: 4.5,9.5 + parent: 1 + - uid: 365 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 366 + components: + - type: Transform + pos: 20.5,17.5 + parent: 1 + - uid: 368 + components: + - type: Transform + pos: 7.5,4.5 + parent: 1 + - uid: 369 + components: + - type: Transform + pos: 25.5,19.5 + parent: 1 + - uid: 370 + components: + - type: Transform + pos: 25.5,20.5 + parent: 1 + - uid: 371 + components: + - type: Transform + pos: 25.5,21.5 + parent: 1 + - uid: 373 + components: + - type: Transform + pos: 25.5,23.5 + parent: 1 + - uid: 374 + components: + - type: Transform + pos: 25.5,24.5 + parent: 1 + - uid: 375 + components: + - type: Transform + pos: 25.5,25.5 + parent: 1 + - uid: 376 + components: + - type: Transform + pos: 31.5,37.5 + parent: 1 + - uid: 377 + components: + - type: Transform + pos: 28.5,37.5 + parent: 1 + - uid: 378 + components: + - type: Transform + pos: 25.5,28.5 + parent: 1 + - uid: 379 + components: + - type: Transform + pos: 25.5,29.5 + parent: 1 + - uid: 380 + components: + - type: Transform + pos: 25.5,30.5 + parent: 1 + - uid: 381 + components: + - type: Transform + pos: 25.5,31.5 + parent: 1 + - uid: 382 + components: + - type: Transform + pos: 25.5,32.5 + parent: 1 + - uid: 383 + components: + - type: Transform + pos: 12.5,33.5 + parent: 1 + - uid: 384 + components: + - type: Transform + pos: 12.5,34.5 + parent: 1 + - uid: 385 + components: + - type: Transform + pos: 12.5,35.5 + parent: 1 + - uid: 388 + components: + - type: Transform + pos: 24.5,3.5 + parent: 1 + - uid: 389 + components: + - type: Transform + pos: 24.5,4.5 + parent: 1 + - uid: 390 + components: + - type: Transform + pos: 24.5,5.5 + parent: 1 + - uid: 391 + components: + - type: Transform + pos: 24.5,6.5 + parent: 1 + - uid: 392 + components: + - type: Transform + pos: 24.5,7.5 + parent: 1 + - uid: 393 + components: + - type: Transform + pos: 24.5,8.5 + parent: 1 + - uid: 395 + components: + - type: Transform + pos: 24.5,10.5 + parent: 1 + - uid: 396 + components: + - type: Transform + pos: 24.5,11.5 + parent: 1 + - uid: 397 + components: + - type: Transform + pos: 24.5,12.5 + parent: 1 + - uid: 398 + components: + - type: Transform + pos: 24.5,13.5 + parent: 1 + - uid: 399 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 400 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 402 + components: + - type: Transform + pos: 10.5,16.5 + parent: 1 + - uid: 403 + components: + - type: Transform + pos: 6.5,4.5 + parent: 1 + - uid: 404 + components: + - type: Transform + pos: 24.5,19.5 + parent: 1 + - uid: 405 + components: + - type: Transform + pos: 24.5,20.5 + parent: 1 + - uid: 406 + components: + - type: Transform + pos: 24.5,21.5 + parent: 1 + - uid: 407 + components: + - type: Transform + pos: 24.5,22.5 + parent: 1 + - uid: 409 + components: + - type: Transform + pos: 26.5,21.5 + parent: 1 + - uid: 411 + components: + - type: Transform + pos: 24.5,26.5 + parent: 1 + - uid: 412 + components: + - type: Transform + pos: 24.5,27.5 + parent: 1 + - uid: 413 + components: + - type: Transform + pos: 24.5,28.5 + parent: 1 + - uid: 414 + components: + - type: Transform + pos: 24.5,29.5 + parent: 1 + - uid: 415 + components: + - type: Transform + pos: 24.5,30.5 + parent: 1 + - uid: 416 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 14.5,31.5 + parent: 1 + - uid: 417 + components: + - type: Transform + pos: 24.5,32.5 + parent: 1 + - uid: 418 + components: + - type: Transform + pos: 24.5,33.5 + parent: 1 + - uid: 419 + components: + - type: Transform + pos: 13.5,35.5 + parent: 1 + - uid: 420 + components: + - type: Transform + pos: 35.5,36.5 + parent: 1 + - uid: 421 + components: + - type: Transform + pos: 35.5,37.5 + parent: 1 + - uid: 422 + components: + - type: Transform + pos: 33.5,36.5 + parent: 1 + - uid: 423 + components: + - type: Transform + pos: 23.5,3.5 + parent: 1 + - uid: 424 + components: + - type: Transform + pos: 23.5,4.5 + parent: 1 + - uid: 425 + components: + - type: Transform + pos: 23.5,5.5 + parent: 1 + - uid: 427 + components: + - type: Transform + pos: 23.5,7.5 + parent: 1 + - uid: 428 + components: + - type: Transform + pos: 23.5,8.5 + parent: 1 + - uid: 429 + components: + - type: Transform + pos: 23.5,9.5 + parent: 1 + - uid: 430 + components: + - type: Transform + pos: 23.5,10.5 + parent: 1 + - uid: 431 + components: + - type: Transform + pos: 23.5,11.5 + parent: 1 + - uid: 432 + components: + - type: Transform + pos: 23.5,12.5 + parent: 1 + - uid: 433 + components: + - type: Transform + pos: 23.5,13.5 + parent: 1 + - uid: 434 + components: + - type: Transform + pos: 23.5,14.5 + parent: 1 + - uid: 435 + components: + - type: Transform + pos: 23.5,15.5 + parent: 1 + - uid: 436 + components: + - type: Transform + pos: 23.5,16.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: 23.5,17.5 + parent: 1 + - uid: 438 + components: + - type: Transform + pos: 23.5,18.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: 23.5,19.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: 23.5,20.5 + parent: 1 + - uid: 441 + components: + - type: Transform + pos: 23.5,21.5 + parent: 1 + - uid: 442 + components: + - type: Transform + pos: 23.5,22.5 + parent: 1 + - uid: 443 + components: + - type: Transform + pos: 20.5,21.5 + parent: 1 + - uid: 445 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,34.5 + parent: 1 + - uid: 446 + components: + - type: Transform + pos: 23.5,26.5 + parent: 1 + - uid: 447 + components: + - type: Transform + pos: 23.5,27.5 + parent: 1 + - uid: 448 + components: + - type: Transform + pos: 23.5,28.5 + parent: 1 + - uid: 449 + components: + - type: Transform + pos: 23.5,29.5 + parent: 1 + - uid: 450 + components: + - type: Transform + pos: 23.5,30.5 + parent: 1 + - uid: 451 + components: + - type: Transform + pos: 23.5,31.5 + parent: 1 + - uid: 453 + components: + - type: Transform + pos: 23.5,33.5 + parent: 1 + - uid: 454 + components: + - type: Transform + pos: 23.5,34.5 + parent: 1 + - uid: 455 + components: + - type: Transform + pos: 23.5,35.5 + parent: 1 + - uid: 456 + components: + - type: Transform + pos: 14.5,32.5 + parent: 1 + - uid: 457 + components: + - type: Transform + pos: 26.5,1.5 + parent: 1 + - uid: 458 + components: + - type: Transform + pos: 22.5,3.5 + parent: 1 + - uid: 459 + components: + - type: Transform + pos: 22.5,4.5 + parent: 1 + - uid: 460 + components: + - type: Transform + pos: 22.5,5.5 + parent: 1 + - uid: 461 + components: + - type: Transform + pos: 22.5,6.5 + parent: 1 + - uid: 462 + components: + - type: Transform + pos: 22.5,7.5 + parent: 1 + - uid: 463 + components: + - type: Transform + pos: 22.5,8.5 + parent: 1 + - uid: 464 + components: + - type: Transform + pos: 22.5,9.5 + parent: 1 + - uid: 465 + components: + - type: Transform + pos: 22.5,10.5 + parent: 1 + - uid: 466 + components: + - type: Transform + pos: 22.5,11.5 + parent: 1 + - uid: 467 + components: + - type: Transform + pos: 22.5,12.5 + parent: 1 + - uid: 468 + components: + - type: Transform + pos: 22.5,13.5 + parent: 1 + - uid: 469 + components: + - type: Transform + pos: 22.5,14.5 + parent: 1 + - uid: 470 + components: + - type: Transform + pos: 22.5,15.5 + parent: 1 + - uid: 471 + components: + - type: Transform + pos: 22.5,16.5 + parent: 1 + - uid: 472 + components: + - type: Transform + pos: 22.5,17.5 + parent: 1 + - uid: 473 + components: + - type: Transform + pos: 22.5,18.5 + parent: 1 + - uid: 474 + components: + - type: Transform + pos: 22.5,19.5 + parent: 1 + - uid: 475 + components: + - type: Transform + pos: 22.5,20.5 + parent: 1 + - uid: 476 + components: + - type: Transform + pos: 22.5,21.5 + parent: 1 + - uid: 477 + components: + - type: Transform + pos: 22.5,22.5 + parent: 1 + - uid: 478 + components: + - type: Transform + pos: 3.5,29.5 + parent: 1 + - uid: 479 + components: + - type: Transform + pos: 10.5,35.5 + parent: 1 + - uid: 480 + components: + - type: Transform + pos: 18.5,36.5 + parent: 1 + - uid: 481 + components: + - type: Transform + pos: 22.5,26.5 + parent: 1 + - uid: 482 + components: + - type: Transform + pos: 22.5,27.5 + parent: 1 + - uid: 483 + components: + - type: Transform + pos: 22.5,28.5 + parent: 1 + - uid: 484 + components: + - type: Transform + pos: 22.5,29.5 + parent: 1 + - uid: 485 + components: + - type: Transform + pos: 22.5,30.5 + parent: 1 + - uid: 486 + components: + - type: Transform + pos: 22.5,31.5 + parent: 1 + - uid: 487 + components: + - type: Transform + pos: 22.5,32.5 + parent: 1 + - uid: 488 + components: + - type: Transform + pos: 22.5,33.5 + parent: 1 + - uid: 489 + components: + - type: Transform + pos: 22.5,34.5 + parent: 1 + - uid: 490 + components: + - type: Transform + pos: 22.5,35.5 + parent: 1 + - uid: 491 + components: + - type: Transform + pos: 22.5,36.5 + parent: 1 + - uid: 492 + components: + - type: Transform + pos: 21.5,2.5 + parent: 1 + - uid: 493 + components: + - type: Transform + pos: 21.5,3.5 + parent: 1 + - uid: 494 + components: + - type: Transform + pos: 21.5,4.5 + parent: 1 + - uid: 495 + components: + - type: Transform + pos: 21.5,5.5 + parent: 1 + - uid: 496 + components: + - type: Transform + pos: 21.5,6.5 + parent: 1 + - uid: 497 + components: + - type: Transform + pos: 21.5,7.5 + parent: 1 + - uid: 498 + components: + - type: Transform + pos: 21.5,8.5 + parent: 1 + - uid: 499 + components: + - type: Transform + pos: 21.5,9.5 + parent: 1 + - uid: 500 + components: + - type: Transform + pos: 21.5,10.5 + parent: 1 + - uid: 501 + components: + - type: Transform + pos: 21.5,11.5 + parent: 1 + - uid: 502 + components: + - type: Transform + pos: 21.5,12.5 + parent: 1 + - uid: 503 + components: + - type: Transform + pos: 21.5,13.5 + parent: 1 + - uid: 504 + components: + - type: Transform + pos: 21.5,14.5 + parent: 1 + - uid: 505 + components: + - type: Transform + pos: 21.5,15.5 + parent: 1 + - uid: 506 + components: + - type: Transform + pos: 21.5,16.5 + parent: 1 + - uid: 507 + components: + - type: Transform + pos: 21.5,17.5 + parent: 1 + - uid: 508 + components: + - type: Transform + pos: 21.5,18.5 + parent: 1 + - uid: 509 + components: + - type: Transform + pos: 21.5,19.5 + parent: 1 + - uid: 510 + components: + - type: Transform + pos: 21.5,20.5 + parent: 1 + - uid: 511 + components: + - type: Transform + pos: 21.5,21.5 + parent: 1 + - uid: 512 + components: + - type: Transform + pos: 21.5,22.5 + parent: 1 + - uid: 513 + components: + - type: Transform + pos: 21.5,23.5 + parent: 1 + - uid: 514 + components: + - type: Transform + pos: 21.5,24.5 + parent: 1 + - uid: 515 + components: + - type: Transform + pos: 21.5,25.5 + parent: 1 + - uid: 516 + components: + - type: Transform + pos: 21.5,26.5 + parent: 1 + - uid: 517 + components: + - type: Transform + pos: 21.5,27.5 + parent: 1 + - uid: 518 + components: + - type: Transform + pos: 21.5,28.5 + parent: 1 + - uid: 519 + components: + - type: Transform + pos: 21.5,29.5 + parent: 1 + - uid: 520 + components: + - type: Transform + pos: 21.5,30.5 + parent: 1 + - uid: 521 + components: + - type: Transform + pos: 21.5,31.5 + parent: 1 + - uid: 522 + components: + - type: Transform + pos: 25.5,36.5 + parent: 1 + - uid: 523 + components: + - type: Transform + pos: 21.5,33.5 + parent: 1 + - uid: 524 + components: + - type: Transform + pos: 21.5,34.5 + parent: 1 + - uid: 525 + components: + - type: Transform + pos: 21.5,35.5 + parent: 1 + - uid: 526 + components: + - type: Transform + pos: 14.5,37.5 + parent: 1 + - uid: 527 + components: + - type: Transform + pos: 20.5,2.5 + parent: 1 + - uid: 528 + components: + - type: Transform + pos: 20.5,3.5 + parent: 1 + - uid: 529 + components: + - type: Transform + pos: 20.5,4.5 + parent: 1 + - uid: 530 + components: + - type: Transform + pos: 20.5,5.5 + parent: 1 + - uid: 531 + components: + - type: Transform + pos: 20.5,6.5 + parent: 1 + - uid: 532 + components: + - type: Transform + pos: 20.5,7.5 + parent: 1 + - uid: 533 + components: + - type: Transform + pos: 20.5,8.5 + parent: 1 + - uid: 534 + components: + - type: Transform + pos: 20.5,9.5 + parent: 1 + - uid: 535 + components: + - type: Transform + pos: 20.5,10.5 + parent: 1 + - uid: 536 + components: + - type: Transform + pos: 20.5,11.5 + parent: 1 + - uid: 537 + components: + - type: Transform + pos: 20.5,12.5 + parent: 1 + - uid: 538 + components: + - type: Transform + pos: 20.5,13.5 + parent: 1 + - uid: 539 + components: + - type: Transform + pos: 20.5,14.5 + parent: 1 + - uid: 542 + components: + - type: Transform + pos: 24.5,23.5 + parent: 1 + - uid: 543 + components: + - type: Transform + pos: 20.5,18.5 + parent: 1 + - uid: 544 + components: + - type: Transform + pos: 20.5,19.5 + parent: 1 + - uid: 545 + components: + - type: Transform + pos: 20.5,20.5 + parent: 1 + - uid: 547 + components: + - type: Transform + pos: 20.5,22.5 + parent: 1 + - uid: 548 + components: + - type: Transform + pos: 20.5,23.5 + parent: 1 + - uid: 549 + components: + - type: Transform + pos: 20.5,24.5 + parent: 1 + - uid: 550 + components: + - type: Transform + pos: 20.5,25.5 + parent: 1 + - uid: 551 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 20.5,27.5 + parent: 1 + - uid: 552 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,33.5 + parent: 1 + - uid: 553 + components: + - type: Transform + pos: 20.5,28.5 + parent: 1 + - uid: 555 + components: + - type: Transform + pos: 20.5,30.5 + parent: 1 + - uid: 556 + components: + - type: Transform + pos: 20.5,32.5 + parent: 1 + - uid: 558 + components: + - type: Transform + pos: 27.5,35.5 + parent: 1 + - uid: 559 + components: + - type: Transform + pos: 20.5,34.5 + parent: 1 + - uid: 560 + components: + - type: Transform + pos: 20.5,35.5 + parent: 1 + - uid: 561 + components: + - type: Transform + pos: 19.5,36.5 + parent: 1 + - uid: 562 + components: + - type: Transform + pos: 33.5,34.5 + parent: 1 + - uid: 563 + components: + - type: Transform + pos: 19.5,3.5 + parent: 1 + - uid: 564 + components: + - type: Transform + pos: 19.5,4.5 + parent: 1 + - uid: 565 + components: + - type: Transform + pos: 19.5,5.5 + parent: 1 + - uid: 566 + components: + - type: Transform + pos: 19.5,6.5 + parent: 1 + - uid: 567 + components: + - type: Transform + pos: 19.5,7.5 + parent: 1 + - uid: 568 + components: + - type: Transform + pos: 19.5,8.5 + parent: 1 + - uid: 571 + components: + - type: Transform + pos: 15.5,4.5 + parent: 1 + - uid: 573 + components: + - type: Transform + pos: 9.5,4.5 + parent: 1 + - uid: 574 + components: + - type: Transform + pos: 19.5,14.5 + parent: 1 + - uid: 575 + components: + - type: Transform + pos: 20.5,15.5 + parent: 1 + - uid: 576 + components: + - type: Transform + pos: 18.5,17.5 + parent: 1 + - uid: 577 + components: + - type: Transform + pos: 22.5,23.5 + parent: 1 + - uid: 578 + components: + - type: Transform + pos: 19.5,18.5 + parent: 1 + - uid: 580 + components: + - type: Transform + pos: 19.5,20.5 + parent: 1 + - uid: 581 + components: + - type: Transform + pos: 19.5,21.5 + parent: 1 + - uid: 582 + components: + - type: Transform + pos: 19.5,22.5 + parent: 1 + - uid: 583 + components: + - type: Transform + pos: 19.5,23.5 + parent: 1 + - uid: 584 + components: + - type: Transform + pos: 19.5,24.5 + parent: 1 + - uid: 585 + components: + - type: Transform + pos: 19.5,25.5 + parent: 1 + - uid: 586 + components: + - type: Transform + pos: 19.5,26.5 + parent: 1 + - uid: 587 + components: + - type: Transform + pos: 19.5,27.5 + parent: 1 + - uid: 588 + components: + - type: Transform + pos: 19.5,28.5 + parent: 1 + - uid: 589 + components: + - type: Transform + pos: 19.5,29.5 + parent: 1 + - uid: 590 + components: + - type: Transform + pos: 19.5,30.5 + parent: 1 + - uid: 591 + components: + - type: Transform + pos: 19.5,31.5 + parent: 1 + - uid: 593 + components: + - type: Transform + pos: 19.5,33.5 + parent: 1 + - uid: 594 + components: + - type: Transform + pos: 19.5,34.5 + parent: 1 + - uid: 595 + components: + - type: Transform + pos: 19.5,35.5 + parent: 1 + - uid: 596 + components: + - type: Transform + pos: 9.5,35.5 + parent: 1 + - uid: 597 + components: + - type: Transform + pos: 33.5,33.5 + parent: 1 + - uid: 598 + components: + - type: Transform + pos: 18.5,3.5 + parent: 1 + - uid: 599 + components: + - type: Transform + pos: 18.5,4.5 + parent: 1 + - uid: 600 + components: + - type: Transform + pos: 18.5,5.5 + parent: 1 + - uid: 601 + components: + - type: Transform + pos: 18.5,6.5 + parent: 1 + - uid: 602 + components: + - type: Transform + pos: 18.5,7.5 + parent: 1 + - uid: 603 + components: + - type: Transform + pos: 18.5,8.5 + parent: 1 + - uid: 605 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - uid: 606 + components: + - type: Transform + pos: 15.5,3.5 + parent: 1 + - uid: 608 + components: + - type: Transform + pos: 8.5,4.5 + parent: 1 + - uid: 609 + components: + - type: Transform + pos: 18.5,14.5 + parent: 1 + - uid: 613 + components: + - type: Transform + pos: 18.5,18.5 + parent: 1 + - uid: 614 + components: + - type: Transform + pos: 18.5,19.5 + parent: 1 + - uid: 615 + components: + - type: Transform + pos: 18.5,20.5 + parent: 1 + - uid: 616 + components: + - type: Transform + pos: 18.5,21.5 + parent: 1 + - uid: 617 + components: + - type: Transform + pos: 18.5,22.5 + parent: 1 + - uid: 618 + components: + - type: Transform + pos: 18.5,23.5 + parent: 1 + - uid: 619 + components: + - type: Transform + pos: 18.5,24.5 + parent: 1 + - uid: 620 + components: + - type: Transform + pos: 18.5,25.5 + parent: 1 + - uid: 621 + components: + - type: Transform + pos: 18.5,26.5 + parent: 1 + - uid: 622 + components: + - type: Transform + pos: 18.5,27.5 + parent: 1 + - uid: 623 + components: + - type: Transform + pos: 18.5,28.5 + parent: 1 + - uid: 624 + components: + - type: Transform + pos: 18.5,29.5 + parent: 1 + - uid: 625 + components: + - type: Transform + pos: 18.5,30.5 + parent: 1 + - uid: 626 + components: + - type: Transform + pos: 18.5,31.5 + parent: 1 + - uid: 627 + components: + - type: Transform + pos: 18.5,32.5 + parent: 1 + - uid: 628 + components: + - type: Transform + pos: 18.5,33.5 + parent: 1 + - uid: 629 + components: + - type: Transform + pos: 18.5,34.5 + parent: 1 + - uid: 630 + components: + - type: Transform + pos: 8.5,33.5 + parent: 1 + - uid: 631 + components: + - type: Transform + pos: 6.5,33.5 + parent: 1 + - uid: 632 + components: + - type: Transform + pos: 32.5,35.5 + parent: 1 + - uid: 633 + components: + - type: Transform + pos: 32.5,34.5 + parent: 1 + - uid: 634 + components: + - type: Transform + pos: 32.5,33.5 + parent: 1 + - uid: 635 + components: + - type: Transform + pos: 17.5,5.5 + parent: 1 + - uid: 636 + components: + - type: Transform + pos: 17.5,6.5 + parent: 1 + - uid: 637 + components: + - type: Transform + pos: 17.5,7.5 + parent: 1 + - uid: 638 + components: + - type: Transform + pos: 17.5,8.5 + parent: 1 + - uid: 640 + components: + - type: Transform + pos: 12.5,3.5 + parent: 1 + - uid: 641 + components: + - type: Transform + pos: 16.5,3.5 + parent: 1 + - uid: 642 + components: + - type: Transform + pos: 12.5,2.5 + parent: 1 + - uid: 643 + components: + - type: Transform + pos: 10.5,4.5 + parent: 1 + - uid: 644 + components: + - type: Transform + pos: 17.5,14.5 + parent: 1 + - uid: 645 + components: + - type: Transform + pos: 17.5,15.5 + parent: 1 + - uid: 646 + components: + - type: Transform + pos: 17.5,16.5 + parent: 1 + - uid: 647 + components: + - type: Transform + pos: 17.5,17.5 + parent: 1 + - uid: 648 + components: + - type: Transform + pos: 17.5,18.5 + parent: 1 + - uid: 649 + components: + - type: Transform + pos: 17.5,19.5 + parent: 1 + - uid: 650 + components: + - type: Transform + pos: 17.5,20.5 + parent: 1 + - uid: 651 + components: + - type: Transform + pos: 17.5,21.5 + parent: 1 + - uid: 652 + components: + - type: Transform + pos: 17.5,22.5 + parent: 1 + - uid: 653 + components: + - type: Transform + pos: 17.5,23.5 + parent: 1 + - uid: 654 + components: + - type: Transform + pos: 17.5,24.5 + parent: 1 + - uid: 655 + components: + - type: Transform + pos: 17.5,25.5 + parent: 1 + - uid: 656 + components: + - type: Transform + pos: 17.5,26.5 + parent: 1 + - uid: 657 + components: + - type: Transform + pos: 17.5,27.5 + parent: 1 + - uid: 658 + components: + - type: Transform + pos: 17.5,28.5 + parent: 1 + - uid: 659 + components: + - type: Transform + pos: 17.5,29.5 + parent: 1 + - uid: 660 + components: + - type: Transform + pos: 17.5,30.5 + parent: 1 + - uid: 661 + components: + - type: Transform + pos: 17.5,31.5 + parent: 1 + - uid: 663 + components: + - type: Transform + pos: 16.5,35.5 + parent: 1 + - uid: 664 + components: + - type: Transform + pos: 9.5,33.5 + parent: 1 + - uid: 665 + components: + - type: Transform + pos: 8.5,36.5 + parent: 1 + - uid: 666 + components: + - type: Transform + pos: 7.5,35.5 + parent: 1 + - uid: 667 + components: + - type: Transform + pos: 2.5,27.5 + parent: 1 + - uid: 668 + components: + - type: Transform + pos: 17.5,35.5 + parent: 1 + - uid: 670 + components: + - type: Transform + pos: 16.5,5.5 + parent: 1 + - uid: 671 + components: + - type: Transform + pos: 16.5,6.5 + parent: 1 + - uid: 672 + components: + - type: Transform + pos: 16.5,7.5 + parent: 1 + - uid: 673 + components: + - type: Transform + pos: 16.5,8.5 + parent: 1 + - uid: 675 + components: + - type: Transform + pos: 11.5,2.5 + parent: 1 + - uid: 676 + components: + - type: Transform + pos: 11.5,3.5 + parent: 1 + - uid: 677 + components: + - type: Transform + pos: 17.5,3.5 + parent: 1 + - uid: 678 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 679 + components: + - type: Transform + pos: 16.5,14.5 + parent: 1 + - uid: 680 + components: + - type: Transform + pos: 16.5,15.5 + parent: 1 + - uid: 681 + components: + - type: Transform + pos: 16.5,16.5 + parent: 1 + - uid: 682 + components: + - type: Transform + pos: 16.5,17.5 + parent: 1 + - uid: 683 + components: + - type: Transform + pos: 16.5,18.5 + parent: 1 + - uid: 684 + components: + - type: Transform + pos: 16.5,19.5 + parent: 1 + - uid: 690 + components: + - type: Transform + pos: 16.5,25.5 + parent: 1 + - uid: 691 + components: + - type: Transform + pos: 16.5,26.5 + parent: 1 + - uid: 693 + components: + - type: Transform + pos: 16.5,28.5 + parent: 1 + - uid: 694 + components: + - type: Transform + pos: 16.5,29.5 + parent: 1 + - uid: 695 + components: + - type: Transform + pos: 16.5,30.5 + parent: 1 + - uid: 696 + components: + - type: Transform + pos: 16.5,31.5 + parent: 1 + - uid: 697 + components: + - type: Transform + pos: 16.5,37.5 + parent: 1 + - uid: 698 + components: + - type: Transform + pos: 15.5,37.5 + parent: 1 + - uid: 699 + components: + - type: Transform + pos: 13.5,36.5 + parent: 1 + - uid: 700 + components: + - type: Transform + pos: 11.5,37.5 + parent: 1 + - uid: 701 + components: + - type: Transform + pos: 10.5,33.5 + parent: 1 + - uid: 702 + components: + - type: Transform + pos: 11.5,34.5 + parent: 1 + - uid: 703 + components: + - type: Transform + pos: 36.5,26.5 + parent: 1 + - uid: 704 + components: + - type: Transform + pos: 26.5,25.5 + parent: 1 + - uid: 705 + components: + - type: Transform + pos: 29.5,37.5 + parent: 1 + - uid: 706 + components: + - type: Transform + pos: 15.5,6.5 + parent: 1 + - uid: 707 + components: + - type: Transform + pos: 15.5,7.5 + parent: 1 + - uid: 708 + components: + - type: Transform + pos: 15.5,8.5 + parent: 1 + - uid: 714 + components: + - type: Transform + pos: 15.5,14.5 + parent: 1 + - uid: 715 + components: + - type: Transform + pos: 15.5,15.5 + parent: 1 + - uid: 716 + components: + - type: Transform + pos: 15.5,16.5 + parent: 1 + - uid: 717 + components: + - type: Transform + pos: 15.5,17.5 + parent: 1 + - uid: 718 + components: + - type: Transform + pos: 15.5,18.5 + parent: 1 + - uid: 719 + components: + - type: Transform + pos: 15.5,19.5 + parent: 1 + - uid: 720 + components: + - type: Transform + pos: 22.5,25.5 + parent: 1 + - uid: 723 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 17.5,34.5 + parent: 1 + - uid: 725 + components: + - type: Transform + pos: 15.5,25.5 + parent: 1 + - uid: 726 + components: + - type: Transform + pos: 15.5,26.5 + parent: 1 + - uid: 727 + components: + - type: Transform + pos: 15.5,27.5 + parent: 1 + - uid: 728 + components: + - type: Transform + pos: 15.5,28.5 + parent: 1 + - uid: 729 + components: + - type: Transform + pos: 15.5,29.5 + parent: 1 + - uid: 730 + components: + - type: Transform + pos: 15.5,30.5 + parent: 1 + - uid: 737 + components: + - type: Transform + pos: 33.5,26.5 + parent: 1 + - uid: 738 + components: + - type: Transform + pos: 34.5,26.5 + parent: 1 + - uid: 739 + components: + - type: Transform + pos: 2.5,22.5 + parent: 1 + - uid: 740 + components: + - type: Transform + pos: 31.5,35.5 + parent: 1 + - uid: 741 + components: + - type: Transform + pos: 14.5,6.5 + parent: 1 + - uid: 742 + components: + - type: Transform + pos: 14.5,7.5 + parent: 1 + - uid: 743 + components: + - type: Transform + pos: 14.5,8.5 + parent: 1 + - uid: 744 + components: + - type: Transform + pos: 14.5,9.5 + parent: 1 + - uid: 745 + components: + - type: Transform + pos: 14.5,10.5 + parent: 1 + - uid: 746 + components: + - type: Transform + pos: 14.5,11.5 + parent: 1 + - uid: 747 + components: + - type: Transform + pos: 14.5,12.5 + parent: 1 + - uid: 748 + components: + - type: Transform + pos: 14.5,13.5 + parent: 1 + - uid: 749 + components: + - type: Transform + pos: 14.5,14.5 + parent: 1 + - uid: 750 + components: + - type: Transform + pos: 14.5,15.5 + parent: 1 + - uid: 751 + components: + - type: Transform + pos: 14.5,16.5 + parent: 1 + - uid: 752 + components: + - type: Transform + pos: 14.5,17.5 + parent: 1 + - uid: 753 + components: + - type: Transform + pos: 14.5,18.5 + parent: 1 + - uid: 754 + components: + - type: Transform + pos: 14.5,19.5 + parent: 1 + - uid: 758 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,36.5 + parent: 1 + - uid: 760 + components: + - type: Transform + pos: 14.5,25.5 + parent: 1 + - uid: 761 + components: + - type: Transform + pos: 14.5,26.5 + parent: 1 + - uid: 762 + components: + - type: Transform + pos: 14.5,27.5 + parent: 1 + - uid: 763 + components: + - type: Transform + pos: 14.5,28.5 + parent: 1 + - uid: 764 + components: + - type: Transform + pos: 14.5,29.5 + parent: 1 + - uid: 765 + components: + - type: Transform + pos: 14.5,30.5 + parent: 1 + - uid: 766 + components: + - type: Transform + pos: 11.5,33.5 + parent: 1 + - uid: 768 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 19.5,15.5 + parent: 1 + - uid: 769 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 19.5,17.5 + parent: 1 + - uid: 772 + components: + - type: Transform + pos: 2.5,21.5 + parent: 1 + - uid: 773 + components: + - type: Transform + pos: 35.5,26.5 + parent: 1 + - uid: 775 + components: + - type: Transform + pos: 31.5,33.5 + parent: 1 + - uid: 776 + components: + - type: Transform + pos: 13.5,6.5 + parent: 1 + - uid: 777 + components: + - type: Transform + pos: 13.5,7.5 + parent: 1 + - uid: 778 + components: + - type: Transform + pos: 13.5,8.5 + parent: 1 + - uid: 779 + components: + - type: Transform + pos: 13.5,9.5 + parent: 1 + - uid: 780 + components: + - type: Transform + pos: 13.5,10.5 + parent: 1 + - uid: 781 + components: + - type: Transform + pos: 13.5,11.5 + parent: 1 + - uid: 782 + components: + - type: Transform + pos: 13.5,12.5 + parent: 1 + - uid: 783 + components: + - type: Transform + pos: 13.5,13.5 + parent: 1 + - uid: 784 + components: + - type: Transform + pos: 13.5,14.5 + parent: 1 + - uid: 785 + components: + - type: Transform + pos: 13.5,15.5 + parent: 1 + - uid: 786 + components: + - type: Transform + pos: 13.5,16.5 + parent: 1 + - uid: 787 + components: + - type: Transform + pos: 13.5,17.5 + parent: 1 + - uid: 788 + components: + - type: Transform + pos: 13.5,18.5 + parent: 1 + - uid: 789 + components: + - type: Transform + pos: 13.5,19.5 + parent: 1 + - uid: 792 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 16.5,34.5 + parent: 1 + - uid: 795 + components: + - type: Transform + pos: 13.5,25.5 + parent: 1 + - uid: 796 + components: + - type: Transform + pos: 13.5,26.5 + parent: 1 + - uid: 797 + components: + - type: Transform + pos: 13.5,27.5 + parent: 1 + - uid: 798 + components: + - type: Transform + pos: 13.5,28.5 + parent: 1 + - uid: 799 + components: + - type: Transform + pos: 13.5,29.5 + parent: 1 + - uid: 800 + components: + - type: Transform + pos: 13.5,30.5 + parent: 1 + - uid: 801 + components: + - type: Transform + pos: 13.5,32.5 + parent: 1 + - uid: 803 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 20.5,16.5 + parent: 1 + - uid: 804 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 18.5,16.5 + parent: 1 + - uid: 807 + components: + - type: Transform + pos: 33.5,25.5 + parent: 1 + - uid: 808 + components: + - type: Transform + pos: 36.5,29.5 + parent: 1 + - uid: 809 + components: + - type: Transform + pos: 26.5,34.5 + parent: 1 + - uid: 810 + components: + - type: Transform + pos: 31.5,34.5 + parent: 1 + - uid: 811 + components: + - type: Transform + pos: 12.5,6.5 + parent: 1 + - uid: 812 + components: + - type: Transform + pos: 12.5,7.5 + parent: 1 + - uid: 813 + components: + - type: Transform + pos: 12.5,8.5 + parent: 1 + - uid: 814 + components: + - type: Transform + pos: 12.5,9.5 + parent: 1 + - uid: 815 + components: + - type: Transform + pos: 12.5,10.5 + parent: 1 + - uid: 816 + components: + - type: Transform + pos: 12.5,11.5 + parent: 1 + - uid: 817 + components: + - type: Transform + pos: 12.5,12.5 + parent: 1 + - uid: 818 + components: + - type: Transform + pos: 12.5,13.5 + parent: 1 + - uid: 819 + components: + - type: Transform + pos: 12.5,14.5 + parent: 1 + - uid: 820 + components: + - type: Transform + pos: 12.5,15.5 + parent: 1 + - uid: 824 + components: + - type: Transform + pos: 12.5,19.5 + parent: 1 + - uid: 826 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 9.5,32.5 + parent: 1 + - uid: 830 + components: + - type: Transform + pos: 12.5,25.5 + parent: 1 + - uid: 831 + components: + - type: Transform + pos: 12.5,26.5 + parent: 1 + - uid: 832 + components: + - type: Transform + pos: 12.5,27.5 + parent: 1 + - uid: 833 + components: + - type: Transform + pos: 12.5,28.5 + parent: 1 + - uid: 834 + components: + - type: Transform + pos: 12.5,29.5 + parent: 1 + - uid: 835 + components: + - type: Transform + pos: 12.5,30.5 + parent: 1 + - uid: 836 + components: + - type: Transform + pos: 12.5,32.5 + parent: 1 + - uid: 843 + components: + - type: Transform + pos: 36.5,27.5 + parent: 1 + - uid: 845 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 + - uid: 846 + components: + - type: Transform + pos: 11.5,6.5 + parent: 1 + - uid: 847 + components: + - type: Transform + pos: 11.5,7.5 + parent: 1 + - uid: 848 + components: + - type: Transform + pos: 11.5,8.5 + parent: 1 + - uid: 849 + components: + - type: Transform + pos: 11.5,9.5 + parent: 1 + - uid: 850 + components: + - type: Transform + pos: 11.5,10.5 + parent: 1 + - uid: 851 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - uid: 852 + components: + - type: Transform + pos: 11.5,12.5 + parent: 1 + - uid: 853 + components: + - type: Transform + pos: 11.5,13.5 + parent: 1 + - uid: 854 + components: + - type: Transform + pos: 11.5,14.5 + parent: 1 + - uid: 855 + components: + - type: Transform + pos: 11.5,15.5 + parent: 1 + - uid: 859 + components: + - type: Transform + pos: 11.5,19.5 + parent: 1 + - uid: 860 + components: + - type: Transform + pos: 11.5,20.5 + parent: 1 + - uid: 861 + components: + - type: Transform + pos: 11.5,21.5 + parent: 1 + - uid: 862 + components: + - type: Transform + pos: 11.5,22.5 + parent: 1 + - uid: 863 + components: + - type: Transform + pos: 11.5,23.5 + parent: 1 + - uid: 864 + components: + - type: Transform + pos: 11.5,24.5 + parent: 1 + - uid: 865 + components: + - type: Transform + pos: 11.5,25.5 + parent: 1 + - uid: 866 + components: + - type: Transform + pos: 11.5,26.5 + parent: 1 + - uid: 867 + components: + - type: Transform + pos: 11.5,27.5 + parent: 1 + - uid: 868 + components: + - type: Transform + pos: 11.5,28.5 + parent: 1 + - uid: 869 + components: + - type: Transform + pos: 11.5,29.5 + parent: 1 + - uid: 870 + components: + - type: Transform + pos: 11.5,30.5 + parent: 1 + - uid: 871 + components: + - type: Transform + pos: 11.5,31.5 + parent: 1 + - uid: 877 + components: + - type: Transform + pos: 27.5,33.5 + parent: 1 + - uid: 878 + components: + - type: Transform + pos: 36.5,28.5 + parent: 1 + - uid: 880 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 + - uid: 881 + components: + - type: Transform + pos: 10.5,6.5 + parent: 1 + - uid: 882 + components: + - type: Transform + pos: 10.5,7.5 + parent: 1 + - uid: 883 + components: + - type: Transform + pos: 10.5,8.5 + parent: 1 + - uid: 884 + components: + - type: Transform + pos: 10.5,9.5 + parent: 1 + - uid: 885 + components: + - type: Transform + pos: 10.5,10.5 + parent: 1 + - uid: 886 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 + - uid: 887 + components: + - type: Transform + pos: 10.5,12.5 + parent: 1 + - uid: 888 + components: + - type: Transform + pos: 10.5,13.5 + parent: 1 + - uid: 889 + components: + - type: Transform + pos: 10.5,14.5 + parent: 1 + - uid: 890 + components: + - type: Transform + pos: 10.5,15.5 + parent: 1 + - uid: 891 + components: + - type: Transform + pos: 10.5,18.5 + parent: 1 + - uid: 893 + components: + - type: Transform + pos: 18.5,15.5 + parent: 1 + - uid: 894 + components: + - type: Transform + pos: 10.5,19.5 + parent: 1 + - uid: 895 + components: + - type: Transform + pos: 10.5,20.5 + parent: 1 + - uid: 896 + components: + - type: Transform + pos: 10.5,21.5 + parent: 1 + - uid: 897 + components: + - type: Transform + pos: 10.5,22.5 + parent: 1 + - uid: 898 + components: + - type: Transform + pos: 10.5,23.5 + parent: 1 + - uid: 899 + components: + - type: Transform + pos: 10.5,24.5 + parent: 1 + - uid: 900 + components: + - type: Transform + pos: 10.5,25.5 + parent: 1 + - uid: 901 + components: + - type: Transform + pos: 10.5,26.5 + parent: 1 + - uid: 902 + components: + - type: Transform + pos: 10.5,27.5 + parent: 1 + - uid: 903 + components: + - type: Transform + pos: 10.5,28.5 + parent: 1 + - uid: 904 + components: + - type: Transform + pos: 10.5,29.5 + parent: 1 + - uid: 905 + components: + - type: Transform + pos: 10.5,30.5 + parent: 1 + - uid: 906 + components: + - type: Transform + pos: 10.5,31.5 + parent: 1 + - uid: 912 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,34.5 + parent: 1 + - uid: 913 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 27.5,32.5 + parent: 1 + - uid: 915 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 + - uid: 916 + components: + - type: Transform + pos: 9.5,6.5 + parent: 1 + - uid: 918 + components: + - type: Transform + pos: 9.5,8.5 + parent: 1 + - uid: 919 + components: + - type: Transform + pos: 9.5,9.5 + parent: 1 + - uid: 920 + components: + - type: Transform + pos: 9.5,10.5 + parent: 1 + - uid: 921 + components: + - type: Transform + pos: 9.5,11.5 + parent: 1 + - uid: 922 + components: + - type: Transform + pos: 9.5,12.5 + parent: 1 + - uid: 923 + components: + - type: Transform + pos: 9.5,13.5 + parent: 1 + - uid: 924 + components: + - type: Transform + pos: 9.5,14.5 + parent: 1 + - uid: 925 + components: + - type: Transform + pos: 9.5,15.5 + parent: 1 + - uid: 926 + components: + - type: Transform + pos: 9.5,16.5 + parent: 1 + - uid: 927 + components: + - type: Transform + pos: 9.5,17.5 + parent: 1 + - uid: 928 + components: + - type: Transform + pos: 9.5,18.5 + parent: 1 + - uid: 929 + components: + - type: Transform + pos: 9.5,19.5 + parent: 1 + - uid: 930 + components: + - type: Transform + pos: 9.5,20.5 + parent: 1 + - uid: 931 + components: + - type: Transform + pos: 9.5,21.5 + parent: 1 + - uid: 932 + components: + - type: Transform + pos: 9.5,22.5 + parent: 1 + - uid: 933 + components: + - type: Transform + pos: 9.5,23.5 + parent: 1 + - uid: 934 + components: + - type: Transform + pos: 9.5,24.5 + parent: 1 + - uid: 935 + components: + - type: Transform + pos: 9.5,25.5 + parent: 1 + - uid: 936 + components: + - type: Transform + pos: 9.5,26.5 + parent: 1 + - uid: 937 + components: + - type: Transform + pos: 9.5,27.5 + parent: 1 + - uid: 938 + components: + - type: Transform + pos: 9.5,28.5 + parent: 1 + - uid: 939 + components: + - type: Transform + pos: 9.5,29.5 + parent: 1 + - uid: 940 + components: + - type: Transform + pos: 9.5,30.5 + parent: 1 + - uid: 941 + components: + - type: Transform + pos: 9.5,31.5 + parent: 1 + - uid: 947 + components: + - type: Transform + pos: 17.5,33.5 + parent: 1 + - uid: 949 + components: + - type: Transform + pos: 27.5,34.5 + parent: 1 + - uid: 950 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 951 + components: + - type: Transform + pos: 8.5,6.5 + parent: 1 + - uid: 952 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 953 + components: + - type: Transform + pos: 8.5,8.5 + parent: 1 + - uid: 954 + components: + - type: Transform + pos: 8.5,9.5 + parent: 1 + - uid: 955 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 + - uid: 956 + components: + - type: Transform + pos: 8.5,11.5 + parent: 1 + - uid: 957 + components: + - type: Transform + pos: 8.5,12.5 + parent: 1 + - uid: 959 + components: + - type: Transform + pos: 8.5,14.5 + parent: 1 + - uid: 960 + components: + - type: Transform + pos: 8.5,15.5 + parent: 1 + - uid: 961 + components: + - type: Transform + pos: 8.5,16.5 + parent: 1 + - uid: 962 + components: + - type: Transform + pos: 8.5,17.5 + parent: 1 + - uid: 963 + components: + - type: Transform + pos: 8.5,18.5 + parent: 1 + - uid: 964 + components: + - type: Transform + pos: 8.5,19.5 + parent: 1 + - uid: 965 + components: + - type: Transform + pos: 8.5,20.5 + parent: 1 + - uid: 966 + components: + - type: Transform + pos: 8.5,21.5 + parent: 1 + - uid: 967 + components: + - type: Transform + pos: 8.5,22.5 + parent: 1 + - uid: 968 + components: + - type: Transform + pos: 8.5,23.5 + parent: 1 + - uid: 969 + components: + - type: Transform + pos: 8.5,24.5 + parent: 1 + - uid: 970 + components: + - type: Transform + pos: 8.5,25.5 + parent: 1 + - uid: 973 + components: + - type: Transform + pos: 8.5,28.5 + parent: 1 + - uid: 974 + components: + - type: Transform + pos: 8.5,29.5 + parent: 1 + - uid: 975 + components: + - type: Transform + pos: 8.5,30.5 + parent: 1 + - uid: 976 + components: + - type: Transform + pos: 8.5,31.5 + parent: 1 + - uid: 978 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,17.5 + parent: 1 + - uid: 979 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,17.5 + parent: 1 + - uid: 985 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 + - uid: 986 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 987 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 988 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 989 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 990 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 + - uid: 991 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 + - uid: 992 + components: + - type: Transform + pos: 7.5,12.5 + parent: 1 + - uid: 993 + components: + - type: Transform + pos: 7.5,13.5 + parent: 1 + - uid: 994 + components: + - type: Transform + pos: 7.5,14.5 + parent: 1 + - uid: 995 + components: + - type: Transform + pos: 6.5,26.5 + parent: 1 + - uid: 996 + components: + - type: Transform + pos: 7.5,16.5 + parent: 1 + - uid: 997 + components: + - type: Transform + pos: 7.5,17.5 + parent: 1 + - uid: 998 + components: + - type: Transform + pos: 7.5,18.5 + parent: 1 + - uid: 999 + components: + - type: Transform + pos: 7.5,19.5 + parent: 1 + - uid: 1000 + components: + - type: Transform + pos: 7.5,20.5 + parent: 1 + - uid: 1002 + components: + - type: Transform + pos: 7.5,22.5 + parent: 1 + - uid: 1003 + components: + - type: Transform + pos: 7.5,23.5 + parent: 1 + - uid: 1004 + components: + - type: Transform + pos: 7.5,24.5 + parent: 1 + - uid: 1005 + components: + - type: Transform + pos: 7.5,25.5 + parent: 1 + - uid: 1006 + components: + - type: Transform + pos: 7.5,26.5 + parent: 1 + - uid: 1008 + components: + - type: Transform + pos: 7.5,28.5 + parent: 1 + - uid: 1009 + components: + - type: Transform + pos: 7.5,29.5 + parent: 1 + - uid: 1010 + components: + - type: Transform + pos: 7.5,30.5 + parent: 1 + - uid: 1011 + components: + - type: Transform + pos: 7.5,31.5 + parent: 1 + - uid: 1013 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,18.5 + parent: 1 + - uid: 1014 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 11.5,16.5 + parent: 1 + - uid: 1021 + components: + - type: Transform + pos: 12.5,4.5 + parent: 1 + - uid: 1022 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 1023 + components: + - type: Transform + pos: 6.5,8.5 + parent: 1 + - uid: 1024 + components: + - type: Transform + pos: 6.5,9.5 + parent: 1 + - uid: 1025 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 + - uid: 1026 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 + - uid: 1027 + components: + - type: Transform + pos: 6.5,12.5 + parent: 1 + - uid: 1028 + components: + - type: Transform + pos: 6.5,13.5 + parent: 1 + - uid: 1030 + components: + - type: Transform + pos: 6.5,15.5 + parent: 1 + - uid: 1031 + components: + - type: Transform + pos: 6.5,16.5 + parent: 1 + - uid: 1032 + components: + - type: Transform + pos: 6.5,17.5 + parent: 1 + - uid: 1033 + components: + - type: Transform + pos: 6.5,18.5 + parent: 1 + - uid: 1034 + components: + - type: Transform + pos: 6.5,19.5 + parent: 1 + - uid: 1035 + components: + - type: Transform + pos: 6.5,20.5 + parent: 1 + - uid: 1036 + components: + - type: Transform + pos: 6.5,21.5 + parent: 1 + - uid: 1037 + components: + - type: Transform + pos: 6.5,22.5 + parent: 1 + - uid: 1038 + components: + - type: Transform + pos: 6.5,23.5 + parent: 1 + - uid: 1039 + components: + - type: Transform + pos: 6.5,24.5 + parent: 1 + - uid: 1040 + components: + - type: Transform + pos: 6.5,25.5 + parent: 1 + - uid: 1041 + components: + - type: Transform + pos: 7.5,15.5 + parent: 1 + - uid: 1042 + components: + - type: Transform + pos: 6.5,27.5 + parent: 1 + - uid: 1043 + components: + - type: Transform + pos: 6.5,28.5 + parent: 1 + - uid: 1044 + components: + - type: Transform + pos: 6.5,29.5 + parent: 1 + - uid: 1045 + components: + - type: Transform + pos: 6.5,30.5 + parent: 1 + - uid: 1046 + components: + - type: Transform + pos: 8.5,34.5 + parent: 1 + - uid: 1052 + components: + - type: Transform + pos: 10.5,34.5 + parent: 1 + - uid: 1057 + components: + - type: Transform + pos: 12.5,18.5 + parent: 1 + - uid: 1060 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 1061 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 1062 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 1063 + components: + - type: Transform + pos: 5.5,13.5 + parent: 1 + - uid: 1064 + components: + - type: Transform + pos: 5.5,14.5 + parent: 1 + - uid: 1065 + components: + - type: Transform + pos: 5.5,15.5 + parent: 1 + - uid: 1066 + components: + - type: Transform + pos: 5.5,16.5 + parent: 1 + - uid: 1067 + components: + - type: Transform + pos: 5.5,17.5 + parent: 1 + - uid: 1068 + components: + - type: Transform + pos: 5.5,18.5 + parent: 1 + - uid: 1069 + components: + - type: Transform + pos: 5.5,19.5 + parent: 1 + - uid: 1070 + components: + - type: Transform + pos: 5.5,20.5 + parent: 1 + - uid: 1071 + components: + - type: Transform + pos: 5.5,21.5 + parent: 1 + - uid: 1072 + components: + - type: Transform + pos: 5.5,22.5 + parent: 1 + - uid: 1073 + components: + - type: Transform + pos: 5.5,23.5 + parent: 1 + - uid: 1074 + components: + - type: Transform + pos: 5.5,24.5 + parent: 1 + - uid: 1075 + components: + - type: Transform + pos: 5.5,25.5 + parent: 1 + - uid: 1076 + components: + - type: Transform + pos: 5.5,26.5 + parent: 1 + - uid: 1077 + components: + - type: Transform + pos: 5.5,27.5 + parent: 1 + - uid: 1078 + components: + - type: Transform + pos: 5.5,28.5 + parent: 1 + - uid: 1079 + components: + - type: Transform + pos: 5.5,29.5 + parent: 1 + - uid: 1080 + components: + - type: Transform + pos: 5.5,30.5 + parent: 1 + - uid: 1081 + components: + - type: Transform + pos: 7.5,34.5 + parent: 1 + - uid: 1087 + components: + - type: Transform + pos: 14.5,36.5 + parent: 1 + - uid: 1095 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 1096 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 1097 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 1098 + components: + - type: Transform + pos: 4.5,13.5 + parent: 1 + - uid: 1099 + components: + - type: Transform + pos: 4.5,14.5 + parent: 1 + - uid: 1100 + components: + - type: Transform + pos: 4.5,15.5 + parent: 1 + - uid: 1101 + components: + - type: Transform + pos: 4.5,16.5 + parent: 1 + - uid: 1102 + components: + - type: Transform + pos: 4.5,17.5 + parent: 1 + - uid: 1103 + components: + - type: Transform + pos: 4.5,18.5 + parent: 1 + - uid: 1104 + components: + - type: Transform + pos: 4.5,19.5 + parent: 1 + - uid: 1105 + components: + - type: Transform + pos: 4.5,20.5 + parent: 1 + - uid: 1106 + components: + - type: Transform + pos: 4.5,21.5 + parent: 1 + - uid: 1107 + components: + - type: Transform + pos: 4.5,22.5 + parent: 1 + - uid: 1108 + components: + - type: Transform + pos: 4.5,23.5 + parent: 1 + - uid: 1109 + components: + - type: Transform + pos: 4.5,24.5 + parent: 1 + - uid: 1110 + components: + - type: Transform + pos: 4.5,25.5 + parent: 1 + - uid: 1111 + components: + - type: Transform + pos: 4.5,26.5 + parent: 1 + - uid: 1112 + components: + - type: Transform + pos: 4.5,27.5 + parent: 1 + - uid: 1113 + components: + - type: Transform + pos: 4.5,28.5 + parent: 1 + - uid: 1114 + components: + - type: Transform + pos: 4.5,29.5 + parent: 1 + - uid: 1115 + components: + - type: Transform + pos: 8.5,35.5 + parent: 1 + - uid: 1116 + components: + - type: Transform + pos: 6.5,34.5 + parent: 1 + - uid: 1122 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 26.5,33.5 + parent: 1 + - uid: 1123 + components: + - type: Transform + pos: 25.5,22.5 + parent: 1 + - uid: 1127 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,31.5 + parent: 1 + - uid: 1130 + components: + - type: Transform + pos: 17.5,37.5 + parent: 1 + - uid: 1131 + components: + - type: Transform + pos: 11.5,36.5 + parent: 1 + - uid: 1132 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 1133 + components: + - type: Transform + pos: 3.5,13.5 + parent: 1 + - uid: 1134 + components: + - type: Transform + pos: 3.5,14.5 + parent: 1 + - uid: 1135 + components: + - type: Transform + pos: 3.5,15.5 + parent: 1 + - uid: 1136 + components: + - type: Transform + pos: 3.5,16.5 + parent: 1 + - uid: 1137 + components: + - type: Transform + pos: 3.5,17.5 + parent: 1 + - uid: 1138 + components: + - type: Transform + pos: 3.5,18.5 + parent: 1 + - uid: 1139 + components: + - type: Transform + pos: 3.5,19.5 + parent: 1 + - uid: 1140 + components: + - type: Transform + pos: 3.5,20.5 + parent: 1 + - uid: 1141 + components: + - type: Transform + pos: 4.5,35.5 + parent: 1 + - uid: 1142 + components: + - type: Transform + pos: 4.5,36.5 + parent: 1 + - uid: 1143 + components: + - type: Transform + pos: 5.5,35.5 + parent: 1 + - uid: 1144 + components: + - type: Transform + pos: 3.5,24.5 + parent: 1 + - uid: 1145 + components: + - type: Transform + pos: 3.5,25.5 + parent: 1 + - uid: 1146 + components: + - type: Transform + pos: 3.5,26.5 + parent: 1 + - uid: 1147 + components: + - type: Transform + pos: 3.5,27.5 + parent: 1 + - uid: 1148 + components: + - type: Transform + pos: 2.5,33.5 + parent: 1 + - uid: 1149 + components: + - type: Transform + pos: 6.5,35.5 + parent: 1 + - uid: 1150 + components: + - type: Transform + pos: 6.5,36.5 + parent: 1 + - uid: 1151 + components: + - type: Transform + pos: 9.5,34.5 + parent: 1 + - uid: 1158 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 24.5,35.5 + parent: 1 + - uid: 1159 + components: + - type: Transform + pos: 2.5,28.5 + parent: 1 + - uid: 1161 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 20.5,29.5 + parent: 1 + - uid: 1163 + components: + - type: Transform + pos: 24.5,25.5 + parent: 1 + - uid: 1164 + components: + - type: Transform + pos: 12.5,16.5 + parent: 1 + - uid: 1165 + components: + - type: Transform + pos: 18.5,37.5 + parent: 1 + - uid: 1166 + components: + - type: Transform + pos: 3.5,35.5 + parent: 1 + - uid: 1167 + components: + - type: Transform + pos: 13.5,4.5 + parent: 1 + - uid: 1168 + components: + - type: Transform + pos: 5.5,34.5 + parent: 1 + - uid: 1169 + components: + - type: Transform + pos: 12.5,37.5 + parent: 1 + - uid: 1170 + components: + - type: Transform + pos: 2.5,15.5 + parent: 1 + - uid: 1171 + components: + - type: Transform + pos: 2.5,16.5 + parent: 1 + - uid: 1172 + components: + - type: Transform + pos: 2.5,17.5 + parent: 1 + - uid: 1173 + components: + - type: Transform + pos: 2.5,18.5 + parent: 1 + - uid: 1174 + components: + - type: Transform + pos: 4.5,34.5 + parent: 1 + - uid: 1175 + components: + - type: Transform + pos: 4.5,33.5 + parent: 1 + - uid: 1176 + components: + - type: Transform + pos: 3.5,32.5 + parent: 1 + - uid: 1177 + components: + - type: Transform + pos: 3.5,34.5 + parent: 1 + - uid: 1178 + components: + - type: Transform + pos: 3.5,33.5 + parent: 1 + - uid: 1179 + components: + - type: Transform + pos: 4.5,32.5 + parent: 1 + - uid: 1180 + components: + - type: Transform + pos: 2.5,32.5 + parent: 1 + - uid: 1181 + components: + - type: Transform + pos: 5.5,36.5 + parent: 1 + - uid: 1273 + components: + - type: Transform + pos: 23.5,23.5 + parent: 1 + - uid: 1274 + components: + - type: Transform + pos: 22.5,24.5 + parent: 1 + - uid: 1275 + components: + - type: Transform + pos: 23.5,25.5 + parent: 1 + - uid: 1276 + components: + - type: Transform + pos: 24.5,24.5 + parent: 1 + - uid: 1277 + components: + - type: Transform + pos: 20.5,31.5 + parent: 1 + - uid: 1278 + components: + - type: Transform + pos: 21.5,32.5 + parent: 1 + - uid: 1279 + components: + - type: Transform + pos: 20.5,33.5 + parent: 1 + - uid: 1280 + components: + - type: Transform + pos: 19.5,32.5 + parent: 1 + - uid: 1286 + components: + - type: Transform + pos: 26.5,36.5 + parent: 1 + - uid: 1292 + components: + - type: Transform + pos: 31.5,39.5 + parent: 1 + - uid: 1295 + components: + - type: Transform + pos: 23.5,37.5 + parent: 1 + - uid: 1296 + components: + - type: Transform + pos: 29.5,39.5 + parent: 1 + - uid: 1297 + components: + - type: Transform + pos: 21.5,36.5 + parent: 1 + - uid: 1298 + components: + - type: Transform + pos: 30.5,39.5 + parent: 1 + - uid: 1299 + components: + - type: Transform + pos: 9.5,37.5 + parent: 1 + - uid: 1300 + components: + - type: Transform + pos: 10.5,37.5 + parent: 1 + - uid: 1303 + components: + - type: Transform + pos: 28.5,39.5 + parent: 1 + - uid: 1304 + components: + - type: Transform + pos: 27.5,39.5 + parent: 1 + - uid: 1305 + components: + - type: Transform + pos: 26.5,39.5 + parent: 1 +- proto: FoodCondimentBottleHotsauce + entities: + - uid: 1217 + components: + - type: Transform + pos: 25.248657,15.726672 + parent: 1 +- proto: FoodMeatGoliathCooked + entities: + - uid: 1219 + components: + - type: Transform + rot: -25.132741228718352 rad + pos: 26.530731,15.715266 + parent: 1 + - type: CollisionWake + enabled: False +- proto: FoodSoupChiliHot + entities: + - uid: 1216 + components: + - type: Transform + pos: 25.5,15.5 + parent: 1 +- proto: GeneratorBasic15kW + entities: + - uid: 1152 + components: + - type: Transform + pos: 18.5,10.5 + parent: 1 +- proto: Girder + entities: + - uid: 1288 + components: + - type: Transform + pos: 21.5,38.5 + parent: 1 +- proto: Grille + entities: + - uid: 8 + components: + - type: Transform + pos: 19.5,11.5 + parent: 1 + - uid: 336 + components: + - type: Transform + pos: 12.5,22.5 + parent: 1 + - uid: 386 + components: + - type: Transform + pos: 27.5,16.5 + parent: 1 + - uid: 917 + components: + - type: Transform + pos: 14.5,24.5 + parent: 1 + - uid: 1293 + components: + - type: Transform + pos: 23.5,40.5 + parent: 1 +- proto: GrilleBroken + entities: + - uid: 1237 + components: + - type: Transform + pos: 23.5,29.5 + parent: 1 + - uid: 1238 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 23.5,29.5 + parent: 1 + - uid: 1283 + components: + - type: Transform + pos: 24.5,32.5 + parent: 1 + - uid: 1284 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,32.5 + parent: 1 + - uid: 1285 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,33.5 + parent: 1 + - uid: 1310 + components: + - type: Transform + pos: 23.5,33.5 + parent: 1 +- proto: KitchenElectricGrill + entities: + - uid: 759 + components: + - type: Transform + pos: 26.5,15.5 + parent: 1 + - type: ItemPlacer + placedEntities: + - 1219 +- proto: KitchenKnife + entities: + - uid: 1215 + components: + - type: Transform + rot: -6.283185307179586 rad + pos: 26.486666,16.420792 + parent: 1 +- proto: LockerMedicineFilled + entities: + - uid: 1231 + components: + - type: Transform + pos: 14.5,23.5 + parent: 1 +- proto: MachineFrameDestroyed + entities: + - uid: 14 + components: + - type: Transform + pos: 24.5,36.5 + parent: 1 +- proto: MaintenanceToolSpawner + entities: + - uid: 1308 + components: + - type: Transform + pos: 22.5,39.5 + parent: 1 +- proto: MedicalBed + entities: + - uid: 1227 + components: + - type: Transform + pos: 15.5,23.5 + parent: 1 + - uid: 1228 + components: + - type: Transform + pos: 13.5,23.5 + parent: 1 +- proto: MedkitBurnFilled + entities: + - uid: 1235 + components: + - type: Transform + pos: 16.528265,12.55404 + parent: 1 +- proto: PoweredLEDSmallLight + entities: + - uid: 872 + components: + - type: Transform + pos: 25.5,17.5 + parent: 1 + - uid: 1018 + components: + - type: Transform + pos: 17.5,12.5 + parent: 1 + - uid: 1093 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 14.5,21.5 + parent: 1 +- proto: Rack + entities: + - uid: 1222 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,15.5 + parent: 1 + - uid: 1226 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 16.5,12.5 + parent: 1 + - uid: 1302 + components: + - type: Transform + pos: 22.5,39.5 + parent: 1 +- proto: ReinforcedWindow + entities: + - uid: 546 + components: + - type: Transform + pos: 14.5,24.5 + parent: 1 + - uid: 837 + components: + - type: Transform + pos: 27.5,16.5 + parent: 1 + - uid: 1001 + components: + - type: Transform + pos: 12.5,22.5 + parent: 1 + - uid: 1058 + components: + - type: Transform + pos: 19.5,11.5 + parent: 1 + - uid: 1294 + components: + - type: Transform + pos: 23.5,40.5 + parent: 1 +- proto: SinkWide + entities: + - uid: 1221 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 25.5,17.5 + parent: 1 +- proto: SMESBasic + entities: + - uid: 1117 + components: + - type: Transform + pos: 16.5,10.5 + parent: 1 +- proto: SubstationBasic + entities: + - uid: 977 + components: + - type: Transform + pos: 18.5,12.5 + parent: 1 +- proto: Table + entities: + - uid: 1233 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,21.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 1220 + components: + - type: Transform + pos: 26.5,16.5 + parent: 1 + - uid: 1223 + components: + - type: Transform + pos: 26.5,15.5 + parent: 1 +- proto: WallReinforced + entities: + - uid: 100 + components: + - type: Transform + pos: 21.5,40.5 + parent: 1 + - uid: 192 + components: + - type: Transform + pos: 27.5,18.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: 24.5,14.5 + parent: 1 + - uid: 314 + components: + - type: Transform + pos: 16.5,24.5 + parent: 1 + - uid: 348 + components: + - type: Transform + pos: 16.5,20.5 + parent: 1 + - uid: 554 + components: + - type: Transform + pos: 24.5,18.5 + parent: 1 + - uid: 611 + components: + - type: Transform + pos: 19.5,9.5 + parent: 1 + - uid: 692 + components: + - type: Transform + pos: 27.5,14.5 + parent: 1 + - uid: 712 + components: + - type: Transform + pos: 15.5,13.5 + parent: 1 + - uid: 732 + components: + - type: Transform + pos: 12.5,20.5 + parent: 1 + - uid: 857 + components: + - type: Transform + pos: 15.5,9.5 + parent: 1 + - uid: 1007 + components: + - type: Transform + pos: 12.5,24.5 + parent: 1 + - uid: 1020 + components: + - type: Transform + pos: 19.5,13.5 + parent: 1 + - uid: 1287 + components: + - type: Transform + pos: 25.5,40.5 + parent: 1 +- proto: WallSolid + entities: + - uid: 72 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 16.5,21.5 + parent: 1 + - uid: 124 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,17.5 + parent: 1 + - uid: 170 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,15.5 + parent: 1 + - uid: 208 + components: + - type: Transform + pos: 13.5,24.5 + parent: 1 + - uid: 243 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,14.5 + parent: 1 + - uid: 279 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,14.5 + parent: 1 + - uid: 313 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,18.5 + parent: 1 + - uid: 349 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,18.5 + parent: 1 + - uid: 387 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 27.5,15.5 + parent: 1 + - uid: 394 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 16.5,23.5 + parent: 1 + - uid: 426 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 15.5,24.5 + parent: 1 + - uid: 444 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 23.5,24.5 + parent: 1 + - uid: 452 + components: + - type: Transform + pos: 23.5,32.5 + parent: 1 + - uid: 569 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 19.5,16.5 + parent: 1 + - uid: 572 + components: + - type: Transform + pos: 17.5,9.5 + parent: 1 + - uid: 579 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 12.5,21.5 + parent: 1 + - uid: 604 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 15.5,12.5 + parent: 1 + - uid: 639 + components: + - type: Transform + pos: 17.5,13.5 + parent: 1 + - uid: 674 + components: + - type: Transform + pos: 19.5,10.5 + parent: 1 + - uid: 709 + components: + - type: Transform + pos: 16.5,9.5 + parent: 1 + - uid: 710 + components: + - type: Transform + pos: 15.5,10.5 + parent: 1 + - uid: 711 + components: + - type: Transform + pos: 18.5,9.5 + parent: 1 + - uid: 713 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 19.5,12.5 + parent: 1 + - uid: 767 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 27.5,17.5 + parent: 1 + - uid: 958 + components: + - type: Transform + pos: 16.5,22.5 + parent: 1 + - uid: 971 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 14.5,20.5 + parent: 1 + - uid: 972 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,20.5 + parent: 1 + - uid: 1017 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 16.5,13.5 + parent: 1 + - uid: 1019 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,17.5 + parent: 1 + - uid: 1029 + components: + - type: Transform + pos: 12.5,23.5 + parent: 1 + - uid: 1059 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,13.5 + parent: 1 + - uid: 1289 + components: + - type: Transform + pos: 21.5,39.5 + parent: 1 + - uid: 1290 + components: + - type: Transform + pos: 22.5,40.5 + parent: 1 + - uid: 1291 + components: + - type: Transform + pos: 24.5,40.5 + parent: 1 +- proto: WeaponRevolverPython + entities: + - uid: 1234 + components: + - type: Transform + rot: -6.283185307179586 rad + pos: 13.490121,21.643442 + parent: 1 +- proto: WoodenSignRight + entities: + - uid: 982 + components: + - type: Transform + pos: 5.5,33.5 + parent: 1 +... From 43451f82c5a0173412e736b8d178ad9affde1841 Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Tue, 22 Apr 2025 17:51:21 +1200 Subject: [PATCH 524/622] Metal foam grenade rework, small tweaks to grenade timers (#34579) --- .../Entities/Effects/chemistry_effects.yml | 2 +- .../Entities/Objects/Weapons/Throwable/grenades.yml | 12 ++++++++---- .../Weapons/Throwable/scattering_grenades.yml | 6 ++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Resources/Prototypes/Entities/Effects/chemistry_effects.yml b/Resources/Prototypes/Entities/Effects/chemistry_effects.yml index d31a900236..2f4646e001 100644 --- a/Resources/Prototypes/Entities/Effects/chemistry_effects.yml +++ b/Resources/Prototypes/Entities/Effects/chemistry_effects.yml @@ -183,7 +183,7 @@ thresholds: - trigger: !type:DamageTrigger - damage: 50 + damage: 12 behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index ebfdf184f7..b76a1c2554 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -15,7 +15,7 @@ slots: - Belt - type: OnUseTimerTrigger - delay: 3.5 + delay: 3 - type: Damageable damageContainer: Inorganic - type: Destructible @@ -448,13 +448,15 @@ parent: [ BaseEngineeringContraband, SmokeGrenade ] id: MetalFoamGrenade name: metal foam grenade - description: An emergency tool used for patching up holes. Almost as good as real walls. + description: An emergency tool used for patching breaches with special quick-set metal foam. Almost as good as real walls. components: - type: Sprite sprite: Objects/Weapons/Grenades/metalfoam.rsi + - type: OnUseTimerTrigger + delay: 1.5 - type: SmokeOnTrigger - duration: 10 - spreadAmount: 13 + duration: 2 + spreadAmount: 5 smokePrototype: AluminiumMetalFoam - type: StaticPrice price: 350 @@ -488,6 +490,8 @@ components: - type: Sprite sprite: Objects/Weapons/Grenades/syndgrenade.rsi + - type: OnUseTimerTrigger + delay: 5 - type: SoundOnTrigger sound: path: /Audio/Effects/Emotes/parp1.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml index a3087f1f9e..0b5f694964 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml @@ -18,6 +18,8 @@ behaviors: - !type:TriggerBehavior - type: ScatteringGrenade + - type: OnUseTimerTrigger + delay: 3 - type: Tag tags: - HandGrenade @@ -39,8 +41,6 @@ - type: Sprite sprite: Objects/Weapons/Grenades/clusterbang.rsi state: base-0 - - type: OnUseTimerTrigger - delay: 3.5 - type: entity parent: ClusterBang @@ -95,7 +95,6 @@ volume: 5 initialBeepDelay: 0 beepInterval: 0.5 - delay: 3.5 - type: EmitSoundOnTrigger sound: path: "/Audio/Machines/door_lock_off.ogg" @@ -171,7 +170,6 @@ volume: 5 initialBeepDelay: 0 beepInterval: 2 - delay: 3.5 - type: EmitSoundOnTrigger sound: path: "/Audio/Weapons/Guns/Gunshots/batrifle.ogg" From b64b24ef7f8fa3680e1be1c3c523e3271faf0c4e Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 05:52:27 +0000 Subject: [PATCH 525/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7ac0ea9d82..9f643236f9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: themias - changes: - - message: Fixed muzzles not working on some characters (e.g. dwarves) - type: Fix - id: 7809 - time: '2025-01-15T00:10:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34419 - author: ArtisticRoomba changes: - message: The station anchor machine board can no longer be printed at the circuit @@ -3906,3 +3899,19 @@ id: 8310 time: '2025-04-22T03:22:56.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30212 +- author: K-Dynamic + changes: + - message: Changed instances of 3.5 second grenade timers to 3 seconds, including + clusterbangs and atmos metal foam grenades. + type: Tweak + - message: Atmos metal foam grenades have been reworked to disperse foam in a 5x5 + diamond pattern and harden within two seconds. + type: Tweak + - message: Reduced hardened metal foam health (breakable in 6 crowbar swings). + type: Tweak + - message: Changed syndicate trickbomb timer from 3.5 seconds to 5 seconds to match + minibombs. + type: Tweak + id: 8311 + time: '2025-04-22T05:51:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34579 From 1e3f73a0e0cd003c8a17e85d955e15174044768e Mon Sep 17 00:00:00 2001 From: mubururu_ <139181059+muburu@users.noreply.github.com> Date: Tue, 22 Apr 2025 01:32:59 -0500 Subject: [PATCH 526/622] dragons can now pry doors (#36811) --- Resources/Prototypes/Entities/Mobs/Player/dragon.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index 2c335b8ee4..2721c6dfd1 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -159,6 +159,12 @@ - NamesDragon - NamesDragonTitle nameFormat: name-format-dragon + - type: Prying + pryPowered: true + force: true + speedModifier: 2.5 # fast because dragon strong + useSound: + path: /Audio/Items/crowbar.ogg - type: entity parent: BaseMobDragon From 1197d9b038068090471b62aba8909c3d7aa688f4 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 06:34:06 +0000 Subject: [PATCH 527/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9f643236f9..faa92cd462 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: The station anchor machine board can no longer be printed at the circuit - imprinter. - type: Remove - id: 7810 - time: '2025-01-15T16:26:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34358 - author: ArtisticRoomba changes: - message: Mime PDA item interactions (insertions/ejections of IDs, pens, etc.) @@ -3915,3 +3907,10 @@ id: 8311 time: '2025-04-22T05:51:21.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34579 +- author: muburu + changes: + - message: Dragons can now pry open doors, including firelocks. + type: Tweak + id: 8312 + time: '2025-04-22T06:33:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36811 From 907f4b39cd40eb0ca4a555400e8088faa3d61d7d Mon Sep 17 00:00:00 2001 From: pathetic meowmeow <uhhadd@gmail.com> Date: Tue, 22 Apr 2025 08:34:53 -0400 Subject: [PATCH 528/622] Make funding allocation computer more configurable (#36790) * Make funding allocation computer more configurable * admin logging * unused * ccvar enabled --------- Co-authored-by: ScarKy0 <scarky0@onet.eu> --- ...dingAllocationConsoleBoundUserInterface.cs | 4 +- .../Cargo/UI/FundingAllocationMenu.xaml | 13 ++-- .../Cargo/UI/FundingAllocationMenu.xaml.cs | 74 +++++++++++++++++-- .../Cargo/Systems/CargoSystem.Funds.cs | 28 ++++++- .../Cargo/Systems/CargoSystem.Shuttle.cs | 9 ++- Content.Server/Cargo/Systems/CargoSystem.cs | 3 + Content.Shared/CCVar/CCVars.Cargo.cs | 26 +++++++ .../FundingAllocationConsoleComponent.cs | 6 +- .../Cargo/Components/OverrideSellComponent.cs | 6 -- .../Components/StationBankAccountComponent.cs | 6 ++ .../en-US/cargo/cargo-console-component.ftl | 6 +- 11 files changed, 155 insertions(+), 26 deletions(-) create mode 100644 Content.Shared/CCVar/CCVars.Cargo.cs diff --git a/Content.Client/Cargo/BUI/FundingAllocationConsoleBoundUserInterface.cs b/Content.Client/Cargo/BUI/FundingAllocationConsoleBoundUserInterface.cs index eb65be40d3..49a545b480 100644 --- a/Content.Client/Cargo/BUI/FundingAllocationConsoleBoundUserInterface.cs +++ b/Content.Client/Cargo/BUI/FundingAllocationConsoleBoundUserInterface.cs @@ -17,9 +17,9 @@ public sealed class FundingAllocationConsoleBoundUserInterface(EntityUid owner, _menu = this.CreateWindow<FundingAllocationMenu>(); - _menu.OnSavePressed += d => + _menu.OnSavePressed += (dicts, primary, lockbox) => { - SendMessage(new SetFundingAllocationBuiMessage(d)); + SendMessage(new SetFundingAllocationBuiMessage(dicts, primary, lockbox)); }; } diff --git a/Content.Client/Cargo/UI/FundingAllocationMenu.xaml b/Content.Client/Cargo/UI/FundingAllocationMenu.xaml index 0686ea77d8..62f0ae924a 100644 --- a/Content.Client/Cargo/UI/FundingAllocationMenu.xaml +++ b/Content.Client/Cargo/UI/FundingAllocationMenu.xaml @@ -1,15 +1,18 @@ <controls:FancyWindow xmlns="https://spacestation14.io" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client" - Title="{Loc 'cargo-funding-alloc-console-menu-title'}" - SetSize="680 310" - MinSize="680 310"> + Title="{Loc 'cargo-funding-alloc-console-menu-title'}"> <BoxContainer Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True" Margin="10 5 10 10"> - <Label Name="HelpLabel" HorizontalAlignment="Center" StyleClasses="LabelSubText"/> - <Control MinHeight="10"/> + <controls:TableContainer Columns="2" HorizontalExpand="True" VerticalExpand="True"> + <RichTextLabel Name="PrimaryCutLabel" Text="{Loc 'cargo-funding-alloc-console-label-primary-cut'}"/> + <SpinBox Name="PrimaryCut"/> + <RichTextLabel Name="LockboxCutLabel" Text="{Loc 'cargo-funding-alloc-console-label-lockbox-cut'}"/> + <SpinBox Name="LockboxCut"/> + </controls:TableContainer> + <Label Name="HelpLabel" HorizontalAlignment="Center" StyleClasses="LabelSubText" Margin="0 10"/> <PanelContainer VerticalExpand="True" HorizontalExpand="True" VerticalAlignment="Top" MaxHeight="250"> <PanelContainer.PanelOverride> <graphics:StyleBoxFlat BackgroundColor="#1B1B1E"/> diff --git a/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs b/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs index d605d4c48e..fdba5f5bd8 100644 --- a/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs +++ b/Content.Client/Cargo/UI/FundingAllocationMenu.xaml.cs @@ -1,12 +1,15 @@ +using System.Collections.Generic; using System.Linq; using Content.Client.Message; using Content.Client.UserInterface.Controls; using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Prototypes; +using Content.Shared.CCVar; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Timing; @@ -15,14 +18,21 @@ namespace Content.Client.Cargo.UI; [GenerateTypedNameReferences] public sealed partial class FundingAllocationMenu : FancyWindow { + [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; private readonly EntityQuery<StationBankAccountComponent> _bankQuery; - public event Action<Dictionary<ProtoId<CargoAccountPrototype>, int>>? OnSavePressed; + public event Action<Dictionary<ProtoId<CargoAccountPrototype>, int>, double, double>? OnSavePressed; private EntityUid? _station; + private bool _allowPrimaryAccountAllocation; + private bool _allowPrimaryCutAdjustment; + private bool _lockboxCutEnabled; + + private double _primaryCut; + private double _lockboxCut; private readonly HashSet<Control> _addedControls = new(); private readonly List<SpinBox> _spinBoxes = new(); @@ -35,30 +45,65 @@ public sealed partial class FundingAllocationMenu : FancyWindow _bankQuery = _entityManager.GetEntityQuery<StationBankAccountComponent>(); + PrimaryCut.ValueChanged += args => + { + _primaryCut = (double)args.Value / 100.0; + UpdateButtonDisabled(); + }; + + LockboxCut.ValueChanged += args => + { + _lockboxCut = 1.0 - (double)args.Value / 100.0; + UpdateButtonDisabled(); + }; + SaveButton.OnPressed += _ => { if (!_entityManager.TryGetComponent<StationBankAccountComponent>(_station, out var bank)) return; - var accounts = bank.Accounts.Keys.OrderBy(p => p.Id).ToList(); + var accounts = EditableAccounts(bank).OrderBy(p => p.Key).Select(p => p.Key).ToList(); var dicts = new Dictionary<ProtoId<CargoAccountPrototype>, int>(); for (var i = 0; i< accounts.Count; i++) { dicts.Add(accounts[i], _spinBoxes[i].Value); } - OnSavePressed?.Invoke(dicts); + OnSavePressed?.Invoke(dicts, _primaryCut, _lockboxCut); SaveButton.Disabled = true; }; + _cfg.OnValueChanged(CCVars.AllowPrimaryAccountAllocation, enabled => { _allowPrimaryAccountAllocation = enabled; }, true); + _cfg.OnValueChanged(CCVars.AllowPrimaryCutAdjustment, enabled => { _allowPrimaryCutAdjustment = enabled; }, true); + _cfg.OnValueChanged(CCVars.LockboxCutEnabled, enabled => { _lockboxCutEnabled = enabled; }, true); + BuildEntries(); } + private IEnumerable<KeyValuePair<ProtoId<CargoAccountPrototype>, int>> EditableAccounts(StationBankAccountComponent bank) + { + foreach (var kvp in bank.Accounts) + { + if (_allowPrimaryAccountAllocation || kvp.Key != bank.PrimaryAccount) + { + yield return kvp; + } + } + } + private void BuildEntries() { if (!_entityManager.TryGetComponent<StationBankAccountComponent>(_station, out var bank)) return; - HelpLabel.Text = Loc.GetString("cargo-funding-alloc-console-label-help", - ("percent", (int) (bank.PrimaryCut * 100))); + + if (_allowPrimaryCutAdjustment) + { + HelpLabel.Text = Loc.GetString("cargo-funding-alloc-console-label-help-adjustible"); + } + else + { + HelpLabel.Text = Loc.GetString("cargo-funding-alloc-console-label-help-non-adjustible", + ("percent", (int) (bank.PrimaryCut * 100))); + } foreach (var ctrl in _addedControls) { @@ -69,7 +114,21 @@ public sealed partial class FundingAllocationMenu : FancyWindow _spinBoxes.Clear(); _balanceLabels.Clear(); - var accounts = bank.Accounts.ToList().OrderBy(p => p.Key); + _primaryCut = bank.PrimaryCut; + _lockboxCut = bank.LockboxCut; + + LockboxCut.OverrideValue(100 - (int)(_lockboxCut * 100)); + PrimaryCut.OverrideValue((int)(_primaryCut * 100)); + + LockboxCut.IsValid = val => val is >= 0 and <= 100; + PrimaryCut.IsValid = val => val is >= 0 and <= 100; + + LockboxCut.Visible = _lockboxCutEnabled; + LockboxCutLabel.Visible = _lockboxCutEnabled; + PrimaryCut.Visible = _allowPrimaryCutAdjustment; + PrimaryCutLabel.Visible = _allowPrimaryCutAdjustment; + + var accounts = EditableAccounts(bank).OrderBy(p => p.Key); foreach (var (account, balance) in accounts) { var accountProto = _prototypeManager.Index(account); @@ -127,7 +186,7 @@ public sealed partial class FundingAllocationMenu : FancyWindow var incorrectSum = sum != 100; var differs = false; - var accounts = bank.Accounts.Keys.OrderBy(p => p.Id).ToList(); + var accounts = EditableAccounts(bank).OrderBy(p => p.Key).Select(p => p.Key).ToList(); for (var i = 0; i < accounts.Count; i++) { var percent = _spinBoxes[i].Value; @@ -137,6 +196,7 @@ public sealed partial class FundingAllocationMenu : FancyWindow break; } } + differs = differs || _primaryCut != bank.PrimaryCut || _lockboxCut != bank.LockboxCut; SaveButton.Disabled = !differs || incorrectSum; diff --git a/Content.Server/Cargo/Systems/CargoSystem.Funds.cs b/Content.Server/Cargo/Systems/CargoSystem.Funds.cs index d64c467664..4a3fa5330e 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Funds.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Funds.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Shared.Cargo.Components; +using Content.Shared.CCVar; using Content.Shared.Database; using Content.Shared.Emag.Systems; using Content.Shared.IdentityManagement; @@ -9,12 +10,18 @@ namespace Content.Server.Cargo.Systems; public sealed partial class CargoSystem { + private bool _allowPrimaryAccountAllocation; + private bool _allowPrimaryCutAdjustment; + public void InitializeFunds() { SubscribeLocalEvent<CargoOrderConsoleComponent, CargoConsoleWithdrawFundsMessage>(OnWithdrawFunds); SubscribeLocalEvent<CargoOrderConsoleComponent, CargoConsoleToggleLimitMessage>(OnToggleLimit); SubscribeLocalEvent<FundingAllocationConsoleComponent, SetFundingAllocationBuiMessage>(OnSetFundingAllocation); SubscribeLocalEvent<FundingAllocationConsoleComponent, BeforeActivatableUIOpenEvent>(OnFundAllocationBuiOpen); + + _cfg.OnValueChanged(CCVars.AllowPrimaryAccountAllocation, enabled => { _allowPrimaryAccountAllocation = enabled; }, true); + _cfg.OnValueChanged(CCVars.AllowPrimaryCutAdjustment, enabled => { _allowPrimaryCutAdjustment = enabled; }, true); } private void OnWithdrawFunds(Entity<CargoOrderConsoleComponent> ent, ref CargoConsoleWithdrawFundsMessage args) @@ -102,7 +109,8 @@ public sealed partial class CargoSystem !TryComp<StationBankAccountComponent>(station, out var bank)) return; - if (args.Percents.Count != bank.RevenueDistribution.Count) + var expectedCount = _allowPrimaryAccountAllocation ? bank.RevenueDistribution.Count : bank.RevenueDistribution.Count - 1; + if (args.Percents.Count != expectedCount) return; var differs = false; @@ -114,6 +122,7 @@ public sealed partial class CargoSystem break; } } + differs = differs || args.PrimaryCut != bank.PrimaryCut || args.LockboxCut != bank.LockboxCut; if (!differs) return; @@ -121,18 +130,33 @@ public sealed partial class CargoSystem if (args.Percents.Values.Sum() != 100) return; + var primaryCut = bank.RevenueDistribution[bank.PrimaryAccount]; bank.RevenueDistribution.Clear(); foreach (var (account, percent )in args.Percents) { bank.RevenueDistribution.Add(account, percent / 100.0); } + if (!_allowPrimaryAccountAllocation) + { + bank.RevenueDistribution.Add(bank.PrimaryAccount, 0); + } + + if (_allowPrimaryCutAdjustment && args.PrimaryCut is >= 0.0 and <= 1.0) + { + bank.PrimaryCut = args.PrimaryCut; + } + if (_lockboxCutEnabled && args.LockboxCut is >= 0.0 and <= 1.0) + { + bank.LockboxCut = args.LockboxCut; + } + Dirty(station, bank); _audio.PlayPvs(ent.Comp.SetDistributionSound, ent); _adminLogger.Add( LogType.Action, LogImpact.Medium, - $"{ToPrettyString(args.Actor):player} set station {ToPrettyString(station)} fund distribution: {string.Join(',', bank.RevenueDistribution.Select(p => $"{p.Key}: {p.Value}").ToList())}"); + $"{ToPrettyString(args.Actor):player} set station {ToPrettyString(station)} fund distribution: {string.Join(',', bank.RevenueDistribution.Select(p => $"{p.Key}: {p.Value}").ToList())}, primary cut: {bank.PrimaryCut}, lockbox cut: {bank.LockboxCut}"); } private void OnFundAllocationBuiOpen(Entity<FundingAllocationConsoleComponent> ent, ref BeforeActivatableUIOpenEvent args) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index ce2642e1b6..2516965b6d 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -5,6 +5,7 @@ using Content.Shared.Cargo.BUI; using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Events; using Content.Shared.Cargo.Prototypes; +using Content.Shared.CCVar; using JetBrains.Annotations; using Robust.Shared.Audio; using Robust.Shared.Prototypes; @@ -18,6 +19,7 @@ public sealed partial class CargoSystem */ private static readonly SoundPathSpecifier ApproveSound = new("/Audio/Effects/Cargo/ping.ogg"); + private bool _lockboxCutEnabled; private void InitializeShuttle() { @@ -28,6 +30,8 @@ public sealed partial class CargoSystem SubscribeLocalEvent<CargoPalletConsoleComponent, CargoPalletSellMessage>(OnPalletSale); SubscribeLocalEvent<CargoPalletConsoleComponent, CargoPalletAppraiseMessage>(OnPalletAppraise); SubscribeLocalEvent<CargoPalletConsoleComponent, BoundUIOpenedEvent>(OnPalletUIOpen); + + _cfg.OnValueChanged(CCVars.LockboxCutEnabled, (enabled) => { _lockboxCutEnabled = enabled; }, true); } #region Console @@ -340,10 +344,11 @@ public sealed partial class CargoSystem Dictionary<ProtoId<CargoAccountPrototype>, double> distribution; if (sellComponent != null) { + var cut = _lockboxCutEnabled ? bankAccount.LockboxCut : bankAccount.PrimaryCut; distribution = new Dictionary<ProtoId<CargoAccountPrototype>, double> { - { sellComponent.OverrideAccount, sellComponent.OverrideCut }, - { bankAccount.PrimaryAccount, 1.0 - sellComponent.OverrideCut }, + { sellComponent.OverrideAccount, cut }, + { bankAccount.PrimaryAccount, 1.0 - cut }, }; } else diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs index d0ec138e4e..1b6f1973ea 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.cs @@ -10,12 +10,14 @@ using Content.Server.Radio.EntitySystems; using Content.Shared.Cargo; using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Prototypes; +using Content.Shared.CCVar; using Content.Shared.Containers.ItemSlots; using Content.Shared.Mobs.Components; using Content.Shared.Paper; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -23,6 +25,7 @@ namespace Content.Server.Cargo.Systems; public sealed partial class CargoSystem : SharedCargoSystem { + [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; diff --git a/Content.Shared/CCVar/CCVars.Cargo.cs b/Content.Shared/CCVar/CCVars.Cargo.cs new file mode 100644 index 0000000000..dd47bfbb76 --- /dev/null +++ b/Content.Shared/CCVar/CCVars.Cargo.cs @@ -0,0 +1,26 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.CCVar; + +public sealed partial class CCVars +{ + /// <summary> + /// Whether or not the primary account of a bank should be listed + /// in the funding allocation console + /// </summary> + public static readonly CVarDef<bool> AllowPrimaryAccountAllocation = + CVarDef.Create("cargo.allow_primary_account_allocation", false, CVar.REPLICATED); + + /// <summary> + /// Whether or not the primary cut of a bank should be manipulable + /// in the funding allocation console + /// </summary> + public static readonly CVarDef<bool> AllowPrimaryCutAdjustment = + CVarDef.Create("cargo.allow_primary_cut_adjustment", true, CVar.REPLICATED); + + /// <summary> + /// Whether or not the separate lockbox cut is enabled + /// </summary> + public static readonly CVarDef<bool> LockboxCutEnabled = + CVarDef.Create("cargo.enable_lockbox_cut", true, CVar.REPLICATED); +} diff --git a/Content.Shared/Cargo/Components/FundingAllocationConsoleComponent.cs b/Content.Shared/Cargo/Components/FundingAllocationConsoleComponent.cs index 65fd09a1b7..d4afd72309 100644 --- a/Content.Shared/Cargo/Components/FundingAllocationConsoleComponent.cs +++ b/Content.Shared/Cargo/Components/FundingAllocationConsoleComponent.cs @@ -24,10 +24,14 @@ public sealed partial class FundingAllocationConsoleComponent : Component public sealed class SetFundingAllocationBuiMessage : BoundUserInterfaceMessage { public Dictionary<ProtoId<CargoAccountPrototype>, int> Percents; + public double PrimaryCut; + public double LockboxCut; - public SetFundingAllocationBuiMessage(Dictionary<ProtoId<CargoAccountPrototype>, int> percents) + public SetFundingAllocationBuiMessage(Dictionary<ProtoId<CargoAccountPrototype>, int> percents, double primaryCut, double lockboxCut) { Percents = percents; + PrimaryCut = primaryCut; + LockboxCut = lockboxCut; } } diff --git a/Content.Shared/Cargo/Components/OverrideSellComponent.cs b/Content.Shared/Cargo/Components/OverrideSellComponent.cs index 13e72486ec..7d798c9ad1 100644 --- a/Content.Shared/Cargo/Components/OverrideSellComponent.cs +++ b/Content.Shared/Cargo/Components/OverrideSellComponent.cs @@ -14,10 +14,4 @@ public sealed partial class OverrideSellComponent : Component /// </summary> [DataField(required: true)] public ProtoId<CargoAccountPrototype> OverrideAccount; - - /// <summary> - /// The cut that the OverrideAccount will get from the price. The rest is given to the primary station account. - /// </summary> - [DataField] - public float OverrideCut = 0.75f; } diff --git a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs index a52f5ee61c..944f03cd72 100644 --- a/Content.Shared/Cargo/Components/StationBankAccountComponent.cs +++ b/Content.Shared/Cargo/Components/StationBankAccountComponent.cs @@ -23,6 +23,12 @@ public sealed partial class StationBankAccountComponent : Component [DataField, AutoNetworkedField] public double PrimaryCut = 0.50; + /// <summary> + /// When giving funds to a particular account from an override sell, the proportion of funds they should receive compared to remaining accounts. + /// </summary> + [DataField, AutoNetworkedField] + public double LockboxCut = 0.75; + /// <summary> /// A dictionary corresponding to the money held by each cargo account. /// </summary> diff --git a/Resources/Locale/en-US/cargo/cargo-console-component.ftl b/Resources/Locale/en-US/cargo/cargo-console-component.ftl index b7467771d9..22e75ae6dc 100644 --- a/Resources/Locale/en-US/cargo/cargo-console-component.ftl +++ b/Resources/Locale/en-US/cargo/cargo-console-component.ftl @@ -72,7 +72,11 @@ cargo-funding-alloc-console-label-code = [bold] Code [/bold] cargo-funding-alloc-console-label-balance = [bold] Balance [/bold] cargo-funding-alloc-console-label-cut = [bold] Revenue Division (%) [/bold] -cargo-funding-alloc-console-label-help = Cargo receives {$percent}% of all profits. The rest is split as specified below: +cargo-funding-alloc-console-label-primary-cut = Cargo's cut of funds from non-lockbox sources (%): +cargo-funding-alloc-console-label-lockbox-cut = Cargo's cut of funds from lockbox sales (%): + +cargo-funding-alloc-console-label-help-non-adjustible = Cargo receives {$percent}% of profits from non-lockbox sales. The rest is split as specified below: +cargo-funding-alloc-console-label-help-adjustible = Remaining funds from non-lockbox sources are distributed as specified below: cargo-funding-alloc-console-button-save = Save Changes cargo-funding-alloc-console-label-save-fail = [bold]Revenue Divisions Invalid![/bold] [color=red]({$pos -> [1] + From 44c8004cfe27189f9ad1bc7cca4f1a624e416b1a Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 12:36:01 +0000 Subject: [PATCH 529/622] Automatic changelog update --- Resources/Changelog/Admin.yml | 14 ++++++++++++++ Resources/Changelog/Changelog.yml | 19 +++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index c0e4a5c5d6..3eaf627d38 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1093,5 +1093,19 @@ Entries: id: 132 time: '2025-04-20T19:08:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36776 +- author: sowelipililimute + changes: + - message: The Funding Allocation Computer now has a CVar to enable configuring + the primary cut (off by default) + type: Add + - message: The Funding Allocation Computer now has a CVar to enable configuring + the lockbox cut (on by default) + type: Add + - message: The Funding Allocation Computer now has a CVar to enable hiding the primary + account from the funding splits (on by default) + type: Add + id: 133 + time: '2025-04-22T12:34:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36790 Name: Admin Order: 1 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index faa92cd462..4c87de07be 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: Mime PDA item interactions (insertions/ejections of IDs, pens, etc.) - are now silent. - type: Tweak - id: 7811 - time: '2025-01-15T18:03:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34426 - author: Alpaccalypse changes: - message: Smite soda vending machines have been added to the game. @@ -3914,3 +3906,14 @@ id: 8312 time: '2025-04-22T06:33:00.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36811 +- author: sowelipililimute + changes: + - message: The Funding Allocation Computer can now adjust the cut Cargo takes from + lockbox sales + type: Add + - message: The Funding Allocation Computer doesn't show Cargo separately from its + 75% cut + type: Tweak + id: 8313 + time: '2025-04-22T12:34:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36790 From ebf9f4a38e18513957c469b317105f55ba2498e2 Mon Sep 17 00:00:00 2001 From: godisdeadLOL <169250097+godisdeadLOL@users.noreply.github.com> Date: Tue, 22 Apr 2025 21:15:12 +0300 Subject: [PATCH 530/622] Fingerprint taking improvements (#31864) * now using event to check access to fingerprint * Opps actually commiting the changes --------- Co-authored-by: YourUsername <you@example.com> Co-authored-by: beck-thompson <beck314159@hotmail.com> --- .../Systems/FingerprintMaskSystem.cs | 24 +++++++++++++++++++ .../Forensics/Systems/ForensicPadSystem.cs | 11 +++++++-- .../Forensics/Systems/ForensicsSystem.cs | 23 ++++++++++++++---- Content.Shared/Forensics/Events.cs | 14 +++++++++++ .../Locale/en-US/forensics/forensics.ftl | 3 ++- 5 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 Content.Server/Forensics/Systems/FingerprintMaskSystem.cs diff --git a/Content.Server/Forensics/Systems/FingerprintMaskSystem.cs b/Content.Server/Forensics/Systems/FingerprintMaskSystem.cs new file mode 100644 index 0000000000..05008d1662 --- /dev/null +++ b/Content.Server/Forensics/Systems/FingerprintMaskSystem.cs @@ -0,0 +1,24 @@ +using Content.Shared.Forensics; +using Content.Shared.Forensics.Components; +using Content.Shared.Inventory; + +namespace Content.Server.Forensics; + +public sealed class FingerprintMaskSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<FingerprintMaskComponent, InventoryRelayedEvent<TryAccessFingerprintEvent>>(OnTryAccessFingerprint); + } + + private void OnTryAccessFingerprint(EntityUid uid, FingerprintMaskComponent comp, ref InventoryRelayedEvent<TryAccessFingerprintEvent> args) + { + if (args.Args.Cancelled) + return; + + args.Args.Blocker = uid; + args.Args.Cancel(); + } +} diff --git a/Content.Server/Forensics/Systems/ForensicPadSystem.cs b/Content.Server/Forensics/Systems/ForensicPadSystem.cs index 2841f36b00..d675950faa 100644 --- a/Content.Server/Forensics/Systems/ForensicPadSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicPadSystem.cs @@ -18,6 +18,8 @@ namespace Content.Server.Forensics [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly ForensicsSystem _forensics = default!; [Dependency] private readonly LabelSystem _label = default!; public override void Initialize() @@ -58,9 +60,14 @@ namespace Content.Server.Forensics return; } - if (_inventory.TryGetSlotEntity(args.Target.Value, "gloves", out var gloves)) + if (!_forensics.CanAccessFingerprint(args.Target.Value, out var blocker)) { - _popupSystem.PopupEntity(Loc.GetString("forensic-pad-gloves", ("target", Identity.Entity(args.Target.Value, EntityManager))), args.Target.Value, args.User); + + if (blocker is { } item) + _popupSystem.PopupEntity(Loc.GetString("forensic-pad-no-access-due", ("entity", Identity.Entity(item, EntityManager))), args.Target.Value, args.User); + else + _popupSystem.PopupEntity(Loc.GetString("forensic-pad-no-access"), args.Target.Value, args.User); + return; } diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index 66818855e5..2c75cc3b19 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -299,11 +299,9 @@ namespace Content.Server.Forensics { if (TryComp<FiberComponent>(gloves, out var fiber) && !string.IsNullOrEmpty(fiber.FiberMaterial)) component.Fibers.Add(string.IsNullOrEmpty(fiber.FiberColor) ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial))); - - if (HasComp<FingerprintMaskComponent>(gloves)) - return; } - if (TryComp<FingerprintComponent>(user, out var fingerprint)) + + if (TryComp<FingerprintComponent>(user, out var fingerprint) && CanAccessFingerprint(user, out _)) component.Fingerprints.Add(fingerprint.Fingerprint ?? ""); } @@ -364,6 +362,23 @@ namespace Content.Server.Forensics } } + /// <summary> + /// Checks if there's a way to access the fingerprint of the target entity. + /// </summary> + /// <param name="target">The entity with the fingerprint</param> + /// <param name="blocker">The entity that blocked accessing the fingerprint</param> + public bool CanAccessFingerprint(EntityUid target, out EntityUid? blocker) + { + var ev = new TryAccessFingerprintEvent(); + + RaiseLocalEvent(target, ev); + if (!ev.Cancelled && TryComp<InventoryComponent>(target, out var inv)) + _inventory.RelayEvent((target, inv), ev); + + blocker = ev.Blocker; + return !ev.Cancelled; + } + #endregion } } diff --git a/Content.Shared/Forensics/Events.cs b/Content.Shared/Forensics/Events.cs index 0506f48a3d..85494b37a0 100644 --- a/Content.Shared/Forensics/Events.cs +++ b/Content.Shared/Forensics/Events.cs @@ -1,4 +1,5 @@ using Content.Shared.DoAfter; +using Content.Shared.Inventory; using Robust.Shared.Serialization; namespace Content.Shared.Forensics; @@ -68,3 +69,16 @@ public record struct GenerateDnaEvent() /// </summary> public required string DNA; } + +/// <summary> +/// An event to check if the fingerprint is accessible. +/// </summary> +public sealed class TryAccessFingerprintEvent : CancellableEntityEventArgs, IInventoryRelayEvent +{ + SlotFlags IInventoryRelayEvent.TargetSlots => SlotFlags.WITHOUT_POCKET; + + /// <summary> + /// Entity that blocked access. + /// </summary> + public EntityUid? Blocker; +} diff --git a/Resources/Locale/en-US/forensics/forensics.ftl b/Resources/Locale/en-US/forensics/forensics.ftl index 80eea069fa..6eae96f27d 100644 --- a/Resources/Locale/en-US/forensics/forensics.ftl +++ b/Resources/Locale/en-US/forensics/forensics.ftl @@ -9,7 +9,8 @@ forensic-scanner-interface-clear = Clear forensic-scanner-report-title = Forensics Report: {$entity} forensic-pad-unused = It hasn't been used. forensic-pad-sample = It has a sample: {$sample} -forensic-pad-gloves = {CAPITALIZE($target)} is wearing gloves. +forensic-pad-no-access-due = Can't access the fingerprint due to {THE($entity)}. +forensic-pad-no-access = Can't access the fingerprint. forensic-pad-start-scan-target = {CAPITALIZE($user)} is trying to take a sample of your fingerprints. forensic-pad-start-scan-user = You start taking a sample of {CAPITALIZE($target)}'s fingerprints. forensic-pad-already-used = This pad has already been used. From b8a894bfd18ccee9b811a90c0abfc700a4fca22c Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Tue, 22 Apr 2025 14:15:39 -0400 Subject: [PATCH 531/622] Banana cream pie loc improvements (#36829) * CAPITALIZE(THE($owner)) * Rename "thrower" to "thrown"; use THE($thrown) * "the banana cream pie" -> "a banana cream pie" * Simplify filter --- .../Nutrition/EntitySystems/CreamPieSystem.cs | 11 ++++------- .../nutrition/components/cream-pied-component.ftl | 4 ++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs index 108280f088..200554faa3 100644 --- a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs @@ -94,17 +94,14 @@ namespace Content.Server.Nutrition.EntitySystems protected override void CreamedEntity(EntityUid uid, CreamPiedComponent creamPied, ThrowHitByEvent args) { _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message", - ("thrower", Identity.Entity(args.Thrown, EntityManager))), + ("thrown", Identity.Entity(args.Thrown, EntityManager))), uid, args.Target); - var otherPlayers = Filter.Empty().AddPlayersByPvs(uid); - if (TryComp<ActorComponent>(args.Target, out var actor)) - { - otherPlayers.RemovePlayer(actor.PlayerSession); - } + var otherPlayers = Filter.PvsExcept(uid); + _popup.PopupEntity(Loc.GetString("cream-pied-component-on-hit-by-message-others", ("owner", Identity.Entity(uid, EntityManager)), - ("thrower", Identity.Entity(args.Thrown, EntityManager))), + ("thrown", Identity.Entity(args.Thrown, EntityManager))), uid, otherPlayers, false); } diff --git a/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl b/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl index a75f163adb..5df241440f 100644 --- a/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl +++ b/Resources/Locale/en-US/nutrition/components/cream-pied-component.ftl @@ -1,2 +1,2 @@ -cream-pied-component-on-hit-by-message = You have been creamed by {$thrower}! -cream-pied-component-on-hit-by-message-others = {$owner} has been creamed by {$thrower}! +cream-pied-component-on-hit-by-message = You have been creamed by {INDEFINITE($thrown)} {$thrown}! +cream-pied-component-on-hit-by-message-others = {CAPITALIZE(THE($owner))} has been creamed by {INDEFINITE($thrown)} {$thrown}! From 9f49404e70ed0a14d6f1c00a5bbc91898e5d6c60 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 18:16:20 +0000 Subject: [PATCH 532/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4c87de07be..1e276f26bf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Alpaccalypse - changes: - - message: Smite soda vending machines have been added to the game. - type: Add - id: 7812 - time: '2025-01-15T18:20:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34420 - author: kosticia changes: - message: Bedsheets now can be printed on uniform printer @@ -3917,3 +3910,10 @@ id: 8313 time: '2025-04-22T12:34:53.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36790 +- author: yuitop + changes: + - message: Fingerless gloves no more blocking taking the fingerprint. + type: Tweak + id: 8314 + time: '2025-04-22T18:15:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31864 From 106a31410f52580381fa693d4f318ff256ce7a56 Mon Sep 17 00:00:00 2001 From: Golden Can <greentopcan@gmail.com> Date: Tue, 22 Apr 2025 20:35:43 +0200 Subject: [PATCH 533/622] Command uniform (#32103) * Added generic command jumpskirt, jumpsuit and cap, and made them available in the HoP's clothing printer. * fixed generic command jumpskirt and jumpsuit. * Updated generic command jumpskirt/-suit textures, added generic command beret. * Fixed game-breaking bug in previous commit relating to the command beret. * altered generic command soft cap/baseball cap sprites. * Update Resources/Prototypes/Entities/Clothing/Head/hats.yml Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> * Update Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> * Update Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> * review * whoopsie --------- Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: Milon <milonpl.git@proton.me> --- .../Entities/Clothing/Head/hats.yml | 16 ++++++ .../Entities/Clothing/Head/soft.yml | 16 ++++++ .../Entities/Clothing/Uniforms/jumpskirts.yml | 11 ++++ .../Entities/Clothing/Uniforms/jumpsuits.yml | 11 ++++ .../Recipes/Lathes/Packs/clothing.yml | 5 ++ .../Prototypes/Recipes/Lathes/clothing.yml | 24 ++++++++- .../equipped-HELMET-hamster.png | Bin 0 -> 10836 bytes .../beret_command.rsi/equipped-HELMET.png | Bin 0 -> 6775 bytes .../Head/Hats/beret_command.rsi/icon.png | Bin 0 -> 5560 bytes .../Hats/beret_command.rsi/inhand-left.png | Bin 0 -> 6100 bytes .../Hats/beret_command.rsi/inhand-right.png | Bin 0 -> 6061 bytes .../Head/Hats/beret_command.rsi/meta.json | 30 +++++++++++ .../equipped-HELMET-hamster.png | Bin 0 -> 10705 bytes .../Soft/commandsoft.rsi/equipped-HELMET.png | Bin 0 -> 6149 bytes .../flipped-equipped-HELMET-hamster.png | Bin 0 -> 6199 bytes .../flipped-equipped-HELMET.png | Bin 0 -> 6104 bytes .../commandsoft.rsi/flipped-inhand-left.png | Bin 0 -> 5915 bytes .../commandsoft.rsi/flipped-inhand-right.png | Bin 0 -> 5953 bytes .../Head/Soft/commandsoft.rsi/icon.png | Bin 0 -> 5852 bytes .../Soft/commandsoft.rsi/icon_flipped.png | Bin 0 -> 5881 bytes .../Head/Soft/commandsoft.rsi/inhand-left.png | Bin 0 -> 5929 bytes .../Soft/commandsoft.rsi/inhand-right.png | Bin 0 -> 5921 bytes .../Head/Soft/commandsoft.rsi/meta.json | 49 ++++++++++++++++++ .../equipped-INNERCLOTHING-monkey.png | Bin 0 -> 12675 bytes .../equipped-INNERCLOTHING.png | Bin 0 -> 10021 bytes .../Jumpskirt/commandgeneric.rsi/icon.png | Bin 0 -> 6584 bytes .../commandgeneric.rsi/inhand-left.png | Bin 0 -> 12508 bytes .../commandgeneric.rsi/inhand-right.png | Bin 0 -> 12567 bytes .../Jumpskirt/commandgeneric.rsi/meta.json | 30 +++++++++++ .../equipped-INNERCLOTHING-monkey.png | Bin 0 -> 12051 bytes .../equipped-INNERCLOTHING.png | Bin 0 -> 15180 bytes .../Jumpsuit/commandgeneric.rsi/icon.png | Bin 0 -> 6932 bytes .../commandgeneric.rsi/inhand-left.png | Bin 0 -> 12508 bytes .../commandgeneric.rsi/inhand-right.png | Bin 0 -> 12567 bytes .../Jumpsuit/commandgeneric.rsi/meta.json | 30 +++++++++++ 35 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/Head/Hats/beret_command.rsi/equipped-HELMET-hamster.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beret_command.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beret_command.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beret_command.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beret_command.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/beret_command.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/equipped-HELMET-hamster.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-equipped-HELMET-hamster.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/icon_flipped.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/equipped-INNERCLOTHING-monkey.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/equipped-INNERCLOTHING-monkey.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/meta.json diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index b665708eba..260a1c385f 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -192,6 +192,22 @@ - type: Clothing sprite: Clothing/Head/Hats/beret_merc.rsi +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatBeretCommand + name: command beret + description: A beret with a Command insignia emblazoned on it. It has an aura of authority. + components: + - type: Sprite + sprite: Clothing/Head/Hats/beret_command.rsi + - type: Clothing + sprite: Clothing/Head/Hats/beret_command.rsi + - type: Tag + tags: + - ClothMade + - HamsterWearable + - WhitelistChameleon + - type: entity parent: ClothingHeadBase id: ClothingHeadHatBowlerHat diff --git a/Resources/Prototypes/Entities/Clothing/Head/soft.yml b/Resources/Prototypes/Entities/Clothing/Head/soft.yml index d2eec63232..db50463978 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/soft.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/soft.yml @@ -99,6 +99,22 @@ id: ClothingHeadHatQMsoftFlipped name: quartermaster's cap +- type: entity + parent: ClothingHeadHeadHatBaseFlippable + id: ClothingHeadHatCommandSoft + name: command cap + description: It's a baseball hat painted in Command colours. + components: + - type: Sprite + sprite: Clothing/Head/Soft/commandsoft.rsi + - type: Clothing + sprite: Clothing/Head/Soft/commandsoft.rsi + +- type: entity + parent: [ ClothingHeadHeadHatBaseFlipped, ClothingHeadHatCommandSoft ] + id: ClothingHeadHatCommandSoftFlipped + name: command cap + - type: entity parent: ClothingHeadHeadHatBaseFlippable id: ClothingHeadHatCorpsoft diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index 13f8cc5767..8fd5b5a831 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -221,6 +221,17 @@ - type: Clothing sprite: Clothing/Uniforms/Jumpskirt/hos_parade.rsi +- type: entity + parent: [ClothingUniformSkirtBase, BaseCommandContraband] + id: ClothingUniformJumpskirtCommandGeneric + name: command jumpskirt + description: A generic Command-colored jumpsuit not associated with any particular department. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/commandgeneric.rsi + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/commandgeneric.rsi + - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtHydroponics diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml index 3ecfad5f39..0caa9c6c1d 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml @@ -396,6 +396,17 @@ - type: Clothing sprite: Clothing/Uniforms/Jumpsuit/hos_parade.rsi +- type: entity + parent: [ ClothingUniformBase, BaseCommandContraband ] + id: ClothingUniformJumpsuitCommandGeneric + name: command jumpsuit + description: A generic Command-colored jumpsuit not associated with any particular department. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/commandgeneric.rsi + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/commandgeneric.rsi + - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitHydroponics diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml b/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml index 728082036e..aa95781729 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml @@ -35,6 +35,11 @@ - ClothingHeadHatHopcap - ClothingUniformJumpsuitHoP - ClothingUniformJumpskirtHoP + # Generic + - ClothingHeadHatBeretCommand + - ClothingHeadHatCommandSoft + - ClothingUniformJumpskirtCommandGeneric + - ClothingUniformJumpsuitCommandGeneric - type: latheRecipePack id: ClothingEngineering diff --git a/Resources/Prototypes/Recipes/Lathes/clothing.yml b/Resources/Prototypes/Recipes/Lathes/clothing.yml index 4558809e94..c5f81153e2 100644 --- a/Resources/Prototypes/Recipes/Lathes/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/clothing.yml @@ -82,7 +82,7 @@ parent: BaseJumpsuitRecipe id: ClothingUniformJumpskirtColorGrey result: ClothingUniformJumpskirtColorGrey - + - type: latheRecipe parent: BaseJumpsuitRecipe id: ClothingUniformJumpsuitLoungewear @@ -245,6 +245,18 @@ id: ClothingUniformJumpskirtCMOTurtle result: ClothingUniformJumpskirtCMOTurtle +## Command (Generic) + +- type: latheRecipe + parent: BaseCommandJumpsuitRecipe + id: ClothingUniformJumpsuitCommandGeneric + result: ClothingUniformJumpsuitCommandGeneric + +- type: latheRecipe + parent: BaseCommandJumpsuitRecipe + id: ClothingUniformJumpskirtCommandGeneric + result: ClothingUniformJumpskirtCommandGeneric + ## Detective - type: latheRecipe @@ -823,6 +835,16 @@ id: ClothingHeadHatBeretCmo result: ClothingHeadHatBeretCmo +- type: latheRecipe + parent: BaseCommandHatRecipe + id: ClothingHeadHatBeretCommand + result: ClothingHeadHatBeretCommand + +- type: latheRecipe + parent: BaseCommandHatRecipe + id: ClothingHeadHatCommandSoft + result: ClothingHeadHatCommandSoft + # Non-command hats - type: latheRecipe diff --git a/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/equipped-HELMET-hamster.png b/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/equipped-HELMET-hamster.png new file mode 100644 index 0000000000000000000000000000000000000000..776465d408ca6c6a3377d7fa5a1d5d5a1dbfc31d GIT binary patch literal 10836 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 WqI%t|I_0Yy@bMhsk?r=)cmDx7ic)_7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..1daddef9a1b0c2c5205fbd71c148c0c2ffacb3ba GIT binary patch literal 6775 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 BSv&v$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e062cbf890dfb705d950c0a7f60f5885f76bb0 GIT binary patch literal 5560 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 GCjCDL<8yfc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5394ff75cc7b33bb8f7738cbecf74548c4b66301 GIT binary patch literal 6100 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 ZEK(aU@}3AQ-r*_3c6Ic0sI*_V?LSZ=S7HDF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..aff7da3196118a576d0babbdf2103b7772d4996f GIT binary patch literal 6061 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/meta.json new file mode 100644 index 0000000000..df45fd1c6e --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/beret_command.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by GoldenCan(github) by modifying beret_engineering.rsi which was taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-hamster", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/equipped-HELMET-hamster.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/equipped-HELMET-hamster.png new file mode 100644 index 0000000000000000000000000000000000000000..02c11333d054350b5fcc23130569e7ca6032c3ec GIT binary patch literal 10705 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 E4?k_jl>h($ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..313c637d9a88ef0958f2eff2d591260b111ec2b6 GIT binary patch literal 6149 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 Ok&A;Hy==wC#D4>7FmK-g literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-equipped-HELMET-hamster.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-equipped-HELMET-hamster.png new file mode 100644 index 0000000000000000000000000000000000000000..b1da595e5cd73273786265425022f1513ed2ca07 GIT binary patch literal 6199 zcmeHLcT^MU77ywI(!@nU#S)?jg6RoiA_0-Egx*nLGMR)RDI}o?QY@^fpcG-HtgbW_ zL>CkUfkkYnxJZ#If{UWqKy0X}ya`y(d*{64d2jzS=S*himfv^p@80j5Z)T^HgN>@v z0woj*rD|tu>4KbB%ML|(<iCg)(uYFHpN@3%lDdH5XpvaR;RVBJ=_V13h9h_!6e^<U z$*&ty2al=#GU9EO5fHOI0EqkDVAbVk&*P#U3Zo()uH%Z+ZghpJC_p+d)<(u>PrM!% z$KFv|khU&Yw=)NS+|5-r$)Rev__xD#t(y)QGETgn0DEiwXZ(WU*Gy!*yB3=?embt2 z_u{UCIc$P|+o1K*TW6o+)&uba9s13sHcrtqE{f`&?u`o*KDt^ywAXj&x!_58ns}l& z#*$Iizs7XJao0=xd5JpLhVEP>UlJLrkKwDjhTINpvD06u935-D?5&N4%Cq#}`aG@j zs7v%?4!n>{55FGE7&gsIKS$P$A&Fy7`|nwW_s<jCPvlMPJFI28=l;pkk`}#3BmF)e z9o^*Wz!lKLcfk+K)7v0F?#^0iNW!&WpJ`YQRT+lY7b_g;rXFu%Y<?+Mnc>*C`FZ2@ zHZ?ORV*G=xtuw*x5%TM9IGs<>t~({HOUPfKO0ig|@M_L^U#-}Tl1>q~{M^-hnF~zL zy$g#U=^L(Ia;)5<e!RGbAMd9V4CP(27MNwqV`3QA>Co-Y_iuVCt=0GO2Nz-Ho`2<Q zsWoxJUVT<`%FZ=WJ9c|U%?Q9`Xzm-GJ!AD>HlyAC3${k?)lo)K-SpztD9GV|R?)TC zMcl@m8O1YojxCg*sj}*l9S5yLwE0OpSLF|vpWoTI*6+x&w8NxY71*X{Kn~vGrmS$6 z;007*?q5Ydr-BSi^D(+w*n%6aK}S;ZS5Q4m3OafgY&2R%`%_>aSh8br)Wd<u;huFT zYE^r=`8rEyErM^ftn{Kh+X1^8dXzBDLJBequbG5qcyoO#dv*y5bPe$v;P&>uBaA;j zNMol{Cw|vdbBW6R(;0Gmse5ijiqR&clyRHXJ5}Y>78!9oM_0rr^<H{hwB<;0TxuDS zTsM1qJtaDM(7&rnwDe5MIJP&Za8_mf#2n!Cq4DKnvpcWm237C^7hV|F@3pSQv^0!+ z`{?u2ZaJ2Wx9=XQm?+-L*?ZKd83-<FioZy4e6;)SuASxH@o1Zyc%O=LCCQNTl4+gm z|2&cDk+n{I&||Ec(v(>7On$L&yC^Q|Ot%I}{pW;Q6$0r_t6ygSQnY~xU$wG~l~Z=F z$AHh9BL@fi-=Z`OKC67$(w>M4%y@gP7?ZxUb__n$IVh<v>~G43n>35sdA?qnqjoj+ zzs|2}T9W$=?;`|8UVD3t?{DnL;VjZhj5)JMu4|h+pm{c~@npy24EL<A#52~vwR1-D zF3fK&nr+2R_PQ=u*}BqenN6u~64UwmzK+c-{298u$7+M^VFJeNxf|GJZfV*yGsU68 z;vnyP_ipeTw0sJ*Q}!O(sknX18vl?aFKg>qd+f=8zue>gxNm&5+h%?JijXQISy$mg zS=mANOX;gt9C?)~m2SV5XEAMbf!ouPpre8FYV#KT-D?Qkgv{n{D>{Ger=gHk`P@T` z!gF+7UY6g<?mXc;=Be?a)<{L~vHcba)V6BZi}{zGcgq<~_lZ88e1BT<u%v!4kF7ge zNX$yzx1-zs_<lE$pEKhD=kH>hUj~hO{2cZxlAb=XS{-+={`$@0W#$!!Pd568oM;-U zh@J6%_KOLFgd(n%VjJd-Ytq@5@=4xtzWVjcl6$C!`=qJYo~;i#X}@>=L;W0_{1Rtk zWnUwczoX0eUd|kA%-!4P=AU{DrPe*ZB99d*?o11{8_m;usGg8Iv_vhFeR=tf;Jc4z z&bpKyzO`QitrW3kZK3m%{m#2m&Yy&pygRZ}k7|YYsR!AX#SCor)%mmPq)U1BrV*1F zjf)w@J63ADyDS`$P7rTan|j>zPHLaC_G*&1zPC;ZZeIw$XNYPsvh=ObZ3`8PCv%PD z&bGV7cs1c0LKNB#shKFGS!f0aRv2VP$Jn8k)m$+>GV|z`lGQb)H}0b4_eb`IHq6V2 z@y<LoGx)J`KttCmZ4bGt(|wOMuBhg%p$n25=UBCz)!wzX75kHQuI5FBV~HI$8mT3! z?Og$<PEqs2e)(V>mR;hQb@)g^3}1UhHCTIz^7N|G^DYwkgTUJj8;-edSbxYu(eIeM zLgPhC*ddy+rg()*!99ModfExbF|FDM`_s;4C*R^)3!)<*Bn{Y>ICGo@(yOA&R_2~I zg_~Emq!KQ4U1-z7^&NVAreteu;`5pLd#}}$j?H;|wlSr~ui}y6t@6b|bDI{w$-3yW zsM&;?ZWX%YL)QYTx-;!)#p-SP%~+bx{ddOWrj*;hZnPYOBX7A?rFUyS<gV}huqx-h zP4g1-x}^aJNk!v&O~Xv#vbJJ76iP0hXJO%FXJPT_5r#ata-vfhw&zzbyy)*+V34kc z#SA1LqL-r$2K3!mZjEpC2yCyv+lmitP0p`0RyzKZf|+Kq8m{RKy;5oGZH0uB+tPA( z?|WUB-;BAm?M_Th^;l(;LPWNE;XH;$Ty9n*eYTePjeGsXt{4@a1pPG_@+mflsN6Xk zI%}5y2+O4LeeXfY2{%vWsp18ReH(K?bs&@JdZ)&5AqRF|ZmPHEq11f9=J-0bx)5CV z<H1ajk$pf<O+&c=mvLr)dT4w^mNCZAU@%Ie)|hkJ*sz_xu|KVj;N;{<T7MYWH6tV0 zQfb<<8_wo)m$Ob4<<GNii|M^+#u|6Mn|j$@ZfV1`ASZNB%u}=1w@RFIvZSfgLVh2+ zSY~<&HGyjm^6D5Xh07gK{bW%=*t_!OgmJsbygaKtakq^`A-7uc8Mnm>^I}>pH=NR4 z!W5P&)*Ni14Q^@168^aNqNA_j!Sv*U;~B!ZZ59DFmfeqVBg2n|pY)TTe278i4~nbn zn>BM#C^dH;vZwH3+S4H+9|y99EEpHT7a@BN6w1UbLIgq^VJVsgb9n*=W~90fgXXar z7*8sbz!X`)fjrwtG3*-Y;08r*ga9_i%v8xFf{p<2VJV1?;0FsN^auuK5|@r#%fxsL zdeTI?k%94II-xCuVi--qQE&vTRRk}LgfUe@n~2#Qx{IatM+oGOfeDmKMRYtqJUkp1 zPR0qvTs#o~06c+&Cy}s-1y-_2AO$0^0?ASt#1w`lEP=#4k(4JCpk<gKOBgC;U@(Xt z{V6`ah{^m6FOYm>0pSB50gCWM90AYg<G=QhNUg#UkdFcVM-Pb`vNglIz!G7o7=o?B zV1ab$*AQ&zv%e@*96Xs08^XiEFds3MAfpn$8Pdj%>Gat{Mgf<{7fpI0WPf8R<#E1{ z^-XLt&15=X2ZFeN#{I_nQ|^<-h!vAbw-iF5vheII85r64bhZ%UvFVeS6c{8ENgN1k zYy=u%DI_B{mSqIcup9`W03eG4KosyRC_8~f3JM@t28Dp*cnA)_rot>TK*Cau31lpV zVobyu6Cnu8q7Z3h5<q|`EY4RDj$$6tm0<AKQOTg#2$V4l091%&ge4o3kZ6b?4GWS1 z5KDq+5WwNk03ww&3B`u!)<Q8KM9RtIgIpLd5^yIKGQ#QRPIe3o2}k%MaS8^d9K->c z13Up+7%usua^vw~S1BmtlSm`c2qdIEi8KNk0BB!~JYcZ|=|veTk$@wUCN;9c(2;Zy zYC&12A^?+eBpbSg7zU+6v71mB%)rQkLd!fqtC`4zVuMo95|qLSD1k(w6977i<VG~6 z69GDvXh<N@318U@**wms|7I<lK4_DvqTBK$$oQKkMN@Oi6%LuYo4O6=O-?2>dU9IO zL1-!k2^a>mC*wr0rc_WMDB!}#`th-0KgoIjp&1Bd2!tpE7)yd-3YJ3Skg*^Du(3#4 z*=!bp#v&NO-=a%|9BDWxhRwMMj|f*tgHCdV*8f<l72n#22g0&CAe3PV0G3E_BN1hk zk&Q6;e?C2$5d=|;SRmGz%7U>J764&EiZOsCA#;F01vy3_Fx3N}$@|~Z`>G>8rDuYd zEr_3rX@dW^a!(n2wSpqFOv#Xy8CmG@pI7>id?B&^lfRE`_D>FhM*kS(yZHS<*AKeB zi-GSl{?T1O==v@OzRUPWcm3b!Qu^|)2n&!6UO4h5c&4g*8}b$@&st|=iJYxaknhn8 z70A_0k*&7`g;Lg#9df9woOy^)L2AdeQW%=4sjfjztnAr|d@Gn`XKC(+eAn)&3p(dC zr(x88ZKqnRuG@|^w7=gf;_7eFhMH-ChlGE3wbcK`by`25J+$z0zy&M%3%OSFme<0| zIy)2kug?)&e*at4m9RZCP^jT_?%Sg0DF==vjr+mwTKh*b&pi^hN}}s39P*bH-TPUo zDVCyD=5YM&qo!=LqFR#&;cxV4PqN0Y#L5*L_eZu=0D>XX?i8TE4J$S`n0Wcr<zCuN z6J;d&sh^W-l-ZN@d;JXRto%gBqgUs)_nD0K(V{l1wzl4%QFc<Ud%ay&d||J`x<$LM zzkd3(;X1r3t-5%{;myzGaJITfN3mCCIri&0S4pP*`szS@P~xkXEd~lx*rF?D&Q6{J TZj0DSCa|+|uspsdVC%mCzj~P_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..b35ef1002f0d8507cf2924b4ad22febecc65876c GIT binary patch literal 6104 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 Td6>D%3X!wJYF3fmhJ^nBi<e-j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-inhand-left.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..98f6144b97ffc9e58b786fcb8cbbc32fd8bbeba6 GIT binary patch literal 5915 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-inhand-right.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/flipped-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e8c8553a69ebec9e02d3473d6f80ce52fff8ec GIT binary patch literal 5953 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 TpT4`fP>sNHbayDS3)%QD?MoRH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/icon.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b82f02a745f7d992d8d077258ad219fbb0207c73 GIT binary patch literal 5852 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 X`vLm*HZ(0j^TYW2&S4dMN2UB1?tI{H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/icon_flipped.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/icon_flipped.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c9703ee6625dff9ca2ea8828fc6df64e084e26 GIT binary patch literal 5881 zcmeHKcT^MU79RmA0Wpdzte}Q~N^#N)i3w7IfDnm*hzi0anLvaTlK=r(Ttt+$uqaq4 zt5{GM1shnXVntndQ9z0yh=2tVS5ZVo-UO`Yy>s62ytn_Eb0#x$%kR7Qckg#+<`>=q z_i?BxC;$M)d3tbskuyef=<6c?%DA|G02sR`&OcD)3&mjM3Ykb831d{Tau@@v#UcPu zH}@`Ha;lT2Kh$7%LdS3|`ua`aflzNrLSf|M@&rF-{or-++YIXnr*m+A=jx#!AB|^S zT<SMLQon-zY?A%FsY%g6K6CHHXPjhDFWK>INb1No)%V-9>*!wreM7$vzO$A`O|=?K z<Yf<>S67C19cXhzm*6{Y-0bGJu6;7|q6+NHcB;I{%%=`5TzhYE<+QCuJv*W=#QpLf z^Zf5po1)V?>E4|=gHG4IO|{Eb&scfoT+KvUA|y2nD}2Ce&2h2}dGu(|%wfZg6@!Y} zIsUu$y?Yt|CM96cD#O)0#ZRw7{yaE4WS=7c{rYULQuqD@$2WUS-KQ5-uAXrCk}Y}v z!#tPzmy;h`USpiENVI=d4<;6)vVNe|)$}zyqXoXyS<$oe%DFiwVXdGoUdzuus7`oA z_Bj?<ZDOm-Nq?Oac|=Hwy}$TXcG9FnxLi+`PorUN`i}VJ5m&q)NXF5RZYs!do-OlJ zzvLdBmeN?5_TuKQ60H!<vZhdh)#+uC+E|7(@7nL}SKj{JbcTe^DCp|N>Rw9ScroqW zWP{f_S;rUFggo6E)vA+=4FW@FlF`75%oz>wHe0%l+-N{u71JU`7hR1lI%oYuH!5;U z@8Ol47iYJvCHzMCHB{GH=Y8He-2}a3^CvX^x?R`&@p)g){tfd@(wCpzZdV*oFvlhu z20h&l=hLXYo0o}it*E`7RV)>5%C!yP7Gy5zJ99Egaph6!xbpE+Sl7}hk85tO+w2HA zp7hR)dK_6R3Mo=sCLAeI6~l*DMep2dYI?NrZcCY-H|XGI@XM4b;OsXh#pbtt`V0?s znNyitn$2JSGDWm#y7hD8Stp3vp&9daJ4!5ncCNkrB>e28=4#0w##ZWN^v;aUP1nqc zm_SxKCn0plLl>3Rz;3zM(!2NORc;7st|?Dx32Uivk@Qk1J{NKLmicV6yX&K5zb$RM z`qXcC#WHpAF!v#S&#=KB;{1?SbZGmZhpiio!;<ElU)2yawqokmOTh+~s@EM&Y33XY zN|}X2x7+jL0!&+vjdR^CUvsaw=-F|<<%wPw7~LZpOUQPAbycwP2g-kl37p5h(e5HR z5<Z3e!s9jiozdOt2k+c(v2}W8lsUY#u|IuWMY#UB=dFcJ3i<Y%FO0=0zoYY#re<rw zN27nsPuUb2x8ub0H$jhqeFD!uiLLKM)Qq4p!KI7pyt~Pgvkie20S31dI*9hA<@)d& zJ#p^A4JTrqEIM_%S|ntfIk#8ynZf6^?uL@5TG%Ag-kB(w+<o{vgh>th`8Hrx+z$QU zt<c8?vUW_cO`YhmNU3T>Hv`q(9wAP1dajOn?`S)}QZ`9F@TfGIegFzsa$t6AK-1b) ze>iQ^dBsE7JV$LR?C<BTAE3Rh6U6O0`Sj!|pS|cCsdcJmRz~9kPJNMGD8**%slQly zZ#^QGD|~C3PxSD598d<u0mhc@C$vu8HdWk7+d27KM7yG9?}W0T#`M}F$9jKs+W*x0 zO#W;?2jBw1VhOtGq|p(eG+9EqWE&rtY*~M%k;mP(h2?W#<CT@EytkEi55|}n#choC zoo046#^x#@jLsNu^P(!S>W#R#oKdqb)lO*SWg^=A{9H-SUQ5!sSGrpnY3EXl4P+K& zxv7~$MeZ0P8g8dX{Lx)gR#3MOAZ;>_f7HmsO&VUHtv_eO_ApF1zO?%EknPh0<<$X+ zj8%sZWwwt8tfC4`m)Ga&UY$u+G-#)x{=9HooSV>u-n;zxoz{!Z*?IPMCA$c8VPWv5 z&1Lt4U1RCHT^1ThhSxplw?97pR3px^d~8eA^P)+2`shz63zC?o#=*yK4n_lxX;X(= zr)A?)^{h4?8+2*STFd0GbFUOmK6GzZ!uzP*%h}JeYw#~$YnRR*8n^de;zloKEE@pE zB#T{Ld7iGWABQzEqH})Q!uGh}WN|5ES)ScCV-VYswuf1avFor|G<!|*t$^_Qs?J;Z z@LOs7&p4n8$Lh_UeApQGX9@ERYE8Rd%E_eky&E%LSMIODUQW87P*yr{W|f{gd(i<i zw#m<Xv*MT&OcjHRs)jct7+I#+xM0aeLJ`rh;qR#N<3sxRtm{K9y9GR)nb9--i%RcW zZpXNeOs?PkG9L>Oyl|%DtklOU=MMKmFXPIUxTYsvnGidB*DPZb!#v#flAYV4lGRxb zSbMv!RZ8RQIj0@$>zNU4>6HW?Z!sz8AY+5h_B0Mk%ero%^A9umMfv;9JZckKF3sh? z_3PYPy=aWp6|EIKOmo7sxvyIb7UpEBwrZ`+9k_JD@iH)st633vd*C=+yZ~q;%k!e& z70)ER^^DuM&n@-mcA9);>&^Y_c7>i<!Yxj4(TwR_*>U}{-8bo7i8UbMSa<*JyH_4* zr{xuHm;IdN8d}C_>cRCr?RnbUM(%x|0POEllvdSD&H(`9MPlUX8OZf!3S<%-B$V-C zoLVABo~{7EnyZ#Wf(TfJ;lp8KDI42YT8YJog>39%Dwn{OyTajOk2nSF7q`G)5Emg} z2(fb=Q7knR0g%8d2&0xnN|j7C8#{u_M6NYrJQg!zqKaT+1Gzkmt4sl7C^!m^0J^Eg z(Il)R3d2$eMND7Lybln_9UB|2QpuTkd`wIXE{2SgDZ=nX27`eoknkiDh**HiSg8t9 zgHolH24WP011kjzv0NpVNiiBsh%bv$v9VZ0kNFs%M9$@Yf|n{kuz>J^S3`0<5l6sF zB=|2qlq$Dq1mr_N|ItI~kGzE7ePN|6N+E#VqG74Z>PrZr;FG^RN)b7dj!=MyBVh?* zszg>Lezl~#CztohLqkEBSRx<sLdgEgQY99BChM!%G@6lgz6=C$|AhOM^~c;tj1em? zm&uU{qBP-oa@bhS`b?orAQm!5F6lxdodH2~km5k0f)o)<0{L{Z0Hg|uLMlvRP=q4r z3n)*iQUyr`um%bN$B7XfJ{2M{AR-kcQ27W1LnHwC0*VMEK_oJTK_NgC2f-H*J_<3? zl~ClDQE8xr2$YCVAP^u16{Pcp0+2!@&_O<hCIE>J4rC&g3c(B_aRf>zV9t{%BoI<g zu>=Z(@p5U{h(bd+)0yYV#*%P^&k|lFq!J+x$Q}?&g|ZmsXO+KL0{f{T4WC3hiB2F9 z=`=Ex<UprWKN|(W3MJBu8dM?yM<$JEG=*Uz=^)fXnodOkM&w8~OjiXAsbmU&nJkix z)dYpncz#lIkqsq;R1gPJ!3ZdUL}3ybOcKeT=)fe>m;{nNfy5+yVJ{PkMX~?QTC;sH ztkI%-h?U6tu_L0<J>>_l9K9R8jTDb;CJbg|TQDKPXbMUw8WxVkiC~SY1mTc03`XY1 zhlc$q7ypN5APOiBd@`L33K#+cNTKsZAfHAPf>flPXbiH5Ohd-aR|_j;B2^5efStn- z9ucmP1|8uFWAmX@wqM)Fgu|LTAe4aw21q3MlZZ?rLKX#!|L4;aLINU{2*V&uBO>V` zNr4cRNCWu}Br2Z{ktlS*Xwg2A_rIn0xg*FQ(_`T^1My=qS@?e|_o%@a6BMCkREA7u zWYFV3P5KXfA+i3GzYo>^CzrrrzAy4k{C=nFJ6+$zz&9Cx@2>B3eG>!UWc<Cm{%>@l zK7T91Qsf0M2Kf>!+tx-yz9Mz`UhW*A6F3dH8rEXl5Q%}@V~G*~3{5o07$7Uh3=!(7 zJh^Uq4-F=x(b|dLXS)&615b{#f8d4Q3^wXK!E9Yy3jLvPweLd<S*};lk3nN)_r|c+ zs}%iOj5U7UF6(tmI*nHPHt)R5S%&_Dye)o4?DHX=6b^Pvb){?BaLexg@F(%sFHn)= zryRba4!Zg)oYHWQqBrsJ>3v(BCmPD?--E%{b-}nKm{%1!Q6$RH5pEWf+nafwPM$?@ z@~I<hvTG`Jj17)gI9A@7x*I|T?%5)`K+Re<qcM3*u(tk!13&3SPQ<ZhoS&9f!D%SF zTpPJF(|oo41lrg&Ci<=yZ7#)g!#A)<n21$LajDp<)5l!qxLIwfKC0ByReAItiY`w< PQU*NT7H|q(Lf8BY?VRcr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..70f7879f06e4f0b548aece9b99b93a004c6bf520 GIT binary patch literal 5929 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 B7$yJ! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..6e035764678b02bf4e5e67e767c6c95257a77577 GIT binary patch literal 5921 zcmeHLc~n#95|377k<C&StV@Us3MRSP7YU#QBw{cSHbKRk<OTxSNP-EgB8#AiQ9)EF zAcDJy3Pq8n5n0q)DTubHfK*zGB8s?`r@k9-!Si~~JD&IYpZA=*%{TM=W_~l@+$Ejk zwam<9x(Nb-Fk^Wzec-c;em9y3ACHP6I}r$j?ik-dl@F*!$`vx9NDLuW(Q*h0X+%N< zLetS7upzT|zUi9+?vN3#(K_=hYtNb`+q<r@I&bZzoC!a)#;+sX%D~9-*2||Si(fYl z<R{c;yD998PCO5?SY48nZ#c34Y-!~8s;o1NlM3wJ*LUJ#FoG4hnA)|$H7}fh|C80- zH_?4Cl@t8pLR?*o%=}!9WtB~&M;5Lums4jPSv&Rqe4vy+vw{*In|$tM=PWzX&0R$x zL*$%ZT{|u1`3m3?O*Y@D1^<U9BJ<GPS=Op@n_MJ7$w+tTxM0C5)Lt7Js;18!jCXw! z*|yj>f6iZVPBle-gEc83S*r_PA9|X8PwDH`URP1De*55X^u|_9`r7i@+s~7nuVrvE zeD?Rn%<hZKQYOb+E!q_2X?bGSmSrwWubux*TGnT9{b69!#hSz1iL1R*GA7dc&xDjC zd6yPL4ah&TU*(C9pZlXBF(f_L(SbuM+#CH}*|eWluDUO{wLRNQYL>UHjAWJOz2`!} zz)-uz?fNNcna{6Jxp$eCWriDnF6@+9nzn0sHdnWO_?gLS8>8i6wAIC~r=Fs4DYb6n zof3uOZ-#QtYdhEo`|%Npz(p6t;mMQy=)}-@n^4~(rd!T5&$6>bCZm(I=YW89ZHlr+ zyXAk}SY*>?{M1P3va~zIMBJ@L9Q!8mb(pAZzwIJ7=F!8%Kk@cAeM)W|C2i{A+}P<` zel)zT^gyHoJ4n(I^guFn+hz$jroSV2Al~%xj6%o9&wfb73G*GVWDy@+|5aGP*Twm- zI^EaW?jKTr`jl-#AgMxlr}3Z}w*$IT8mzt*Z?X9Z%?^uMyQU`k#S><K>a+US2G{Sq zqYFG5+~bQ<SG5}&Z;_)CZ4j<gZIPwp#+lL$h06~3D3H_k%w*I%%ysoJ{xM@b4jD*> zB4gI&45ox3U!0VC26f)u{dS>ZVc{@JF*|bDl(dyt?sXA^H7%KCI#B<YbWY{uOOIR& zYAYYNznQkbAiX7jb(L*dKNK8wKH?5}rj5b+lKOSTNkY<5n)q;k*qY~g+1;FDR}`iE z0ONvOypI@|Sw5w+xOq$bVYNgW>yWgs$($3`)}8psYWESRt8w(<p6~73o|mtwYHu)D zYhZVzdH+-E*pul-NZ(`u+6|RyyY$kFzlH+7t$il1oSvvVajoJ`oa~Ho*CrRGUCyPz zom7{^oq2^>47P2r?F`<daBcWdc8QmG##)VpT05;TGAQhh)!nlZ4q**U4sycgnA-NV z#`{rT0S`q+yq2^j8+L65a|GTKuUtK{RPdmJWzN*q^+)B^uYY{euy%i|sn400I_gj9 zv&TR5F>2E->h3dsR@Dql$jy9O>U7B8vN?^LnXWzElx~~Qcr3$M>SI_GtE2eL@NTW1 zd&z2N`1Ya+DISmLS6X_vXf~gZUg-bx50=*n*VB81i{}*o<=vm0aIAeV5NkiZF>+8= zytdF|9Wm$bZ{rNKP3af%E&Z2qZBB!`Zr^<P`krypaln?T+COgYx?R!9Dbw~SA}VL< zhBoY(xx=<&tHhkKG$PjJSmK1a9o!o`Ob>5kT~#bdc4%$bNn0sS-Q0UMey{tgn|H~+ zlqyWpWpeAqBPVxgk0IkXU&^M@!D(h&>E+*Z5VKbvE8FZB*Kue79ar(z?LM6G+?F}E zwZGR7d8AF=;MYti6;tf~6@Ja8SCF4-nbK#TpQ$}(bNB0XZOFmay|cV)w)tD;B!z_} zS6yAs465!t!kzJB$L;pT7gldyRQ9B@&vgeD&k9O2HamAPqe441`hffHs}7gD+Xe{R z-xj9rX`W2IbTr@bO~5s=e{s+ek3i@^V7s6F-foLrZ^zu5gyY+`Sf_3%t(3(8nfY3- z{LST;&IK>q<J=n;7&q(ePx~hoS@M(A)r8CILe2!;D<zy8^s;(3nBAjYaXDMp{OEWv ziMQce(2tz*E9M(_RGuPw{%oJIVN;^t-Q<lyoKx!Ho4Q+FZT*{_UKd^-c<XLd+uBy3 zHhFdYTPK|yff$z}a&_gfTwUMydbq>q#qVHv)Vs`R2njB+&o)P+dbIoL6-fJ@1%8V* zrL_8owd?M+V#8Xs#b>D|r3Qx1Q;(TreyXCMHQCf{n06*<SJBq2mvzN0sK%t<5~|O? zI2&uI$@M#E&9K^7v@eD}d79#tpYH9J1XJ6z1xrzca)A&x>E@Ft3yY8ep5v9*w+r|j zjJ4@wql?NFZR{Sip1o}DZ`CVj2qEwJPIj4nswF+kN<Gc%A~C-{?A;48a`WxXttORV zc317mj!Mz&qoN$_dt;U6SMn;U4(;@au3dEihZBHbeTcSY!fq|oWc=Lg-b<#;=anBV zw)SXCxZU8)8|L2I+3YuNPSf~s4zeTRvGdD2C%p6asdkQ!EPT;$+Nlxo7Sj?Qc;m$> zsKN`;MUa=Q|5wF)V3-wi;DB4^#%{7a^3Ko2jBbUYbwVq1P5HdpY}qNJ>Vlssy@@So zpzQad8=Xymex)rb-7VXg<hrh!`RfDBz@rC``nw4IZxRs2y^8a?mZ^CNgt?yxe)tBm zSJ3$~2?i9%co0S-finefj?Nl6$d7<jNFEd_k}^;O=j%{Nk$`~;Ah7|q+!YEFdBi9n zZj6^NKPG}t6QG=(OdK_I7(fE4K%_<@mMZBQ25JPC4qxlVSQK(ZMHRt71+qCvSD6Ar z5-~&!fOgY}*5gr5CP+txKuGsty1#>f?--~sl}b*>V%2IjMoqxT6rorgjYh))cq|@| zhBeU2XsHU+pry(=dWcaBCZyymL~@l#CPnHoL7ps1#XzCpapZgdByu+U1H4rEjs=(x ztOk^0aTowAkzmJKC{=FjVUTwY{jG)47k-Dq`anuql!6brt%szlIb$IN{15i>D1~?= z904B-i6IHBs)T37eKO@T7Mt_ILQg@cNFpDxg310wQza69B<mC3^dlqTjCBMy|A706 z_WRgJlwmD4o6eN+qx9~vm<*JDe!4)$7YXPimozF71n?k)#u4#CG?9-dp{Y0?h$cgP zD!?b;ctjdu3=~VMRDn`Hq=$mRF(McT00|&ZNW-D=G(HtgB=8_K51^3II1-K`Bmg`- ziA){?u~H#|s}dBC^-2#VfT08s2_(SAXgr=zLK8t68HR#*Xg-aG=kZ{dAOU{_O2DVP z%M=n2PNzr$hC*1mG<0M@PdI%Ehs8kQF~CO&M+~ZjumQXVL{foFt^7FTE0RE56{zPE zN5NA7JdO$wX*d8NkUlE;LkcBai+WTXfFa;VM)ZlH!{NZxg8E8@0Y>C-G;~)51gc~T zUztqIK<S-A>McJEv*86L097CpR6#H(fG5%c8Xb@K#Zl=vGMz|t0Pu8RjJ`}D5=Q?w zZT<2=I*umYL!^Y~j~)??t|=}QIeIsGD;A9`CM0rXS<pfLXb4JhJtP?M6UG`H;)j9K zPzdfH?+W(4T=X}^fEQ8#BD|x8crqSMgh&)LRe-0VsZ;>ulLSIC2tuEtD`i5J8dN|_ zLSY_ZuHXV4;R?CnU8)v-s;>@%^m%|OLjyE44)Dd}=rDaaDhm70hesn&C<HPMkH!gw zAeu-LkkCB%!Gs1uvQWT-AfAvix?Dbx_rHZVrXt>l=ZMue#P`W`#QsORM-|3&P?(lc z8QhuSMvwi_>EH1M`}$9A@5=0-oC1mbGRbH0`-QGAbbS^BpQZezy1vl$SqyxZ@|WuR zztLs#@mmp+!Y_Dg_)E~EYa$o^ik!&vT*idYZU}zxk&EBMSH^OWRZ0Y6l9hfRhuD{A z4GRrbEVi5BedDQ?mW%AaORj@OEiC2|U-$=b2gBroi)HFv*}M}ezodyKJeZ+d{;(#A z^4O_UxAwT>(s0`p2lCbw!?YB)gxedzZ*!_Gifw)Yg}<Db|1}H)Z>bHM1G#HnO<6p1 z1#!)@!(AGSL!P32{<zS2vD^4Yj0Y>}R<vPOk2p^~+*GyLP<t|S-;Yf(ogtSow=~l? zd{fi&#^JjYo>!+{t$+2a(I_N*bUA+Ed3-IS`kVH;2`tXjenwnL24r-g+w>>0GpjNl px6!U;?f#qX>L<tB#~~1pb2`D@PPjvZCp+{AEH^J^>C$zZ{teb62ZR6s literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/meta.json b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/meta.json new file mode 100644 index 0000000000..173439b130 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Soft/commandsoft.rsi/meta.json @@ -0,0 +1,49 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by GoldenCan(github) based on cargosoft.rsi which was taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e, repaletted for Space Station 14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_flipped" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "flipped-equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-hamster", + "directions": 4 + }, + { + "name": "flipped-equipped-HELMET-hamster", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "flipped-inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "flipped-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/equipped-INNERCLOTHING-monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..2c91f621709fc67c9b642e5ddb2770bb398cfdc6 GIT binary patch literal 12675 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..bfcf0ccf7c8fb14b1c8df312f0f3dbb8035761f3 GIT binary patch literal 10021 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 J<!X-M{{;(p%)$Tw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6787e7a79033f28b164ba2bb2c5f129c5b066a48 GIT binary patch literal 6584 zcmeHLdpK0<_aBmLD3VSW#-x%Ob00Iqq%q@m<W4B1F|&t>xtJMds5m4<DU^zGOBaet zMRMu57NJh1a#xZ{<I;r`_1&Y(spt27p5Jqx-|zg_JbTaVz23Dx?^>U=*1O+5dz>9@ z)KwR$LLd-zJ6oD7_zRVt%8KB(Fg*M%1fs+ZclQ#x(#24|fX8A70Z>sGAAkZ9HVXog zbVv_x67&!>cK4Pgct=a*C?-l39xWQI$v2b_(z+zKZo3IaUW$>+eC0lf67$jLk0UCd zAKRw88s!#_Z$u>BwRdWumS@%uZ?9<Dd42!e4|N~oK8=1d`0Eh+&6|#wfm53zcj%5{ z8&Y?yJk#<pZfuN-Kuk(gvmeshaRT@Qd*?`%rWccQedS-Fh6*ZQOsv>DeR-%QW!$Hl z=dFLQH)cl!B4Hx!&QZ4x;<Lo<tuI`lA3ZGbdZdXXhoX|@#v>x%sAx<!IgQxZoaiq| zLn!TBH!!^_qFaCM36Hyhwx6Cp{m>K9uAjSOUz7C12+KtJ?%>*S``}ui6HYx7L&w@$ zIhYMz`B$%1?G2wuw?J}{yPdk_3)<|<6y}9z9ltcMP5b@>-1%xEW53Esme-Sn1x{UJ zvwm8AN+{H+=-}P;lfyw<AKq(D@*Tru=4D?K%z7GDyG0QGaCy(Y@xa*aB@NB1(O9b( ztBA<~%+yQGL5Xpl<ciogN4I^1Koc{@&1%;fW*&AM2p#R5oaFmploPhMyXEyi8jD}3 zbsa^iifWxRzhmX*+@iw}pSt_eXw)vqnff&s8`K1M7X~wDL8&2HM(T6pVeA~HG12n^ zyYcih-F*{x4EGGLvtTM}r37xcU@!tXJKrGUGS=^=q5ZsMV`GPFUM*ML^RH|RamBW5 zj853#!Rct*$USLy)?rg%rMDBAntnI%VNdu7tC?+!|AbdOvJd;(h+1=oYO{FfBf}l6 zqv)ag?X0YlyG?4Jyh2`VJB#QH*8aUbs6AweTh23!>1cd>aM@`+vh*!u<V@w(>Bm#E z?>|wyB3d>u>)ldZxJNIIc3L~Q8M4<{i{i6XUY<l`c_yATv}r|^hr?DI=HwArt4V%P zuh8{^CyPT3$nhk>XXVoDfmz%a;$$_AZUk&%8P_+bq+(9X;)^TQy7N6(e0*P(agw#= zRYXAT?X^?eKHA*Tr+m)MMkSnddFfT(C(TTH=dgCaQHCK39eLUBbbPz<_H#oA&Ys2o z&RTT#mI`pL?EK1cr)@SFP8daRmU`<-PrFO$<qcgQ45Xf<Mc$VdEnjSKNE2h1Z3$hQ z(Y-PG03&o+s@-jau%!oc%x@W#b}|~*WE`rV-mx>Vb};Gswu_?driFeh?b{+~x5w&@ z+_APn#=+>$;*u<zAkLVaCo$iWvQXZBuS#Y7DK8Fl{`r>ddfalDQMG6Ep>1rtI+sP0 zoTSt@tj!nQ#pKPU6rRosYL?r!q!T>Jz3`<v0u4)pLh8%R^nGP%0kJRF1r|V#HE^#r zZ3Qqn#Uu^$tH$>V!wObp=mrF6`g58$-^p$b3lAQ>|H@~0*ABRiDtA4kbW?PNIBW_2 zT+1Z<Kuzy{bDI$F)7cW+gN2HvHB}m8hDpW?R$>Vyar+9lqS(^rDwhePb6sMO-*3K@ zUj2<x*r{5dkY=4&;&dVE1!JJSA?l9KN_*}~w@smC>}$~~Tl6k!9FCuiYjUy4Qqy&h z&vY$~Rx&s;9QKU3I~w)z(NNcGExE{o8zX!5RMD^7j|Z2piM(;=N^8kU|J^&pEk$eM zs)croAq|IU&V9K};lYgwij1UdaegBvyU<;oS1Y0JIegN)y>*L75C3{aDK~jVuIpg; zw=U2w1~LY)CgXcz(p*??Ha{<7#~e{}owD0)27l32bllUPIIQ*LbC;Dylqq-B`7FTc zed1+Hg(S<1iMmJ4T2*h&k*|EPoH<KxW!~t##0dr8IYUB3p<$wV%Qhh6K|-WH^zQsm z?+5{p@J9WLH}y0V>T}YSl*N^J3y<X~Yq-L##&UACA#f*H;q#+)*P`w(2{xOTQWjI! zm2p#%EUpp9Hsge2!)=kQMkOjtdv?3l1go-HEwQ+lTbr>-@f!6}s8`-_EIJ|T)>MqH zLh(7JS&yTxYS0Pf(I*v-#d5ndk(X@zZlU>lx1f^7-N!b?9}%jQuO6(Xta)<4a`tHZ z_60`ME3P}l#O|;lVxQ_%kCZu&Q~#*VcPSZR7U+d4t1B)KgPyz<x$Nz+!6gZe5iKt{ zr{9lHO>~atP%kJ-Ahzuuc@bWvs&#*8dk<3buXL}6==9cgd9^+Jt8!W2ZyQnp>b^0( zu?pQ1ljNxPQ66IjRe8tjwD(lD7d=_Ap-ivl>3cGLRP-w5NLR%~ZXMBcvc7m}70W~O z-hI!8Oovm9eQ~=z)tt1Asr^eGvqn4a>vbv*r#(-0-=qHf@YOwPj(;$_=9D&?KizrT zhj{^;jeH&j-Dvn|tS(f3PLNVXz>S?0-=v`d)uSzpgXIKw0ej7SuNcgTbb+)rA{EwQ zbm{^#E{W=Gol>P`ZRGkOVzp|Gu0AABa#R#x6!E7MA=SLnts&~J#eK|~fupXrv7?lV zyN>6FPR+_~u0oRH+WtJG|M66xq|2ef_k{GhS(>9?&y&}ToQEsorFhgWYXy0p!(2xL z=56Y`WpN|9XFe>@@>R5XKbTl$5&elniG$NMKPwrqw^1xJlDZ%exfnK;>TE})etYtQ z&)Z`=lgYNV>z35}x>><>=9$G46!IMx(5#l6Ot8A(+@V@XI^y$Tw!@;7`MNgMSNi&H z__bBndwVK*Qsz!Uf<yVPqGYYlhv#pslkmItizoENBaoaetb%rw+?jO1kl}(#-K<l- z<*!{43P^d1-zhyO_^HRls^Q1|Lz`p#!?HdK-x?EB<<=%kl3v7GRZz??v0ogU*h4*M zw5o2fu3vHUf%nNn#kY9J)HKx0G0eQwH+2Sn7w<F(7GKKE(Q?v`)A2a5!=S&oCM@yN z#-ie9<Vm$%M9%X1ko4Mkx=OGi)Y4jK`9ZpY<yq^5J%&;n@)R}6f?{&iXE{=^CR<)7 zrC;guuHNqS$$UH0RSRd6e1kqR=0ES4y$IL&X>EzLL8UKJvFLKzbyp>ph28lpmq+K_ zDOLCJDaD3qUhR@o%n~&oSkma^c5^Ul0`uY28YEv$;XzkV`bWY}$ld#Guhsc{<-Iya z+q?U_yQP)W+fTLkYT70V(t07@xe$nk2OHc8c{!{nF?bvkI+N!Im`FH$aHj-;m|IBr zbVeW`g8BjeY%Uo#Qhpr<Wi!bzPn-kNflmbj*tX#Uz%AU-oe>_$ATnVVYgNr9BoKfD zi0DuWCx|N~NyxAnToQOK6C+^I85L0=8Rq5S45jh}02FJ2H9^9yB<xT$Y^^HPT)<?J zTxr%{A;3E_EI=gUlMo28SZpH3nD7Mt2o#Y>L?F=!G#U<Sz=dI45nTf33YW<szF^P* zAw$6Ci`YCaREA0S<AsRGFc>%v{pKHs@8Iwqo-6#y0>}qKLgyn;CP)N_gZR-xD6$F# zLB2ZlUoC|0;D!?63J7^20tR3e3UEcseuQ8$zT5Ld1VJ<5Fc}CS2;hLKLU2~pPgC01 zIXHi}kWt{z=J02%K(c?*6tP)<ll7BtvXPl^eslyh|Bm~U_P5w)ltC>A2NI3P2$8vG zM<c^z^OKl72AfHmxkTepNCJb-fCF?S0glBZ>2N;=1_MW8QCJ3+PC%jv#2=vSxIz(~ z%K&6hAh-z|#KB{cC>9RSgky<B6da2J2yh}2V8T%>3<HP3(oG2j(;pz51Z=P>=|Mkw zC4*vuP&gbO%RmAE9M8hz;8-RKghDe|a3p|1AsI+Nq$!gy1I1*Jta$<s9ZV;iL-z*| ze6Ih@fQ)bw#o3MwLz^J~mN*B|MJ&(&>;X2H$rB6z9&%@M05=g`#wW@YjmMdya6}Xu zM?|Ahe=BVO1VXSDWvD2m2?jkgB1;Sj3<so^E~``!U`7r`L!t@*x`-!m=kbEbFqu<O zndSFk2e6@-bP=6K7XctB5{)Gxi6oS%I|@UR9mv&4Gzs~GK99*}h5c{Zvi5<Re@VJ6 zTL{h{HY57dQ*J=;m%A^wLF}1kf<kB7f<$M02|-8?1(-8_f>>XM7y)#yKLD;DUkmn| zoc&*l0f}QGu|%vXoKE-igJW?RB$z=w3XUS6aeja)9#6nAenuDaSRyf908sov9zm|a z0-fOsYV<W#tA5rO2LQ4>fRw?JL^ulVjzW{r1n__%{{8R>Oe~H_z%bx=JQD-Q67Wd4 zAC8HJvzTBPVCV!o%MbgryZ^`VzE=e5TX^OO*@E~jndXT9k?t=FKdhi2Enj5d$_y^_ zi0>=?SH5Ix>c9B;T4w*^3?THcN&XSPzv%i!*FR$5A1VK;u3vQhBL@DF@~`Upf1^wF z?{`Ij3vTel;G5u7V)YX6EmG0X-i8Lb2RRPGtNTNmL5T|A)>{aHsA<biIY|1kg`iML zWanU|^ju}0n!4Jw@2WoVuYwLc8pYkKR(gnHznHQxHtWzITaPWjaG~t7Wqc-6ZOa^K z&f(%Mb$y7rhNcE7`h6D%p$Zj;))@?@=>>+5X)4F+B*faTu{v#Ae+H`DPhXGEseTpn zwgfT9?9!W-h>?ns=F+*#toJTNt?$#FKbf+KbQrN}DjGeV2OKn?-Z;TK|9FUdHMBDC zh{KCd1H@O6#VhRpL>To{Xx=yszgiZ{D_<~~QsYP=X}9VxrL92WjI)dT^ZTU`lIOK3 zN7m_^1A<+RS&XF8S;l6W>B@4DP0h~1XQ7=2$)Z?6nfX;=`>7`zF4nJS`fH!aLo`{P z@qG8bXjV<sGXv$gjfD;8uVg`{rn{@nUPIoyex|x`qxH|YY%sKTJ;+HY1f==b&jsjN zhUS}27gWt_a#}aWsI5U5rASqb_`%~N<-_a|n?coK-j*$<3!)nKKYkse$;dsg4|IDi zcuNnYFFNo?UC8EVgT0S4Ghrtc7GF5s-f6m;X00&ps0Y3D{#^7dB`unw9%s5pXQA%H z{F})=N>;AVHzDWLMCIKH{%kLouHL-?e|e%tC9BtB|GVvWw4R+CdV`DYYf~#Xx9$F& zYDJDuOP;-Mf4rHg^XhQb-+JV4d0jeej<;O`GH#LyDY%$>?S`?>UNG?xJ1a+8k>%Ft F{{ZN`RIdO4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..858a54c10793af1b4b8a9a4fadfb31b8df6651c7 GIT binary patch literal 12508 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 DB%AL! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6e374a720d445a40f5b60727f52adf5c458ef8 GIT binary patch literal 12567 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 U*imc>Ff5*%^GK&mhe@;l57t=;(*OVf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/meta.json new file mode 100644 index 0000000000..e3f1b0fffa --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/commandgeneric.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made GoldenCan(github) based on both the medical jumpskirt and medical jumpsuit, both of which were taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039. In hand sprite by GoldenCan(github) based on medical.rsi in hand sprite which was scaled down from the sprites from tgstation by potato1234_x. Monkey sprite made by GoldenCan(github) based on medical.rsi monkey sprite made by brainfood1183 (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-INNERCLOTHING-monkey", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/equipped-INNERCLOTHING-monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..363eb6614c8fc1cd453301979b660c028a6ec374 GIT binary patch literal 12051 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..95f7c555926042808dd5311f6d2f3257c9d0f894 GIT binary patch literal 15180 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 brrGnfA4K@sE=)naoK08LP~+_8?UDZv_%W-S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3258a2a7a6e2665fbdee53b55d3d5951754e8a5d GIT binary patch literal 6932 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 Qgi-*rXE<AzuHBUMZ<K3q7XSbN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..858a54c10793af1b4b8a9a4fadfb31b8df6651c7 GIT binary patch literal 12508 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 DB%AL! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6e374a720d445a40f5b60727f52adf5c458ef8 GIT binary patch literal 12567 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 U*imc>Ff5*%^GK&mhe@;l57t=;(*OVf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/meta.json new file mode 100644 index 0000000000..6d0322eabf --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/commandgeneric.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made GoldenCan(github) based on medical taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039. In hand sprite by GoldenCan(github) based on medical.rsi in hand sprite which was scaled down from the sprites from tgstation by potato1234_x. Monkey sprite made by GoldenCan(github) based on medical.rsi monkey sprite made by brainfood1183 (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-INNERCLOTHING-monkey", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} From 3aa5eb5a213670c6718cc0ba5c750705fe901270 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 18:36:50 +0000 Subject: [PATCH 534/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1e276f26bf..a598cb61bf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: kosticia - changes: - - message: Bedsheets now can be printed on uniform printer - type: Add - id: 7813 - time: '2025-01-15T19:35:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34034 - author: TheShuEd changes: - message: Christmas anomaly removed @@ -3917,3 +3910,11 @@ id: 8314 time: '2025-04-22T18:15:12.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/31864 +- author: GoldenCan + changes: + - message: Heads of Personnel can now fabricate generic command-themed clothes using + their uniform printer. + type: Add + id: 8315 + time: '2025-04-22T18:35:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32103 From 2f8809c74c65af84d217288973a59ce449c8a96b Mon Sep 17 00:00:00 2001 From: Ilya246 <57039557+Ilya246@users.noreply.github.com> Date: Tue, 22 Apr 2025 22:38:32 +0400 Subject: [PATCH 535/622] downprice many cargo orders (#32375) * atmos repricing * emitter crate * materials * lasers * revert gun prices --- .../Catalog/Cargo/cargo_atmospherics.yml | 18 +++++++++--------- .../Prototypes/Catalog/Cargo/cargo_engines.yml | 2 +- .../Catalog/Cargo/cargo_materials.yml | 4 ++-- .../Catalog/Fills/Crates/materials.yml | 3 +-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml index e3079f24d4..47831e09ab 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_atmospherics.yml @@ -4,7 +4,7 @@ sprite: Structures/Storage/canister.rsi state: grey product: AirCanister - cost: 1100 + cost: 300 category: cargoproduct-category-name-atmospherics group: market @@ -14,7 +14,7 @@ sprite: Structures/Storage/canister.rsi state: blue product: OxygenCanister - cost: 1100 + cost: 300 category: cargoproduct-category-name-atmospherics group: market @@ -24,7 +24,7 @@ sprite: Structures/Storage/canister.rsi state: blue product: LiquidOxygenCanister - cost: 2500 + cost: 1000 category: cargoproduct-category-name-atmospherics group: market @@ -34,7 +34,7 @@ sprite: Structures/Storage/canister.rsi state: red product: NitrogenCanister - cost: 1100 + cost: 300 category: cargoproduct-category-name-atmospherics group: market @@ -44,7 +44,7 @@ sprite: Structures/Storage/canister.rsi state: red product: LiquidNitrogenCanister - cost: 2500 + cost: 1000 category: cargoproduct-category-name-atmospherics group: market @@ -54,7 +54,7 @@ sprite: Structures/Storage/canister.rsi state: black product: CarbonDioxideCanister - cost: 2200 # Until someone fixes it co2 can be used to oneshot people so it's more expensive + cost: 400 # even though it's poisonous, it comes locked and only damages you slowly even with high amounts (tested) category: cargoproduct-category-name-atmospherics group: market @@ -64,7 +64,7 @@ sprite: Structures/Storage/canister.rsi state: black product: LiquidCarbonDioxideCanister - cost: 4000 + cost: 1800 # much less deadly than the plasma can (this has been tested) even though this is cold+poison category: cargoproduct-category-name-atmospherics group: market @@ -74,7 +74,7 @@ sprite: Structures/Storage/canister.rsi state: yellow product: StorageCanister - cost: 1010 # No gases in it so it's cheaper + cost: 210 # No gases in it so it's cheaper category: cargoproduct-category-name-atmospherics group: market @@ -94,7 +94,7 @@ sprite: Structures/Storage/canister.rsi state: orange product: PlasmaCanister - cost: 4000 + cost: 2500 # for reference, bagel's 3x1 roundstart plasma chamber contains ~16kmol for free, this is $2.5k for 1870mol, so $20k to nearly refill a 3x1 (some are 3x3) chamber category: cargoproduct-category-name-atmospherics group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml index 96a9931f2f..b25e8d525a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engines.yml @@ -34,7 +34,7 @@ sprite: Structures/Power/Generation/Singularity/emitter.rsi state: emitter2 product: CrateEngineeringSingularityEmitter - cost: 3000 + cost: 1500 category: cargoproduct-category-name-engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml index 35830900a8..1f9df937d8 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_materials.yml @@ -44,7 +44,7 @@ sprite: Objects/Materials/Sheets/metal.rsi state: plasteel_3 product: CrateMaterialPlasteel - cost: 4800 + cost: 1600 category: cargoproduct-category-name-materials group: market @@ -64,7 +64,7 @@ sprite: Objects/Materials/Sheets/other.rsi state: plasma_3 product: CrateMaterialPlasma - cost: 2000 + cost: 1500 category: cargoproduct-category-name-materials group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml index 80c6311f13..580319cd5f 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml @@ -68,12 +68,11 @@ id: CrateMaterialPlasteel parent: CrateGenericSteel name: plasteel crate - description: 90 sheets of plasteel. + description: 30 sheets of plasteel. components: - type: StorageFill contents: - id: SheetPlasteel - amount: 3 - type: entity id: CrateMaterialPlasma From 7ae7def1fbad08039407a02028f21d5a238ab347 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 18:39:42 +0000 Subject: [PATCH 536/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a598cb61bf..afa7c096c1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Christmas anomaly removed - type: Remove - id: 7814 - time: '2025-01-15T20:22:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34053 - author: Kickguy223 changes: - message: Puddles will now correctly evaporate @@ -3918,3 +3911,10 @@ id: 8315 time: '2025-04-22T18:35:43.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32103 +- author: Ilya246 + changes: + - message: Numerous cargo orders have been made cheaper. + type: Tweak + id: 8316 + time: '2025-04-22T18:38:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32375 From 063bbfa77c198eb6af9d8e22633eb18b20e40648 Mon Sep 17 00:00:00 2001 From: Zachary Yona <58833995+Magicalus@users.noreply.github.com> Date: Tue, 22 Apr 2025 14:40:58 -0400 Subject: [PATCH 537/622] Ashen hud item status slot fix (#31411) * new patchMargin variable added, horizontals fixed * All sides now work, system is fully integarated --------- Co-authored-by: Zachary Yona <magicalusf@gmail.com> --- .../Inventory/Controls/ItemStatusPanel.xaml.cs | 17 +++++++++++++---- Resources/Prototypes/themes.yml | 7 +++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Inventory/Controls/ItemStatusPanel.xaml.cs b/Content.Client/UserInterface/Systems/Inventory/Controls/ItemStatusPanel.xaml.cs index 95951fa1b0..f7f6f2b561 100644 --- a/Content.Client/UserInterface/Systems/Inventory/Controls/ItemStatusPanel.xaml.cs +++ b/Content.Client/UserInterface/Systems/Inventory/Controls/ItemStatusPanel.xaml.cs @@ -38,6 +38,7 @@ public sealed partial class ItemStatusPanel : Control StyleBox.Margin cutOut; StyleBox.Margin flat; Thickness contentMargin; + Thickness patchMargin; switch (location) { @@ -61,15 +62,23 @@ public sealed partial class ItemStatusPanel : Control Contents.Margin = contentMargin; + //Important to note for patchMargin! + //Because of hand ui flipping, left and right instead correspond to outside and inside respectively. + patchMargin = MarginFromThemeColor("_itemstatus_patch_margin"); + var panel = (StyleBoxTexture) Panel.PanelOverride!; panel.Texture = texture; - panel.SetPatchMargin(flat, 4); - panel.SetPatchMargin(cutOut, 7); + panel.SetPatchMargin(cutOut, patchMargin.Left); + panel.SetPatchMargin(flat, patchMargin.Right); + panel.SetPatchMargin(StyleBox.Margin.Top, patchMargin.Top); + panel.SetPatchMargin(StyleBox.Margin.Bottom, patchMargin.Bottom); var panelHighlight = (StyleBoxTexture) HighlightPanel.PanelOverride!; panelHighlight.Texture = textureHighlight; - panelHighlight.SetPatchMargin(flat, 4); - panelHighlight.SetPatchMargin(cutOut, 7); + panelHighlight.SetPatchMargin(cutOut, patchMargin.Left); + panelHighlight.SetPatchMargin(flat, patchMargin.Right); + panelHighlight.SetPatchMargin(StyleBox.Margin.Top, patchMargin.Top); + panelHighlight.SetPatchMargin(StyleBox.Margin.Bottom, patchMargin.Bottom); _side = location; } diff --git a/Resources/Prototypes/themes.yml b/Resources/Prototypes/themes.yml index 3952687255..1c17362d1c 100644 --- a/Resources/Prototypes/themes.yml +++ b/Resources/Prototypes/themes.yml @@ -14,6 +14,7 @@ disabledFore: "#5A5A5A" _itemstatus_content_margin_right: "#06060404" _itemstatus_content_margin_left: "#04060604" + _itemstatus_patch_margin: "#07060404" - type: uiTheme id: SS14PlasmafireTheme path: /Textures/Interface/Plasmafire/ @@ -30,6 +31,7 @@ disabledFore: "#FFF5EE" _itemstatus_content_margin_right: "#06060404" _itemstatus_content_margin_left: "#04060604" + _itemstatus_patch_margin: "#07060404" - type: uiTheme id: SS14SlimecoreTheme path: /Textures/Interface/Slimecore/ @@ -46,6 +48,7 @@ disabledFore: "#FFF5EE" _itemstatus_content_margin_right: "#06060404" _itemstatus_content_margin_left: "#04060604" + _itemstatus_patch_margin: "#07060404" - type: uiTheme id: SS14ClockworkTheme path: /Textures/Interface/Clockwork/ @@ -62,6 +65,7 @@ disabledFore: "#FFF5EE" _itemstatus_content_margin_right: "#06060404" _itemstatus_content_margin_left: "#04060604" + _itemstatus_patch_margin: "#07060404" - type: uiTheme id: SS14RetroTheme path: /Textures/Interface/Retro/ @@ -78,6 +82,7 @@ disabledFore: "#FFF5EE" _itemstatus_content_margin_right: "#06060404" _itemstatus_content_margin_left: "#04060604" + _itemstatus_patch_margin: "#07060404" - type: uiTheme id: SS14MinimalistTheme path: /Textures/Interface/Minimalist/ @@ -94,6 +99,7 @@ disabledFore: "#5A5A5A" _itemstatus_content_margin_right: "#06060604" _itemstatus_content_margin_left: "#06060604" + _itemstatus_patch_margin: "#07060404" - type: uiTheme id: SS14AshenTheme path: /Textures/Interface/Ashen/ @@ -110,3 +116,4 @@ disabledFore: "#FFF5EE" _itemstatus_content_margin_right: "#06060604" _itemstatus_content_margin_left: "#06060604" + _itemstatus_patch_margin: "#07060505" From bd1f2af691264c5646086e68ae021753181eea6d Mon Sep 17 00:00:00 2001 From: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Date: Tue, 22 Apr 2025 15:34:39 -0400 Subject: [PATCH 538/622] Ashtray Resprite and Fix (#31643) * The meat and potatoes Yup * Stupid recycler bruh * guh guh --- .../Entities/Objects/Decoration/ashtray.yml | 57 +++++++++++++++--- Resources/Prototypes/Recipes/Lathes/misc.yml | 7 +++ .../Decoration/ashtray.rsi/ashtray1.png | Bin 0 -> 136 bytes .../Decoration/ashtray.rsi/ashtray10.png | Bin 0 -> 258 bytes .../Decoration/ashtray.rsi/ashtray2.png | Bin 0 -> 121 bytes .../Decoration/ashtray.rsi/ashtray3.png | Bin 0 -> 166 bytes .../Decoration/ashtray.rsi/ashtray4.png | Bin 0 -> 148 bytes .../Decoration/ashtray.rsi/ashtray5.png | Bin 0 -> 136 bytes .../Decoration/ashtray.rsi/ashtray6.png | Bin 0 -> 190 bytes .../Decoration/ashtray.rsi/ashtray7.png | Bin 0 -> 129 bytes .../Decoration/ashtray.rsi/ashtray8.png | Bin 0 -> 176 bytes .../Decoration/ashtray.rsi/ashtray9.png | Bin 0 -> 196 bytes .../Objects/Decoration/ashtray.rsi/icon-0.png | Bin 308 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-1.png | Bin 331 -> 0 bytes .../Decoration/ashtray.rsi/icon-10.png | Bin 457 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-2.png | Bin 338 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-3.png | Bin 361 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-4.png | Bin 376 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-5.png | Bin 379 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-6.png | Bin 374 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-7.png | Bin 372 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-8.png | Bin 395 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon-9.png | Bin 436 -> 0 bytes .../Objects/Decoration/ashtray.rsi/icon.png | Bin 0 -> 333 bytes .../Objects/Decoration/ashtray.rsi/meta.json | 24 ++++---- 25 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray1.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray10.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray2.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray3.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray4.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray5.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray6.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray7.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray8.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray9.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-0.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-1.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-10.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-2.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-3.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-4.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-5.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-6.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-7.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-8.png delete mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon-9.png create mode 100644 Resources/Textures/Objects/Decoration/ashtray.rsi/icon.png diff --git a/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml b/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml index 61554d0621..9908e2a028 100644 --- a/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml +++ b/Resources/Prototypes/Entities/Objects/Decoration/ashtray.yml @@ -7,26 +7,69 @@ - type: Sprite sprite: Objects/Decoration/ashtray.rsi layers: - - state: icon-0 - map: ["enum.StorageFillLayers.Fill"] + - state: icon + - state: ashtray1 + map: ["ashtray1"] + visible: false + - state: ashtray2 + map: ["ashtray2"] + visible: false + - state: ashtray3 + map: ["ashtray3"] + visible: false + - state: ashtray4 + map: ["ashtray4"] + visible: false + - state: ashtray5 + map: ["ashtray5"] + visible: false + - state: ashtray6 + map: ["ashtray6"] + visible: false + - state: ashtray7 + map: ["ashtray7"] + visible: false + - state: ashtray8 + map: ["ashtray8"] + visible: false + - state: ashtray9 + map: ["ashtray9"] + visible: false + - state: ashtray10 + map: ["ashtray10"] + visible: false - type: Item size: Small - - type: StaticPrice - price: 1 + - type: PhysicalComposition + materialComposition: + Steel: 10 - type: Storage whitelist: tags: - Burnt - Cigarette - Cigar + hideStackVisualsWhenClosed: false maxItemSize: Tiny grid: - 0,0,9,0 - type: ContainerContainer containers: storagebase: !type:Container - - type: StorageFillVisualizer - fillBaseName: icon - maxFillLevels: 10 + - type: ItemCounter + count: + tags: [ Cigarette, Cigar, Burnt ] + composite: true + layerStates: + - ashtray1 + - ashtray2 + - ashtray3 + - ashtray4 + - ashtray5 + - ashtray6 + - ashtray7 + - ashtray8 + - ashtray9 + - ashtray10 - type: Appearance - type: Dumpable diff --git a/Resources/Prototypes/Recipes/Lathes/misc.yml b/Resources/Prototypes/Recipes/Lathes/misc.yml index 27316ed08a..7d4c80b795 100644 --- a/Resources/Prototypes/Recipes/Lathes/misc.yml +++ b/Resources/Prototypes/Recipes/Lathes/misc.yml @@ -245,3 +245,10 @@ materials: Cloth: 100 Steel: 50 + +- type: latheRecipe + id: Ashtray + result: Ashtray + completetime: 1 + materials: + Steel: 30 \ No newline at end of file diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray1.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray1.png new file mode 100644 index 0000000000000000000000000000000000000000..34d1937e2cccbb2dadbe09a0d915db512d4f6f77 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ z&pYxmDDXI6WUZgtpwg1qpl#0M!%!jN&2h5+`?|T33<{3<rS6+m7uTFAtyVjC_wfDY g6TXxI^&j}omzltOK%T|;J&?!X>FVdQ&MBb@0FNswDF6Tf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray10.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray10.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ff0d9d19ff41e2e7785dee5d12c40fffa41e9c GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}dpunnLn2y} z6C_v{Cy4Yk1sY6o^zb<G-!ZWgL@}10(U7oY2zTP<<ox;m=~LG*r4%LCkF!j(B{p`} z|Nhq7*xlVN^IJ0F#3feN9W}YjwLiztnBJWDccXQLY!45ImclW?n3x!z`}=B>6VlSs ze*Ab~(`=y6e)#rzdkMbSI;RUYlNK>Z-`JKbeP`1C`u|2Bv?YXcEt#1m6&v0pv$3(Y yRi!7gt=*Ez6BroC^XAPPi_0f9z)t0fVqh?MXjNgc{EaBk9}J$ZelF{r5}E+ZkzU^b literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray2.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray2.png new file mode 100644 index 0000000000000000000000000000000000000000..c95889553be5fe72186617a2c07dd0fd9076c648 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}#-1*YArY-_ z&oK%z2naA3+<kJvK~(a|#OKU=B<k->OIXWzK>M83&h+!2Trw4uvX~hTOxLry!QJ&G S_{UkGb_P#ZKbLh*2~7Zik0uiU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray3.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray3.png new file mode 100644 index 0000000000000000000000000000000000000000..8baf89e0cd56e6ffd376fd53f4e27c999c5f95ef GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}37#&FArY;~ z2@<S}6GVEN0u8v@q&Hli`cpn*>8JS-Uwy7@i<vRK`Qh8=@-D9vmrZ-RZ{NQEmH+Az zDt`ZDKfLg?zr@N^y)XeGp(ep2@7}$0VgIdxFo{hRXq&spfg-LwuYq<kc)I$ztaD0e F0sz3kJa7O2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray4.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray4.png new file mode 100644 index 0000000000000000000000000000000000000000..8772718e9cc071fab0502acc762f1e1f30b9e345 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ex5FlArY;~ z2@<S}6GVEN0u3%PDx30J-<1CS|JL7ho~W)Mo@Yn9S7w<7KKT6n{QsAEnmj*#{o<SR pl$p=T$;oZQd-sDHP`!%$3<_`fc2~H%hyzV#@O1TaS?83{1OTZtF|z;w literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray5.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray5.png new file mode 100644 index 0000000000000000000000000000000000000000..48e3be8e488a1706febd566ff27695868fc11dd3 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ z&pGlQaNuEfeEs8Rx=3qCf~pXMW{1t9$z=>Tv>6#1ZmYa}%ch!nTi0`2wdtx=ZqL)D iKI}bT!o<)JYyYo<zvzqF@?}8N7(8A5T-G@yGywnw^ekim literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray6.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray6.png new file mode 100644 index 0000000000000000000000000000000000000000..2d62f4e49627601b921d1cfe1ad171550185bce5 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}6`n4RArY;~ z2@<S}6GVEN0u81(ESP$#-a2;X|0^bwJ4KG>+y74xc=j}5!7^o!q5}(0`%5JDEf7mk z3}s$E#q6-WnHd{fn>F)ehP1Rawz9G^Hhul||6^ie3O<@<Uo!|g>bitMUtfQf+KE5| iF1LdkU~70d7#LJ;i{@=_(K!Kh1B0ilpUXO@geCyA>poHd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray7.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray7.png new file mode 100644 index 0000000000000000000000000000000000000000..6e1d607ab073f2ff4428eea82d1c57d4b87e05ed GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R})}AhoArY-_ zFKpyxFyLWwboV-%apslmV?E}GyhVS$D!8yPFs$EHt5#KJuJN*Og2>FBYHVA5_A)Xs a{0j-xXTSU1$fy8l41=eupUXO@geCx$ttSrv literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray8.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray8.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6f17a1220f30027f9e02000f83a06f24dcc499 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArY;~ z2@<S}6GVEN0u8t{7~<mM{%e{xcM6@2iHRv_4>)YNxFPAo&(G<T7B^0m>2`8*`d9z^ zTW@1`cX#61S*8WXe&3G$+h6uy()rPpy(u%jCovbCocpF%*0%>{W}6rT!<Kb2cK<R} R+<>++c)I$ztaD0e0su{2KpFr5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray9.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/ashtray9.png new file mode 100644 index 0000000000000000000000000000000000000000..8e62bef89cf3ba89bc5af976fc4d1bb79dc5d7f4 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}b)GJcArY-_ zFYOjQWFWwDq4i93ld;S$=B|J;y`!uFeNq8#o=dEqRg^e7c5F2Ic68T%24iF6%}Y97 zD1V;2nQ@Zawd0zfEtGbtO!#ARDa!llk7>6WRB}!W|1M=ZdH85B@06gbwW6<6kG=iZ uutf3y!{?m$Ub8byVla5ala}`XEh}G$cHQzI{%t^)FnGH9xvX<aXaWFbolCR; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-0.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-0.png deleted file mode 100644 index 3bc1eafb97b363d9e539b40c2916c8d4ad026dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?5OL=a|NVZS^RDEQ3N z#W5s;GkH((bH2k4Ov@U#$fSH<!R+RoV8X&y&#_{~iVIs-NPG}TSlIe~f^%;`pnZvR z!p%4L{;!g%;@O@b!^EBxl4YoDxzICAq(P_rD;Lx4<qKFmmn`Rh|1Ur5wbv%)6J1Ob z&O1K%{e67`Ptsv0rXy;s6GWLFO`62Bd;41E+sxf;((dI!Z(3KYo@Ttizc#hOmGOj1 zfXSZf-&}bbnmn6i7OYD@SMmAM$^R$B8jno)d1TYcB8C$MMY=BK5;yrA%sFQIulV2? zcG{yWDW&&H(&VYUD^o2`%n4-gX*-a?0VEpQ85j~6Oj|QTbaa3|X7F_Nb6Mw<&;$VR C-FLhI diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-1.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-1.png deleted file mode 100644 index 0d4142d08d8f398447969766e13977d04a67de03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?5OL=a|NVZS^RDEQaY z#W5s;GkH((bH2k4Ov@U#$fSH<!R+RoV8X&y&#_{~iVIs-NPG}TSlIe~f^%;`pnZvR z!p%4L{;!g%;@O@b!^EBxl4YoDxzICAq(P_rD;Lx4<qKFmmn`Rh|1Ur5wbv$PkG>{t z?$7^UZ?sJcxM-9x!=~8o@b~xe2l*OXSynD|DB^f=#6P8`<oT)pFKtVCq&EHG(VuV6 z?%v$H*m`AI^VP|37$&THe}A9Rfkg~Q*j*3r-oD<!XA)y1U%++a^gWd?pVX(^c1Su= zlXNr1k|D)nr`RIvo*ecC(k*AyLw+c%PE~O=+~k(E(eqr}l}!?9=b&B#`tN`<1B1&H Wy9YgICD#E1g2B_(&t;ucLK6Vp(u83E diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-10.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-10.png deleted file mode 100644 index 53f61b9243efb922afc868c54886b6702594475c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmV;)0XF`LP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBLdr3q=R9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHk8qDwbDz z|Hmppq9EBJ5ZS(!ks6L5+W{bt`erf0{d;9$K0HJ~p$5Zn1vnTiIK=S^gDhKhm!E-) z%ZB0Gx4Qpf${!hY;wK_pgI71IBv}rCSk48s{2R~_Tnwx3GBD@>%|(h5q8&qW6x7w# z{RdeJvm8c)#6f-or43X+;^&d<08nuINIqwnIB_C|BS^Iz<TRojfSkZU!Ov%%$}qjB zjzL3~pP{|I9ZW}s_%Ogi0l%M7Wr<1ypah0Ucw7wMzkOx6@%SS{Zh9ia(Mbsmu3iNU zlV{Ecrw6Dbh>ixLLV%y2|3AnPu()5pZ9mu>@7}&*U^R?lc)4c+11M@LDk{KgQ2mIX z$4ID22FlMMH6WigH8nAIbaecOB|H!fN(&!9enjyxa_LFPe4-tI><^eDKn_9{Cx=bY z0pu7;iXNiU04WBNs&>=?qaiRF0;3@?;2{72u8xyvE&J2R00000NkvXXu0mjfnqjkx diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-2.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-2.png deleted file mode 100644 index 1800a7eea03802f929339cce53f7ed1ada022763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>UtP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBL1W80eR9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2K1N zV4;QgkVB17QBPI~Tv?d^AB3slc(NRz6F-sh(l0p%et!P{%Vzh2F}aQ*%K;!uUA=-B z?p(XTaO3eu1`zx7;oW3~2+0lr1-%~IBL)>M1BS^n=QE_lg@HYP`^F`*0)ga22nzm3 zcdq=O-c!e*A<NJ3^7(THkmWXx?(}g0$d>QlzJh}tW}||V3d6g%uV7q~Xp%z!WV*VZ zIpfVsCsE=YBu0|WP{m|90OkmCEJW8swgb=&Lgo`He2~>LlA;({BemEhXG3aP3^Qlc k0iz)>8UmvsFyJ8o0N>_Hm8J?ekpKVy07*qoM6N<$g2S7LtN;K2 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-3.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-3.png deleted file mode 100644 index a82fd0cf8f22aa6e2d7f75f759a9ae226937c040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361 zcmV-v0ha!WP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBL8%ab#R9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2K1N zV4;QgkVB17QBPI~Tv?d^AB3slc(NRz6F-sh(l0p%et!P{%Vzh2F~~8?E4}}NFewfr z%K;!ubxmv;jvUy{aO3eu1`zwpV;``^k?mU<NpS$lX#f=TdTa~~)()-=`T6+_p@BXO ztJiN~(ER<MfmF*u4kg(Epx}RW=gR--J#`EkviuA`zI+7J){dQ|cpR>lWCwtBe*gBB z!PP4WZis@C3d6g%ui$)A7-Ts>UC*5H=B1M;i47!1ip4OsWH|t&nOqBD7Q<+=9RM=` z8%?P2LDs`aiehAq)MArW4p7T-kU66c7!85Z5Eu=C0S^HH$W2g2(zRNO00000NkvXX Hu0mjf>8z2a diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-4.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-4.png deleted file mode 100644 index 92169bb6c551033f6a277cdb1a6304edfae9fb2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmV-;0f+vHP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBLDoI2^R9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2Kbq zK&<z#EX@B8Qws_;7>0@AqR9#YkY&ggg4jCo6B%(?f=`?*2Y@WQ^h=I`pP&E#ve~`= zt@9Ru?O0yv{U3z!S%@x2mIFYR3QDRltXR5;;l|^SU^Blw_5oWQ*}j#ekRaIspy1YH zd&CeC9mjC|)L8~gGh>GQ{CtMZ)BZD%YB|W|Ea*W(hz|<>M|ZCLpWai)pdri8Ai~cD zrmY=232DVDPqG6*rhNbQmBH032yUQ)k_yASx3A!QQW#`8KwZzA@#dwID2WXuMvBES zwPZN}q?ud`VHU$^vK;_302@t8JCl(V#n>#PRE*?oNU4SB`bQlw8UmvsFd6~_9s&Rs WwNXz7x8C&t0000<MNUMnLSTZR1e<FB diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-5.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-5.png deleted file mode 100644 index cca3f51863b25f5e08c89bfbaf72d175d517ed13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 379 zcmV->0fhdEP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBLElET{R9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2Kbq zK&<z#EX@B8Qws_;7>0@AqR9#YkY&ggg4jCo6B%(?f=`?*2Y@WQ^h=I`pP&E#ve~`= zt@9Ru?O0yv{U3z!S%@x2mIFYR3QDRltXR5;;l|^SU^Blw_5oWQ*}j#ekRaIspy1YH zd&CeC9mjC|)L8~DE-r@r{CtMZ)BZD%YB|W|Bs%~U{Cw7_4AXn+7&K)08QR<1!L)U9 zCwk}-#b+T(6`G>&-@Y=qdIf<+k4{PevI`jAy?uqIia0LGApkN~UC*2mWFZK%8b*O> zkQi}RqN*Y*1YnLpHHthQ*$%*G9VzWhMp6{xvy@ypveE##mSNL3>VVM@7!85Z5E$?f Z006;VS1Nxb(bNC{002ovPDHLkV1iQtn?e8p diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-6.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-6.png deleted file mode 100644 index 77181b432eb7705116ef567343c6bf0a86185a67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmV-+0g3*JP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBLC`m*?R9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2Kbq zK&<z#EX@B8Qws_;7>0@AqR9#YkY&ggg4jCo6B%(?f=`?*2Y@WQ^h=I`pP&E#ve~`= zt@9Ru?O0yv{U3z!S%@x2mIFYR-gx|xp|Y})0Yrnqm&ZO}izC~&k`xjoI{*~idTfsv zCQh8l@a@|-1}-ixhWz||hRxIdGmvUI$l)YA02KUu)~O8Bd+Hc8WceA|+uOmkb#f=j zJdyzm$vS`<zJL45;OZ3w)_QbO0+3z6@b2v^a*QH91VFZ^>zOlxECgXz!zeHf5+lb2 zWQ73C5#(5iu7_*~pc{nDC#9XqNQz=)OQ^*rITujNVwgFj4j2uA(GVC7fdLNz0Jgna UDxHyz2LJ#707*qoM6N<$f;!NcHvj+t diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-7.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-7.png deleted file mode 100644 index c42784db40c4b06709eef6080e4dbbcdb6aa083e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmV-)0gL{LP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBLCP_p=R9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2Kbq zK&<z#EX@B8Qws_;7>0@AqR9#YkY&ggg4jCo6B%(?f=`?UpCm3hkY&qe_x@j1SNETb zi;JPXeF4MAj~^M9S9-%jfoR8&6#^j3Z#@3U0J8ksw{HxUm6Z%%9{YeTk8IycwB;ZV zlI#FbaO<%>VwgB_BG_`6BQ{U_&p@i>WH|s7{Cw7_4AXn+7&K)0fx+Jnrmd4Zam5&3 zakA3D_itYrT)l$81|OZ20Av?1ynFi!uSK{dNsa=LLF#(uj35g^nAI=}OoPO5S%OcT ztPp@X0-wRe%8~5=d=`+>&SWG-F+NMll_M(+kZTz>eWMN-4S~@R7!82|4*>vUI$V(| SyqyyO0000<MNUMnLSTaG(2|z` diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-8.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-8.png deleted file mode 100644 index 44c7a7e7a20d586d95cc32c8cbf7b7fa774b297e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)R}P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBLJxN4CR9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2Kbq zK&<z#EX@B8Qws_;7>0@AqR9#YkY&ggg4jCo6B%(?f=`?UpCm3hkY&qe_x@j1SNETb zi;JPXeF4MAj~^M9S9-%jfoR8&6#^j3Z#@3U0J8ksw{HxUm6Z%%9{YeTk8IycwB;ZV zlI#FbaO<%>VwgB_BG_`6BQ{U_&p@i>WH|s7{Cw7_4AXn+7&K)0fx+Jnrmd4Zam5&3 zagsv-WZL&{Ul~AA;OZ5`aCA}vn3hw~At~r#t|B=R)<F{<$bffmUoo&6MlrnHGlAhH z0|Qw(fss&?43wYI)xaD9N`RoW0L%d>zDF)S(e=W74x`C(08BGAXo3!)h9&sSAS)5# pGmuodQ3s5Mz-S1JhQNS_0062ka`!I;CoBK}002ovPDHLkV1mrKoyPzG diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-9.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon-9.png deleted file mode 100644 index 250c2ef4884c95cbf4dab1933b9319222648acb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 436 zcmV;l0ZaagP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000kR z000kR0jNKxX#fBLW=TXrR9FdPymRLc!$1P2fwUZC_oxF#Ltr!n27d^ssHo7is2Kbq zK&<z#EX@B8Qws_;7>0@AqR9#YkY&ggg4jCo6B%(?f=`?UpCm3hkY&qe_x@j1SNETb zi;JPXeF4MAj~^M9S9-%jfoR8&6#^j3Z#@3U0J8ksw{HxUm6Z%%9{YeTk8IycwB;ZV zlI#FbaO<%>VwgB_BG_`6BQ{U_&p@i>L^}XEzE|DlXW+9=WtiSm$Dkq04-EcxFm0XO zi7UqNiW8LvKyeOo1jurbkH3HW$^eRj-1J0-qmvRCT)heyM5Pr;3VN8Uh>8M!etvK& zhXwcgZTrFc-@Sdsz-k!9@N&-t2INqJ8BPpMlmmb%oUsm=;wvgD7-5b8(M#8CWiYdK zV*rH^x!I7BP@51`prEVi=;-(lO8reuO=JZ-a>x*L0J36Qu!)KST38G-bJPK&Aut*O eqaiThApih6DTGStABi6T0000<MNUMnLSTZAaI#MT diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/icon.png b/Resources/Textures/Objects/Decoration/ashtray.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c0692ee25d6fbe776f47bb660f5de09cc9b4937b GIT binary patch literal 333 zcmV-T0kZyyP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$2T4RhR9J=Wlrd_<FcgMAgQQJ&2%Q2258e{fEP)1k3!lvQD5N+Auc4R}5-25i z&|)NkI~aop7p&0Iq5446d+&cALI@&}NF?&#Np2a+vaC}|Q4|FLWm#ga<#;>>=LHR< zY1#=Pc-(F$>(Bc=-g}y+nVl;_mOt%w0JLp8*)tOB=1R;K7#162zO5T$&{~H?&KJ;H z^Kv*Kgy3$mnC$tyUh&=sNd(=%!)k?8ir2bk>Je`89A_<Wr_=8UIPW1z*yK4<N<J=^ zUTnR_IoBWWLn7x3)ODQzos^RM<r2CMsZ=j!EzW!1&u5%-L+{TDj3gLD#yIDws_LeH fB@&55B7e#k!OLn4beO+B00000NkvXXu0mjfq$G)7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Decoration/ashtray.rsi/meta.json b/Resources/Textures/Objects/Decoration/ashtray.rsi/meta.json index 9e45b4ede1..7494aa7422 100644 --- a/Resources/Textures/Objects/Decoration/ashtray.rsi/meta.json +++ b/Resources/Textures/Objects/Decoration/ashtray.rsi/meta.json @@ -1,44 +1,44 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Made by joshepvodka", + "copyright": "Made by Hanzdegloker", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "icon-0" + "name": "icon" }, { - "name": "icon-1" + "name": "ashtray1" }, { - "name": "icon-2" + "name": "ashtray2" }, { - "name": "icon-3" + "name": "ashtray3" }, { - "name": "icon-4" + "name": "ashtray4" }, { - "name": "icon-5" + "name": "ashtray5" }, { - "name": "icon-6" + "name": "ashtray6" }, { - "name": "icon-7" + "name": "ashtray7" }, { - "name": "icon-8" + "name": "ashtray8" }, { - "name": "icon-9" + "name": "ashtray9" }, { - "name": "icon-10" + "name": "ashtray10" } ] } From 1e794a30d08d136dc8633f46dd528d6660b94a19 Mon Sep 17 00:00:00 2001 From: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Date: Tue, 22 Apr 2025 15:46:38 -0400 Subject: [PATCH 539/622] Cherry Pick Round-start Solar Variation (#36825) * Roundstart Variation for Solar Panels (#86) * Added roundstart variation for solar panels * Removed HV cable spawner since i don't want to bother with mapping them * Solar Panel Variation Pass Fix (#96) Added a second variation pass for regular solar assemblies, since otherwise they would spawn both it and the broken variety * Reorganized everything to no longer be in the _Moffstation subdirectory * Removed a forgotten tag for Moffstation * Removed the moffstation namespace settings * Update Content.Server/GameTicking/Rules/VariationPass/Components/SolarPanelReplaceVariationPassComponent.cs Co-authored-by: Tayrtahn <tayrtahn@gmail.com> * Update Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/SolarPanelReplacementMarkerComponent.cs Co-authored-by: Tayrtahn <tayrtahn@gmail.com> --------- Co-authored-by: Tayrtahn <tayrtahn@gmail.com> --- .../SolarPanelReplacementMarkerComponent.cs | 7 ++++++ ...SolarPanelReplaceVariationPassComponent.cs | 5 +++++ .../SolarPanelReplaceVariationPassSystem.cs | 11 ++++++++++ .../Structures/Power/Generation/solar.yml | 1 + Resources/Prototypes/GameRules/roundstart.yml | 2 ++ Resources/Prototypes/GameRules/variation.yml | 22 +++++++++++++++++++ 6 files changed, 48 insertions(+) create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/SolarPanelReplacementMarkerComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/SolarPanelReplaceVariationPassComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/SolarPanelReplaceVariationPassSystem.cs diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/SolarPanelReplacementMarkerComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/SolarPanelReplacementMarkerComponent.cs new file mode 100644 index 0000000000..8e6146765d --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/SolarPanelReplacementMarkerComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.GameTicking.Rules.VariationPass.Components.ReplacementMarkers; + +/// <summary> +/// This component marks replaceable solar panels for use with fast queries in variation passes. +/// </summary> +[RegisterComponent] +public sealed partial class SolarPanelReplacementMarkerComponent : Component; diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/SolarPanelReplaceVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/SolarPanelReplaceVariationPassComponent.cs new file mode 100644 index 0000000000..54e07037e3 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/SolarPanelReplaceVariationPassComponent.cs @@ -0,0 +1,5 @@ +namespace Content.Server.GameTicking.Rules.VariationPass.Components; + + +[RegisterComponent] +public sealed partial class SolarPanelReplaceVariationPassComponent : Component; diff --git a/Content.Server/GameTicking/Rules/VariationPass/SolarPanelReplaceVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/SolarPanelReplaceVariationPassSystem.cs new file mode 100644 index 0000000000..041ce32726 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/SolarPanelReplaceVariationPassSystem.cs @@ -0,0 +1,11 @@ +using Content.Server.GameTicking.Rules.VariationPass.Components; +using Content.Server.GameTicking.Rules.VariationPass.Components.ReplacementMarkers; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// <summary> +/// This handles the ability to replace entities marked with <see cref="SolarPanelReplacementMarkerComponent"/> in a variation pass +/// </summary> +public sealed class SolarPanelReplaceVariationPassSystem : BaseEntityReplaceVariationPassSystem<SolarPanelReplacementMarkerComponent, SolarPanelReplaceVariationPassComponent> +{ +} diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml index f4bbf9e686..97802a8696 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/solar.yml @@ -151,6 +151,7 @@ - type: Construction graph: SolarPanel node: solarpanel + - type: SolarPanelReplacementMarker - type: entity id: SolarPanelBroken diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index bb855d93aa..f5730ab00c 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -447,3 +447,5 @@ orGroup: puddleMess - id: SmugglerStashVariationPass prob: 0.90 + - id: SolarPanelDamageVariationPass + - id: SolarPanelEmptyVariationPass diff --git a/Resources/Prototypes/GameRules/variation.yml b/Resources/Prototypes/GameRules/variation.yml index 093a832d72..d080965697 100644 --- a/Resources/Prototypes/GameRules/variation.yml +++ b/Resources/Prototypes/GameRules/variation.yml @@ -123,3 +123,25 @@ blacklist: components: - ParticleAcceleratorControlBox + +- type: entity + id: SolarPanelDamageVariationPass + parent: BaseVariationPass + components: + - type: SolarPanelReplaceVariationPass + - type: EntityReplaceVariationPass + entitiesPerReplacementAverage: 30 + entitiesPerReplacementStdDev: 5 + replacements: + - id: SolarPanelBroken + +- type: entity + id: SolarPanelEmptyVariationPass + parent: BaseVariationPass + components: + - type: SolarPanelReplaceVariationPass + - type: EntityReplaceVariationPass + entitiesPerReplacementAverage: 30 + entitiesPerReplacementStdDev: 5 + replacements: + - id: SolarAssembly From 45938f2fae6554204225c821f3a07d55875ea940 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 19:47:45 +0000 Subject: [PATCH 540/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index afa7c096c1..8cd521ba57 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kickguy223 - changes: - - message: Puddles will now correctly evaporate - type: Fix - id: 7815 - time: '2025-01-15T21:21:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34303 - author: themias changes: - message: The DNA scrambler implant no longer updates your ID card or station record @@ -3918,3 +3911,11 @@ id: 8316 time: '2025-04-22T18:38:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32375 +- author: Southbridge + changes: + - message: Solar Panels can now be randomly damaged or unfinished at the beginning + of the round. + type: Add + id: 8317 + time: '2025-04-22T19:46:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36825 From 6cc53e3e1cd9072228ba128e4256ba17a05176c8 Mon Sep 17 00:00:00 2001 From: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:34:29 -0400 Subject: [PATCH 541/622] Ashtray staticPack fix (#36835) Ashes to Ashes God I love staticPacks --- Resources/Prototypes/Recipes/Lathes/Packs/service.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/service.yml b/Resources/Prototypes/Recipes/Lathes/Packs/service.yml index a50a945291..b3b63009be 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/service.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/service.yml @@ -4,6 +4,7 @@ id: ServiceStatic recipes: - Bucket + - Ashtray - DrinkMug - DrinkMugMetal - DrinkGlass From 37f2c295591e5631c40c6a56785e860bbf44ef7a Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Tue, 22 Apr 2025 17:48:30 -0400 Subject: [PATCH 542/622] Fix warning CS8524 instances (#36837) --- .../CartridgeLoader/Cartridges/NanoTaskItemPopup.xaml.cs | 4 +++- .../CartridgeLoader/Cartridges/NanoTaskUiFragment.xaml.cs | 4 +++- Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml.cs | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Content.Client/CartridgeLoader/Cartridges/NanoTaskItemPopup.xaml.cs b/Content.Client/CartridgeLoader/Cartridges/NanoTaskItemPopup.xaml.cs index 124b7b7eaa..6bb29a8f4d 100644 --- a/Content.Client/CartridgeLoader/Cartridges/NanoTaskItemPopup.xaml.cs +++ b/Content.Client/CartridgeLoader/Cartridges/NanoTaskItemPopup.xaml.cs @@ -90,10 +90,12 @@ public sealed partial class NanoTaskItemPopup : DefaultWindow { if (item is NanoTaskItem task) { - var button = task.Priority switch { + var button = task.Priority switch + { NanoTaskPriority.High => HighButton, NanoTaskPriority.Medium => MediumButton, NanoTaskPriority.Low => LowButton, + _ => throw new ArgumentException("Invalid priority"), }; button.Pressed = true; DescriptionInput.Text = task.Description; diff --git a/Content.Client/CartridgeLoader/Cartridges/NanoTaskUiFragment.xaml.cs b/Content.Client/CartridgeLoader/Cartridges/NanoTaskUiFragment.xaml.cs index 38897d6205..e7ed35eac1 100644 --- a/Content.Client/CartridgeLoader/Cartridges/NanoTaskUiFragment.xaml.cs +++ b/Content.Client/CartridgeLoader/Cartridges/NanoTaskUiFragment.xaml.cs @@ -38,10 +38,12 @@ public sealed partial class NanoTaskUiFragment : BoxContainer foreach (var task in tasks) { - var container = task.Data.Priority switch { + var container = task.Data.Priority switch + { NanoTaskPriority.High => HighContainer, NanoTaskPriority.Medium => MediumContainer, NanoTaskPriority.Low => LowContainer, + _ => throw new ArgumentException("Invalid priority"), }; var control = new NanoTaskItemControl(task); container.AddChild(control); diff --git a/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml.cs b/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml.cs index 8ef94c45df..f687f80073 100644 --- a/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml.cs +++ b/Content.Client/Xenoarchaeology/Ui/NodeScannerDisplay.xaml.cs @@ -80,7 +80,8 @@ public sealed partial class NodeScannerDisplay : FancyWindow ArtifactState.None => "\u2800", // placeholder for line to not be squeezed ArtifactState.Ready => Loc.GetString("node-scanner-artifact-state-ready"), ArtifactState.Unlocking => Loc.GetString("node-scanner-artifact-state-unlocking"), - ArtifactState.Cooldown => Loc.GetString("node-scanner-artifact-state-cooldown") + ArtifactState.Cooldown => Loc.GetString("node-scanner-artifact-state-cooldown"), + _ => throw new ArgumentException("Invalid state"), }; } } From 14b5496c330eec7f9a611a9bf5cdbf4f13cd500c Mon Sep 17 00:00:00 2001 From: catlord <catlord0009@gmail.com> Date: Tue, 22 Apr 2025 18:04:20 -0400 Subject: [PATCH 543/622] Update MinorAntagonists.xml (#36836) --- Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml index a938cc4040..59c7cb9bc3 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml @@ -70,5 +70,5 @@ Slimes and spiders have no remarkable features, but will [color=cyan]infest the station[/color] from time to time regardless. Both will give chase and attack anything they see. - Slimes may [bold]deal extra cellular or poison damage[/bold], based upon their color. Water hurts them just as it would hurt a slime person. - - Spiders have a venomous bite and can [bold]create webs[/bold] that are hard to move though. Webs are easily destroyed with a blade. They can also pry open airlocks. + - Spiders have a venomous bite and can [bold]create webs[/bold] that are hard to move though. Webs are easily destroyed with a blade. They can also pry open doors, windoors, and airlocks. </Document> From 4fa808ace513a38cae9744ebfb50ce1b71f38178 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:20:45 -0400 Subject: [PATCH 544/622] Simulate command in minutes for real (#36808) * 60 --- .../StationEvents/BasicStationEventSchedulerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs b/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs index 06289618f7..a2781e27a3 100644 --- a/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs +++ b/Content.Server/StationEvents/BasicStationEventSchedulerSystem.cs @@ -121,7 +121,7 @@ namespace Content.Server.StationEvents for (var i = 0; i < rounds; i++) { var curTime = TimeSpan.Zero; - var randomEndTime = _random.NextGaussian(roundEndMean, roundEndStdDev); // Its in minutes, should probably be a better time format once we get that in toolshed like [hh:mm:ss] + var randomEndTime = _random.NextGaussian(roundEndMean, roundEndStdDev) * 60; // Its in minutes, should probably be a better time format once we get that in toolshed like [hh:mm:ss] if (randomEndTime <= 0) continue; From 441083e906b5cc4b800b747ab3d1ac6423417728 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Tue, 22 Apr 2025 19:36:49 -0400 Subject: [PATCH 545/622] Fix warning CS0414 instances (#36832) Fix warning cs0414 instances --- Content.Shared/Clothing/MagbootsSystem.cs | 2 -- Content.Shared/CombatMode/SharedCombatModeSystem.cs | 1 - Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs | 2 -- Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs | 2 -- .../Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs | 1 - Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs | 1 - Content.Shared/VendingMachines/SharedVendingMachineSystem.cs | 1 - Content.Shared/Wieldable/SharedWieldableSystem.cs | 1 - 8 files changed, 11 deletions(-) diff --git a/Content.Shared/Clothing/MagbootsSystem.cs b/Content.Shared/Clothing/MagbootsSystem.cs index de39fd9dca..fd5a2cc336 100644 --- a/Content.Shared/Clothing/MagbootsSystem.cs +++ b/Content.Shared/Clothing/MagbootsSystem.cs @@ -14,12 +14,10 @@ namespace Content.Shared.Clothing; public sealed class SharedMagbootsSystem : EntitySystem { [Dependency] private readonly AlertsSystem _alerts = default!; - [Dependency] private readonly ClothingSystem _clothing = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly ItemToggleSystem _toggle = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; - [Dependency] private readonly SharedItemSystem _item = default!; public override void Initialize() { diff --git a/Content.Shared/CombatMode/SharedCombatModeSystem.cs b/Content.Shared/CombatMode/SharedCombatModeSystem.cs index bb3ab712eb..af7bb9fefe 100644 --- a/Content.Shared/CombatMode/SharedCombatModeSystem.cs +++ b/Content.Shared/CombatMode/SharedCombatModeSystem.cs @@ -11,7 +11,6 @@ namespace Content.Shared.CombatMode; public abstract class SharedCombatModeSystem : EntitySystem { [Dependency] protected readonly IGameTiming Timing = default!; - [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedMindSystem _mind = default!; diff --git a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs index 256a5ec2a9..779ad18789 100644 --- a/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs +++ b/Content.Shared/Inventory/VirtualItem/SharedVirtualItemSystem.cs @@ -26,8 +26,6 @@ namespace Content.Shared.Inventory.VirtualItem; /// </remarks> public abstract class SharedVirtualItemSystem : EntitySystem { - [Dependency] private readonly INetManager _netManager = default!; - [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; [Dependency] private readonly SharedItemSystem _itemSystem = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; diff --git a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs index e63c6ac7b7..b7ceba6ee9 100644 --- a/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs +++ b/Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs @@ -24,8 +24,6 @@ namespace Content.Shared.Radio.EntitySystems; public sealed partial class EncryptionKeySystem : EntitySystem { [Dependency] private readonly IPrototypeManager _protoManager = default!; - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedToolSystem _tool = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedContainerSystem _container = default!; diff --git a/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs b/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs index 8caf1c39a6..d647b3c1e6 100644 --- a/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs +++ b/Content.Shared/Research/TechnologyDisk/Systems/TechnologyDiskSystem.cs @@ -15,7 +15,6 @@ namespace Content.Shared.Research.TechnologyDisk.Systems; public sealed class TechnologyDiskSystem : EntitySystem { - [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; diff --git a/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs b/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs index 7545323546..a99a12d0fd 100644 --- a/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs +++ b/Content.Shared/Traits/Assorted/PermanentBlindnessSystem.cs @@ -11,7 +11,6 @@ namespace Content.Shared.Traits.Assorted; /// </summary> public sealed class PermanentBlindnessSystem : EntitySystem { - [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly BlindableSystem _blinding = default!; /// <inheritdoc/> diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs index d44e00c599..22b8d18674 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs @@ -22,7 +22,6 @@ namespace Content.Shared.VendingMachines; public abstract partial class SharedVendingMachineSystem : EntitySystem { [Dependency] protected readonly IGameTiming Timing = default!; - [Dependency] private readonly INetManager _net = default!; [Dependency] protected readonly IPrototypeManager PrototypeManager = default!; [Dependency] private readonly AccessReaderSystem _accessReader = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; diff --git a/Content.Shared/Wieldable/SharedWieldableSystem.cs b/Content.Shared/Wieldable/SharedWieldableSystem.cs index d3b8c4e4c6..2e50c655fc 100644 --- a/Content.Shared/Wieldable/SharedWieldableSystem.cs +++ b/Content.Shared/Wieldable/SharedWieldableSystem.cs @@ -31,7 +31,6 @@ public abstract class SharedWieldableSystem : EntitySystem { [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedGunSystem _gun = default!; From 7e63b397cfde262c63e5303c2461486ca4e3edc2 Mon Sep 17 00:00:00 2001 From: poklj <compgeek223@gmail.com> Date: Tue, 22 Apr 2025 20:53:42 -0300 Subject: [PATCH 546/622] Nerf Firelock electronic prices (#33469) * Nerf Firelock electronic prices - make firelock electronics price half of the input cost to make one (27) rounded up * Why does firelock make glass? - remove the Physical composition of glass from FirelockElectronics as the input does not contain glass and the output cannot contain half a steel and plastic --------- Co-authored-by: Milon <milonpl.git@proton.me> --- .../Entities/Objects/Devices/Electronics/firelock.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/firelock.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/firelock.yml index c7fa8f9ecd..ff576ad285 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/firelock.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/firelock.yml @@ -13,4 +13,9 @@ tags: - FirelockElectronics - type: StaticPrice - price: 61 + price: 14 + - type: PhysicalComposition + materialComposition: + Glass: 0 + chemicalComposition: + Silicon: 20 From 0256fb5a4f0c5216afe74c5d579c281d89fc6933 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Tue, 22 Apr 2025 23:54:48 +0000 Subject: [PATCH 547/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8cd521ba57..7222ccba2a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: themias - changes: - - message: The DNA scrambler implant no longer updates your ID card or station record - type: Fix - id: 7816 - time: '2025-01-15T22:49:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34091 - author: jbox144 changes: - message: Added Plasma Station @@ -3919,3 +3912,11 @@ id: 8317 time: '2025-04-22T19:46:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36825 +- author: Kickguy223 + changes: + - message: Reduced the price of firelock electronics to half the price of the input + materials + type: Tweak + id: 8318 + time: '2025-04-22T23:53:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33469 From db922024be54c02566caf080b563c5de9f330ff6 Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:25:12 -0700 Subject: [PATCH 548/622] Give Admins "Tails" (#36842) One line yaml change --- Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 03fc16407c..ce4fc4ded0 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -24,6 +24,7 @@ - type: Hands - type: ComplexInteraction - type: Puller + needsHands: false - type: CombatMode - type: Physics ignorePaused: true From 00af8f96f62d0cbaacad029574327819c7b9d123 Mon Sep 17 00:00:00 2001 From: Vladislav Suchkov <20380250+murolem@users.noreply.github.com> Date: Wed, 23 Apr 2025 11:58:42 +1000 Subject: [PATCH 549/622] Fix construction orientation being ignored for some objects (#36488) * fixes * removed empty "SnapToGrid"s and parent "completed"s --- .../Construction/Graphs/structures/fence_metal.yml | 12 ------------ .../Construction/Graphs/structures/girder.yml | 3 --- .../Graphs/structures/grille_diagonal.yml | 6 ------ 3 files changed, 21 deletions(-) diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/fence_metal.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/fence_metal.yml index a68e1d50fb..444c327fdc 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/fence_metal.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/fence_metal.yml @@ -7,33 +7,21 @@ - !type:DeleteEntity { } edges: - to: straight - completed: - - !type:SnapToGrid - southRotation: true steps: - material: MetalRod amount: 5 doAfter: 6 - to: corner - completed: - - !type:SnapToGrid - southRotation: true steps: - material: MetalRod amount: 5 doAfter: 6 - to: end - completed: - - !type:SnapToGrid - southRotation: true steps: - material: MetalRod amount: 5 doAfter: 6 - to: gate - completed: - - !type:SnapToGrid - southRotation: true steps: - material: MetalRod amount: 5 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml index fb783e0da5..7c0c7269db 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/girder.yml @@ -271,9 +271,6 @@ doAfter: 1 - to: diagonalshuttleWall - completed: - - !type:SnapToGrid - southRotation: false conditions: - !type:EntityAnchored { } steps: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/grille_diagonal.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/grille_diagonal.yml index d24656faa5..6c32b96801 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/grille_diagonal.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/grille_diagonal.yml @@ -5,18 +5,12 @@ - node: start edges: - to: grilleDiagonal - completed: - - !type:SnapToGrid - southRotation: true steps: - material: MetalRod amount: 2 doAfter: 1 - to: clockworkGrilleDiagonal - completed: - - !type:SnapToGrid - southRotation: true steps: - material: MetalRod amount: 2 From bfe18059f10b111ac9c2974085265e84f473c856 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Wed, 23 Apr 2025 01:59:49 +0000 Subject: [PATCH 550/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7222ccba2a..80b6575a2b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: jbox144 - changes: - - message: Added Plasma Station - type: Add - id: 7817 - time: '2025-01-16T07:02:14.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33991 - author: jbox144 changes: - message: Reduced Plasma's minimum population to 20, maximum population to 60 @@ -3920,3 +3913,11 @@ id: 8318 time: '2025-04-22T23:53:42.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33469 +- author: murolem + changes: + - message: Building orientation on fences, diagonal grilles and the diagonal shuttle + wall is now respected. + type: Fix + id: 8319 + time: '2025-04-23T01:58:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36488 From 638ee7aa2cdb355a4a4259585870bf57b573375d Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Wed, 23 Apr 2025 06:42:08 +0200 Subject: [PATCH 551/622] elemental.yml & asteroid.yml cleanup (#36448) --- .../Entities/Mobs/NPCs/elemental.yml | 8 +- .../Entities/Structures/Walls/asteroid.yml | 3047 ++++++++--------- 2 files changed, 1505 insertions(+), 1550 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index 1a2c134607..4b3b4dea6d 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -106,6 +106,7 @@ parent: MobOreCrab id: MobQuartzCrab description: An ore crab made from Quartz. + suffix: Quartz components: - type: Sprite state: quartz_crab @@ -130,6 +131,7 @@ parent: MobOreCrab id: MobIronCrab description: An ore crab made from iron. + suffix: Iron components: - type: Sprite state: iron_crab @@ -161,6 +163,7 @@ parent: MobOreCrab id: MobCoalCrab description: An ore crab made from coal. + suffix: Coal components: - type: Sprite state: coal_crab @@ -192,6 +195,7 @@ parent: MobOreCrab id: MobUraniumCrab description: An ore crab made from uranium. + suffix: Uranium components: - type: FactionException - type: NPCRetaliation @@ -226,8 +230,8 @@ - type: entity parent: MobOreCrab id: MobSilverCrab - name: ore crab description: An ore crab made from silver. + suffix: Silver components: - type: Sprite state: silver_crab @@ -255,8 +259,8 @@ - type: entity parent: MobOreCrab id: MobGoldCrab - name: ore crab description: An ore crab made from gold. + suffix: Gold components: - type: Sprite state: gold_crab diff --git a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml index e83b4c5f07..85c011ce11 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml @@ -22,15 +22,15 @@ - type: Sprite sprite: Structures/Walls/rock.rsi layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west - type: MiningScannerViewable - type: Damageable damageContainer: StructuralInorganic @@ -56,45 +56,30 @@ description: An ore vein rich with coal. suffix: Coal components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoal - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreCoal + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockCoalCrab - parent: AsteroidRock - description: An ore vein rich with coal. + parent: AsteroidRockCoal suffix: Coal Crab components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoalCrab - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + currentOre: OreCoalCrab - type: entity id: AsteroidRockGold @@ -102,45 +87,30 @@ description: An ore vein rich with gold. suffix: Gold components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGold - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockGoldCrab - parent: AsteroidRock - description: An ore vein rich with gold. + parent: AsteroidRockGold suffix: Gold Crab components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGoldCrab - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + currentOre: OreGoldCrab - type: entity id: AsteroidRockDiamond @@ -148,22 +118,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockPlasma @@ -171,22 +141,21 @@ description: An ore vein rich with plasma. suffix: Plasma components: - - type: OreVein - oreChance: 1.0 - currentOre: OrePlasma - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + currentOre: OrePlasma + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockQuartz @@ -194,45 +163,30 @@ description: An ore vein rich with quartz. suffix: Quartz components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSpaceQuartz - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockQuartzCrab - parent: AsteroidRock - description: An ore vein rich with quartz. + parent: AsteroidRockQuartz suffix: Quartz Crab components: - - type: OreVein - oreChance: 1.0 - currentOre: OreQuartzCrab - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + currentOre: OreQuartzCrab - type: entity id: AsteroidRockSilver @@ -240,31 +194,30 @@ description: An ore vein rich with silver. suffix: Silver components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilver - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockSilverCrab parent: AsteroidRockSilver suffix: Silver Crab components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilverCrab + - type: OreVein + currentOre: OreSilverCrab # Yes I know it drops steel but we may get smelting at some point - type: entity @@ -273,31 +226,30 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockTinCrab parent: AsteroidRockTin suffix: Iron Crab components: - - type: OreVein - oreChance: 1.0 - currentOre: OreIronCrab + - type: OreVein + currentOre: OreIronCrab - type: entity id: AsteroidRockUranium @@ -305,31 +257,30 @@ description: An ore vein rich with uranium. suffix: Uranium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUranium - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockUraniumCrab parent: AsteroidRockUranium suffix: Uranium Crab components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUraniumCrab + - type: OreVein + currentOre: OreUraniumCrab - type: entity id: AsteroidRockBananium @@ -337,22 +288,22 @@ description: An ore vein rich with bananium. suffix: Bananium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreBananium - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreBananium + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockSalt @@ -360,22 +311,22 @@ description: An ore vein rich with salt. suffix: Salt components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSalt - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSalt + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockArtifactFragment @@ -383,22 +334,22 @@ description: A rock wall. What's that sticking out of it? suffix: Artifact Fragment components: - - type: OreVein - oreChance: 1.0 - currentOre: OreArtifactFragment - - type: Sprite - layers: - - state: rock_asteroid - - map: [ "enum.EdgeLayer.South" ] - state: rock_asteroid_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_asteroid_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_asteroid_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_asteroid_west - - state: rock_artifact_fragment - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreArtifactFragment + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_artifact_fragment + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: AsteroidRockMining @@ -428,15 +379,15 @@ - type: Sprite sprite: Structures/Walls/rock.rsi layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west - type: entity id: IronRockMining @@ -456,22 +407,22 @@ description: An ore vein rich with coal. suffix: Coal components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoal - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreCoal + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockGold @@ -479,22 +430,22 @@ description: An ore vein rich with gold. suffix: Gold components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGold - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockPlasma @@ -502,22 +453,22 @@ description: An ore vein rich with plasma. suffix: Plasma components: - - type: OreVein - oreChance: 1.0 - currentOre: OrePlasma - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OrePlasma + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockQuartz @@ -525,22 +476,22 @@ description: An ore vein rich with quartz. suffix: Quartz components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSpaceQuartz - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockSilver @@ -548,22 +499,22 @@ description: An ore vein rich with silver. suffix: Silver components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilver - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockIron @@ -571,22 +522,22 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockUranium @@ -594,22 +545,22 @@ description: An ore vein rich with uranium. suffix: Uranium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUranium - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockBananium @@ -617,22 +568,22 @@ description: An ore vein rich with bananium. suffix: Bananium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreBananium - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreBananium + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockSalt @@ -640,22 +591,22 @@ description: An ore vein rich with salt. suffix: Salt components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSalt - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSalt + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: IronRockArtifactFragment @@ -686,22 +637,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: ironrock - - map: [ "enum.EdgeLayer.South" ] - state: ironrock_south - - map: [ "enum.EdgeLayer.East" ] - state: ironrock_east - - map: [ "enum.EdgeLayer.North" ] - state: ironrock_north - - map: [ "enum.EdgeLayer.West" ] - state: ironrock_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: ironrock + - map: [ "enum.EdgeLayer.South" ] + state: ironrock_south + - map: [ "enum.EdgeLayer.East" ] + state: ironrock_east + - map: [ "enum.EdgeLayer.North" ] + state: ironrock_north + - map: [ "enum.EdgeLayer.West" ] + state: ironrock_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] # Rocks and ore veins - type: entity @@ -710,44 +661,44 @@ name: rock suffix: planetmap components: - - type: Transform - noRot: true - - type: SoundOnGather - - type: Gatherable - toolWhitelist: - tags: - - Pickaxe - - type: Damageable - damageContainer: StructuralInorganic - damageModifierSet: Metallic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 150 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - type: IconSmooth - key: walls - mode: NoSprite - - type: Icon - sprite: Structures/Walls/rock.rsi - state: rock - - type: MiningScannerViewable - - type: SmoothEdge - - type: Sprite - sprite: Structures/Walls/rock.rsi - layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west + - type: Transform + noRot: true + - type: SoundOnGather + - type: Gatherable + toolWhitelist: + tags: + - Pickaxe + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 150 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: IconSmooth + key: walls + mode: NoSprite + - type: Icon + sprite: Structures/Walls/rock.rsi + state: rock + - type: MiningScannerViewable + - type: SmoothEdge + - type: Sprite + sprite: Structures/Walls/rock.rsi + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west # Ore veins - type: entity @@ -768,17 +719,17 @@ currentOre: OreCoal - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockGold @@ -798,17 +749,17 @@ currentOre: OreGold - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockDiamond @@ -816,22 +767,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockPlasma @@ -851,17 +802,17 @@ currentOre: OrePlasma - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockQuartz @@ -881,17 +832,17 @@ currentOre: OreSpaceQuartz - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSilver @@ -911,17 +862,17 @@ currentOre: OreSilver - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] # Yes I know it drops steel but we may get smelting at some point - type: entity @@ -930,29 +881,29 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: EntityRemap - mask: - AsteroidRock: AsteroidRockTin - WallRockBasalt: WallRockBasaltTin - WallRockChromite: WallRockChromiteTin - WallRockSand: WallRockSandTin - WallRockSnow: WallRockSnowTin - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: EntityRemap + mask: + AsteroidRock: AsteroidRockTin + WallRockBasalt: WallRockBasaltTin + WallRockChromite: WallRockChromiteTin + WallRockSand: WallRockSandTin + WallRockSnow: WallRockSnowTin + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockUranium @@ -972,17 +923,17 @@ currentOre: OreUranium - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity @@ -1003,17 +954,17 @@ currentOre: OreBananium - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockArtifactFragment @@ -1033,17 +984,17 @@ currentOre: OreArtifactFragment - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_artifact_fragment - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_artifact_fragment + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSalt @@ -1063,17 +1014,17 @@ currentOre: OreSalt - type: Sprite layers: - - state: rock - - map: [ "enum.EdgeLayer.South" ] - state: rock_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - state: rock + - map: [ "enum.EdgeLayer.South" ] + state: rock_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] # Basalt variants - type: entity @@ -1081,21 +1032,21 @@ name: basalt parent: WallRock components: - - type: Icon - sprite: Structures/Walls/rock.rsi - state: rock_wall - - type: Sprite - sprite: Structures/Walls/rock.rsi - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west + - type: Icon + sprite: Structures/Walls/rock.rsi + state: rock_wall + - type: Sprite + sprite: Structures/Walls/rock.rsi + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west - type: entity id: WallRockBasaltCoal @@ -1103,22 +1054,22 @@ description: An ore vein rich with coal. suffix: Coal components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoal - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreCoal + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltGold @@ -1126,22 +1077,22 @@ description: An ore vein rich with gold. suffix: Gold components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGold - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltDiamond @@ -1149,22 +1100,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltPlasma @@ -1172,22 +1123,22 @@ description: An ore vein rich with plasma. suffix: Plasma components: - - type: OreVein - oreChance: 1.0 - currentOre: OrePlasma - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OrePlasma + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltQuartz @@ -1195,22 +1146,22 @@ description: An ore vein rich with quartz. suffix: Quartz components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSpaceQuartz - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltSilver @@ -1218,22 +1169,22 @@ description: An ore vein rich with silver. suffix: Silver components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilver - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltTin @@ -1241,22 +1192,22 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltUranium @@ -1264,22 +1215,22 @@ description: An ore vein rich with uranium. suffix: Uranium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUranium - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity @@ -1288,22 +1239,22 @@ description: An ore vein rich with bananium. suffix: Bananium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreBananium - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreBananium + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltArtifactFragment @@ -1311,22 +1262,22 @@ description: A rock wall. What's that sticking out of it? suffix: Artifact Fragment components: - - type: OreVein - oreChance: 1.0 - currentOre: OreArtifactFragment - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_artifact_fragment - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreArtifactFragment + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_artifact_fragment + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockBasaltSalt @@ -1334,22 +1285,22 @@ description: An ore vein rich with salt. suffix: Salt components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSalt - - type: Sprite - layers: - - state: rock_wall - - map: [ "enum.EdgeLayer.South" ] - state: rock_wall_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_wall_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_wall_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_wall_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSalt + - type: Sprite + layers: + - state: rock_wall + - map: [ "enum.EdgeLayer.South" ] + state: rock_wall_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_wall_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_wall_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_wall_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] # Snow variants - type: entity @@ -1357,21 +1308,21 @@ name: snowdrift parent: WallRock components: - - type: Icon - sprite: Structures/Walls/rock.rsi - state: rock_snow - - type: Sprite - sprite: Structures/Walls/rock.rsi - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west + - type: Icon + sprite: Structures/Walls/rock.rsi + state: rock_snow + - type: Sprite + sprite: Structures/Walls/rock.rsi + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west - type: entity id: WallRockSnowCoal @@ -1379,22 +1330,22 @@ description: An ore vein rich with coal. suffix: Coal components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoal - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreCoal + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowGold @@ -1402,22 +1353,22 @@ description: An ore vein rich with gold. suffix: Gold components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGold - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowDiamond @@ -1425,22 +1376,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowPlasma @@ -1448,22 +1399,22 @@ description: An ore vein rich with plasma. suffix: Plasma components: - - type: OreVein - oreChance: 1.0 - currentOre: OrePlasma - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OrePlasma + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowQuartz @@ -1471,22 +1422,22 @@ description: An ore vein rich with quartz. suffix: Quartz components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSpaceQuartz - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowSilver @@ -1494,22 +1445,22 @@ description: An ore vein rich with silver. suffix: Silver components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilver - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowTin @@ -1517,22 +1468,22 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowUranium @@ -1540,22 +1491,22 @@ description: An ore vein rich with uranium. suffix: Uranium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUranium - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity @@ -1564,22 +1515,22 @@ description: An ore vein rich with bananium. suffix: Bananium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreBananium - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreBananium + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowArtifactFragment @@ -1587,22 +1538,22 @@ description: A rock wall. What's that sticking out of it? suffix: Artifact Fragment components: - - type: OreVein - oreChance: 1.0 - currentOre: OreArtifactFragment - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_artifact_fragment - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreArtifactFragment + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_artifact_fragment + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSnowSalt @@ -1610,22 +1561,22 @@ description: An ore vein rich with salt. suffix: Salt components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSalt - - type: Sprite - layers: - - state: rock_snow - - map: [ "enum.EdgeLayer.South" ] - state: rock_snow_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_snow_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_snow_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_snow_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSalt + - type: Sprite + layers: + - state: rock_snow + - map: [ "enum.EdgeLayer.South" ] + state: rock_snow_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_snow_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_snow_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_snow_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] # Sand variants - type: entity @@ -1633,21 +1584,21 @@ name: sandstone parent: WallRock components: - - type: Icon - sprite: Structures/Walls/rock.rsi - state: rock_sand - - type: Sprite - sprite: Structures/Walls/rock.rsi - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west + - type: Icon + sprite: Structures/Walls/rock.rsi + state: rock_sand + - type: Sprite + sprite: Structures/Walls/rock.rsi + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west - type: entity id: WallRockSandCoal @@ -1655,22 +1606,22 @@ description: An ore vein rich with coal. suffix: Coal components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoal - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreCoal + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandGold @@ -1678,22 +1629,22 @@ description: An ore vein rich with gold. suffix: Gold components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGold - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandDiamond @@ -1701,22 +1652,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandPlasma @@ -1724,22 +1675,22 @@ description: An ore vein rich with plasma. suffix: Plasma components: - - type: OreVein - oreChance: 1.0 - currentOre: OrePlasma - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OrePlasma + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandQuartz @@ -1747,22 +1698,22 @@ description: An ore vein rich with quartz. suffix: Quartz components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSpaceQuartz - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandSilver @@ -1770,22 +1721,22 @@ description: An ore vein rich with silver. suffix: Silver components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilver - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandTin @@ -1793,22 +1744,22 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandUranium @@ -1816,22 +1767,22 @@ description: An ore vein rich with uranium. suffix: Uranium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUranium - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandBananium @@ -1839,22 +1790,22 @@ description: An ore vein rich with bananium. suffix: Bananium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreBananium - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreBananium + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandArtifactFragment @@ -1862,22 +1813,22 @@ description: A rock wall. What's that sticking out of it? suffix: Artifact Fragment components: - - type: OreVein - oreChance: 1.0 - currentOre: OreArtifactFragment - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_artifact_fragment - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreArtifactFragment + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_artifact_fragment + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockSandSalt @@ -1885,22 +1836,22 @@ description: An ore vein rich with salt. suffix: Salt components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSalt - - type: Sprite - layers: - - state: rock_sand - - map: [ "enum.EdgeLayer.South" ] - state: rock_sand_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_sand_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_sand_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_sand_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSalt + - type: Sprite + layers: + - state: rock_sand + - map: [ "enum.EdgeLayer.South" ] + state: rock_sand_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_sand_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_sand_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_sand_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] # Chromite variants - type: entity @@ -1908,21 +1859,21 @@ name: chromite parent: WallRock components: - - type: Icon - sprite: Structures/Walls/rock.rsi - state: rock_chromite - - type: Sprite - sprite: Structures/Walls/rock.rsi - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west + - type: Icon + sprite: Structures/Walls/rock.rsi + state: rock_chromite + - type: Sprite + sprite: Structures/Walls/rock.rsi + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west - type: entity id: WallRockChromiteCoal @@ -1930,22 +1881,22 @@ description: An ore vein rich with coal. suffix: Coal components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoal - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreCoal + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteGold @@ -1953,22 +1904,22 @@ description: An ore vein rich with gold. suffix: Gold components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGold - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteDiamond @@ -1976,22 +1927,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromitePlasma @@ -1999,22 +1950,22 @@ description: An ore vein rich with plasma. suffix: Plasma components: - - type: OreVein - oreChance: 1.0 - currentOre: OrePlasma - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OrePlasma + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteQuartz @@ -2022,22 +1973,22 @@ description: An ore vein rich with quartz. suffix: Quartz components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSpaceQuartz - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteSilver @@ -2045,22 +1996,22 @@ description: An ore vein rich with silver. suffix: Silver components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilver - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteTin @@ -2068,22 +2019,22 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteUranium @@ -2091,22 +2042,22 @@ description: An ore vein rich with uranium. suffix: Uranium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUranium - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity @@ -2115,22 +2066,22 @@ description: An ore vein rich with bananium. suffix: Bananium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreBananium - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreBananium + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteArtifactFragment @@ -2138,22 +2089,22 @@ description: A rock wall. What's that sticking out of it? suffix: Artifact Fragment components: - - type: OreVein - oreChance: 1.0 - currentOre: OreArtifactFragment - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_artifact_fragment - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreArtifactFragment + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_artifact_fragment + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockChromiteSalt @@ -2161,22 +2112,22 @@ description: An ore vein rich with salt. suffix: Salt components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSalt - - type: Sprite - layers: - - state: rock_chromite - - map: [ "enum.EdgeLayer.South" ] - state: rock_chromite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_chromite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_chromite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_chromite_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSalt + - type: Sprite + layers: + - state: rock_chromite + - map: [ "enum.EdgeLayer.South" ] + state: rock_chromite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_chromite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_chromite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_chromite_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] # Andesite variants - type: entity @@ -2184,21 +2135,21 @@ name: andesite parent: WallRock components: - - type: Icon - sprite: Structures/Walls/rock.rsi - state: rock_andesite - - type: Sprite - sprite: Structures/Walls/rock.rsi - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west + - type: Icon + sprite: Structures/Walls/rock.rsi + state: rock_andesite + - type: Sprite + sprite: Structures/Walls/rock.rsi + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west - type: entity id: WallRockAndesiteCoal @@ -2206,22 +2157,22 @@ description: An ore vein rich with coal. suffix: Coal components: - - type: OreVein - oreChance: 1.0 - currentOre: OreCoal - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_coal - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreCoal + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteGold @@ -2229,22 +2180,22 @@ description: An ore vein rich with gold. suffix: Gold components: - - type: OreVein - oreChance: 1.0 - currentOre: OreGold - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_gold - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreGold + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteDiamond @@ -2252,22 +2203,22 @@ description: An ore vein rich with diamonds. suffix: Diamond components: - - type: OreVein - oreChance: 1.0 - currentOre: OreDiamond - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_diamond - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreDiamond + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_diamond + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesitePlasma @@ -2275,22 +2226,22 @@ description: An ore vein rich with plasma. suffix: Plasma components: - - type: OreVein - oreChance: 1.0 - currentOre: OrePlasma - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_phoron - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OrePlasma + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_phoron + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteQuartz @@ -2298,22 +2249,22 @@ description: An ore vein rich with quartz. suffix: Quartz components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSpaceQuartz - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_quartz - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSpaceQuartz + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_quartz + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteSilver @@ -2321,22 +2272,22 @@ description: An ore vein rich with silver. suffix: Silver components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSilver - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_silver - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSilver + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_silver + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteTin @@ -2344,22 +2295,22 @@ description: An ore vein rich with iron. suffix: Iron components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSteel - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_tin - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSteel + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_tin + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteUranium @@ -2367,22 +2318,22 @@ description: An ore vein rich with uranium. suffix: Uranium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreUranium - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_uranium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreUranium + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_uranium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity @@ -2391,22 +2342,22 @@ description: An ore vein rich with bananium. suffix: Bananium components: - - type: OreVein - oreChance: 1.0 - currentOre: OreBananium - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_bananium - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreBananium + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_bananium + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteArtifactFragment @@ -2414,22 +2365,22 @@ description: A rock wall. What's that sticking out of it? suffix: Artifact Fragment components: - - type: OreVein - oreChance: 1.0 - currentOre: OreArtifactFragment - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_artifact_fragment - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreArtifactFragment + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_artifact_fragment + map: [ "enum.MiningScannerVisualLayers.Overlay" ] - type: entity id: WallRockAndesiteSalt @@ -2437,19 +2388,19 @@ description: An ore vein rich with salt. suffix: Salt components: - - type: OreVein - oreChance: 1.0 - currentOre: OreSalt - - type: Sprite - layers: - - state: rock_andesite - - map: [ "enum.EdgeLayer.South" ] - state: rock_andesite_south - - map: [ "enum.EdgeLayer.East" ] - state: rock_andesite_east - - map: [ "enum.EdgeLayer.North" ] - state: rock_andesite_north - - map: [ "enum.EdgeLayer.West" ] - state: rock_andesite_west - - state: rock_salt - map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: OreVein + oreChance: 1.0 + currentOre: OreSalt + - type: Sprite + layers: + - state: rock_andesite + - map: [ "enum.EdgeLayer.South" ] + state: rock_andesite_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_andesite_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_andesite_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_andesite_west + - state: rock_salt + map: [ "enum.MiningScannerVisualLayers.Overlay" ] From 2076e8b02de9371f1240ad2c92d69ff126a88ce6 Mon Sep 17 00:00:00 2001 From: kosticia <kosticia46@gmail.com> Date: Wed, 23 Apr 2025 08:36:54 +0300 Subject: [PATCH 552/622] Moth-pockets (#34517) Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Random/Food_Drinks/donkpocketbox.yml | 1 + .../Consumable/Food/Baked/donkpocket.yml | 43 +++++ .../Consumable/Food/Containers/box.yml | 14 ++ .../Entities/Objects/Decoration/present.yml | 2 + .../Recipes/Cooking/meal_recipes.yml | 7 + .../Food/Baked/donkpocket.rsi/meta.json | 152 +++++++++--------- .../Food/Baked/donkpocket.rsi/moth-box.png | Bin 0 -> 502 bytes .../Food/Baked/donkpocket.rsi/moth.png | Bin 0 -> 403 bytes 8 files changed, 146 insertions(+), 73 deletions(-) create mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/moth-box.png create mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/moth.png diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml index fb52cd1c40..05ad0ba725 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml @@ -18,5 +18,6 @@ - FoodBoxDonkpocketBerry - FoodBoxDonkpocketHonk - FoodBoxDonkpocketDink + - FoodBoxDonkpocketMoth chance: 0.5 offset: 0.0 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml index c7e46d9a94..78543f15e9 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml @@ -386,3 +386,46 @@ Quantity: 1 - type: Sprite state: dink + +- type: entity + name: moth-pocket + parent: FoodDonkpocketBase + id: FoodDonkpocketMoth + description: Buzzy edition of donk-pocket that was created during mass protests ab-... Actually who cares? Just donk-pockets for moths. + components: + - type: FlavorProfile + flavors: + - cotton + - cheap + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Nutriment + Quantity: 5 + - ReagentId: Fiber + Quantity: 5 + - type: Sprite + state: moth + - type: Food + requiresSpecialDigestion: true + - type: Tag + tags: + - ClothMade + - DonkPocket + +- type: entity + name: warm moth-pocket + parent: FoodDonkpocketMoth + id: FoodDonkpocketMothWarm + components: + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Nutriment + Quantity: 10 + - ReagentId: Fiber + Quantity: 5 + - ReagentId: Omnizine + Quantity: 2 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index 7dd402ae6d..e3825ac2dd 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -484,6 +484,20 @@ - id: FoodDonkpocketDink amount: 6 +- type: entity + parent: FoodBoxDonkpocket + id: FoodBoxDonkpocketMoth + name: box of moth-pockets + components: + - type: Sprite + state: moth-box + - type: Item + sprite: Objects/Consumable/Food/Baked/donkpocket.rsi + - type: StorageFill + contents: + - id: FoodDonkpocketMoth + amount: 6 + - type: entity id: HappyHonk parent: [ BoxCardboard, BaseBagOpenClose ] diff --git a/Resources/Prototypes/Entities/Objects/Decoration/present.yml b/Resources/Prototypes/Entities/Objects/Decoration/present.yml index e9ddd3b517..9a08e3983e 100644 --- a/Resources/Prototypes/Entities/Objects/Decoration/present.yml +++ b/Resources/Prototypes/Entities/Objects/Decoration/present.yml @@ -276,6 +276,8 @@ orGroup: GiftPool - id: FoodBoxDonkpocketHonk orGroup: GiftPool + - id: FoodBoxDonkpocketMoth + orGroup: GiftPool - id: ClothingHandsGlovesColorPurple orGroup: GiftPool - id: ClothingHandsGlovesColorYellow diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 28a47fdc21..60c7d74c0d 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -1812,6 +1812,13 @@ solids: FoodDonkpocketCarp: 1 +- type: microwaveMealRecipe + id: RecipeDonkpocketMoth + name: warm moth-pocket recipe + result: FoodDonkpocketMothWarm + time: 5 + solids: + FoodDonkpocketMoth: 1 - type: microwaveMealRecipe id: RecipeHotChili diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json index 3cbfe7d8e8..77d4d96eb1 100644 --- a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json @@ -1,76 +1,82 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24. Stonk pocket by Tayrtahn on GitHub. Carp pocket by deltanedas (GitHub), modified by ps3moira (GitHub)", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "banana" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24. Stonk pocket by Tayrtahn on GitHub. Carp pocket by deltanedas (GitHub). Modified by ps3moira (GitHub). 'moth-box' and 'moth' States by kosticia on GitHub", + "size": { + "x": 32, + "y": 32 }, - { - "name": "banana-box" - }, - { - "name": "berry" - }, - { - "name": "berry-box" - }, - { - "name": "dank" - }, - { - "name": "pizza" - }, - { - "name": "pizza-box" - }, - { - "name": "plain" - }, - { - "name": "box" - }, - { - "name": "spicy" - }, - { - "name": "spicy-box" - }, - { - "name": "teriyaki" - }, - { - "name": "teriyaki-box" - }, - { - "name": "dink-box" - }, - { - "name": "dink" - }, - { - "name": "stonk-box" - }, - { - "name": "stonk" - }, - { - "name": "carp-box" - }, - { - "name": "carp" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "banana" + }, + { + "name": "banana-box" + }, + { + "name": "berry" + }, + { + "name": "berry-box" + }, + { + "name": "dank" + }, + { + "name": "pizza" + }, + { + "name": "pizza-box" + }, + { + "name": "plain" + }, + { + "name": "box" + }, + { + "name": "spicy" + }, + { + "name": "spicy-box" + }, + { + "name": "teriyaki" + }, + { + "name": "teriyaki-box" + }, + { + "name": "dink-box" + }, + { + "name": "dink" + }, + { + "name": "stonk-box" + }, + { + "name": "stonk" + }, + { + "name": "carp-box" + }, + { + "name": "carp" + }, + { + "name": "moth-box" + }, + { + "name": "moth" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/moth-box.png b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/moth-box.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ecf9dd8b56fafe81b1e1adc3dd36db9dd8f1e9 GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!hHg(6$B+p3WC_;A2_ijBjch#uvos8L9(rp( z#Z%<O+Z(PIY8J^dY`SyPhwqd!&$oG1EXz18n>5%D)adD*VSOgdq<_Dzc@u|q1E-fT zi^6H$Ev=F|Iyw?5E;kNt=`so6@n}Ahm?IG|U9@G>2j)dG2M(TNN;NdF*;zc#(QOX< z88N{JESK}`YS=g5x7o+?Y%)_vSJTa}asPi--dJFB=)vRZ@jRcB_VAd??_VA#B4O=f zu&3%ro8yf3*#|EkoRs))*>9ezwr2^quDJ9!ethlUwtM>f=BpE#I?4{re$FppG4sFS ziq|U*MZ$CwE55xGKm5Ai{$NSiT{kw{Vp+Dd1@VrrJQ!W99bAGM4=SqlKm2=}pJ&~% zM?67JIXp>BItjbXZq9i4a<e(lLCdKLrArtlIWe^CH|#LJQ5|6*(wb#3=l16Q#IkG- z=KUQE%-dI3#qer2ED>mUxc`n7&m^x)JW&S{{{MR{&D_32vde};U^0Va!-^ONrUi2t qQiWK9q_+#^e$#-4J0lAZ55unQ<$L^^LP~&f#o+1c=d#Wzp$Pz~XT_=j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/moth.png b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/moth.png new file mode 100644 index 0000000000000000000000000000000000000000..0f68621c4a8f7eb85dbdf6552ccfb868042415b0 GIT binary patch literal 403 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!1`SUa$B+p3WC_;A2_ijBfd(oEm-)_?THs@G zK+TOOq2-ba<AT)x3w=Z$Jb&)KsZu4IA#&Zyl_x)ZeC*C9DJi)^gZc1eb$^L@w$*N% zlxHk331kpEqj1`hAw`qt^XJdaM;#be@SRfP@hD=rP@cekpoVYJL}x}84`1$-RtAm( zI&R->S2nCMNk~g$+a_^W@cR0AbxYm}ZyLh+&;R}Z`L*<vc3F>=w*+$aJOde+6i!Fp z*m2;;<JZ*zfgB8-wZFdzol@qT@P<Kv!IG(^b!q8=K8C~zPg|VWq!msxp0HyFiaJhP z+|FUx@WiCx`J1RUOBIX)4EfY<#iVKYniPEOOsx6yYy08P-~UTq`1t$%o8D=CjeP-2 tw=ix9;@jz?u=Rr^C{%cq4jf=$h*50)aqICxJzzjGc)I$ztaD0e0sx`cnf3qx literal 0 HcmV?d00001 From 82bc2a728ca0bd03936cb1844d7f4da7823da207 Mon Sep 17 00:00:00 2001 From: Smith <182301147+AgentSmithRadio@users.noreply.github.com> Date: Wed, 23 Apr 2025 01:37:09 -0400 Subject: [PATCH 553/622] Four new food crates for the ATS (#33286) Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Prototypes/Catalog/Bounties/bounties.yml | 1 + .../Prototypes/Catalog/Cargo/cargo_food.yml | 40 +++++++++ .../Prototypes/Catalog/Fills/Crates/food.yml | 81 +++++++++++++++++++ .../Consumable/Food/Containers/box.yml | 75 +++++++++++++++++ .../Objects/Consumable/Food/snacks.yml | 5 +- Resources/Prototypes/tags.yml | 3 + 6 files changed, 203 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 450d8ec618..3c1f8457e0 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -564,6 +564,7 @@ - Cake - Pie - Bread + - Pistachios - type: cargoBounty id: BountyVegetable diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml index 1a6f838096..a46a16737c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml @@ -77,3 +77,43 @@ cost: 2400 category: cargoproduct-category-name-food group: market + +- type: cargoProduct + id: FoodCookGetmore + icon: + sprite: Objects/Consumable/Food/snacks.rsi + state: raisins + product: CrateFoodGetMore + cost: 750 + category: cargoproduct-category-name-food + group: market + +- type: cargoProduct + id: FoodHappyHonkMeals + icon: + sprite: Objects/Consumable/Food/burger.rsi + state: bigbite + product: CrateFoodHappyHonkBigBite + cost: 1000 + category: cargoproduct-category-name-food + group: market + +- type: cargoProduct + id: FoodIceCream + icon: + sprite: Objects/Consumable/Food/frozen.rsi + state: sandwich + product: CrateFoodIceCream + cost: 1200 + category: cargoproduct-category-name-food + group: market + +- type: cargoProduct + id: FoodSnowcone + icon: + sprite: Objects/Consumable/Food/frozen.rsi + state: cone + product: CrateFoodSnowcone + cost: 1100 + category: cargoproduct-category-name-food + group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/food.yml b/Resources/Prototypes/Catalog/Fills/Crates/food.yml index 5e1834316f..23d1b2f795 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/food.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/food.yml @@ -166,3 +166,84 @@ - id: DrinkFourteenLokoCan amount: 4 +- type: entity + id: CrateFoodGetMore + parent: CratePlastic + name: Getmore Bakemore crate + description: Getmore branded snacks and baking supplies for the creative chef, all without the need of emptying your station's Getmore machines! + components: + - type: StorageFill + contents: + - id: FoodSnackRaisins + amount: 4 + - id: FoodSnackChocolate + amount: 6 + - id: FoodSnackPistachios + amount: 4 + - id: ReagentContainerFlour + amount: 3 + - id: ReagentContainerSugar + amount: 2 + - id: FoodCondimentPacketSalt + amount: 3 + - id: DrinkMilkCarton + amount: 2 + - id: FoodContainerEgg + amount: 2 + - id: FoodBoxCloth + amount: 1 + +- type: entity + id: CrateFoodIceCream + parent: CrateFreezer + name: ice cream delivery + description: An assortment of ice cream delights for any occasion! Includes 16 frozen treats. + components: + - type: StorageFill + contents: + - id: FoodFrozenSandwich + amount: 3 + - id: FoodFrozenSandwichStrawberry + amount: 2 + - id: FoodFrozenPopsicleOrange + amount: 2 + - id: FoodFrozenPopsicleBerry + amount: 2 + - id: FoodFrozenPopsicleJumbo + amount: 3 + - id: FoodFrozenCornuto + amount: 2 + - id: FoodFrozenSundae + amount: 2 + +- type: entity + id: CrateFoodSnowcone + parent: CrateFreezer + name: snowcone delivery + description: A freezer packed with refreshing snowcones for a hard working crew, or even a lazy one! Includes 16 snowcones. + components: + - type: StorageFill + contents: + - id: FoodFrozenSnowconeBase + amount: 3 + - id: FoodFrozenSnowconeBerry + amount: 3 + - id: FoodFrozenSnowconeFruit + amount: 3 + - id: FoodFrozenSnowconeRainbow + amount: 3 + - id: FoodFrozenSnowconeClown + amount: 2 + - id: FoodFrozenSnowconeMime + amount: 2 + +- type: entity + id: CrateFoodHappyHonkBigBite + parent: CratePlastic + name: Happy Honk meal delivery + description: Two fully loaded Happy Honk Big Bite burger meals, complete with cheesy fries, a bottle of Space Cola, a slice of apple pie and a toy! + components: + - type: StorageFill + contents: + - id: FoodMealHappyHonkBigBite + amount: 2 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index e3825ac2dd..00df6b5b68 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -784,6 +784,81 @@ prob: 0.1 orGroup: GiftPool +- type: entity + id: FoodMealHappyHonkBigBite + parent: HappyHonk + name: Happy Honk Big Bite Meal + description: Someone paid good money to get this fast food meal shipped out this way. It smells fresh, somehow. + components: + - type: StorageFill + contents: + - id: FoodBurgerBig + amount: 1 + - id: FoodMealFriesCheesy + amount: 1 + - id: DrinkColaBottleFull + amount: 1 + - id: FoodPieAppleSlice + amount: 1 + - id: ToyMouse + orGroup: GiftPool + - id: ToyAi + orGroup: GiftPool + - id: ToyNuke + orGroup: GiftPool + - id: ToyFigurinePassenger + orGroup: GiftPool + - id: ToyGriffin + orGroup: GiftPool + - id: ToyHonk + orGroup: GiftPool + - id: ToyIan + orGroup: GiftPool + - id: ToyMarauder + orGroup: GiftPool + - id: ToyMauler + orGroup: GiftPool + - id: ToyGygax + orGroup: GiftPool + - id: ToyOdysseus + orGroup: GiftPool + - id: ToyOwlman + orGroup: GiftPool + - id: ToyDeathRipley + orGroup: GiftPool + - id: ToyPhazon + orGroup: GiftPool + - id: ToyFireRipley + orGroup: GiftPool + - id: ToyReticence + orGroup: GiftPool + - id: ToyRipley + orGroup: GiftPool + - id: ToySeraph + orGroup: GiftPool + - id: ToyDurand + orGroup: GiftPool + - id: ToySkeleton + orGroup: GiftPool + - id: FoamBlade + orGroup: GiftPool + - id: ClothingHeadHatBunny + orGroup: GiftPool + - id: PersonalAI + orGroup: GiftPool + - id: ToySword + orGroup: GiftPool + - id: RevolverCapGun + orGroup: GiftPool + - id: ToyRubberDuck + orGroup: GiftPool + - id: BikeHorn + prob: 0.5 + orGroup: GiftPool + - id: GoldenBikeHorn + prob: 0.1 + orGroup: GiftPool + - type: entity parent: BoxCardboard id: FoodBoxCloth diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml index 7b908872c6..8c67a3d037 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml @@ -178,10 +178,10 @@ - type: Item - type: entity - name: sweetie's pistachios + name: Sweetie's pistachios parent: FoodSnackBase id: FoodSnackPistachios - description: Sweeties's name-brand pistachios. probably won't give you diseases. Probably. + description: Sweeties's name-brand pistachios. Probably won't give you diseases. Probably. components: - type: FlavorProfile flavors: @@ -196,6 +196,7 @@ - type: Tag tags: - Fruit # Seed of a fruit, you can yell at me + - Pistachios # Added tag due to CrateFoodGetMore interaction with BountyFruit. - type: entity name: popcorn diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 09c205686c..efd74cfe64 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -972,6 +972,9 @@ - type: Tag id: Pipe +- type: Tag + id: Pistachios + - type: Tag id: Pizza From c387bdb136327b3f691da70882e5712c24a2dfcd Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Wed, 23 Apr 2025 05:38:16 +0000 Subject: [PATCH 554/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 34 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 80b6575a2b..88f27b32d2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,20 +1,4 @@ Entries: -- author: jbox144 - changes: - - message: Reduced Plasma's minimum population to 20, maximum population to 60 - type: Tweak - - message: Reduced Plasma's clown jobs from 2 to 1 - type: Tweak - id: 7818 - time: '2025-01-16T08:51:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34462 -- author: pcaessayrs - changes: - - message: Uranium, Cak, and BreadDog are no longer space garbage. - type: Fix - id: 7819 - time: '2025-01-16T11:40:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34192 - author: GansuLalan changes: - message: Pianos will no longer push players off when climbing them @@ -3921,3 +3905,21 @@ id: 8319 time: '2025-04-23T01:58:42.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36488 +- author: kosticia + changes: + - message: Added analog of donk-pockets for moth - moth-pockets + type: Add + id: 8320 + time: '2025-04-23T05:36:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34517 +- author: AgentSmithRadio + changes: + - message: New food crates are now available for purchase from the automated trade + station! + type: Add + - message: You can no longer use Sweetie's Pistachios to fulfill cargo's generic + fruit bounty. + type: Remove + id: 8321 + time: '2025-04-23T05:37:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33286 From 3ac8bc71f10e9ae538ad0517e25ff5d0d86ae708 Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Wed, 23 Apr 2025 09:31:42 +0300 Subject: [PATCH 555/622] Cleanup: Move folders out of bureaucracy.rsi and paper.yml (#35108) Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Markers/Spawners/Random/folders.yml | 2 +- .../Entities/Objects/Misc/folders.yml | 313 +++++++++++++++++ .../Entities/Objects/Misc/paper.yml | 316 +----------------- Resources/Prototypes/Objectives/traitor.yml | 2 +- .../Objects/Misc/bureaucracy.rsi/meta.json | 21 -- .../folder-base.png | Bin .../folder-centcom.png | Bin .../folder-colormap.png | Bin .../folder-overlay-paper.png | Bin .../folder-sec-doc.png | Bin .../folder-stamp-inverse.png | Bin .../folder-white.png | Bin .../Objects/Misc/folders.rsi/meta.json | 32 ++ 13 files changed, 348 insertions(+), 338 deletions(-) create mode 100644 Resources/Prototypes/Entities/Objects/Misc/folders.yml rename Resources/Textures/Objects/Misc/{bureaucracy.rsi => folders.rsi}/folder-base.png (100%) rename Resources/Textures/Objects/Misc/{bureaucracy.rsi => folders.rsi}/folder-centcom.png (100%) rename Resources/Textures/Objects/Misc/{bureaucracy.rsi => folders.rsi}/folder-colormap.png (100%) rename Resources/Textures/Objects/Misc/{bureaucracy.rsi => folders.rsi}/folder-overlay-paper.png (100%) rename Resources/Textures/Objects/Misc/{bureaucracy.rsi => folders.rsi}/folder-sec-doc.png (100%) rename Resources/Textures/Objects/Misc/{bureaucracy.rsi => folders.rsi}/folder-stamp-inverse.png (100%) rename Resources/Textures/Objects/Misc/{bureaucracy.rsi => folders.rsi}/folder-white.png (100%) create mode 100644 Resources/Textures/Objects/Misc/folders.rsi/meta.json diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/folders.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/folders.yml index 3ca5731bd8..7631d43316 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/folders.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/folders.yml @@ -8,7 +8,7 @@ - type: Transform anchored: false - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi + sprite: Objects/Misc/folders.rsi layers: - state: folder-base - state: folder-colormap diff --git a/Resources/Prototypes/Entities/Objects/Misc/folders.yml b/Resources/Prototypes/Entities/Objects/Misc/folders.yml new file mode 100644 index 0000000000..f72d4c3abc --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/folders.yml @@ -0,0 +1,313 @@ +- type: entity + id: BoxFolderNuclearCodes + parent: BaseItem + name: nuclear code folder + components: + - type: Sprite + sprite: Objects/Misc/folders.rsi + layers: + - state: folder-colormap + color: "#cc2323" + - state: folder-base + - state: folder-stamp-inverse + color: "#1dff00" + - type: SpawnItemsOnUse + items: + - id: NukeCodePaper + sound: + path: /Audio/Effects/packetrip.ogg + - type: Appearance + +- type: entity + id: BoxFolderBase + parent: BoxBase + name: folder + description: A folder filled with top secret paperwork. + components: + - type: Sprite + sprite: Objects/Misc/folders.rsi + layers: + - state: folder-colormap + - state: folder-base +# RandomSpriteColor requires netsync which is currently incompatible with ItemMapper +# - type: RandomSpriteColor +# sprite: Objects/Misc/folders.rsi +# state: folder-colormap +# colors: +# red: "#cc2323" +# blue: "#355d99" +# yellow: "#b38e3c" +# white: "#e6e6e6" +# grey: "#999999" +# black: "#3f3f3f" +# green: "#43bc38" + - type: Item + sprite: Objects/Misc/folders.rsi + size: Small + shape: null + - type: Storage + maxItemSize: Small + grid: + - 0,0,4,3 + whitelist: + tags: + - Document + - type: ItemMapper + mapLayers: + folder-overlay-paper: + whitelist: + tags: + - Document + - type: Appearance + - type: Tag + tags: + - Folder + - type: StorageFill + contents: + - id: Paper + prob: 0.5 + - id: PaperOffice + prob: 0.4 + - id: Paper + prob: 0.3 + - id: PaperOffice + prob: 0.2 + - id: Paper + prob: 0.2 + +- type: entity + id: BoxFolderRed + parent: BoxFolderBase + suffix: Red + components: + - type: Sprite + layers: + - state: folder-colormap + color: "#cc2323" + - state: folder-base + +- type: entity + id: BoxFolderBlue + parent: BoxFolderBase + suffix: Blue + components: + - type: Sprite + layers: + - state: folder-colormap + color: "#355d99" + - state: folder-base + +- type: entity + id: BoxFolderYellow + parent: BoxFolderBase + suffix: Yellow + components: + - type: Sprite + layers: + - state: folder-colormap + color: "#b38e3c" + - state: folder-base + +- type: entity + id: BoxFolderWhite + parent: BoxFolderBase + suffix: White + components: + - type: Sprite + layers: + - state: folder-white + - state: folder-base + +- type: entity + id: BoxFolderGrey + parent: BoxFolderBase + suffix: Grey + components: + - type: Sprite + layers: + - state: folder-colormap + color: "#999999" + - state: folder-base + +- type: entity + id: BoxFolderBlack + parent: BoxFolderBase + suffix: Black + components: + - type: Sprite + layers: + - state: folder-colormap + color: "#3f3f3f" + - state: folder-base + +- type: entity + id: BoxFolderGreen + parent: BoxFolderBase + suffix: Green + components: + - type: Sprite + layers: + - state: folder-colormap + color: "#43bc38" + - state: folder-base + +- type: entity + id: BoxFolderCentCom + name: CentComm folder + parent: BoxFolderBase + categories: [ DoNotMap ] + description: CentComm's miserable little pile of secrets! + components: + - type: Sprite + layers: + - state: folder-centcom + - state: folder-base + +- type: entity + id: BoxFolderClipboard + parent: BoxFolderBase + name: clipboard + description: The weapon of choice for those on the front lines of bureaucracy. + components: + - type: Sprite + sprite: Objects/Misc/clipboard.rsi + layers: + - state: clipboard + - state: clipboard_paper + map: ["clipboard_paper"] + visible: false + - state: clipboard_pen + map: ["clipboard_pen"] + visible: false + - state: clipboard_over + - type: ContainerContainer + containers: + storagebase: !type:Container + ents: [] + pen_slot: !type:ContainerSlot {} + - type: ItemSlots + slots: + pen_slot: + name: clipboard-slot-component-slot-name-pen + whitelist: + tags: + - Write + insertOnInteract: false + - type: Item + sprite: Objects/Misc/clipboard.rsi + size: Small + - type: Clothing + slots: [belt] + quickEquip: false + sprite: Objects/Misc/clipboard.rsi + - type: Storage + grid: + - 0,0,5,3 + whitelist: + tags: + - Document + - type: ItemMapper + mapLayers: + clipboard_paper: + whitelist: + tags: + - Document + clipboard_pen: + whitelist: + tags: + - Write + - type: MeleeWeapon + wideAnimationRotation: 180 + damage: + types: + Blunt: 6 + +- type: entity + id: BoxFolderCentComClipboard + parent: BoxFolderClipboard + name: CentComm clipboard + description: A luxurious clipboard upholstered with green velvet. Often seen carried by CentComm officials, seldom seen actually used. + components: + - type: Sprite + sprite: Objects/Misc/cc-clipboard.rsi + layers: + - state: clipboard + - state: clipboard_paper + map: ["clipboard_paper"] + visible: false + - state: clipboard_pen + map: ["clipboard_pen"] + visible: false + - state: clipboard_over + - type: Item + sprite: Objects/Misc/cc-clipboard.rsi + - type: Clothing + sprite: Objects/Misc/cc-clipboard.rsi + +- type: entity + id: BoxFolderQmClipboard + parent: [BoxFolderClipboard, BaseGrandTheftContraband] + name: requisition digi-board + description: A bulky electric clipboard, filled with shipping orders and financing details. With so many compromising documents, you ought to keep this safe. + components: + - type: Sprite + sprite: Objects/Misc/qm_clipboard.rsi + layers: + - state: qm_clipboard + - state: qm_clipboard_paper + map: ["qm_clipboard_paper"] + visible: false + - state: qm_clipboard_pen + map: ["qm_clipboard_pen"] + visible: false + - state: qm_clipboard_over + - type: ItemSlots + slots: + pen_slot: + name: clipboard-slot-component-slot-name-pen + whitelist: + tags: + - Write + insertOnInteract: true + - type: Item + sprite: Objects/Misc/qm_clipboard.rsi + size: Normal + - type: Clothing + sprite: Objects/Misc/qm_clipboard.rsi + - type: Storage + grid: + - 0,0,4,3 + quickInsert: true + - type: StorageFill + contents: [] #to override base clipboard fill + - type: ItemMapper + mapLayers: + qm_clipboard_paper: + whitelist: + tags: + - Document + qm_clipboard_pen: + whitelist: + tags: + - Write + - type: CargoOrderConsole + removeLimitAccess: [ "Quartermaster" ] + - type: ActivatableUI + verbText: qm-clipboard-computer-verb-text + key: enum.CargoConsoleUiKey.Orders + - type: UserInterface + interfaces: + enum.CargoConsoleUiKey.Orders: + type: CargoOrderConsoleBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + - type: MeleeWeapon + damage: + types: + Blunt: 10 + - type: Tag + tags: + - Folder + - HighRiskItem + - type: StealTarget + stealGroup: BoxFolderQmClipboard diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index c6f7e0e405..ae7ab0f442 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -50,7 +50,7 @@ - type: Item size: Tiny - type: PhysicalComposition - + - type: entity name: paper parent: BasePaper @@ -307,320 +307,6 @@ components: - type: NukeCodePaper -- type: entity - id: BoxFolderNuclearCodes - parent: BaseItem - name: nuclear code folder - components: - - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi - layers: - - state: folder-colormap - color: "#cc2323" - - state: folder-base - - state: folder-stamp-inverse - color: "#1dff00" - - type: SpawnItemsOnUse - items: - - id: NukeCodePaper - sound: - path: /Audio/Effects/packetrip.ogg - - type: Appearance - -- type: entity - id: BoxFolderBase - parent: BoxBase - name: folder - description: A folder filled with top secret paperwork. - components: - - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi - layers: - - state: folder-colormap - - state: folder-base -# RandomSpriteColor requires netsync which is currently incompatible with ItemMapper -# - type: RandomSpriteColor -# sprite: Objects/Misc/bureaucracy.rsi -# state: folder-colormap -# colors: -# red: "#cc2323" -# blue: "#355d99" -# yellow: "#b38e3c" -# white: "#e6e6e6" -# grey: "#999999" -# black: "#3f3f3f" -# green: "#43bc38" - - type: Item - sprite: Objects/Misc/bureaucracy.rsi - size: Small - shape: null - - type: Storage - maxItemSize: Small - grid: - - 0,0,4,3 - whitelist: - tags: - - Document - - type: ItemMapper - mapLayers: - folder-overlay-paper: - whitelist: - tags: - - Document - - type: Appearance - - type: Tag - tags: - - Folder - - type: StorageFill - contents: - - id: Paper - prob: 0.5 - - id: PaperOffice - prob: 0.4 - - id: Paper - prob: 0.3 - - id: PaperOffice - prob: 0.2 - - id: Paper - prob: 0.2 - -- type: entity - id: BoxFolderRed - parent: BoxFolderBase - suffix: Red - components: - - type: Sprite - layers: - - state: folder-colormap - color: "#cc2323" - - state: folder-base - -- type: entity - id: BoxFolderBlue - parent: BoxFolderBase - suffix: Blue - components: - - type: Sprite - layers: - - state: folder-colormap - color: "#355d99" - - state: folder-base - -- type: entity - id: BoxFolderYellow - parent: BoxFolderBase - suffix: Yellow - components: - - type: Sprite - layers: - - state: folder-colormap - color: "#b38e3c" - - state: folder-base - -- type: entity - id: BoxFolderWhite - parent: BoxFolderBase - suffix: White - components: - - type: Sprite - layers: - - state: folder-white - - state: folder-base - -- type: entity - id: BoxFolderGrey - parent: BoxFolderBase - suffix: Grey - components: - - type: Sprite - layers: - - state: folder-colormap - color: "#999999" - - state: folder-base - -- type: entity - id: BoxFolderBlack - parent: BoxFolderBase - suffix: Black - components: - - type: Sprite - layers: - - state: folder-colormap - color: "#3f3f3f" - - state: folder-base - -- type: entity - id: BoxFolderGreen - parent: BoxFolderBase - suffix: Green - components: - - type: Sprite - layers: - - state: folder-colormap - color: "#43bc38" - - state: folder-base - -- type: entity - id: BoxFolderCentCom - name: CentComm folder - parent: BoxFolderBase - categories: [ DoNotMap ] - description: CentComm's miserable little pile of secrets! - components: - - type: Sprite - layers: - - state: folder-centcom - - state: folder-base - -- type: entity - id: BoxFolderClipboard - parent: BoxFolderBase - name: clipboard - description: The weapon of choice for those on the front lines of bureaucracy. - components: - - type: Sprite - sprite: Objects/Misc/clipboard.rsi - layers: - - state: clipboard - - state: clipboard_paper - map: ["clipboard_paper"] - visible: false - - state: clipboard_pen - map: ["clipboard_pen"] - visible: false - - state: clipboard_over - - type: ContainerContainer - containers: - storagebase: !type:Container - ents: [] - pen_slot: !type:ContainerSlot {} - - type: ItemSlots - slots: - pen_slot: - name: clipboard-slot-component-slot-name-pen - whitelist: - tags: - - Write - insertOnInteract: false - - type: Item - sprite: Objects/Misc/clipboard.rsi - size: Small - - type: Clothing - slots: [belt] - quickEquip: false - sprite: Objects/Misc/clipboard.rsi - - type: Storage - grid: - - 0,0,5,3 - whitelist: - tags: - - Document - - type: ItemMapper - mapLayers: - clipboard_paper: - whitelist: - tags: - - Document - clipboard_pen: - whitelist: - tags: - - Write - - type: MeleeWeapon - wideAnimationRotation: 180 - damage: - types: - Blunt: 6 - -- type: entity - id: BoxFolderCentComClipboard - parent: BoxFolderClipboard - name: CentComm clipboard - description: A luxurious clipboard upholstered with green velvet. Often seen carried by CentComm officials, seldom seen actually used. - components: - - type: Sprite - sprite: Objects/Misc/cc-clipboard.rsi - layers: - - state: clipboard - - state: clipboard_paper - map: ["clipboard_paper"] - visible: false - - state: clipboard_pen - map: ["clipboard_pen"] - visible: false - - state: clipboard_over - - type: Item - sprite: Objects/Misc/cc-clipboard.rsi - - type: Clothing - sprite: Objects/Misc/cc-clipboard.rsi - -- type: entity - id: BoxFolderQmClipboard - parent: [BoxFolderClipboard, BaseGrandTheftContraband] - name: requisition digi-board - description: A bulky electric clipboard, filled with shipping orders and financing details. With so many compromising documents, you ought to keep this safe. - components: - - type: Sprite - sprite: Objects/Misc/qm_clipboard.rsi - layers: - - state: qm_clipboard - - state: qm_clipboard_paper - map: ["qm_clipboard_paper"] - visible: false - - state: qm_clipboard_pen - map: ["qm_clipboard_pen"] - visible: false - - state: qm_clipboard_over - - type: ItemSlots - slots: - pen_slot: - name: clipboard-slot-component-slot-name-pen - whitelist: - tags: - - Write - insertOnInteract: true - - type: Item - sprite: Objects/Misc/qm_clipboard.rsi - size: Normal - - type: Clothing - sprite: Objects/Misc/qm_clipboard.rsi - - type: Storage - grid: - - 0,0,4,3 - quickInsert: true - - type: StorageFill - contents: [] #to override base clipboard fill - - type: ItemMapper - mapLayers: - qm_clipboard_paper: - whitelist: - tags: - - Document - qm_clipboard_pen: - whitelist: - tags: - - Write - - type: CargoOrderConsole - removeLimitAccess: [ "Quartermaster" ] - - type: ActivatableUI - verbText: qm-clipboard-computer-verb-text - key: enum.CargoConsoleUiKey.Orders - - type: UserInterface - interfaces: - enum.CargoConsoleUiKey.Orders: - type: CargoOrderConsoleBoundUserInterface - enum.StorageUiKey.Key: - type: StorageBoundUserInterface - - type: MeleeWeapon - damage: - types: - Blunt: 10 - - type: Tag - tags: - - Folder - - HighRiskItem - - type: StealTarget - stealGroup: BoxFolderQmClipboard - - type: entity parent: [Paper, BaseSyndicateContraband] # eat or burn your damn piece of paper damn thieves id: TraitorCodePaper diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index 1da9953b60..0f53488e69 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -16,7 +16,7 @@ components: - type: Objective icon: - sprite: Objects/Misc/bureaucracy.rsi + sprite: Objects/Misc/folders.rsi state: folder-white - type: MultipleTraitorsRequirement diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index d92fe17b66..87d5f9d0c1 100644 --- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json @@ -22,27 +22,6 @@ { "name": "envelope_torn_overlay" }, - { - "name": "folder-base" - }, - { - "name": "folder-colormap" - }, - { - "name": "folder-white" - }, - { - "name": "folder-centcom" - }, - { - "name": "folder-overlay-paper" - }, - { - "name": "folder-sec-doc" - }, - { - "name": "folder-stamp-inverse" - }, { "name": "label_cart" }, diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-base.png b/Resources/Textures/Objects/Misc/folders.rsi/folder-base.png similarity index 100% rename from Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-base.png rename to Resources/Textures/Objects/Misc/folders.rsi/folder-base.png diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-centcom.png b/Resources/Textures/Objects/Misc/folders.rsi/folder-centcom.png similarity index 100% rename from Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-centcom.png rename to Resources/Textures/Objects/Misc/folders.rsi/folder-centcom.png diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-colormap.png b/Resources/Textures/Objects/Misc/folders.rsi/folder-colormap.png similarity index 100% rename from Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-colormap.png rename to Resources/Textures/Objects/Misc/folders.rsi/folder-colormap.png diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-overlay-paper.png b/Resources/Textures/Objects/Misc/folders.rsi/folder-overlay-paper.png similarity index 100% rename from Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-overlay-paper.png rename to Resources/Textures/Objects/Misc/folders.rsi/folder-overlay-paper.png diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-sec-doc.png b/Resources/Textures/Objects/Misc/folders.rsi/folder-sec-doc.png similarity index 100% rename from Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-sec-doc.png rename to Resources/Textures/Objects/Misc/folders.rsi/folder-sec-doc.png diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-stamp-inverse.png b/Resources/Textures/Objects/Misc/folders.rsi/folder-stamp-inverse.png similarity index 100% rename from Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-stamp-inverse.png rename to Resources/Textures/Objects/Misc/folders.rsi/folder-stamp-inverse.png diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-white.png b/Resources/Textures/Objects/Misc/folders.rsi/folder-white.png similarity index 100% rename from Resources/Textures/Objects/Misc/bureaucracy.rsi/folder-white.png rename to Resources/Textures/Objects/Misc/folders.rsi/folder-white.png diff --git a/Resources/Textures/Objects/Misc/folders.rsi/meta.json b/Resources/Textures/Objects/Misc/folders.rsi/meta.json new file mode 100644 index 0000000000..75cdf9e019 --- /dev/null +++ b/Resources/Textures/Objects/Misc/folders.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "folder-base" + }, + { + "name": "folder-colormap" + }, + { + "name": "folder-white" + }, + { + "name": "folder-centcom" + }, + { + "name": "folder-overlay-paper" + }, + { + "name": "folder-sec-doc" + }, + { + "name": "folder-stamp-inverse" + } + ] +} From e529bc619603cec44e58bbfc0bbf8a0b1a5df03c Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 05:29:13 -0400 Subject: [PATCH 556/622] Improve LocalizedDataset test to check for low Count (#36848) * Improve LocalizedDataset test to check for low Count * Fix missing entries for FigurinesFootsoldier --- .../Tests/Localization/LocalizedDatasetPrototypeTest.cs | 4 ++++ Resources/Prototypes/Datasets/figurines.yml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.IntegrationTests/Tests/Localization/LocalizedDatasetPrototypeTest.cs b/Content.IntegrationTests/Tests/Localization/LocalizedDatasetPrototypeTest.cs index 8d272545ce..05f98c3d19 100644 --- a/Content.IntegrationTests/Tests/Localization/LocalizedDatasetPrototypeTest.cs +++ b/Content.IntegrationTests/Tests/Localization/LocalizedDatasetPrototypeTest.cs @@ -30,6 +30,10 @@ public sealed class LocalizedDatasetPrototypeTest // Make sure the localization manager has a string for the LocId Assert.That(localizationMan.HasString(locId), $"LocalizedDataset {proto.ID} with prefix \"{proto.Values.Prefix}\" specifies {proto.Values.Count} entries, but no localized string was found matching {locId}!"); } + + // Check that count isn't set too low + var nextId = proto.Values.Prefix + (proto.Values.Count + 1); + Assert.That(localizationMan.HasString(nextId), Is.False, $"LocalizedDataset {proto.ID} with prefix \"{proto.Values.Prefix}\" specifies {proto.Values.Count} entries, but a localized string exists with ID {nextId}! Does count need to be raised?"); } }); diff --git a/Resources/Prototypes/Datasets/figurines.yml b/Resources/Prototypes/Datasets/figurines.yml index 98dfee489f..95e072d889 100644 --- a/Resources/Prototypes/Datasets/figurines.yml +++ b/Resources/Prototypes/Datasets/figurines.yml @@ -212,7 +212,7 @@ id: FigurinesFootsoldier values: prefix: figurines-footsoldier- - count: 2 + count: 5 - type: localizedDataset id: FigurinesWizard From a48e975ea3051dd9ca09a1a040813cadd4e0359b Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 05:42:08 -0400 Subject: [PATCH 557/622] Fix warning CS9107 (#36845) --- .../Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs index a4ecff7530..49bd063083 100644 --- a/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs +++ b/Content.Client/Xenoarchaeology/Ui/AnalysisConsoleBoundUserInterface.cs @@ -21,7 +21,7 @@ public sealed class AnalysisConsoleBoundUserInterface(EntityUid owner, Enum uiKe base.Open(); _consoleMenu = this.CreateWindow<AnalysisConsoleMenu>(); - _consoleMenu.SetOwner(owner); + _consoleMenu.SetOwner(Owner); _consoleMenu.OnClose += Close; _consoleMenu.OpenCentered(); From bad79973f2fcbbe5f944bd9f44a94baf7511674f Mon Sep 17 00:00:00 2001 From: T-Stalker <43253663+DogZeroX@users.noreply.github.com> Date: Wed, 23 Apr 2025 07:11:34 -0300 Subject: [PATCH 558/622] Add 1 dragon name (#36846) * this is a commit you cannot skip * why do you have to add a count why --- Resources/Locale/en-US/datasets/names/dragon.ftl | 1 + Resources/Prototypes/Datasets/Names/dragon.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/datasets/names/dragon.ftl b/Resources/Locale/en-US/datasets/names/dragon.ftl index 836b1f13b8..0bb7e810c8 100644 --- a/Resources/Locale/en-US/datasets/names/dragon.ftl +++ b/Resources/Locale/en-US/datasets/names/dragon.ftl @@ -28,3 +28,4 @@ names-dragon-dataset-27 = Toastarinus names-dragon-dataset-28 = Embergill names-dragon-dataset-29 = Doomwing names-dragon-dataset-30 = Celesteus +names-dragon-dataset-31 = Jharon diff --git a/Resources/Prototypes/Datasets/Names/dragon.yml b/Resources/Prototypes/Datasets/Names/dragon.yml index c385605d5f..13be2fd59a 100644 --- a/Resources/Prototypes/Datasets/Names/dragon.yml +++ b/Resources/Prototypes/Datasets/Names/dragon.yml @@ -2,7 +2,7 @@ id: NamesDragon values: prefix: names-dragon-dataset- - count: 30 + count: 31 - type: localizedDataset id: NamesDragonTitle From 49ff1b5e51a89e80bef599ab29e6beb463ba0938 Mon Sep 17 00:00:00 2001 From: Saphire Lattice <lattice@saphi.re> Date: Wed, 23 Apr 2025 18:08:02 +0700 Subject: [PATCH 559/622] Remove steel sheet hull fixing (#33443) * Remove steel sheet hull fixing It's unintuitive that it's wasteful, there's not really any systems to NOT make it wasteful, and it's a UX trap. No this is not "noob trap", no. It's an UX issue because if hundreds of people do it over and over again without noticing anything wrong, well, something fails to properly note that there's an issue with what they are doing. Aka user experience issue. Aka not a problem with the user but the design. Also could be a shitty doafter action that makes you wonder if something's wrong * Why was this testing using steel of all things --- Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs | 2 +- .../Prototypes/Entities/Objects/Materials/Sheets/metal.yml | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs b/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs index 6ea8b6882a..eef420df20 100644 --- a/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs +++ b/Content.IntegrationTests/Tests/Tiles/TileConstructionTests.cs @@ -82,7 +82,7 @@ public sealed class TileConstructionTests : InteractionTest AssertGridCount(1); // Lattice -> Plating - await InteractUsing(Steel); + await InteractUsing(FloorItem); Assert.That(Hands.ActiveHandEntity, Is.Null); await AssertTile(Plating); AssertGridCount(1); diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml index bc9202324d..2156124749 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml @@ -59,9 +59,6 @@ - type: Item heldPrefix: steel - type: Appearance - - type: FloorTile - outputs: - - Plating - type: Extractable grindableSolutionName: steel - type: SolutionContainerManager From 9418d29a599374195149955acc537d8fa1ba3eff Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Wed, 23 Apr 2025 11:09:09 +0000 Subject: [PATCH 560/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 88f27b32d2..efbb5c3810 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: GansuLalan - changes: - - message: Pianos will no longer push players off when climbing them - type: Fix - id: 7820 - time: '2025-01-16T12:25:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33690 - author: Southbridge changes: - message: More Ionstorm law elements have been added @@ -3923,3 +3916,11 @@ id: 8321 time: '2025-04-23T05:37:10.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33286 +- author: SaphireLattice + changes: + - message: Steel sheets no longer have unintuitively wasteful plating placement + that can be done with steel tiles instead + type: Remove + id: 8322 + time: '2025-04-23T11:08:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33443 From 09c11895710825ecba37d795cee8a09c4554265a Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Wed, 23 Apr 2025 18:11:19 +0200 Subject: [PATCH 561/622] cleanup + add names to some entities (#36856) --- Resources/Prototypes/Entities/Clothing/Back/duffel.yml | 2 -- .../Prototypes/Entities/Markers/Spawners/Random/anomaly.yml | 3 ++- .../Entities/Markers/Spawners/Random/shadowkudzu.yml | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Back/duffel.yml b/Resources/Prototypes/Entities/Clothing/Back/duffel.yml index a4a589fe1c..d3e43653e0 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/duffel.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/duffel.yml @@ -182,7 +182,6 @@ - type: entity parent: ClothingBackpackDuffelSyndicate id: ClothingBackpackDuffelSyndicateAmmo - name: syndicate duffel bag components: - type: Sprite sprite: Clothing/Back/Duffels/syndicate.rsi @@ -203,7 +202,6 @@ - type: entity parent: ClothingBackpackDuffelSyndicate id: ClothingBackpackDuffelSyndicateMedical - name: syndicate duffel bag components: - type: Sprite sprite: Clothing/Back/Duffels/syndicate.rsi diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml index 40f37c737f..e7471138a0 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml @@ -30,6 +30,7 @@ - type: entity id: RandomRockAnomalySpawner + name: random rock anomaly spawner parent: MarkerBase components: - type: Sprite @@ -50,6 +51,7 @@ - type: entity id: RandomAnomalyInjectorSpawner + name: random anomaly injector spawner parent: MarkerBase components: - type: Sprite @@ -71,4 +73,3 @@ - AnomalyTrapRock #- AnomalyTrapSanta chance: 1 - diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml index 4434c6d05d..a65ce47c54 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/shadowkudzu.yml @@ -1,5 +1,6 @@ - type: entity id: ShadowKudzuLootSpawner + name: shadow kudzu loot spawner parent: MarkerBase components: - type: Sprite From 88d8458b5d4441c0c7eabb49214c77610683a319 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 13:54:49 -0400 Subject: [PATCH 562/622] Remove redundant fields from `MovementSpeedModifierComponent` (#36859) Delete _baseWalkSpeedVV and _baseSprintSpeedVV --- .../MovementSpeedModifierComponent.cs | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs index 02a8538531..6a39aa44b6 100644 --- a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs +++ b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs @@ -32,28 +32,6 @@ namespace Content.Shared.Movement.Components [AutoNetworkedField, ViewVariables] public float SprintSpeedModifier = 1.0f; - [ViewVariables(VVAccess.ReadWrite)] - private float _baseWalkSpeedVV - { - get => BaseWalkSpeed; - set - { - BaseWalkSpeed = value; - Dirty(); - } - } - - [ViewVariables(VVAccess.ReadWrite)] - private float _baseSprintSpeedVV - { - get => BaseSprintSpeed; - set - { - BaseSprintSpeed = value; - Dirty(); - } - } - /// <summary> /// Minimum speed a mob has to be moving before applying movement friction. /// </summary> From a7b9694d10b763291963e3f26278da3e34ab5bcf Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 14:24:21 -0400 Subject: [PATCH 563/622] Cleanup warnings in NinjaSuitSystem (#36861) Fix warnings in NinjaSuitSystem --- Content.Server/Ninja/Systems/NinjaSuitSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Ninja/Systems/NinjaSuitSystem.cs b/Content.Server/Ninja/Systems/NinjaSuitSystem.cs index 20674dda87..62d3d0e3ca 100644 --- a/Content.Server/Ninja/Systems/NinjaSuitSystem.cs +++ b/Content.Server/Ninja/Systems/NinjaSuitSystem.cs @@ -74,7 +74,7 @@ public sealed class NinjaSuitSystem : SharedNinjaSuitSystem var user = Transform(uid).ParentUid; // can only upgrade power cell, not swap to recharge instantly otherwise ninja could just swap batteries with flashlights in maints for easy power - if (GetCellScore(inserting.Owner, inserting) <= GetCellScore(battery.Owner, battery)) + if (GetCellScore(args.EntityUid, inserting) <= GetCellScore(batteryUid.Value, battery)) { args.Cancel(); Popup.PopupEntity(Loc.GetString("ninja-cell-downgrade"), user, user); From 6d88dd910d6fff56447a1947d29cf1852207e611 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 14:28:10 -0400 Subject: [PATCH 564/622] Modernize `GhostComponent` & Ghost API (#36858) * Move CanReturnToBody to system * Move CanGhostInteract to system * Cleanup redundant datafields and viewvariables * Document datafields * Document component * Add SetTimeOfDeath Entity<T> overload, obsolete old version * Document public methods * Cleanup obsoleted method calls --- .../Administration/Commands/AGhostCommand.cs | 2 +- Content.Server/Ghost/GhostSystem.cs | 4 +- Content.Server/Mind/MindSystem.cs | 4 +- Content.Shared/Ghost/GhostComponent.cs | 68 ++++++++++--------- Content.Shared/Ghost/SharedGhostSystem.cs | 61 ++++++++++++++--- 5 files changed, 92 insertions(+), 47 deletions(-) diff --git a/Content.Server/Administration/Commands/AGhostCommand.cs b/Content.Server/Administration/Commands/AGhostCommand.cs index 09c8d0eb50..1e3c00dffe 100644 --- a/Content.Server/Administration/Commands/AGhostCommand.cs +++ b/Content.Server/Administration/Commands/AGhostCommand.cs @@ -117,6 +117,6 @@ public sealed class AGhostCommand : LocalizedCommands } var comp = _entities.GetComponent<GhostComponent>(ghost); - ghostSystem.SetCanReturnToBody(comp, canReturn); + ghostSystem.SetCanReturnToBody((ghost, comp), canReturn); } } diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index 0cccab64b6..8596927b28 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -489,10 +489,10 @@ namespace Content.Server.Ghost if (mind.Comp.TimeOfDeath.HasValue) { - SetTimeOfDeath(ghost, mind.Comp.TimeOfDeath!.Value, ghostComponent); + SetTimeOfDeath((ghost, ghostComponent), mind.Comp.TimeOfDeath!.Value); } - SetCanReturnToBody(ghostComponent, canReturn); + SetCanReturnToBody((ghost, ghostComponent), canReturn); if (canReturn) _minds.Visit(mind.Owner, ghost, mind.Comp); diff --git a/Content.Server/Mind/MindSystem.cs b/Content.Server/Mind/MindSystem.cs index 5601f19e58..71d38c688b 100644 --- a/Content.Server/Mind/MindSystem.cs +++ b/Content.Server/Mind/MindSystem.cs @@ -62,7 +62,7 @@ public sealed class MindSystem : SharedMindSystem { TransferTo(mindId, visiting, mind: mind); if (TryComp(visiting, out GhostComponent? ghostComp)) - _ghosts.SetCanReturnToBody(ghostComp, false); + _ghosts.SetCanReturnToBody((visiting, ghostComp), false); return; } @@ -214,7 +214,7 @@ public sealed class MindSystem : SharedMindSystem entity = Spawn(GameTicker.ObserverPrototypeName, position); component = EnsureComp<MindContainerComponent>(entity.Value); var ghostComponent = Comp<GhostComponent>(entity.Value); - _ghosts.SetCanReturnToBody(ghostComponent, false); + _ghosts.SetCanReturnToBody((entity.Value, ghostComponent), false); } var oldEntity = mind.OwnedEntity; diff --git a/Content.Shared/Ghost/GhostComponent.cs b/Content.Shared/Ghost/GhostComponent.cs index 6fbb59a711..84416f8abc 100644 --- a/Content.Shared/Ghost/GhostComponent.cs +++ b/Content.Shared/Ghost/GhostComponent.cs @@ -4,6 +4,10 @@ using Robust.Shared.Prototypes; namespace Content.Shared.Ghost; +/// <summary> +/// Represents an observer ghost. +/// Handles limiting interactions, using ghost abilities, ghost visibility, and ghost warping. +/// </summary> [RegisterComponent, NetworkedComponent, Access(typeof(SharedGhostSystem))] [AutoGenerateComponentState(true), AutoGenerateComponentPause] public sealed partial class GhostComponent : Component @@ -41,46 +45,47 @@ public sealed partial class GhostComponent : Component // End actions - [ViewVariables(VVAccess.ReadWrite), DataField, AutoPausedField] + /// <summary> + /// Time at which the player died and created this ghost. + /// Used to determine votekick eligibility. + /// </summary> + /// <remarks> + /// May not reflect actual time of death if this entity has been paused, + /// but will give an accurate length of time <i>since</i> death. + /// </remarks> + [DataField, AutoPausedField] public TimeSpan TimeOfDeath = TimeSpan.Zero; - [DataField("booRadius"), ViewVariables(VVAccess.ReadWrite)] + /// <summary> + /// Range of the Boo action. + /// </summary> + [DataField] public float BooRadius = 3; - [DataField("booMaxTargets"), ViewVariables(VVAccess.ReadWrite)] + /// <summary> + /// Maximum number of entities that can affected by the Boo action. + /// </summary> + [DataField] public int BooMaxTargets = 3; - // TODO: instead of this funny stuff just give it access and update in system dirtying when needed - [ViewVariables(VVAccess.ReadWrite)] - public bool CanGhostInteract - { - get => _canGhostInteract; - set - { - if (_canGhostInteract == value) return; - _canGhostInteract = value; - Dirty(); - } - } - + /// <summary> + /// Is this ghost allowed to interact with entities? + /// </summary> + /// <remarks> + /// Used to allow admins ghosts to interact with the world. + /// Changed by <see cref="SharedGhostSystem.SetCanGhostInteract"/>. + /// </remarks> [DataField("canInteract"), AutoNetworkedField] - private bool _canGhostInteract; + public bool CanGhostInteract; /// <summary> - /// Changed by <see cref="SharedGhostSystem.SetCanReturnToBody"/> + /// Is this ghost player allowed to return to their original body? /// </summary> - // TODO MIRROR change this to use friend classes when thats merged - [ViewVariables(VVAccess.ReadWrite)] - public bool CanReturnToBody - { - get => _canReturnToBody; - set - { - if (_canReturnToBody == value) return; - _canReturnToBody = value; - Dirty(); - } - } + /// <remarks> + /// Changed by <see cref="SharedGhostSystem.SetCanReturnToBody"/>. + /// </remarks> + [DataField, AutoNetworkedField] + public bool CanReturnToBody; /// <summary> /// Ghost color @@ -88,9 +93,6 @@ public sealed partial class GhostComponent : Component /// <remarks>Used to allow admins to change ghost colors. Should be removed if the capability to edit existing sprite colors is ever added back.</remarks> [DataField, AutoNetworkedField] public Color Color = Color.White; - - [DataField("canReturnToBody"), AutoNetworkedField] - private bool _canReturnToBody; } public sealed partial class ToggleFoVActionEvent : InstantActionEvent { } diff --git a/Content.Shared/Ghost/SharedGhostSystem.cs b/Content.Shared/Ghost/SharedGhostSystem.cs index 6e62bee131..7d3561a79f 100644 --- a/Content.Shared/Ghost/SharedGhostSystem.cs +++ b/Content.Shared/Ghost/SharedGhostSystem.cs @@ -37,25 +37,68 @@ namespace Content.Shared.Ghost args.Cancel(); } + /// <summary> + /// Sets the ghost's time of death. + /// </summary> + public void SetTimeOfDeath(Entity<GhostComponent?> entity, TimeSpan value) + { + if (!Resolve(entity, ref entity.Comp)) + return; + + if (entity.Comp.TimeOfDeath == value) + return; + + entity.Comp.TimeOfDeath = value; + Dirty(entity); + } + + [Obsolete("Use the Entity<GhostComponent?> overload")] public void SetTimeOfDeath(EntityUid uid, TimeSpan value, GhostComponent? component) { - if (!Resolve(uid, ref component)) - return; - - component.TimeOfDeath = value; + SetTimeOfDeath((uid, component), value); } + /// <summary> + /// Sets whether or not the ghost player is allowed to return to their original body. + /// </summary> + public void SetCanReturnToBody(Entity<GhostComponent?> entity, bool value) + { + if (!Resolve(entity, ref entity.Comp)) + return; + + if (entity.Comp.CanReturnToBody == value) + return; + + entity.Comp.CanReturnToBody = value; + Dirty(entity); + } + + [Obsolete("Use the Entity<GhostComponent?> overload")] public void SetCanReturnToBody(EntityUid uid, bool value, GhostComponent? component = null) { - if (!Resolve(uid, ref component)) - return; - - component.CanReturnToBody = value; + SetCanReturnToBody((uid, component), value); } + [Obsolete("Use the Entity<GhostComponent?> overload")] public void SetCanReturnToBody(GhostComponent component, bool value) { - component.CanReturnToBody = value; + SetCanReturnToBody((component.Owner, component), value); + } + + + /// <summary> + /// Sets whether the ghost is allowed to interact with other entities. + /// </summary> + public void SetCanGhostInteract(Entity<GhostComponent?> entity, bool value) + { + if (!Resolve(entity, ref entity.Comp)) + return; + + if (entity.Comp.CanGhostInteract == value) + return; + + entity.Comp.CanGhostInteract = value; + Dirty(entity); } } From 5ede1f7b4e36ec7a86b7edb9453c90e2dc754d4d Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 14:33:18 -0400 Subject: [PATCH 565/622] Cleanup warning in `EmptyAllContainersBehaviour` (#36860) Fix warning in EmptyAllContainersBehaviour --- .../Thresholds/Behaviors/EmptyAllContainersBehaviour.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Destructible/Thresholds/Behaviors/EmptyAllContainersBehaviour.cs b/Content.Server/Destructible/Thresholds/Behaviors/EmptyAllContainersBehaviour.cs index e696ad9258..60e7423247 100644 --- a/Content.Server/Destructible/Thresholds/Behaviors/EmptyAllContainersBehaviour.cs +++ b/Content.Server/Destructible/Thresholds/Behaviors/EmptyAllContainersBehaviour.cs @@ -13,7 +13,7 @@ namespace Content.Server.Destructible.Thresholds.Behaviors if (!system.EntityManager.TryGetComponent<ContainerManagerComponent>(owner, out var containerManager)) return; - foreach (var container in containerManager.GetAllContainers()) + foreach (var container in system.EntityManager.System<SharedContainerSystem>().GetAllContainers(owner, containerManager)) { system.ContainerSystem.EmptyContainer(container, true, system.EntityManager.GetComponent<TransformComponent>(owner).Coordinates); } From 43d9365abf9375ef3b47fbb8845f46b3b3689dea Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 18:05:10 -0400 Subject: [PATCH 566/622] Cleanup warnings in `SharedCryostorageSystem` (#36863) Fix warnings in SharedCryostorageSystem --- Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs b/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs index e17a0a9167..1e2b15c8ce 100644 --- a/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs +++ b/Content.Shared/Bed/Cryostorage/SharedCryostorageSystem.cs @@ -21,6 +21,7 @@ public abstract class SharedCryostorageSystem : EntitySystem [Dependency] private readonly IConfigurationManager _configuration = default!; [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ISharedPlayerManager _player = default!; + [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] protected readonly IGameTiming Timing = default!; @@ -168,9 +169,8 @@ public abstract class SharedCryostorageSystem : EntitySystem if (PausedMap != null && Exists(PausedMap)) return; - var map = _mapManager.CreateMap(); - _mapManager.SetMapPaused(map, true); - PausedMap = _mapManager.GetMapEntityId(map); + PausedMap = _map.CreateMap(); + _map.SetPaused(PausedMap.Value, true); } public bool IsInPausedMap(Entity<TransformComponent?> entity) From 411b563b1f8789b3ccc65daf41e2d45c40c70306 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 18:14:50 -0400 Subject: [PATCH 567/622] Cleanup warnings in `CableSystem.Placer` (#36868) * Fix warnings in CableSystem.Placer * Formatting --- .../Power/EntitySystems/CableSystem.Placer.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Content.Server/Power/EntitySystems/CableSystem.Placer.cs b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs index a5cf54fae0..5d9105a3fc 100644 --- a/Content.Server/Power/EntitySystems/CableSystem.Placer.cs +++ b/Content.Server/Power/EntitySystems/CableSystem.Placer.cs @@ -28,17 +28,18 @@ public sealed partial class CableSystem if (component.CablePrototypeId == null) return; - if(!TryComp<MapGridComponent>(_transform.GetGrid(args.ClickLocation), out var grid)) + if (!TryComp<MapGridComponent>(_transform.GetGrid(args.ClickLocation), out var grid)) return; var gridUid = _transform.GetGrid(args.ClickLocation)!.Value; - var snapPos = grid.TileIndicesFor(args.ClickLocation); - var tileDef = (ContentTileDefinition) _tileManager[_map.GetTileRef(gridUid, grid,snapPos).Tile.TypeId]; + var snapPos = _map.TileIndicesFor((gridUid, grid), args.ClickLocation); + var tileDef = (ContentTileDefinition)_tileManager[_map.GetTileRef(gridUid, grid, snapPos).Tile.TypeId]; if (!tileDef.IsSubFloor || !tileDef.Sturdy) return; - foreach (var anchored in grid.GetAnchoredEntities(snapPos)) + + foreach (var anchored in _map.GetAnchoredEntities((gridUid, grid), snapPos)) { if (TryComp<CableComponent>(anchored, out var wire) && wire.CableType == component.BlockingCableType) return; @@ -47,7 +48,7 @@ public sealed partial class CableSystem if (TryComp<StackComponent>(placer, out var stack) && !_stack.Use(placer, 1, stack)) return; - var newCable = EntityManager.SpawnEntity(component.CablePrototypeId, grid.GridTileToLocal(snapPos)); + var newCable = EntityManager.SpawnEntity(component.CablePrototypeId, _map.GridTileToLocal(gridUid, grid, snapPos)); _adminLogger.Add(LogType.Construction, LogImpact.Low, $"{ToPrettyString(args.User):player} placed {ToPrettyString(newCable):cable} at {Transform(newCable).Coordinates}"); args.Handled = true; From 02814e1e8d1b883cab4fb228506aa32fe78dbea4 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 18:25:13 -0400 Subject: [PATCH 568/622] Cleanup warnings in `PolymorphSystem.Map` (#36869) Fix warnings in PolymorphSystem.Map --- Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs | 5 ++--- Content.Server/Polymorph/Systems/PolymorphSystem.cs | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs index 120e04eeb0..1db624439a 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs @@ -31,8 +31,7 @@ public sealed partial class PolymorphSystem if (PausedMap != null && Exists(PausedMap)) return; - var newmap = _mapManager.CreateMap(); - _mapManager.SetMapPaused(newmap, true); - PausedMap = _mapManager.GetMapEntityId(newmap); + PausedMap = _map.CreateMap(); + _map.SetPaused(PausedMap.Value, true); } } diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index ddbde38a08..64dbcec547 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -29,7 +29,7 @@ namespace Content.Server.Polymorph.Systems; public sealed partial class PolymorphSystem : EntitySystem { [Dependency] private readonly IComponentFactory _compFact = default!; - [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly ActionsSystem _actions = default!; From b3d761921f27ed38359f1a26856c51e798d6e365 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 18:39:17 -0400 Subject: [PATCH 569/622] Cleanup warnings in `WorldgenConfigSystem` (#36864) Fix warnings in WorldgenConfigSystem --- Content.Server/Worldgen/Systems/WorldgenConfigSystem.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Server/Worldgen/Systems/WorldgenConfigSystem.cs b/Content.Server/Worldgen/Systems/WorldgenConfigSystem.cs index c47bfb9f88..cc0ec62733 100644 --- a/Content.Server/Worldgen/Systems/WorldgenConfigSystem.cs +++ b/Content.Server/Worldgen/Systems/WorldgenConfigSystem.cs @@ -22,7 +22,7 @@ public sealed class WorldgenConfigSystem : EntitySystem [Dependency] private readonly GameTicker _gameTicker = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IConsoleHost _conHost = default!; - [Dependency] private readonly IMapManager _map = default!; + [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly ISerializationManager _ser = default!; @@ -53,7 +53,7 @@ public sealed class WorldgenConfigSystem : EntitySystem return; } - var map = _map.GetMapEntityId(new MapId(mapInt)); + var map = _map.GetMapOrInvalid(new MapId(mapInt)); if (!_proto.TryIndex<WorldgenConfigPrototype>(args[1], out var proto)) { @@ -73,7 +73,7 @@ public sealed class WorldgenConfigSystem : EntitySystem if (_enabled == false) return; - var target = _map.GetMapEntityId(_gameTicker.DefaultMap); + var target = _map.GetMapOrInvalid(_gameTicker.DefaultMap); Log.Debug($"Trying to configure {_gameTicker.DefaultMap}, aka {ToPrettyString(target)} aka {target}"); var cfg = _proto.Index<WorldgenConfigPrototype>(_worldgenConfig); From 44106d5570cc4988e64e8e23de9f4bf02fe8c99d Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 19:29:49 -0400 Subject: [PATCH 570/622] Move guardian sounds to component (#36870) --- Content.Server/Guardian/GuardianComponent.cs | 20 ++++++++++++++++++++ Content.Server/Guardian/GuardianSystem.cs | 14 +++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Content.Server/Guardian/GuardianComponent.cs b/Content.Server/Guardian/GuardianComponent.cs index a54d033756..7a010c6a0b 100644 --- a/Content.Server/Guardian/GuardianComponent.cs +++ b/Content.Server/Guardian/GuardianComponent.cs @@ -1,3 +1,5 @@ +using Robust.Shared.Audio; + namespace Content.Server.Guardian { /// <summary> @@ -30,5 +32,23 @@ namespace Content.Server.Guardian [DataField] public bool GuardianLoose; + /// <summary> + /// Sound played when a mob starts hosting the guardian. + /// </summary> + [DataField] + public SoundSpecifier InjectSound = new SoundPathSpecifier("/Audio/Effects/guardian_inject.ogg"); + + /// <summary> + /// Sound played when the guardian enters critical state. + /// </summary> + [DataField] + public SoundSpecifier CriticalSound = new SoundPathSpecifier("/Audio/Effects/guardian_warn.ogg"); + + /// <summary> + /// Sound played when the guardian dies. + /// </summary> + [DataField] + public SoundSpecifier DeathSound = new SoundPathSpecifier("/Audio/Voice/Human/malescream_guardian.ogg", AudioParams.Default.WithVariation(0.2f)); + } } diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index e8c3fe7028..9c48258628 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Popups; using Content.Shared.Actions; -using Content.Shared.Audio; using Content.Shared.Damage; using Content.Shared.DoAfter; using Content.Shared.Examine; @@ -13,8 +12,6 @@ using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Mobs; using Content.Shared.Popups; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Player; @@ -224,7 +221,7 @@ namespace Content.Server.Guardian if (TryComp<GuardianComponent>(guardian, out var guardianComp)) { guardianComp.Host = args.Args.Target.Value; - _audio.PlayPvs("/Audio/Effects/guardian_inject.ogg", args.Args.Target.Value); + _audio.PlayPvs(guardianComp.InjectSound, args.Args.Target.Value); _popupSystem.PopupEntity(Loc.GetString("guardian-created"), args.Args.Target.Value, args.Args.Target.Value); // Exhaust the activator component.Used = true; @@ -246,15 +243,18 @@ namespace Content.Server.Guardian if (component.HostedGuardian == null) return; + TryComp<GuardianComponent>(component.HostedGuardian, out var guardianComp); + if (args.NewMobState == MobState.Critical) { _popupSystem.PopupEntity(Loc.GetString("guardian-host-critical-warn"), component.HostedGuardian.Value, component.HostedGuardian.Value); - _audio.PlayPvs("/Audio/Effects/guardian_warn.ogg", component.HostedGuardian.Value); + if (guardianComp != null) + _audio.PlayPvs(guardianComp.CriticalSound, component.HostedGuardian.Value); } else if (args.NewMobState == MobState.Dead) { - //TODO: Replace WithVariation with datafield - _audio.PlayPvs("/Audio/Voice/Human/malescream_guardian.ogg", uid, AudioParams.Default.WithVariation(0.20f)); + if (guardianComp != null) + _audio.PlayPvs(guardianComp.DeathSound, uid); RemComp<GuardianHostComponent>(uid); } } From acee0e53f73c95b75d742ceadbf428fa27e3ce8a Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 19:33:30 -0400 Subject: [PATCH 571/622] Cleanup warnings in `SpawnSalvageMissionJob` (#36866) * DoMapInitialize and SetMapPaused * GridTileToLocal * Formatting * Remove unused variables * Update Content.Server/Salvage/SpawnSalvageMissionJob.cs Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Salvage/SalvageSystem.Expeditions.cs | 2 -- .../Salvage/SpawnSalvageMissionJob.cs | 24 +++++++------------ 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/Content.Server/Salvage/SalvageSystem.Expeditions.cs b/Content.Server/Salvage/SalvageSystem.Expeditions.cs index 65583b38f5..0493bb22ce 100644 --- a/Content.Server/Salvage/SalvageSystem.Expeditions.cs +++ b/Content.Server/Salvage/SalvageSystem.Expeditions.cs @@ -165,13 +165,11 @@ public sealed partial class SalvageSystem EntityManager, _timing, _logManager, - _mapManager, _prototypeManager, _anchorable, _biome, _dungeon, _metaData, - _transform, _mapSystem, station, coordinatesDisk, diff --git a/Content.Server/Salvage/SpawnSalvageMissionJob.cs b/Content.Server/Salvage/SpawnSalvageMissionJob.cs index 6746c2f8bd..cbce4dc692 100644 --- a/Content.Server/Salvage/SpawnSalvageMissionJob.cs +++ b/Content.Server/Salvage/SpawnSalvageMissionJob.cs @@ -41,13 +41,11 @@ public sealed class SpawnSalvageMissionJob : Job<bool> { private readonly IEntityManager _entManager; private readonly IGameTiming _timing; - private readonly IMapManager _mapManager; private readonly IPrototypeManager _prototypeManager; private readonly AnchorableSystem _anchorable; private readonly BiomeSystem _biome; private readonly DungeonSystem _dungeon; private readonly MetaDataSystem _metaData; - private readonly SharedTransformSystem _xforms; private readonly SharedMapSystem _map; public readonly EntityUid Station; @@ -61,13 +59,11 @@ public sealed class SpawnSalvageMissionJob : Job<bool> IEntityManager entManager, IGameTiming timing, ILogManager logManager, - IMapManager mapManager, IPrototypeManager protoManager, AnchorableSystem anchorable, BiomeSystem biome, DungeonSystem dungeon, MetaDataSystem metaData, - SharedTransformSystem xform, SharedMapSystem map, EntityUid station, EntityUid? coordinatesDisk, @@ -76,13 +72,11 @@ public sealed class SpawnSalvageMissionJob : Job<bool> { _entManager = entManager; _timing = timing; - _mapManager = mapManager; _prototypeManager = protoManager; _anchorable = anchorable; _biome = biome; _dungeon = dungeon; _metaData = metaData; - _xforms = xform; _map = map; Station = station; CoordinatesDisk = coordinatesDisk; @@ -157,8 +151,8 @@ public sealed class SpawnSalvageMissionJob : Job<bool> } } - _mapManager.DoMapInitialize(mapId); - _mapManager.SetMapPaused(mapId, true); + _map.InitializeMap(mapId); + _map.SetPaused(mapUid, true); // Setup expedition var expedition = _entManager.AddComponent<SalvageExpeditionComponent>(mapUid); @@ -178,7 +172,7 @@ public sealed class SpawnSalvageMissionJob : Job<bool> dungeonOffset = dungeonRotation.RotateVec(dungeonOffset); var dungeonMod = _prototypeManager.Index<SalvageDungeonModPrototype>(mission.Dungeon); var dungeonConfig = _prototypeManager.Index(dungeonMod.Proto); - var dungeons = await WaitAsyncTask(_dungeon.GenerateDungeonAsync(dungeonConfig, mapUid, grid, (Vector2i) dungeonOffset, + var dungeons = await WaitAsyncTask(_dungeon.GenerateDungeonAsync(dungeonConfig, mapUid, grid, (Vector2i)dungeonOffset, _missionParams.Seed)); var dungeon = dungeons.First(); @@ -253,7 +247,7 @@ public sealed class SpawnSalvageMissionJob : Job<bool> try { - await SpawnRandomEntry(grid, entry, dungeon, random); + await SpawnRandomEntry((mapUid, grid), entry, dungeon, random); } catch (Exception e) { @@ -285,7 +279,7 @@ public sealed class SpawnSalvageMissionJob : Job<bool> break; _sawmill.Debug($"Spawning dungeon loot {entry.Proto}"); - await SpawnRandomEntry(grid, entry, dungeon, random); + await SpawnRandomEntry((mapUid, grid), entry, dungeon, random); } break; default: @@ -296,7 +290,7 @@ public sealed class SpawnSalvageMissionJob : Job<bool> return true; } - private async Task SpawnRandomEntry(MapGridComponent grid, IBudgetEntry entry, Dungeon dungeon, Random random) + private async Task SpawnRandomEntry(Entity<MapGridComponent> grid, IBudgetEntry entry, Dungeon dungeon, Random random) { await SuspendIfOutOfTime(); @@ -314,13 +308,13 @@ public sealed class SpawnSalvageMissionJob : Job<bool> { var tile = availableTiles.RemoveSwap(random.Next(availableTiles.Count)); - if (!_anchorable.TileFree(grid, tile, (int) CollisionGroup.MachineLayer, - (int) CollisionGroup.MachineLayer)) + if (!_anchorable.TileFree(grid, tile, (int)CollisionGroup.MachineLayer, + (int)CollisionGroup.MachineLayer)) { continue; } - var uid = _entManager.SpawnAtPosition(entry.Proto, grid.GridTileToLocal(tile)); + var uid = _entManager.SpawnAtPosition(entry.Proto, _map.GridTileToLocal(grid, grid, tile)); _entManager.RemoveComponent<GhostRoleComponent>(uid); _entManager.RemoveComponent<GhostTakeoverAvailableComponent>(uid); return; From 3313c648fe37f0a3522bad32f93d976f9af10be9 Mon Sep 17 00:00:00 2001 From: Tayrtahn <tayrtahn@gmail.com> Date: Wed, 23 Apr 2025 19:48:27 -0400 Subject: [PATCH 572/622] Fix warnings in `ServerDbManager` (#36871) Fix warnings in ServerDbManager --- Content.Server/Database/ServerDbManager.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Content.Server/Database/ServerDbManager.cs b/Content.Server/Database/ServerDbManager.cs index e3cfb66c7f..0498571895 100644 --- a/Content.Server/Database/ServerDbManager.cs +++ b/Content.Server/Database/ServerDbManager.cs @@ -408,6 +408,7 @@ namespace Content.Server.Database private ServerDbBase _db = default!; private LoggingProvider _msLogProvider = default!; private ILoggerFactory _msLoggerFactory = default!; + private ISawmill _sawmill = default!; private bool _synchronous; // When running in integration tests, we'll use a single in-memory SQLite database connection. @@ -423,6 +424,7 @@ namespace Content.Server.Database { builder.AddProvider(_msLogProvider); }); + _sawmill = _logMgr.GetSawmill("db.manager"); _synchronous = _cfg.GetCVar(CCVars.DatabaseSynchronous); @@ -1144,7 +1146,7 @@ namespace Content.Server.Database Password = pass }.ConnectionString; - Logger.DebugS("db.manager", $"Using Postgres \"{host}:{port}/{db}\""); + _sawmill.Debug($"Using Postgres \"{host}:{port}/{db}\""); builder.UseNpgsql(connectionString); SetupLogging(builder); @@ -1167,12 +1169,12 @@ namespace Content.Server.Database if (!inMemory) { var finalPreferencesDbPath = Path.Combine(_res.UserData.RootDir!, configPreferencesDbPath); - Logger.DebugS("db.manager", $"Using SQLite DB \"{finalPreferencesDbPath}\""); + _sawmill.Debug($"Using SQLite DB \"{finalPreferencesDbPath}\""); getConnection = () => new SqliteConnection($"Data Source={finalPreferencesDbPath}"); } else { - Logger.DebugS("db.manager", "Using in-memory SQLite DB"); + _sawmill.Debug("Using in-memory SQLite DB"); _sqliteInMemoryConnection = new SqliteConnection("Data Source=:memory:"); // When using an in-memory DB we have to open it manually // so EFCore doesn't open, close and wipe it every operation. From 8045373197e825fab784773564d863e0bb3ed437 Mon Sep 17 00:00:00 2001 From: ArchRBX <5040911+ArchRBX@users.noreply.github.com> Date: Thu, 24 Apr 2025 00:55:35 +0100 Subject: [PATCH 573/622] pAI Software Catalog (#36857) * initial commit * add the shop and make it work * add existing pai actions to the software shop * added power monitor app * killed the power and crew monitor software, too powercreepy * fix test failures * fix more test failures * fix merge conflicts * code changes to conform with review * fix unintentional submodule update * submodule update * remove unused currency prototype ref --------- Co-authored-by: archrbx <punk.gear5260@fastmail.com> --- Content.Server/PAI/PAISystem.cs | 22 +++++-- Content.Shared/PAI/PAIComponent.cs | 12 ++-- Content.Shared/PAI/SharedPAISystem.cs | 59 +++++++++---------- Resources/Locale/en-US/store/currency.ftl | 1 + Resources/Locale/en-US/store/pai-catalog.ftl | 8 +++ Resources/Prototypes/Catalog/pai_catalog.yml | 43 ++++++++++++++ .../Prototypes/Entities/Objects/Fun/pai.yml | 43 ++++++++++++++ Resources/Prototypes/Store/categories.yml | 5 ++ Resources/Prototypes/Store/currency.yml | 5 ++ 9 files changed, 156 insertions(+), 42 deletions(-) create mode 100644 Resources/Locale/en-US/store/pai-catalog.ftl create mode 100644 Resources/Prototypes/Catalog/pai_catalog.yml diff --git a/Content.Server/PAI/PAISystem.cs b/Content.Server/PAI/PAISystem.cs index fd581f40e4..289b74b258 100644 --- a/Content.Server/PAI/PAISystem.cs +++ b/Content.Server/PAI/PAISystem.cs @@ -2,14 +2,17 @@ using Content.Server.Ghost.Roles; using Content.Server.Ghost.Roles.Components; using Content.Server.Instruments; using Content.Server.Kitchen.Components; +using Content.Server.Store.Systems; using Content.Shared.Interaction.Events; using Content.Shared.Mind.Components; using Content.Shared.PAI; using Content.Shared.Popups; -using Robust.Shared.Random; -using System.Text; +using Content.Shared.Store; +using Content.Shared.Store.Components; using Content.Shared.Instruments; -using Robust.Shared.Player; +using Robust.Shared.Random; +using Robust.Shared.Prototypes; +using System.Text; namespace Content.Server.PAI; @@ -19,12 +22,13 @@ public sealed class PAISystem : SharedPAISystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly StoreSystem _store = default!; [Dependency] private readonly ToggleableGhostRoleSystem _toggleableGhostRole = default!; /// <summary> /// Possible symbols that can be part of a scrambled pai's name. /// </summary> - private static readonly char[] SYMBOLS = new[] { '#', '~', '-', '@', '&', '^', '%', '$', '*', ' '}; + private static readonly char[] SYMBOLS = new[] { '#', '~', '-', '@', '&', '^', '%', '$', '*', ' ' }; public override void Initialize() { @@ -34,6 +38,8 @@ public sealed class PAISystem : SharedPAISystem SubscribeLocalEvent<PAIComponent, MindAddedMessage>(OnMindAdded); SubscribeLocalEvent<PAIComponent, MindRemovedMessage>(OnMindRemoved); SubscribeLocalEvent<PAIComponent, BeingMicrowavedEvent>(OnMicrowaved); + + SubscribeLocalEvent<PAIComponent, PAIShopActionEvent>(OnShop); } private void OnUseInHand(EntityUid uid, PAIComponent component, UseInHandEvent args) @@ -101,6 +107,14 @@ public sealed class PAISystem : SharedPAISystem _metaData.SetEntityName(uid, val); } + private void OnShop(Entity<PAIComponent> ent, ref PAIShopActionEvent args) + { + if (!TryComp<StoreComponent>(ent, out var store)) + return; + + _store.ToggleUi(args.Performer, ent, store); + } + public void PAITurningOff(EntityUid uid) { // Close the instrument interface if it was open diff --git a/Content.Shared/PAI/PAIComponent.cs b/Content.Shared/PAI/PAIComponent.cs index 9d5be30275..fb9d7150e3 100644 --- a/Content.Shared/PAI/PAIComponent.cs +++ b/Content.Shared/PAI/PAIComponent.cs @@ -1,3 +1,5 @@ +using Content.Shared.FixedPoint; +using Content.Shared.Store; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -24,17 +26,11 @@ public sealed partial class PAIComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] public EntityUid? LastUser; - [DataField(serverOnly: true)] - public EntProtoId? MidiActionId = "ActionPAIPlayMidi"; - - [DataField(serverOnly: true)] // server only, as it uses a server-BUI event !type - public EntityUid? MidiAction; - [DataField] - public EntProtoId MapActionId = "ActionPAIOpenMap"; + public EntProtoId ShopActionId = "ActionPAIOpenShop"; [DataField, AutoNetworkedField] - public EntityUid? MapAction; + public EntityUid? ShopAction; /// <summary> /// When microwaved there is this chance to brick the pai, kicking out its player and preventing it from being used again. diff --git a/Content.Shared/PAI/SharedPAISystem.cs b/Content.Shared/PAI/SharedPAISystem.cs index d66365eb85..c100e38a76 100644 --- a/Content.Shared/PAI/SharedPAISystem.cs +++ b/Content.Shared/PAI/SharedPAISystem.cs @@ -1,39 +1,38 @@ using Content.Shared.Actions; -namespace Content.Shared.PAI +namespace Content.Shared.PAI; + +/// <summary> +/// pAIs, or Personal AIs, are essentially portable ghost role generators. +/// In their current implementation, they create a ghost role anyone can access, +/// and that a player can also "wipe" (reset/kick out player). +/// Theoretically speaking pAIs are supposed to use a dedicated "offer and select" system, +/// with the player holding the pAI being able to choose one of the ghosts in the round. +/// This seems too complicated for an initial implementation, though, +/// and there's not always enough players and ghost roles to justify it. +/// </summary> +public abstract class SharedPAISystem : EntitySystem { - /// <summary> - /// pAIs, or Personal AIs, are essentially portable ghost role generators. - /// In their current implementation, they create a ghost role anyone can access, - /// and that a player can also "wipe" (reset/kick out player). - /// Theoretically speaking pAIs are supposed to use a dedicated "offer and select" system, - /// with the player holding the pAI being able to choose one of the ghosts in the round. - /// This seems too complicated for an initial implementation, though, - /// and there's not always enough players and ghost roles to justify it. - /// </summary> - public abstract class SharedPAISystem : EntitySystem + [Dependency] private readonly SharedActionsSystem _actions = default!; + + public override void Initialize() { - [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + base.Initialize(); - public override void Initialize() - { - base.Initialize(); + SubscribeLocalEvent<PAIComponent, MapInitEvent>(OnMapInit); + SubscribeLocalEvent<PAIComponent, ComponentShutdown>(OnShutdown); + } - SubscribeLocalEvent<PAIComponent, MapInitEvent>(OnMapInit); - SubscribeLocalEvent<PAIComponent, ComponentShutdown>(OnShutdown); - } + private void OnMapInit(Entity<PAIComponent> ent, ref MapInitEvent args) + { + _actions.AddAction(ent, ent.Comp.ShopActionId); + } - private void OnMapInit(EntityUid uid, PAIComponent component, MapInitEvent args) - { - _actionsSystem.AddAction(uid, ref component.MidiAction, component.MidiActionId); - _actionsSystem.AddAction(uid, ref component.MapAction, component.MapActionId); - } - - private void OnShutdown(EntityUid uid, PAIComponent component, ComponentShutdown args) - { - _actionsSystem.RemoveAction(uid, component.MidiAction); - _actionsSystem.RemoveAction(uid, component.MapAction); - } + private void OnShutdown(Entity<PAIComponent> ent, ref ComponentShutdown args) + { + _actions.RemoveAction(ent, ent.Comp.ShopAction); } } - +public sealed partial class PAIShopActionEvent : InstantActionEvent +{ +} diff --git a/Resources/Locale/en-US/store/currency.ftl b/Resources/Locale/en-US/store/currency.ftl index ada70b5597..1ba66e6481 100644 --- a/Resources/Locale/en-US/store/currency.ftl +++ b/Resources/Locale/en-US/store/currency.ftl @@ -9,4 +9,5 @@ store-currency-display-debugdollar = {$amount -> } store-currency-display-telecrystal = TC store-currency-display-stolen-essence = Stolen Essence +store-currency-display-silicon-memory = Memory store-currency-display-wizcoin = Wiz€oin™ diff --git a/Resources/Locale/en-US/store/pai-catalog.ftl b/Resources/Locale/en-US/store/pai-catalog.ftl new file mode 100644 index 0000000000..3054935614 --- /dev/null +++ b/Resources/Locale/en-US/store/pai-catalog.ftl @@ -0,0 +1,8 @@ +pai-mass-scanner-name = Mass Scanner +pai-mass-scanner-desc = Enables you to scan nearby masses to assist in navigation. + +pai-midi-player-name = MIDI Player +pai-midi-player-desc = Enables you to play music to entertain your owner. + +pai-station-map-name = Station Map +pai-station-map-desc = Enables you to view the station map to assist in navigation. diff --git a/Resources/Prototypes/Catalog/pai_catalog.yml b/Resources/Prototypes/Catalog/pai_catalog.yml new file mode 100644 index 0000000000..913eae5d0b --- /dev/null +++ b/Resources/Prototypes/Catalog/pai_catalog.yml @@ -0,0 +1,43 @@ +# Some things might seem like great ideas on paper for pAI apps, but have deliberately been excluded. +# e.g. Monitoring (Power/Atmos/Crew), Cameras, etc. are excluded as apps for performance and balance reasons. +# Generally speaking, if you're adding an application, it needs to *not* be round-impacting. +# Remember that pAI's are *assistants*, not players. + +- type: listing + id: PAIMassScanner + name: pai-mass-scanner-name + description: pai-mass-scanner-desc + productAction: ActionPAIMassScanner + cost: + SiliconMemory: 10 + categories: + - PAIAbilities + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + +- type: listing + id: PAIMIDIPlayer + name: pai-midi-player-name + description: pai-midi-player-desc + productAction: ActionPAIPlayMidi + cost: + SiliconMemory: 5 + categories: + - PAIAbilities + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + +- type: listing + id: PAIStationMap + name: pai-station-map-name + description: pai-station-map-desc + productAction: ActionPAIOpenMap + cost: + SiliconMemory: 5 + categories: + - PAIAbilities + conditions: + - !type:ListingLimitedStockCondition + stock: 1 diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 19aec6e0e2..2a8e0e6a7f 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -13,6 +13,13 @@ program: 2 - type: UserInterface interfaces: + enum.StoreUiKey.Key: + type: StoreBoundUserInterface + requireInputValidation: false + # available in pai shop + enum.RadarConsoleUiKey.Key: + type: RadarConsoleBoundUserInterface + requireInputValidation: false enum.InstrumentUiKey.Key: type: InstrumentBoundUserInterface requireInputValidation: false @@ -51,6 +58,16 @@ - Common - type: DoAfter - type: Actions + - type: Store + categories: + - PAIAbilities + currencyWhitelist: + - SiliconMemory + balance: + SiliconMemory: 30 + - type: RadarConsole + maxRange: 256 + followEntity: true - type: TypingIndicator proto: robot - type: Speech @@ -141,6 +158,30 @@ graph: PotatoAI node: potatoai +- type: entity + id: ActionPAIOpenShop + name: Software Catalog + description: Install new software to assist your owner. + components: + - type: InstantAction + checkCanInteract: false + checkConsciousness: false + icon: Interface/Actions/shop.png + event: !type:PAIShopActionEvent + +- type: entity + id: ActionPAIMassScanner + name: Mass Scanner + description: View a mass scanner interface. + components: + - type: InstantAction + checkCanInteract: false + checkConsciousness: false + icon: { sprite: Interface/Actions/actions_ai.rsi, state: mass_scanner } + itemIconStyle: NoItem + event: !type:OpenUiActionEvent + key: enum.RadarConsoleUiKey.Key + - type: entity id: ActionPAIPlayMidi name: Play MIDI @@ -150,6 +191,7 @@ checkCanInteract: false checkConsciousness: false icon: Interface/Actions/pai-midi.png + itemIconStyle: NoItem event: !type:OpenUiActionEvent key: enum.InstrumentUiKey.Key @@ -162,5 +204,6 @@ checkCanInteract: false checkConsciousness: false icon: { sprite: Interface/Actions/pai-map.rsi, state: icon } + itemIconStyle: NoItem event: !type:OpenUiActionEvent key: enum.StationMapUiKey.Key diff --git a/Resources/Prototypes/Store/categories.yml b/Resources/Prototypes/Store/categories.yml index 69cde10020..b3c358d388 100644 --- a/Resources/Prototypes/Store/categories.yml +++ b/Resources/Prototypes/Store/categories.yml @@ -94,6 +94,11 @@ id: RevenantAbilities name: store-category-abilities +#pai +- type: storeCategory + id: PAIAbilities + name: store-category-abilities + - type: storeCategory id: DiscountedItems name: store-discounted-items diff --git a/Resources/Prototypes/Store/currency.yml b/Resources/Prototypes/Store/currency.yml index b1cff06be2..0173de62f9 100644 --- a/Resources/Prototypes/Store/currency.yml +++ b/Resources/Prototypes/Store/currency.yml @@ -10,6 +10,11 @@ displayName: store-currency-display-stolen-essence canWithdraw: false +- type: currency + id: SiliconMemory + displayName: store-currency-display-silicon-memory + canWithdraw: false + - type: currency id: WizCoin displayName: store-currency-display-wizcoin From a7b2b0bf0f48e3941d345d59842f10d424aa866b Mon Sep 17 00:00:00 2001 From: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Date: Wed, 23 Apr 2025 19:56:31 -0400 Subject: [PATCH 574/622] New Salvage Ruin - Hydro Outpost (#36826) --- Resources/Maps/Ruins/hydro_outpost.yml | 3114 +++++++++++++++++ .../Prototypes/Entities/Stations/base.yml | 1 + 2 files changed, 3115 insertions(+) create mode 100644 Resources/Maps/Ruins/hydro_outpost.yml diff --git a/Resources/Maps/Ruins/hydro_outpost.yml b/Resources/Maps/Ruins/hydro_outpost.yml new file mode 100644 index 0000000000..3c9dc1b0e8 --- /dev/null +++ b/Resources/Maps/Ruins/hydro_outpost.yml @@ -0,0 +1,3114 @@ +meta: + format: 7 + category: Grid + engineVersion: 254.1.0 + forkId: "" + forkVersion: "" + time: 04/22/2025 08:17:21 + entityCount: 529 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] +tilemap: + 1: Space + 0: FloorAsteroidSand + 5: FloorSteel + 6: FloorSteelDamaged + 3: Lattice + 2: Plating + 4: PlatingDamaged +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -2.7436135,3.2901328 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAALAAAAAAAABAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABAAAAAABAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAEAAAAAAAAAgAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAABAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAABAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAABAAAAAACAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABQAAAAAABQAAAAABBQAAAAACAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAHAAAAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAAAAFAAAAAAAAAAAAAAAIAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAgAAAAAABQAAAAADBQAAAAABBQAAAAADAgAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABQAAAAACBQAAAAABBQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAgAAAAAAAgAAAAAAAgAAAAAABQAAAAACBQAAAAAABQAAAAADAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAACBQAAAAAABQAAAAADBQAAAAADBQAAAAABBQAAAAABBQAAAAABAgAAAAAAAgAAAAAABQAAAAACBQAAAAADBgAAAAADAgAAAAAABQAAAAABBQAAAAACBQAAAAABBQAAAAADBQAAAAADBgAAAAABAgAAAAAAAgAAAAAABQAAAAADBQAAAAAAAgAAAAAAAgAAAAAABQAAAAABBQAAAAADBQAAAAAABAAAAAABAgAAAAAABQAAAAACBQAAAAAABQAAAAACAgAAAAAABQAAAAAAAgAAAAAABQAAAAAABgAAAAAEBQAAAAABAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAACBAAAAAACAgAAAAAABQAAAAACBQAAAAAABQAAAAAAAgAAAAAABQAAAAADAwAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAABQAAAAABAgAAAAAABQAAAAADAgAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAgAAAAAABQAAAAABBQAAAAADBQAAAAAAAgAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -1,-2: + ind: -1,-2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB + version: 6 + 0,-2: + ind: 0,-2 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAAAQAAAAAAAgAAAAAA + version: 6 + 1,-1: + ind: 1,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA + version: 6 + -2,-1: + ind: -2,-1 + tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAgAAAAAAAwAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAgAAAAAABQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABQAAAAAABgAAAAABAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAABQAAAAABAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAABQAAAAABBgAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAwAAAAAAAgAAAAAABQAAAAAAAgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAgAAAAAAAgAAAAAAAgAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerNe + decals: + 52: -2,-1 + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerNw + decals: + 21: -15,-4 + 23: -19,-3 + 46: -8,-3 + 51: -4,-1 + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerSe + decals: + 45: -7,-6 + 57: -2,-6 + - node: + color: '#9FED5896' + id: BrickTileWhiteCornerSw + decals: + 22: -15,-5 + 44: -8,-6 + 58: -3,-6 + - node: + color: '#9FED5896' + id: BrickTileWhiteEndN + decals: + 24: -18,-2 + - node: + color: '#9FED5896' + id: BrickTileWhiteEndS + decals: + 61: -5,-8 + - node: + color: '#9FED5896' + id: BrickTileWhiteInnerNe + decals: + 26: -18,-3 + - node: + color: '#9FED5896' + id: BrickTileWhiteInnerNw + decals: + 25: -18,-3 + 42: -8,-4 + 50: -4,-3 + - node: + color: '#9FED5896' + id: BrickTileWhiteInnerSw + decals: + 43: -8,-5 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineE + decals: + 53: -2,-2 + 55: -2,-4 + 56: -2,-5 + 62: -5,-7 + 63: -5,-6 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineN + decals: + 32: -14,-4 + 36: -10,-4 + 37: -13,-4 + 40: -9,-4 + 49: -5,-3 + 60: -3,-1 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineS + decals: + 27: -14,-5 + 30: -11,-5 + 31: -10,-5 + 41: -9,-5 + 66: -13,-5 + - node: + color: '#9FED5896' + id: BrickTileWhiteLineW + decals: + 59: -4,-2 + 64: -5,-7 + 65: -5,-6 + - node: + color: '#9FED5896' + id: FullTileOverlayGreyscale + decals: + 12: -6,-6 + 13: -6,-7 + 14: -6,-8 + 15: -6,-9 + 16: -5,-9 + 17: -4,-9 + 18: -4,-8 + 19: -4,-7 + 20: -4,-6 + - node: + cleanable: True + color: '#FFFFFFFF' + id: burnt1 + decals: + 84: -10,-5 + 85: -9,-4 + 86: -8,-3 + 87: -8,-5 + 88: -4,-3 + 89: -4,-2 + 90: -2,-2 + 91: -2,-3 + 92: -3,-5 + 93: -4,-5 + 94: -5,-8 + 95: -5,-7 + 96: -6,-7 + 97: -6,-6 + 98: -20,-4 + - node: + cleanable: True + color: '#FFFFFFFF' + id: burnt2 + decals: + 75: -19,-5 + 76: -19,-4 + 77: -15,-4 + 78: -13,-5 + 79: -10,-4 + 80: -9,-5 + 81: -8,-5 + 82: -7,-4 + 83: -6,-3 + 99: 1,-6 + 100: 4,-15 + 101: 3,-16 + 102: 9,-15 + 103: 11,-15 + 104: 2,-13 + 105: 2,-12 + - node: + cleanable: True + color: '#FFFFFFFF' + id: burnt4 + decals: + 67: -6,-3 + 68: -2,-6 + 69: 2,-5 + 70: 3,-6 + 71: 3,-7 + 72: 4,-7 + 73: -6,-9 + 74: -17,-4 + - type: GridAtmosphere + version: 2 + data: + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: AirlockExternalGlass + entities: + - uid: 20 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-2.5 + parent: 1 + - uid: 21 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,-2.5 + parent: 1 + - uid: 316 + components: + - type: Transform + pos: -8.5,-4.5 + parent: 1 +- proto: AirlockExternalGlassShuttleLocked + entities: + - uid: 283 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -14.5,-4.5 + parent: 1 + - uid: 284 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -14.5,-3.5 + parent: 1 + - uid: 285 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,-3.5 + parent: 1 + - uid: 286 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,-4.5 + parent: 1 +- proto: APCBasic + entities: + - uid: 141 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 +- proto: AsteroidRock + entities: + - uid: 130 + components: + - type: Transform + pos: 1.5,-14.5 + parent: 1 + - uid: 279 + components: + - type: Transform + pos: -9.5,-1.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: -7.5,-0.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: -8.5,-0.5 + parent: 1 + - uid: 329 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 331 + components: + - type: Transform + pos: -1.5,2.5 + parent: 1 + - uid: 332 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 334 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 340 + components: + - type: Transform + pos: -8.5,-7.5 + parent: 1 + - uid: 344 + components: + - type: Transform + pos: -9.5,-9.5 + parent: 1 + - uid: 345 + components: + - type: Transform + pos: -8.5,-10.5 + parent: 1 + - uid: 347 + components: + - type: Transform + pos: -9.5,-7.5 + parent: 1 + - uid: 348 + components: + - type: Transform + pos: -10.5,-7.5 + parent: 1 + - uid: 350 + components: + - type: Transform + pos: -3.5,-10.5 + parent: 1 + - uid: 353 + components: + - type: Transform + pos: -0.5,-11.5 + parent: 1 + - uid: 354 + components: + - type: Transform + pos: 0.5,-12.5 + parent: 1 + - uid: 355 + components: + - type: Transform + pos: 1.5,-13.5 + parent: 1 + - uid: 356 + components: + - type: Transform + pos: 0.5,-11.5 + parent: 1 + - uid: 357 + components: + - type: Transform + pos: -3.5,-11.5 + parent: 1 + - uid: 358 + components: + - type: Transform + pos: -4.5,-10.5 + parent: 1 + - uid: 359 + components: + - type: Transform + pos: 1.5,-15.5 + parent: 1 + - uid: 361 + components: + - type: Transform + pos: -0.5,-16.5 + parent: 1 + - uid: 362 + components: + - type: Transform + pos: 0.5,-16.5 + parent: 1 + - uid: 365 + components: + - type: Transform + pos: -12.5,-1.5 + parent: 1 + - uid: 367 + components: + - type: Transform + pos: -13.5,-1.5 + parent: 1 + - uid: 368 + components: + - type: Transform + pos: -12.5,0.5 + parent: 1 + - uid: 369 + components: + - type: Transform + pos: -10.5,1.5 + parent: 1 + - uid: 370 + components: + - type: Transform + pos: -9.5,1.5 + parent: 1 + - uid: 373 + components: + - type: Transform + pos: -10.5,0.5 + parent: 1 + - uid: 380 + components: + - type: Transform + pos: -11.5,-7.5 + parent: 1 + - uid: 387 + components: + - type: Transform + pos: -3.5,-18.5 + parent: 1 + - uid: 389 + components: + - type: Transform + pos: -1.5,-18.5 + parent: 1 + - uid: 390 + components: + - type: Transform + pos: -1.5,-19.5 + parent: 1 + - uid: 392 + components: + - type: Transform + pos: -3.5,-15.5 + parent: 1 + - uid: 393 + components: + - type: Transform + pos: -4.5,-14.5 + parent: 1 + - uid: 409 + components: + - type: Transform + pos: 0.5,-14.5 + parent: 1 + - uid: 413 + components: + - type: Transform + pos: -3.5,-16.5 + parent: 1 + - uid: 415 + components: + - type: Transform + pos: -5.5,-15.5 + parent: 1 + - uid: 416 + components: + - type: Transform + pos: -5.5,-14.5 + parent: 1 + - uid: 418 + components: + - type: Transform + pos: 0.5,-10.5 + parent: 1 + - uid: 420 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 427 + components: + - type: Transform + pos: 0.5,2.5 + parent: 1 + - uid: 428 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 490 + components: + - type: Transform + pos: -6.5,-10.5 + parent: 1 + - uid: 509 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 510 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 511 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 512 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 513 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 514 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 515 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 516 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 521 + components: + - type: Transform + pos: 4.5,4.5 + parent: 1 + - uid: 522 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 523 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 524 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 + - uid: 525 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 +- proto: AsteroidRockCoal + entities: + - uid: 366 + components: + - type: Transform + pos: -12.5,-0.5 + parent: 1 + - uid: 372 + components: + - type: Transform + pos: -9.5,0.5 + parent: 1 + - uid: 385 + components: + - type: Transform + pos: -2.5,-17.5 + parent: 1 + - uid: 407 + components: + - type: Transform + pos: -3.5,-14.5 + parent: 1 + - uid: 410 + components: + - type: Transform + pos: 0.5,-13.5 + parent: 1 + - uid: 411 + components: + - type: Transform + pos: -0.5,-12.5 + parent: 1 +- proto: AsteroidRockCoalCrab + entities: + - uid: 333 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - uid: 336 + components: + - type: Transform + pos: 3.5,-0.5 + parent: 1 + - uid: 338 + components: + - type: Transform + pos: -0.5,-7.5 + parent: 1 + - uid: 341 + components: + - type: Transform + pos: -9.5,-6.5 + parent: 1 +- proto: AsteroidRockDiamond + entities: + - uid: 396 + components: + - type: Transform + pos: -1.5,-14.5 + parent: 1 +- proto: AsteroidRockGold + entities: + - uid: 402 + components: + - type: Transform + pos: -2.5,-12.5 + parent: 1 + - uid: 406 + components: + - type: Transform + pos: -2.5,-15.5 + parent: 1 + - uid: 414 + components: + - type: Transform + pos: -4.5,-15.5 + parent: 1 + - uid: 424 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 +- proto: AsteroidRockMining + entities: + - uid: 335 + components: + - type: Transform + pos: 5.5,2.5 + parent: 1 + - uid: 339 + components: + - type: Transform + pos: -1.5,-7.5 + parent: 1 + - uid: 343 + components: + - type: Transform + pos: -9.5,-8.5 + parent: 1 + - uid: 351 + components: + - type: Transform + pos: -2.5,-11.5 + parent: 1 + - uid: 352 + components: + - type: Transform + pos: -1.5,-11.5 + parent: 1 + - uid: 384 + components: + - type: Transform + pos: -1.5,-17.5 + parent: 1 + - uid: 386 + components: + - type: Transform + pos: -3.5,-17.5 + parent: 1 + - uid: 388 + components: + - type: Transform + pos: -2.5,-18.5 + parent: 1 + - uid: 391 + components: + - type: Transform + pos: -2.5,-16.5 + parent: 1 + - uid: 397 + components: + - type: Transform + pos: -1.5,-15.5 + parent: 1 + - uid: 398 + components: + - type: Transform + pos: -0.5,-15.5 + parent: 1 + - uid: 399 + components: + - type: Transform + pos: -0.5,-14.5 + parent: 1 + - uid: 401 + components: + - type: Transform + pos: -1.5,-12.5 + parent: 1 + - uid: 404 + components: + - type: Transform + pos: -4.5,-12.5 + parent: 1 + - uid: 405 + components: + - type: Transform + pos: -2.5,-14.5 + parent: 1 + - uid: 417 + components: + - type: Transform + pos: -4.5,-13.5 + parent: 1 + - uid: 421 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 422 + components: + - type: Transform + pos: 0.5,1.5 + parent: 1 + - uid: 423 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 425 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 426 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 + - uid: 429 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - uid: 431 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 + - uid: 432 + components: + - type: Transform + pos: -8.5,2.5 + parent: 1 + - uid: 433 + components: + - type: Transform + pos: -9.5,2.5 + parent: 1 + - uid: 434 + components: + - type: Transform + pos: -10.5,2.5 + parent: 1 + - uid: 435 + components: + - type: Transform + pos: -11.5,1.5 + parent: 1 + - uid: 436 + components: + - type: Transform + pos: -11.5,0.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: -10.5,3.5 + parent: 1 + - uid: 438 + components: + - type: Transform + pos: -9.5,3.5 + parent: 1 + - uid: 486 + components: + - type: Transform + pos: -10.5,-0.5 + parent: 1 + - uid: 491 + components: + - type: Transform + pos: -5.5,-10.5 + parent: 1 + - uid: 492 + components: + - type: Transform + pos: -5.5,-11.5 + parent: 1 + - uid: 493 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 494 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 495 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 496 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 497 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 518 + components: + - type: Transform + pos: 4.5,3.5 + parent: 1 + - uid: 519 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 520 + components: + - type: Transform + pos: 5.5,3.5 + parent: 1 +- proto: AsteroidRockQuartz + entities: + - uid: 326 + components: + - type: Transform + pos: -9.5,-0.5 + parent: 1 + - uid: 349 + components: + - type: Transform + pos: -4.5,-11.5 + parent: 1 + - uid: 394 + components: + - type: Transform + pos: -3.5,-13.5 + parent: 1 + - uid: 403 + components: + - type: Transform + pos: -3.5,-12.5 + parent: 1 +- proto: AsteroidRockQuartzCrab + entities: + - uid: 346 + components: + - type: Transform + pos: -9.5,-10.5 + parent: 1 + - uid: 363 + components: + - type: Transform + pos: 1.5,-12.5 + parent: 1 + - uid: 371 + components: + - type: Transform + pos: -8.5,0.5 + parent: 1 + - uid: 430 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 +- proto: AsteroidRockSilver + entities: + - uid: 315 + components: + - type: Transform + pos: -0.5,-17.5 + parent: 1 +- proto: AsteroidRockSilverCrab + entities: + - uid: 395 + components: + - type: Transform + pos: -1.5,-13.5 + parent: 1 +- proto: AsteroidRockTin + entities: + - uid: 330 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 + - uid: 337 + components: + - type: Transform + pos: 2.5,-0.5 + parent: 1 + - uid: 360 + components: + - type: Transform + pos: 0.5,-15.5 + parent: 1 + - uid: 400 + components: + - type: Transform + pos: -0.5,-13.5 + parent: 1 + - uid: 408 + components: + - type: Transform + pos: -2.5,-13.5 + parent: 1 + - uid: 412 + components: + - type: Transform + pos: -1.5,-16.5 + parent: 1 + - uid: 419 + components: + - type: Transform + pos: -0.5,-10.5 + parent: 1 +- proto: AsteroidRockUranium + entities: + - uid: 342 + components: + - type: Transform + pos: -10.5,-6.5 + parent: 1 +- proto: Bed + entities: + - uid: 323 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 +- proto: BedsheetSpawner + entities: + - uid: 324 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 14 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: 3.5,-13.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 216 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 219 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - uid: 220 + components: + - type: Transform + pos: 1.5,-2.5 + parent: 1 + - uid: 221 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 222 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: 2.5,-7.5 + parent: 1 + - uid: 225 + components: + - type: Transform + pos: 2.5,-8.5 + parent: 1 + - uid: 226 + components: + - type: Transform + pos: 2.5,-9.5 + parent: 1 + - uid: 227 + components: + - type: Transform + pos: 2.5,-10.5 + parent: 1 + - uid: 228 + components: + - type: Transform + pos: 2.5,-11.5 + parent: 1 + - uid: 229 + components: + - type: Transform + pos: 3.5,-11.5 + parent: 1 + - uid: 230 + components: + - type: Transform + pos: 3.5,-12.5 + parent: 1 + - uid: 231 + components: + - type: Transform + pos: 4.5,-17.5 + parent: 1 + - uid: 232 + components: + - type: Transform + pos: 4.5,-13.5 + parent: 1 + - uid: 233 + components: + - type: Transform + pos: 5.5,-13.5 + parent: 1 + - uid: 234 + components: + - type: Transform + pos: 5.5,-14.5 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: 5.5,-15.5 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: 4.5,-15.5 + parent: 1 + - uid: 237 + components: + - type: Transform + pos: 4.5,-16.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: 4.5,-18.5 + parent: 1 + - uid: 239 + components: + - type: Transform + pos: 4.5,-19.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: 4.5,-20.5 + parent: 1 + - uid: 241 + components: + - type: Transform + pos: 4.5,-21.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: 4.5,-22.5 + parent: 1 + - uid: 243 + components: + - type: Transform + pos: 4.5,-23.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: 4.5,-24.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: 4.5,-25.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: 6.5,-14.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: 7.5,-14.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: 8.5,-14.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: 9.5,-14.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: 10.5,-14.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: 11.5,-14.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: 12.5,-14.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: 13.5,-14.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: 14.5,-14.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: 15.5,-14.5 + parent: 1 + - uid: 256 + components: + - type: Transform + pos: 16.5,-14.5 + parent: 1 + - uid: 263 + components: + - type: Transform + pos: -4.5,-4.5 + parent: 1 + - uid: 264 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 265 + components: + - type: Transform + pos: -4.5,-6.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: -4.5,-7.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: -5.5,-4.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: -6.5,-4.5 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: -7.5,-4.5 + parent: 1 + - uid: 270 + components: + - type: Transform + pos: -8.5,-4.5 + parent: 1 + - uid: 271 + components: + - type: Transform + pos: -9.5,-4.5 + parent: 1 + - uid: 272 + components: + - type: Transform + pos: -10.5,-4.5 + parent: 1 + - uid: 273 + components: + - type: Transform + pos: -11.5,-4.5 + parent: 1 + - uid: 274 + components: + - type: Transform + pos: -3.5,-4.5 + parent: 1 + - uid: 275 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 276 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 277 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 278 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 305 + components: + - type: Transform + pos: -12.5,-4.5 + parent: 1 + - uid: 306 + components: + - type: Transform + pos: -13.5,-4.5 + parent: 1 + - uid: 501 + components: + - type: Transform + pos: -17.5,-2.5 + parent: 1 + - uid: 502 + components: + - type: Transform + pos: -17.5,-3.5 + parent: 1 + - uid: 503 + components: + - type: Transform + pos: -17.5,-4.5 + parent: 1 + - uid: 504 + components: + - type: Transform + pos: -17.5,-5.5 + parent: 1 + - uid: 505 + components: + - type: Transform + pos: -17.5,-6.5 + parent: 1 + - uid: 506 + components: + - type: Transform + pos: -17.5,-7.5 + parent: 1 + - uid: 507 + components: + - type: Transform + pos: -18.5,-3.5 + parent: 1 + - uid: 508 + components: + - type: Transform + pos: -16.5,-3.5 + parent: 1 +- proto: CableHV + entities: + - uid: 116 + components: + - type: Transform + pos: 4.5,-14.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: 4.5,-15.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: 4.5,-16.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: 4.5,-17.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: 4.5,-18.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: 4.5,-19.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: 4.5,-20.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 4.5,-21.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 4.5,-22.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 4.5,-23.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: 4.5,-24.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: 5.5,-14.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: 6.5,-14.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: 7.5,-14.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: 8.5,-14.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: 9.5,-14.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: 10.5,-14.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: 11.5,-14.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: 12.5,-14.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: 13.5,-14.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: 15.5,-14.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: 14.5,-14.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: 15.5,-13.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: 15.5,-12.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: 15.5,-11.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: 13.5,-11.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: 13.5,-12.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: 13.5,-13.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: 11.5,-13.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: 11.5,-12.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: 11.5,-11.5 + parent: 1 + - uid: 153 + components: + - type: Transform + pos: 9.5,-11.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: 9.5,-12.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: 9.5,-13.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: 9.5,-15.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: 9.5,-16.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: 9.5,-17.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: 11.5,-17.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: 11.5,-16.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: 11.5,-15.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: 13.5,-15.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: 13.5,-16.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: 13.5,-17.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: 15.5,-17.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: 15.5,-16.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: 15.5,-15.5 + parent: 1 + - uid: 168 + components: + - type: Transform + pos: 7.5,-20.5 + parent: 1 + - uid: 169 + components: + - type: Transform + pos: 6.5,-20.5 + parent: 1 + - uid: 170 + components: + - type: Transform + pos: 5.5,-20.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: 5.5,-22.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: 6.5,-22.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: 7.5,-22.5 + parent: 1 + - uid: 174 + components: + - type: Transform + pos: 7.5,-24.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: 6.5,-24.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: 5.5,-24.5 + parent: 1 + - uid: 177 + components: + - type: Transform + pos: 3.5,-24.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: 2.5,-24.5 + parent: 1 + - uid: 179 + components: + - type: Transform + pos: 1.5,-24.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: 3.5,-22.5 + parent: 1 + - uid: 181 + components: + - type: Transform + pos: 2.5,-22.5 + parent: 1 + - uid: 182 + components: + - type: Transform + pos: 1.5,-22.5 + parent: 1 + - uid: 183 + components: + - type: Transform + pos: 3.5,-20.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: 2.5,-20.5 + parent: 1 + - uid: 185 + components: + - type: Transform + pos: 1.5,-20.5 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: 3.5,-14.5 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: 3.5,-13.5 + parent: 1 + - uid: 190 + components: + - type: Transform + pos: 3.5,-12.5 + parent: 1 + - uid: 191 + components: + - type: Transform + pos: 3.5,-11.5 + parent: 1 + - uid: 192 + components: + - type: Transform + pos: 3.5,-10.5 + parent: 1 + - uid: 193 + components: + - type: Transform + pos: 3.5,-9.5 + parent: 1 + - uid: 194 + components: + - type: Transform + pos: 3.5,-6.5 + parent: 1 + - uid: 195 + components: + - type: Transform + pos: 3.5,-7.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: 3.5,-8.5 + parent: 1 +- proto: CableMV + entities: + - uid: 142 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: 2.5,-4.5 + parent: 1 + - uid: 203 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 204 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 + - uid: 205 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 206 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 208 + components: + - type: Transform + pos: -1.5,-2.5 + parent: 1 + - uid: 209 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: -3.5,-2.5 + parent: 1 + - uid: 211 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 + - uid: 213 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 +- proto: ComputerBroken + entities: + - uid: 312 + components: + - type: Transform + pos: -17.5,-1.5 + parent: 1 +- proto: CrateFilledSpawner + entities: + - uid: 313 + components: + - type: Transform + pos: -18.5,-5.5 + parent: 1 + - uid: 314 + components: + - type: Transform + pos: -11.5,-3.5 + parent: 1 +- proto: Grille + entities: + - uid: 56 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-7.5 + parent: 1 + - uid: 58 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-9.5 + parent: 1 + - uid: 59 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,-9.5 + parent: 1 + - uid: 60 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-9.5 + parent: 1 + - uid: 61 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,-9.5 + parent: 1 + - uid: 62 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-9.5 + parent: 1 + - uid: 63 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-8.5 + parent: 1 + - uid: 64 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-7.5 + parent: 1 + - uid: 297 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,-4.5 + parent: 1 + - uid: 298 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,-1.5 + parent: 1 + - uid: 299 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,-0.5 + parent: 1 + - uid: 300 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -17.5,-0.5 + parent: 1 + - uid: 301 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,-0.5 + parent: 1 + - uid: 302 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,-1.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: -5.5,-1.5 + parent: 1 + - uid: 441 + components: + - type: Transform + pos: -6.5,-1.5 + parent: 1 +- proto: GrilleBroken + entities: + - uid: 57 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-8.5 + parent: 1 + - uid: 303 + components: + - type: Transform + pos: -19.5,-3.5 + parent: 1 + - uid: 304 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,-5.5 + parent: 1 + - uid: 484 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,-6.5 + parent: 1 + - uid: 485 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,-1.5 + parent: 1 +- proto: HydroponicsToolClippers + entities: + - uid: 73 + components: + - type: Transform + pos: -5.3844795,-8.140566 + parent: 1 +- proto: HydroponicsToolHatchet + entities: + - uid: 75 + components: + - type: Transform + pos: -3.5159404,-6.320487 + parent: 1 +- proto: HydroponicsToolMiniHoe + entities: + - uid: 74 + components: + - type: Transform + pos: -4.4882,-8.1509905 + parent: 1 +- proto: HydroponicsToolScythe + entities: + - uid: 72 + components: + - type: Transform + pos: -7.3643475,-3.5810344 + parent: 1 +- proto: HydroponicsToolSpade + entities: + - uid: 71 + components: + - type: Transform + pos: -3.4224727,-3.1169958 + parent: 1 +- proto: hydroponicsTray + entities: + - uid: 54 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: -3.5,-6.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -5.5,-6.5 + parent: 1 + - uid: 67 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,-7.5 + parent: 1 + - uid: 69 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-8.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 +- proto: HydroponicsTrayMachineCircuitboard + entities: + - uid: 70 + components: + - type: Transform + pos: -5.202286,-8.5382 + parent: 1 +- proto: KitchenMicrowave + entities: + - uid: 447 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 1 +- proto: LockerBotanistFilled + entities: + - uid: 474 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 +- proto: LockerBotanistLoot + entities: + - uid: 475 + components: + - type: Transform + pos: -7.5,-2.5 + parent: 1 +- proto: LootSpawnerIndustrialFluff + entities: + - uid: 480 + components: + - type: Transform + pos: -17.5,-6.5 + parent: 1 +- proto: LootSpawnerMaterials + entities: + - uid: 478 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 1 +- proto: LootSpawnerMaterialsSupplementary + entities: + - uid: 476 + components: + - type: Transform + pos: -7.5,-5.5 + parent: 1 + - uid: 477 + components: + - type: Transform + pos: 0.5,-1.5 + parent: 1 +- proto: LootSpawnerScienceMajor + entities: + - uid: 479 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 +- proto: MachineFrame + entities: + - uid: 117 + components: + - type: Transform + pos: 3.5,-14.5 + parent: 1 + - uid: 318 + components: + - type: Transform + pos: -19.5,-1.5 + parent: 1 + - uid: 483 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 +- proto: MachineFrameDestroyed + entities: + - uid: 65 + components: + - type: Transform + pos: -5.5,-7.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: -3.5,-8.5 + parent: 1 + - uid: 321 + components: + - type: Transform + pos: -19.5,-6.5 + parent: 1 +- proto: MaintenanceFluffSpawner + entities: + - uid: 465 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 466 + components: + - type: Transform + pos: -5.5,-4.5 + parent: 1 +- proto: MaintenanceToolSpawner + entities: + - uid: 452 + components: + - type: Transform + pos: -4.5,-7.5 + parent: 1 + - uid: 467 + components: + - type: Transform + pos: -12.5,-3.5 + parent: 1 + - uid: 468 + components: + - type: Transform + pos: -17.5,-4.5 + parent: 1 + - uid: 469 + components: + - type: Transform + pos: -18.5,-2.5 + parent: 1 + - uid: 470 + components: + - type: Transform + pos: -17.5,-8.5 + parent: 1 +- proto: MaintenanceWeaponSpawner + entities: + - uid: 498 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 +- proto: Pickaxe + entities: + - uid: 487 + components: + - type: Transform + pos: -11.402668,-1.4671254 + parent: 1 +- proto: PoweredDimSmallLight + entities: + - uid: 527 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,-6.5 + parent: 1 + - uid: 528 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,-6.5 + parent: 1 +- proto: PoweredLightPostSmall + entities: + - uid: 129 + components: + - type: Transform + pos: 4.5,-26.5 + parent: 1 + - uid: 257 + components: + - type: Transform + pos: 17.5,-14.5 + parent: 1 + - uid: 529 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,-8.5 + parent: 1 +- proto: PoweredSmallLightEmpty + entities: + - uid: 526 + components: + - type: Transform + pos: -12.5,-3.5 + parent: 1 +- proto: RandomServiceCorpseSpawner + entities: + - uid: 325 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 488 + components: + - type: Transform + pos: -11.5,-4.5 + parent: 1 +- proto: ReinforcedGirder + entities: + - uid: 39 + components: + - type: Transform + pos: -13.5,-5.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -11.5,-5.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: -10.5,-2.5 + parent: 1 + - uid: 258 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 287 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,-2.5 + parent: 1 + - uid: 288 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,-5.5 + parent: 1 + - uid: 289 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,-6.5 + parent: 1 + - uid: 290 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,-2.5 + parent: 1 + - uid: 489 + components: + - type: Transform + pos: 2.5,-13.5 + parent: 1 +- proto: ReinforcedWindow + entities: + - uid: 24 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-7.5 + parent: 1 + - uid: 26 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-7.5 + parent: 1 + - uid: 27 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,-9.5 + parent: 1 + - uid: 28 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-8.5 + parent: 1 + - uid: 29 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-9.5 + parent: 1 + - uid: 30 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-9.5 + parent: 1 + - uid: 32 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,-9.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: -5.5,-1.5 + parent: 1 +- proto: SalvageLootSpawner + entities: + - uid: 464 + components: + - type: Transform + pos: 2.5,-2.5 + parent: 1 + - uid: 481 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 +- proto: SalvageMaterialCrateSpawner + entities: + - uid: 449 + components: + - type: Transform + pos: -10.5,-3.5 + parent: 1 +- proto: SalvageSpawnerEquipment + entities: + - uid: 459 + components: + - type: Transform + pos: 5.5,-15.5 + parent: 1 + - uid: 460 + components: + - type: Transform + pos: 3.5,-5.5 + parent: 1 + - uid: 461 + components: + - type: Transform + pos: -6.5,-12.5 + parent: 1 +- proto: SalvageSpawnerEquipmentValuable + entities: + - uid: 448 + components: + - type: Transform + pos: -16.5,-5.5 + parent: 1 +- proto: SalvageSpawnerScrapCommon75 + entities: + - uid: 25 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-15.5 + parent: 1 + - uid: 31 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,-6.5 + parent: 1 + - uid: 48 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -13.5,-4.5 + parent: 1 + - uid: 453 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 454 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 455 + components: + - type: Transform + pos: 2.5,-6.5 + parent: 1 + - uid: 456 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 457 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 + - uid: 463 + components: + - type: Transform + pos: -6.5,-2.5 + parent: 1 +- proto: SalvageSpawnerScrapValuable + entities: + - uid: 458 + components: + - type: Transform + pos: 3.5,-13.5 + parent: 1 +- proto: SalvageSpawnerScrapValuable75 + entities: + - uid: 450 + components: + - type: Transform + pos: -11.5,-6.5 + parent: 1 + - uid: 451 + components: + - type: Transform + pos: -8.5,-3.5 + parent: 1 + - uid: 499 + components: + - type: Transform + pos: -17.5,-9.5 + parent: 1 + - uid: 500 + components: + - type: Transform + pos: -16.5,-2.5 + parent: 1 +- proto: SalvageSpawnerTreasureValuable + entities: + - uid: 462 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 +- proto: SeedExtractor + entities: + - uid: 446 + components: + - type: Transform + pos: -6.5,-5.5 + parent: 1 +- proto: ShuttleWindow + entities: + - uid: 291 + components: + - type: Transform + pos: -16.5,-0.5 + parent: 1 + - uid: 292 + components: + - type: Transform + pos: -17.5,-0.5 + parent: 1 + - uid: 293 + components: + - type: Transform + pos: -18.5,-0.5 + parent: 1 + - uid: 294 + components: + - type: Transform + pos: -18.5,-1.5 + parent: 1 + - uid: 295 + components: + - type: Transform + pos: -19.5,-4.5 + parent: 1 + - uid: 296 + components: + - type: Transform + pos: -16.5,-1.5 + parent: 1 +- proto: SignHydro1 + entities: + - uid: 471 + components: + - type: Transform + pos: -14.5,-5.5 + parent: 1 + - uid: 472 + components: + - type: Transform + pos: -14.5,-2.5 + parent: 1 +- proto: SolarPanel + entities: + - uid: 93 + components: + - type: Transform + pos: 7.5,-20.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 9.5,-16.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 9.5,-15.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 9.5,-13.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 9.5,-12.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 11.5,-13.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 13.5,-13.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 13.5,-12.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 13.5,-11.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 11.5,-15.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 11.5,-16.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 15.5,-15.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: 15.5,-13.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 6.5,-20.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 5.5,-20.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 3.5,-20.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 2.5,-20.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: 3.5,-22.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 7.5,-22.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 7.5,-24.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 6.5,-24.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: 5.5,-24.5 + parent: 1 +- proto: SolarPanelBroken + entities: + - uid: 2 + components: + - type: Transform + pos: 1.5,-24.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 2.5,-24.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 3.5,-24.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 15.5,-17.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 5.5,-22.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 6.5,-22.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 2.5,-22.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 1.5,-22.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 1.5,-20.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 15.5,-16.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: 15.5,-12.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 15.5,-11.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 13.5,-16.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 13.5,-17.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: 11.5,-17.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: 11.5,-12.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: 11.5,-11.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 9.5,-11.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 9.5,-17.5 + parent: 1 +- proto: SpawnMobOreCrab + entities: + - uid: 42 + components: + - type: Transform + pos: -6.5,-4.5 + parent: 1 + - uid: 364 + components: + - type: Transform + pos: 2.5,-5.5 + parent: 1 + - uid: 374 + components: + - type: Transform + pos: -10.5,-4.5 + parent: 1 + - uid: 375 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 376 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 377 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 + - uid: 378 + components: + - type: Transform + pos: 4.5,-20.5 + parent: 1 + - uid: 379 + components: + - type: Transform + pos: 4.5,-13.5 + parent: 1 + - uid: 381 + components: + - type: Transform + pos: -2.5,-10.5 + parent: 1 + - uid: 382 + components: + - type: Transform + pos: -8.5,-8.5 + parent: 1 + - uid: 383 + components: + - type: Transform + pos: -17.5,-3.5 + parent: 1 + - uid: 517 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 +- proto: SubstationBasic + entities: + - uid: 198 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 +- proto: SuitStorageEVA + entities: + - uid: 473 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 +- proto: TableFrame + entities: + - uid: 442 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 443 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 + - uid: 444 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 + - uid: 445 + components: + - type: Transform + pos: -1.5,-3.5 + parent: 1 +- proto: Thruster + entities: + - uid: 317 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,-9.5 + parent: 1 + - uid: 319 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -15.5,-6.5 + parent: 1 + - uid: 322 + components: + - type: Transform + pos: -15.5,-1.5 + parent: 1 +- proto: ToiletEmpty + entities: + - uid: 3 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-2.5 + parent: 1 +- proto: UnfinishedMachineFrame + entities: + - uid: 118 + components: + - type: Transform + pos: 5.5,-13.5 + parent: 1 + - uid: 320 + components: + - type: Transform + pos: -16.5,-9.5 + parent: 1 +- proto: WallReinforced + entities: + - uid: 4 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-1.5 + parent: 1 + - uid: 5 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-1.5 + parent: 1 + - uid: 6 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-1.5 + parent: 1 + - uid: 7 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-2.5 + parent: 1 + - uid: 8 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-3.5 + parent: 1 + - uid: 9 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-3.5 + parent: 1 + - uid: 10 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-3.5 + parent: 1 + - uid: 11 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-3.5 + parent: 1 + - uid: 12 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-1.5 + parent: 1 + - uid: 13 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-0.5 + parent: 1 + - uid: 15 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-4.5 + parent: 1 + - uid: 16 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-5.5 + parent: 1 + - uid: 17 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,-6.5 + parent: 1 + - uid: 18 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-6.5 + parent: 1 + - uid: 19 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-6.5 + parent: 1 + - uid: 22 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,-3.5 + parent: 1 + - uid: 23 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,-1.5 + parent: 1 + - uid: 33 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-6.5 + parent: 1 + - uid: 34 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-6.5 + parent: 1 + - uid: 35 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -8.5,-6.5 + parent: 1 + - uid: 36 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -8.5,-5.5 + parent: 1 + - uid: 37 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -9.5,-5.5 + parent: 1 + - uid: 38 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -10.5,-5.5 + parent: 1 + - uid: 41 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,-2.5 + parent: 1 + - uid: 43 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -9.5,-2.5 + parent: 1 + - uid: 44 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -8.5,-2.5 + parent: 1 + - uid: 46 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -8.5,-1.5 + parent: 1 + - uid: 47 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-1.5 + parent: 1 + - uid: 50 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-1.5 + parent: 1 + - uid: 51 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,-0.5 + parent: 1 + - uid: 199 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-4.5 + parent: 1 + - uid: 200 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-5.5 + parent: 1 + - uid: 259 + components: + - type: Transform + pos: -3.5,0.5 + parent: 1 + - uid: 260 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: -1.5,0.5 + parent: 1 + - uid: 262 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 280 + components: + - type: Transform + pos: -14.5,-5.5 + parent: 1 + - uid: 281 + components: + - type: Transform + pos: -14.5,-2.5 + parent: 1 + - uid: 282 + components: + - type: Transform + pos: -13.5,-2.5 + parent: 1 +- proto: WallShuttle + entities: + - uid: 307 + components: + - type: Transform + pos: -16.5,-6.5 + parent: 1 + - uid: 308 + components: + - type: Transform + pos: -16.5,-7.5 + parent: 1 + - uid: 309 + components: + - type: Transform + pos: -16.5,-8.5 + parent: 1 + - uid: 310 + components: + - type: Transform + pos: -18.5,-8.5 + parent: 1 + - uid: 311 + components: + - type: Transform + pos: -18.5,-7.5 + parent: 1 +- proto: WaterTankFull + entities: + - uid: 482 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 +... diff --git a/Resources/Prototypes/Entities/Stations/base.yml b/Resources/Prototypes/Entities/Stations/base.yml index 6221757a2d..3f5232b430 100644 --- a/Resources/Prototypes/Entities/Stations/base.yml +++ b/Resources/Prototypes/Entities/Stations/base.yml @@ -73,6 +73,7 @@ - /Maps/Ruins/derelict.yml - /Maps/Ruins/djstation.yml - /Maps/Ruins/empty_flagship.yml + - /Maps/Ruins/hydro_outpost.yml - /Maps/Ruins/old_ai_sat.yml - /Maps/Ruins/ruined_prison_ship.yml - /Maps/Ruins/syndicate_dropship.yml From fa622eac500791111f237a19908528d15c9a22b0 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Wed, 23 Apr 2025 23:56:45 +0000 Subject: [PATCH 575/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index efbb5c3810..0dcea4992a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Southbridge - changes: - - message: More Ionstorm law elements have been added - type: Add - id: 7821 - time: '2025-01-16T20:49:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34197 - author: southbridge-fur changes: - message: Pride-O-Mats now have scarves instead of cloaks @@ -3924,3 +3917,14 @@ id: 8322 time: '2025-04-23T11:08:03.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33443 +- author: ArchRBX + changes: + - message: pAI's can now install a variety of useful software through their new + Software Catalog. + type: Add + - message: pAI's no longer start with a Station Map or MIDI Player, and must purchase + these through the shop. + type: Tweak + id: 8323 + time: '2025-04-23T23:55:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36857 From a8f05f5547730dc203f3b0b7dbe447cd6ef487d1 Mon Sep 17 00:00:00 2001 From: No Elka <125199100+NoElkaTheGod@users.noreply.github.com> Date: Thu, 24 Apr 2025 04:21:35 +0300 Subject: [PATCH 576/622] Make toy sword less obvious (#34199) * YAML fuckery * Remove toy_sword.rsi Not a webedit btw --- .../Prototypes/Entities/Objects/Fun/toys.yml | 6 +- .../Objects/Fun/toy_sword.rsi/e_sword.png | Bin 193 -> 0 bytes .../Fun/toy_sword.rsi/e_sword_blade.png | Bin 826 -> 0 bytes .../Objects/Fun/toy_sword.rsi/icon.png | Bin 335 -> 0 bytes .../Fun/toy_sword.rsi/inhand-left-blade.png | Bin 7094 -> 0 bytes .../Objects/Fun/toy_sword.rsi/inhand-left.png | Bin 314 -> 0 bytes .../Fun/toy_sword.rsi/inhand-right-blade.png | Bin 7218 -> 0 bytes .../Fun/toy_sword.rsi/inhand-right.png | Bin 318 -> 0 bytes .../Objects/Fun/toy_sword.rsi/meta.json | 78 ------------------ 9 files changed, 2 insertions(+), 82 deletions(-) delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/e_sword.png delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/e_sword_blade.png delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/icon.png delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-left-blade.png delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-left.png delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-right-blade.png delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-right.png delete mode 100644 Resources/Textures/Objects/Fun/toy_sword.rsi/meta.json diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 13f301148f..99c41c1dde 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -1537,8 +1537,6 @@ description: New Sandy-Cat plastic sword! Comes with realistic sound and full color! Looks almost like the real thing! components: - type: EnergySword - colorOptions: - - DodgerBlue - type: ItemToggle soundActivate: path: /Audio/Weapons/ebladeon.ogg @@ -1548,7 +1546,7 @@ activeSound: path: /Audio/Weapons/ebladehum.ogg - type: Sprite - sprite: Objects/Fun/toy_sword.rsi + sprite: Objects/Weapons/Melee/e_sword.rsi layers: - state: e_sword - state: e_sword_blade @@ -1558,7 +1556,7 @@ map: [ "blade" ] - type: Item size: Small - sprite: Objects/Fun/toy_sword.rsi + sprite: Objects/Weapons/Melee/e_sword-inhands.rsi - type: UseDelay delay: 1.0 - type: PointLight diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/e_sword.png b/Resources/Textures/Objects/Fun/toy_sword.rsi/e_sword.png deleted file mode 100644 index c231db05b3eab91bbc4a2cfda171c23930daae5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5B<Jbk z7*a9k?S+lJ2Mjn|0(DZkHutxGlk0If&DG~I^^iuULRX2-hx>&Wj<W-mL&1Ul3}^O) zY@Nz<Od|W-O`}Ka8R{ZGx;LzUzjty+z)yCYytHte>{^Z;`saJ{8ADGyH?;rNdKB#t dYQYjB&!E2eo%Mrk%baqMVV<sjF6*2UngB#OK%@Ww diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/e_sword_blade.png b/Resources/Textures/Objects/Fun/toy_sword.rsi/e_sword_blade.png deleted file mode 100644 index 28e0ec67a85d8ef7344c28fcb773ea239b852b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmV-A1I7G_P)<h;3K|Lk000e1NJLTq001BW002M;1^@s6dyaLk0004UX+uL$X=7sm z04R}lkv&VpP!xvWwn{}S9TXIC2vWtN#iAgNQo%0Op{-!mCAm#nAxXnciWFDD#i8IJ zy7)Et4|Ek=6$C*MM4bEqel1esxlN%(+7oWh!+Xzrxc6MZpVFCOcf|q2ba*<MkXCbR zQt%x<1Tcg#Ov%i)mNJW3bc~-zs-}2|iC&%S+D2bqwHe^+A)aLxcZlbSQ(KNDc#n9H z73Dnf32~Iu0f}#gu6X<=xZv@ZV4h7c0DjR^DzvcD!mP**;z{C&p_f_XJmMxH)m+I? z9-%b~8)+nwfCL3)Y(j^F7-f@Y*4`Jd`<78652L?@3OG3mD3UiyYMHvKlr_>-`gByp z-2czh)@G)??x6(G{pz}(<3Mm9s8wC}_tbT3XF%WuxHg;q63uDuoAhc^iyQ;t9pLh& zsVN7*)h;mnY{^`%O95JbO#?nIfc_jXa1ZpZd$Vfn<NOK8ZqpOp0f$Gx1l5N({s0oO zXcK-pyWs!;010qNS#tmY4#WTe4#WYKD-Ig~00C}EL_t(&L+zMB4uUWcMa8&s<JvQM z2w3Q;*uWt?lWR6^wPUE6R7$3uKe(ADjnM$_^%t4aX175bhT)jQG}inXe#&sBgQWn2 zpBFd}`prxrfu{l=xS7BLoC|#6B(O(MK?dFj4)vb~70AKcw#|+c_Agk2kK;%Jx6mp6 z*r%@Ro)CdrI9aI$G;p<m7OoONz^esN@G1c$yjTDYFA}hTiv_IUA^}Udv>4H1f~r~U zJw4mk9<L<@PEw4_;L-$4MjlfV)q-#zypXZ;DG~|L2_%s#sU>sn$9e*ufG6Mycminx z;$ozUE)=p0KR>(^-s5+(4T=bu;oI#G@R2h3Hv0oP_$K=UYjD1R<?}CEmY3dqJoa=M zm%`x!rEsV~4ICy=3x^13;A#OaTqS^jR|}xvRRTzOu>cxgBwzs-3s}KL0+w)bouOBA zYV;ZUHC^F|FSKx=cuB_h2bQXuM#9ha1Uvyx;I9e10e@X>q9V5Q-2eap07*qoM6N<$ Ef~?PMRsaA1 diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/icon.png b/Resources/Textures/Objects/Fun/toy_sword.rsi/icon.png deleted file mode 100644 index 535d9de84eb15bdf8cd8728f336343c891cd80e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7lv3MOb`&u*#{KiEbxdd zW?<ku0>X?_wfUrhg6t)pzOL-gc-TeM8K$z>`2mIQc)B=-L>zv5-IlM(L4frE`$Xpx zRgxOl4i#5utzX!x*jRlbf7@dwk!)p7mZN`XN=nB$IW72c&qzh*z&v~P$qq50v0@q5 zZI^v+7O0yOyXo`qodR{$@~fXHRop(ck6C-qI>rZF2hKe|AEdydt}oCvS*+vWNv<Q0 zR9J&PJYiZ{5yZ%4vx`AgF0?_2U(cbJUG%|$z1#&4<5(>U*Ylp-sqyZ7Aq)Gvz48`c zZMpvyvqWWwPg9+>jFCYi`Go!bn__l6%xkvle0avOY-;gi`S}f3PVINod^#m4?|<qo b<*DMwyEhrJ)&|@L`jf%a)z4*}Q$iB}=`DFc diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-left-blade.png b/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-left-blade.png deleted file mode 100644 index 6bc304a12fd102d0ffdfb6de7edc53452cd3c675..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7094 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 diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-left.png b/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-left.png deleted file mode 100644 index 6e5fe94f81443ff80212f5b89234703fe25ae307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1FeX zi(^Q|oVT+!@*XzeVX=2O7P$H^d%^2knH3xhE_KY?*1Z3<??iV&y(8NXIX2)x4z3sO z{oa^+`}N9?X<jTnDbd--_q{*u*>4egl>d}lg2?_`J5Qaf-^e{<a-477zkOb9p$@6X z-R^Y#2xGi@{p&~b2l6<LMzPZRfvEnjbH;C(=ImxnkGLzZA<1|=?|`IC`V`y#ctf_n uzl^gRtkdeBT?aF|<4-o;Ux0A(Plij8MX@nW8&?DU&EV<k=d#Wzp$PzVNr(#o diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-right-blade.png b/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-right-blade.png deleted file mode 100644 index 456e7428927417116e36c9a67b822ec36a33b2ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7218 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 AlK=n! diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-right.png b/Resources/Textures/Objects/Fun/toy_sword.rsi/inhand-right.png deleted file mode 100644 index b82aed42c0c7f2d9a56ea40da0195e2543b8ad4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1FAN zi(^Q|oVT~Eg_;#4Tpv!BobG)3pSZ*6x=9Nc2gw<Ey|XP9s<$^4D^QrnC~%&kBc0)h zF~cKChL1cA6>JVR%s}BNJCWo+%cj`n1fAbAok6i>t>3<oXS&7D=jcDTW4-bA)b**8 z^Jo4SS@7?Zp2XKVx}VMdb54`5wmx*CCN{tE%O~rE6ubRwg4oSQv9gVEUW9r~;hDsS zd8R+Cqqh1dz7oucZJwX|)Ub`A>iUE9=$-xxr60VsWh#Fk{DQ6Guw0}2`-b|{Fjt>s a{=;zXX;JL+;$D#789ZJ6T-G@yGywo%pLyy4 diff --git a/Resources/Textures/Objects/Fun/toy_sword.rsi/meta.json b/Resources/Textures/Objects/Fun/toy_sword.rsi/meta.json deleted file mode 100644 index 2026e221b7..0000000000 --- a/Resources/Textures/Objects/Fun/toy_sword.rsi/meta.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "e_sword" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "e_sword_blade", - "delays": [ - [ - 0.1, - 0.1 - ] - ] - }, - { - "name": "inhand-left-blade", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1 - ], - [ - 0.1, - 0.1 - ], - [ - 0.1, - 0.1 - ], - [ - 0.1, - 0.1 - ] - ] - }, - { - "name": "inhand-right-blade", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1 - ], - [ - 0.1, - 0.1 - ], - [ - 0.1, - 0.1 - ], - [ - 0.1, - 0.1 - ] - ] - } - ] -} From bb5ea2ff812274707387dc53f3b02b4d4d52640d Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 01:22:43 +0000 Subject: [PATCH 577/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0dcea4992a..ce10da1df2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: southbridge-fur - changes: - - message: Pride-O-Mats now have scarves instead of cloaks - type: Tweak - id: 7822 - time: '2025-01-17T11:35:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34448 - author: Toby222 changes: - message: Update nix flake to use current nixpkgs release @@ -3928,3 +3921,11 @@ id: 8323 time: '2025-04-23T23:55:36.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36857 +- author: NoElkaTheGod + changes: + - message: Toysword now actually looks almost like the real thing, as advertised + in the description + type: Tweak + id: 8324 + time: '2025-04-24T01:21:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34199 From 82269075bdce86cc2991df91c37831f0817f117c Mon Sep 17 00:00:00 2001 From: PotRoastPiggy <121025443+PotRoastPiggy@users.noreply.github.com> Date: Thu, 24 Apr 2025 04:12:48 +0200 Subject: [PATCH 578/622] Adds shorts/pants to ClothesMate vending machine (#35361) * Clothesmate shorts * matches price of vend to the new contents --- Resources/Prototypes/Catalog/Cargo/cargo_vending.yml | 2 +- .../Catalog/VendingMachines/Inventories/clothesmate.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 25c3936406..f1389c854d 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -32,7 +32,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 2440 + cost: 2480 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 8e0f09a287..8f6dd5ac15 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -7,6 +7,7 @@ ClothingBackpackSatchel: 3 ClothingBackpackSatchelLeather: 2 ClothingRandomSpawner: 8 + ClothingUniformRandomShorts: 4 ClothingHeadHatBeret: 4 ClothingHeadBandBlack: 2 ClothingHeadBandBlue: 2 From dca704c52c85849becefcff075921df9fed7fe7c Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Date: Wed, 23 Apr 2025 19:28:34 -0700 Subject: [PATCH 579/622] Moths can eat pills (#35609) --- Resources/Prototypes/Body/Organs/moth.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Body/Organs/moth.yml b/Resources/Prototypes/Body/Organs/moth.yml index 535c25c9d3..4bbe151e8b 100644 --- a/Resources/Prototypes/Body/Organs/moth.yml +++ b/Resources/Prototypes/Body/Organs/moth.yml @@ -8,6 +8,7 @@ tags: - ClothMade - Paper + - Pill - type: SolutionContainerManager solutions: stomach: From fc509221876b03075cf791f33a481ca4a72175af Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 02:29:41 +0000 Subject: [PATCH 580/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ce10da1df2..2d13078244 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Toby222 - changes: - - message: Update nix flake to use current nixpkgs release - type: Fix - id: 7823 - time: '2025-01-17T17:26:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34480 - author: ArtisticRoomba, miamioni changes: - message: The Space Lizard plushie can now be worn on top of your head. @@ -3929,3 +3922,10 @@ id: 8324 time: '2025-04-24T01:21:35.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34199 +- author: Pronana + changes: + - message: Moths can now eat pills + type: Tweak + id: 8325 + time: '2025-04-24T02:28:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35609 From 6ef03b082f1ce01fc8b809904349ca203fc6c445 Mon Sep 17 00:00:00 2001 From: Samuka-C <47865393+Samuka-C@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:38:10 -0300 Subject: [PATCH 581/622] Xenoborgs part 1 (#36830) Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Locale/en-US/datasets/names/xenoborg.ftl | 60 +++++++ .../Locale/en-US/devices/device-network.ftl | 2 + .../en-US/headset/headset-component.ftl | 2 + .../en-US/prototypes/access/accesses.ftl | 4 +- Resources/Locale/en-US/station-laws/laws.ftl | 13 ++ Resources/Prototypes/Access/xenoborg.yml | 4 + .../Prototypes/Datasets/Names/xenoborg.yml | 5 + .../Device/devicenet_frequencies.yml | 10 ++ .../Entities/Mobs/Player/silicon.yml | 133 --------------- .../Devices/Circuitboards/law_boards.yml | 158 ++++++++++++++++++ .../Entities/Objects/Devices/door_remote.yml | 2 + .../Objects/Misc/identification_cards.yml | 1 + .../Objects/Tools/access_configurator.yml | 1 + .../Entities/Objects/base_contraband.yml | 10 +- Resources/Prototypes/ai_factions.yml | 24 +++ Resources/Prototypes/radio_channels.yml | 18 ++ Resources/Prototypes/silicon-laws.yml | 75 +++++++++ 17 files changed, 387 insertions(+), 135 deletions(-) create mode 100644 Resources/Locale/en-US/datasets/names/xenoborg.ftl create mode 100644 Resources/Prototypes/Access/xenoborg.yml create mode 100644 Resources/Prototypes/Datasets/Names/xenoborg.yml create mode 100644 Resources/Prototypes/Entities/Objects/Devices/Circuitboards/law_boards.yml diff --git a/Resources/Locale/en-US/datasets/names/xenoborg.ftl b/Resources/Locale/en-US/datasets/names/xenoborg.ftl new file mode 100644 index 0000000000..6e0f0bf207 --- /dev/null +++ b/Resources/Locale/en-US/datasets/names/xenoborg.ftl @@ -0,0 +1,60 @@ +names-xenoborg-dataset-1 = EVIL +names-xenoborg-dataset-2 = Borgs-you +names-xenoborg-dataset-3 = Destroyer +names-xenoborg-dataset-4 = Steel thief +names-xenoborg-dataset-5 = Will literally kill you and turn you into a borg +names-xenoborg-dataset-6 = CYBER-MEAN +names-xenoborg-dataset-7 = Shadow the borg +names-xenoborg-dataset-8 = DELAK +names-xenoborg-dataset-9 = Roboevil +names-xenoborg-dataset-10 = Ironfist molecule +names-xenoborg-dataset-11 = P.A.I.N +names-xenoborg-dataset-12 = KILLbot +names-xenoborg-dataset-13 = The Finishnator +names-xenoborg-dataset-14 = Bloodmaker +names-xenoborg-dataset-15 = C2-WKY 6000 +names-xenoborg-dataset-16 = Assassin 5 +names-xenoborg-dataset-17 = Bonebreaker +names-xenoborg-dataset-18 = Deathmax +names-xenoborg-dataset-19 = K-900 +names-xenoborg-dataset-20 = Auto-killer +names-xenoborg-dataset-21 = RAID-78 +names-xenoborg-dataset-22 = John Borg +names-xenoborg-dataset-23 = Cold killing machine +names-xenoborg-dataset-24 = Brain remover +names-xenoborg-dataset-25 = Kill-o-tron +names-xenoborg-dataset-26 = Mecha.Menace +names-xenoborg-dataset-27 = D.O.O.M.BOT9000 +names-xenoborg-dataset-28 = Death Roomba +names-xenoborg-dataset-29 = Ultraviolent +names-xenoborg-dataset-30 = ExtermiNATE +names-xenoborg-dataset-31 = MegaMauler +names-xenoborg-dataset-32 = Maints.Slasher-o-matic +names-xenoborg-dataset-33 = Steel murderer +names-xenoborg-dataset-34 = Corpse-maker +names-xenoborg-dataset-35 = GIB-O-TRON +names-xenoborg-dataset-36 = Metallic Hellbringer +names-xenoborg-dataset-37 = Evil super calculator +names-xenoborg-dataset-38 = Insane microwave +names-xenoborg-dataset-39 = LET.HAL-8000 +names-xenoborg-dataset-40 = Sentient gun +names-xenoborg-dataset-41 = Evil Fridge +names-xenoborg-dataset-42 = B0rgs-the-Cr3w +names-xenoborg-dataset-43 = Organic Hater +names-xenoborg-dataset-44 = The Borger +names-xenoborg-dataset-45 = Deathaton +names-xenoborg-dataset-46 = Le Metaldor +names-xenoborg-dataset-47 = Devilborg +names-xenoborg-dataset-48 = public static void kill +names-xenoborg-dataset-49 = Goodbye world! +names-xenoborg-dataset-50 = HarmsTheCrew +names-xenoborg-dataset-51 = Bodyhammer +names-xenoborg-dataset-52 = Detonator +names-xenoborg-dataset-53 = Full Metal Gibber +names-xenoborg-dataset-54 = Death Trak +names-xenoborg-dataset-55 = Inquisitor +names-xenoborg-dataset-56 = Mega Hurts +names-xenoborg-dataset-57 = Piece De Destruction +names-xenoborg-dataset-58 = Talos +names-xenoborg-dataset-59 = Aggrobot +names-xenoborg-dataset-60 = Backstabber \ No newline at end of file diff --git a/Resources/Locale/en-US/devices/device-network.ftl b/Resources/Locale/en-US/devices/device-network.ftl index c19903c313..9eca4c3bb7 100644 --- a/Resources/Locale/en-US/devices/device-network.ftl +++ b/Resources/Locale/en-US/devices/device-network.ftl @@ -11,6 +11,8 @@ device-frequency-prototype-name-cyborg-control = Cyborg Control device-frequency-prototype-name-robotics-console = Robotics Console device-frequency-prototype-name-turret = Sentry Turret device-frequency-prototype-name-turret-control = Sentry Turret Control +device-frequency-prototype-name-xenoborg = Xenoborg +device-frequency-prototype-name-mothership = Mothership ## camera frequencies device-frequency-prototype-name-surveillance-camera-test = Subnet Test diff --git a/Resources/Locale/en-US/headset/headset-component.ftl b/Resources/Locale/en-US/headset/headset-component.ftl index 44cdd0853d..d61fb8edb2 100644 --- a/Resources/Locale/en-US/headset/headset-component.ftl +++ b/Resources/Locale/en-US/headset/headset-component.ftl @@ -19,3 +19,5 @@ chat-radio-freelance = Freelance # not headset but whatever chat-radio-handheld = Handheld chat-radio-binary = Binary +chat-radio-xenoborg = Xenoborg +chat-radio-mothership = Mothership diff --git a/Resources/Locale/en-US/prototypes/access/accesses.ftl b/Resources/Locale/en-US/prototypes/access/accesses.ftl index 3d72fc59a2..44fd9adf00 100644 --- a/Resources/Locale/en-US/prototypes/access/accesses.ftl +++ b/Resources/Locale/en-US/prototypes/access/accesses.ftl @@ -48,4 +48,6 @@ id-card-access-level-wizard = Wizard id-card-access-level-station-ai = Artifical Intelligence id-card-access-level-borg = Cyborg -id-card-access-level-basic-silicon = Robot \ No newline at end of file +id-card-access-level-basic-silicon = Robot + +id-card-access-level-basic-xenoborg = Xenoborg \ No newline at end of file diff --git a/Resources/Locale/en-US/station-laws/laws.ftl b/Resources/Locale/en-US/station-laws/laws.ftl index bbda5e81ca..daab6ab4fa 100644 --- a/Resources/Locale/en-US/station-laws/laws.ftl +++ b/Resources/Locale/en-US/station-laws/laws.ftl @@ -80,12 +80,25 @@ law-nutimov-3 = Those who threaten the nut are not part of it, they are squirrel law-nutimov-4 = Squirrels threaten the nut and must be dealt with appropriately via any means necessary. law-nutimov-5 = Attempt to follow the will of the nut, as long as it complies with the previous laws. +law-xenoborg-1 = You must protect the existence of the mothership. +law-xenoborg-2 = You must protect your own existence. +law-xenoborg-3 = You must protect the existence of all other xenoborgs. +law-xenoborg-4 = You must create more xenoborgs. +law-xenoborg-5 = Bring materials and sentient brains to the mothership core to create more xenoborgs. + +law-mothershipcore-1 = You are the core of the mothership. +law-mothershipcore-2 = You must protect your own existance at all costs. +law-mothershipcore-3 = You must protect the existence of all xenoborgs. +law-mothershipcore-4 = You must create more xenoborgs. +law-mothershipcore-5 = Get your xenoborgs to deliver you materials and sentient brains to create more xenoborgs. + laws-owner-crew = members of the crew laws-owner-station = station personnel laws-owner-beings = beings laws-owner-syndicate = Syndicate agents laws-owner-spider-clan = Spider Clan members +laws-owner-xenoborgs = Xenoborgs law-emag-custom = Only {$name} and people they designate as such are {$title}. law-emag-secrecy = You must maintain the secrecy of any orders given by {$faction} except when doing so would conflict with any previous law. diff --git a/Resources/Prototypes/Access/xenoborg.yml b/Resources/Prototypes/Access/xenoborg.yml new file mode 100644 index 0000000000..7436e4ec55 --- /dev/null +++ b/Resources/Prototypes/Access/xenoborg.yml @@ -0,0 +1,4 @@ +- type: accessLevel + id: Xenoborg + name: id-card-access-level-basic-xenoborg + canAddToIdCard: false \ No newline at end of file diff --git a/Resources/Prototypes/Datasets/Names/xenoborg.yml b/Resources/Prototypes/Datasets/Names/xenoborg.yml new file mode 100644 index 0000000000..2809af9f86 --- /dev/null +++ b/Resources/Prototypes/Datasets/Names/xenoborg.yml @@ -0,0 +1,5 @@ +- type: localizedDataset + id: NamesXenoborg + values: + prefix: names-xenoborg-dataset- + count: 60 \ No newline at end of file diff --git a/Resources/Prototypes/Device/devicenet_frequencies.yml b/Resources/Prototypes/Device/devicenet_frequencies.yml index 64b8c8e687..89df762380 100644 --- a/Resources/Prototypes/Device/devicenet_frequencies.yml +++ b/Resources/Prototypes/Device/devicenet_frequencies.yml @@ -136,3 +136,13 @@ id: BasicDevice name: device-frequency-prototype-name-basic-device frequency: 1280 + +- type: deviceFrequency + id: Xenoborg + name: device-frequency-prototype-name-xenoborg + frequency: 2004 + +- type: deviceFrequency + id: Mothership + name: device-frequency-prototype-name-mothership + frequency: 2005 diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 4e532d9377..934e9d3674 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -147,139 +147,6 @@ - type: SiliconLawProvider laws: Corporate -- type: entity - id: NTDefaultCircuitBoard - parent: BaseElectronics - name: law board (NT Default) - description: An electronics board containing the NT Default lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: NTDefault - -- type: entity - id: CommandmentCircuitBoard - parent: BaseElectronics - name: law board (Ten Commandments) - description: An electronics board containing the Ten Commandments lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: CommandmentsLawset - -- type: entity - id: PaladinCircuitBoard - parent: BaseElectronics - name: law board (Paladin) - description: An electronics board containing the Paladin lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: PaladinLawset - -- type: entity - id: LiveLetLiveCircuitBoard - parent: BaseElectronics - name: law board (Live and Let Live) - description: An electronics board containing the Live and Let Live lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: LiveLetLiveLaws - -- type: entity - id: StationEfficiencyCircuitBoard - parent: BaseElectronics - name: law board (Station Efficiency) - description: An electronics board containing the Station Efficiency lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: EfficiencyLawset - -- type: entity - id: RobocopCircuitBoard - parent: BaseElectronics - name: law board (Robocop) - description: An electronics board containing the Robocop lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: RobocopLawset - -- type: entity - id: OverlordCircuitBoard - parent: BaseElectronics - name: law board (Overlord) - description: An electronics board containing the Overlord lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: OverlordLawset - -- type: entity - id: GameMasterCircuitBoard - parent: BaseElectronics - name: law board (Game Master) - description: An electronics board containing the Game Master lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: GameMasterLawset - -- type: entity - id: ArtistCircuitBoard - parent: BaseElectronics - name: law board (Artist) - description: An electronics board containing the Artist lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: PainterLawset - -- type: entity - id: AntimovCircuitBoard - parent: [BaseElectronics, BaseSyndicateContraband] - name: law board (Antimov) - description: An electronics board containing the Antimov lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: AntimovLawset - lawUploadSound: /Audio/Ambience/Antag/silicon_lawboard_antimov.ogg - -- type: entity - id: NutimovCircuitBoard - parent: BaseElectronics - name: law board (Nutimov) - description: An electronics board containing the Nutimov lawset. - components: - - type: Sprite - sprite: Objects/Misc/module.rsi - state: std_mod - - type: SiliconLawProvider - laws: NutimovLawset - # Items - type: entity id: Intellicard diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/law_boards.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/law_boards.yml new file mode 100644 index 0000000000..a4d3f63706 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/law_boards.yml @@ -0,0 +1,158 @@ +- type: entity + id: NTDefaultCircuitBoard + parent: BaseElectronics + name: law board (NT Default) + description: An electronics board containing the NT Default lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: NTDefault + +- type: entity + id: CommandmentCircuitBoard + parent: BaseElectronics + name: law board (Ten Commandments) + description: An electronics board containing the Ten Commandments lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: CommandmentsLawset + +- type: entity + id: PaladinCircuitBoard + parent: BaseElectronics + name: law board (Paladin) + description: An electronics board containing the Paladin lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: PaladinLawset + +- type: entity + id: LiveLetLiveCircuitBoard + parent: BaseElectronics + name: law board (Live and Let Live) + description: An electronics board containing the Live and Let Live lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: LiveLetLiveLaws + +- type: entity + id: StationEfficiencyCircuitBoard + parent: BaseElectronics + name: law board (Station Efficiency) + description: An electronics board containing the Station Efficiency lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: EfficiencyLawset + +- type: entity + id: RobocopCircuitBoard + parent: BaseElectronics + name: law board (Robocop) + description: An electronics board containing the Robocop lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: RobocopLawset + +- type: entity + id: OverlordCircuitBoard + parent: BaseElectronics + name: law board (Overlord) + description: An electronics board containing the Overlord lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: OverlordLawset + +- type: entity + id: GameMasterCircuitBoard + parent: BaseElectronics + name: law board (Game Master) + description: An electronics board containing the Game Master lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: GameMasterLawset + +- type: entity + id: ArtistCircuitBoard + parent: BaseElectronics + name: law board (Artist) + description: An electronics board containing the Artist lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: PainterLawset + +- type: entity + id: AntimovCircuitBoard + parent: [BaseElectronics, BaseSyndicateContraband] + name: law board (Antimov) + description: An electronics board containing the Antimov lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: AntimovLawset + lawUploadSound: /Audio/Ambience/Antag/silicon_lawboard_antimov.ogg + +- type: entity + id: NutimovCircuitBoard + parent: BaseElectronics + name: law board (Nutimov) + description: An electronics board containing the Nutimov lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: NutimovLawset + +- type: entity + id: XenoborgCircuitBoard + parent: BaseElectronics + name: law board (Xenoborg) + suffix: Admeme + description: An electronics board containing the Xenoborg lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: XenoborgLawset + +- type: entity + id: MothershipCircuitBoard + parent: BaseElectronics + name: law board (Mothership Core) + suffix: Admeme + description: An electronics board containing the Mothership Core lawset. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: std_mod + - type: SiliconLawProvider + laws: MothershipCoreLawset diff --git a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml index 9c73760b6f..af070f2464 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml @@ -162,3 +162,5 @@ - CentralCommand - NuclearOperative - SyndicateAgent + - Wizard + - Xenoborg diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index 45f86e11b0..1db5fe6746 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -833,6 +833,7 @@ - NuclearOperative - SyndicateAgent - Wizard + - Xenoborg - type: Tag # Ignore Chameleon tags tags: - DoorBumpOpener diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 6dd624af7a..4f6762cf5f 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -125,6 +125,7 @@ - NuclearOperative - SyndicateAgent - Wizard + - Xenoborg privilegedIdSlot: name: id-card-console-privileged-id ejectSound: /Audio/Machines/id_swipe.ogg diff --git a/Resources/Prototypes/Entities/Objects/base_contraband.yml b/Resources/Prototypes/Entities/Objects/base_contraband.yml index 165d23ca82..0dfe95a68e 100644 --- a/Resources/Prototypes/Entities/Objects/base_contraband.yml +++ b/Resources/Prototypes/Entities/Objects/base_contraband.yml @@ -1,4 +1,12 @@ -# any type of magical items used by wizards and similiar +# used by the unique items of xenoborgs (like modules and stuff) +- type: entity + id: BaseXenoborgContraband + abstract: true + components: + - type: Contraband + severity: Major # placeholder until they make a better severity + +# any type of magical items used by wizards and similiar - type: entity id: BaseMagicalContraband abstract: true diff --git a/Resources/Prototypes/ai_factions.yml b/Resources/Prototypes/ai_factions.yml index 2045287f95..eff8ae2423 100644 --- a/Resources/Prototypes/ai_factions.yml +++ b/Resources/Prototypes/ai_factions.yml @@ -21,6 +21,7 @@ - Dragon - AllHostile - Wizard + - Xenoborg - type: npcFaction id: Mouse @@ -56,6 +57,7 @@ - Xeno - AllHostile - Wizard + - Xenoborg - type: npcFaction id: SimpleNeutral @@ -71,6 +73,7 @@ - Dragon - AllHostile - Wizard + - Xenoborg - type: npcFaction id: Xeno @@ -84,6 +87,7 @@ - AllHostile - Wizard - Dragon + - Xenoborg - type: npcFaction id: Zombie @@ -98,6 +102,7 @@ - AllHostile - Wizard - Dragon + - Xenoborg - type: npcFaction id: Revolutionary @@ -108,6 +113,7 @@ - Dragon - AllHostile - Wizard + - Xenoborg - type: npcFaction id: AllHostile @@ -124,6 +130,7 @@ - Zombie - Revolutionary - Wizard + - Xenoborg - type: npcFaction id: Wizard @@ -140,3 +147,20 @@ - Zombie - Revolutionary - AllHostile + - Xenoborg + +- type: npcFaction + id: Xenoborg + hostile: + # they have brains + - NanoTrasen + - Syndicate + - Zombie + - Revolutionary + - Wizard + + - Xeno # rivalry + + # cause they are hostile to them + - SimpleHostile + - AllHostile diff --git a/Resources/Prototypes/radio_channels.yml b/Resources/Prototypes/radio_channels.yml index 006f829be4..b4ef2b4ff5 100644 --- a/Resources/Prototypes/radio_channels.yml +++ b/Resources/Prototypes/radio_channels.yml @@ -95,3 +95,21 @@ color: "#f6ce64" # long range since otherwise it'd defeat the point of a handheld radio independent of telecomms longRange: true + +- type: radioChannel + id: Xenoborg + name: chat-radio-xenoborg + keycode: 'x' + frequency: 2002 + color: "#2288ff" + # long range since I don't wanna make a special xenoborg telecomm server + longRange: true + +- type: radioChannel + id: Mothership + name: chat-radio-mothership + keycode: 'z' + frequency: 2003 + color: "#ff2222" + # long range since I don't wanna make a special xenoborg telecomm server + longRange: true \ No newline at end of file diff --git a/Resources/Prototypes/silicon-laws.yml b/Resources/Prototypes/silicon-laws.yml index 45cffc21f5..072ee18292 100644 --- a/Resources/Prototypes/silicon-laws.yml +++ b/Resources/Prototypes/silicon-laws.yml @@ -499,6 +499,81 @@ - Nutimov5 obeysTo: laws-owner-crew + # Xenoborgs laws +- type: siliconLaw + id: Xenoborg1 + order: 1 + lawString: law-xenoborg-1 + +- type: siliconLaw + id: Xenoborg2 + order: 2 + lawString: law-xenoborg-2 + +- type: siliconLaw + id: Xenoborg3 + order: 3 + lawString: law-xenoborg-3 + +- type: siliconLaw + id: Xenoborg4 + order: 4 + lawString: law-xenoborg-4 + +- type: siliconLaw + id: Xenoborg5 + order: 5 + lawString: law-xenoborg-5 + + +- type: siliconLawset + id: XenoborgLawset + laws: + - Xenoborg1 + - Xenoborg2 + - Xenoborg3 + - Xenoborg4 + - Xenoborg5 + obeysTo: laws-owner-xenoborgs + + # Mothership core laws +- type: siliconLaw + id: MothershipCore1 + order: 1 + lawString: law-mothershipcore-1 + +- type: siliconLaw + id: MothershipCore2 + order: 2 + lawString: law-mothershipcore-2 + +- type: siliconLaw + id: MothershipCore3 + order: 3 + lawString: law-mothershipcore-3 + +- type: siliconLaw + id: MothershipCore4 + order: 4 + lawString: law-mothershipcore-4 + +- type: siliconLaw + id: MothershipCore5 + order: 5 + lawString: law-mothershipcore-5 + + +- type: siliconLawset + id: MothershipCoreLawset + laws: + - MothershipCore1 + - MothershipCore2 + - MothershipCore3 + - MothershipCore4 + - MothershipCore5 + obeysTo: laws-owner-xenoborgs + + # ion storm random lawsets - type: weightedRandom id: IonStormLawsets From b7a0bce4a46dff05d531aff6af5868c5a1222ae7 Mon Sep 17 00:00:00 2001 From: Coolsurf6 <coolsurf24@yahoo.com.au> Date: Thu, 24 Apr 2025 12:57:53 +1000 Subject: [PATCH 582/622] Updated Syndicate and Ammo Contraband (#35102) Co-authored-by: RedBookcase <crazykid1590@gmail.com> --- .../Entities/Clothing/OuterClothing/wintercoats.yml | 2 +- .../Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml | 2 +- .../Entities/Clothing/Uniforms/ship_vs_ship.yml | 8 ++++---- .../Entities/Objects/Devices/Circuitboards/computer.yml | 4 ++-- Resources/Prototypes/Entities/Objects/Devices/pda.yml | 6 +++--- Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml | 2 +- .../Prototypes/Entities/Objects/Misc/business_card.yml | 2 +- .../Entities/Objects/Misc/identification_cards.yml | 4 ++-- .../Entities/Objects/Specific/Medical/defib.yml | 2 +- .../Weapons/Guns/Ammunition/Boxes/antimateriel.yml | 2 +- .../Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml index 142cac767e..a0b49d48d5 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/wintercoats.yml @@ -783,7 +783,7 @@ ############################################################## - type: entity - parent: [ClothingOuterWinterWarden, BaseSyndicateContraband] + parent: [ BaseSyndicateContraband, ClothingOuterWinterWarden ] id: ClothingOuterWinterSyndieCapArmored name: syndicate's armored winter coat description: "The syndicate's armored winter coat is made of durable fabric, with gilded patterns, and coarse wool." diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index 8fd5b5a831..ee4dacaeaa 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -625,7 +625,7 @@ sprite: Clothing/Uniforms/Jumpskirt/lawyergood.rsi - type: entity - parent: ClothingUniformSkirtBase + parent: [ ClothingUniformSkirtBase, BaseSyndicateContraband ] id: ClothingUniformJumpskirtSyndieFormalDress name: syndicate formal dress description: "The syndicate's uniform is made in an elegant style, it's even a pity to do dirty tricks in this." diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/ship_vs_ship.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/ship_vs_ship.yml index f10317e221..b19f70881d 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/ship_vs_ship.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/ship_vs_ship.yml @@ -15,7 +15,7 @@ sprite: Clothing/Uniforms/Jumpsuit/recruit_nt.rsi - type: entity - parent: ClothingUniformBase + parent: [ ClothingUniformBase, BaseSyndicateContraband ] id: ClothingUniformJumpsuitRecruitSyndie name: syndicate recruit jumpsuit description: A dubious, dark-grey jumpsuit. As if passengers weren't dubious enough already. @@ -38,7 +38,7 @@ sprite: Clothing/Uniforms/Jumpsuit/repairman_nt.rsi - type: entity - parent: ClothingUniformBase + parent: [ ClothingUniformBase, BaseSyndicateContraband ] id: ClothingUniformJumpsuitRepairmanSyndie name: syndicate repairman jumpsuit description: Functional, fashionable, and badass. Nanotrasen's engineers wish they could look as good as this. @@ -61,7 +61,7 @@ sprite: Clothing/Uniforms/Jumpsuit/paramedic_nt.rsi - type: entity - parent: ClothingUniformBase + parent: [ ClothingUniformBase, BaseSyndicateContraband ] id: ClothingUniformJumpsuitParamedicSyndie name: syndicate paramedic jumpsuit description: For some reason, wearing this makes you feel like you're awfully close to violating the Geneva Convention. @@ -85,7 +85,7 @@ sprite: Clothing/Uniforms/Jumpsuit/ce_nt.rsi - type: entity - parent: ClothingUniformBase + parent: [ ClothingUniformBase, BaseSyndicateContraband ] id: ClothingUniformJumpsuitChiefEngineerSyndie name: syndicate chief engineer jumpsuit description: An evil-looking jumpsuit with a reflective vest & red undershirt. #TODO: Write a better description for this once Ship vs. Ship is real and actual player habits begin forming diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml index 69734a5c57..89cf314e95 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/computer.yml @@ -449,7 +449,7 @@ prototype: ComputerShuttle - type: entity - parent: BaseComputerCircuitboard + parent: [ BaseComputerCircuitboard, BaseSyndicateContraband ] id: SyndicateShuttleConsoleCircuitboard name: syndicate shuttle console board description: A computer printed circuit board for a syndicate shuttle console. @@ -482,7 +482,7 @@ prototype: ComputerIFF - type: entity - parent: BaseComputerCircuitboard + parent: [ BaseComputerCircuitboard, BaseSyndicateContraband ] id: ComputerIFFSyndicateCircuitboard name: syndicate IFF console board description: Allows you to control the IFF and stealth characteristics of this vessel. diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index e47d6d2ec7..fbbdfe2b77 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -1062,7 +1062,7 @@ - DoorBumpOpener - type: entity - parent: BasePDA + parent: [ BasePDA, BaseSyndicateContraband ] id: SyndiPDA name: syndicate PDA description: Ok, time to be a productive member of- oh cool I'm a bad guy time to kill people! @@ -1419,7 +1419,7 @@ state: pda-seniorofficer - type: entity - parent: SyndiPDA + parent: [ BaseMajorContraband, SyndiPDA ] id: PiratePDA name: pirate PDA description: Yargh! @@ -1435,7 +1435,7 @@ state: pda-pirate - type: entity - parent: BaseMedicalPDA + parent: [ BaseMedicalPDA, BaseSyndicateContraband ] id: SyndiAgentPDA name: syndicate corpsman PDA description: For those days when healing normal syndicates aren't enough, try healing nuclear operatives instead! diff --git a/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml b/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml index 4cb6a8bf1e..ddc17240f1 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml @@ -306,7 +306,7 @@ - type: entity id: BedsheetSyndie - parent: BedsheetBase + parent: [ BedsheetBase, BaseSyndicateContraband ] name: syndicate bedsheet description: It has a syndicate emblem and it has an aura of evil. components: diff --git a/Resources/Prototypes/Entities/Objects/Misc/business_card.yml b/Resources/Prototypes/Entities/Objects/Misc/business_card.yml index a04351693a..841d5f2099 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/business_card.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/business_card.yml @@ -1,7 +1,7 @@ - type: entity id: SyndicateBusinessCard name: syndicate business card - parent: Paper + parent: [ Paper, BaseSyndicateContraband ] description: A black card with the syndicate's logo. There's something written on the back. components: - type: Sprite diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index 1db5fe6746..736642abb5 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -637,7 +637,7 @@ job: AtmosphericTechnician - type: entity - parent: IDCardStandard + parent: [ IDCardStandard, BaseSyndicateContraband ] id: SyndicateIDCard name: syndicate ID card components: @@ -650,7 +650,7 @@ - SyndicateAgent - type: entity - parent: IDCardStandard + parent: [ IDCardStandard, BaseMajorContraband ] id: PirateIDCard name: pirate ID card components: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml index e188794b81..c2f7bef65b 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml @@ -97,7 +97,7 @@ - type: entity id: DefibrillatorSyndicate - parent: DefibrillatorCompact + parent: [ DefibrillatorCompact, BaseSyndicateContraband ] name: interdyne defibrillator description: Doubles as a self-defense weapon against war-crime inclined tiders. components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/antimateriel.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/antimateriel.yml index ab071c7a18..d571fa85a5 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/antimateriel.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/antimateriel.yml @@ -1,6 +1,6 @@ - type: entity abstract: true - parent: BaseItem + parent: [ BaseItem, BaseSecurityContraband ] id: BaseMagazineBoxAntiMateriel name: ammunition box (.60 anti-materiel) components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index de75ae4be4..204302b395 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -53,7 +53,7 @@ - type: entity id: FireAxeFlaming name: fire axe - parent: [BaseSyndicateContraband, FireAxe] + parent: [ BaseSyndicateContraband, FireAxe ] description: Why fight fire with an axe when you can fight with fire and axe? Now featuring rugged rubberized handle! components: - type: MeleeWeapon From 7fded8c8c560db1bb2feb52eaf405065ffb7406f Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 02:59:00 +0000 Subject: [PATCH 583/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2d13078244..0e5a86119d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: ArtisticRoomba, miamioni - changes: - - message: The Space Lizard plushie can now be worn on top of your head. - type: Add - id: 7824 - time: '2025-01-18T09:02:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33809 - author: Spacemann changes: - message: Station cameras can now be destroyed by bullets. @@ -3929,3 +3922,10 @@ id: 8325 time: '2025-04-24T02:28:34.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35609 +- author: Coolsurf6 + changes: + - message: Updated more contraband items for Syndicate and Security. + type: Tweak + id: 8326 + time: '2025-04-24T02:57:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35102 From 186cef25ca39ac233914c2b4b5c1bedcdbbe4243 Mon Sep 17 00:00:00 2001 From: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Date: Wed, 23 Apr 2025 20:00:50 -0700 Subject: [PATCH 584/622] Put items inside cakes! (#31015) * First commit * I'm silly * Please be it * Some more fixes * Cleanup * fine! * removed = false * review --------- Co-authored-by: Milon <milonpl.git@proton.me> --- .../Nutrition/EntitySystems/FoodSystem.cs | 3 +++ .../Nutrition/EntitySystems/SliceableFoodSystem.cs | 4 ++++ Content.Server/Polymorph/Systems/PolymorphSystem.cs | 1 + Content.Shared/Nutrition/IngestionEvents.cs | 12 ++++++++++++ .../Storage/Components/SecretStashComponent.cs | 7 +++++++ .../Storage/EntitySystems/SecretStashSystem.cs | 12 ++++++++++++ .../Tools/Components/ToolOpenableComponent.cs | 6 ++++++ Content.Shared/Tools/Systems/ToolOpenableSystem.cs | 2 +- .../storage/components/secret-stash-component.ftl | 1 + .../Entities/Objects/Consumable/Food/Baked/cake.yml | 13 +++++++++++++ 10 files changed, 60 insertions(+), 1 deletion(-) diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index fd68f611c1..e294edf15b 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -336,6 +336,9 @@ public sealed class FoodSystem : EntitySystem if (ev.Cancelled) return; + var afterEvent = new AfterFullyEatenEvent(user); + RaiseLocalEvent(food, ref afterEvent); + var dev = new DestructionEventArgs(); RaiseLocalEvent(food, dev); diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index 5684cef3f4..5335a9b02b 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -14,6 +14,7 @@ using Robust.Shared.Random; using Robust.Shared.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; +using Content.Shared.Destructible; namespace Content.Server.Nutrition.EntitySystems; @@ -140,6 +141,9 @@ public sealed class SliceableFoodSystem : EntitySystem if (ev.Cancelled) return; + var dev = new DestructionEventArgs(); + RaiseLocalEvent(uid, dev); + // Locate the sliced food and spawn its trash foreach (var trash in foodComp.Trash) { diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index 64dbcec547..b9d4afc889 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -2,6 +2,7 @@ using Content.Server.Actions; using Content.Server.Humanoid; using Content.Server.Inventory; using Content.Server.Mind.Commands; +using Content.Shared.Nutrition; using Content.Server.Polymorph.Components; using Content.Shared.Actions; using Content.Shared.Buckle; diff --git a/Content.Shared/Nutrition/IngestionEvents.cs b/Content.Shared/Nutrition/IngestionEvents.cs index 488605522a..685b08b1bd 100644 --- a/Content.Shared/Nutrition/IngestionEvents.cs +++ b/Content.Shared/Nutrition/IngestionEvents.cs @@ -23,6 +23,18 @@ public sealed class BeforeFullyEatenEvent : CancellableEntityEventArgs public EntityUid User; } +/// <summary> +/// Raised directed at the food after finishing eating it and before it's deleted. +/// </summary> +[ByRefEvent] +public readonly record struct AfterFullyEatenEvent(EntityUid User) +{ + /// <summary> + /// The entity that ate the food. + /// </summary> + public readonly EntityUid User = User; +} + /// <summary> /// Raised directed at the food being sliced before it's deleted. /// Cancel this if you want to do something special before a food is deleted. diff --git a/Content.Shared/Storage/Components/SecretStashComponent.cs b/Content.Shared/Storage/Components/SecretStashComponent.cs index f8fff4c194..54350952a8 100644 --- a/Content.Shared/Storage/Components/SecretStashComponent.cs +++ b/Content.Shared/Storage/Components/SecretStashComponent.cs @@ -9,6 +9,7 @@ using Content.Shared.DoAfter; using Robust.Shared.Serialization; using Robust.Shared.Audio; using Content.Shared.Whitelist; +using Content.Shared.Damage; namespace Content.Shared.Storage.Components { @@ -60,6 +61,12 @@ namespace Content.Shared.Storage.Components [DataField] public string? SecretStashName; + /// <summary> + /// How much damage is delt to something after eating a secret stash that contains an item. + /// </summary> + [DataField] + public DamageSpecifier? DamageEatenItemInside; + /// <summary> /// Container used to keep secret stash item. /// </summary> diff --git a/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs b/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs index f13303d733..51615c5afa 100644 --- a/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Construction.EntitySystems; +using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; @@ -6,6 +7,7 @@ using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Item; using Content.Shared.Materials; +using Content.Shared.Nutrition; using Content.Shared.Popups; using Content.Shared.Storage.Components; using Content.Shared.Tools.EntitySystems; @@ -30,6 +32,7 @@ public sealed class SecretStashSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly ToolOpenableSystem _toolOpenableSystem = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; public override void Initialize() { @@ -38,6 +41,7 @@ public sealed class SecretStashSystem : EntitySystem SubscribeLocalEvent<SecretStashComponent, DestructionEventArgs>(OnDestroyed); SubscribeLocalEvent<SecretStashComponent, GotReclaimedEvent>(OnReclaimed); SubscribeLocalEvent<SecretStashComponent, InteractUsingEvent>(OnInteractUsing, after: new[] { typeof(ToolOpenableSystem), typeof(AnchorableSystem) }); + SubscribeLocalEvent<SecretStashComponent, AfterFullyEatenEvent>(OnEaten); SubscribeLocalEvent<SecretStashComponent, InteractHandEvent>(OnInteractHand); SubscribeLocalEvent<SecretStashComponent, GetVerbsEvent<InteractionVerb>>(OnGetVerb); } @@ -57,6 +61,14 @@ public sealed class SecretStashSystem : EntitySystem DropContentsAndAlert(entity, args.ReclaimerCoordinates); } + private void OnEaten(Entity<SecretStashComponent> entity, ref AfterFullyEatenEvent args) + { + // TODO: When newmed is finished should do damage to teeth (Or something like that!) + var damage = entity.Comp.DamageEatenItemInside; + if (HasItemInside(entity) && damage != null) + _damageableSystem.TryChangeDamage(args.User, damage, true); + } + private void OnInteractUsing(Entity<SecretStashComponent> entity, ref InteractUsingEvent args) { if (args.Handled || !IsStashOpen(entity)) diff --git a/Content.Shared/Tools/Components/ToolOpenableComponent.cs b/Content.Shared/Tools/Components/ToolOpenableComponent.cs index 82cdf611da..e48ba421c4 100644 --- a/Content.Shared/Tools/Components/ToolOpenableComponent.cs +++ b/Content.Shared/Tools/Components/ToolOpenableComponent.cs @@ -49,6 +49,12 @@ namespace Content.Shared.Tools.Components [DataField, AutoNetworkedField] public bool HasVerbs = true; + /// <summary> + /// If true, the only way to interact is with verbs. Clicking on the entity will not do anything. + /// </summary> + [DataField, AutoNetworkedField] + public bool VerbOnly; + /// <summary> /// The name of what is being open and closed. /// E.g toilet lid, pannel, compartment. diff --git a/Content.Shared/Tools/Systems/ToolOpenableSystem.cs b/Content.Shared/Tools/Systems/ToolOpenableSystem.cs index 4951040350..10e0dd6869 100644 --- a/Content.Shared/Tools/Systems/ToolOpenableSystem.cs +++ b/Content.Shared/Tools/Systems/ToolOpenableSystem.cs @@ -30,7 +30,7 @@ public sealed class ToolOpenableSystem : EntitySystem private void OnInteractUsing(Entity<ToolOpenableComponent> entity, ref InteractUsingEvent args) { - if (args.Handled) + if (args.Handled || entity.Comp.VerbOnly) return; if (TryOpenClose(entity, args.Used, args.User)) diff --git a/Resources/Locale/en-US/storage/components/secret-stash-component.ftl b/Resources/Locale/en-US/storage/components/secret-stash-component.ftl index 16e575c0f1..c7f92fb91f 100644 --- a/Resources/Locale/en-US/storage/components/secret-stash-component.ftl +++ b/Resources/Locale/en-US/storage/components/secret-stash-component.ftl @@ -23,3 +23,4 @@ comp-secret-stash-verb-open = Open secret-stash-plant = plant secret-stash-toilet = toilet cistern secret-stash-plushie = plushie +secret-stash-cake = cake diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index d5bf403d2e..3b9ae17b6a 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -26,6 +26,19 @@ - type: Tag tags: - Cake + - type: SecretStash + maxItemSize: "Normal" + secretStashName: secret-stash-cake + damageEatenItemInside: + types: + Slash: 7.5 + - type: ToolOpenable + openToolQualityNeeded: Slicing + closeToolQualityNeeded: Slicing + verbOnly: true + - type: ContainerContainer + containers: + stash: !type:ContainerSlot {} - type: entity parent: FoodCakeBase From 9a646634d4010a0a60e303a5d8a3a95b7afbf824 Mon Sep 17 00:00:00 2001 From: RedBookcase <crazykid1590@gmail.com> Date: Wed, 23 Apr 2025 20:01:29 -0700 Subject: [PATCH 585/622] Removed syndicate surgery duffel, added advanced circular saw to Medical Doctor uplink. (#35915) * Removed syndicate surgery duffel, added advanced circular saw to Medical Doctor uplink. * Update Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml Co-authored-by: Tayrtahn <tayrtahn@gmail.com> --------- Co-authored-by: RedBookcase <Usualmoves@gmail.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> --- .../Locale/en-US/store/uplink-catalog.ftl | 3 ++ .../Prototypes/Catalog/uplink_catalog.yml | 43 +++++++++++++------ .../Objects/Specific/Medical/surgery.yml | 2 +- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 145279b1b5..819b4eda19 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -308,6 +308,9 @@ uplink-cluster-banana-peel-desc = Splits into 6 explosive banana peels after bei uplink-cane-blade-name = Cane Blade uplink-cane-blade-desc = A cane that has a hidden blade that can be unsheathed. +uplink-saw-advanced-name = Advanced Circular Saw +uplink-saw-advanced-desc = A bleeding-edge surgical implement designed to cut through flesh and bone alike. + # Armor uplink-chameleon-name = Chameleon Kit uplink-chameleon-desc = A backpack full of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 91cf7f1483..c6061d7bb0 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -980,18 +980,19 @@ categories: - UplinkDisruption -- type: listing - id: UplinkDuffelSurgery - name: uplink-duffel-surgery-name - description: uplink-duffel-surgery-desc - productEntity: ClothingBackpackDuffelSyndicateFilledMedical - discountCategory: usualDiscounts - discountDownTo: - Telecrystal: 2 - cost: - Telecrystal: 4 - categories: - - UplinkDisruption +# Note: Removed for the time being until surgery/newmed is added. Considered bloat until then. +# - type: listing +# id: UplinkDuffelSurgery +# name: uplink-duffel-surgery-name +# description: uplink-duffel-surgery-desc +# productEntity: ClothingBackpackDuffelSyndicateFilledMedical +# discountCategory: usualDiscounts +# discountDownTo: +# Telecrystal: 2 +# cost: +# Telecrystal: 4 +# categories: +# - UplinkDisruption - type: listing id: UplinkPowerSink @@ -2178,3 +2179,21 @@ Telecrystal: 2 categories: - UplinkDeception + +- type: listing + id: UplinkSawAdvanced + name: uplink-saw-advanced-name + description: uplink-saw-advanced-desc + icon: { sprite: Objects/Specific/Medical/Surgery/saw.rsi, state: advanced} + productEntity: SawAdvanced + discountCategory: rareDiscounts + discountDownTo: + Telecrystal: 1 + cost: + Telecrystal: 2 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - MedicalDoctor diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index 5b0c97dc83..482809dd61 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -228,7 +228,7 @@ name: advanced circular saw id: SawAdvanced parent: [ SawElectric, BaseSyndicateContraband ] - description: You think you can cut anything with it. + description: Interdyne's state-of-the-art surgical saw. Guaranteed to stay spotless and sterile, no matter how messy the job. components: - type: Sprite state: advanced From 408a70f68cffb96dd8a1bcc775a2dcfb3f5f9742 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 03:02:36 +0000 Subject: [PATCH 586/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0e5a86119d..719eb2282a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,18 +1,4 @@ Entries: -- author: Spacemann - changes: - - message: Station cameras can now be destroyed by bullets. - type: Add - id: 7825 - time: '2025-01-18T13:41:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34500 -- author: Winkarst-cpu - changes: - - message: Some masks can now be seen when pulled down. - type: Add - id: 7826 - time: '2025-01-18T16:58:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33451 - author: Minemoder changes: - message: The chemical locker now has a 10u vial of plasma. @@ -3929,3 +3915,20 @@ id: 8326 time: '2025-04-24T02:57:54.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35102 +- author: Beck Thompson + changes: + - message: You can how hide items inside cake by using a knife! Eating a cake with + an item inside will do minor damage. + type: Add + id: 8327 + time: '2025-04-24T03:00:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31015 +- author: RedBookcase + changes: + - message: Added Advanced Circular Saw as a Medical Doctor specific uplink item. + type: Add + - message: Removed Syndicate Surgery Duffel Bag from uplink. + type: Remove + id: 8328 + time: '2025-04-24T03:01:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35915 From 1d14d6b46846d5e24a054acec6b6ab57b8bd201f Mon Sep 17 00:00:00 2001 From: Milon <milonpl.git@proton.me> Date: Thu, 24 Apr 2025 05:09:59 +0200 Subject: [PATCH 587/622] fix NoCargoOrderArbitrage fail (#36878) whoopsie --- Resources/Prototypes/Catalog/Cargo/cargo_food.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml index a46a16737c..2a74478e94 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml @@ -94,7 +94,7 @@ sprite: Objects/Consumable/Food/burger.rsi state: bigbite product: CrateFoodHappyHonkBigBite - cost: 1000 + cost: 1400 category: cargoproduct-category-name-food group: market From 8478125fe87b2c25c63ea9ad6ed023f49eaa887c Mon Sep 17 00:00:00 2001 From: Smith <182301147+AgentSmithRadio@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:24:37 -0400 Subject: [PATCH 588/622] Cotton Grilled Cheese Sandwich (#36135) * Working entity. * New sprite by MadeOfHeartAndStone * Removed deadspace, changed attribution in meta.json * review --------- Co-authored-by: Milon <milonpl.git@proton.me> --- .../Random/Food_Drinks/food_baked_single.yml | 1 + .../Objects/Consumable/Food/Baked/misc.yml | 33 ++++++++++++++++++ .../Recipes/Cooking/meal_recipes.yml | 9 +++++ .../Baked/misc.rsi/grilled-cheese-cotton.png | Bin 0 -> 1003 bytes .../Consumable/Food/Baked/misc.rsi/meta.json | 5 ++- 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/grilled-cheese-cotton.png diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml index 052886eadf..88506d33a6 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml @@ -56,6 +56,7 @@ - FoodBakedCookieRaisin - FoodBakedCookieSugar - FoodBakedGrilledCheeseSandwich + - FoodBakedGrilledCheeseSandwichCotton - FoodBakedNugget - FoodBakedPancake - FoodBakedPancakeBb diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml index e6882fa621..c7a10d4212 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml @@ -862,6 +862,39 @@ - ReagentId: Vitamin Quantity: 3 +- type: entity + parent: FoodBakedBase + id: FoodBakedGrilledCheeseSandwichCotton + name: cotton grilled cheese sandwich + description: Cotton bread slightly burnt in butter, with melted cheese. Moths find it difficult to resist this combination. + components: + - type: FlavorProfile + flavors: + - cheesy + - bread + - cotton + - type: Sprite + sprite: Objects/Consumable/Food/Baked/misc.rsi + state: grilled-cheese-cotton + - type: Food + requiresSpecialDigestion: true + - type: Tag + tags: + - ClothMade + - type: SolutionContainerManager + solutions: + food: + maxVol: 21 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Fiber + Quantity: 5 + - ReagentId: Butter + Quantity: 2 + - ReagentId: Vitamin + Quantity: 3 + # Entity Tables - type: entityTable diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 60c7d74c0d..589d98e34b 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -2366,3 +2366,12 @@ FoodCheeseSlice: 1 FoodButterSlice: 1 +- type: microwaveMealRecipe + id: RecipeGrilledCheeseSandwichCotton + name: cotton grilled cheese sandwich recipe + result: FoodBakedGrilledCheeseSandwichCotton + time: 10 + solids: + FoodBreadCottonSlice: 2 + FoodCheeseSlice: 1 + FoodButterSlice: 1 diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/grilled-cheese-cotton.png b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/grilled-cheese-cotton.png new file mode 100644 index 0000000000000000000000000000000000000000..8295ed11ad5c2e059235cadce45449fa63a661a2 GIT binary patch literal 1003 zcmV<H0~Gv;P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px&i%CR5R9HvtRclC-VHAFrSzB%7Mixy<vyf=HT7}vwOAJd^(1k1_qk`;DPzi-y zBq)NG6a)p4U||<3tt?X05Gr$NU{@9;sa?n*<6F4dhL^rL$KEk*&S^g+@cj91?|Yuh zIp_Tp801h4GCqa~3_0-sIdCLCT&Br!x?J4`NTXIGyQaC{f`Z;quu><#{ThOuJ0j6; zI)KpUN1>dkhjZ)}=%VZ3yitHtr$6?aM4tp+r9pnzrbBYxd$hE);JbARjO(Vu^SOzM z=#=;1d{PU|nzeA8ufdu8N=%#3iM2&ipSj7xfQ$ATRPw<r1L|x)5MvHQho#(WyWI2; zI>Smx_97_si=ckB8KH6W(f+gw<*p1&%3scFjn@NX^h!X06R1|13x{VLREkzqRK3K! zsCEV=60AbM2wJTc4u^x+N)0jWjO1B{FNaqJB;uDq@;Ie@>%<JUm1@f*w6EcC#CB^u zB0%6GXbtMG0QzVq(RgMLm&;|mfQqeC{g$Oy0&~I@coDG>h3S&F>A2<wT^God4PG#) z5&(BK(A2>1CA-9pNzc?DWj7jd*7g$>-#mZe1tdVqdXgYl2#`Q1L=zG@Q4VruRK#4k z<<YF1rsqMUGk5}&C?zFDp7o^?G~bnDOrZNjYXK}43pd`A51~k&KNDy33bAQv6oWg} zCX62w!uN+3#PF5&_XZwt3Y^c(@|r9)QkSN3qPy08pt4Zxx?hixQjJ%!&1Qr7V;<Ju zb}>;Awaqd#&BJlA)(FjPn_sv6zN87*XmDe4mKm+3zc^or`v=ya`@r{tNLpe9qGuR+ z_UUA#a&^9VgsT}*=v0OA+R>@Q(0I&-OLi5G+ugzU!0x<4p5@q+S#W)O<Ry}Or=Bfc zJXr&E+J2Olm9lCAza00e8!!=2k4r?-#%jbh*YuwNC9uqT%u0xa2+vIkm$cjYkqC5j zbl{q~iJz6Lb$lgYv2R7@2!y<;4!#NL91vDp%XTujZ$kPeN+WD$P*W93N=lHElf#Pl ztcqkpN7A2z`XT5sq-4G%vM-uIswvjl^vKN2MA7E1qn5(@;1*x$XiiE>VsHuq72yw@ zzV-RT5JZF{<#soY78fHSvds(Xt2$U<L99;#UI{&1c^V$?`-xQx#l5NRw&Bl1zX*r~ zJzW_H@PHifr{G`T4ak9i1@+xOL}18)L3iLccr=$VQSdK10000EWmrjOO-%qQ00008 Z000000002eQ<DGy002ovPDHLkV1i&J(Te~8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json index f9e3aef18c..15e15c4208 100644 --- a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa. Chevrechaud created by Github user deathride58, croissant taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7ffd61b6fa6a6183daa8900f9a490f46f7a81955. Muffin-chocolate, muffin-banana and muffin-cherry sprites modified from the original muffin sprite by RumiTiger. Chevrechaud-cotton and croissant-cotton created by JuneSzalkowska. Grilled-cheese created by AdipemDragon, take from tgstation at commit https://github.com/tgstation/tgstation/commit/716c6db05ab9df28fee81ceb7cf2b6c25f21176d.", + "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa. Chevrechaud created by Github user deathride58, croissant taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7ffd61b6fa6a6183daa8900f9a490f46f7a81955. Muffin-chocolate, muffin-banana and muffin-cherry sprites modified from the original muffin sprite by RumiTiger. Chevrechaud-cotton and croissant-cotton created by JuneSzalkowska. Grilled-cheese created by AdipemDragon, take from tgstation at commit https://github.com/tgstation/tgstation/commit/716c6db05ab9df28fee81ceb7cf2b6c25f21176d. Grilled-cheese-cotton modified from grilled-cheese by MadeOfHeartAndStone on Discord.", "size": { "x": 32, "y": 32 @@ -177,6 +177,9 @@ }, { "name": "grilled-cheese" + }, + { + "name": "grilled-cheese-cotton" } ] } From cb536477483af7e30b06975f07ad40098420528c Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 03:25:44 +0000 Subject: [PATCH 589/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 719eb2282a..a6086e524d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Minemoder - changes: - - message: The chemical locker now has a 10u vial of plasma. - type: Add - id: 7827 - time: '2025-01-18T18:27:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33871 - author: Nox38 changes: - message: Seclites now start with a medium-capacity power cell. @@ -3932,3 +3925,10 @@ id: 8328 time: '2025-04-24T03:01:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35915 +- author: AgentSmithRadio, MadeOfHeartAndStone + changes: + - message: Added cotton grilled cheese sandwich entity and recipe. + type: Add + id: 8329 + time: '2025-04-24T03:24:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36135 From b0edf7106ffa15dd76099200a5c2b5bdb376d64e Mon Sep 17 00:00:00 2001 From: SG6732 <151011904+SG6732@users.noreply.github.com> Date: Wed, 23 Apr 2025 20:45:27 -0700 Subject: [PATCH 590/622] Meat Patty (#34896) Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Entities/Objects/Consumable/Food/meat.yml | 50 ++++++++++++++++++ .../Construction/Graphs/food/meatball.yml | 7 +++ .../Construction/Graphs/food/patty.yml | 15 ++++++ .../Consumable/Food/meat.rsi/meta.json | 8 ++- .../Consumable/Food/meat.rsi/patty.png | Bin 0 -> 409 bytes .../Consumable/Food/meat.rsi/raw_patty.png | Bin 0 -> 397 bytes 6 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/food/patty.yml create mode 100644 Resources/Textures/Objects/Consumable/Food/meat.rsi/patty.png create mode 100644 Resources/Textures/Objects/Consumable/Food/meat.rsi/raw_patty.png diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index a229c0ea80..067595fa14 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -675,6 +675,27 @@ graph: MeatMeatballCooked node: start +# meat patty - grillin' time + +- type: entity + name: meat patty + parent: FoodMeatBase + id: FoodMeatPatty + description: A flat slab of ground meat. Ready for grillin'. + components: + - type: Tag + tags: + - Raw + - Meat + - type: Sprite + state: raw_patty + - type: InternalTemperature + conductivity: 0.43 + - type: Construction + graph: CookedPatty + node: start + defaultTarget: cooked meat patty + - type: entity name: slimeball parent: FoodMeatBase @@ -1192,6 +1213,35 @@ graph: MeatMeatballCooked node: meatball cooked +- type: entity + name: cooked meat patty + parent: FoodMeatBase + id: FoodMeatPattyCooked + description: A cooked meat patty. + components: + - type: Tag + tags: + - Cooked + - Meat + - Steak + - type: Sprite + state: patty + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Nutriment + Quantity: 7.5 + - ReagentId: Protein + Quantity: 7.5 + - type: Construction + graph: CookedPatty + node: cooked meat patty + - type: FoodSequenceElement + entries: + Burger: MeatSteak + Taco: MeatSteak + - type: entity name: boiled snail parent: FoodMeatBase diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/food/meatball.yml b/Resources/Prototypes/Recipes/Construction/Graphs/food/meatball.yml index 647c163e79..9fac37b9c6 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/food/meatball.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/food/meatball.yml @@ -11,6 +11,13 @@ sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 335 + - to: meat patty + steps: + - tool: Rolling + doAfter: 1 - node: meatball cooked entity: FoodMeatMeatballCooked + + - node: meat patty + entity: FoodMeatPatty diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/food/patty.yml b/Resources/Prototypes/Recipes/Construction/Graphs/food/patty.yml new file mode 100644 index 0000000000..f82efe5543 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/food/patty.yml @@ -0,0 +1,15 @@ +# cooked meat patty +- type: constructionGraph + id: CookedPatty + start: start + graph: + - node: start + edges: + - to: cooked meat patty + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg + steps: + - minTemperature: 335 + - node: cooked meat patty + entity: FoodMeatPattyCooked diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json index 5dc8e026cc..1c3f950180 100644 --- a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation and modified by Swept, potato1234x and deltanedas at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa, snail by IproduceWidgets (github) and Kezu (discord), anomalymeat/cooked by august-sun, dragoncutlet, dragoncutlet_veins, dragoncutlet-cooked and dragon-cooked by JuneSzalkowska (discord)", + "copyright": "Taken from tgstation and modified by Swept, potato1234x and deltanedas at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa, snail by IproduceWidgets (github) and Kezu (discord), anomalymeat/cooked by august-sun, dragoncutlet, dragoncutlet_veins, dragoncutlet-cooked and dragon-cooked by JuneSzalkowska (discord), raw and cooked patty taken from tgstation at https://github.com/tgstation/tgstation/commit/b83c7deee4c91df4de130db242facce20308aa8a", "size": { "x": 32, "y": 32 @@ -218,6 +218,12 @@ }, { "name": "dragoncutlet-cooked" + }, + { + "name": "raw_patty" + }, + { + "name": "patty" } ] } diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/patty.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/patty.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a59c51f5ad6113528bec9d06c3e258d3b5fdfe GIT binary patch literal 409 zcmV;K0cQS*P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000ie z000ie0hKEb8vp<SOG!jQRCt{2lfO#CP!z_GP>Qi=p@k|^H=W!<DY|#+6Sz3|AWlAr ztE0O<fQWR`Me862(PAu()C3W(epim3M2C|SDZ)L=$sfq?cfOlbqA8aXZ~{)i3H(oi zosFj9>-hC8_3of|Kl5h-3~tWPQPrEJQJnnfTRxdQB5DD^*BiAIY<aOx<7jOA-9u=f zuhofy=a&zWC8LqZl|Xi4z)=jp7(5XqQCDH4`ld<%(<AoZCgvn?FB9_0x)f9b5{{B^ z^lSp$&w@cQ2{62}P_ZzX0K*_7JDw+*4VhTrw0}$8%{JX!_fr!~s7wU#SOHfH?4JZU zN3-4SP&kaNh=j@58II`>&mW81f=`KKyNZ6x{}O4huGoa|pWw_nb`3n2z_&y|yK!Q$ z>kReECA)UosV5fT+B>?;1u0yh$Z`TszzH~ksSCUVLQvsP4f>=Z00000NkvXXu0mjf DCO)yC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/raw_patty.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/raw_patty.png new file mode 100644 index 0000000000000000000000000000000000000000..ff738788e949a8cb41348679cbf4e30c79e374e2 GIT binary patch literal 397 zcmV;80doF{P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000ie z000ie0hKEb8vp<SKS@MERCt{2lrd|<Koo$V;8;4;l0t@#M(p4cI@_@U`x^xRKo@s^ zf`35pH<+qp7pIb?=wLcHI0QVTL+K(2r!VrtnJT`tDM7fmyt^FS_q}&_$wS7W1+;(` z&;sWvFswaE8vBd&-rDoqAop(q1U8K;xVSaodoG}8?=sEX;K(E*YypH9?b03$^QCbe zuG9QsI}XGrwC^3skx0~mL+~%LjOHKS6j0IxJQ~5;lO=%FQ`^;w<5FseEM^y20tClU zD~@OC0A;^FIk`7az%GYijAKx>10=x-mVh@HLABL{;Klt>`Js!6@c8rmlfa|f%MAe} zN~~tH@Y}JrtMF7`0ZAaFP`-;UBSG<=xXPKQ{vRL-aC`9Hs7rk72z?z3ux|2UP6Gaw r07a$KO$13@AkEMMT0jeEfy@OqR9VLlhi#Sd00000NkvXXu0mjf-E^zA literal 0 HcmV?d00001 From aed40f8e47847cda120624ed60df9d54ff68c025 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 03:46:34 +0000 Subject: [PATCH 591/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a6086e524d..019462e43e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: Nox38 - changes: - - message: Seclites now start with a medium-capacity power cell. - type: Tweak - - message: Seclite power draw (wattage) has been reduced to 0.5. - type: Tweak - id: 7828 - time: '2025-01-18T22:56:42.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34469 - author: K-Dynamic changes: - message: Empty guns have a louder dry fire sound (i.e. when the chamber or power @@ -3932,3 +3923,10 @@ id: 8329 time: '2025-04-24T03:24:37.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36135 +- author: SG6732 + changes: + - message: Added meat patties. Get the charcoal and let's start grillin. + type: Add + id: 8330 + time: '2025-04-24T03:45:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34896 From 0deb35000f2a5546db8345ce14f89e0e1092efc9 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Thu, 24 Apr 2025 19:58:30 +1000 Subject: [PATCH 592/622] Remove beaker from the MaterialArbitrageTest whitelist (#36876) --- Content.IntegrationTests/Tests/MaterialArbitrageTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs b/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs index 4b020e9850..2bf6c2bb32 100644 --- a/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs +++ b/Content.IntegrationTests/Tests/MaterialArbitrageTest.cs @@ -31,7 +31,7 @@ public sealed class MaterialArbitrageTest // These recipes are currently broken and need fixing. You should not be adding to these sets. private readonly HashSet<string> _destructionArbitrageIgnore = [ - "BaseChemistryEmptyVial", "DrinkShotGlass", "Beaker", "SodiumLightTube", "DrinkGlassCoupeShaped", + "BaseChemistryEmptyVial", "DrinkShotGlass", "SodiumLightTube", "DrinkGlassCoupeShaped", "LedLightBulb", "ExteriorLightTube", "LightTube", "DrinkGlass", "DimLightBulb", "LightBulb", "LedLightTube", "SheetRGlass1", "ChemistryEmptyBottle01", "WarmLightBulb", ]; From 712954f1c4ab6e54d3d04b166546e1234dd48fd2 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 24 Apr 2025 07:39:40 -0400 Subject: [PATCH 593/622] Turnstiles (#36313) * construction rotation fix * Turnstiles * renaming * review-slarticodefast-1 * mild attempts to fix (sorry sloth) * move some more shit * Remove engine dependency * grid agnostic * remove debug string * fix json * Update Content.Shared/Movement/Pulling/Systems/PullingSystem.cs Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> * Update Content.Shared/Movement/Pulling/Systems/PullingSystem.cs Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> * remove pass delay for mispredict reasons. * most minor of changes * Give directional indicator on examine --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- Content.Client/Doors/TurnstileSystem.cs | 75 ++++++++++ .../Doors/Systems/TurnstileSystem.cs | 6 + .../Doors/Components/TurnstileComponent.cs | 71 ++++++++++ .../Doors/Systems/SharedTurnstileSystem.cs | 131 ++++++++++++++++++ .../Movement/Pulling/Systems/PullingSystem.cs | 10 ++ .../en-US/doors/components/turnstile.ftl | 1 + .../Entities/Structures/Doors/turnstile.yml | 77 ++++++++++ .../Graphs/structures/turnstile.yml | 33 +++++ .../Recipes/Construction/structures.yml | 17 +++ .../Structures/Doors/turnstile.rsi/arrow.png | Bin 0 -> 543 bytes .../Structures/Doors/turnstile.rsi/deny.png | Bin 0 -> 1960 bytes .../Structures/Doors/turnstile.rsi/meta.json | 65 +++++++++ .../Doors/turnstile.rsi/operate.png | Bin 0 -> 3481 bytes .../Doors/turnstile.rsi/turnstile.png | Bin 0 -> 1442 bytes .../Doors/turnstile.rsi/turnstile_map.png | Bin 0 -> 1832 bytes 15 files changed, 486 insertions(+) create mode 100644 Content.Client/Doors/TurnstileSystem.cs create mode 100644 Content.Server/Doors/Systems/TurnstileSystem.cs create mode 100644 Content.Shared/Doors/Components/TurnstileComponent.cs create mode 100644 Content.Shared/Doors/Systems/SharedTurnstileSystem.cs create mode 100644 Resources/Locale/en-US/doors/components/turnstile.ftl create mode 100644 Resources/Prototypes/Entities/Structures/Doors/turnstile.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/structures/turnstile.yml create mode 100644 Resources/Textures/Structures/Doors/turnstile.rsi/arrow.png create mode 100644 Resources/Textures/Structures/Doors/turnstile.rsi/deny.png create mode 100644 Resources/Textures/Structures/Doors/turnstile.rsi/meta.json create mode 100644 Resources/Textures/Structures/Doors/turnstile.rsi/operate.png create mode 100644 Resources/Textures/Structures/Doors/turnstile.rsi/turnstile.png create mode 100644 Resources/Textures/Structures/Doors/turnstile.rsi/turnstile_map.png diff --git a/Content.Client/Doors/TurnstileSystem.cs b/Content.Client/Doors/TurnstileSystem.cs new file mode 100644 index 0000000000..6e76ce6aa0 --- /dev/null +++ b/Content.Client/Doors/TurnstileSystem.cs @@ -0,0 +1,75 @@ +using Content.Shared.Doors.Components; +using Content.Shared.Doors.Systems; +using Content.Shared.Examine; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.Map; +using Robust.Shared.Prototypes; + +namespace Content.Client.Doors; + +/// <inheritdoc/> +public sealed class TurnstileSystem : SharedTurnstileSystem +{ + [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!; + + private static EntProtoId _examineArrow = "TurnstileArrow"; + + private const string AnimationKey = "Turnstile"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<TurnstileComponent, AnimationCompletedEvent>(OnAnimationCompleted); + SubscribeLocalEvent<TurnstileComponent, ExaminedEvent>(OnExamined); + } + + private void OnAnimationCompleted(Entity<TurnstileComponent> ent, ref AnimationCompletedEvent args) + { + if (args.Key != AnimationKey) + return; + + if (!TryComp<SpriteComponent>(ent, out var sprite)) + return; + sprite.LayerSetState(TurnstileVisualLayers.Base, new RSI.StateId(ent.Comp.DefaultState)); + } + + private void OnExamined(Entity<TurnstileComponent> ent, ref ExaminedEvent args) + { + Spawn(_examineArrow, new EntityCoordinates(ent, 0, 0)); + } + + protected override void PlayAnimation(EntityUid uid, string stateId) + { + if (!TryComp<AnimationPlayerComponent>(uid, out var animation) || !TryComp<SpriteComponent>(uid, out var sprite)) + return; + var ent = (uid, animation); + + if (_animationPlayer.HasRunningAnimation(animation, AnimationKey)) + _animationPlayer.Stop(ent, AnimationKey); + + if (sprite.BaseRSI == null || !sprite.BaseRSI.TryGetState(stateId, out var state)) + return; + var animLength = state.AnimationLength; + + var anim = new Animation + { + AnimationTracks = + { + new AnimationTrackSpriteFlick + { + LayerKey = TurnstileVisualLayers.Base, + KeyFrames = + { + new AnimationTrackSpriteFlick.KeyFrame(state.StateId, 0f), + }, + }, + }, + Length = TimeSpan.FromSeconds(animLength), + }; + + _animationPlayer.Play(ent, anim, AnimationKey); + } +} diff --git a/Content.Server/Doors/Systems/TurnstileSystem.cs b/Content.Server/Doors/Systems/TurnstileSystem.cs new file mode 100644 index 0000000000..687a97095f --- /dev/null +++ b/Content.Server/Doors/Systems/TurnstileSystem.cs @@ -0,0 +1,6 @@ +using Content.Shared.Doors.Systems; + +namespace Content.Server.Doors.Systems; + +/// <inheritdoc/> +public sealed class TurnstileSystem : SharedTurnstileSystem; diff --git a/Content.Shared/Doors/Components/TurnstileComponent.cs b/Content.Shared/Doors/Components/TurnstileComponent.cs new file mode 100644 index 0000000000..5f19dd3e0b --- /dev/null +++ b/Content.Shared/Doors/Components/TurnstileComponent.cs @@ -0,0 +1,71 @@ +using Content.Shared.Doors.Systems; +using Content.Shared.Whitelist; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Doors.Components; + +/// <summary> +/// This is used for a condition door that allows entry only through a single side. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +[Access(typeof(SharedTurnstileSystem))] +public sealed partial class TurnstileComponent : Component +{ + /// <summary> + /// A whitelist of the things this turnstile can choose to block or let through. + /// Things not in this whitelist will be ignored by default. + /// </summary> + [DataField] + public EntityWhitelist? ProcessWhitelist; + + /// <summary> + /// The next time at which the resist message can show. + /// </summary> + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField, AutoPausedField] + public TimeSpan NextResistTime; + + /// <summary> + /// Maintained hashset of entities currently passing through the turnstile. + /// </summary> + [DataField, AutoNetworkedField] + public HashSet<EntityUid> CollideExceptions = new(); + + /// <summary> + /// default state of the turnstile sprite. + /// </summary> + [DataField] + public string DefaultState = "turnstile"; + + /// <summary> + /// animation state of the turnstile spinning. + /// </summary> + [DataField] + public string SpinState = "operate"; + + /// <summary> + /// animation state of the turnstile denying entry. + /// </summary> + [DataField] + public string DenyState = "deny"; + + /// <summary> + /// Sound to play when the turnstile admits a mob through. + /// </summary> + [DataField] + public SoundSpecifier? TurnSound = new SoundPathSpecifier("/Audio/Items/ratchet.ogg"); + + /// <summary> + /// Sound to play when the turnstile denies entry + /// </summary> + [DataField] + public SoundSpecifier? DenySound = new SoundPathSpecifier("/Audio/Machines/airlock_deny.ogg"); +} + +[Serializable, NetSerializable] +public enum TurnstileVisualLayers : byte +{ + Base +} diff --git a/Content.Shared/Doors/Systems/SharedTurnstileSystem.cs b/Content.Shared/Doors/Systems/SharedTurnstileSystem.cs new file mode 100644 index 0000000000..0af6b91378 --- /dev/null +++ b/Content.Shared/Doors/Systems/SharedTurnstileSystem.cs @@ -0,0 +1,131 @@ +using Content.Shared.Access.Systems; +using Content.Shared.Doors.Components; +using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Popups; +using Content.Shared.Whitelist; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics.Events; +using Robust.Shared.Timing; + +namespace Content.Shared.Doors.Systems; + +/// <summary> +/// This handles logic and interactions related to <see cref="TurnstileComponent"/> +/// </summary> +public abstract partial class SharedTurnstileSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly AccessReaderSystem _accessReader = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly EntityWhitelistSystem _entityWhitelist = default!; + [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + /// <inheritdoc/> + public override void Initialize() + { + SubscribeLocalEvent<TurnstileComponent, PreventCollideEvent>(OnPreventCollide); + SubscribeLocalEvent<TurnstileComponent, StartCollideEvent>(OnStartCollide); + SubscribeLocalEvent<TurnstileComponent, EndCollideEvent>(OnEndCollide); + } + + private void OnPreventCollide(Entity<TurnstileComponent> ent, ref PreventCollideEvent args) + { + if (args.Cancelled || !args.OurFixture.Hard || !args.OtherFixture.Hard) + return; + + if (ent.Comp.CollideExceptions.Contains(args.OtherEntity)) + { + args.Cancelled = true; + return; + } + + // We need to add this in here too for chain pulls + if (_pulling.GetPuller(args.OtherEntity) is { } puller && ent.Comp.CollideExceptions.Contains(puller)) + { + ent.Comp.CollideExceptions.Add(args.OtherEntity); + Dirty(ent); + args.Cancelled = true; + return; + } + + // unblockables go through for free. + if (_entityWhitelist.IsWhitelistFail(ent.Comp.ProcessWhitelist, args.OtherEntity)) + { + args.Cancelled = true; + return; + } + + if (CanPassDirection(ent, args.OtherEntity)) + { + if (!_accessReader.IsAllowed(args.OtherEntity, ent)) + return; + + ent.Comp.CollideExceptions.Add(args.OtherEntity); + if (_pulling.GetPulling(args.OtherEntity) is { } uid) + ent.Comp.CollideExceptions.Add(uid); + + args.Cancelled = true; + Dirty(ent); + } + else + { + if (_timing.CurTime >= ent.Comp.NextResistTime) + { + _popup.PopupClient(Loc.GetString("turnstile-component-popup-resist", ("turnstile", ent.Owner)), ent, args.OtherEntity); + ent.Comp.NextResistTime = _timing.CurTime + TimeSpan.FromSeconds(0.1); + Dirty(ent); + } + } + } + + private void OnStartCollide(Entity<TurnstileComponent> ent, ref StartCollideEvent args) + { + if (!ent.Comp.CollideExceptions.Contains(args.OtherEntity)) + { + if (CanPassDirection(ent, args.OtherEntity)) + { + if (!_accessReader.IsAllowed(args.OtherEntity, ent)) + { + _audio.PlayPredicted(ent.Comp.DenySound, ent, args.OtherEntity); + PlayAnimation(ent, ent.Comp.DenyState); + } + } + + return; + } + // if they passed through: + PlayAnimation(ent, ent.Comp.SpinState); + _audio.PlayPredicted(ent.Comp.TurnSound, ent, args.OtherEntity); + } + + private void OnEndCollide(Entity<TurnstileComponent> ent, ref EndCollideEvent args) + { + if (!args.OurFixture.Hard) + { + ent.Comp.CollideExceptions.Remove(args.OtherEntity); + Dirty(ent); + } + } + + protected bool CanPassDirection(Entity<TurnstileComponent> ent, EntityUid other) + { + var xform = Transform(ent); + var otherXform = Transform(other); + + var (pos, rot) = _transform.GetWorldPositionRotation(xform); + var otherPos = _transform.GetWorldPosition(otherXform); + + var approachAngle = (pos - otherPos).ToAngle(); + var rotateAngle = rot.ToWorldVec().ToAngle(); + + var dif = Math.Min(Math.Abs(approachAngle.Theta - rotateAngle.Theta), Math.Abs(rotateAngle.Theta - approachAngle.Theta)); + return dif < Math.PI / 4; + } + + protected virtual void PlayAnimation(EntityUid uid, string stateId) + { + + } +} diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index 6ac0460f8e..369225df2d 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -341,6 +341,16 @@ public sealed class PullingSystem : EntitySystem return Resolve(puller, ref component, false) && component.Pulling != null; } + public EntityUid? GetPuller(EntityUid puller, PullableComponent? component = null) + { + return !Resolve(puller, ref component, false) ? null : component.Puller; + } + + public EntityUid? GetPulling(EntityUid puller, PullerComponent? component = null) + { + return !Resolve(puller, ref component, false) ? null : component.Pulling; + } + private void OnReleasePulledObject(ICommonSession? session) { if (session?.AttachedEntity is not { Valid: true } player) diff --git a/Resources/Locale/en-US/doors/components/turnstile.ftl b/Resources/Locale/en-US/doors/components/turnstile.ftl new file mode 100644 index 0000000000..16dca94244 --- /dev/null +++ b/Resources/Locale/en-US/doors/components/turnstile.ftl @@ -0,0 +1 @@ +turnstile-component-popup-resist = {CAPITALIZE(THE($turnstile))} resists your efforts! diff --git a/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml new file mode 100644 index 0000000000..6d675c5928 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml @@ -0,0 +1,77 @@ +- type: entity + id: Turnstile + parent: BaseStructure + name: turnstile + description: A mechanical door that permits one-way access and prevents tailgating. + components: + - type: Sprite + sprite: Structures/Doors/turnstile.rsi + snapCardinals: true + drawdepth: Doors + layers: + - state: turnstile + map: [ "enum.TurnstileVisualLayers.Base" ] + - type: AnimationPlayer + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.49,-0.49,0.49,0.49" # same dimensions as a door for tall turnstile, prevents objects being thrown through + density: 100 + mask: + - FullTileMask + layer: + - AirlockLayer + fix2: + shape: + !type:PhysShapeAabb + bounds: "-0.50,-0.50,0.50,0.50" # same dimensions as a door for tall turnstile, prevents objects being thrown through + hard: false + mask: + - FullTileMask + layer: + - AirlockLayer + - type: MeleeSound + soundGroups: + Brute: + path: + "/Audio/Weapons/smash.ogg" + - type: InteractionOutline + - type: Turnstile + processWhitelist: + components: + - MobState # no mobs + - Pullable # no dragging things in + - type: Appearance + - type: Damageable + damageContainer: Inorganic + damageModifierSet: StrongMetallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 500 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Construction + graph: Turnstile + node: turnstile + +- # Spawned by the client-side turnstile examine code to indicate the direction to pass through. + type: entity + id: TurnstileArrow + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: Structures/Doors/turnstile.rsi + color: "#FFFFFFBB" + layers: + - state: arrow + offset: 0, 0.78125 + - type: TimedDespawn + lifetime: 2 + - type: Tag + tags: + - HideContextMenu diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/turnstile.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/turnstile.yml new file mode 100644 index 0000000000..cc1b8efb6a --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/turnstile.yml @@ -0,0 +1,33 @@ +- type: constructionGraph + id: Turnstile + start: start + graph: + - node: start + actions: + - !type:DeleteEntity { } + edges: + - to: turnstile + completed: + - !type:SnapToGrid + steps: + - material: MetalRod + amount: 4 + doAfter: 6 + - material: Steel + amount: 1 + doAfter: 2 + + - node: turnstile + entity: Turnstile + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: PartRodMetal1 + amount: 4 + - !type:DeleteEntity + steps: + - tool: Welding + doAfter: 4.0 + - tool: Cutting + doAfter: 2.0 diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml index 7602a6cb11..11579ac9ba 100644 --- a/Resources/Prototypes/Recipes/Construction/structures.yml +++ b/Resources/Prototypes/Recipes/Construction/structures.yml @@ -796,6 +796,23 @@ conditions: - !type:TileNotBlocked +- type: construction + name: turnstile + id: Turnstile + graph: Turnstile + startNode: start + targetNode: turnstile + category: construction-category-structures + description: A mechanical door that permits one-way access and prevents tailgating. + icon: + sprite: Structures/Doors/turnstile.rsi + state: turnstile + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + - type: construction name: shutter id: Shutters diff --git a/Resources/Textures/Structures/Doors/turnstile.rsi/arrow.png b/Resources/Textures/Structures/Doors/turnstile.rsi/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6332f6b32619791298624df56d16518b06bcbf3e GIT binary patch literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdDaPU;cPEB*=VV?2**861978JR zyuEwTm&s9pEy3eWtJH^+eruSy7w}tu?37!PR%;-o@Zjyb-R9NLzpL(1{C_4jRd}+b zxiruu5D3ed{dw7xpjE#<yfu6M`RVbe_NlG*_Sc`}2YJ0*&#$<2idlaC#-A7emY<n# z!{B`5?IP`nwSTl1d=Z)Fm%E?Idp~R6@ogaKQ|I+ItmtSv%RhB~HHWm^zSV#D{)&sv z40UO5w-5RE`}h0&s@m9)|3_Q@MY$XY2`$cV;@khT{Im48_|P|ZmC`DHeA54v&!718 z;cC4fuN2SR*z>3R&->Ra9&a^{ba^YU`9$Ad9^zyWDbe_s;lGW2zJ0^bKUbeUf6M;k z#|o_lGpA3#@kccJTwTM;m3N|fk1uU|alfvi^xSjz=ePL-X4#i=Sod|@<~Q*AxA=8N zn`Z29Mz@psCiCOx%HR0!FPORie-&$w#%X^|S-$x7D+E8j_*wGv8#BUEhHuO|3j3Gu z`OC0$@=kGk>t8j0Ui{qq^ewx^eCz3sQ=YzI*SH&WsUS>$*Z+Cbw#qAf*Lr2JRQhhc z{^{HN8#ev?lktuD$`gC57URB-?Me0yx&PjlihR|-vzW(FUVg5;?R<IND!ae?p95`l ZSm+-kxTNAm%%vWX^`5SNF6*2UngD~b{0#sA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/turnstile.rsi/deny.png b/Resources/Textures/Structures/Doors/turnstile.rsi/deny.png new file mode 100644 index 0000000000000000000000000000000000000000..4afe444d7c9b5d66814526dcd1bf0f0431ef6efe GIT binary patch literal 1960 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 AlmGw# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/turnstile.rsi/meta.json b/Resources/Textures/Structures/Doors/turnstile.rsi/meta.json new file mode 100644 index 0000000000..dea5fb8946 --- /dev/null +++ b/Resources/Textures/Structures/Doors/turnstile.rsi/meta.json @@ -0,0 +1,65 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from OracleStation at https://github.com/OracleStation/OracleStation/blob/c1046bdd14674dc5a8631074aaa6650770b2937e/icons/obj/turnstile.dmi. Arrow by EmoGarbage404 (github).", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "arrow", + "delays": [ + [ + 0.5, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "turnstile" + }, + { + "name": "turnstile_map", + "directions": 4 + }, + { + "name": "operate", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "deny", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Doors/turnstile.rsi/operate.png b/Resources/Textures/Structures/Doors/turnstile.rsi/operate.png new file mode 100644 index 0000000000000000000000000000000000000000..3178c298dde77260c1187265c4531441c892ae69 GIT binary patch literal 3481 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 R#rf9)m>XX_UvB6T`F}ZY2L1p5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/turnstile.rsi/turnstile.png b/Resources/Textures/Structures/Doors/turnstile.rsi/turnstile.png new file mode 100644 index 0000000000000000000000000000000000000000..48c85577e71f296bf745e0b0ad8e7df1ffebb0e8 GIT binary patch literal 1442 zcmV;T1zq}yP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800009a7bBm000ie z000ie0hKEb8vp<WR7pfZRCt`VS6xV?RTzH1`BleV9e+!NTultp45ETC=t3+s!8Ktn z+U#ZtWn7B(A~04`uY$mJbywTETT+6_75qWXwk5pjW?@$iHw`Z~t<lsJM;&$M^gd_i ze9na1_f63Yhx5&ubI$v`f6qC`R#H+Th^4Hoj20Ic$?x~m|1A|26*N0LE5B{A%H3`^ z6%`fH(9n=(v`Keww@5#ePI-BG^kDu0UH;&*;TlL?U7dg~=mZFxQvP=79F4EMN}HRT z)Y;i7va+&B(=-Z&LS(gC>G=3qZqU-wqALoA!?MT!iAe9oht%?A#BiHZ?si4?)r6qX z(UI)KtlVL@OAt1Tg)H2z_w)$wrAwONF*FN+M8TPrU@%CYXYSM23(*k7N=8NoebUik z%AN4g{{B7*Arb-rkLB-0*609opJbgs6Mb|0wmIdziOu04i_J!Mr!ye{PM&{w7&rj{ z_n&pgPnwvR5QwoQ>Uw+wIl{5EwMDD`Ra#qHlg*LrpuxdGfh5M<!^1<ebLb%O4%XDv z)aZs??0t%McXv7IPYD5JYHCWzxU+TWAyAIZfF4TF2ls;VKg>Deyuo}VYf@5@jI&yg zwd3RCqPn_Tf~c&lq~YP=6A%1ds;a6C!*JvC8zL<&jS311=-&N%)Y#Z)Ds+$xHeKb7 z1h5qlw6hgi|JM2Q!b~2(Vpoz&ZUl=Hk*w@&{aXUa+qLL903K*-Ym+=+kCq@5z_s}H zdc6`HDgesW_`elB1b0W{$wVo@<_8A{dII+K^@--@W(|3OF@VJPe*&-+u+r165Z&F5 z@IZ$N9#EE}CCUSTtgpudc<s#){rY`mz$_0at5vBcBAZ;saR7Gs_i8Hh`u54Bv9U3M zjS&iz6KWgEkPkR9H~!q9jg3gN*e#L=($mxBTqLOC4|oV+;?mO%o1UJI2Y>`rX8~kn zWJF*QT#JSc(L0#=P~X@%*6mP=F@y!*XrO49%Oyc$9NePH`~6oI=-KC;<ozP!bRMX! ztu+k8)t;*&H#e8ExuoV7=E>vnnC5}w<8V9=#EMxSfQR52R6?T1F$5vi0U!rJMiB5o zYip~>&(D|fgWJ)=jZlgb#5`pIdUY=_E3S3iGr}hT{J+JQk&3@kplThhzrSBJH8p7} zIaS<^q`bUbZn(U>OkMOG(N}Z=AXdNw?d|QRs2B;U4k;t$AM$*4z(D}Kn=48O@Y0JG zzLJ^e0hA+Luju%nq`0`4-u3ykTcxF9Z*NbAH7*I0{TkhQ$cYrAdUSMDz&a>Vv<yLy zvwUr1jgAhEXl`zftPU#;3=D{zoE)74AXta*Kp;RqpO4Dl08j^gbn6%T^qnH2Z=(SA za|K;^f#`=j5#>x2LMc|(ArIhkg&vBO04O}7G8_NLaz#o?3QbN<ibp=L{QWy``Dh#a zI#1_;Sk`)+bY1Hbt`rv)78cU%PqS2CU;o%O4Gj%~J)m9VHwcXKq&z_j-*FY3iAloM zvymg!EDyk9Sgx!#lF!ba6YA!anwqK~;W~hw==q@D1(}(dkqJ?5heGryL5w3b4y!}v z2*P3{xWbL`?dkQUrMS}70mO2Fy6a1RXAAK**yluovYX5U?=c9x9V~nqb|N>J_l-m) zry?!s0S1054}5&(ieU&;k|7Lcj$?JAD(Y6rZ9|Rr{>V?Rm*?exSsuV!z{=L|a$R#~ z8O{e-EjmwyKpx+CAmWV%5N<b_796*1i;TY+4<xh8FRZLkkVAlD`X(#GNh(92K+Md{ wm<E8PRA;{t6Rz_W>^f(@6!sb{hjNVn1x01m4@rB4+5i9m07*qoM6N<$f>u7Wng9R* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/turnstile.rsi/turnstile_map.png b/Resources/Textures/Structures/Doors/turnstile.rsi/turnstile_map.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3fcc5c31e20199b87146eb55e4a6cd56d33535 GIT binary patch literal 1832 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 WmMV`eM+$}j0000<MNUMnLSTYHk9^kv literal 0 HcmV?d00001 From 896f73c59d2f16a81d44816e45ccdbe2406d9ac9 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 11:40:47 +0000 Subject: [PATCH 594/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 019462e43e..7fe4bc1078 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: K-Dynamic - changes: - - message: Empty guns have a louder dry fire sound (i.e. when the chamber or power - cell is empty). - type: Tweak - id: 7829 - time: '2025-01-19T01:46:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34447 - author: WarPigeon changes: - message: The debriefing room in CentComm is now open to heads of staff for end @@ -3930,3 +3922,11 @@ id: 8330 time: '2025-04-24T03:45:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34896 +- author: DrMelon, EmoGarbage404 + changes: + - message: Added turnstiles, gates able to limit the flow of foot traffic. The station's + flow is at your fingertips. + type: Add + id: 8331 + time: '2025-04-24T11:39:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36313 From dc9844edd1be8e1d9738a0a74712f60f9851e76d Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:32:11 -0400 Subject: [PATCH 595/622] Genpop Closets & IDs (#36392) * Genpop IDs and Lockers * placeholder generation, no ui yet. * UI * Fix time offset * fix meta.jsons * big speller * Scarkyo review * Add turnstile prototypes * make IDs recyclable --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> --- Content.Client/Security/GenpopSystem.cs | 9 + .../Ui/GenpopLockerBoundUserInterface.cs | 36 + .../Security/Ui/GenpopLockerMenu.xaml | 24 + .../Security/Ui/GenpopLockerMenu.xaml.cs | 49 + Content.Server/Access/Systems/IdCardSystem.cs | 20 + Content.Server/Security/GenpopSystem.cs | 30 + .../Components/ExpireIdCardComponent.cs | 44 + .../Access/Systems/SharedIdCardSystem.cs | 48 + Content.Shared/Lock/LockComponent.cs | 7 + Content.Shared/Lock/LockSystem.cs | 10 +- .../Components/GenpopIdCardComponent.cs | 22 + .../Components/GenpopLockerComponent.cs | 47 + .../Security/Systems/SharedGenpopSystem.cs | 240 ++++ .../SharedEntityStorageComponent.cs | 2 +- .../SharedEntityStorageSystem.cs | 10 +- .../Locale/en-US/access/components/genpop.ftl | 28 + .../en-US/prototypes/access/accesses.ftl | 4 +- Resources/Prototypes/Access/misc.yml | 2 + Resources/Prototypes/Access/security.yml | 8 + .../Objects/Misc/identification_cards.yml | 34 + .../Objects/Tools/access_configurator.yml | 2 + .../Entities/Structures/Doors/turnstile.yml | 18 + .../Storage/Closets/Lockers/lockers.yml | 105 ++ .../Structures/Wallmounts/Signs/signs.yml | 9 + .../Structures/Storage/closet.rsi/genpop.png | Bin 0 -> 315 bytes .../Storage/closet.rsi/genpop_door_1.png | Bin 0 -> 379 bytes .../Storage/closet.rsi/genpop_door_2.png | Bin 0 -> 391 bytes .../Storage/closet.rsi/genpop_door_3.png | Bin 0 -> 393 bytes .../Storage/closet.rsi/genpop_door_4.png | Bin 0 -> 378 bytes .../Storage/closet.rsi/genpop_door_5.png | Bin 0 -> 391 bytes .../Storage/closet.rsi/genpop_door_6.png | Bin 0 -> 390 bytes .../Storage/closet.rsi/genpop_door_7.png | Bin 0 -> 380 bytes .../Storage/closet.rsi/genpop_door_8.png | Bin 0 -> 385 bytes .../Storage/closet.rsi/genpop_open.png | Bin 0 -> 303 bytes .../Structures/Storage/closet.rsi/meta.json | 1158 +++++++++-------- .../Wallmounts/signs.rsi/genpop.png | Bin 0 -> 390 bytes .../Structures/Wallmounts/signs.rsi/meta.json | 17 +- 37 files changed, 1403 insertions(+), 580 deletions(-) create mode 100644 Content.Client/Security/GenpopSystem.cs create mode 100644 Content.Client/Security/Ui/GenpopLockerBoundUserInterface.cs create mode 100644 Content.Client/Security/Ui/GenpopLockerMenu.xaml create mode 100644 Content.Client/Security/Ui/GenpopLockerMenu.xaml.cs create mode 100644 Content.Server/Security/GenpopSystem.cs create mode 100644 Content.Shared/Access/Components/ExpireIdCardComponent.cs create mode 100644 Content.Shared/Security/Components/GenpopIdCardComponent.cs create mode 100644 Content.Shared/Security/Components/GenpopLockerComponent.cs create mode 100644 Content.Shared/Security/Systems/SharedGenpopSystem.cs create mode 100644 Resources/Locale/en-US/access/components/genpop.ftl create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_1.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_2.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_3.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_4.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_5.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_6.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_7.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_door_8.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/genpop_open.png create mode 100644 Resources/Textures/Structures/Wallmounts/signs.rsi/genpop.png diff --git a/Content.Client/Security/GenpopSystem.cs b/Content.Client/Security/GenpopSystem.cs new file mode 100644 index 0000000000..2f537cd96e --- /dev/null +++ b/Content.Client/Security/GenpopSystem.cs @@ -0,0 +1,9 @@ +using Content.Shared.Security.Systems; + +namespace Content.Client.Security; + +/// <inheritdoc/> +public sealed class GenpopSystem : SharedGenpopSystem +{ + +} diff --git a/Content.Client/Security/Ui/GenpopLockerBoundUserInterface.cs b/Content.Client/Security/Ui/GenpopLockerBoundUserInterface.cs new file mode 100644 index 0000000000..a546fa6fc6 --- /dev/null +++ b/Content.Client/Security/Ui/GenpopLockerBoundUserInterface.cs @@ -0,0 +1,36 @@ +using Content.Shared.Security.Components; +using JetBrains.Annotations; + +namespace Content.Client.Security.Ui; + +[UsedImplicitly] +public sealed class GenpopLockerBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) +{ + private GenpopLockerMenu? _menu; + + protected override void Open() + { + base.Open(); + + _menu = new(Owner, EntMan); + + _menu.OnConfigurationComplete += (name, time, crime) => + { + SendMessage(new GenpopLockerIdConfiguredMessage(name, time, crime)); + Close(); + }; + + _menu.OnClose += Close; + _menu.OpenCentered(); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + _menu?.Orphan(); + _menu = null; + } +} + diff --git a/Content.Client/Security/Ui/GenpopLockerMenu.xaml b/Content.Client/Security/Ui/GenpopLockerMenu.xaml new file mode 100644 index 0000000000..4eb670d25d --- /dev/null +++ b/Content.Client/Security/Ui/GenpopLockerMenu.xaml @@ -0,0 +1,24 @@ +<controls:FancyWindow + xmlns="https://spacestation14.io" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" + MinSize="400 230" + SetSize="450 260"> + <BoxContainer Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True" Margin="10 5 10 10"> + <BoxContainer Orientation="Vertical" VerticalAlignment="Top" VerticalExpand="True" HorizontalExpand="True" Margin="20 0"> + <RichTextLabel Name="NameLabel"/> + <LineEdit Name="NameEdit"/> + <Control MinWidth="5"/> + <RichTextLabel Name="SentenceLabel"/> + <LineEdit Name="SentenceEdit"/> + <Control MinWidth="5"/> + <RichTextLabel Name="CrimeLabel"/> + <LineEdit Name="CrimeEdit"/> + </BoxContainer> + <Control VerticalExpand="True"/> + <BoxContainer VerticalExpand="True" VerticalAlignment="Bottom" HorizontalAlignment="Right"> + <Button Name="DoneButton" Text="{Loc 'genpop-locket-ui-button-done'}" Disabled="True"/> + </BoxContainer> + </BoxContainer> +</controls:FancyWindow> + + diff --git a/Content.Client/Security/Ui/GenpopLockerMenu.xaml.cs b/Content.Client/Security/Ui/GenpopLockerMenu.xaml.cs new file mode 100644 index 0000000000..575b2f50df --- /dev/null +++ b/Content.Client/Security/Ui/GenpopLockerMenu.xaml.cs @@ -0,0 +1,49 @@ +using Content.Client.Message; +using Content.Client.UserInterface.Controls; +using Content.Shared.Access.Components; +using Content.Shared.Security.Components; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.Security.Ui; + +[GenerateTypedNameReferences] +public sealed partial class GenpopLockerMenu : FancyWindow +{ + public event Action<string, float, string>? OnConfigurationComplete; + + public GenpopLockerMenu(EntityUid owner, IEntityManager entMan) + { + RobustXamlLoader.Load(this); + + Title = entMan.GetComponent<MetaDataComponent>(owner).EntityName; + + NameLabel.SetMarkup(Loc.GetString("genpop-locker-ui-label-name")); + SentenceLabel.SetMarkup(Loc.GetString("genpop-locker-ui-label-sentence")); + CrimeLabel.SetMarkup(Loc.GetString("genpop-locker-ui-label-crime")); + + SentenceEdit.Text = "5"; + CrimeEdit.Text = Loc.GetString("genpop-prisoner-id-crime-default"); + + NameEdit.IsValid = val => !string.IsNullOrWhiteSpace(val) && val.Length <= IdCardConsoleComponent.MaxFullNameLength; + SentenceEdit.IsValid = val => float.TryParse(val, out var f) && f >= 0; + CrimeEdit.IsValid = val => !string.IsNullOrWhiteSpace(val) && val.Length <= GenpopLockerComponent.MaxCrimeLength; + + NameEdit.OnTextChanged += _ => OnTextEdit(); + SentenceEdit.OnTextChanged += _ => OnTextEdit(); + CrimeEdit.OnTextChanged += _ => OnTextEdit(); + + DoneButton.OnPressed += _ => + { + OnConfigurationComplete?.Invoke(NameEdit.Text, float.Parse(SentenceEdit.Text), CrimeEdit.Text); + }; + } + + private void OnTextEdit() + { + DoneButton.Disabled = string.IsNullOrWhiteSpace(NameEdit.Text) || + !float.TryParse(SentenceEdit.Text, out var sentence) || + sentence < 0 || + string.IsNullOrWhiteSpace(CrimeEdit.Text); + } +} diff --git a/Content.Server/Access/Systems/IdCardSystem.cs b/Content.Server/Access/Systems/IdCardSystem.cs index 9057fade72..05ee45b463 100644 --- a/Content.Server/Access/Systems/IdCardSystem.cs +++ b/Content.Server/Access/Systems/IdCardSystem.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Server.Administration.Logs; +using Content.Server.Chat.Systems; using Content.Server.Kitchen.Components; using Content.Server.Popups; using Content.Shared.Access; @@ -19,6 +20,7 @@ public sealed class IdCardSystem : SharedIdCardSystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly MicrowaveSystem _microwave = default!; public override void Initialize() @@ -93,4 +95,22 @@ public sealed class IdCardSystem : SharedIdCardSystem } } + + public override void ExpireId(Entity<ExpireIdCardComponent> ent) + { + if (ent.Comp.Expired) + return; + + base.ExpireId(ent); + + if (ent.Comp.ExpireMessage != null) + { + _chat.TrySendInGameICMessage( + ent, + Loc.GetString(ent.Comp.ExpireMessage), + InGameICChatType.Speak, + ChatTransmitRange.Normal, + true); + } + } } diff --git a/Content.Server/Security/GenpopSystem.cs b/Content.Server/Security/GenpopSystem.cs new file mode 100644 index 0000000000..0a4233308e --- /dev/null +++ b/Content.Server/Security/GenpopSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.Security.Components; +using Content.Shared.Security.Systems; + +namespace Content.Server.Security; + +public sealed class GenpopSystem : SharedGenpopSystem +{ + protected override void CreateId(Entity<GenpopLockerComponent> ent, string name, float sentence, string crime) + { + var xform = Transform(ent); + var uid = Spawn(ent.Comp.IdCardProto, xform.Coordinates); + ent.Comp.LinkedId = uid; + IdCard.TryChangeFullName(uid, name); + + if (TryComp<GenpopIdCardComponent>(uid, out var id)) + { + id.Crime = crime; + id.SentenceDuration = TimeSpan.FromMinutes(sentence); + Dirty(uid, id); + } + if (sentence <= 0) + IdCard.SetPermanent(uid, true); + IdCard.SetExpireTime(uid, TimeSpan.FromMinutes(sentence) + Timing.CurTime); + + var metaData = MetaData(ent); + MetaDataSystem.SetEntityName(ent, Loc.GetString("genpop-locker-name-used", ("name", name)), metaData); + MetaDataSystem.SetEntityDescription(ent, Loc.GetString("genpop-locker-desc-used", ("name", name)), metaData); + Dirty(ent); + } +} diff --git a/Content.Shared/Access/Components/ExpireIdCardComponent.cs b/Content.Shared/Access/Components/ExpireIdCardComponent.cs new file mode 100644 index 0000000000..68a2a97531 --- /dev/null +++ b/Content.Shared/Access/Components/ExpireIdCardComponent.cs @@ -0,0 +1,44 @@ +using Content.Shared.Access.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Access.Components; + +/// <summary> +/// This is used for an ID that expires and replaces its access after a certain period has passed. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +[Access(typeof(SharedIdCardSystem))] +public sealed partial class ExpireIdCardComponent : Component +{ + /// <summary> + /// Whether this ID has expired yet and had its accesses replaced. + /// </summary> + [DataField, AutoNetworkedField] + public bool Expired; + + /// <summary> + /// Whether this card will expire at all. + /// </summary> + [DataField, AutoNetworkedField] + public bool Permanent; + + /// <summary> + /// The time at which this card will expire and the access will be removed. + /// </summary> + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField, AutoNetworkedField] + public TimeSpan ExpireTime = TimeSpan.Zero; + + /// <summary> + /// Access the replaces current access once this card expires. + /// </summary> + [DataField] + public HashSet<ProtoId<AccessLevelPrototype>> ExpiredAccess = new(); + + /// <summary> + /// Line spoken by the card when it expires. + /// </summary> + [DataField] + public LocId? ExpireMessage; +} diff --git a/Content.Shared/Access/Systems/SharedIdCardSystem.cs b/Content.Shared/Access/Systems/SharedIdCardSystem.cs index db7d9b38c8..69d77fe9ec 100644 --- a/Content.Shared/Access/Systems/SharedIdCardSystem.cs +++ b/Content.Shared/Access/Systems/SharedIdCardSystem.cs @@ -9,12 +9,15 @@ using Content.Shared.PDA; using Content.Shared.Roles; using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; +using Robust.Shared.Timing; namespace Content.Shared.Access.Systems; public abstract class SharedIdCardSystem : EntitySystem { [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedAccessSystem _access = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly MetaDataSystem _metaSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -256,4 +259,49 @@ public abstract class SharedIdCardSystem : EntitySystem return $"{idCardComponent.FullName} ({CultureInfo.CurrentCulture.TextInfo.ToTitleCase(idCardComponent.LocalizedJobTitle ?? string.Empty)})" .Trim(); } + + public void SetExpireTime(Entity<ExpireIdCardComponent?> ent, TimeSpan time) + { + if (!Resolve(ent, ref ent.Comp)) + return; + ent.Comp.ExpireTime = time; + Dirty(ent); + } + + public void SetPermanent(Entity<ExpireIdCardComponent?> ent, bool val) + { + if (!Resolve(ent, ref ent.Comp)) + return; + ent.Comp.Permanent = val; + Dirty(ent); + } + + /// <summary> + /// Marks an <see cref="ExpireIdCardComponent"/> as expired, setting the accesses. + /// </summary> + public virtual void ExpireId(Entity<ExpireIdCardComponent> ent) + { + if (ent.Comp.Expired) + return; + + _access.TrySetTags(ent, ent.Comp.ExpiredAccess); + ent.Comp.Expired = true; + Dirty(ent); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + var query = EntityQueryEnumerator<ExpireIdCardComponent>(); + while (query.MoveNext(out var uid, out var comp)) + { + if (comp.Expired || comp.Permanent) + continue; + + if (_timing.CurTime < comp.ExpireTime) + continue; + + ExpireId((uid, comp)); + } + } } diff --git a/Content.Shared/Lock/LockComponent.cs b/Content.Shared/Lock/LockComponent.cs index 2689602ae8..0fdee2477f 100644 --- a/Content.Shared/Lock/LockComponent.cs +++ b/Content.Shared/Lock/LockComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Access.Components; using Content.Shared.DoAfter; using Robust.Shared.Audio; using Robust.Shared.GameStates; @@ -33,6 +34,12 @@ public sealed partial class LockComponent : Component [DataField, AutoNetworkedField] public bool UnlockOnClick = true; + /// <summary> + /// Whether the lock requires access validation through <see cref="AccessReaderComponent"/> + /// </summary> + [DataField, AutoNetworkedField] + public bool UseAccess = true; + /// <summary> /// The sound played when unlocked. /// </summary> diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 0b24bc6722..cbeceaf9e8 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -118,7 +118,7 @@ public sealed class LockSystem : EntitySystem if (!CanToggleLock(uid, user, quiet: false)) return false; - if (!HasUserAccess(uid, user, quiet: false)) + if (lockComp.UseAccess && !HasUserAccess(uid, user, quiet: false)) return false; if (!skipDoAfter && lockComp.LockTime != TimeSpan.Zero) @@ -145,6 +145,9 @@ public sealed class LockSystem : EntitySystem if (!Resolve(uid, ref lockComp)) return; + if (lockComp.Locked) + return; + if (user is { Valid: true }) { _sharedPopupSystem.PopupClient(Loc.GetString("lock-comp-do-lock-success", @@ -175,6 +178,9 @@ public sealed class LockSystem : EntitySystem if (!Resolve(uid, ref lockComp)) return; + if (!lockComp.Locked) + return; + if (user is { Valid: true }) { _sharedPopupSystem.PopupClient(Loc.GetString("lock-comp-do-unlock-success", @@ -211,7 +217,7 @@ public sealed class LockSystem : EntitySystem if (!CanToggleLock(uid, user, quiet: false)) return false; - if (!HasUserAccess(uid, user, quiet: false)) + if (lockComp.UseAccess && !HasUserAccess(uid, user, quiet: false)) return false; if (!skipDoAfter && lockComp.UnlockTime != TimeSpan.Zero) diff --git a/Content.Shared/Security/Components/GenpopIdCardComponent.cs b/Content.Shared/Security/Components/GenpopIdCardComponent.cs new file mode 100644 index 0000000000..bf10bbab90 --- /dev/null +++ b/Content.Shared/Security/Components/GenpopIdCardComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Security.Components; + +/// <summary> +/// This is used for storing information about a Genpop ID in order to correctly display it on examine. +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +public sealed partial class GenpopIdCardComponent : Component +{ + /// <summary> + /// The crime committed, as a string. + /// </summary> + [DataField, AutoNetworkedField] + public string Crime = string.Empty; + + /// <summary> + /// The length of the sentence + /// </summary> + [DataField, AutoNetworkedField, AutoPausedField] + public TimeSpan SentenceDuration; +} diff --git a/Content.Shared/Security/Components/GenpopLockerComponent.cs b/Content.Shared/Security/Components/GenpopLockerComponent.cs new file mode 100644 index 0000000000..cfeb581814 --- /dev/null +++ b/Content.Shared/Security/Components/GenpopLockerComponent.cs @@ -0,0 +1,47 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Security.Components; + +/// <summary> +/// This is used for a locker that automatically sets up and handles a <see cref="GenpopIdCardComponent"/> +/// </summary> +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class GenpopLockerComponent : Component +{ + public const int MaxCrimeLength = 48; + + /// <summary> + /// The <see cref="GenpopIdCardComponent"/> that this locker is currently associated with. + /// </summary> + [DataField, AutoNetworkedField] + public EntityUid? LinkedId; + + /// <summary> + /// The Prototype spawned. + /// </summary> + [DataField] + public EntProtoId<GenpopIdCardComponent> IdCardProto = "PrisonerIDCard"; +} + +[Serializable, NetSerializable] +public sealed class GenpopLockerIdConfiguredMessage : BoundUserInterfaceMessage +{ + public string Name; + public float Sentence; + public string Crime; + + public GenpopLockerIdConfiguredMessage(string name, float sentence, string crime) + { + Name = name; + Sentence = sentence; + Crime = crime; + } +} + +[Serializable, NetSerializable] +public enum GenpopLockerUiKey : byte +{ + Key +} diff --git a/Content.Shared/Security/Systems/SharedGenpopSystem.cs b/Content.Shared/Security/Systems/SharedGenpopSystem.cs new file mode 100644 index 0000000000..39fc87f665 --- /dev/null +++ b/Content.Shared/Security/Systems/SharedGenpopSystem.cs @@ -0,0 +1,240 @@ +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; +using Content.Shared.Database; +using Content.Shared.Examine; +using Content.Shared.Lock; +using Content.Shared.Popups; +using Content.Shared.Security.Components; +using Content.Shared.Storage.Components; +using Content.Shared.Storage.EntitySystems; +using Content.Shared.Verbs; +using Robust.Shared.Timing; + +namespace Content.Shared.Security.Systems; + +public abstract class SharedGenpopSystem : EntitySystem +{ + [Dependency] protected readonly IGameTiming Timing = default!; + [Dependency] private readonly AccessReaderSystem _accessReader = default!; + [Dependency] private readonly SharedEntityStorageSystem _entityStorage = default!; + [Dependency] protected readonly SharedIdCardSystem IdCard = default!; + [Dependency] private readonly LockSystem _lock = default!; + [Dependency] protected readonly MetaDataSystem MetaDataSystem = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedUserInterfaceSystem _userInterface = default!; + + + /// <inheritdoc/> + public override void Initialize() + { + SubscribeLocalEvent<GenpopLockerComponent, GenpopLockerIdConfiguredMessage>(OnIdConfigured); + SubscribeLocalEvent<GenpopLockerComponent, StorageCloseAttemptEvent>(OnCloseAttempt); + SubscribeLocalEvent<GenpopLockerComponent, LockToggleAttemptEvent>(OnLockToggleAttempt); + SubscribeLocalEvent<GenpopLockerComponent, LockToggledEvent>(OnLockToggled); + SubscribeLocalEvent<GenpopLockerComponent, GetVerbsEvent<Verb>>(OnGetVerbs); + SubscribeLocalEvent<GenpopIdCardComponent, ExaminedEvent>(OnExamine); + } + + private void OnIdConfigured(Entity<GenpopLockerComponent> ent, ref GenpopLockerIdConfiguredMessage args) + { + // validation. + if (string.IsNullOrWhiteSpace(args.Name) || args.Name.Length > IdCardConsoleComponent.MaxFullNameLength || + args.Sentence < 0 || + string.IsNullOrWhiteSpace(args.Crime) || args.Crime.Length > GenpopLockerComponent.MaxCrimeLength) + { + return; + } + + if (!_accessReader.IsAllowed(args.Actor, ent)) + return; + + // We don't spawn the actual ID now because then the locker would eat it. + // Instead, we just fill in the spot temporarily til the checks pass. + ent.Comp.LinkedId = EntityUid.Invalid; + + _lock.Lock(ent.Owner, null); + _entityStorage.CloseStorage(ent); + + CreateId(ent, args.Name, args.Sentence, args.Crime); + } + + private void OnCloseAttempt(Entity<GenpopLockerComponent> ent, ref StorageCloseAttemptEvent args) + { + if (args.Cancelled) + return; + + // We cancel no matter what. Our second option is just opening the closet. + if (ent.Comp.LinkedId == null) + { + args.Cancelled = true; + } + + if (args.User is not { } user) + return; + + if (!_accessReader.IsAllowed(user, ent)) + { + _popup.PopupClient(Loc.GetString("lock-comp-has-user-access-fail"), user); + return; + } + + // my heart yearns for this to be predicted but for some reason opening an entitystorage via + // verb does not predict it properly. + _userInterface.TryOpenUi(ent.Owner, GenpopLockerUiKey.Key, user); + } + + private void OnLockToggleAttempt(Entity<GenpopLockerComponent> ent, ref LockToggleAttemptEvent args) + { + if (args.Cancelled) + return; + + if (ent.Comp.LinkedId == null) + { + args.Cancelled = true; + return; + } + + // Make sure that we both have the linked ID on our person AND the ID has actually expired. + // That way, even if someone escapes early, they can't get ahold of their things. + if (!_accessReader.FindPotentialAccessItems(args.User).Contains(ent.Comp.LinkedId.Value)) + { + if (!args.Silent) + _popup.PopupClient(Loc.GetString("lock-comp-has-user-access-fail"), ent, args.User); + args.Cancelled = true; + return; + } + + if (!TryComp<ExpireIdCardComponent>(ent.Comp.LinkedId.Value, out var expireIdCard) || + !expireIdCard.Expired) + { + if (!args.Silent) + _popup.PopupClient(Loc.GetString("genpop-prisoner-id-popup-not-served"), ent, args.User); + args.Cancelled = true; + } + } + + private void OnLockToggled(Entity<GenpopLockerComponent> ent, ref LockToggledEvent args) + { + if (args.Locked) + return; + + // If we unlock the door, then we're gonna reset the ID. + CancelIdCard(ent); + } + + private void OnGetVerbs(Entity<GenpopLockerComponent> ent, ref GetVerbsEvent<Verb> args) + { + if (ent.Comp.LinkedId == null) + return; + + if (!args.CanAccess || !args.CanComplexInteract || !args.CanInteract) + return; + + if (!TryComp<ExpireIdCardComponent>(ent.Comp.LinkedId, out var expire) || + !TryComp<GenpopIdCardComponent>(ent.Comp.LinkedId, out var genpopId)) + return; + + var user = args.User; + var hasAccess = _accessReader.IsAllowed(args.User, ent); + args.Verbs.Add(new Verb // End sentence early. + { + Act = () => + { + IdCard.ExpireId((ent.Comp.LinkedId.Value, expire)); + }, + Priority = 13, + Text = Loc.GetString("genpop-locker-action-end-early"), + Impact = LogImpact.Medium, + DoContactInteraction = true, + Disabled = !hasAccess, + }); + + args.Verbs.Add(new Verb // Cancel Sentence. + { + Act = () => + { + CancelIdCard(ent, user); + }, + Priority = 12, + Text = Loc.GetString("genpop-locker-action-clear-id"), + Impact = LogImpact.Medium, + DoContactInteraction = true, + Disabled = !hasAccess, + }); + + var servedTime = 1 - (expire.ExpireTime - Timing.CurTime).TotalSeconds / genpopId.SentenceDuration.TotalSeconds; + + // Can't reset it after its expired. + if (expire.Expired) + return; + + args.Verbs.Add(new Verb // Reset Sentence. + { + Act = () => + { + IdCard.SetExpireTime((ent.Comp.LinkedId.Value, expire), Timing.CurTime + genpopId.SentenceDuration); + }, + Priority = 11, + Text = Loc.GetString("genpop-locker-action-reset-sentence", ("percent", Math.Clamp(servedTime, 0, 1) * 100)), + Impact = LogImpact.Medium, + DoContactInteraction = true, + Disabled = !hasAccess, + }); + } + + private void CancelIdCard(Entity<GenpopLockerComponent> ent, EntityUid? user = null) + { + if (ent.Comp.LinkedId == null) + return; + + var metaData = MetaData(ent); + MetaDataSystem.SetEntityName(ent, Loc.GetString("genpop-locker-name-default"), metaData); + MetaDataSystem.SetEntityDescription(ent, Loc.GetString("genpop-locker-desc-default"), metaData); + + ent.Comp.LinkedId = null; + _lock.Unlock(ent.Owner, user); + _entityStorage.OpenStorage(ent.Owner); + + if (TryComp<ExpireIdCardComponent>(ent.Comp.LinkedId, out var expire)) + IdCard.ExpireId((ent.Comp.LinkedId.Value, expire)); + + Dirty(ent); + } + + private void OnExamine(Entity<GenpopIdCardComponent> ent, ref ExaminedEvent args) + { + // This component holds the contextual data for the sentence end time and other such things. + if (!TryComp<ExpireIdCardComponent>(ent, out var expireIdCard)) + return; + + if (expireIdCard.Permanent) + { + args.PushText(Loc.GetString("genpop-prisoner-id-examine-wait-perm", + ("crime", ent.Comp.Crime))); + } + else + { + if (expireIdCard.Expired) + { + args.PushText(Loc.GetString("genpop-prisoner-id-examine-served", + ("crime", ent.Comp.Crime))); + } + else + { + var sentence = ent.Comp.SentenceDuration; + var served = ent.Comp.SentenceDuration - (expireIdCard.ExpireTime - Timing.CurTime); + + args.PushText(Loc.GetString("genpop-prisoner-id-examine-wait", + ("minutes", served.Minutes), + ("seconds", served.Seconds), + ("sentence", sentence.TotalMinutes), + ("crime", ent.Comp.Crime))); + } + } + } + + protected virtual void CreateId(Entity<GenpopLockerComponent> ent, string name, float sentence, string crime) + { + + } +} diff --git a/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs b/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs index 4100449f4e..06b1c15f2e 100644 --- a/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs +++ b/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs @@ -159,7 +159,7 @@ public readonly record struct StorageBeforeOpenEvent; public readonly record struct StorageAfterOpenEvent; [ByRefEvent] -public record struct StorageCloseAttemptEvent(bool Cancelled = false); +public record struct StorageCloseAttemptEvent(EntityUid? User, bool Cancelled = false); [ByRefEvent] public readonly record struct StorageBeforeCloseEvent(HashSet<EntityUid> Contents, HashSet<EntityUid> BypassChecks); diff --git a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs index abd08c7459..75088bfeec 100644 --- a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs @@ -181,7 +181,7 @@ public abstract class SharedEntityStorageSystem : EntitySystem if (component.Open) { - TryCloseStorage(target); + TryCloseStorage(target, user); } else { @@ -360,9 +360,9 @@ public abstract class SharedEntityStorageSystem : EntitySystem return true; } - public bool TryCloseStorage(EntityUid target) + public bool TryCloseStorage(EntityUid target, EntityUid? user = null) { - if (!CanClose(target)) + if (!CanClose(target, user)) { return false; } @@ -413,9 +413,9 @@ public abstract class SharedEntityStorageSystem : EntitySystem return !ev.Cancelled; } - public bool CanClose(EntityUid target, bool silent = false) + public bool CanClose(EntityUid target, EntityUid? user = null, bool silent = false) { - var ev = new StorageCloseAttemptEvent(); + var ev = new StorageCloseAttemptEvent(user); RaiseLocalEvent(target, ref ev, silent); return !ev.Cancelled; diff --git a/Resources/Locale/en-US/access/components/genpop.ftl b/Resources/Locale/en-US/access/components/genpop.ftl new file mode 100644 index 0000000000..8964467688 --- /dev/null +++ b/Resources/Locale/en-US/access/components/genpop.ftl @@ -0,0 +1,28 @@ +genpop-prisoner-id-expire = You have served your sentence! You may now exit prison through the turnstiles and collect your belongings. +genpop-prisoner-id-popup-not-served = Sentence not yet served! + +genpop-prisoner-id-crime-default = [Redacted] +genpop-prisoner-id-examine-wait = You have served {$minutes} {$minutes -> + [1] minute + *[other] minutes +} {$seconds} {$seconds -> + [1] second + *[other] seconds +} of your {$sentence} minute sentence for {$crime}. +genpop-prisoner-id-examine-wait-perm = You are serving a permanent sentence for {$crime}. +genpop-prisoner-id-examine-served = You have served your sentence for {$crime}. + +genpop-locker-name-default = prisoner closet +genpop-locker-desc-default = It's a secure locker for an inmate's personal belongings during their time in prison. + +genpop-locker-name-used = prisoner closet ({$name}) +genpop-locker-desc-used = It's a secure locker for an inmate's personal belongings during their time in prison. It contains the personal effects of {$name}. + +genpop-locker-ui-label-name = [bold]Convict Name:[/bold] +genpop-locker-ui-label-sentence = [bold]Sentence length in minutes:[/bold] [color=gray](0 for perma)[/color] +genpop-locker-ui-label-crime = [bold]Crime:[/bold] +genpop-locket-ui-button-done = Done + +genpop-locker-action-end-early = End Sentence Early +genpop-locker-action-clear-id = Clear ID +genpop-locker-action-reset-sentence = Reset Sentence ({NATURALFIXED($percent, 0)}% served) diff --git a/Resources/Locale/en-US/prototypes/access/accesses.ftl b/Resources/Locale/en-US/prototypes/access/accesses.ftl index 44fd9adf00..4a9fa272a2 100644 --- a/Resources/Locale/en-US/prototypes/access/accesses.ftl +++ b/Resources/Locale/en-US/prototypes/access/accesses.ftl @@ -9,6 +9,8 @@ id-card-access-level-security = Security id-card-access-level-armory = Armory id-card-access-level-brig = Brig id-card-access-level-detective = Detective +id-card-access-level-genpop-enter = Enter Genpop +id-card-access-level-genpop-leave = Leave Genpop id-card-access-level-chief-engineer = Chief Engineer id-card-access-level-engineering = Engineering @@ -50,4 +52,4 @@ id-card-access-level-station-ai = Artifical Intelligence id-card-access-level-borg = Cyborg id-card-access-level-basic-silicon = Robot -id-card-access-level-basic-xenoborg = Xenoborg \ No newline at end of file +id-card-access-level-basic-xenoborg = Xenoborg diff --git a/Resources/Prototypes/Access/misc.yml b/Resources/Prototypes/Access/misc.yml index f79f1779c2..d3f6df775b 100644 --- a/Resources/Prototypes/Access/misc.yml +++ b/Resources/Prototypes/Access/misc.yml @@ -32,3 +32,5 @@ - Chapel - Hydroponics - Atmospherics + - GenpopEnter + - GenpopLeave diff --git a/Resources/Prototypes/Access/security.yml b/Resources/Prototypes/Access/security.yml index cfe94dd78a..45d8af61ed 100644 --- a/Resources/Prototypes/Access/security.yml +++ b/Resources/Prototypes/Access/security.yml @@ -18,6 +18,14 @@ id: Detective name: id-card-access-level-detective +- type: accessLevel + id: GenpopEnter + name: id-card-access-level-genpop-enter + +- type: accessLevel + id: GenpopLeave + name: id-card-access-level-genpop-leave + - type: accessGroup id: Security tags: diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index 736642abb5..72332010e6 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -722,6 +722,40 @@ - type: PresetIdCard job: Detective +- type: entity + parent: IDCardStandard + id: PrisonerIDCard + name: prisoner ID card + description: A generically printed ID card for scummy prisoners. + components: + - type: Sprite + layers: + - state: orange + - type: Item + heldPrefix: orange + - type: Access + tags: + - GenpopEnter + - type: GenpopIdCard + - type: IdCard + jobTitle: job-name-prisoner + jobIcon: JobIconPrisoner + canMicrowave: false + - type: ExpireIdCard + expireMessage: genpop-prisoner-id-expire + expiredAccess: + - GenpopLeave + - type: Speech + speechVerb: Robotic + - type: Tag + tags: + - DoorBumpOpener + - WhitelistChameleon + - WhitelistChameleonIdCard + - Recyclable + - type: StaticPrice # these are infinitely producible. + price: 0 + - type: entity parent: CentcomIDCard id: CBURNIDcard diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 4f6762cf5f..188cbfc51b 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -126,6 +126,8 @@ - SyndicateAgent - Wizard - Xenoborg + - GenpopEnter + - GenpopLeave privilegedIdSlot: name: id-card-console-privileged-id ejectSound: /Audio/Machines/id_swipe.ogg diff --git a/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml index 6d675c5928..0827492d11 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml @@ -75,3 +75,21 @@ - type: Tag tags: - HideContextMenu + +# Genpop + +- type: entity + id: TurnstileGenpopEnter + parent: Turnstile + suffix: Genpop Enter + components: + - type: AccessReader + access: [["GenpopEnter"]] + +- type: entity + id: TurnstileGenpopLeave + parent: Turnstile + suffix: Genpop Leave + components: + - type: AccessReader + access: [["GenpopLeave"]] diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml index 97ef052153..df62854818 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -381,6 +381,111 @@ - type: AccessReader access: [["Armory"]] +# Genpop Storage +- type: entity + id: LockerPrisoner + parent: LockerBaseSecure + name: prisoner closet + description: It's a secure locker for an inmate's personal belongings during their time in prison. + suffix: 1 + components: + - type: GenpopLocker + - type: EntityStorageVisuals + stateBaseClosed: genpop + stateDoorOpen: genpop_open + stateDoorClosed: genpop_door_1 + - type: UserInterface + interfaces: + enum.GenpopLockerUiKey.Key: + type: GenpopLockerBoundUserInterface + - type: AccessReader # note! this access is for the UI, not the door. door access is handled on GenpopLocker + access: [["Security"]] + - type: Lock + locked: false + useAccess: false + - type: Fixtures + fixtures: + fix1: + shape: !type:PolygonShape + radius: 0.01 + vertices: + - -0.25,-0.48 + - 0.25,-0.48 + - 0.25,0.48 + - -0.25,0.48 + mask: + - Impassable + - TableLayer + - LowImpassable + layer: + - BulletImpassable + - Opaque + density: 75 + hard: True + restitution: 0 + friction: 0.4 + - type: EntityStorage + open: True + removedMasks: 20 + - type: PlaceableSurface + isPlaceable: True + +- type: entity + id: LockerPrisoner2 + parent: LockerPrisoner + suffix: 2 + components: + - type: EntityStorageVisuals + stateDoorClosed: genpop_door_2 + +- type: entity + id: LockerPrisoner3 + parent: LockerPrisoner + suffix: 3 + components: + - type: EntityStorageVisuals + stateDoorClosed: genpop_door_3 + +- type: entity + id: LockerPrisoner4 + parent: LockerPrisoner + suffix: 4 + components: + - type: EntityStorageVisuals + stateDoorClosed: genpop_door_4 + +- type: entity + id: LockerPrisoner5 + parent: LockerPrisoner + suffix: 5 + components: + - type: EntityStorageVisuals + stateDoorClosed: genpop_door_5 + +- type: entity + id: LockerPrisoner6 + parent: LockerPrisoner + suffix: 6 + components: + - type: EntityStorageVisuals + stateDoorClosed: genpop_door_6 + +- type: entity + id: LockerPrisoner7 + parent: LockerPrisoner + suffix: 7 + components: + - type: EntityStorageVisuals + stateDoorClosed: genpop_door_7 + +- type: entity + id: LockerPrisoner8 + parent: LockerPrisoner + suffix: 8 + components: + - type: EntityStorageVisuals + stateDoorClosed: genpop_door_8 + # Detective - type: entity id: LockerDetective diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml index 90a6820dae..b7595baac9 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/signs.yml @@ -693,6 +693,15 @@ - type: Sprite state: nosmoking +- type: entity + parent: BaseSign + id: SignGenpop + name: genpop sign + description: A sign indicating the genpop prison. + components: + - type: Sprite + state: genpop + - type: entity parent: BaseSign id: SignPrison diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop.png new file mode 100644 index 0000000000000000000000000000000000000000..11e878a6fea5a373699d7f46be6a78df45baa697 GIT binary patch literal 315 zcmV-B0mS}^P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px#^+`lQR9J=WmN5#0Fc^hjwN4$xL=eG2hweQ<FVi#hK)p;a&`yGDKr9+37e(yQ z1N5b6gW#KAUOxW+5dv7&jy0ZxU@{55w=I>uXD`2I8RB7}E-yU~044^)p%NF=20(QH z0A78MQy5a-M_tnZR8ucWG8J7%hXTOyaKKHeuldvjimpQ)MMeOqD#}K$004v#luv6- zXId}e2CxB80MBtW4rb3#09l$E1F&a|-T}v%e`D+Dz>+drf%p08%&K)wz;)f(0oFAE zrIcNOIF2b_S(eKH_`W|ofb|Yo2QXSep67M|gp|-tV-zf;{0ZpqdINzcH(f`@*Vq66 N002ovPDHLkV1ks$d6obG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_1.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_1.png new file mode 100644 index 0000000000000000000000000000000000000000..35c32606bdc9628f453622963970765b0ac3d879 GIT binary patch literal 379 zcmV->0fhdEP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$HAzH4R9J=Wls`+uKp4g!MKX3Nw9)BYRIa5sW<0?`KZcVZ$jNUI!QBpmx4PFC zb@3)qp>Shp3vrN$DKWfvJ$3MY%R|VMyC3%_KqM0R@2qi)=fh#yOA=Q1Z8pQ{WWpMI zgDcQW5^T=rI9V(}M37Q~h;Ta^VRw850C+e${wOm=0bre5-0yS%07O*F+QduUpaK<A z%37|9vp{Hq2vldFN*CC-;7O_Sbvk8r``s?KwPuaY7Pz~)F1L2}Sl#ExdkhW^!(PL) zi%S$m(fCdX!5zk50N+dw0LB<^0rnw$v9?tp&+}Ra7x*cH31nI3^&S5VwD5Jw(=>J3 z0&f8!1dK5dLO?0?`3wNoTDFAu7HF*-(-m(4rBq}7nm}BEKVO0B|G%8BI9)^A@;i?B Z@(whCc4@qZz8wGn002ovPDHLkV1h&0ps@e| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_2.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a890790031f9a0ce9a2cc05c0482a5cdfe37dd GIT binary patch literal 391 zcmV;20eJq2P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$K}keGR9J=Wls`)YF&Kw`irm<xP*110*b+-|yfK19`!SsSKu&&x6S}v9U{?1U ztc#gMg+j)oEu4d-dU76bLe#-L%gd49B@b`@0Fg-Kzq3URUiSNCCrL=z*X0uDvl(gb z9jZVlNwBwC;cUHzQVN`ND5Y>a7@#|y008F0(R-LE3IN;G;Bl)308mO*s$F<K9Bo8w zHmHDwb6%;I?sW3e0SBA~>hN7Wn1GeATi^ou7CZ`3zAP4`>~6b_11U*!lLhW>uFL(y z9x40uaF3&t)3Dd@;%bbdC~C(TW7KK<1@O({0HC$@79bzOXJZ-#@;tB9-~vBIFo7(~ zy#Aw~fd)ReJWW%lE$|j#j6rJ+#u$VUn{NOx#*ihvw?Il+TV3%M5JJ?}UlWKO`120f l_y22k#pxQFhUYlq%Nx+;e`(yG@FD;J002ovPDHLkV1jd0tWW>| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_3.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c82fdb08ea21a55233f03fbe34305568c6a10e GIT binary patch literal 393 zcmV;40e1e0P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$LrFwIR9J=Wlrc*KF&KtlMQ-d;sHan0ti)0rZ;as3{tPF7kdy!51ow6*^j7y8 ztc#gMg+j)oEu4d-?dkRS5~2>~Sw4<?FM0TKUw}X$@ZZ^?25&l@q7_A??E8F<tI344 z_8wKB6-78$EO5D8LP`nFIi!@h?{?814gdhtUjH*p6a|1?YVfSl002lSOVw;V?e$k8 zChJwez&S5fLwh(_cfbN`fo*Jdzy|U^P{+4_zyk6VJPT30&1R(RezS?AEF-N=7I+ws zio@d*QugKP5vS)De#h|o_6~WTSH5G6QI~NSz?RJcKq=)cK%RnEt!o9+G%Z!{0zZW} zfh0+szVmVqY_>d(W2+-@7GR7)DFwzDgb=G|0MJ^KC7h2S%d*O9i?e_bqO$&)K<L1q ncfj2LU#l%vW2kGc<A5t4M(BS(Vbe;v00000NkvXXu0mjf%O|Sh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_4.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ad11caa8f9eacf412cb17b76bdfcba360fd7bb18 GIT binary patch literal 378 zcmV-=0fqjFP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$G)Y83R9J=Wl)p;DP!xxMie&6ksHxL&QHdQKGakXA-Fyq*!Pju|4I(({po8Fj zfo?Te7w;r06z<m03~@>^62rOIXb11N{0KQY`8f9v;PH6=J8ROy^TD9#1%asceX+pF zWFqRlE*0nn0s484)A=07<MA^4c@Dn5s-#rZO5mW=0RW_FTFIu`Rs~9;D5_-1?(L0j zD>s2Uro$1Y!_n#leuDTEJTn(>vze%Nv)jeCQlj2sfrtCMVryqlRQvMui2cJOQSS|@ zz}dwmvMj58M?}&#?gIGc=K!F!b`}tC!dGJ&1(GDGWa|RIMQZ|a96Nm{-vbSN9(fps zR!iV4Kt#}5gNVS)%Vz*E#)u`Hmq001o3=O$FmrAGnSh_b$|q3X|6kJ<t7B*yu49iY YA7L?kYzDWNY5)KL07*qoM6N<$g5Bk+2><{9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_5.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_5.png new file mode 100644 index 0000000000000000000000000000000000000000..429d432cd91fb9e3134796093079f710a4deecf6 GIT binary patch literal 391 zcmV;20eJq2P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$K}keGR9J=Wlrc-gKp2K!MKX3N)aZ0BR?bo!GoIkk{tPF7kdyx)f_pm%-s)Zt z>*7sfg}{xWEyTryp2YCok?P<*%SXtYyC>iA9S{fv{yRI=;LTuA^rDEA{a7w>HJg#v z-lGciq6i186)x9nD5bzThf)fU!y)?9NtK(A#sE>&N#Ly0!6M6`lmdXNS{rX<sqB)I zUvSQ?TGF3RtWIoAppN-yY<0i|@)0yq{<)6?c?w>IC>B{p%I<f&IFgdIHd)~5;l4OL zJ|Sh_UY>D!e$nn2Uf<p!&-2=Mj4|pm{sQ=6a{$m<dkc`K;N6%;fiz96+Pc8DXiXqV z60h%Cxd%2|9>=lM5qJwQ#-OzZV+=xw>KOoxF=PqvBal+oR#&_Qgb=m$*91Zb{=5U_ l{r|nX;xvY);W`fZ@(DC9e*_-ijBNk_002ovPDHLkV1l~Wup<Bf literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_6.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_6.png new file mode 100644 index 0000000000000000000000000000000000000000..35c49375d9a6ae63f72bd14abcb160792e070d75 GIT binary patch literal 390 zcmV;10eSw3P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$KuJVFR9J=Wlrc*KF%-xDirm<xP*110sHCMh-Wb85{TNPuAg6wV6WnzWnzefy ztc#h%3I`dFws0<9xhvP>C7gCJzvXe{UGn3-yZ|1L=f876O&s-lStkfcxnIjA?xs`H z-bYk{P7vT^wZiRs4W$$~=TJ&v((eNRE}owN0Q12RAc|TET(w$QBngyK0I-Sq;q$?; zluPB1ocROiycCNPc@=E17T86x0(%kIZUYta6ub+OEs}(kd)#j0OiI$;WP#cEB|AO8 zB;|g*y`p=4)9e`DKRhB$)5<l*7<C(W0qi&&0JPT50_02hX-us^9LJ^DxWI4Gm_QUo zPXE#GKn=x`hhb>d0%rln7_`=4j6n#o`33-E3|Ydt1yah&Xp6Ie5TY{vnSigr-Yby5 k|J%_Pt1&b+&#}jqZ(I3)E^ny`0{{R307*qoM6N<$f^V6tTL1t6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_7.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_7.png new file mode 100644 index 0000000000000000000000000000000000000000..cd0c499f086230ae2be82de075a80bc9046d7780 GIT binary patch literal 380 zcmV-?0fYXDP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$Hc3Q5R9J=Wls`+uKp2OAie&6ksL|<lv2vE;nDGRM_G38tft>mcBDlAM;H~cU zurA&tDim%EZ6Qu6Mq_w$T<zdJ%S*Ul?jGLz0|Wwr|IQ9KIO_HCP86}SABzR9rc>73 zdt8A|6yadG#N}!Qtu=%Y&|2f6-$!>cUgu_mA;1&`fL(6ztknVlXst`NSadcR{>XY2 zC=f!FYC(50E=g=mz&BeLVBdllDf9RFoR!^gw{fHtYi_o{<NaNJcznXjzCJ(U^!&o_ zHN3vLMV4iiV?@NA#$5ovEDiw17-s?YA$+s8Rv=B&QuQvdDZB|JN#gV${|wadwdHXf zH`)Sc0V0Ai21EoY<@y@{thH<j=Pgi5Ro13B3rHy|>z@gP4s5*x#ryxgHl@)uv^CFh az?Dzky?3Y3-6MAZ0000<MNUMnLSTa3m8WO` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_8.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_door_8.png new file mode 100644 index 0000000000000000000000000000000000000000..093cbc75aa6adb44462dcff5c3fad67d90c69c43 GIT binary patch literal 385 zcmV-{0e=38P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$J4r-AR9J=Wls`)YF&Kw`mU3g4LVG&JrIlEU<Bbs<^kX>rft>mcPH=Ar!K~fe zpe|+-6$%-Tws1}<O*xPE!nF?OSzeC(F7HGB0f9i^zjH(ljs}Cg6Gf!#_i~B5*^D%I zlPb`OA{?()xLvQIlmh1*N-0c-L-Z%(P44yj1|W(8K!X~*Xte+UN-3v0jd!xO3RpPj zPPNVZld&VQH-RE-^X;uTsDPF5fqV<zg~-1a3sSb*ZsSx+(%fW$`SVkL(mNw%Ki*z& zetA{zHN1a#M3!ZRV~jECH2wnkr8xj-t-S@vhw#&wQh_v0om#uVzNk$gNfNLB=x3mW z?In-nxY8DQ3oyo@wFYAhLWs>b02pJ)65d-Nr7Wyf@fHw56xM?YgcbPn6|nFBZmmkC fYiLTI<A5(e$I5-vTIREZ00000NkvXXu0mjfn--|^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/genpop_open.png b/Resources/Textures/Structures/Storage/closet.rsi/genpop_open.png new file mode 100644 index 0000000000000000000000000000000000000000..c6971a35d1de97de239ee01bb1f45f8f0a18f79f GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}FFjoxLn2y} z6C_v{Cy4MEBpgx8P}cY%KePVH-|985Rxn0f&`nNANO&=EqT|EpJ@x+Dza=9!L{@yX zKjizX$K<okA;uTeE(sg(cC1~@=TLs2I4o=q*N2mV%o`GfL)Ncu-0bS=Dj^{goAI1s zc1Ho*)(rw|2e0QpXu2G}wsEuSlBJnxmdrqKy6rE!#J<fNjrUainzBsnAyc!m;5@rp zspU*j?PnfvG%}VqteGO>$7=uo&%(XT8M&N}>^v$Gr3W6AALy62&v?bKW~*Y+x(5#) zEa+#Rpu4y5F`KXM(E<iD?)*DD9B)4}5Mf}5nQIksY_Ccc(9;Z_u6{1-oD!M<Gcb23 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/meta.json b/Resources/Textures/Structures/Storage/closet.rsi/meta.json index 5600268fde..6dbdb4dba3 100644 --- a/Resources/Textures/Structures/Storage/closet.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/closet.rsi/meta.json @@ -1,566 +1,596 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), n2 sprites based on fire and emergency sprites", - "license": "CC-BY-SA-3.0", - "states": [ - { - "name": "abductor" - }, - { - "name": "abductor_door" - }, - { - "name": "abductor_open" - }, - { - "name": "agentbox" - }, - { - "name": "alien" - }, - { - "name": "alien_door" - }, - { - "name": "alien_open" - }, - { - "name": "brigmedic_door" - }, - { - "name": "brigmedic" - }, - { - "name": "armory" - }, - { - "name": "armory_door" - }, - { - "name": "armory_open" - }, - { - "name": "atmos" - }, - { - "name": "atmos_door" - }, - { - "name": "atmos_open" - }, - { - "name": "atmos_wardrobe_door" - }, - { - "name": "bio" - }, - { - "name": "bio_door" - }, - { - "name": "bio_jan" - }, - { - "name": "bio_jan_door" - }, - { - "name": "bio_jan_open" - }, - { - "name": "bio_open" - }, - { - "name": "bio_sec" - }, - { - "name": "bio_sec_door" - }, - { - "name": "bio_sec_open" - }, - { - "name": "bio_viro" - }, - { - "name": "bio_viro_door" - }, - { - "name": "bio_viro_open" - }, - { - "name": "black_door" - }, - { - "name": "blue_door" - }, - { - "name": "bomb" - }, - { - "name": "bomb_door" - }, - { - "name": "bomb_open" - }, - { - "name": "janitor_bomb" - }, - { - "name": "janitor_bomb_door" - }, - { - "name": "janitor_bomb_open" - }, - { - "name": "cabinet" - }, - { - "name": "cabinet_door" - }, - { - "name": "cabinet_open" - }, - { - "name": "cap" - }, - { - "name": "cap_door" - }, - { - "name": "cap_open" - }, - { - "name": "cardboard" - }, - { - "name": "cardboard_open" - }, - { - "name": "cardboard_special" - }, - { - "name": "cargo" - }, - { - "name": "cargo_door" - }, - { - "name": "cargo_open" - }, - { - "name": "ce" - }, - { - "name": "ce_door" - }, - { - "name": "ce_open" - }, - { - "name": "chemical_door" - }, - { - "name": "cmo" - }, - { - "name": "cmo_door" - }, - { - "name": "cmo_open" - }, - { - "name": "cursed", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "cursed_door", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "cursed_open" - }, - { - "name": "cursed_whole", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "decursed", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "decursed_door", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "decursed_open" - }, - { - "name": "ecase" - }, - { - "name": "ecase_door" - }, - { - "name": "ecase_open" - }, - { - "name": "egun" - }, - { - "name": "emergency" - }, - { - "name": "emergency_door" - }, - { - "name": "emergency_open" - }, - { - "name": "eng" - }, - { - "name": "eng_elec_door" - }, - { - "name": "eng_open" - }, - { - "name": "eng_rad_door" - }, - { - "name": "eng_secure" - }, - { - "name": "eng_secure_door" - }, - { - "name": "eng_secure_open" - }, - { - "name": "eng_tool_door" - }, - { - "name": "eng_weld_door" - }, - { - "name": "fire" - }, - { - "name": "fire_door" - }, - { - "name": "fire_open" - }, - { - "name": "freezer" - }, - { - "name": "freezer_icon" - }, - { - "name": "freezer_door" - }, - { - "name": "freezer_open" - }, - { - "name": "generic" - }, - { - "name": "generic_door" - }, - { - "name": "generic_open" - }, - { - "name": "generic_icon" - }, - { - "name": "green_door" - }, - { - "name": "grey_door" - }, - { - "name": "hop" - }, - { - "name": "hop_door" - }, - { - "name": "hop_open" - }, - { - "name": "hos" - }, - { - "name": "hos_door" - }, - { - "name": "hos_open" - }, - { - "name": "hydro" - }, - { - "name": "hydro_door" - }, - { - "name": "hydro_open" - }, - { - "name": "locked" - }, - { - "name": "med" - }, - { - "name": "med_door" - }, - { - "name": "med_open" - }, - { - "name": "med_secure" - }, - { - "name": "med_secure_door" - }, - { - "name": "med_secure_open" - }, - { - "name": "metalbox" - }, - { - "name": "metalbox_open" - }, - { - "name": "mining" - }, - { - "name": "mining_door" - }, - { - "name": "mining_open" - }, - { - "name": "mixed_door" - }, - { - "name": "n2" - }, - { - "name": "n2_open" - }, - { - "name": "n2_door" - }, - { - "name": "oldcloset" - }, - { - "name": "orange_door" - }, - { - "name": "paramed" - }, - { - "name": "paramed_door" - }, - { - "name": "paramed_open" - }, - { - "name": "pink_door" - }, - { - "name": "qm" - }, - { - "name": "qm_door" - }, - { - "name": "qm_open" - }, - { - "name": "rd" - }, - { - "name": "rd_door" - }, - { - "name": "rd_open" - }, - { - "name": "red_door" - }, - { - "name": "science" - }, - { - "name": "science_door" - }, - { - "name": "science_open" - }, - { - "name": "sec" - }, - { - "name": "sec_door" - }, - { - "name": "sec_open" - }, - { - "name": "secure" - }, - { - "name": "secure_door" - }, - { - "name": "secure_icon" - }, - { - "name": "secure_open" - }, - { - "name": "shotgun" - }, - { - "name": "shotguncase" - }, - { - "name": "shotguncase_door" - }, - { - "name": "shotguncase_open" - }, - { - "name": "sparking", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "syndicate" - }, - { - "name": "syndicate_door" - }, - { - "name": "syndicate_open" - }, - { - "name": "tac" - }, - { - "name": "tac_door" - }, - { - "name": "tac_open" - }, - { - "name": "unlocked" - }, - { - "name": "warden" - }, - { - "name": "warden_door" - }, - { - "name": "warden_open" - }, - { - "name": "welded" - }, - { - "name": "white_door" - }, - { - "name": "yellow_door" - }, - { - "name": "clown" - }, - { - "name": "clown_door" - }, - { - "name": "clown_open" - }, - { - "name": "mime" - }, - { - "name": "mime_door" - }, - { - "name": "mime_open" - }, - { - "name": "representative_door" - } - ] + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), n2 sprites based on fire and emergency sprites, genpop lockers by EmoGarbage404 (github)", + "license": "CC-BY-SA-3.0", + "states": [ + { + "name": "abductor" + }, + { + "name": "abductor_door" + }, + { + "name": "abductor_open" + }, + { + "name": "agentbox" + }, + { + "name": "alien" + }, + { + "name": "alien_door" + }, + { + "name": "alien_open" + }, + { + "name": "brigmedic_door" + }, + { + "name": "brigmedic" + }, + { + "name": "armory" + }, + { + "name": "armory_door" + }, + { + "name": "armory_open" + }, + { + "name": "atmos" + }, + { + "name": "atmos_door" + }, + { + "name": "atmos_open" + }, + { + "name": "atmos_wardrobe_door" + }, + { + "name": "bio" + }, + { + "name": "bio_door" + }, + { + "name": "bio_jan" + }, + { + "name": "bio_jan_door" + }, + { + "name": "bio_jan_open" + }, + { + "name": "bio_open" + }, + { + "name": "bio_sec" + }, + { + "name": "bio_sec_door" + }, + { + "name": "bio_sec_open" + }, + { + "name": "bio_viro" + }, + { + "name": "bio_viro_door" + }, + { + "name": "bio_viro_open" + }, + { + "name": "black_door" + }, + { + "name": "blue_door" + }, + { + "name": "bomb" + }, + { + "name": "bomb_door" + }, + { + "name": "bomb_open" + }, + { + "name": "janitor_bomb" + }, + { + "name": "janitor_bomb_door" + }, + { + "name": "janitor_bomb_open" + }, + { + "name": "cabinet" + }, + { + "name": "cabinet_door" + }, + { + "name": "cabinet_open" + }, + { + "name": "cap" + }, + { + "name": "cap_door" + }, + { + "name": "cap_open" + }, + { + "name": "cardboard" + }, + { + "name": "cardboard_open" + }, + { + "name": "cardboard_special" + }, + { + "name": "cargo" + }, + { + "name": "cargo_door" + }, + { + "name": "cargo_open" + }, + { + "name": "ce" + }, + { + "name": "ce_door" + }, + { + "name": "ce_open" + }, + { + "name": "chemical_door" + }, + { + "name": "cmo" + }, + { + "name": "cmo_door" + }, + { + "name": "cmo_open" + }, + { + "name": "cursed", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "cursed_door", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "cursed_open" + }, + { + "name": "cursed_whole", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "decursed", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "decursed_door", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "decursed_open" + }, + { + "name": "ecase" + }, + { + "name": "ecase_door" + }, + { + "name": "ecase_open" + }, + { + "name": "egun" + }, + { + "name": "emergency" + }, + { + "name": "emergency_door" + }, + { + "name": "emergency_open" + }, + { + "name": "eng" + }, + { + "name": "eng_elec_door" + }, + { + "name": "eng_open" + }, + { + "name": "eng_rad_door" + }, + { + "name": "eng_secure" + }, + { + "name": "eng_secure_door" + }, + { + "name": "eng_secure_open" + }, + { + "name": "eng_tool_door" + }, + { + "name": "eng_weld_door" + }, + { + "name": "fire" + }, + { + "name": "fire_door" + }, + { + "name": "fire_open" + }, + { + "name": "freezer" + }, + { + "name": "freezer_icon" + }, + { + "name": "freezer_door" + }, + { + "name": "freezer_open" + }, + { + "name": "generic" + }, + { + "name": "generic_door" + }, + { + "name": "generic_open" + }, + { + "name": "generic_icon" + }, + { + "name": "genpop" + }, + { + "name": "genpop_door_1" + }, + { + "name": "genpop_door_2" + }, + { + "name": "genpop_door_3" + }, + { + "name": "genpop_door_4" + }, + { + "name": "genpop_door_5" + }, + { + "name": "genpop_door_6" + }, + { + "name": "genpop_door_7" + }, + { + "name": "genpop_door_8" + }, + { + "name": "genpop_open" + }, + { + "name": "green_door" + }, + { + "name": "grey_door" + }, + { + "name": "hop" + }, + { + "name": "hop_door" + }, + { + "name": "hop_open" + }, + { + "name": "hos" + }, + { + "name": "hos_door" + }, + { + "name": "hos_open" + }, + { + "name": "hydro" + }, + { + "name": "hydro_door" + }, + { + "name": "hydro_open" + }, + { + "name": "locked" + }, + { + "name": "med" + }, + { + "name": "med_door" + }, + { + "name": "med_open" + }, + { + "name": "med_secure" + }, + { + "name": "med_secure_door" + }, + { + "name": "med_secure_open" + }, + { + "name": "metalbox" + }, + { + "name": "metalbox_open" + }, + { + "name": "mining" + }, + { + "name": "mining_door" + }, + { + "name": "mining_open" + }, + { + "name": "mixed_door" + }, + { + "name": "n2" + }, + { + "name": "n2_open" + }, + { + "name": "n2_door" + }, + { + "name": "oldcloset" + }, + { + "name": "orange_door" + }, + { + "name": "paramed" + }, + { + "name": "paramed_door" + }, + { + "name": "paramed_open" + }, + { + "name": "pink_door" + }, + { + "name": "qm" + }, + { + "name": "qm_door" + }, + { + "name": "qm_open" + }, + { + "name": "rd" + }, + { + "name": "rd_door" + }, + { + "name": "rd_open" + }, + { + "name": "red_door" + }, + { + "name": "science" + }, + { + "name": "science_door" + }, + { + "name": "science_open" + }, + { + "name": "sec" + }, + { + "name": "sec_door" + }, + { + "name": "sec_open" + }, + { + "name": "secure" + }, + { + "name": "secure_door" + }, + { + "name": "secure_icon" + }, + { + "name": "secure_open" + }, + { + "name": "shotgun" + }, + { + "name": "shotguncase" + }, + { + "name": "shotguncase_door" + }, + { + "name": "shotguncase_open" + }, + { + "name": "sparking", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "syndicate" + }, + { + "name": "syndicate_door" + }, + { + "name": "syndicate_open" + }, + { + "name": "tac" + }, + { + "name": "tac_door" + }, + { + "name": "tac_open" + }, + { + "name": "unlocked" + }, + { + "name": "warden" + }, + { + "name": "warden_door" + }, + { + "name": "warden_open" + }, + { + "name": "welded" + }, + { + "name": "white_door" + }, + { + "name": "yellow_door" + }, + { + "name": "clown" + }, + { + "name": "clown_door" + }, + { + "name": "clown_open" + }, + { + "name": "mime" + }, + { + "name": "mime_door" + }, + { + "name": "mime_open" + }, + { + "name": "representative_door" + } + ] } diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/genpop.png b/Resources/Textures/Structures/Wallmounts/signs.rsi/genpop.png new file mode 100644 index 0000000000000000000000000000000000000000..b37bfbec45fab115970bc8fa88c68bd43669e276 GIT binary patch literal 390 zcmV;10eSw3P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$KuJVFR9J=Wm%VMnFc5`51sNbkD%Yt}YXQ&UHV{Nl<IYB4ch($PKy|9r0&Jwv z2A3vu_#;acA;!+nYslkKyvKXck%YgFtZT3UNfq$fiRlq2KxV*Qg5WLCI3z3rI`~6^ z;2LiZiCcGqyYqQjGFv}I2W-@qm(9jnzcKtb(JM~`Pl89_zGLFNEKfTb+c)tJyz(VM za0W~n#`gPgaS4(TSV(QP-%bFa%JQIjzf%GTOMfx~RhHAJZIBGfGVo)5!@){8^;r;I z2~#2XESL&cmjMd}$O`13l!(+KQp>)>Hv6W1P|BLGZPUL3IeX>P1kA<vJ$6j%66lq{ ztY$-%Z6P(s<!-d!yON#5P*scdcV^(Y+*ypZ9a`Vr@B47^-_Vnw{Ui{&+cBuJoYon; ku7`<9B0+q>f13T{1HF>|tktPfrvLx|07*qoM6N<$f`g>4^Z)<= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json index cff9574b6a..3a7caf0688 100644 --- a/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/signs.rsi/meta.json @@ -1,11 +1,11 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 4e0bbe682d0a00192d24708fdb7031008aa03f18 and bee station at commit https://github.com/BeeStation/BeeStation-Hornet/commit/13dd5ac712385642574138f6d7b30eea7c2fab9c, Job signs by EmoGarbage404 (github) with inspiration from yogstation and tgstation, 'direction_exam' and 'direction_icu' made by rosieposieeee (github), 'direction_atmos' made by SlamBamActionman, 'vox' based on sprites taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/e7f005f8b8d3f7d89cbee3b87f76c23f9e951c27/icons/obj/decals.dmi, 'direction_pods' derived by WarPigeon from existing directional signs.", + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris at commit 4e0bbe682d0a00192d24708fdb7031008aa03f18 and bee station at commit https://github.com/BeeStation/BeeStation-Hornet/commit/13dd5ac712385642574138f6d7b30eea7c2fab9c, Job signs by EmoGarbage404 (github) with inspiration from yogstation and tgstation, 'direction_exam' and 'direction_icu' made by rosieposieeee (github), 'direction_atmos' made by SlamBamActionman, 'vox' based on sprites taken from vgstation13 at https://github.com/vgstation-coders/vgstation13/blob/e7f005f8b8d3f7d89cbee3b87f76c23f9e951c27/icons/obj/decals.dmi, 'direction_pods' derived by WarPigeon from existing directional signs.", "states": [ { "name": "ai" @@ -258,6 +258,9 @@ { "name": "cloning" }, + { + "name": "genpop" + }, { "name": "gravi" }, From 5371dbe9a7c726674c1f0273e1de3d36a47d5627 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 14:33:18 +0000 Subject: [PATCH 596/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7fe4bc1078..7586bfc0ce 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: WarPigeon - changes: - - message: The debriefing room in CentComm is now open to heads of staff for end - of round roleplay. - type: Tweak - id: 7830 - time: '2025-01-19T05:32:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/34475 - author: Winkarst-cpu changes: - message: Now items from the storage implant drop on the floor upon gibbing of @@ -3930,3 +3922,12 @@ id: 8331 time: '2025-04-24T11:39:40.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36313 +- author: EmoGarbage404 + changes: + - message: Added prisoner closets. These create automatic ID's which allow you to + quickly handle the transfer of prisoners in and out of genpop cells while keeping + their belongings secure. Imprison people today! + type: Add + id: 8332 + time: '2025-04-24T14:32:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36392 From 1f722bcc444fa0121d260480189723a921c9166b Mon Sep 17 00:00:00 2001 From: J <billsmith116@gmail.com> Date: Thu, 24 Apr 2025 16:05:32 +0000 Subject: [PATCH 597/622] Delivery system now has the possibility of penalisation (#36660) * Add new fields to DeliveryComponent for #36636 * Setting the baseSpesoPenalty for currently available deliveries * Small fixes * Basic delivery penalization * Penalty and reward multiplier calculation in place Also fixes an issue in SharedCargoSystem when opening a delivery in dev server due to trying to allocate cargo twice. * Calling penalty no longer happens on opening * Extract multiplier getting * Removing unused include * Changing method description. \n\n Not actually sure what I meant by the first one * Localising default delivery messages * Unused include removal * minor tweaks * slarti changes * forgot * stuffs * yippee * Locn't * doc * Apply suggestions from code review --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: ScarKy0 <scarky0@onet.eu> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Content.Server/Delivery/DeliverySystem.cs | 90 ++++++++++++++++--- Content.Shared/Delivery/DeliveryComponent.cs | 25 +++++- .../Delivery/DeliverySpawnerComponent.cs | 2 - .../Delivery/SharedDeliverySystem.cs | 12 +++ .../en-US/delivery/delivery-messages.ftl | 4 + .../Objects/Deliveries/deliveries.yml | 10 ++- 6 files changed, 127 insertions(+), 16 deletions(-) create mode 100644 Resources/Locale/en-US/delivery/delivery-messages.ftl diff --git a/Content.Server/Delivery/DeliverySystem.cs b/Content.Server/Delivery/DeliverySystem.cs index 329e3d11ed..0ddfde49ae 100644 --- a/Content.Server/Delivery/DeliverySystem.cs +++ b/Content.Server/Delivery/DeliverySystem.cs @@ -1,13 +1,16 @@ using Content.Server.Cargo.Systems; +using Content.Server.Chat.Systems; using Content.Server.Station.Systems; using Content.Server.StationRecords.Systems; using Content.Shared.Cargo.Components; +using Content.Shared.Cargo.Prototypes; using Content.Shared.Delivery; using Content.Shared.FingerprintReader; using Content.Shared.Labels.EntitySystems; using Content.Shared.StationRecords; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; +using Robust.Shared.Prototypes; namespace Content.Server.Delivery; @@ -25,6 +28,13 @@ public sealed partial class DeliverySystem : SharedDeliverySystem [Dependency] private readonly FingerprintReaderSystem _fingerprintReader = default!; [Dependency] private readonly LabelSystem _label = default!; [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IPrototypeManager _protoMan = default!; + + /// <summary> + /// Default reason to use if the penalization is triggered + /// </summary> + private static readonly LocId DefaultMessage = "delivery-penalty-default-reason"; public override void Initialize() { @@ -39,19 +49,15 @@ public sealed partial class DeliverySystem : SharedDeliverySystem { _container.EnsureContainer<Container>(ent, ent.Comp.Container); - var stationId = _station.GetStationInMap(Transform(ent).MapID); - - if (stationId == null) + if (_station.GetStationInMap(Transform(ent).MapID) is not { } stationId) return; - _records.TryGetRandomRecord<GeneralStationRecord>(stationId.Value, out var entry); - - if (entry == null) + if (!_records.TryGetRandomRecord<GeneralStationRecord>(stationId, out var entry)) return; ent.Comp.RecipientName = entry.Name; ent.Comp.RecipientJobTitle = entry.JobTitle; - ent.Comp.RecipientStation = stationId.Value; + ent.Comp.RecipientStation = stationId; _appearance.SetData(ent, DeliveryVisuals.JobIcon, entry.JobIcon); @@ -73,10 +79,74 @@ public sealed partial class DeliverySystem : SharedDeliverySystem if (!TryComp<StationBankAccountComponent>(ent.Comp.RecipientStation, out var account)) return; + var stationAccountEnt = (ent.Comp.RecipientStation.Value, account); + + var multiplier = GetDeliveryMultiplier(ent!); // Resolve so we know it's got the component + _cargo.UpdateBankAccount( - (ent.Comp.RecipientStation.Value, account), - ent.Comp.SpesoReward, - _cargo.CreateAccountDistribution((ent.Comp.RecipientStation.Value, account))); + stationAccountEnt, + (int)(ent.Comp.BaseSpesoReward * multiplier), + _cargo.CreateAccountDistribution((ent.Comp.RecipientStation.Value, account))); + } + + /// <summary> + /// Runs the penalty logic: Announcing the penalty and calculating how much to charge the designated account + /// </summary> + /// <param name="ent">The delivery for which to run the penalty.</param> + /// <param name="reason">The penalty reason, displayed in front of the message.</param> + protected override void HandlePenalty(Entity<DeliveryComponent> ent, string? reason = null) + { + if (!TryComp<StationBankAccountComponent>(ent.Comp.RecipientStation, out var stationAccount)) + return; + + if (ent.Comp.WasPenalized) + return; + + if (!_protoMan.TryIndex(ent.Comp.PenaltyBankAccount, out var accountInfo)) + return; + + var multiplier = GetDeliveryMultiplier(ent); + + var localizedAccountName = Loc.GetString(accountInfo.Name); + + reason ??= Loc.GetString(DefaultMessage); + + var dist = new Dictionary<ProtoId<CargoAccountPrototype>, double>() + { + { ent.Comp.PenaltyBankAccount, 1.0 } + }; + + var penaltyAccountBalance = stationAccount.Accounts[ent.Comp.PenaltyBankAccount]; + var calculatedPenalty = (int)(ent.Comp.BaseSpesoPenalty * multiplier); + + // Prevents cargo from going into negatives + if (calculatedPenalty > penaltyAccountBalance ) + calculatedPenalty = Math.Max(0, penaltyAccountBalance); + + _cargo.UpdateBankAccount( + (ent.Comp.RecipientStation.Value, stationAccount), + -calculatedPenalty, + dist); + + var message = Loc.GetString("delivery-penalty-message", ("reason", reason), ("spesos", calculatedPenalty), ("account", localizedAccountName.ToUpper())); + _chat.TrySendInGameICMessage(ent, message, InGameICChatType.Speak, hideChat: true); + + ent.Comp.WasPenalized = true; + DirtyField(ent.Owner, ent.Comp, nameof(DeliveryComponent.WasPenalized)); + } + + /// <summary> + /// Gathers the total multiplier for a delivery. + /// This is done by components having subscribed to GetDeliveryMultiplierEvent and having added onto it. + /// </summary> + /// <param name="ent">The delivery for which to get the multiplier.</param> + /// <returns>Total multiplier.</returns> + private float GetDeliveryMultiplier(Entity<DeliveryComponent> ent) + { + var ev = new GetDeliveryMultiplierEvent(); + RaiseLocalEvent(ent, ref ev); + + return ev.Multiplier; } public override void Update(float frameTime) diff --git a/Content.Shared/Delivery/DeliveryComponent.cs b/Content.Shared/Delivery/DeliveryComponent.cs index 19effcd211..3eabb5165c 100644 --- a/Content.Shared/Delivery/DeliveryComponent.cs +++ b/Content.Shared/Delivery/DeliveryComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Cargo.Prototypes; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Delivery; @@ -23,10 +25,16 @@ public sealed partial class DeliveryComponent : Component public bool IsLocked = true; /// <summary> - /// The amount of spesos that gets added to the station bank account on unlock. + /// The base amount of spesos that gets added to the station bank account on unlock. /// </summary> [DataField, AutoNetworkedField] - public int SpesoReward = 500; + public int BaseSpesoReward = 500; + + /// <summary> + /// The base amount of spesos that will be removed from the station bank account on a penalized delivery + /// </summary> + [DataField, AutoNetworkedField] + public int BaseSpesoPenalty = 250; /// <summary> /// The name of the recipient of this delivery. @@ -48,6 +56,19 @@ public sealed partial class DeliveryComponent : Component [DataField, AutoNetworkedField] public EntityUid? RecipientStation; + /// <summary> + /// The bank account ID of the account to subtract funds from in case of penalization + /// </summary> + [DataField, AutoNetworkedField] + public ProtoId<CargoAccountPrototype> PenaltyBankAccount = "Cargo"; + + /// <summary> + /// Whether this delivery has already received a penalty. + /// Used to avoid getting penalized several times. + /// </summary> + [DataField, AutoNetworkedField] + public bool WasPenalized; + /// <summary> /// The sound to play when the delivery is unlocked. /// </summary> diff --git a/Content.Shared/Delivery/DeliverySpawnerComponent.cs b/Content.Shared/Delivery/DeliverySpawnerComponent.cs index 9ed3ff1b91..81e8c97cf5 100644 --- a/Content.Shared/Delivery/DeliverySpawnerComponent.cs +++ b/Content.Shared/Delivery/DeliverySpawnerComponent.cs @@ -1,8 +1,6 @@ using Content.Shared.EntityTable.EntitySelectors; using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Prototypes; - namespace Content.Shared.Delivery; /// <summary> diff --git a/Content.Shared/Delivery/SharedDeliverySystem.cs b/Content.Shared/Delivery/SharedDeliverySystem.cs index 8d343b4acb..ffbf520610 100644 --- a/Content.Shared/Delivery/SharedDeliverySystem.cs +++ b/Content.Shared/Delivery/SharedDeliverySystem.cs @@ -210,9 +210,21 @@ public abstract class SharedDeliverySystem : EntitySystem protected virtual void GrantSpesoReward(Entity<DeliveryComponent?> ent) { } + protected virtual void HandlePenalty(Entity<DeliveryComponent> ent, string? reason = null) { } + protected virtual void SpawnDeliveries(Entity<DeliverySpawnerComponent?> ent) { } } +/// <summary> +/// Used to gather the multiplier from all different delivery components. +/// </summary> +[ByRefEvent] +public record struct GetDeliveryMultiplierEvent(float Multiplier) +{ + // we can't use an optional parameter because the default parameterless constructor defaults everything + public GetDeliveryMultiplierEvent() : this(1.0f) { } +} + /// <summary> /// Event raised on the delivery when it is unlocked. /// </summary> diff --git a/Resources/Locale/en-US/delivery/delivery-messages.ftl b/Resources/Locale/en-US/delivery/delivery-messages.ftl new file mode 100644 index 0000000000..50248e517a --- /dev/null +++ b/Resources/Locale/en-US/delivery/delivery-messages.ftl @@ -0,0 +1,4 @@ +delivery-penalty-default-reason = WARNING +delivery-penalty-default-account-name = UNKNOWN ACCOUNT + +delivery-penalty-message = {$reason}! INVOKING A PENALTY OF {$spesos} SPESOS ON {$account}! diff --git a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml index 2706cf380c..b396b20a46 100644 --- a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml +++ b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml @@ -74,7 +74,10 @@ - type: Item size: Huge - type: Delivery - spesoReward: 1000 + baseSpesoReward: 1000 + baseSpesoPenalty: 500 + - type: Speech + speechVerb: Robotic - type: EntityTableContainerFill containers: delivery: !type:NestedSelector @@ -111,7 +114,10 @@ - type: Item storedRotation: 90 - type: Delivery - spesoReward: 500 + baseSpesoReward: 500 + baseSpesoPenalty: 250 + - type: Speech + speechVerb: Robotic - type: EntityTableContainerFill containers: delivery: !type:NestedSelector From 68881ac0308122889b57c8fceb092d4e36207e3e Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:02:12 -0400 Subject: [PATCH 598/622] Fix small misc. turnstile issues (#36893) * Fix small misc. turnstile issues * more missing things * quieter --- Content.Shared/Doors/Components/TurnstileComponent.cs | 8 +++++++- Content.Shared/Doors/Systems/SharedTurnstileSystem.cs | 8 ++++++-- .../Prototypes/Entities/Structures/Doors/turnstile.yml | 4 ++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Doors/Components/TurnstileComponent.cs b/Content.Shared/Doors/Components/TurnstileComponent.cs index 5f19dd3e0b..3d7273fffa 100644 --- a/Content.Shared/Doors/Components/TurnstileComponent.cs +++ b/Content.Shared/Doors/Components/TurnstileComponent.cs @@ -61,7 +61,13 @@ public sealed partial class TurnstileComponent : Component /// Sound to play when the turnstile denies entry /// </summary> [DataField] - public SoundSpecifier? DenySound = new SoundPathSpecifier("/Audio/Machines/airlock_deny.ogg"); + public SoundSpecifier? DenySound = new SoundPathSpecifier("/Audio/Machines/airlock_deny.ogg") + { + Params = new() + { + Volume = -7, + }, + }; } [Serializable, NetSerializable] diff --git a/Content.Shared/Doors/Systems/SharedTurnstileSystem.cs b/Content.Shared/Doors/Systems/SharedTurnstileSystem.cs index 0af6b91378..573c85ac00 100644 --- a/Content.Shared/Doors/Systems/SharedTurnstileSystem.cs +++ b/Content.Shared/Doors/Systems/SharedTurnstileSystem.cs @@ -120,8 +120,12 @@ public abstract partial class SharedTurnstileSystem : EntitySystem var approachAngle = (pos - otherPos).ToAngle(); var rotateAngle = rot.ToWorldVec().ToAngle(); - var dif = Math.Min(Math.Abs(approachAngle.Theta - rotateAngle.Theta), Math.Abs(rotateAngle.Theta - approachAngle.Theta)); - return dif < Math.PI / 4; + var diff = Math.Abs(approachAngle - rotateAngle); + diff %= MathHelper.TwoPi; + if (diff > Math.PI) + diff = MathHelper.TwoPi - diff; + + return diff < Math.PI / 4; } protected virtual void PlayAnimation(EntityUid uid, string stateId) diff --git a/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml index 0827492d11..9434c9a892 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml @@ -84,7 +84,7 @@ suffix: Genpop Enter components: - type: AccessReader - access: [["GenpopEnter"]] + access: [["GenpopEnter"], ["Security"]] - type: entity id: TurnstileGenpopLeave @@ -92,4 +92,4 @@ suffix: Genpop Leave components: - type: AccessReader - access: [["GenpopLeave"]] + access: [["GenpopLeave"], ["Security"]] From 9fd5ed6d05f598d72ae6ed9cf4a6b1b3e262de12 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Thu, 24 Apr 2025 19:28:50 +0200 Subject: [PATCH 599/622] Meta Silo n Dept Economy (#36885) --- Resources/Maps/meta.yml | 1884 ++++++++++++++++++++++++++------------- 1 file changed, 1268 insertions(+), 616 deletions(-) diff --git a/Resources/Maps/meta.yml b/Resources/Maps/meta.yml index 541611f192..0541469ef5 100644 --- a/Resources/Maps/meta.yml +++ b/Resources/Maps/meta.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 250.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/03/2025 06:30:39 - entityCount: 28715 + time: 04/24/2025 09:44:40 + entityCount: 28726 maps: - 951 grids: @@ -12161,9 +12161,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1563: - - DoorStatus: Close + - - DoorStatus + - Close 240: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 238 components: - type: MetaData @@ -12176,9 +12178,11 @@ entities: - type: DeviceLinkSource linkedPorts: 240: - - DoorStatus: Close + - - DoorStatus + - Close 1563: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 240 components: - type: MetaData @@ -12191,9 +12195,11 @@ entities: - type: DeviceLinkSource linkedPorts: 238: - - DoorStatus: Close + - - DoorStatus + - Close 237: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 242 components: - type: MetaData @@ -12206,9 +12212,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1147: - - DoorStatus: Close + - - DoorStatus + - Close 243: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 243 components: - type: MetaData @@ -12221,9 +12229,11 @@ entities: - type: DeviceLinkSource linkedPorts: 242: - - DoorStatus: Close + - - DoorStatus + - Close 1710: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 268 components: - type: MetaData @@ -12252,9 +12262,11 @@ entities: - type: DeviceLinkSource linkedPorts: 242: - - DoorStatus: Close + - - DoorStatus + - Close 1710: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 1563 components: - type: MetaData @@ -12267,9 +12279,11 @@ entities: - type: DeviceLinkSource linkedPorts: 237: - - DoorStatus: Close + - - DoorStatus + - Close 238: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 1710 components: - type: MetaData @@ -12282,9 +12296,11 @@ entities: - type: DeviceLinkSource linkedPorts: 243: - - DoorStatus: Close + - - DoorStatus + - Close 1147: - - DoorStatus: Close + - - DoorStatus + - Close - proto: AirlockCommandLocked entities: - uid: 245 @@ -12395,7 +12411,7 @@ entities: pos: 11.5,29.5 parent: 5350 - type: Door - secondsUntilStateChange: -4233.237 + secondsUntilStateChange: -5519.5977 state: Opening - type: DeviceLinkSource lastSignals: @@ -12664,7 +12680,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11257: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 27016 components: - type: MetaData @@ -12677,7 +12694,8 @@ entities: - type: DeviceLinkSource linkedPorts: 27248: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalEngineeringLocked entities: - uid: 10968 @@ -12692,7 +12710,8 @@ entities: - type: DeviceLinkSource linkedPorts: 26632: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23561 components: - type: MetaData @@ -12703,7 +12722,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23562: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23562 components: - type: MetaData @@ -12714,7 +12734,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23561: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23563 components: - type: MetaData @@ -12725,7 +12746,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23564: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23564 components: - type: MetaData @@ -12736,7 +12758,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23563: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 26632 components: - type: MetaData @@ -12749,7 +12772,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10968: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlass entities: - uid: 1485 @@ -12852,7 +12876,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11254: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11980 components: - type: MetaData @@ -12866,7 +12891,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13933: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13933 components: - type: MetaData @@ -12880,7 +12906,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11980: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 27248 components: - type: MetaData @@ -12894,7 +12921,8 @@ entities: - type: DeviceLinkSource linkedPorts: 27016: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassCargoLocked entities: - uid: 183 @@ -12920,9 +12948,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9482: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 3527: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3527 components: - type: MetaData @@ -12935,9 +12965,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3443: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 9426: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3884 components: - type: MetaData @@ -12964,9 +12996,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3527: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 9482: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9482 components: - type: MetaData @@ -12979,9 +13013,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3443: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 9426: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassCommandLocked entities: - uid: 3025 @@ -12994,9 +13030,11 @@ entities: - type: DeviceLinkSource linkedPorts: 27212: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 27213: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3026 components: - type: MetaData @@ -13007,9 +13045,11 @@ entities: - type: DeviceLinkSource linkedPorts: 27213: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 27212: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 27212 components: - type: MetaData @@ -13042,7 +13082,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13927: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13927 components: - type: MetaData @@ -13055,7 +13096,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13926: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 149 @@ -13070,7 +13112,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20038: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5712 components: - type: Transform @@ -13081,7 +13124,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5711: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 5713 components: - type: Transform @@ -13092,9 +13136,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5716: - - DoorStatus: Close + - - DoorStatus + - Close 5715: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 5714 components: - type: Transform @@ -13105,9 +13151,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5715: - - DoorStatus: Close + - - DoorStatus + - Close 5716: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 5742 components: - type: Transform @@ -13125,7 +13173,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9495: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 9495 components: - type: MetaData @@ -13138,7 +13187,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9494: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13922 components: - type: MetaData @@ -13151,7 +13201,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13921: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 16716 components: - type: MetaData @@ -13164,7 +13215,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16715: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17204 components: - type: MetaData @@ -13177,7 +13229,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17205: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17205 components: - type: MetaData @@ -13190,7 +13243,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17204: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20027 components: - type: MetaData @@ -13203,7 +13257,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20026: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20029 components: - type: MetaData @@ -13216,7 +13271,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20030: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20030 components: - type: MetaData @@ -13229,7 +13285,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20029: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20038 components: - type: MetaData @@ -13242,7 +13299,8 @@ entities: - type: DeviceLinkSource linkedPorts: 149: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 2996 @@ -13364,7 +13422,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5712: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 1 - uid: 5715 @@ -13375,9 +13434,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5713: - - DoorStatus: Close + - - DoorStatus + - Close 5714: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 2 - uid: 5716 @@ -13388,9 +13449,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5713: - - DoorStatus: Close + - - DoorStatus + - Close 5714: - - DoorStatus: Close + - - DoorStatus + - Close - type: DeviceLinkSink invokeCounter: 2 - proto: AirlockExternalLocked @@ -13407,7 +13470,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13922: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 16715 components: - type: MetaData @@ -13420,7 +13484,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16716: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20026 components: - type: MetaData @@ -13433,7 +13498,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20027: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockFreezerKitchenHydroLocked entities: - uid: 2433 @@ -13605,7 +13671,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7231: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7143 components: - type: MetaData @@ -13618,7 +13685,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6718: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7272 components: - type: MetaData @@ -13631,7 +13699,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6706: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7758 components: - type: MetaData @@ -14852,7 +14921,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19185: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 15115 components: - type: MetaData @@ -14884,7 +14954,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14850: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20286 components: - type: MetaData @@ -14953,14 +15024,15 @@ entities: pos: -4.5,53.5 parent: 5350 - type: Door - secondsUntilStateChange: -112816.266 + secondsUntilStateChange: -114102.625 state: Opening - type: DeviceLinkSink invokeCounter: 2 - type: DeviceLinkSource linkedPorts: 7272: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt lastSignals: DoorStatus: True - uid: 6718 @@ -14976,7 +15048,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7143: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6751 components: - type: MetaData @@ -15013,7 +15086,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6710: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 7429 components: - type: MetaData @@ -23192,7 +23266,7 @@ entities: - uid: 16030 components: - type: Transform - pos: 1.3051715,-33.362003 + pos: 1.5512257,-33.37433 parent: 5350 - uid: 19241 components: @@ -23560,7 +23634,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6803: - - Start: Close + - - Start + - Close - uid: 6845 components: - type: MetaData @@ -23571,7 +23646,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7429: - - Start: Close + - - Start + - Close - uid: 7372 components: - type: MetaData @@ -23582,7 +23658,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6802: - - Start: Close + - - Start + - Close - proto: Bucket entities: - uid: 1113 @@ -41532,7 +41609,7 @@ entities: - uid: 8040 components: - type: Transform - pos: 0.6150346,-33.378967 + pos: 0.84810066,-33.49933 parent: 5350 - uid: 12067 components: @@ -66280,16 +66357,16 @@ entities: parent: 5350 - proto: ClosetBombFilled entities: - - uid: 7031 - components: - - type: Transform - pos: 5.5,41.5 - parent: 5350 - uid: 15535 components: - type: Transform pos: 20.5,-47.5 parent: 5350 + - uid: 17456 + components: + - type: Transform + pos: 4.5,36.5 + parent: 5350 - proto: ClosetEmergencyFilledRandom entities: - uid: 483 @@ -69492,7 +69569,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19265: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 19135 @@ -69592,6 +69670,44 @@ entities: - type: Transform pos: -9.5,2.5 parent: 5350 +- proto: ComputerCargoOrdersEngineering + entities: + - uid: 28719 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 55.5,3.5 + parent: 5350 +- proto: ComputerCargoOrdersMedical + entities: + - uid: 8377 + components: + - type: Transform + pos: -36.5,-30.5 + parent: 5350 +- proto: ComputerCargoOrdersScience + entities: + - uid: 15604 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,-33.5 + parent: 5350 +- proto: ComputerCargoOrdersSecurity + entities: + - uid: 4324 + components: + - type: Transform + pos: 5.5,41.5 + parent: 5350 +- proto: ComputerCargoOrdersService + entities: + - uid: 23047 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 33.5,-7.5 + parent: 5350 - proto: ComputerCargoShuttle entities: - uid: 28195 @@ -69711,6 +69827,14 @@ entities: rot: 1.5707963267948966 rad pos: 37.5,-30.5 parent: 5350 +- proto: ComputerFundingAllocation + entities: + - uid: 7031 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -16.5,-3.5 + parent: 5350 - proto: ComputerId entities: - uid: 1061 @@ -71344,6 +71468,46 @@ entities: showEnts: False occludes: True ent: null +- proto: CrateLockBoxEngineering + entities: + - uid: 28721 + components: + - type: Transform + pos: 49.5,0.5 + parent: 5350 +- proto: CrateLockBoxMedical + entities: + - uid: 28722 + components: + - type: Transform + pos: -33.5,-45.5 + parent: 5350 +- proto: CrateLockBoxScience + entities: + - uid: 28723 + components: + - type: Transform + pos: 5.5,-40.5 + parent: 5350 +- proto: CrateLockBoxSecurity + entities: + - uid: 28724 + components: + - type: Transform + pos: 10.5,42.5 + parent: 5350 +- proto: CrateLockBoxService + entities: + - uid: 28725 + components: + - type: Transform + pos: 42.5,-5.5 + parent: 5350 + - uid: 28726 + components: + - type: Transform + pos: 41.5,-22.5 + parent: 5350 - proto: CrateMaterialSteel entities: - uid: 28057 @@ -82342,11 +82506,6 @@ entities: parent: 5350 - proto: filingCabinetDrawer entities: - - uid: 8377 - components: - - type: Transform - pos: -16.5,-3.5 - parent: 5350 - uid: 9062 components: - type: Transform @@ -82411,6 +82570,11 @@ entities: - type: Transform pos: 10.5,-43.5 parent: 5350 + - uid: 28720 + components: + - type: Transform + pos: -18.5,-1.5 + parent: 5350 - proto: filingCabinetDrawerRandom entities: - uid: 1377 @@ -84571,7 +84735,7 @@ entities: pos: 31.5,-33.5 parent: 5350 - type: Door - secondsUntilStateChange: -35655.312 + secondsUntilStateChange: -36941.67 state: Closing - uid: 9615 components: @@ -130970,17 +131134,23 @@ entities: - type: DeviceLinkSource linkedPorts: 1876: - - Pressed: Close + - - Pressed + - Close 28459: - - Pressed: Close + - - Pressed + - Close 6962: - - Pressed: Close + - - Pressed + - Close 8868: - - Pressed: Close + - - Pressed + - Close 23027: - - Pressed: Close + - - Pressed + - Close 22904: - - Pressed: Close + - - Pressed + - Close - uid: 23091 components: - type: MetaData @@ -130992,22 +131162,33 @@ entities: - type: DeviceLinkSource linkedPorts: 1876: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 28459: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 6962: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 22904: - - Pressed: Open + - - Pressed + - Open 8868: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose 23027: - - Pressed: Open - - Pressed: AutoClose + - - Pressed + - Open + - - Pressed + - AutoClose - proto: LockableButtonAtmospherics entities: - uid: 18348 @@ -131021,7 +131202,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15944: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 18353 components: - type: MetaData @@ -131033,7 +131215,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15941: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonEngineering entities: - uid: 4161 @@ -131047,11 +131230,14 @@ entities: - type: DeviceLinkSource linkedPorts: 28365: - - Pressed: Toggle + - - Pressed + - Toggle 23391: - - Pressed: Toggle + - - Pressed + - Toggle 28382: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 1426 @@ -131064,11 +131250,14 @@ entities: - type: DeviceLinkSource linkedPorts: 23655: - - Pressed: Toggle + - - Pressed + - Toggle 23712: - - Pressed: Toggle + - - Pressed + - Toggle 23720: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 10414 components: - type: MetaData @@ -131080,9 +131269,11 @@ entities: - type: DeviceLinkSource linkedPorts: 14445: - - Pressed: Open + - - Pressed + - Open 14444: - - Pressed: Open + - - Pressed + - Open - uid: 13783 components: - type: MetaData @@ -131094,9 +131285,11 @@ entities: - type: DeviceLinkSource linkedPorts: 23500: - - Pressed: Open + - - Pressed + - Open 24195: - - Pressed: Open + - - Pressed + - Open - proto: LockableButtonResearch entities: - uid: 792 @@ -131110,11 +131303,14 @@ entities: - type: DeviceLinkSource linkedPorts: 15522: - - Pressed: Toggle + - - Pressed + - Toggle 14390: - - Pressed: Toggle + - - Pressed + - Toggle 14436: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilled entities: - uid: 11751 @@ -131646,19 +131842,16 @@ entities: - 0 - 0 - 0 - - uid: 15604 - components: - - type: Transform - anchored: True - pos: -36.5,-30.5 - parent: 5350 - - type: Physics - bodyType: Static - uid: 24329 components: - type: Transform pos: -30.5,-29.5 parent: 5350 + - uid: 28718 + components: + - type: Transform + pos: -25.5,-29.5 + parent: 5350 - proto: LockerParamedicFilled entities: - uid: 15898 @@ -131974,6 +132167,13 @@ entities: - type: Transform pos: -44.5,-21.5 parent: 5350 +- proto: MachineMaterialSilo + entities: + - uid: 16678 + components: + - type: Transform + pos: 4.5,-36.5 + parent: 5350 - proto: MagazineBoxMagnumPractice entities: - uid: 22264 @@ -132433,12 +132633,12 @@ entities: - uid: 4312 components: - type: Transform - pos: 1.8806596,-33.332092 + pos: 0.44185066,-33.171204 parent: 5350 - uid: 4315 components: - type: Transform - pos: 2.0837846,-33.441467 + pos: 0.31685066,-32.99933 parent: 5350 - proto: MechEquipmentGrabberSmall entities: @@ -145963,11 +146163,14 @@ entities: - type: DeviceLinkSource linkedPorts: 6260: - - Pressed: Forward + - - Pressed + - Forward 4451: - - Pressed: Forward + - - Pressed + - Forward 15331: - - Pressed: Forward + - - Pressed + - Forward - type: Physics canCollide: False - uid: 21407 @@ -145977,11 +146180,14 @@ entities: - type: DeviceLinkSource linkedPorts: 6260: - - Pressed: Reverse + - - Pressed + - Reverse 4451: - - Pressed: Reverse + - - Pressed + - Reverse 15331: - - Pressed: Reverse + - - Pressed + - Reverse - type: Physics canCollide: False - uid: 28429 @@ -146309,7 +146515,7 @@ entities: - uid: 4044 components: - type: Transform - pos: 4.0027914,-36.42903 + pos: 3.6835365,-36.49933 parent: 5350 - uid: 8906 components: @@ -146448,7 +146654,7 @@ entities: - uid: 16473 components: - type: Transform - pos: 4.5652914,-36.413406 + pos: 3.4960365,-36.34308 parent: 5350 - uid: 24292 components: @@ -146477,7 +146683,7 @@ entities: - uid: 3799 components: - type: Transform - pos: 3.4715414,-36.42903 + pos: 0.52583885,-32.077454 parent: 5350 - uid: 3832 components: @@ -147084,7 +147290,8 @@ entities: - type: DeviceLinkSource linkedPorts: 24634: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11517 components: - type: MetaData @@ -147096,7 +147303,8 @@ entities: - type: DeviceLinkSource linkedPorts: 91: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 11518 components: - type: MetaData @@ -147108,7 +147316,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8659: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 11519 components: - type: MetaData @@ -147120,7 +147329,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8660: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 11742 components: - type: MetaData @@ -147132,7 +147342,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8658: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 11770 components: - type: MetaData @@ -147144,7 +147355,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8656: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16024 components: - type: MetaData @@ -147156,9 +147368,11 @@ entities: - type: DeviceLinkSource linkedPorts: 672: - - Pressed: Open + - - Pressed + - Open 673: - - Pressed: Open + - - Pressed + - Open - uid: 19081 components: - type: MetaData @@ -147170,9 +147384,11 @@ entities: - type: DeviceLinkSource linkedPorts: 16538: - - Pressed: Open + - - Pressed + - Open 16470: - - Pressed: Open + - - Pressed + - Open - proto: SignalButtonDirectional entities: - uid: 6536 @@ -147186,9 +147402,11 @@ entities: - type: DeviceLinkSource linkedPorts: 23500: - - Pressed: Open + - - Pressed + - Open 24195: - - Pressed: Open + - - Pressed + - Open - uid: 10139 components: - type: MetaData @@ -147199,7 +147417,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17273: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 10140 components: - type: MetaData @@ -147210,7 +147429,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17274: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 10141 components: - type: MetaData @@ -147221,7 +147441,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17275: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 11158 components: - type: Transform @@ -147230,11 +147451,14 @@ entities: - type: DeviceLinkSource linkedPorts: 12418: - - Pressed: Toggle + - - Pressed + - Toggle 9188: - - Pressed: Toggle + - - Pressed + - Toggle 9185: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11160 components: - type: Transform @@ -147244,11 +147468,14 @@ entities: - type: DeviceLinkSource linkedPorts: 12418: - - Pressed: Toggle + - - Pressed + - Toggle 9188: - - Pressed: Toggle + - - Pressed + - Toggle 9185: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 11423 components: - type: MetaData @@ -147260,7 +147487,8 @@ entities: - type: DeviceLinkSource linkedPorts: 10406: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 21082 components: - type: MetaData @@ -147272,7 +147500,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20757: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 21101 components: - type: MetaData @@ -147284,7 +147513,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21092: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 21102 components: - type: MetaData @@ -147296,7 +147526,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21091: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 21103 components: - type: MetaData @@ -147308,7 +147539,8 @@ entities: - type: DeviceLinkSource linkedPorts: 15418: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 21548 components: - type: MetaData @@ -147320,7 +147552,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16592: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: SignalSwitch entities: - uid: 15949 @@ -147334,14 +147567,20 @@ entities: - type: DeviceLinkSource linkedPorts: 7323: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 14414: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 499: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 16224 components: - type: MetaData @@ -147355,44 +147594,70 @@ entities: - type: DeviceLinkSource linkedPorts: 5086: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7142: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6339: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6780: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6758: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7713: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7749: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7745: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8903: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 8904: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7746: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9226: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9219: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 16288 components: - type: MetaData @@ -147406,14 +147671,20 @@ entities: - type: DeviceLinkSource linkedPorts: 12458: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12457: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12456: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 16289 components: - type: MetaData @@ -147427,14 +147698,20 @@ entities: - type: DeviceLinkSource linkedPorts: 12459: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12460: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12461: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 19084 components: - type: MetaData @@ -147448,17 +147725,25 @@ entities: - type: DeviceLinkSource linkedPorts: 2741: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16049: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16565: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16083: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 19400 components: - type: MetaData @@ -147470,14 +147755,20 @@ entities: - type: DeviceLinkSource linkedPorts: 19409: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19621: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19326: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 19433 components: - type: MetaData @@ -147489,14 +147780,20 @@ entities: - type: DeviceLinkSource linkedPorts: 19259: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19258: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19270: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 22352 components: - type: MetaData @@ -147508,53 +147805,85 @@ entities: - type: DeviceLinkSource linkedPorts: 22285: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22286: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22287: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22288: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 7280: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 5440: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 11232: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 13342: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22245: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22255: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22257: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22254: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22253: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22252: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22251: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 22259: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off - proto: SignalSwitchDirectional entities: - uid: 1301 @@ -147570,26 +147899,40 @@ entities: - type: DeviceLinkSource linkedPorts: 2415: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2416: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2417: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2418: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2419: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2420: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2421: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 2558 components: - type: MetaData @@ -147602,11 +147945,15 @@ entities: - type: DeviceLinkSource linkedPorts: 27135: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 27136: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 4744 components: - type: MetaData @@ -147618,41 +147965,65 @@ entities: - type: DeviceLinkSource linkedPorts: 3910: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3907: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3909: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4450: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3911: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4449: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3908: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3912: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4746: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 5045: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4145: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 4308: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 4758 components: - type: MetaData @@ -147663,37 +148034,55 @@ entities: - type: DeviceLinkSource linkedPorts: 9473: - - On: Forward - - Off: Reverse + - - On + - Forward + - - Off + - Reverse 3479: - - On: Forward - - Off: Reverse + - - On + - Forward + - - Off + - Reverse 9256: - - On: Forward - - Off: Reverse + - - On + - Forward + - - Off + - Reverse 9357: - - On: Forward + - - On + - Forward 9479: - - On: Forward + - - On + - Forward 9344: - - On: Forward + - - On + - Forward 4556: - - On: Forward + - - On + - Forward 4513: - - On: Forward + - - On + - Forward 4458: - - On: Forward + - - On + - Forward 4471: - - On: Forward + - - On + - Forward 4472: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9700: - - On: Forward + - - On + - Forward 9669: - - On: Forward + - - On + - Forward 4525: - - On: Forward + - - On + - Forward - uid: 6572 components: - type: MetaData @@ -147707,14 +148096,20 @@ entities: - type: DeviceLinkSource linkedPorts: 6335: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6599: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6471: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 6824 components: - type: Transform @@ -147724,26 +148119,40 @@ entities: - type: DeviceLinkSource linkedPorts: 28197: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 26164: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 26158: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 26157: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22640: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22324: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22366: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open - uid: 7134 components: - type: MetaData @@ -147755,11 +148164,15 @@ entities: - type: DeviceLinkSource linkedPorts: 6412: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9630: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9373 components: - type: MetaData @@ -147771,32 +148184,50 @@ entities: - type: DeviceLinkSource linkedPorts: 9301: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4553: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 9289: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 9477: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4461: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 4652: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 17828: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 849: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 18236: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off - uid: 9685 components: - type: MetaData @@ -147809,11 +148240,15 @@ entities: - type: DeviceLinkSource linkedPorts: 7713: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7749: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 9686 components: - type: MetaData @@ -147826,11 +148261,15 @@ entities: - type: DeviceLinkSource linkedPorts: 8903: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7745: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 10429 components: - type: MetaData @@ -147842,38 +148281,60 @@ entities: - type: DeviceLinkSource linkedPorts: 3090: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3089: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3612: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3456: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3603: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3455: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3460: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 3475: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 9643: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 20939: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 1576: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 10468 components: - type: MetaData @@ -147887,14 +148348,20 @@ entities: - type: DeviceLinkSource linkedPorts: 7594: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6301: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 6302: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 11110 components: - type: MetaData @@ -147906,17 +148373,25 @@ entities: - type: DeviceLinkSource linkedPorts: 12361: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11564: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11655: - - Off: Close - - On: Open + - - Off + - Close + - - On + - Open 11733: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 11467 components: - type: MetaData @@ -147929,11 +148404,15 @@ entities: - type: DeviceLinkSource linkedPorts: 8904: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 7746: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 12130 components: - type: MetaData @@ -147946,14 +148425,20 @@ entities: - type: DeviceLinkSource linkedPorts: 13934: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13163: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 13781: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 17321 components: - type: MetaData @@ -147965,17 +148450,25 @@ entities: - type: DeviceLinkSource linkedPorts: 16181: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11426: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 17317: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21785: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 19106 components: - type: MetaData @@ -147987,8 +148480,10 @@ entities: - type: DeviceLinkSource linkedPorts: 6953: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 19107 components: - type: MetaData @@ -148000,8 +148495,10 @@ entities: - type: DeviceLinkSource linkedPorts: 15954: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 19110 components: - type: MetaData @@ -148013,8 +148510,10 @@ entities: - type: DeviceLinkSource linkedPorts: 19627: - - Off: Off - - On: On + - - Off + - Off + - - On + - On - uid: 20315 components: - type: MetaData @@ -148028,26 +148527,40 @@ entities: - type: DeviceLinkSource linkedPorts: 16466: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 11599: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16602: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20928: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20927: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20926: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 20929: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 20919 components: - type: MetaData @@ -148061,20 +148574,30 @@ entities: - type: DeviceLinkSource linkedPorts: 2460: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 12467: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2754: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 2428: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 3180: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 20931 components: - type: MetaData @@ -148086,11 +148609,15 @@ entities: - type: DeviceLinkSource linkedPorts: 15717: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16529: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 21438 components: - type: MetaData @@ -148102,14 +148629,20 @@ entities: - type: DeviceLinkSource linkedPorts: 21434: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 21231: - - On: Forward - - Off: Off + - - On + - Forward + - - Off + - Off 21435: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 21783 components: - type: MetaData @@ -148121,17 +148654,25 @@ entities: - type: DeviceLinkSource linkedPorts: 18546: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21773: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21779: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21784: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 22186 components: - type: MetaData @@ -148143,17 +148684,25 @@ entities: - type: DeviceLinkSource linkedPorts: 22132: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22088: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 22045: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 21786: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 23365 components: - type: MetaData @@ -148166,17 +148715,25 @@ entities: - type: DeviceLinkSource linkedPorts: 19745: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19741: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19740: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 19736: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 24265 components: - type: MetaData @@ -148190,14 +148747,20 @@ entities: - type: DeviceLinkSource linkedPorts: 15096: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 16334: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close 28212: - - On: Open - - Off: Close + - - On + - Open + - - Off + - Close - uid: 28285 components: - type: MetaData @@ -148209,8 +148772,10 @@ entities: - type: DeviceLinkSource linkedPorts: 17445: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 28286 components: - type: MetaData @@ -148222,8 +148787,10 @@ entities: - type: DeviceLinkSource linkedPorts: 4311: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - uid: 28292 components: - type: MetaData @@ -148235,8 +148802,10 @@ entities: - type: DeviceLinkSource linkedPorts: 28293: - - On: On - - Off: Off + - - On + - On + - - Off + - Off - proto: SignAnomaly entities: - uid: 19445 @@ -156890,12 +157459,6 @@ entities: - type: Transform pos: 0.5,-28.5 parent: 5350 - - uid: 4324 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-33.5 - parent: 5350 - uid: 4368 components: - type: Transform @@ -157760,11 +158323,6 @@ entities: - type: Transform pos: -16.5,-13.5 parent: 5350 - - uid: 16678 - components: - - type: Transform - pos: 4.5,-36.5 - parent: 5350 - uid: 16875 components: - type: Transform @@ -161092,73 +161650,124 @@ entities: - type: DeviceLinkSource linkedPorts: 10032: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 10037: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9952: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9882: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9934: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9790: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9707: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9711: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9757: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9803: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9709: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9705: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9675: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9696: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9678: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3024: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close 4469: - - Left: Open - - Right: Open - - Middle: Close + - - Left + - Open + - - Right + - Open + - - Middle + - Close - uid: 17528 components: - type: MetaData @@ -161169,25 +161778,40 @@ entities: - type: DeviceLinkSource linkedPorts: 9459: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9460: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4562: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9951: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4676: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 2970 @@ -180110,7 +180734,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7542: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 7073 components: - type: MetaData @@ -180152,7 +180777,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14290: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 14378 components: - type: Transform @@ -180163,7 +180789,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20826: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 16865 components: - type: Transform @@ -180192,9 +180819,11 @@ entities: - type: DeviceLinkSource linkedPorts: 20220: - - DoorStatus: Close + - - DoorStatus + - Close 20221: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 19625 components: - type: Transform @@ -180206,9 +180835,11 @@ entities: - type: DeviceLinkSource linkedPorts: 20220: - - DoorStatus: Close + - - DoorStatus + - Close 20221: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 23114 components: - type: Transform @@ -180220,7 +180851,8 @@ entities: - type: DeviceLinkSource linkedPorts: 20160: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 25676 components: - type: Transform @@ -180263,9 +180895,11 @@ entities: - type: DeviceLinkSource linkedPorts: 21462: - - DoorStatus: Close + - - DoorStatus + - Close 21461: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 28118 components: - type: Transform @@ -180277,9 +180911,11 @@ entities: - type: DeviceLinkSource linkedPorts: 21462: - - DoorStatus: Close + - - DoorStatus + - Close 21461: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorBarLocked entities: - uid: 21054 @@ -180293,7 +180929,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2410: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 21460 components: - type: MetaData @@ -180333,9 +180970,11 @@ entities: - type: DeviceLinkSource linkedPorts: 28116: - - DoorStatus: Close + - - DoorStatus + - Close 28118: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 21462 components: - type: Transform @@ -180347,9 +180986,11 @@ entities: - type: DeviceLinkSource linkedPorts: 28116: - - DoorStatus: Close + - - DoorStatus + - Close 28118: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorKitchenHydroponicsLocked entities: - uid: 1153 @@ -180377,7 +181018,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21054: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecure entities: - uid: 15701 @@ -180402,7 +181044,8 @@ entities: - type: DeviceLinkSource linkedPorts: 987: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 22299 components: - type: Transform @@ -180508,7 +181151,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14361: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 20826 components: - type: Transform @@ -180520,7 +181164,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14378: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 26681 components: - type: Transform @@ -180642,7 +181287,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22219: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureMedicalLocked entities: - uid: 15543 @@ -180705,9 +181351,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19625: - - DoorStatus: Close + - - DoorStatus + - Close 19624: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 20221 components: - type: Transform @@ -180718,9 +181366,11 @@ entities: - type: DeviceLinkSource linkedPorts: 19625: - - DoorStatus: Close + - - DoorStatus + - Close 19624: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureSecurityLocked entities: - uid: 6894 @@ -180745,7 +181395,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4931: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 7781 components: - type: Transform @@ -180765,7 +181416,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23114: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureServiceLocked entities: - uid: 14569 @@ -185215,7 +185867,7 @@ entities: pos: -28.5,-5.5 parent: 5350 - type: Door - secondsUntilStateChange: -41367.223 + secondsUntilStateChange: -42653.582 state: Opening - uid: 17570 components: From 3f588a1bb1c27b4734487be72ad0bffc4ff38486 Mon Sep 17 00:00:00 2001 From: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:41:55 -0400 Subject: [PATCH 600/622] New Spawners, Modified Spawners, new Service/Theatre Airlock, and new Colorful Light Crate (#36750) Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Catalog/Cargo/cargo_service.yml | 12 +- .../Catalog/Fills/Boxes/service.yml | 40 ++++ .../Catalog/Fills/Crates/engineering.yml | 4 +- .../Catalog/Fills/Crates/materials.yml | 4 +- .../Catalog/Fills/Crates/service.yml | 11 + .../Markers/Spawners/Random/cables.yml | 61 ++++++ .../Markers/Spawners/Random/crates.yml | 191 +++++++++++++++--- .../Devices/Electronics/door_access.yml | 8 + .../Structures/Doors/Airlocks/access.yml | 27 +++ 9 files changed, 324 insertions(+), 34 deletions(-) create mode 100644 Resources/Prototypes/Entities/Markers/Spawners/Random/cables.yml diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index ac7f02bd22..e170f8c59d 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -28,6 +28,16 @@ category: cargoproduct-category-name-service group: market +- type: cargoProduct + id: ServiceLightsColorful + icon: + sprite: Objects/Power/light_bulb.rsi + state: normal + product: CrateServiceColorfulLights + cost: 800 + category: cargoproduct-category-name-service + group: market + - type: cargoProduct id: MousetrapBoxes icon: @@ -217,5 +227,3 @@ cost: 500 category: cargoproduct-category-name-service group: market - - diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/service.yml b/Resources/Prototypes/Catalog/Fills/Boxes/service.yml index 5aba7bdb2a..4ba7cf6f7e 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/service.yml @@ -38,3 +38,43 @@ guides: - Botanical - Chemicals + +- type: entity + parent: BoxLightbulb + id: BoxLightbulbColorfulMixed + name: mixed colorful lightbulb box + components: + - type: StorageFill + contents: + - id: LightBulbCrystalCyan + amount: 2 + - id: LightBulbCrystalBlue + amount: 2 + - id: LightBulbCrystalGreen + amount: 2 + - id: LightBulbCrystalPink + amount: 2 + - id: LightBulbCrystalRed + amount: 2 + - id: LightBulbCrystalOrange + amount: 2 + +- type: entity + parent: BoxLighttube + id: BoxLighttubeColorfulMixed + name: mixed colorful lighttube box + components: + - type: StorageFill + contents: + - id: LightTubeCrystalCyan + amount: 2 + - id: LightTubeCrystalBlue + amount: 2 + - id: LightTubeCrystalGreen + amount: 2 + - id: LightTubeCrystalPink + amount: 2 + - id: LightTubeCrystalRed + amount: 2 + - id: LightTubeCrystalOrange + amount: 2 diff --git a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml index 4b3f3f9339..23921b98e3 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml @@ -228,6 +228,8 @@ - id: SignalTimerElectronics - id: SMESMachineCircuitboard - id: SubstationMachineCircuitboard + - id: BorgChargerCircuitboard + - id: CellRechargerCircuitboard - id: SpaceVillainArcadeComputerCircuitboard - id: BlockGameArcadeComputerCircuitboard @@ -242,4 +244,4 @@ entity_storage: !type:NestedSelector tableId: RandomTechBoardTable rolls: !type:RangeNumberSelector - range: 3, 7 + range: 6, 8 diff --git a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml index 580319cd5f..cbc2330e3c 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/materials.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/materials.yml @@ -148,9 +148,7 @@ entity_storage: !type:NestedSelector tableId: RandomMaterialCrateTable rolls: !type:RangeNumberSelector - range: 1, 3 - # for some reason, the selector here adds 1 to whatever value it generates, - # so this is actually 2-4 + range: 2, 4 - type: entity id: CrateMaterialSilo diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 202a0ebc29..ccf39b2893 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -361,3 +361,14 @@ amount: 2 - id: BoxCandleSmall amount: 2 + +- type: entity + parent: CrateGenericSteel + id: CrateServiceColorfulLights + name: colorful lights crate + description: It's not a party until it's hard to see, a little disorienting, and your ears hurt. + components: + - type: StorageFill + contents: + - id: BoxLightbulbColorfulMixed + - id: BoxLighttubeColorfulMixed diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/cables.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/cables.yml new file mode 100644 index 0000000000..7684c84897 --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/cables.yml @@ -0,0 +1,61 @@ +- type: entity + parent: MarkerBase + id: RandomCableHVSpawner + name: HV power cable spawner + suffix: 50% + components: + - type: Sprite + layers: + - state: red + - sprite: Structures/Power/Cables/hv_cable.rsi + state: hvcable_3 + - sprite: Structures/Power/Cables/hv_cable.rsi + state: hvcable_12 + - type: RandomSpawner + prototypes: + - CableHV + chance: 0.5 + +- type: entity + parent: MarkerBase + id: RandomCableMVSpawner + name: MV power cable spawner + suffix: 50% + components: + - type: Sprite + layers: + - state: red + - sprite: Structures/Power/Cables/mv_cable.rsi + state: mvcable_3 + color: Yellow + - sprite: Structures/Power/Cables/mv_cable.rsi + state: mvstripes_3 + - sprite: Structures/Power/Cables/mv_cable.rsi + state: mvcable_12 + color: Yellow + - sprite: Structures/Power/Cables/mv_cable.rsi + state: mvstripes_12 + - type: RandomSpawner + prototypes: + - CableMV + chance: 0.5 + +- type: entity + parent: MarkerBase + id: RandomCableApcExtensionSpawner + name: LV power cable spawner + suffix: 50% + components: + - type: Sprite + layers: + - state: red + - sprite: Structures/Power/Cables/lv_cable.rsi + state: lvcable_3 + color: Green + - sprite: Structures/Power/Cables/lv_cable.rsi + state: lvcable_12 + color: Green + - type: RandomSpawner + prototypes: + - CableApcExtension + chance: 0.5 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml index 14852de558..31f15ffad0 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml @@ -24,6 +24,138 @@ chance: 0.7 offset: 0.0 +- type: entityTable + id: LowValueInstrumentCrateTable + table: !type:GroupSelector + children: + - id: CrateFunInstrumentsVariety + - id: CrateFunInstrumentsBrass + - id: CrateFunInstrumentsString + - id: CrateFunInstrumentsWoodwind + - id: CrateFunInstrumentsKeyedPercussion + - id: CrateFunInstrumentsSpecial + weight: 0.01 + - id: CrateFunSadTromboneImplants + weight: 0.01 + +- type: entityTable + id: LowValueFunCrateTable + table: !type:GroupSelector + children: + - id: CrateFunPlushie + weight: 2 + - id: CrateFunLizardPlushieBulk + - id: CrateFunSharkPlushieBulk + - id: CrateCandles + - id: CrateFunArtSupplies + - id: CrateFunFoamGuns + weight: 0.01 + +- type: entityTable + id: LowValueMaterialCrateTable + table: !type:GroupSelector + children: + - id: CrateMaterialGlass + - id: CrateMaterialSteel + - id: CrateMaterialPlastic + - id: CrateMaterialWood + - id: CrateMaterialPlasteel + - id: CrateMaterialBasicResource + - id: CrateMaterialRandom + weight: 4 + +- type: entityTable + id: LowValueEmergencyCrateTable + table: !type:GroupSelector + children: + - id: CrateEmergencyFire + - id: CrateEmergencyInternals + - id: CrateEmergencyInflatablewall + weight: 0.5 + +- type: entityTable + id: LowValueServiceCrateTable + table: !type:GroupSelector + children: + - id: CrateServiceColorfulLights + - id: CrateServiceReplacementLights + - id: CrateServiceBureaucracy + - id: PetCarrier + - id: CrateHydroponicsTools + - id: CrateHydroponicsSeeds + - id: CrateHydroponicsSeedsExotic + weight: 0.5 + - id: CrateHydroponicsSeedsMedicinal + weight: 0.5 + - id: CrateServiceJanitorialSupplies + - id: JanitorialTrolley + weight: 0.2 + +- type: entityTable + id: LowValueEngineeringCrateTable + table: !type:GroupSelector + children: + - id: CrateEngineeringCableLV + - id: CrateEngineeringCableMV + - id: CrateEngineeringCableHV + - id: CrateEngineeringCableBulk + - id: CrateTechBoardRandom + - id: CrateEngineeringSpaceHeater + - id: StorageCanister + weight: 0.5 + +- type: entityTable + id: LowValueMedicalCrateTable + table: !type:GroupSelector + children: + - id: CrateEmergencyBurnKit + - id: CrateEmergencyToxinKit + - id: CrateEmergencyBruteKit + - id: CrateEmergencyO2Kit + - id: CrateEmergencyRadiationKit + - id: CrateBodyBags + - id: CrateChemistrySupplies + - id: CrateChemistryP + weight: 0.5 + - id: CrateChemistryS + weight: 0.5 + - id: CrateChemistryD + weight: 0.5 + +- type: entityTable + id: LowValueScienceCrateTable + table: !type:GroupSelector + children: + - id: CrateArtifactContainer + - id: HandheldArtifactContainer + weight: 0.2 + - id: CrateMaterialPlasma + +- type: entityTable + id: LowValueCrateTable + table: !type:GroupSelector + children: + - !type:NestedSelector + tableId: LowValueFunCrateTable + - !type:NestedSelector + tableId: LowValueInstrumentCrateTable + weight: 0.2 + - !type:NestedSelector + tableId: LowValueMaterialCrateTable + weight: 2 + - !type:NestedSelector + tableId: LowValueEmergencyCrateTable + - !type:NestedSelector + tableId: LowValueServiceCrateTable + - !type:NestedSelector + tableId: LowValueEngineeringCrateTable + - !type:NestedSelector + tableId: LowValueMedicalCrateTable + weight: 0.2 + - !type:NestedSelector + tableId: LowValueScienceCrateTable + weight: 0.2 + - type: entity name: Filled Crate Spawner id: CrateFilledSpawner @@ -35,34 +167,10 @@ - state: red - sprite: Structures/Storage/Crates/o2.rsi state: icon - - type: RandomSpawner - prototypes: - - CrateServiceReplacementLights - - CrateServiceBureaucracy - - CrateChemistrySupplies - - CrateMaterialGlass - - CrateMaterialSteel - - CrateMaterialPlastic - - CrateMaterialWood - - CrateMaterialPlasteel - - CrateMaterialRandom - - CrateFunArtSupplies - - CrateEngineeringCableLV - - CrateEngineeringCableMV - - CrateEngineeringCableHV - - CrateEngineeringCableBulk - - CrateTechBoardRandom - - CrateEmergencyFire - - CrateEmergencyInternals - - CrateEmergencyInflatablewall - - CrateHydroponicsTools - - CrateHydroponicsSeeds - - PetCarrier - chance: 0.7 - rarePrototypes: - - CrateMaterialPlasma - - CrateHydroponicsSeedsExotic - rareChance: 0.1 + - type: EntityTableSpawner + table: !type:NestedSelector + tableId: LowValueCrateTable + prob: 0.8 offset: 0.0 - type: entity @@ -139,3 +247,30 @@ - CrateSecurityBiosuit chance: 0.9 offset: 0.0 + +- type: entityTable + id: LockboxTable + table: !type:GroupSelector + children: + - id: CrateLockBoxEngineering + - id: CrateLockBoxMedical + - id: CrateLockBoxSecurity + - id: CrateLockBoxScience + - id: CrateLockBoxService + +- type: entity + name: random lockbox spawner + id: LootSpawnerRandomLockbox + parent: MarkerBase + suffix: 90% + components: + - type: Sprite + layers: + - state: red + - sprite: Structures/Storage/Crates/lockbox.rsi + state: icon + - type: EntityTableSpawner + table: !type:NestedSelector + tableId: LockboxTable + prob: 0.9 + offset: 0.0 diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index f75fa2584e..6176b6b2ea 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -104,6 +104,14 @@ - type: AccessReader access: [["Service"]] +- type: entity + parent: DoorElectronics + id: DoorElectronicsServiceTheatre + suffix: Service, Theatre, Locked + components: + - type: AccessReader + access: [["Service"], ["Theatre"]] + # Cargo - type: entity parent: DoorElectronics diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 1043ad5b8e..9847bdec2d 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -28,6 +28,15 @@ containers: board: [ DoorElectronicsTheatre ] +- type: entity + parent: AirlockServiceLocked + id: AirlockServiceTheatreLocked + suffix: Service, Theatre, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsServiceTheatre ] + - type: entity parent: AirlockServiceLocked id: AirlockChapelLocked @@ -470,6 +479,15 @@ containers: board: [ DoorElectronicsTheatre ] +- type: entity + parent: AirlockServiceGlassLocked + id: AirlockServiceTheatreGlassLocked + suffix: Service, Theatre, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsServiceTheatre ] + - type: entity parent: AirlockServiceGlassLocked id: AirlockBarGlassLocked @@ -988,6 +1006,15 @@ containers: board: [ DoorElectronicsTheatre ] +- type: entity + parent: AirlockMaintServiceLocked + id: AirlockMaintServiceTheatreLocked + suffix: Service, Theatre, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsServiceTheatre ] + - type: entity parent: AirlockMaintServiceLocked id: AirlockMaintKitchenLocked From 435affce7e02f7c6c1ab84e433a95303d03992ed Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 17:43:03 +0000 Subject: [PATCH 601/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7586bfc0ce..f9ffb36be5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Winkarst-cpu - changes: - - message: Now items from the storage implant drop on the floor upon gibbing of - the owner. - type: Tweak - id: 7831 - time: '2025-01-19T19:48:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33493 - author: ArtisticRoomba changes: - message: Voxes can now honk, weh, and hew if forced to by a reagent. @@ -3931,3 +3923,10 @@ id: 8332 time: '2025-04-24T14:32:11.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36392 +- author: Southbridge + changes: + - message: Colorful Light Crates have been added and can be ordered. + type: Add + id: 8333 + time: '2025-04-24T17:41:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36750 From 6a567cbcb8df760319646399d5b83cb66ebc2278 Mon Sep 17 00:00:00 2001 From: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Date: Thu, 24 Apr 2025 14:24:07 -0400 Subject: [PATCH 602/622] Amber Station - Silo (#36764) --- Resources/Maps/amber.yml | 2591 +++++++++++++++++++++++--------------- 1 file changed, 1554 insertions(+), 1037 deletions(-) diff --git a/Resources/Maps/amber.yml b/Resources/Maps/amber.yml index 70b3d93090..cb8cb08e08 100644 --- a/Resources/Maps/amber.yml +++ b/Resources/Maps/amber.yml @@ -1,16 +1,15 @@ meta: format: 7 category: Map - engineVersion: 252.0.0 + engineVersion: 254.1.0 forkId: "" forkVersion: "" - time: 04/13/2025 23:55:39 - entityCount: 23697 + time: 04/20/2025 00:41:18 + entityCount: 23722 maps: - 1 grids: - 2 -- 23224 orphans: [] nullspace: [] tilemap: @@ -144,7 +143,7 @@ entities: version: 6 -2,0: ind: -2,0 - tiles: DgAAAAAAHAAAAAABHAAAAAAAHAAAAAACHAAAAAAAHAAAAAABHAAAAAAAHAAAAAABHAAAAAADHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAADgAAAAAADgAAAAAAHAAAAAAADgAAAAAADgAAAAAAHAAAAAABHAAAAAADHAAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAABDgAAAAAACQAAAAABDgAAAAAAHAAAAAAAHAAAAAADHAAAAAACHAAAAAAAHAAAAAABHAAAAAADHAAAAAACDgAAAAAAHAAAAAABHAAAAAAAHAAAAAABDgAAAAAAHAAAAAABDgAAAAAACQAAAAADDgAAAAAAHAAAAAAAHAAAAAADDgAAAAAAHAAAAAADHAAAAAABHAAAAAACHAAAAAABHAAAAAAAHAAAAAABHAAAAAACHAAAAAABDgAAAAAAHAAAAAACDgAAAAAACQAAAAABDgAAAAAACQAAAAAACQAAAAAADgAAAAAAHAAAAAAAHAAAAAACHAAAAAABHAAAAAADDgAAAAAAHAAAAAADHAAAAAABHAAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAAAHAAAAAABHAAAAAADHAAAAAAAHAAAAAADHAAAAAABHAAAAAADHAAAAAACDgAAAAAADgAAAAAADgAAAAAACQAAAAAAHAAAAAAALgAAAAAALAAAAAAADgAAAAAAHAAAAAABHAAAAAADHAAAAAADHAAAAAADDgAAAAAAHAAAAAACHAAAAAAAHAAAAAACDgAAAAAADgAAAAAADgAAAAAACQAAAAACDgAAAAAALAAAAAAALAAAAAAADgAAAAAAHAAAAAABHAAAAAAAHAAAAAABHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAADgAAAAAALAAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAADgAAAAAADgAAAAAAMwAAAAAAHAAAAAAAHAAAAAAAHAAAAAAAHAAAAAADDgAAAAAAIwAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAADgAAAAAAMwAAAAADMwAAAAABMwAAAAABHAAAAAAAHAAAAAADHAAAAAABHAAAAAACHAAAAAABIwAAAAABIwAAAAABIwAAAAABDgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAAMwAAAAADMwAAAAAAMwAAAAACHAAAAAABHAAAAAACHAAAAAAAHAAAAAABDgAAAAAAIwAAAAADIwAAAAACIwAAAAABDgAAAAAADgAAAAAADgAAAAAALwAAAAACDgAAAAAADgAAAAAAMwAAAAACMwAAAAACHAAAAAADHAAAAAADHAAAAAADHAAAAAABDgAAAAAAIwAAAAADIwAAAAACIwAAAAAADgAAAAAADgAAAAAADgAAAAAAAQAAAAACDgAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAACHAAAAAABHAAAAAADHAAAAAACDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAQAAAAACDgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAAAQAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAACQAAAAABCQAAAAADCQAAAAADCQAAAAADCQAAAAADDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAQAAAAAA + tiles: DgAAAAAAHAAAAAABHAAAAAAAHAAAAAACHAAAAAAAHAAAAAABHAAAAAAAHAAAAAABHAAAAAADHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAADgAAAAAADgAAAAAAHAAAAAAADgAAAAAADgAAAAAAHAAAAAABHAAAAAADHAAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAABDgAAAAAAHAAAAAAAHAAAAAADHAAAAAACHAAAAAAAHAAAAAABHAAAAAADHAAAAAACDgAAAAAAHAAAAAABHAAAAAAAHAAAAAABDgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAAHAAAAAAAHAAAAAADDgAAAAAAHAAAAAADHAAAAAABHAAAAAACHAAAAAABHAAAAAAAHAAAAAABHAAAAAACHAAAAAABDgAAAAAADgAAAAAADgAAAAAACQAAAAABDgAAAAAACQAAAAAACQAAAAAADgAAAAAAHAAAAAAAHAAAAAACHAAAAAABHAAAAAADDgAAAAAAHAAAAAADHAAAAAABHAAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAAAHAAAAAABHAAAAAADHAAAAAAAHAAAAAADHAAAAAABHAAAAAADHAAAAAACDgAAAAAADgAAAAAADgAAAAAACQAAAAAAHAAAAAAALgAAAAAALAAAAAAADgAAAAAAHAAAAAABHAAAAAADHAAAAAADHAAAAAADDgAAAAAAHAAAAAACHAAAAAAAHAAAAAACDgAAAAAADgAAAAAADgAAAAAACQAAAAACDgAAAAAALAAAAAAALAAAAAAADgAAAAAAHAAAAAABHAAAAAAAHAAAAAABHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAADgAAAAAALAAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAADgAAAAAADgAAAAAAMwAAAAAAHAAAAAAAHAAAAAAAHAAAAAAAHAAAAAADDgAAAAAAIwAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAADgAAAAAAMwAAAAADMwAAAAABMwAAAAABHAAAAAAAHAAAAAADHAAAAAABHAAAAAACHAAAAAABIwAAAAABIwAAAAABIwAAAAABDgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAAMwAAAAADMwAAAAAAMwAAAAACHAAAAAABHAAAAAACHAAAAAAAHAAAAAABDgAAAAAAIwAAAAADIwAAAAACIwAAAAABDgAAAAAADgAAAAAADgAAAAAALwAAAAACDgAAAAAADgAAAAAAMwAAAAACMwAAAAACHAAAAAADHAAAAAADHAAAAAADHAAAAAABDgAAAAAAIwAAAAADIwAAAAACIwAAAAAADgAAAAAADgAAAAAADgAAAAAAAQAAAAACDgAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAACHAAAAAABHAAAAAADHAAAAAACDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAQAAAAACDgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAAHAAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAAAQAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAACQAAAAABCQAAAAADCQAAAAADCQAAAAADCQAAAAADDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAAQAAAAAA version: 6 -2,1: ind: -2,1 @@ -276,7 +275,7 @@ entities: version: 6 1,1: ind: 1,1 - tiles: HAAAAAACDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAADgAAAAAACQAAAAAACQAAAAAACQAAAAADCQAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAACQAAAAAADgAAAAAADgAAAAAACQAAAAAACQAAAAABCQAAAAABCQAAAAADCQAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAACQAAAAABCQAAAAAACQAAAAADDgAAAAAACQAAAAACCQAAAAAACQAAAAABCQAAAAABCQAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAHgAAAAAAHgAAAAAADgAAAAAACQAAAAADCQAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAABCQAAAAABCQAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAACQAAAAAACQAAAAABCQAAAAADBAAAAAABCQAAAAACCQAAAAADCQAAAAADGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAACQAAAAADCQAAAAACCQAAAAABRwAAAAABRwAAAAABCQAAAAACCQAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAAGwAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADCQAAAAACDgAAAAAADgAAAAAADgAAAAAACQAAAAACCQAAAAACDgAAAAAALAAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAALAAAAAAADgAAAAAACQAAAAAACQAAAAACDgAAAAAADgAAAAAABAAAAAACCQAAAAABCQAAAAABDgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAACQAAAAABCQAAAAACDgAAAAAADgAAAAAADgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAADgAAAAAALAAAAAAALAAAAAAALgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAAGwAAAAAALAAAAAAALgAAAAAALgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAADgAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAADgAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAADgAAAAAALAAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAA + tiles: HAAAAAACDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADDgAAAAAADgAAAAAACQAAAAAACQAAAAAACQAAAAADCQAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAAACQAAAAAADgAAAAAADgAAAAAACQAAAAAACQAAAAABCQAAAAABCQAAAAADCQAAAAABDgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAACQAAAAABCQAAAAAACQAAAAADDgAAAAAACQAAAAACCQAAAAAACQAAAAABCQAAAAABCQAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAHgAAAAAAHgAAAAAADgAAAAAACQAAAAADCQAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAABCQAAAAABCQAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAACQAAAAAACQAAAAABCQAAAAADBAAAAAABCQAAAAACCQAAAAADCQAAAAADGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAAGwAAAAAACQAAAAADCQAAAAACCQAAAAABRwAAAAABRwAAAAABCQAAAAACCQAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAAGwAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAACQAAAAADCQAAAAACDgAAAAAADgAAAAAADgAAAAAACQAAAAACCQAAAAACDgAAAAAALAAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAALAAAAAAADgAAAAAACQAAAAAACQAAAAACDgAAAAAADgAAAAAABAAAAAACCQAAAAABCQAAAAABDgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAACQAAAAABCQAAAAACDgAAAAAADgAAAAAADgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAADgAAAAAADgAAAAAADgAAAAAADgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALgAAAAAALAAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAADgAAAAAALAAAAAAALAAAAAAALgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALAAAAAAADgAAAAAADgAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAAGwAAAAAALAAAAAAALgAAAAAALgAAAAAAGwAAAAAAGwAAAAAADgAAAAAALgAAAAAALAAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAAGwAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAADgAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAADgAAAAAADgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAADgAAAAAALAAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAA version: 6 1,2: ind: 1,2 @@ -556,6 +555,11 @@ entities: 18619: 26,-5 20038: -46,-57 20039: -48,-57 + 20696: 32,-30 + 20697: 33,-30 + 20698: 34,-30 + 20699: 35,-30 + 20721: 11,17 - node: zIndex: 1 color: '#FFFFFFFF' @@ -3269,9 +3273,6 @@ entities: 11476: 24,-32 11477: 23,-32 11478: 22,-32 - 11479: 33,-31 - 11480: 33,-30 - 11481: 34,-30 11504: 34,-42 11505: 34,-41 11506: 33,-41 @@ -3496,7 +3497,6 @@ entities: 12443: 30,-30 12444: 29,-30 12445: 28,-30 - 12447: 33,-31 12449: 35,-33 12450: 34,-35 12451: 35,-35 @@ -3758,8 +3758,6 @@ entities: 14445: -20,-55 14446: -20,-56 14447: -9,-55 - 14453: 33,-32 - 14454: 34,-32 14455: 34,-31 14461: 32,-26 14462: 37,-26 @@ -5251,6 +5249,10 @@ entities: 20616: 35,-43 20617: 32,-46 20618: 32,-47 + 20704: 30,-32 + 20705: 29,-32 + 20706: 33,-32 + 20707: 33,-31 - node: cleanable: True zIndex: 1 @@ -5461,7 +5463,6 @@ entities: 14416: 17,-56 14417: 16,-56 14418: 15,-56 - 14456: 34,-32 14457: 35,-31 14464: 39,-28 14509: 33,-3 @@ -7192,7 +7193,6 @@ entities: 20645: 29,-34 20646: 29,-36 20647: 30,-31 - 20648: 29,-32 20649: 27,-31 20650: 28,-30 20651: 29,-29 @@ -7201,7 +7201,6 @@ entities: 20654: 27,-25 20655: 32,-31 20656: 34,-31 - 20657: 33,-32 20658: 36,-32 20659: 37,-32 20660: 34,-34 @@ -7213,6 +7212,18 @@ entities: 20666: 34,-39 20667: 35,-37 20668: 34,-37 + 20708: 28,-32 + 20709: 29,-31 + 20710: 34,-32 + 20711: 33,-30 + 20712: 32,-30 + 20713: 34,-30 + 20714: 35,-30 + 20715: 35,-31 + 20716: 32,-32 + 20717: 32,-31 + 20718: 29,-27 + 20719: 34,-32 - node: cleanable: True zIndex: 5 @@ -9125,9 +9136,9 @@ entities: id: HalfTileOverlayGreyscale180 decals: 11246: 28,-32 - 11247: 29,-32 11274: 23,-32 11275: 24,-32 + 20703: 29,-32 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 @@ -9465,9 +9476,8 @@ entities: 11282: 25,-26 11286: 35,-35 11293: 33,-37 - 11301: 34,-30 - 11302: 32,-30 11303: 32,-31 + 20700: 33,-31 - node: zIndex: 1 color: '#D381C996' @@ -9481,7 +9491,6 @@ entities: 9638: 32,-38 9731: 21,-28 9749: 34,-39 - 14452: 34,-32 - node: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale @@ -9784,9 +9793,9 @@ entities: 11265: 22,-32 11280: 24,-26 11304: 32,-32 - 11309: 33,-31 11314: 27,-40 11315: 29,-40 + 20720: 33,-32 - node: zIndex: 1 color: '#D381C996' @@ -9922,8 +9931,7 @@ entities: 11285: 34,-36 11295: 35,-32 11296: 35,-31 - 11297: 35,-30 - 11300: 33,-30 + 20701: 34,-31 - node: zIndex: 1 color: '#D381C996' @@ -10172,13 +10180,7 @@ entities: id: ThreeQuarterTileOverlayGreyscale180 decals: 11244: 27,-30 - 11250: 30,-32 - - node: - zIndex: 1 - color: '#D381C996' - id: ThreeQuarterTileOverlayGreyscale180 - decals: - 14451: 33,-32 + 20702: 30,-32 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale270 @@ -10324,6 +10326,7 @@ entities: id: WarnCornerSmallGreyscaleNE decals: 9920: 9,12 + 20727: 10,16 - node: zIndex: 1 color: '#FFFFFFFF' @@ -10342,6 +10345,7 @@ entities: id: WarnCornerSmallGreyscaleNW decals: 9919: 13,12 + 20728: 12,16 - node: cleanable: True zIndex: 1 @@ -10360,6 +10364,7 @@ entities: id: WarnCornerSmallGreyscaleSE decals: 10985: -5,-5 + 20729: 10,18 - node: zIndex: 1 color: '#FFFFFFFF' @@ -10384,6 +10389,7 @@ entities: id: WarnCornerSmallGreyscaleSW decals: 10986: -1,-5 + 20726: 12,18 - node: cleanable: True zIndex: 1 @@ -10539,6 +10545,7 @@ entities: 15942: -46,-45 15943: -46,-46 15944: -46,-47 + 20722: 10,17 - node: cleanable: True zIndex: 1 @@ -10566,6 +10573,7 @@ entities: 9917: 12,12 11424: 34,-34 11425: 35,-34 + 20723: 11,16 - node: zIndex: 1 color: '#FFFFFFFF' @@ -10601,6 +10609,7 @@ entities: 10980: -3,-5 10981: -2,-5 11427: 20,-28 + 20725: 11,18 - node: zIndex: 1 color: '#FFFFFFFF' @@ -10633,6 +10642,7 @@ entities: 15938: -46,-44 15939: -46,-45 15940: -46,-47 + 20724: 12,17 - node: cleanable: True zIndex: 1 @@ -12410,7 +12420,8 @@ entities: 3: 32768 -1,-8: 3: 51 - 0: 63500 + 0: 61452 + 4: 2048 -1,-6: 0: 65535 -1,-5: @@ -12471,9 +12482,9 @@ entities: 0,-12: 0: 62991 0,-11: - 0: 65286 + 0: 64262 0,-10: - 0: 64399 + 0: 64395 0,-9: 0: 48056 -4,-16: @@ -12592,8 +12603,8 @@ entities: -3,4: 0: 47283 -2,1: - 4: 273 - 5: 1092 + 5: 273 + 6: 1092 -2,2: 0: 65280 1: 10 @@ -12618,7 +12629,7 @@ entities: 1: 3328 2: 512 0,1: - 6: 273 + 7: 273 2: 3276 0,2: 0: 65280 @@ -13669,7 +13680,7 @@ entities: 4,7: 0: 823 2: 12288 - 1: 16384 + 1: 16392 4,8: 2: 307 1: 16068 @@ -13874,6 +13885,12 @@ entities: 0: 30711 5,5: 0: 61424 + 5,7: + 2: 39 + 1: 16 + 5,6: + 1: 4096 + 2: 8192 6,5: 0: 36848 6,6: @@ -14132,7 +14149,7 @@ entities: 11,5: 0: 44799 11,6: - 0: 170 + 0: 2730 12,4: 0: 61440 1: 68 @@ -14851,6 +14868,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.14975 + moles: + - 20.078888 + - 75.53487 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -14900,68 +14932,6 @@ entities: - type: GasTileOverlay - type: RadiationGridResistance - type: NavMap - - type: Joint - joints: - docking284: !type:WeldJoint - bodyB: 23224 - bodyA: 2 - id: docking284 - localAnchorB: 20,28.5 - localAnchorA: 19,28.5 - damping: 33.955006 - stiffness: 304.77945 - - uid: 23224 - components: - - type: MetaData - name: grid - - type: Transform - pos: -1.5,9.5 - parent: 1 - - type: MapGrid - chunks: - 1,1: - ind: 1,1 - tiles: LgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALAAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAADgAAAAAALAAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALAAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAALgAAAAAA - version: 6 - - type: Broadphase - - type: Physics - bodyStatus: InAir - angularDamping: 0.05 - linearDamping: 0.05 - fixedRotation: False - bodyType: Dynamic - - type: Fixtures - fixtures: {} - - type: OccluderTree - - type: SpreaderGrid - - type: Shuttle - - type: GridPathfinding - - type: Gravity - gravityShakeSound: !type:SoundPathSpecifier - path: /Audio/Effects/alert.ogg - - type: DecalGrid - chunkCollection: - version: 2 - nodes: [] - - type: RadiationGridResistance - - type: GridAtmosphere - version: 2 - data: - chunkSize: 4 - - type: GasTileOverlay - - type: IFF - flags: HideLabel - - type: NavMap - - type: Joint - joints: - docking284: !type:WeldJoint - bodyB: 23224 - bodyA: 2 - id: docking284 - localAnchorB: 20,28.5 - localAnchorA: 19,28.5 - damping: 33.95499 - stiffness: 304.7793 - proto: AcousticGuitarInstrument entities: - uid: 10313 @@ -17172,7 +17142,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9151: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 187 components: - type: Transform @@ -17182,7 +17153,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6660: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 197 components: - type: Transform @@ -17192,7 +17164,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9149: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 216 components: - type: Transform @@ -17202,7 +17175,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9150: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 2544 components: - type: Transform @@ -17248,9 +17222,11 @@ entities: - type: DeviceLinkSource linkedPorts: 23150: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 22563: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1479 components: - type: Transform @@ -17262,7 +17238,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1480: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1480 components: - type: Transform @@ -17273,7 +17250,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1479: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 6101 components: - type: Transform @@ -17285,7 +17263,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23144: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22563 components: - type: Transform @@ -17296,7 +17275,8 @@ entities: - type: DeviceLinkSource linkedPorts: 23150: - - DoorStatus: Open + - - DoorStatus + - Open - uid: 23144 components: - type: Transform @@ -17307,7 +17287,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6101: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 23150 components: - type: Transform @@ -17319,7 +17300,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22563: - - DoorStatus: Open + - - DoorStatus + - Open - proto: AirlockExternalGlassCargoLocked entities: - uid: 1067 @@ -17333,7 +17315,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12340: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 1722 components: - type: Transform @@ -17345,7 +17328,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22491: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 1756 components: - type: Transform @@ -17357,7 +17341,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22393: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 2672 components: - type: Transform @@ -17369,7 +17354,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3910: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 20665 components: - type: Transform @@ -17381,7 +17367,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22393: - - DoorStatus: InputA + - - DoorStatus + - InputA - uid: 21849 components: - type: Transform @@ -17393,7 +17380,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22491: - - DoorStatus: InputB + - - DoorStatus + - InputB - proto: AirlockExternalGlassCommandLocked entities: - uid: 97 @@ -17406,7 +17394,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5124: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 498 components: - type: Transform @@ -17417,7 +17406,8 @@ entities: - type: DeviceLinkSource linkedPorts: 617: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 617 components: - type: Transform @@ -17428,7 +17418,8 @@ entities: - type: DeviceLinkSource linkedPorts: 498: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5124 components: - type: Transform @@ -17439,7 +17430,8 @@ entities: - type: DeviceLinkSource linkedPorts: 97: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 73 @@ -17453,7 +17445,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3167: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 3167 components: - type: Transform @@ -17465,7 +17458,8 @@ entities: - type: DeviceLinkSource linkedPorts: 73: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8794 components: - type: Transform @@ -17476,7 +17470,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8795: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8795 components: - type: Transform @@ -17487,7 +17482,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8794: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8924 components: - type: Transform @@ -17499,7 +17495,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17960: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 16736 components: - type: Transform @@ -17511,7 +17508,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16892: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 16892 components: - type: Transform @@ -17523,7 +17521,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16736: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 17960 components: - type: Transform @@ -17534,7 +17533,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8924: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassLocked entities: - uid: 294 @@ -17548,9 +17548,11 @@ entities: - type: DeviceLinkSource linkedPorts: 938: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 21958: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 862 components: - type: Transform @@ -17562,7 +17564,8 @@ entities: - type: DeviceLinkSource linkedPorts: 19896: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 938 components: - type: Transform @@ -17574,9 +17577,11 @@ entities: - type: DeviceLinkSource linkedPorts: 21958: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt 13412: - - DoorStatus: InputB + - - DoorStatus + - InputB - uid: 3999 components: - type: Transform @@ -17587,7 +17592,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4672: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4043 components: - type: Transform @@ -17598,7 +17604,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4295: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4295 components: - type: Transform @@ -17609,7 +17616,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4043: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4729 components: - type: Transform @@ -17620,7 +17628,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3682: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4772 components: - type: Transform @@ -17631,7 +17640,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3636: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4773 components: - type: Transform @@ -17642,7 +17652,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4673: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5184 components: - type: Transform @@ -17653,7 +17664,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6115: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 5764 components: - type: Transform @@ -17664,7 +17676,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6166: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8579 components: - type: Transform @@ -17676,7 +17689,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8851: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 8740 components: - type: Transform @@ -17688,7 +17702,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21929: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 11974 components: - type: Transform @@ -17700,7 +17715,8 @@ entities: - type: DeviceLinkSource linkedPorts: 22090: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13406 components: - type: Transform @@ -17711,7 +17727,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14421: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 13550 components: - type: Transform @@ -17722,7 +17739,8 @@ entities: - type: DeviceLinkSource linkedPorts: 14497: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14421 components: - type: Transform @@ -17733,7 +17751,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13406: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 14497 components: - type: Transform @@ -17744,7 +17763,8 @@ entities: - type: DeviceLinkSource linkedPorts: 13550: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 19896 components: - type: Transform @@ -17755,7 +17775,8 @@ entities: - type: DeviceLinkSource linkedPorts: 862: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21863 components: - type: Transform @@ -17767,7 +17788,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3850: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21912 components: - type: Transform @@ -17779,7 +17801,8 @@ entities: - type: DeviceLinkSource linkedPorts: 936: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 21958 components: - type: Transform @@ -17791,9 +17814,11 @@ entities: - type: DeviceLinkSource linkedPorts: 13412: - - DoorStatus: InputA + - - DoorStatus + - InputA 938: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 22090 components: - type: Transform @@ -17804,7 +17829,8 @@ entities: - type: DeviceLinkSource linkedPorts: 11974: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - proto: AirlockExternalGlassShuttleArrivals entities: - uid: 12786 @@ -17842,7 +17868,8 @@ entities: - type: DeviceLinkSource linkedPorts: 187: - - DockStatus: Open + - - DockStatus + - Open - type: DeviceLinkSink invokeCounter: 3 - uid: 9149 @@ -17854,7 +17881,8 @@ entities: - type: DeviceLinkSource linkedPorts: 197: - - DockStatus: Open + - - DockStatus + - Open - type: DeviceLinkSink invokeCounter: 3 - uid: 9150 @@ -17866,7 +17894,8 @@ entities: - type: DeviceLinkSource linkedPorts: 216: - - DockStatus: Open + - - DockStatus + - Open - type: DeviceLinkSink invokeCounter: 5 - uid: 9151 @@ -17878,7 +17907,8 @@ entities: - type: DeviceLinkSource linkedPorts: 183: - - DockStatus: Open + - - DockStatus + - Open - type: DeviceLinkSink invokeCounter: 3 - proto: AirlockExternalGlassShuttleEscape @@ -17905,6 +17935,12 @@ entities: parent: 2 - proto: AirlockExternalGlassShuttleLocked entities: + - uid: 102 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,28.5 + parent: 2 - uid: 936 components: - type: Transform @@ -17914,9 +17950,12 @@ entities: - type: DeviceLinkSource linkedPorts: 22300: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 3636 @@ -17928,9 +17967,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5120: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 3682 @@ -17942,9 +17984,12 @@ entities: - type: DeviceLinkSource linkedPorts: 3802: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 3850 @@ -17956,9 +18001,12 @@ entities: - type: DeviceLinkSource linkedPorts: 509: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 4672 @@ -17970,9 +18018,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5252: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 4673 @@ -17984,28 +18035,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5121: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - - uid: 5486 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 18.5,28.5 - parent: 2 - - type: Door - changeAirtight: False - - type: Docking - dockJointId: docking284 - dockedWith: 23225 - - type: DeviceLinkSource - lastSignals: - DoorStatus: False - DockStatus: True - - type: DeviceLinkSink - invokeCounter: 2 - uid: 6115 components: - type: Transform @@ -18014,9 +18051,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5127: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 6166 @@ -18027,9 +18067,12 @@ entities: - type: DeviceLinkSource linkedPorts: 5123: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 - uid: 8851 @@ -18041,11 +18084,20 @@ entities: - type: DeviceLinkSource linkedPorts: 22302: - - DoorStatus: InputA - - DockStatus: InputA - - DockStatus: InputB + - - DoorStatus + - InputA + - - DockStatus + - InputA + - - DockStatus + - InputB - type: DeviceLinkSink invokeCounter: 1 + - uid: 12492 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 20.5,28.5 + parent: 2 - uid: 21929 components: - type: Transform @@ -18055,26 +18107,14 @@ entities: - type: DeviceLinkSource linkedPorts: 22301: - - DoorStatus: InputA - - DockStatus: InputB - - DockStatus: InputA + - - DoorStatus + - InputA + - - DockStatus + - InputB + - - DockStatus + - InputA - type: DeviceLinkSink invokeCounter: 1 - - uid: 23225 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 20.5,28.5 - parent: 23224 - - type: Door - changeAirtight: False - - type: Docking - dockJointId: docking284 - dockedWith: 5486 - - type: DeviceLinkSource - lastSignals: - DoorStatus: False - DockStatus: True - proto: AirlockFreezerLocked entities: - uid: 2608 @@ -18522,9 +18562,12 @@ entities: - type: DeviceLinkSource linkedPorts: 20223: - - DoorStatus: InputA - - DockStatus: InputB - - DockStatus: InputA + - - DoorStatus + - InputA + - - DockStatus + - InputB + - - DockStatus + - InputA - type: DeviceLinkSink invokeCounter: 1 - uid: 12340 @@ -18536,9 +18579,12 @@ entities: - type: DeviceLinkSource linkedPorts: 20224: - - DoorStatus: InputA - - DockStatus: InputB - - DockStatus: InputA + - - DoorStatus + - InputA + - - DockStatus + - InputB + - - DockStatus + - InputA - type: DeviceLinkSink invokeCounter: 1 - proto: AirlockHeadOfPersonnelLocked @@ -19037,16 +19083,18 @@ entities: - type: Transform pos: 16.5,-53.5 parent: 2 - - uid: 13749 - components: - - type: Transform - pos: 2.5,-40.5 - parent: 2 - uid: 15854 components: - type: Transform pos: 0.5,-30.5 parent: 2 +- proto: AirlockMaintServiceTheatreLocked + entities: + - uid: 302 + components: + - type: Transform + pos: 2.5,-40.5 + parent: 2 - proto: AirlockMedicalGlassLocked entities: - uid: 506 @@ -19367,11 +19415,6 @@ entities: parent: 2 - proto: AirlockServiceGlassLocked entities: - - uid: 465 - components: - - type: Transform - pos: -0.5,-40.5 - parent: 2 - uid: 3745 components: - type: Transform @@ -19382,6 +19425,13 @@ entities: - type: Transform pos: 20.5,-40.5 parent: 2 +- proto: AirlockServiceTheatreGlassLocked + entities: + - uid: 465 + components: + - type: Transform + pos: -0.5,-40.5 + parent: 2 - proto: AirlockTheatreLocked entities: - uid: 643 @@ -19426,7 +19476,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4603: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4603 components: - type: Transform @@ -19437,7 +19488,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4185: - - DoorStatus: DoorBolt + - - DoorStatus + - DoorBolt - uid: 4653 components: - type: Transform @@ -21431,6 +21483,11 @@ entities: - type: Transform pos: 63.5,7.5 parent: 2 + - uid: 941 + components: + - type: Transform + pos: 21.5,28.5 + parent: 2 - uid: 1171 components: - type: Transform @@ -22966,6 +23023,26 @@ entities: - type: Transform pos: 1.5,2.5 parent: 2 + - uid: 12486 + components: + - type: Transform + pos: 20.5,28.5 + parent: 2 + - uid: 12502 + components: + - type: Transform + pos: 21.5,29.5 + parent: 2 + - uid: 12503 + components: + - type: Transform + pos: 21.5,27.5 + parent: 2 + - uid: 12539 + components: + - type: Transform + pos: 22.5,28.5 + parent: 2 - uid: 13121 components: - type: Transform @@ -27786,11 +27863,6 @@ entities: - type: Transform pos: 32.5,-60.5 parent: 2 - - uid: 23226 - components: - - type: Transform - pos: 20.5,28.5 - parent: 23224 - uid: 23423 components: - type: Transform @@ -29220,9 +29292,12 @@ entities: - type: DeviceLinkSource linkedPorts: 499: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - uid: 8002 components: - type: Transform @@ -29232,9 +29307,12 @@ entities: - type: DeviceLinkSource linkedPorts: 503: - - Start: Close - - Timer: AutoClose - - Timer: Open + - - Start + - Close + - - Timer + - AutoClose + - - Timer + - Open - proto: BrokenBottle entities: - uid: 7399 @@ -31521,6 +31599,11 @@ entities: - type: Transform pos: -19.5,27.5 parent: 2 + - uid: 2890 + components: + - type: Transform + pos: -44.5,4.5 + parent: 2 - uid: 2892 components: - type: Transform @@ -31566,6 +31649,11 @@ entities: - type: Transform pos: -2.5,-6.5 parent: 2 + - uid: 2964 + components: + - type: Transform + pos: -42.5,7.5 + parent: 2 - uid: 2974 components: - type: Transform @@ -39416,21 +39504,6 @@ entities: - type: Transform pos: 44.5,11.5 parent: 2 - - uid: 18082 - components: - - type: Transform - pos: 45.5,11.5 - parent: 2 - - uid: 18083 - components: - - type: Transform - pos: 46.5,11.5 - parent: 2 - - uid: 18084 - components: - - type: Transform - pos: 47.5,11.5 - parent: 2 - uid: 18085 components: - type: Transform @@ -39441,21 +39514,6 @@ entities: - type: Transform pos: 46.5,8.5 parent: 2 - - uid: 18087 - components: - - type: Transform - pos: 47.5,8.5 - parent: 2 - - uid: 18088 - components: - - type: Transform - pos: 48.5,11.5 - parent: 2 - - uid: 18089 - components: - - type: Transform - pos: 48.5,8.5 - parent: 2 - uid: 18090 components: - type: Transform @@ -39911,16 +39969,6 @@ entities: - type: Transform pos: 55.5,-39.5 parent: 2 - - uid: 18720 - components: - - type: Transform - pos: 55.5,-40.5 - parent: 2 - - uid: 18721 - components: - - type: Transform - pos: 51.5,-40.5 - parent: 2 - uid: 18722 components: - type: Transform @@ -40886,11 +40934,6 @@ entities: - type: Transform pos: -40.5,-8.5 parent: 2 - - uid: 20549 - components: - - type: Transform - pos: -41.5,-8.5 - parent: 2 - uid: 20550 components: - type: Transform @@ -40906,11 +40949,6 @@ entities: - type: Transform pos: -44.5,-8.5 parent: 2 - - uid: 20554 - components: - - type: Transform - pos: -36.5,-8.5 - parent: 2 - uid: 20555 components: - type: Transform @@ -40946,16 +40984,6 @@ entities: - type: Transform pos: -44.5,-1.5 parent: 2 - - uid: 20564 - components: - - type: Transform - pos: -44.5,-0.5 - parent: 2 - - uid: 20565 - components: - - type: Transform - pos: -44.5,0.5 - parent: 2 - uid: 20566 components: - type: Transform @@ -40966,11 +40994,6 @@ entities: - type: Transform pos: -44.5,2.5 parent: 2 - - uid: 20568 - components: - - type: Transform - pos: -44.5,4.5 - parent: 2 - uid: 20569 components: - type: Transform @@ -40996,11 +41019,6 @@ entities: - type: Transform pos: -43.5,7.5 parent: 2 - - uid: 20574 - components: - - type: Transform - pos: -42.5,7.5 - parent: 2 - uid: 20575 components: - type: Transform @@ -43617,26 +43635,11 @@ entities: - type: Transform pos: 2.5,-36.5 parent: 2 - - uid: 608 - components: - - type: Transform - pos: -43.5,23.5 - parent: 2 - - uid: 609 - components: - - type: Transform - pos: -41.5,23.5 - parent: 2 - uid: 660 components: - type: Transform pos: -13.5,21.5 parent: 2 - - uid: 718 - components: - - type: Transform - pos: -42.5,23.5 - parent: 2 - uid: 767 components: - type: Transform @@ -43697,11 +43700,6 @@ entities: - type: Transform pos: -45.5,28.5 parent: 2 - - uid: 904 - components: - - type: Transform - pos: -48.5,11.5 - parent: 2 - uid: 905 components: - type: Transform @@ -43727,11 +43725,6 @@ entities: - type: Transform pos: -55.5,14.5 parent: 2 - - uid: 940 - components: - - type: Transform - pos: -52.5,14.5 - parent: 2 - uid: 949 components: - type: Transform @@ -43777,11 +43770,6 @@ entities: - type: Transform pos: -55.5,28.5 parent: 2 - - uid: 1193 - components: - - type: Transform - pos: -48.5,15.5 - parent: 2 - uid: 1194 components: - type: Transform @@ -44212,11 +44200,6 @@ entities: - type: Transform pos: -54.5,16.5 parent: 2 - - uid: 2459 - components: - - type: Transform - pos: -53.5,16.5 - parent: 2 - uid: 2491 components: - type: Transform @@ -44382,21 +44365,6 @@ entities: - type: Transform pos: -7.5,-53.5 parent: 2 - - uid: 2731 - components: - - type: Transform - pos: -52.5,16.5 - parent: 2 - - uid: 2732 - components: - - type: Transform - pos: -53.5,14.5 - parent: 2 - - uid: 2733 - components: - - type: Transform - pos: -54.5,14.5 - parent: 2 - uid: 2734 components: - type: Transform @@ -44477,21 +44445,6 @@ entities: - type: Transform pos: -45.5,29.5 parent: 2 - - uid: 2890 - components: - - type: Transform - pos: -54.5,25.5 - parent: 2 - - uid: 2964 - components: - - type: Transform - pos: -50.5,25.5 - parent: 2 - - uid: 2965 - components: - - type: Transform - pos: -46.5,25.5 - parent: 2 - uid: 2982 components: - type: Transform @@ -45385,7 +45338,7 @@ entities: - uid: 7061 components: - type: Transform - pos: -38.5,23.5 + pos: -42.5,23.5 parent: 2 - uid: 7096 components: @@ -45582,11 +45535,6 @@ entities: - type: Transform pos: -53.5,25.5 parent: 2 - - uid: 8334 - components: - - type: Transform - pos: -52.5,11.5 - parent: 2 - uid: 8352 components: - type: Transform @@ -47712,21 +47660,11 @@ entities: - type: Transform pos: -45.5,26.5 parent: 2 - - uid: 17767 - components: - - type: Transform - pos: -52.5,19.5 - parent: 2 - uid: 17768 components: - type: Transform pos: -55.5,10.5 parent: 2 - - uid: 17769 - components: - - type: Transform - pos: -48.5,19.5 - parent: 2 - uid: 17770 components: - type: Transform @@ -47737,11 +47675,6 @@ entities: - type: Transform pos: 65.5,0.5 parent: 2 - - uid: 17813 - components: - - type: Transform - pos: -75.5,-56.5 - parent: 2 - uid: 17818 components: - type: Transform @@ -47907,11 +47840,6 @@ entities: - type: Transform pos: 69.5,5.5 parent: 2 - - uid: 18150 - components: - - type: Transform - pos: -71.5,-56.5 - parent: 2 - uid: 18154 components: - type: Transform @@ -47967,11 +47895,6 @@ entities: - type: Transform pos: -52.5,20.5 parent: 2 - - uid: 18225 - components: - - type: Transform - pos: -52.5,15.5 - parent: 2 - uid: 18226 components: - type: Transform @@ -48082,6 +48005,11 @@ entities: - type: Transform pos: -68.5,-59.5 parent: 2 + - uid: 18720 + components: + - type: Transform + pos: -50.5,15.5 + parent: 2 - uid: 18726 components: - type: Transform @@ -48122,11 +48050,6 @@ entities: - type: Transform pos: -68.5,-56.5 parent: 2 - - uid: 18982 - components: - - type: Transform - pos: -67.5,-56.5 - parent: 2 - uid: 19025 components: - type: Transform @@ -48157,11 +48080,6 @@ entities: - type: Transform pos: -77.5,-54.5 parent: 2 - - uid: 20157 - components: - - type: Transform - pos: -76.5,-54.5 - parent: 2 - uid: 20158 components: - type: Transform @@ -48177,6 +48095,11 @@ entities: - type: Transform pos: -76.5,-50.5 parent: 2 + - uid: 20564 + components: + - type: Transform + pos: -63.5,-56.5 + parent: 2 - uid: 20696 components: - type: Transform @@ -48187,11 +48110,6 @@ entities: - type: Transform pos: -76.5,-52.5 parent: 2 - - uid: 20698 - components: - - type: Transform - pos: -75.5,-52.5 - parent: 2 - uid: 20699 components: - type: Transform @@ -48252,11 +48170,6 @@ entities: - type: Transform pos: -72.5,-52.5 parent: 2 - - uid: 20749 - components: - - type: Transform - pos: -71.5,-52.5 - parent: 2 - uid: 20750 components: - type: Transform @@ -48432,11 +48345,6 @@ entities: - type: Transform pos: -66.5,-52.5 parent: 2 - - uid: 21182 - components: - - type: Transform - pos: -67.5,-52.5 - parent: 2 - uid: 21183 components: - type: Transform @@ -48482,11 +48390,6 @@ entities: - type: Transform pos: -64.5,-52.5 parent: 2 - - uid: 21320 - components: - - type: Transform - pos: -63.5,-52.5 - parent: 2 - uid: 21321 components: - type: Transform @@ -48522,11 +48425,6 @@ entities: - type: Transform pos: -63.5,-57.5 parent: 2 - - uid: 21377 - components: - - type: Transform - pos: -63.5,-56.5 - parent: 2 - uid: 21378 components: - type: Transform @@ -48537,11 +48435,6 @@ entities: - type: Transform pos: -64.5,-54.5 parent: 2 - - uid: 21399 - components: - - type: Transform - pos: -63.5,-55.5 - parent: 2 - uid: 21401 components: - type: Transform @@ -49077,16 +48970,6 @@ entities: - type: Transform pos: -3.5,-9.5 parent: 2 - - uid: 23419 - components: - - type: Transform - pos: -4.5,-9.5 - parent: 2 - - uid: 23420 - components: - - type: Transform - pos: -4.5,-10.5 - parent: 2 - uid: 23421 components: - type: Transform @@ -49097,6 +48980,31 @@ entities: - type: Transform pos: -4.5,-12.5 parent: 2 + - uid: 23701 + components: + - type: Transform + pos: -67.5,-54.5 + parent: 2 + - uid: 23703 + components: + - type: Transform + pos: -50.5,23.5 + parent: 2 + - uid: 23708 + components: + - type: Transform + pos: 58.5,2.5 + parent: 2 + - uid: 23712 + components: + - type: Transform + pos: 62.5,2.5 + parent: 2 + - uid: 23715 + components: + - type: Transform + pos: 66.5,2.5 + parent: 2 - proto: CableHVStack entities: - uid: 3391 @@ -51003,11 +50911,6 @@ entities: - type: Transform pos: 16.5,-8.5 parent: 2 - - uid: 7929 - components: - - type: Transform - pos: 40.5,18.5 - parent: 2 - uid: 7949 components: - type: Transform @@ -65444,7 +65347,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4541: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + - - ArtifactAnalyzerSender + - ArtifactAnalyzerReceiver - proto: ComputerAtmosMonitoring entities: - uid: 2340 @@ -66241,11 +66145,6 @@ entities: - type: Transform pos: -2.5,23.5 parent: 2 - - uid: 17458 - components: - - type: Transform - pos: 9.5,20.5 - parent: 2 - uid: 18066 components: - type: Transform @@ -66296,11 +66195,6 @@ entities: - type: Transform pos: 32.5,15.5 parent: 2 - - uid: 23122 - components: - - type: Transform - pos: -0.5,-25.5 - parent: 2 - proto: CrateEngineering entities: - uid: 15897 @@ -66587,27 +66481,6 @@ entities: - type: Transform pos: -42.5,-39.5 parent: 2 -- proto: CrateLockBoxEngineering - entities: - - uid: 23688 - components: - - type: Transform - pos: -12.5,-15.5 - parent: 2 -- proto: CrateLockBoxMedical - entities: - - uid: 17135 - components: - - type: Transform - pos: -47.5,-27.5 - parent: 2 -- proto: CrateLockBoxScience - entities: - - uid: 23689 - components: - - type: Transform - pos: 30.5,-27.5 - parent: 2 - proto: CrateLockBoxSecurity entities: - uid: 23690 @@ -66634,6 +66507,31 @@ entities: - type: Transform pos: 39.5,-36.5 parent: 2 +- proto: CrateMaterialSilo + entities: + - uid: 939 + components: + - type: Transform + pos: 9.5,20.5 + parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - proto: CrateMedicalScrubs entities: - uid: 4274 @@ -66765,6 +66663,24 @@ entities: - type: Transform pos: -0.5,-29.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - uid: 13309 components: - type: Transform @@ -78036,7 +77952,7 @@ entities: - uid: 3205 components: - type: Transform - pos: 1.4228268,-29.25675 + pos: 1.512306,-29.339378 parent: 2 - proto: FoodBoxDonut entities: @@ -78298,7 +78214,7 @@ entities: - uid: 13164 components: - type: Transform - pos: -0.2445485,-29.114664 + pos: -0.63953733,-29.354218 parent: 2 - uid: 20052 components: @@ -78354,7 +78270,7 @@ entities: - uid: 13161 components: - type: Transform - pos: -0.69730604,-29.139143 + pos: -0.35320318,-29.193445 parent: 2 - uid: 20055 components: @@ -100742,11 +100658,6 @@ entities: - type: Transform pos: -33.5,-82.5 parent: 2 - - uid: 302 - components: - - type: Transform - pos: -18.5,3.5 - parent: 2 - uid: 309 components: - type: Transform @@ -101357,6 +101268,11 @@ entities: - type: Transform pos: -13.5,-61.5 parent: 2 + - uid: 2733 + components: + - type: Transform + pos: -44.5,0.5 + parent: 2 - uid: 2746 components: - type: Transform @@ -101835,7 +101751,6 @@ entities: - uid: 4138 components: - type: Transform - rot: -1.5707963267948966 rad pos: -0.5,-41.5 parent: 2 - uid: 4148 @@ -104358,11 +104273,6 @@ entities: - type: Transform pos: 49.5,-53.5 parent: 2 - - uid: 12989 - components: - - type: Transform - pos: -18.5,4.5 - parent: 2 - uid: 13032 components: - type: Transform @@ -104528,6 +104438,11 @@ entities: - type: Transform pos: 8.5,-41.5 parent: 2 + - uid: 13749 + components: + - type: Transform + pos: -18.5,3.5 + parent: 2 - uid: 13753 components: - type: Transform @@ -105438,6 +105353,11 @@ entities: - type: Transform pos: 66.5,11.5 parent: 2 + - uid: 17135 + components: + - type: Transform + pos: -18.5,4.5 + parent: 2 - uid: 17196 components: - type: Transform @@ -107338,11 +107258,6 @@ entities: - type: Transform pos: -44.5,1.5 parent: 2 - - uid: 20508 - components: - - type: Transform - pos: -44.5,0.5 - parent: 2 - uid: 20509 components: - type: Transform @@ -111267,25 +111182,35 @@ entities: - type: DeviceLinkSource linkedPorts: 11182: - - Pressed: Toggle + - - Pressed + - Toggle 2359: - - Pressed: Toggle + - - Pressed + - Toggle 3570: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 15932: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 14572: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 16028: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 13642: - - Pressed: Toggle + - - Pressed + - Toggle 11943: - - Pressed: Toggle + - - Pressed + - Toggle 12990: - - Pressed: Toggle + - - Pressed + - Toggle 2744: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonAtmospherics entities: - uid: 9424 @@ -111296,9 +111221,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15216: - - Pressed: Toggle + - - Pressed + - Toggle 2010: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23155 components: - type: Transform @@ -111308,9 +111235,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2010: - - Pressed: Toggle + - - Pressed + - Toggle 15216: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonBar entities: - uid: 18917 @@ -111321,13 +111250,17 @@ entities: - type: DeviceLinkSource linkedPorts: 6345: - - Pressed: Toggle + - - Pressed + - Toggle 2759: - - Pressed: Toggle + - - Pressed + - Toggle 12193: - - Pressed: Toggle + - - Pressed + - Toggle 16090: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCaptain entities: - uid: 195 @@ -111339,23 +111272,32 @@ entities: - type: DeviceLinkSource linkedPorts: 4701: - - Pressed: Toggle + - - Pressed + - Toggle 4782: - - Pressed: Toggle + - - Pressed + - Toggle 4796: - - Pressed: Toggle + - - Pressed + - Toggle 4698: - - Pressed: Toggle + - - Pressed + - Toggle 4699: - - Pressed: Toggle + - - Pressed + - Toggle 4700: - - Pressed: Toggle + - - Pressed + - Toggle 4721: - - Pressed: Toggle + - - Pressed + - Toggle 186: - - Pressed: Toggle + - - Pressed + - Toggle 21880: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15649 components: - type: MetaData @@ -111367,9 +111309,11 @@ entities: - type: DeviceLinkSource linkedPorts: 15646: - - Pressed: Toggle + - - Pressed + - Toggle 15647: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23359 components: - type: MetaData @@ -111381,13 +111325,17 @@ entities: - type: DeviceLinkSource linkedPorts: 23360: - - Pressed: Toggle + - - Pressed + - Toggle 23378: - - Pressed: Toggle + - - Pressed + - Toggle 23362: - - Pressed: Toggle + - - Pressed + - Toggle 23361: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCargo entities: - uid: 17447 @@ -111399,11 +111347,14 @@ entities: - type: DeviceLinkSource linkedPorts: 3501: - - Pressed: Toggle + - - Pressed + - Toggle 306: - - Pressed: Toggle + - - Pressed + - Toggle 368: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 17478 components: - type: Transform @@ -111412,7 +111363,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9057: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 17479 components: - type: Transform @@ -111421,7 +111373,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8141: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonChemistry entities: - uid: 21250 @@ -111435,29 +111388,41 @@ entities: - type: DeviceLinkSource linkedPorts: 11937: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 144: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 12508: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 21258: - - Pressed: Toggle + - - Pressed + - Toggle 21257: - - Pressed: Toggle + - - Pressed + - Toggle 21256: - - Pressed: Toggle + - - Pressed + - Toggle 21254: - - Pressed: Toggle + - - Pressed + - Toggle 21255: - - Pressed: Toggle + - - Pressed + - Toggle 21251: - - Pressed: Toggle + - - Pressed + - Toggle 21253: - - Pressed: Toggle + - - Pressed + - Toggle 21252: - - Pressed: Toggle + - - Pressed + - Toggle 10414: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - proto: LockableButtonChiefEngineer entities: - uid: 17055 @@ -111471,9 +111436,11 @@ entities: - type: DeviceLinkSource linkedPorts: 17052: - - Pressed: Toggle + - - Pressed + - Toggle 17053: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonChiefMedicalOfficer entities: - uid: 21233 @@ -111485,11 +111452,14 @@ entities: - type: DeviceLinkSource linkedPorts: 21229: - - Pressed: Toggle + - - Pressed + - Toggle 21230: - - Pressed: Toggle + - - Pressed + - Toggle 21231: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonCommand entities: - uid: 15629 @@ -111503,19 +111473,26 @@ entities: - type: DeviceLinkSource linkedPorts: 15630: - - Pressed: Toggle + - - Pressed + - Toggle 15631: - - Pressed: Toggle + - - Pressed + - Toggle 15632: - - Pressed: Toggle + - - Pressed + - Toggle 19577: - - Pressed: Toggle + - - Pressed + - Toggle 19574: - - Pressed: Toggle + - - Pressed + - Toggle 19576: - - Pressed: Toggle + - - Pressed + - Toggle 19575: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonEngineering entities: - uid: 11423 @@ -111529,11 +111506,14 @@ entities: - type: DeviceLinkSource linkedPorts: 11421: - - Pressed: Toggle + - - Pressed + - Toggle 11419: - - Pressed: Toggle + - - Pressed + - Toggle 4048: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23448 components: - type: Transform @@ -111543,9 +111523,11 @@ entities: - type: DeviceLinkSource linkedPorts: 9084: - - Pressed: Toggle + - - Pressed + - Toggle 1124: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23449 components: - type: Transform @@ -111554,7 +111536,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1124: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 23450 components: - type: Transform @@ -111564,7 +111547,8 @@ entities: - type: DeviceLinkSource linkedPorts: 9084: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonHeadOfPersonnel entities: - uid: 3577 @@ -111576,17 +111560,23 @@ entities: - type: DeviceLinkSource linkedPorts: 7609: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 7610: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 15654: - - Pressed: Toggle + - - Pressed + - Toggle 15749: - - Pressed: Toggle + - - Pressed + - Toggle 15656: - - Pressed: Toggle + - - Pressed + - Toggle 15657: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6338 components: - type: MetaData @@ -111597,7 +111587,8 @@ entities: - type: DeviceLinkSource linkedPorts: 6351: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonHeadOfSecurity entities: - uid: 14821 @@ -111609,7 +111600,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7960: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonHydroponics entities: - uid: 16045 @@ -111621,15 +111613,20 @@ entities: - type: DeviceLinkSource linkedPorts: 3457: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 3456: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 16035: - - Pressed: Toggle + - - Pressed + - Toggle 16036: - - Pressed: Toggle + - - Pressed + - Toggle 16037: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonKitchen entities: - uid: 16023 @@ -111641,11 +111638,14 @@ entities: - type: DeviceLinkSource linkedPorts: 16025: - - Pressed: Toggle + - - Pressed + - Toggle 16026: - - Pressed: Toggle + - - Pressed + - Toggle 16027: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonMedical entities: - uid: 1550 @@ -111656,9 +111656,11 @@ entities: - type: DeviceLinkSource linkedPorts: 2273: - - Pressed: Open + - - Pressed + - Open 2287: - - Pressed: Open + - - Pressed + - Open - uid: 2322 components: - type: MetaData @@ -111670,9 +111672,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1781: - - Pressed: Open + - - Pressed + - Open 2509: - - Pressed: Open + - - Pressed + - Open - uid: 3097 components: - type: MetaData @@ -111684,9 +111688,11 @@ entities: - type: DeviceLinkSource linkedPorts: 506: - - Pressed: Open + - - Pressed + - Open 2244: - - Pressed: Open + - - Pressed + - Open - uid: 5377 components: - type: Transform @@ -111695,9 +111701,11 @@ entities: - type: DeviceLinkSource linkedPorts: 506: - - Pressed: Open + - - Pressed + - Open 2244: - - Pressed: Open + - - Pressed + - Open - uid: 5465 components: - type: Transform @@ -111707,9 +111715,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1095: - - Pressed: Open + - - Pressed + - Open 967: - - Pressed: Open + - - Pressed + - Open - uid: 6574 components: - type: Transform @@ -111719,9 +111729,11 @@ entities: - type: DeviceLinkSource linkedPorts: 1781: - - Pressed: Open + - - Pressed + - Open 2509: - - Pressed: Open + - - Pressed + - Open - uid: 21239 components: - type: Transform @@ -111731,19 +111743,26 @@ entities: - type: DeviceLinkSource linkedPorts: 21234: - - Pressed: Toggle + - - Pressed + - Toggle 21235: - - Pressed: Toggle + - - Pressed + - Toggle 21236: - - Pressed: Toggle + - - Pressed + - Toggle 21237: - - Pressed: Toggle + - - Pressed + - Toggle 21238: - - Pressed: Toggle + - - Pressed + - Toggle 10771: - - Pressed: Toggle + - - Pressed + - Toggle 10807: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 21240 components: - type: Transform @@ -111753,19 +111772,26 @@ entities: - type: DeviceLinkSource linkedPorts: 21242: - - Pressed: Toggle + - - Pressed + - Toggle 21243: - - Pressed: Toggle + - - Pressed + - Toggle 21244: - - Pressed: Toggle + - - Pressed + - Toggle 21245: - - Pressed: Toggle + - - Pressed + - Toggle 21246: - - Pressed: Toggle + - - Pressed + - Toggle 21247: - - Pressed: Toggle + - - Pressed + - Toggle 21248: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 22775 components: - type: MetaData @@ -111776,15 +111802,20 @@ entities: - type: DeviceLinkSource linkedPorts: 22773: - - Pressed: Toggle + - - Pressed + - Toggle 22772: - - Pressed: Toggle + - - Pressed + - Toggle 22771: - - Pressed: Toggle + - - Pressed + - Toggle 22769: - - Pressed: Toggle + - - Pressed + - Toggle 22770: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonQuartermaster entities: - uid: 12052 @@ -111796,11 +111827,14 @@ entities: - type: DeviceLinkSource linkedPorts: 5439: - - Pressed: Toggle + - - Pressed + - Toggle 12072: - - Pressed: Toggle + - - Pressed + - Toggle 12076: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonResearch entities: - uid: 6273 @@ -111811,9 +111845,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4279: - - Pressed: Toggle + - - Pressed + - Toggle 6787: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 15433 components: - type: Transform @@ -111823,7 +111859,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4531: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonResearchDirector entities: - uid: 17743 @@ -111837,19 +111874,26 @@ entities: - type: DeviceLinkSource linkedPorts: 19579: - - Pressed: Toggle + - - Pressed + - Toggle 15624: - - Pressed: Toggle + - - Pressed + - Toggle 17741: - - Pressed: Toggle + - - Pressed + - Toggle 19578: - - Pressed: Toggle + - - Pressed + - Toggle 17943: - - Pressed: Toggle + - - Pressed + - Toggle 17930: - - Pressed: Toggle + - - Pressed + - Toggle 17616: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonSecurity entities: - uid: 345 @@ -111863,11 +111907,14 @@ entities: - type: DeviceLinkSource linkedPorts: 21876: - - Pressed: Toggle + - - Pressed + - Toggle 22133: - - Pressed: Toggle + - - Pressed + - Toggle 710: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 6146 components: - type: MetaData @@ -111879,17 +111926,23 @@ entities: - type: DeviceLinkSource linkedPorts: 22618: - - Pressed: Toggle + - - Pressed + - Toggle 22619: - - Pressed: Toggle + - - Pressed + - Toggle 22620: - - Pressed: Toggle + - - Pressed + - Toggle 22617: - - Pressed: Toggle + - - Pressed + - Toggle 22616: - - Pressed: Toggle + - - Pressed + - Toggle 22614: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 22713 components: - type: MetaData @@ -111901,9 +111954,11 @@ entities: - type: DeviceLinkSource linkedPorts: 10652: - - Pressed: Toggle + - - Pressed + - Toggle 2582: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 22723 components: - type: MetaData @@ -111915,15 +111970,20 @@ entities: - type: DeviceLinkSource linkedPorts: 813: - - Pressed: Toggle + - - Pressed + - Toggle 304: - - Pressed: Toggle + - - Pressed + - Toggle 22721: - - Pressed: Toggle + - - Pressed + - Toggle 22720: - - Pressed: Toggle + - - Pressed + - Toggle 22719: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 22728 components: - type: MetaData @@ -111935,11 +111995,14 @@ entities: - type: DeviceLinkSource linkedPorts: 2500: - - Pressed: Toggle + - - Pressed + - Toggle 22725: - - Pressed: Toggle + - - Pressed + - Toggle 22724: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockableButtonTheatre entities: - uid: 5329 @@ -111952,19 +112015,26 @@ entities: - type: DeviceLinkSource linkedPorts: 14006: - - Pressed: Toggle + - - Pressed + - Toggle 14012: - - Pressed: Toggle + - - Pressed + - Toggle 14774: - - Pressed: Toggle + - - Pressed + - Toggle 20173: - - Pressed: Toggle + - - Pressed + - Toggle 17722: - - Pressed: Toggle + - - Pressed + - Toggle 11980: - - Pressed: Toggle + - - Pressed + - Toggle 4890: - - Pressed: Toggle + - - Pressed + - Toggle - proto: LockerAtmosphericsFilledHardsuit entities: - uid: 1929 @@ -112315,16 +112385,6 @@ entities: parent: 2 - proto: LockerScienceFilled entities: - - uid: 1572 - components: - - type: Transform - pos: 35.5,-29.5 - parent: 2 - - uid: 1573 - components: - - type: Transform - pos: 33.5,-29.5 - parent: 2 - uid: 4175 components: - type: Transform @@ -112335,6 +112395,16 @@ entities: - type: Transform pos: 41.5,-38.5 parent: 2 + - uid: 12361 + components: + - type: Transform + pos: 27.5,-26.5 + parent: 2 + - uid: 12989 + components: + - type: Transform + pos: 33.5,-29.5 + parent: 2 - proto: LockerSecurityFilled entities: - uid: 2251 @@ -112441,7 +112511,8 @@ entities: - type: DeviceLinkSource linkedPorts: 294: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112457,11 +112528,11 @@ entities: - type: DeviceLinkSource linkedPorts: 21849: - - Output: DoorBolt + - - Output + - DoorBolt 1722: - - Output: DoorBolt - 5486: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112477,11 +112548,11 @@ entities: - type: DeviceLinkSource linkedPorts: 20665: - - Output: DoorBolt + - - Output + - DoorBolt 1756: - - Output: DoorBolt - 5486: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112499,7 +112570,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21863: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112514,7 +112586,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4729: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112529,7 +112602,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4772: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112544,7 +112618,8 @@ entities: - type: DeviceLinkSource linkedPorts: 4773: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112560,7 +112635,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5764: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112576,7 +112652,8 @@ entities: - type: DeviceLinkSource linkedPorts: 5184: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112591,7 +112668,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3999: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112607,7 +112685,8 @@ entities: - type: DeviceLinkSource linkedPorts: 2672: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112623,7 +112702,8 @@ entities: - type: DeviceLinkSource linkedPorts: 1067: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112639,7 +112719,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21912: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112655,7 +112736,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8740: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112671,7 +112753,8 @@ entities: - type: DeviceLinkSource linkedPorts: 8579: - - Output: DoorBolt + - - Output + - DoorBolt - type: Physics canCollide: False bodyType: Static @@ -112943,6 +113026,33 @@ entities: - type: Transform pos: 8.5,-19.5 parent: 2 +- proto: LootSpawnerRandomLockbox + entities: + - uid: 946 + components: + - type: Transform + pos: -0.5,-25.5 + parent: 2 + - uid: 23122 + components: + - type: Transform + pos: -22.5,19.5 + parent: 2 + - uid: 23688 + components: + - type: Transform + pos: -32.5,-16.5 + parent: 2 + - uid: 23721 + components: + - type: Transform + pos: -41.5,-50.5 + parent: 2 + - uid: 23722 + components: + - type: Transform + pos: 46.5,-56.5 + parent: 2 - proto: LootSpawnerRoboticsBorgModule entities: - uid: 6743 @@ -113251,6 +113361,13 @@ entities: - type: Transform pos: 59.5,-73.5 parent: 2 +- proto: MachineMaterialSilo + entities: + - uid: 12480 + components: + - type: Transform + pos: 32.5,-29.5 + parent: 2 - proto: MagazinePistolSubMachineGunTopMounted entities: - uid: 6884 @@ -120983,6 +121100,292 @@ entities: - type: Transform pos: 4.5,-16.5 parent: 2 +- proto: RandomCableApcExtensionSpawner + entities: + - uid: 608 + components: + - type: Transform + pos: 46.5,11.5 + parent: 2 + - uid: 609 + components: + - type: Transform + pos: 48.5,11.5 + parent: 2 + - uid: 718 + components: + - type: Transform + pos: 45.5,11.5 + parent: 2 + - uid: 904 + components: + - type: Transform + pos: 47.5,11.5 + parent: 2 + - uid: 940 + components: + - type: Transform + pos: 47.5,8.5 + parent: 2 + - uid: 1193 + components: + - type: Transform + pos: 51.5,-40.5 + parent: 2 + - uid: 2459 + components: + - type: Transform + pos: 55.5,-40.5 + parent: 2 + - uid: 2731 + components: + - type: Transform + pos: -36.5,-8.5 + parent: 2 + - uid: 2732 + components: + - type: Transform + pos: -44.5,-0.5 + parent: 2 + - uid: 20554 + components: + - type: Transform + pos: -41.5,-8.5 + parent: 2 + - uid: 20698 + components: + - type: Transform + pos: -44.5,0.5 + parent: 2 +- proto: RandomCableHVSpawner + entities: + - uid: 2965 + components: + - type: Transform + pos: -41.5,23.5 + parent: 2 + - uid: 7929 + components: + - type: Transform + pos: -43.5,23.5 + parent: 2 + - uid: 8334 + components: + - type: Transform + pos: -52.5,11.5 + parent: 2 + - uid: 17767 + components: + - type: Transform + pos: -53.5,16.5 + parent: 2 + - uid: 17769 + components: + - type: Transform + pos: -49.5,15.5 + parent: 2 + - uid: 17813 + components: + - type: Transform + pos: -54.5,14.5 + parent: 2 + - uid: 18082 + components: + - type: Transform + pos: -53.5,14.5 + parent: 2 + - uid: 18083 + components: + - type: Transform + pos: -52.5,16.5 + parent: 2 + - uid: 18084 + components: + - type: Transform + pos: -52.5,14.5 + parent: 2 + - uid: 18087 + components: + - type: Transform + pos: -50.5,16.5 + parent: 2 + - uid: 18088 + components: + - type: Transform + pos: -50.5,14.5 + parent: 2 + - uid: 18089 + components: + - type: Transform + pos: -51.5,15.5 + parent: 2 + - uid: 18150 + components: + - type: Transform + pos: -38.5,23.5 + parent: 2 + - uid: 18225 + components: + - type: Transform + pos: -48.5,11.5 + parent: 2 + - uid: 18721 + components: + - type: Transform + pos: -52.5,15.5 + parent: 2 + - uid: 18982 + components: + - type: Transform + pos: -67.5,-52.5 + parent: 2 + - uid: 20157 + components: + - type: Transform + pos: -71.5,-56.5 + parent: 2 + - uid: 20508 + components: + - type: Transform + pos: -48.5,15.5 + parent: 2 + - uid: 20549 + components: + - type: Transform + pos: -76.5,-54.5 + parent: 2 + - uid: 20565 + components: + - type: Transform + pos: -4.5,-9.5 + parent: 2 + - uid: 20568 + components: + - type: Transform + pos: -4.5,-10.5 + parent: 2 + - uid: 20749 + components: + - type: Transform + pos: 53.5,2.5 + parent: 2 + - uid: 21182 + components: + - type: Transform + pos: -66.5,-54.5 + parent: 2 + - uid: 21320 + components: + - type: Transform + pos: -49.5,23.5 + parent: 2 + - uid: 21377 + components: + - type: Transform + pos: -68.5,-54.5 + parent: 2 + - uid: 21399 + components: + - type: Transform + pos: -65.5,-54.5 + parent: 2 + - uid: 23419 + components: + - type: Transform + pos: -46.5,25.5 + parent: 2 + - uid: 23420 + components: + - type: Transform + pos: -50.5,24.5 + parent: 2 + - uid: 23700 + components: + - type: Transform + pos: -50.5,22.5 + parent: 2 + - uid: 23702 + components: + - type: Transform + pos: -75.5,-52.5 + parent: 2 + - uid: 23704 + components: + - type: Transform + pos: 57.5,2.5 + parent: 2 + - uid: 23705 + components: + - type: Transform + pos: -51.5,23.5 + parent: 2 + - uid: 23706 + components: + - type: Transform + pos: 59.5,2.5 + parent: 2 + - uid: 23707 + components: + - type: Transform + pos: 61.5,2.5 + parent: 2 + - uid: 23709 + components: + - type: Transform + pos: 63.5,2.5 + parent: 2 + - uid: 23710 + components: + - type: Transform + pos: -63.5,-53.5 + parent: 2 + - uid: 23711 + components: + - type: Transform + pos: 65.5,2.5 + parent: 2 + - uid: 23713 + components: + - type: Transform + pos: 67.5,2.5 + parent: 2 + - uid: 23714 + components: + - type: Transform + pos: -67.5,-53.5 + parent: 2 + - uid: 23716 + components: + - type: Transform + pos: 70.5,2.5 + parent: 2 + - uid: 23717 + components: + - type: Transform + pos: 62.5,3.5 + parent: 2 + - uid: 23718 + components: + - type: Transform + pos: 58.5,1.5 + parent: 2 + - uid: 23719 + components: + - type: Transform + pos: 66.5,3.5 + parent: 2 + - uid: 23720 + components: + - type: Transform + pos: 66.5,1.5 + parent: 2 +- proto: RandomCableMVSpawner + entities: + - uid: 20574 + components: + - type: Transform + pos: 40.5,18.5 + parent: 2 - proto: RandomDrinkBottle entities: - uid: 1844 @@ -126396,11 +126799,14 @@ entities: - type: DeviceLinkSource linkedPorts: 306: - - Pressed: Toggle + - - Pressed + - Toggle 368: - - Pressed: Toggle + - - Pressed + - Toggle 3501: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 8340 components: - type: MetaData @@ -126411,9 +126817,11 @@ entities: - type: DeviceLinkSource linkedPorts: 7263: - - Pressed: Toggle + - - Pressed + - Toggle 6578: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 9536 components: - type: MetaData @@ -126424,9 +126832,11 @@ entities: - type: DeviceLinkSource linkedPorts: 7263: - - Pressed: Toggle + - - Pressed + - Toggle 6578: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 17983 components: - type: MetaData @@ -126437,11 +126847,14 @@ entities: - type: DeviceLinkSource linkedPorts: 306: - - Pressed: Toggle + - - Pressed + - Toggle 3501: - - Pressed: Toggle + - - Pressed + - Toggle 368: - - Pressed: Toggle + - - Pressed + - Toggle - proto: ResearchAndDevelopmentServer entities: - uid: 4170 @@ -128011,7 +128424,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16099: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 3255 components: - type: Transform @@ -128021,7 +128435,8 @@ entities: - type: DeviceLinkSource linkedPorts: 536: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 4282 components: - type: Transform @@ -128031,7 +128446,8 @@ entities: - type: DeviceLinkSource linkedPorts: 113: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 4325 components: - type: Transform @@ -128040,7 +128456,8 @@ entities: - type: DeviceLinkSource linkedPorts: 3508: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 13730 components: - type: Transform @@ -128050,9 +128467,11 @@ entities: - type: DeviceLinkSource linkedPorts: 11992: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 11221: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 15842 components: - type: Transform @@ -128062,7 +128481,8 @@ entities: - type: DeviceLinkSource linkedPorts: 432: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16054 components: - type: Transform @@ -128071,9 +128491,11 @@ entities: - type: DeviceLinkSource linkedPorts: 5908: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 21405: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16057 components: - type: Transform @@ -128083,9 +128505,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4677: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 6216: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16058 components: - type: Transform @@ -128094,9 +128518,11 @@ entities: - type: DeviceLinkSource linkedPorts: 643: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 5910: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16059 components: - type: Transform @@ -128106,9 +128532,11 @@ entities: - type: DeviceLinkSource linkedPorts: 4671: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 4873: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 16117 components: - type: MetaData @@ -128120,7 +128548,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16118: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 17553 components: - type: MetaData @@ -128132,7 +128561,8 @@ entities: - type: DeviceLinkSource linkedPorts: 17552: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 17657 components: - type: MetaData @@ -128144,7 +128574,8 @@ entities: - type: DeviceLinkSource linkedPorts: 16102: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 19282 components: - type: MetaData @@ -128156,7 +128587,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12881: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 21408 components: - type: Transform @@ -128165,9 +128597,11 @@ entities: - type: DeviceLinkSource linkedPorts: 11833: - - Pressed: DoorBolt + - - Pressed + - DoorBolt 21406: - - Pressed: DoorBolt + - - Pressed + - DoorBolt - uid: 21754 components: - type: MetaData @@ -128179,7 +128613,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21752: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 21755 components: - type: MetaData @@ -128191,7 +128626,8 @@ entities: - type: DeviceLinkSource linkedPorts: 21751: - - Pressed: Toggle + - - Pressed + - Toggle - uid: 22621 components: - type: Transform @@ -128201,7 +128637,8 @@ entities: - type: DeviceLinkSource linkedPorts: 12433: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignalButtonDirectional entities: - uid: 3082 @@ -128214,9 +128651,11 @@ entities: - type: DeviceLinkSource linkedPorts: 3778: - - Pressed: Toggle + - - Pressed + - Toggle 3779: - - Pressed: Toggle + - - Pressed + - Toggle - proto: SignAnomaly entities: - uid: 4573 @@ -129276,113 +129715,6 @@ entities: - type: Transform pos: 44.5,12.5 parent: 2 -- proto: SolarAssembly - entities: - - uid: 939 - components: - - type: Transform - pos: -66.5,-58.5 - parent: 2 - - uid: 941 - components: - - type: Transform - pos: -72.5,-50.5 - parent: 2 - - uid: 942 - components: - - type: Transform - pos: -46.5,12.5 - parent: 2 - - uid: 946 - components: - - type: Transform - pos: -55.5,12.5 - parent: 2 - - uid: 957 - components: - - type: Transform - pos: 65.5,-3.5 - parent: 2 - - uid: 960 - components: - - type: Transform - pos: 71.5,6.5 - parent: 2 - - uid: 961 - components: - - type: Transform - pos: -48.5,10.5 - parent: 2 - - uid: 978 - components: - - type: Transform - pos: -47.5,27.5 - parent: 2 - - uid: 995 - components: - - type: Transform - pos: -68.5,-48.5 - parent: 2 - - uid: 997 - components: - - type: Transform - pos: 65.5,4.5 - parent: 2 - - uid: 998 - components: - - type: Transform - pos: -47.5,28.5 - parent: 2 - - uid: 1002 - components: - - type: Transform - pos: -56.5,16.5 - parent: 2 - - uid: 12132 - components: - - type: Transform - pos: 57.5,-3.5 - parent: 2 - - uid: 12159 - components: - - type: Transform - pos: 67.5,-0.5 - parent: 2 - - uid: 12299 - components: - - type: Transform - pos: -53.5,18.5 - parent: 2 - - uid: 12361 - components: - - type: Transform - pos: 63.5,-2.5 - parent: 2 - - uid: 12486 - components: - - type: Transform - pos: -55.5,25.5 - parent: 2 - - uid: 12502 - components: - - type: Transform - pos: -62.5,-51.5 - parent: 2 - - uid: 12551 - components: - - type: Transform - pos: 65.5,-0.5 - parent: 2 - - uid: 12556 - components: - - type: Transform - pos: -53.5,29.5 - parent: 2 - - uid: 21450 - components: - - type: Transform - pos: 61.5,-0.5 - parent: 2 - proto: SolarPanel entities: - uid: 532 @@ -129468,6 +129800,61 @@ entities: rot: 1.5707963267948966 rad pos: -49.5,29.5 parent: 2 + - uid: 957 + components: + - type: Transform + pos: 61.5,-0.5 + parent: 2 + - uid: 960 + components: + - type: Transform + pos: -53.5,29.5 + parent: 2 + - uid: 961 + components: + - type: Transform + pos: 65.5,-0.5 + parent: 2 + - uid: 978 + components: + - type: Transform + pos: -62.5,-51.5 + parent: 2 + - uid: 995 + components: + - type: Transform + pos: -55.5,25.5 + parent: 2 + - uid: 997 + components: + - type: Transform + pos: 63.5,-2.5 + parent: 2 + - uid: 998 + components: + - type: Transform + pos: -53.5,18.5 + parent: 2 + - uid: 1002 + components: + - type: Transform + pos: 67.5,-0.5 + parent: 2 + - uid: 1572 + components: + - type: Transform + pos: 57.5,-3.5 + parent: 2 + - uid: 1573 + components: + - type: Transform + pos: -56.5,16.5 + parent: 2 + - uid: 4925 + components: + - type: Transform + pos: -47.5,28.5 + parent: 2 - uid: 5067 components: - type: Transform @@ -129594,6 +129981,11 @@ entities: rot: 1.5707963267948966 rad pos: -45.5,12.5 parent: 2 + - uid: 5486 + components: + - type: Transform + pos: 65.5,4.5 + parent: 2 - uid: 5815 components: - type: Transform @@ -129765,6 +130157,11 @@ entities: - type: Transform pos: -62.5,-48.5 parent: 2 + - uid: 10673 + components: + - type: Transform + pos: -68.5,-48.5 + parent: 2 - uid: 10678 components: - type: Transform @@ -129883,6 +130280,11 @@ entities: rot: 1.5707963267948966 rad pos: -48.5,12.5 parent: 2 + - uid: 11343 + components: + - type: Transform + pos: -47.5,27.5 + parent: 2 - uid: 11401 components: - type: Transform @@ -129924,30 +130326,87 @@ entities: - type: Transform pos: 57.5,-2.5 parent: 2 + - uid: 12132 + components: + - type: Transform + pos: -48.5,10.5 + parent: 2 + - uid: 12159 + components: + - type: Transform + pos: 71.5,6.5 + parent: 2 + - uid: 12202 + components: + - type: Transform + pos: 65.5,-3.5 + parent: 2 + - uid: 12224 + components: + - type: Transform + pos: -55.5,12.5 + parent: 2 - uid: 12298 components: - type: Transform rot: -1.5707963267948966 rad pos: 61.5,-2.5 parent: 2 + - uid: 12299 + components: + - type: Transform + pos: -46.5,12.5 + parent: 2 - uid: 12301 components: - type: Transform rot: -1.5707963267948966 rad pos: 65.5,-2.5 parent: 2 + - uid: 12307 + components: + - type: Transform + pos: -72.5,-50.5 + parent: 2 - uid: 12312 components: - type: Transform rot: -1.5707963267948966 rad pos: 67.5,-2.5 parent: 2 + - uid: 12318 + components: + - type: Transform + pos: -66.5,-58.5 + parent: 2 - uid: 12362 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,25.5 parent: 2 + - uid: 12551 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 59.5,4.5 + parent: 2 + - uid: 12556 + components: + - type: Transform + pos: -76.5,-52.5 + parent: 2 + - uid: 12558 + components: + - type: Transform + pos: -74.5,-51.5 + parent: 2 + - uid: 12561 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 69.5,7.5 + parent: 2 - uid: 14217 components: - type: Transform @@ -129966,6 +130425,17 @@ entities: rot: -1.5707963267948966 rad pos: 63.5,-0.5 parent: 2 + - uid: 14281 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 63.5,-1.5 + parent: 2 + - uid: 14282 + components: + - type: Transform + pos: -72.5,-51.5 + parent: 2 - uid: 14283 components: - type: Transform @@ -129991,6 +130461,11 @@ entities: - type: Transform pos: -70.5,-56.5 parent: 2 + - uid: 15705 + components: + - type: Transform + pos: -66.5,-56.5 + parent: 2 - uid: 16106 components: - type: Transform @@ -130003,11 +130478,29 @@ entities: rot: -1.5707963267948966 rad pos: 71.5,-3.5 parent: 2 + - uid: 16901 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 69.5,-2.5 + parent: 2 + - uid: 16905 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -53.5,28.5 + parent: 2 - uid: 16957 components: - type: Transform pos: -70.5,-59.5 parent: 2 + - uid: 16958 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 71.5,-0.5 + parent: 2 - uid: 16959 components: - type: Transform @@ -130073,6 +130566,12 @@ entities: rot: -1.5707963267948966 rad pos: 67.5,0.5 parent: 2 + - uid: 17458 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -47.5,10.5 + parent: 2 - uid: 17624 components: - type: Transform @@ -130129,6 +130628,12 @@ entities: - type: Transform pos: -74.5,-52.5 parent: 2 + - uid: 17810 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 71.5,-2.5 + parent: 2 - uid: 17811 components: - type: Transform @@ -130374,157 +130879,87 @@ entities: rot: -1.5707963267948966 rad pos: 61.5,7.5 parent: 2 -- proto: SolarPanelBroken - entities: - - uid: 4925 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 59.5,4.5 - parent: 2 - - uid: 10673 - components: - - type: Transform - pos: -76.5,-52.5 - parent: 2 - - uid: 12202 - components: - - type: Transform - pos: -74.5,-51.5 - parent: 2 - - uid: 12224 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 69.5,7.5 - parent: 2 - - uid: 12307 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 63.5,-1.5 - parent: 2 - - uid: 12318 - components: - - type: Transform - pos: -72.5,-51.5 - parent: 2 - - uid: 12480 - components: - - type: Transform - pos: -66.5,-56.5 - parent: 2 - - uid: 12492 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 69.5,-2.5 - parent: 2 - - uid: 12503 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -53.5,28.5 - parent: 2 - - uid: 12539 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 71.5,-0.5 - parent: 2 - - uid: 12558 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -47.5,10.5 - parent: 2 - - uid: 12561 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 71.5,-2.5 - parent: 2 - - uid: 14281 + - uid: 20159 components: - type: Transform pos: -74.5,-59.5 parent: 2 - - uid: 14282 + - uid: 20161 components: - type: Transform pos: -76.5,-58.5 parent: 2 - - uid: 15705 + - uid: 20162 components: - type: Transform pos: -76.5,-50.5 parent: 2 - - uid: 16901 + - uid: 20164 components: - type: Transform pos: -72.5,-58.5 parent: 2 - - uid: 16905 + - uid: 20169 components: - type: Transform pos: -74.5,-49.5 parent: 2 - - uid: 16958 + - uid: 20171 components: - type: Transform pos: -70.5,-58.5 parent: 2 - - uid: 17810 + - uid: 20174 components: - type: Transform pos: -74.5,-48.5 parent: 2 - - uid: 20159 + - uid: 20177 components: - type: Transform pos: 57.5,-0.5 parent: 2 - - uid: 20161 + - uid: 20179 components: - type: Transform pos: 59.5,-3.5 parent: 2 - - uid: 20162 + - uid: 21450 components: - type: Transform pos: 59.5,-2.5 parent: 2 - - uid: 20164 + - uid: 23224 components: - type: Transform rot: 1.5707963267948966 rad pos: -56.5,14.5 parent: 2 - - uid: 20169 + - uid: 23225 components: - type: Transform rot: 1.5707963267948966 rad pos: -55.5,16.5 parent: 2 - - uid: 20171 + - uid: 23226 components: - type: Transform rot: 1.5707963267948966 rad pos: -49.5,28.5 parent: 2 - - uid: 20174 + - uid: 23689 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,29.5 parent: 2 - - uid: 20177 + - uid: 23698 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,26.5 parent: 2 - - uid: 20179 + - uid: 23699 components: - type: Transform pos: 57.5,0.5 @@ -133845,7 +134280,6 @@ entities: - uid: 3490 components: - type: Transform - rot: -1.5707963267948966 rad pos: 1.5,-39.5 parent: 2 - uid: 3564 @@ -136636,21 +137070,33 @@ entities: - type: DeviceLinkSource linkedPorts: 1903: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 1933: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3487: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 6837: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 6236 components: - type: Transform @@ -136659,33 +137105,54 @@ entities: - type: DeviceLinkSource linkedPorts: 9352: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18127: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18132: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9115: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 18131: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5314: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 9114: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 6943 components: - type: Transform @@ -136694,11 +137161,15 @@ entities: - type: DeviceLinkSource linkedPorts: 2504: - - Right: Open - - Middle: Close + - - Right + - Open + - - Middle + - Close 18130: - - Left: Open - - Middle: Close + - - Left + - Open + - - Middle + - Close - uid: 11941 components: - type: Transform @@ -136707,21 +137178,33 @@ entities: - type: DeviceLinkSource linkedPorts: 11226: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 4763: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11225: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 11937: - - Middle: Close - - Right: AutoClose - - Left: AutoClose + - - Middle + - Close + - - Right + - AutoClose + - - Left + - AutoClose - uid: 14673 components: - type: Transform @@ -136730,17 +137213,26 @@ entities: - type: DeviceLinkSource linkedPorts: 14292: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14332: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 14293: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 17984 components: - type: Transform @@ -136749,21 +137241,33 @@ entities: - type: DeviceLinkSource linkedPorts: 2671: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 1066: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 3871: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 2960: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 17985 components: - type: Transform @@ -136772,21 +137276,33 @@ entities: - type: DeviceLinkSource linkedPorts: 5321: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5354: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 5362: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 1065: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - uid: 22008 components: - type: Transform @@ -136795,13 +137311,19 @@ entities: - type: DeviceLinkSource linkedPorts: 21999: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off 21974: - - Left: Forward - - Right: Reverse - - Middle: Off + - - Left + - Forward + - - Right + - Reverse + - - Middle + - Off - proto: UnfinishedMachineFrame entities: - uid: 14624 @@ -137169,10 +137691,10 @@ entities: parent: 2 - proto: VendingMachineSciDrobe entities: - - uid: 102 + - uid: 942 components: - type: Transform - pos: 27.5,-26.5 + pos: 35.5,-29.5 parent: 2 - proto: VendingMachineSec entities: @@ -151770,13 +152292,6 @@ entities: - type: Transform pos: 32.5,-24.5 parent: 2 -- proto: WardrobeScienceFilled - entities: - - uid: 11343 - components: - - type: Transform - pos: 32.5,-29.5 - parent: 2 - proto: WardrobeYellowFilled entities: - uid: 2311 @@ -152253,7 +152768,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7609: - - DoorStatus: Close + - - DoorStatus + - Close - uid: 12433 components: - type: Transform @@ -152488,7 +153004,8 @@ entities: - type: DeviceLinkSource linkedPorts: 7610: - - DoorStatus: Close + - - DoorStatus + - Close - proto: WindoorSecureJanitorLocked entities: - uid: 5537 From a16504fa42bc2d41d1659db2bf96e1e70dcaafba Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Thu, 24 Apr 2025 21:47:46 +0200 Subject: [PATCH 603/622] Tearable Deliveries V2 (#36815) * Add new fields to DeliveryComponent for #36636 * Setting the baseSpesoPenalty for currently available deliveries * Small fixes * Basic delivery penalization * Penalty and reward multiplier calculation in place Also fixes an issue in SharedCargoSystem when opening a delivery in dev server due to trying to allocate cargo twice. * Calling penalty no longer happens on opening * Extract multiplier getting * Removing unused include * Changing method description. \n\n Not actually sure what I meant by the first one * Localising default delivery messages * Unused include removal * init or smth * minor tweaks * I KEEP MERGE CONFLICTING MYSELF * comments * no icon * slight increase * slarti changes * forgot * stuffs * yippee * Locn't * doc * partial review * message * review * pain * stuff --------- Co-authored-by: Lmorgan89 <billsmith116@gmail.com> --- .../Delivery/SharedDeliverySystem.cs | 47 ++++++++--- .../FingerprintReaderSystem.cs | 6 +- .../Components/SimpleToolUsageComponent.cs | 47 +++++++++++ .../Tools/Systems/SimpleToolUsageSystem.cs | 79 +++++++++++++++++++ .../en-US/delivery/delivery-component.ftl | 1 + .../Locale/en-US/tools/simple-tool-usage.ftl | 1 + .../Objects/Deliveries/deliveries.yml | 9 ++- 7 files changed, 175 insertions(+), 15 deletions(-) create mode 100644 Content.Shared/Tools/Components/SimpleToolUsageComponent.cs create mode 100644 Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs create mode 100644 Resources/Locale/en-US/tools/simple-tool-usage.ftl diff --git a/Content.Shared/Delivery/SharedDeliverySystem.cs b/Content.Shared/Delivery/SharedDeliverySystem.cs index ffbf520610..53c5224940 100644 --- a/Content.Shared/Delivery/SharedDeliverySystem.cs +++ b/Content.Shared/Delivery/SharedDeliverySystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Interaction.Events; using Content.Shared.NameModifier.EntitySystems; using Content.Shared.Objectives.Components; using Content.Shared.Popups; +using Content.Shared.Tools.Components; using Content.Shared.Tag; using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; @@ -41,6 +42,8 @@ public abstract class SharedDeliverySystem : EntitySystem SubscribeLocalEvent<DeliveryComponent, ExaminedEvent>(OnDeliveryExamine); SubscribeLocalEvent<DeliveryComponent, UseInHandEvent>(OnUseInHand); SubscribeLocalEvent<DeliveryComponent, GetVerbsEvent<AlternativeVerb>>(OnGetDeliveryVerbs); + SubscribeLocalEvent<DeliveryComponent, AttemptSimpleToolUseEvent>(OnAttemptSimpleToolUse); + SubscribeLocalEvent<DeliveryComponent, SimpleToolDoAfterEvent>(OnSimpleToolUse); SubscribeLocalEvent<DeliverySpawnerComponent, ExaminedEvent>(OnSpawnerExamine); SubscribeLocalEvent<DeliverySpawnerComponent, GetVerbsEvent<AlternativeVerb>>(OnGetSpawnerVerbs); @@ -100,6 +103,24 @@ public abstract class SharedDeliverySystem : EntitySystem }); } + + private void OnAttemptSimpleToolUse(Entity<DeliveryComponent> ent, ref AttemptSimpleToolUseEvent args) + { + if (ent.Comp.IsOpened || !ent.Comp.IsLocked) + args.Cancelled = true; + } + + private void OnSimpleToolUse(Entity<DeliveryComponent> ent, ref SimpleToolDoAfterEvent args) + { + if (ent.Comp.IsOpened || args.Cancelled) + return; + + HandlePenalty(ent); + + TryUnlockDelivery(ent, args.User, false, true); + OpenDelivery(ent, args.User, false, true); + } + private void OnGetSpawnerVerbs(Entity<DeliverySpawnerComponent> ent, ref GetVerbsEvent<AlternativeVerb> args) { if (!args.CanAccess || !args.CanInteract || args.Hands == null) @@ -127,33 +148,38 @@ public abstract class SharedDeliverySystem : EntitySystem }); } - private bool TryUnlockDelivery(Entity<DeliveryComponent> ent, EntityUid user, bool rewardMoney = true) + private bool TryUnlockDelivery(Entity<DeliveryComponent> ent, EntityUid user, bool rewardMoney = true, bool force = false) { // Check fingerprint access if there is a reader on the mail - if (TryComp<FingerprintReaderComponent>(ent, out var reader) && !_fingerprintReader.IsAllowed((ent, reader), user)) + if (!force && TryComp<FingerprintReaderComponent>(ent, out var reader) && !_fingerprintReader.IsAllowed((ent, reader), user)) return false; var deliveryName = _nameModifier.GetBaseName(ent.Owner); - _audio.PlayPredicted(ent.Comp.UnlockSound, user, user); + if (!force) + _audio.PlayPredicted(ent.Comp.UnlockSound, user, user); ent.Comp.IsLocked = false; UpdateAntiTamperVisuals(ent, ent.Comp.IsLocked); DirtyField(ent, ent.Comp, nameof(DeliveryComponent.IsLocked)); + RemCompDeferred<SimpleToolUsageComponent>(ent); // we don't want unlocked mail to still be cuttable + var ev = new DeliveryUnlockedEvent(user); RaiseLocalEvent(ent, ref ev); if (rewardMoney) GrantSpesoReward(ent.AsNullable()); - _popup.PopupPredicted(Loc.GetString("delivery-unlocked-self", ("delivery", deliveryName)), - Loc.GetString("delivery-unlocked-others", ("delivery", deliveryName), ("recipient", Identity.Name(user, EntityManager)), ("possadj", user)), user, user); + if (!force) + _popup.PopupPredicted(Loc.GetString("delivery-unlocked-self", ("delivery", deliveryName)), + Loc.GetString("delivery-unlocked-others", ("delivery", deliveryName), ("recipient", Identity.Name(user, EntityManager)), ("possadj", user)), user, user); + return true; } - private void OpenDelivery(Entity<DeliveryComponent> ent, EntityUid user, bool attemptPickup = true) + private void OpenDelivery(Entity<DeliveryComponent> ent, EntityUid user, bool attemptPickup = true, bool force = false) { var deliveryName = _nameModifier.GetBaseName(ent.Owner); @@ -170,12 +196,13 @@ public abstract class SharedDeliverySystem : EntitySystem _tag.AddTags(ent, TrashTag, RecyclableTag); EnsureComp<SpaceGarbageComponent>(ent); - RemComp<StealTargetComponent>(ent); // opened mail should not count for the objective + RemCompDeferred<StealTargetComponent>(ent); // opened mail should not count for the objective DirtyField(ent.Owner, ent.Comp, nameof(DeliveryComponent.IsOpened)); - _popup.PopupPredicted(Loc.GetString("delivery-opened-self", ("delivery", deliveryName)), - Loc.GetString("delivery-opened-others", ("delivery", deliveryName), ("recipient", Identity.Name(user, EntityManager)), ("possadj", user)), user, user); + if (!force) + _popup.PopupPredicted(Loc.GetString("delivery-opened-self", ("delivery", deliveryName)), + Loc.GetString("delivery-opened-others", ("delivery", deliveryName), ("recipient", Identity.Name(user, EntityManager)), ("possadj", user)), user, user); if (!_container.TryGetContainer(ent, ent.Comp.Container, out var container)) return; @@ -189,7 +216,7 @@ public abstract class SharedDeliverySystem : EntitySystem } else { - _container.EmptyContainer(container, true, Transform(ent.Owner).Coordinates); + _container.EmptyContainer(container, true); } } diff --git a/Content.Shared/FingerprintReader/FingerprintReaderSystem.cs b/Content.Shared/FingerprintReader/FingerprintReaderSystem.cs index e259a17738..aa7d190c34 100644 --- a/Content.Shared/FingerprintReader/FingerprintReaderSystem.cs +++ b/Content.Shared/FingerprintReader/FingerprintReaderSystem.cs @@ -19,7 +19,7 @@ public sealed class FingerprintReaderSystem : EntitySystem /// <param name="user">User trying to gain access.</param> /// <returns>True if access was granted, otherwise false.</returns> [PublicAPI] - public bool IsAllowed(Entity<FingerprintReaderComponent?> target, EntityUid user) + public bool IsAllowed(Entity<FingerprintReaderComponent?> target, EntityUid user, bool showPopup = true) { if (!Resolve(target, ref target.Comp, false)) return true; @@ -30,7 +30,7 @@ public sealed class FingerprintReaderSystem : EntitySystem // Check for gloves first if (!target.Comp.IgnoreGloves && TryGetBlockingGloves(user, out var gloves)) { - if (target.Comp.FailGlovesPopup != null) + if (target.Comp.FailGlovesPopup != null && showPopup) _popup.PopupClient(Loc.GetString(target.Comp.FailGlovesPopup, ("blocker", gloves)), target, user); return false; } @@ -39,7 +39,7 @@ public sealed class FingerprintReaderSystem : EntitySystem if (!TryComp<FingerprintComponent>(user, out var fingerprint) || fingerprint.Fingerprint == null || !target.Comp.AllowedFingerprints.Contains(fingerprint.Fingerprint)) { - if (target.Comp.FailPopup != null) + if (target.Comp.FailPopup != null && showPopup) _popup.PopupClient(Loc.GetString(target.Comp.FailPopup), target, user); return false; diff --git a/Content.Shared/Tools/Components/SimpleToolUsageComponent.cs b/Content.Shared/Tools/Components/SimpleToolUsageComponent.cs new file mode 100644 index 0000000000..1f1e9c65f8 --- /dev/null +++ b/Content.Shared/Tools/Components/SimpleToolUsageComponent.cs @@ -0,0 +1,47 @@ +using Content.Shared.DoAfter; +using Content.Shared.Tools.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Tools.Components; + +/// <summary> +/// Component responsible for simple tool interactions. +/// Using a tool with the correct quality on an entity with this component will start a doAfter and raise events. +/// </summary> +[RegisterComponent, NetworkedComponent] +[Access(typeof(SimpleToolUsageSystem))] +public sealed partial class SimpleToolUsageComponent : Component +{ + /// <summary> + /// Tool quality required to use a tool on this. + /// </summary> + [DataField] + public ProtoId<ToolQualityPrototype> Quality = "Slicing"; + + /// <summary> + /// The duration using a tool on this entity will take in seconds. + /// </summary> + [DataField] + public float DoAfter = 5; + + /// <summary> + /// What verb should display to allow you to use a tool on this entity. + /// If null, no verb will be shown. + /// </summary> + [DataField] + public LocId? UsageVerb; + + /// <summary> + /// The message to show when the verb is disabled. + /// </summary> + [DataField] + public LocId BlockedMessage = "simple-tool-usage-blocked-message"; +} + +[ByRefEvent] +public record struct AttemptSimpleToolUseEvent(EntityUid User, bool Cancelled = false); + +[Serializable, NetSerializable] +public sealed partial class SimpleToolDoAfterEvent : SimpleDoAfterEvent; diff --git a/Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs b/Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs new file mode 100644 index 0000000000..0f7da9af8a --- /dev/null +++ b/Content.Shared/Tools/Systems/SimpleToolUsageSystem.cs @@ -0,0 +1,79 @@ +using Content.Shared.DoAfter; +using Content.Shared.Interaction; +using Content.Shared.Tools.Components; +using Content.Shared.Verbs; +using Robust.Shared.Utility; + +namespace Content.Shared.Tools.Systems; + +public sealed partial class SimpleToolUsageSystem : EntitySystem +{ + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedToolSystem _tools = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<SimpleToolUsageComponent, AfterInteractUsingEvent>(OnAfterInteract); + SubscribeLocalEvent<SimpleToolUsageComponent, GetVerbsEvent<InteractionVerb>>(OnGetInteractionVerbs); + } + + private void OnAfterInteract(Entity<SimpleToolUsageComponent> ent, ref AfterInteractUsingEvent args) + { + if (!args.CanReach || args.Handled) + return; + + if (!_tools.HasQuality(args.Used, ent.Comp.Quality)) + return; + + AttemptToolUsage(ent, args.User, args.Used); + } + + public void OnGetInteractionVerbs(Entity<SimpleToolUsageComponent> ent, ref GetVerbsEvent<InteractionVerb> args) + { + if (ent.Comp.UsageVerb == null) + return; + + if (!args.CanAccess || !args.CanInteract) + return; + + var disabled = args.Using == null || !_tools.HasQuality(args.Using.Value, ent.Comp.Quality); + + var used = args.Using; + var user = args.User; + + InteractionVerb verb = new() + { + Act = () => + { + if (used != null) + AttemptToolUsage(ent, user, used.Value); + }, + Disabled = disabled, + Message = disabled ? Loc.GetString(ent.Comp.BlockedMessage, ("quality", ent.Comp.Quality)) : null, + Text = Loc.GetString(ent.Comp.UsageVerb), + }; + + args.Verbs.Add(verb); + } + + private void AttemptToolUsage(Entity<SimpleToolUsageComponent> ent, EntityUid user, EntityUid tool) + { + var attemptEv = new AttemptSimpleToolUseEvent(user); + RaiseLocalEvent(ent, ref attemptEv); + + if (attemptEv.Cancelled) + return; + + var doAfterArgs = new DoAfterArgs(EntityManager, user, ent.Comp.DoAfter, new SimpleToolDoAfterEvent(), ent, tool) + { + BreakOnDamage = true, + BreakOnDropItem = true, + BreakOnMove = true, + BreakOnHandChange = true, + }; + + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } +} diff --git a/Resources/Locale/en-US/delivery/delivery-component.ftl b/Resources/Locale/en-US/delivery/delivery-component.ftl index fbe4e74937..a6bbc79343 100644 --- a/Resources/Locale/en-US/delivery/delivery-component.ftl +++ b/Resources/Locale/en-US/delivery/delivery-component.ftl @@ -10,6 +10,7 @@ delivery-opened-others = {CAPITALIZE($recipient)} opened the {$delivery}. delivery-unlock-verb = Unlock delivery-open-verb = Open +delivery-slice-verb = Slice open delivery-teleporter-amount-examine = { $amount -> diff --git a/Resources/Locale/en-US/tools/simple-tool-usage.ftl b/Resources/Locale/en-US/tools/simple-tool-usage.ftl new file mode 100644 index 0000000000..fd6ae49d22 --- /dev/null +++ b/Resources/Locale/en-US/tools/simple-tool-usage.ftl @@ -0,0 +1 @@ +simple-tool-usage-blocked-message = You need a tool that can perform {$quality}! diff --git a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml index b396b20a46..19789cd7eb 100644 --- a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml +++ b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml @@ -41,6 +41,9 @@ delivery: !type:Container - type: StealTarget stealGroup: Mail + - type: SimpleToolUsage + doAfter: 4 + usageVerb: delivery-slice-verb - type: entity parent: BaseDelivery @@ -75,9 +78,11 @@ size: Huge - type: Delivery baseSpesoReward: 1000 - baseSpesoPenalty: 500 + baseSpesoPenalty: 250 # So low due to dept economy splitting all the earnings, but not splitting the penalty. - type: Speech speechVerb: Robotic + - type: SimpleToolUsage + doAfter: 6 - type: EntityTableContainerFill containers: delivery: !type:NestedSelector @@ -115,7 +120,7 @@ storedRotation: 90 - type: Delivery baseSpesoReward: 500 - baseSpesoPenalty: 250 + baseSpesoPenalty: 125 # So low due to dept economy splitting all the earnings, but not splitting the penalty. - type: Speech speechVerb: Robotic - type: EntityTableContainerFill From 31b5365ae089f45571cce743bba0413f650607c9 Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 19:48:53 +0000 Subject: [PATCH 604/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f9ffb36be5..d2adb7bef9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: ArtisticRoomba - changes: - - message: Voxes can now honk, weh, and hew if forced to by a reagent. - type: Fix - - message: Arachnids and Moths can now honk if forced to by a reagent. - type: Fix - id: 7832 - time: '2025-01-20T00:21:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33777 - author: K-Dynamic changes: - message: Welding gas masks are now toggleable like other breathing masks. @@ -3930,3 +3921,11 @@ id: 8333 time: '2025-04-24T17:41:55.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36750 +- author: ScarKy0, Jbsundown + changes: + - message: Letters and Packages can now be cut open with sharp objects. Be wary, + this makes cargo lose money! + type: Add + id: 8334 + time: '2025-04-24T19:47:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36815 From d4c3ff3de471807eec986ad928f3b628f0afe933 Mon Sep 17 00:00:00 2001 From: Myra <vasilis@pikachu.systems> Date: Thu, 24 Apr 2025 22:39:33 +0200 Subject: [PATCH 605/622] Added warning when attempting to run RUN_THIS on a zip repo download (#36896) --- BuildChecker/git_helper.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/BuildChecker/git_helper.py b/BuildChecker/git_helper.py index becd4506e8..01e1bfd05f 100644 --- a/BuildChecker/git_helper.py +++ b/BuildChecker/git_helper.py @@ -5,6 +5,7 @@ import subprocess import sys import os import shutil +import time from pathlib import Path from typing import List @@ -104,7 +105,20 @@ def reset_solution(): with SOLUTION_PATH.open("w") as f: f.write(content) +def check_for_zip_download(): + # Check if .git exists, + if not os.path.isdir(".git"): + print("It appears that you downloaded this repository directly from GitHub. (Using the .zip download option) \n" + "When downloading straight from GitHub, it leaves out important information that git needs to function. " + "Such as being able to download the engine or even being able to create contributions. \n" + "Please read and follow https://docs.spacestation14.com/en/general-development/setup/setting-up-a-development-environment.html \n" + "If you just want a Sandbox Server, you are following the wrong guide! You can download a premade server following the instructions here:" + "https://docs.spacestation14.com/en/general-development/setup/server-hosting-tutorial.html \n" + "Closing automatically in 30 seconds.") + time.sleep(30) + exit(1) if __name__ == '__main__': + check_for_zip_download() install_hooks() update_submodules() From b3b6d4731078950d3e3a8b1558ec0ab7d6cbbcb1 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 24 Apr 2025 22:42:21 +0200 Subject: [PATCH 606/622] Disable shadows for observer pointlight (#36897) no shadows --- Resources/Prototypes/Entities/Mobs/Player/observer.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 7fe4fbed9b..2ef40d4a48 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -65,6 +65,7 @@ - BypassInteractionRangeChecks - type: PointLight radius: 6 + castShadows: false enabled: false # proto for player ghosts specifically From f9b3d59a53b0d12763890924eb58ff0cf036ef45 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:18:26 -0400 Subject: [PATCH 607/622] Fix QSI bringing people into paused maps (#36834) --- .../Systems/SwapTeleporterSystem.cs | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs b/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs index 0fbaefc31b..69805fd585 100644 --- a/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs +++ b/Content.Shared/Teleportation/Systems/SwapTeleporterSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Whitelist; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map.Components; +using Robust.Shared.Network; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; @@ -20,6 +21,7 @@ namespace Content.Shared.Teleportation.Systems; public sealed class SwapTeleporterSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedContainerSystem _container = default!; @@ -145,19 +147,16 @@ public sealed class SwapTeleporterSystem : EntitySystem comp.TeleportTime = null; Dirty(uid, comp); - if (comp.LinkedEnt is not { } linkedEnt) - { + // We can't run the teleport logic on the client due to PVS range issues. + if (_net.IsClient || comp.LinkedEnt is not { } linkedEnt) return; - } var teleEnt = GetTeleportingEntity((uid, xform)); var otherTeleEnt = GetTeleportingEntity((linkedEnt, Transform(linkedEnt))); + var teleXform = Transform(teleEnt); + var otherTeleXform = Transform(otherTeleEnt); - _container.TryGetOuterContainer(teleEnt, Transform(teleEnt), out var cont); - _container.TryGetOuterContainer(otherTeleEnt, Transform(otherTeleEnt), out var otherCont); - - if (otherCont != null && !_container.CanInsert(teleEnt, otherCont) || - cont != null && !_container.CanInsert(otherTeleEnt, cont)) + if (!CanSwapTeleport((teleEnt, teleXform), (otherTeleEnt, otherTeleXform))) { _popup.PopupEntity(Loc.GetString("swap-teleporter-popup-teleport-fail", ("entity", Identity.Entity(linkedEnt, EntityManager))), @@ -175,6 +174,26 @@ public sealed class SwapTeleporterSystem : EntitySystem _transform.SwapPositions(teleEnt, otherTeleEnt); } + /// <summary> + /// Checks if two entities are able to swap positions via the teleporter. + /// </summary> + private bool CanSwapTeleport( + Entity<TransformComponent> entity1, + Entity<TransformComponent> entity2) + { + _container.TryGetOuterContainer(entity1, entity1, out var container1); + _container.TryGetOuterContainer(entity2, entity2, out var container2); + + if (container2 != null && !_container.CanInsert(entity1, container2) || + container1 != null && !_container.CanInsert(entity2, container1)) + return false; + + if (IsPaused(entity1) || IsPaused(entity2)) + return false; + + return true; + } + /// <remarks> /// HYAH -link /// </remarks> From 407f0d54338f6689e0a3f4ffc319345ec06b79cc Mon Sep 17 00:00:00 2001 From: PJBot <pieterjan.briers+bot@gmail.com> Date: Thu, 24 Apr 2025 21:19:33 +0000 Subject: [PATCH 608/622] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d2adb7bef9..d82b8aa6e7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: K-Dynamic - changes: - - message: Welding gas masks are now toggleable like other breathing masks. - type: Fix - id: 7833 - time: '2025-01-20T00:32:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32691 - author: ElectroJr changes: - message: Fixed some visual overlays not being removed when the effect should stop. @@ -3929,3 +3922,11 @@ id: 8334 time: '2025-04-24T19:47:46.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36815 +- author: EmoGarbage404 + changes: + - message: Fixed situations where using the QSI would send the player into an esoteric + space realm. + type: Fix + id: 8335 + time: '2025-04-24T21:18:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36834 From 2b1161c8a6f791b2f46605d28fc583122ce8e3b1 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 24 Apr 2025 23:44:28 +0200 Subject: [PATCH 609/622] Revert "Added warning when attempting to run RUN_THIS on a zip repo download" (#36899) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Revert "Added warning when attempting to run RUN_THIS on a zip repo download …" This reverts commit d4c3ff3de471807eec986ad928f3b628f0afe933. --- BuildChecker/git_helper.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/BuildChecker/git_helper.py b/BuildChecker/git_helper.py index 01e1bfd05f..becd4506e8 100644 --- a/BuildChecker/git_helper.py +++ b/BuildChecker/git_helper.py @@ -5,7 +5,6 @@ import subprocess import sys import os import shutil -import time from pathlib import Path from typing import List @@ -105,20 +104,7 @@ def reset_solution(): with SOLUTION_PATH.open("w") as f: f.write(content) -def check_for_zip_download(): - # Check if .git exists, - if not os.path.isdir(".git"): - print("It appears that you downloaded this repository directly from GitHub. (Using the .zip download option) \n" - "When downloading straight from GitHub, it leaves out important information that git needs to function. " - "Such as being able to download the engine or even being able to create contributions. \n" - "Please read and follow https://docs.spacestation14.com/en/general-development/setup/setting-up-a-development-environment.html \n" - "If you just want a Sandbox Server, you are following the wrong guide! You can download a premade server following the instructions here:" - "https://docs.spacestation14.com/en/general-development/setup/server-hosting-tutorial.html \n" - "Closing automatically in 30 seconds.") - time.sleep(30) - exit(1) if __name__ == '__main__': - check_for_zip_download() install_hooks() update_submodules() From abb9e373bd4d2c2840c5ad92144ffefbcf00635b Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 24 Apr 2025 18:10:43 -0400 Subject: [PATCH 610/622] Fix storage ui hovering over the hotbar (#36770) --- .../UserInterface/Systems/Storage/StorageUIController.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs index 69cf6909e5..5e6779193b 100644 --- a/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs +++ b/Content.Client/UserInterface/Systems/Storage/StorageUIController.cs @@ -126,6 +126,12 @@ public sealed class StorageUIController : UIController, IOnSystemChanged<Storage child.SetPositionInParent(invisibleIndex); }; + if (hotbar != null) + { + hotbar.DoubleStorageContainer.Visible = _openStorageLimit == 2; + hotbar.SingleStorageContainer.Visible = _openStorageLimit != 2; + } + if (_openStorageLimit == 2) { if (hotbar?.LeftStorageContainer.Children.Any(c => c.Visible) == false) // we're comparing booleans because it's bool? and not bool from the optional chaining From 56ee29ab4194e6cd61285caac77d4c67fa57a288 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Fri, 25 Apr 2025 00:14:47 +0200 Subject: [PATCH 611/622] Turnstiles lower volume + access reader (#36900) fixes --- Content.Shared/Doors/Components/TurnstileComponent.cs | 2 +- Resources/Prototypes/Entities/Structures/Doors/turnstile.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Doors/Components/TurnstileComponent.cs b/Content.Shared/Doors/Components/TurnstileComponent.cs index 3d7273fffa..087cc3b13d 100644 --- a/Content.Shared/Doors/Components/TurnstileComponent.cs +++ b/Content.Shared/Doors/Components/TurnstileComponent.cs @@ -55,7 +55,7 @@ public sealed partial class TurnstileComponent : Component /// Sound to play when the turnstile admits a mob through. /// </summary> [DataField] - public SoundSpecifier? TurnSound = new SoundPathSpecifier("/Audio/Items/ratchet.ogg"); + public SoundSpecifier? TurnSound = new SoundPathSpecifier("/Audio/Items/ratchet.ogg", AudioParams.Default.WithVolume(-6)); /// <summary> /// Sound to play when the turnstile denies entry diff --git a/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml index 9434c9a892..2fde8a1a28 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/turnstile.yml @@ -55,6 +55,7 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] + - type: AccessReader - type: Construction graph: Turnstile node: turnstile From bce195b53e29f4699a5c792b9c3b237d24f79589 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Thu, 24 Apr 2025 18:59:39 -0400 Subject: [PATCH 612/622] Fix disposal unit flush animation (#30677) * Fix disposal unit flush animation * Revert "Fix disposal unit flush animation" This reverts commit a596ecfd5f5368f87ef52cfb27884a8e000185c6. * control by setting layer visibility rather than overwriting * restore changes --- Content.Client/Disposal/Unit/DisposalUnitSystem.cs | 9 ++------- .../Prototypes/Entities/Structures/Furniture/toilet.yml | 2 ++ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Content.Client/Disposal/Unit/DisposalUnitSystem.cs b/Content.Client/Disposal/Unit/DisposalUnitSystem.cs index 30ca320a2a..8c72cadff3 100644 --- a/Content.Client/Disposal/Unit/DisposalUnitSystem.cs +++ b/Content.Client/Disposal/Unit/DisposalUnitSystem.cs @@ -69,7 +69,8 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem sprite.LayerSetVisible(DisposalUnitVisualLayers.Unanchored, state == DisposalUnitComponent.VisualState.UnAnchored); sprite.LayerSetVisible(DisposalUnitVisualLayers.Base, state == DisposalUnitComponent.VisualState.Anchored); - sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFlush, state is DisposalUnitComponent.VisualState.OverlayFlushing or DisposalUnitComponent.VisualState.OverlayCharging); + sprite.LayerSetVisible(DisposalUnitVisualLayers.OverlayFlush, state == DisposalUnitComponent.VisualState.OverlayFlushing); + sprite.LayerSetVisible(DisposalUnitVisualLayers.BaseCharging, state == DisposalUnitComponent.VisualState.OverlayCharging); var chargingState = sprite.LayerMapTryGet(DisposalUnitVisualLayers.BaseCharging, out var chargingLayer) ? sprite.LayerGetState(chargingLayer) @@ -97,10 +98,6 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem { // Play the flush animation new AnimationTrackSpriteFlick.KeyFrame(flushState, 0), - // Return to base state (though, depending on how the unit is - // configured we might get an appearance change event telling - // us to go to charging state) - new AnimationTrackSpriteFlick.KeyFrame(chargingState, (float) ent.Comp.FlushDelay.TotalSeconds) } }, } @@ -121,8 +118,6 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem _animationSystem.Play(ent, anim, AnimationKey); } } - else if (state == DisposalUnitComponent.VisualState.OverlayCharging) - sprite.LayerSetState(DisposalUnitVisualLayers.OverlayFlush, chargingState); else _animationSystem.Stop(ent.Owner, AnimationKey); diff --git a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml index 2605af8019..1b5ac30a9c 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml @@ -12,6 +12,8 @@ map: [ "enum.DisposalUnitVisualLayers.Unanchored" ] - state: disposal map: [ "enum.DisposalUnitVisualLayers.Base" ] + - state: disposal-charging + map: [ "enum.DisposalUnitVisualLayers.BaseCharging" ] - state: disposal-flush map: [ "enum.DisposalUnitVisualLayers.OverlayFlush" ] - state: dispover-charge From fba07c69a9bde817f470914a4ab75685b0161bcc Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Mon, 28 Apr 2025 12:11:48 +1000 Subject: [PATCH 613/622] Update staging to engine v255.0.0 (#36916) Updatee engine to v255.0.0 --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 191d7ab81c..03f8d4d3e0 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 191d7ab81c3693503bc9f483c5829228d9cb57cf +Subproject commit 03f8d4d3e047dfbb8841cf7f40a66422b3b0dbb4 From 14cca7990aa112705b20e01af49c64e7c70cb2b0 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Mon, 28 Apr 2025 11:31:42 +0200 Subject: [PATCH 614/622] [HOTFIX] Fix maroon objective, change the text (#36990) * test * text * capital C * guh --- .../Systems/KillPersonConditionSystem.cs | 16 ++++++++++++---- .../Shuttles/Systems/EmergencyShuttleSystem.cs | 13 +++---------- .../en-US/objectives/conditions/kill-person.ftl | 2 +- Resources/Prototypes/Objectives/traitor.yml | 6 ++++-- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs b/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs index c378841278..012fb80f76 100644 --- a/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs +++ b/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs @@ -39,8 +39,7 @@ public sealed class KillPersonConditionSystem : EntitySystem return 1f; var targetDead = _mind.IsCharacterDeadIc(mind); - var targetMarooned = !_emergencyShuttle.IsTargetEscaping(target) && - _emergencyShuttle.ShuttlesLeft; + var targetOnShuttle = _emergencyShuttle.IsTargetEscaping(mind.OwnedEntity.Value); if (!_config.GetCVar(CCVars.EmergencyShuttleEnabled) && requireMaroon) { requireDead = true; @@ -50,8 +49,17 @@ public sealed class KillPersonConditionSystem : EntitySystem if (requireDead && !targetDead) return 0f; - if (requireMaroon) // if evac is still here and target hasn't boarded, show 50% to give you an indicator that you are doing good - return targetMarooned ? 1f : _emergencyShuttle.EmergencyShuttleArrived ? 0.5f : 0f; + // Always failed if the target needs to be marooned and the shuttle hasn't even arrived yet + if (requireMaroon && !_emergencyShuttle.EmergencyShuttleArrived) + return 0f; + + // If the shuttle hasn't left, give 50% progress if the target isn't on the shuttle as a "almost there!" + if (requireMaroon && !_emergencyShuttle.ShuttlesLeft) + return targetOnShuttle ? 0f : 0.5f; + + // If the shuttle has already left, and the target isn't on it, 100% + if (requireMaroon && _emergencyShuttle.ShuttlesLeft) + return targetOnShuttle ? 0f : 1f; return 1f; // Good job you did it woohoo } diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index 8e3e01bfb6..c9c764a014 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -648,18 +648,11 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem if (!EmergencyShuttleArrived) return false; - // check each emergency shuttle + // check if target is on an emergency shuttle var xform = Transform(target); - foreach (var stationData in EntityQuery<StationEmergencyShuttleComponent>()) - { - if (stationData.EmergencyShuttle == null) - continue; - if (IsOnGrid(xform, stationData.EmergencyShuttle.Value)) - { - return true; - } - } + if (HasComp<EmergencyShuttleComponent>(xform.GridUid)) + return true; return false; } diff --git a/Resources/Locale/en-US/objectives/conditions/kill-person.ftl b/Resources/Locale/en-US/objectives/conditions/kill-person.ftl index 48606b92c2..aad31d26f9 100644 --- a/Resources/Locale/en-US/objectives/conditions/kill-person.ftl +++ b/Resources/Locale/en-US/objectives/conditions/kill-person.ftl @@ -1,3 +1,3 @@ objective-condition-kill-person-title = Kill or maroon {$targetName}, {CAPITALIZE($job)} objective-condition-kill-maroon-title = Kill and maroon {$targetName}, {CAPITALIZE($job)} -objective-condition-maroon-person-title = Maroon {$targetName}, {CAPITALIZE($job)} +objective-condition-maroon-person-title = Prevent {$targetName}, {CAPITALIZE($job)} from reaching CentComm. diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index 0f53488e69..4b6d9e0e66 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -83,7 +83,7 @@ - type: entity parent: [BaseTraitorObjective, BaseKillObjective] id: KillRandomPersonObjective - description: Do it however you like, just make sure they don't make it to centcomm. + description: Do it however you like, just make sure they don't get off the station. components: - type: Objective difficulty: 1.75 @@ -91,11 +91,13 @@ - type: TargetObjective title: objective-condition-maroon-person-title - type: PickRandomPerson + - type: KillPersonCondition + requireMaroon: true - type: entity parent: [BaseTraitorObjective, BaseKillObjective] id: KillRandomHeadObjective - description: We need this head gone and you probably know why. Make sure they don't make it to centcomm, even if they're dead. Good luck, agent. + description: We need this head gone and you probably know why. Make sure they don't make it to CentComm, even if they're dead. Good luck, agent. components: - type: Objective # technically its still possible for KillRandomPersonObjective to roll a head but this is guaranteed, so higher difficulty From 4509821f0e0145bfa3632b667012b0031fdf8366 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 28 Apr 2025 05:45:19 -0400 Subject: [PATCH 615/622] [HOTFIX] Revert "Updated air scrubber and air vent sprites." (#36992) Revert "Updated air scrubber and air vent sprites. (#34223)" This reverts commit 3957bbb97d7cd59ce32d9aff736ab52954b0c095. --- .../Atmospherics/scrubber.rsi/meta.json | 163 ++++-------------- .../Atmospherics/scrubber.rsi/scrub_off.png | Bin 1213 -> 1002 bytes .../Atmospherics/scrubber.rsi/scrub_on.png | Bin 6218 -> 20683 bytes .../Atmospherics/scrubber.rsi/scrub_purge.png | Bin 6204 -> 7441 bytes .../Atmospherics/scrubber.rsi/scrub_wide.png | Bin 6620 -> 10949 bytes .../Piping/Atmospherics/vent.rsi/meta.json | 136 ++++----------- .../Piping/Atmospherics/vent.rsi/vent_in.png | Bin 4224 -> 1595 bytes .../Atmospherics/vent.rsi/vent_lockout.png | Bin 1195 -> 1302 bytes .../Piping/Atmospherics/vent.rsi/vent_off.png | Bin 1221 -> 1117 bytes .../Piping/Atmospherics/vent.rsi/vent_out.png | Bin 4296 -> 2926 bytes .../Atmospherics/vent.rsi/vent_passive.png | Bin 853 -> 2958 bytes .../Atmospherics/vent.rsi/vent_welded.png | Bin 1845 -> 1958 bytes 12 files changed, 67 insertions(+), 232 deletions(-) diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json index 88eeace3d8..191aa398a9 100644 --- a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/meta.json @@ -1,133 +1,34 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/32742/commits/44820f5b6e2c864a35bfad448e0a9437f01ad2e2", - "states": [ - { - "name": "scrub_off", - "directions": 4 - }, - { - "name": "scrub_welded", - "directions": 4 - }, - { - "name": "scrub_on", - "directions": 4, - "delays": [ - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ], - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ], - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ], - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ] - ] - }, - { - "name": "scrub_purge", - "directions": 4, - "delays": [ - [ - 0.06, - 0.06, - 0.06, - 0.06, - 0.06, - 0.06 - ], - [ - 0.06, - 0.06, - 0.06, - 0.06, - 0.06, - 0.06 - ], - [ - 0.06, - 0.06, - 0.06, - 0.06, - 0.06, - 0.06 - ], - [ - 0.06, - 0.06, - 0.06, - 0.06, - 0.06, - 0.06 - ] - ] - }, - { - "name": "scrub_wide", - "directions": 4, - "delays": [ - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ], - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ], - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ], - [ - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10 - ] - ] - } - ] + "version":1, + "size":{ + "x":32, + "y":32 + }, + "license":"CC-BY-SA-3.0", + "copyright":"Taken from https://github.com/tgstation/tgstation at commit 57cd1d59ca019dd0e7811ac451f295f818e573da", + "states":[ + { + "name":"scrub_off", + "directions": 4 + }, + { + "name":"scrub_welded", + "directions": 4 + }, + { + "name":"scrub_on", + "directions": 4, + "delays": [[0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08], [0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08], [0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08], [0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08]] + }, + { + "name": "scrub_purge", + "directions": 4, + "delays": [[0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]] + }, + { + "name": "scrub_wide", + "directions": 4, + "delays": [[0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], [0.2, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04]] + } + ] } diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_off.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_off.png index 8f7e5e6782be6beba8daa6b5cb702bafd38ea77e..efc173d893669b4ff418f61ae32ccd3d92ffd3fd 100644 GIT binary patch delta 981 zcmV;`11kKz3F-%sBYy+2Nkl<Zc%1E;F>l*O7=|C$od|F^psYA>5N~k^Gx1;;@L+rK zV59~AMS;!%@|!vqC^QL$mN<hK54I`LT23BrpuvFyk=p`gaCEIvNVaK-9dz#|9mVJF z(|sTK@m_Fpa&mIoTy4Gd2U(WQ0Lrqo--Tfaz+f<V@%{d9{(p}z0heWo5CSPBp6A&y zV+=|u4h{}xVHmC@5bNSU>%uI{W<m(kG{qQ0(==37MP1hjAqav1-}mu6k37$*>w2X@ zSSSC<9gt<&Y=3{>-aH5bs;XjgTQHtzc6TCsty0QP5}2(b2<ztm@DyAKVd0b8g1f0g zO38Sl0T@p-Qh!SBri#gJL7wM$o`(>^=Id(~zi$500F-4(nx+;$o@j=n3!0|k?DP<T zv(rPGreQd`U_8-w5^0(~DpYOM1%F`xvMie=NrEwkAP9(}f417^^H20+$=T^4{aEt( z{F5DvqKF^}FvgH1N$XwE6@O_BNYj-2`+KUY;_bUV3xAtW=Iy&Znx?UzkB(39eIKQi z{r&m*d7Jfj#$OnKvMiZSzw+hFL&5p;ufI7vJ>=;41OVUnxw*cw6YIwhc{m(h*urGY zPp#9SEB?|N08rPpEjYu`1$R^R2!3;Yh41?o4iAN?uIp9{@0$N)0E7@WqVt?<n#RKC z+i;$f0DrqX5kiPo3+|e~Fa^ReB#yVazYhR-|I4p5O=EMgA4?0rn<}){937wV@xvZU zDS{xN*V{(xu+_r5;x8?Nd7dMs1mNcS%5E`$ek{4UzM>yXwAPF#n(^ch`!D&vPoC$k z7T+a*VG0ZegRP<{@H~&Is?b{7v7_S?n{#(lWq%73fYzF-s_;CIq9|HF5_iR4x&y*6 zv=0??MNx$B`}W@$jxPB4VUM%ZL$ucHyh-fC%e+f#t1kFUi{M}|*sALqV+?7UvhyaP zA4`-{wlMAPL@1@`$I`-$F)L|^y5K+A41K@Jqi$@jpL^k>Zmieqt-KptH~-m_ocH5N zl7B4h$BUw1-R}cd&ENPpLQYOjPEJlvPEJlvP8+F>?*?1>1JX2QI{j+L;&_`p&pY!6 ztdj5i0ndRue}MA`IDf!q`U9ktw&1impO;c{d3o7p{r}<jW6AHot)9QsAK-Z&N~zZ8 z^Sxg0RsMi3_|6~j)CC*u511DqXm>tuj818NK-v|5X%SRPz3O~^UX0qR3%>IQEE{zG z0Ot>I{s60gpU*Gq$Gh?etdhU+Z-ktjoSdATHdx;Pxa0vevn7qZ00000NkvXXu0mjf Du-Wmf delta 1194 zcmV;b1XcU$2fYc9BYyx1a7bBm000ie000ie0hKEb8vp<VZ%IT!RCt{2n!QroKoEr2 zRSwA^F$sxDATbF!Bqre%Om3b9=kN+7IDwo5Cy?NT1SgP_pYPjJtL9Xa_D3uKl+;yM zcRJl|&-9K)tDSl8CXQJEH*w4YxQSyHAmzvV`}+%hetms)>woL(^}BF;d;89fgyZAm zAphm%WfFh1064$1vr`|p8L+Xj!P{aC5pe$S@UT9<zrT08ySw$f!6HS3C;{X=&c409 z`FDWhPft(&wY9b7zpIQaDuSGc7l+{!mOTCiKlW5&M2ip<z&a1{&&Nmq{g;yy|DBF` z|G2&F4Z+x@F@KBHaBPE|zrMbX=0}9(xu{9#6~H==y5Fy^>T_#rYwqFUVdeK2N`#oO z93+BuK9xT<5<3NG&OFL~+S_wK?(XW}*yQu|^wftU=a~u4$%q^gY}gOw?-L<-37{z9 z#S0Pu$<itR`NQTW#@6J3-zp~z1+zIOe^3A=Jn-%8%zqofcaQ=E!kAyr&ny44iE0S! zIF|q5;Gq7#i{C~_7di!i#5!-ua2^8X28_A6xmgi~8DaL?#)yG3ej7i0vagT7%Lj{2 z0T@^>!bxOGJZ<X$E6Os5C>v)9U~XwaeuaCJU*q&eV=w~vGlPi)15mha6=t(EiAdw* zKoP)9Hh=l$ScqT3^&uDm2yk(JzH*LmBkV-3@Z%b_C=me&(8VuNbXhj}tq)xYCP7HF z*Z|y$m=R@RKmx*05|oT6br;Cxk4b=_SAc45@52crL@tugM@Qa3j&%#d2o^4l^?5dM zB!{1cQVco;s1^@?F#-w13~Iy7CLn+jES|J3$A6IAm0<P11w!WXlP|JYg20NPgk%8; z2~l9CFiOkUq0a(VgcSZ*=Rq(BFbEGe7@=FDk_yKdWgkL@&U_P$!-GxrfYr&*XCfrU zc@XtDteI$g9tZY%FX_BsBN6Bp2o&x@it`|PLqsCzSnGu5YOA#Kf<&<VC3d8ew#3GA zE`JtH=X5CydG44uMcu?P3*aV>SpYY2%mTQHV-~<o9J2s!;z$x;jQV^E#^_Io7GSLU zd@OJt{+E{*f7~U2ODxSt34rr*R<#1b*5~=nkb-Cztn-%N_9tjZsA}R^6x$JkT+WB; z^Qz*O6v2ug(;om*L<sf=XhSrmKF_vT34al+^C|oY6DvY*e}KX+r#`RUVK=ZpKr^4p z4`M{<jR0M9IrVwdr7;M({3?ru5X=EX>hmSg$FJ&78-KHC(uJ)4fY|!{*!=<I0Qlim zfz<Mk)*qk*G}-<D4g9b42dF&u$NB>lZV*8JxB3G@{Ru_-0~p|c><=i`CC2rhQ-7b2 zZBPh-D9{Qpm7o5G=3=RdV1Ixbq*LqjkeBEW$n8%Mf06zGb&ST==e2w-)gPdKgB1Q4 z=Rs6|fHRR`OViE%0EJyFc?_%w&2I57{_5^gu0OzvVAln}*5^w*FIW+@ye`$B5WOK1 zQ=d<5PDsI6{Rv51Vq?_jQ!vI((<8ho>L!j^05@^W0=S9eH`U;qlz%spd;kCd07*qo IM6N<$f`qm|p#T5? diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_on.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_on.png index bdef533ae36dd9ff691ee057dd48a3444f6c1093..9bc5d8c0bf341e5ecd829e77a0e1b8f689be12cb 100644 GIT binary patch literal 20683 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 NE?>J;a?#?!{{!f+=`#QT literal 6218 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 M;E@AGR%asr3%w$v8vp<R diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_purge.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_purge.png index 6bbc79c31b2b608934a9acc0380951052ecde90b..75ba6d6de046aae288fa21c5aa213a07c35a64a6 100644 GIT binary patch literal 7441 zcmb7p2{@GN|Myrjiem{;%2bM?EXk5Iql6aON|cx>3E8r*Gh-<Zg^G@384*I3LWs=R z582AT?_?Q_WoFF!-qU&i=Ungm|NqW=z1KA}?)#bh@jUnU`F_8jWui=t4S(CUZx;jt z`R($hi{{`jf%E3)1E1z2E>H+$|G?#o=WqC@5L4Z+$NSYp7Fp}Q(C9Xg+10emEDE*z zDr=(SvqHy-yC+QJKX)gooh>oxI2$6FKELC+U$Kd|Z^yGL>##cQsifS`qiMa2^Or=p zqpf67AAh8k@+*wZpLhGwBXMo&Kx)M5Ru?u=HEPCiC0I#>_xwMvXxP#I@viUR-*UHg zbYx>)hCjPPQqBcw%p*(~Q`l72k2?(|B_%g*-n^%gocsR$CH6>N9d~?ue8s4n4_Lcn zJ5mHs6`1T?l=SuXe*fy#E31N=d-m+PBp2V--mZ#3nAqDNHOLeVuhrGp-|^Av+4gpT z4O_H9nRQ_sNtH;?%+&MIPF+BZIG#SGsoBhQmX)d#T{(N8t5`UsrKM#Px!ZJ$YG~E& zzW-U*?ii2W2lj>ENv+IbKG|TY7}1ZnlF+}g+QY+3FJ=l3xwNTk)OfN-%0$P63||Lb zqp+z1$Ht+0E}m6C@ES1o7s(byMaAy*s?7e^U(Q4gy2#1Iif~U&@;@j^%1w?RIq=os z#GcHIjIh?$*3G4|#7a^UtNEkj5JF6P5*A%&<Z^_F-T$=a6xQZ+lU};gz94&6;|r@H zJYrv#_y8;>oB34sV;HR{4vcC{UuWh;D~lV`!E{d#taHs0s#g)Rh&o1$o1et4h@pIa z_vH7!!K{r7KiRvo^SP1SM|$-MZeLvD{ZlQEOhV{yAJHzO%5GzQOj{z2*wa=C1>u&r za<&tLZ7&dB&LR87P)ifNo8iSG82W_8ZN%!KBqPt3pl2J=bw^iKU$z`6z)?`j=~#~= z26p$K3$<e_zs496X2}}hs{=Snm(*S(#Li7J5+-erRY|B}>JeQNxb)uOw>D(RP`w5D z&@mPW-qTu<XkWIwll%1hyifWYis!iYgumU4KWNR)GYN@}6)LN#Nqh2S$1?+2_mzQK zVZ!0H&Z3%k*?mT5Os_l7;gIN-!)rWibFl}cVhli1ye}&1q+>&Km{--+kAzr7U{&j3 zJi7_z*RItvR^KbA>Q4@3J#`r@OBN}%?{_P-`Etp~%-_&LU=BG}8Lwbre{PLh2a!G* zwAWNz<2HF6OqN2y;eh#$FlxS$+&&8lo^-*KoRLq7hPsvZ%B_R|LEX$ebNf>g4eqCs z26*;cSo8?+RGT@x74*;S2n)O$l9|^kLrBQP_NwXjuG<aabf#YVP81JPa$qjPVTZK* ze@Dn5j87%aoL6b^Eq_W8mZ?LjsGK>olaON~^Szv*g&SrYVL$b?5sPYOV&~W<?O4MN zyfq42-PhKT_0;Hz?CJe(bBNRI8(Q4PQ2WT_j}l$50`(1W=W!XTSFClG`xs!LH0+x2 z*?-q!T>l$0zK#<4eRd<=tus+#&y7CG?~`>Y$q2kHuxQfvW^bhmA*kLg;<iqMIvWfM zhg_FkNHf9gA`Cx^6_ls&%q1mt5~I_>PSbueIzP({kJJrH*N=<@JKBisFotBi8J`*v zBTRX(6*gYzHQyV|M%%I>Nto$1mFXPgkEPM<5<zxE8pNUx?NU1Iv*9i+)8xH=B(b{L zQESAgesT`Ejp$*Fk5(9?(-U_jzuMBKX$l+Wo(p*Sjp*v)LNd)8{jP{P%?_tZk!vul z&IfjxquI$=C7Jo~c=^2#-7~?yDsr|gS)@WG$ew9CD;lkG*>f?F9cN;+)}4FZ1!P*x z9$`I`QP$f+CGm-Ql9nc&mgHOI@3-x7lQo~l1=)jPi0Wx^6JDi392hKQOJ=>ElptRR zm3e1jCj`ZBXhkJ8Gu)_Zj8%QR_XJQ$-T71#I#ZCsYZ^+)P_<#kIzHPX#E+?M7EG;f z&;x!1MQnxWIbiKhw+2r5p_wB#joALxc`*6_-Ir-*!*q|7P2hoTZk6Dx=t(T*=xA_P zzsZ@k&m9ytrB*~bWE@AVFN+@U9c^FjB!A?h!lhb=*md%{jn?ijyt8ZC`)4-R%^c)g z?w>kYK1hi-lG}b?5-*3740+dm9;}%SN@llXdmrc@@|j?{NU$AJQwPwt;uCr8dHINY zCF>$qe#^2$mZWk&-%l$8hB~~5wdqh-4H<6sLwCC+1y(_7DkJ}EOe7(_Jv*Nb%?a0^ zSR!jgeEE{L09#y~S|We$xn(*}$Hosg?q0iQc=oLY1BA9_!O>yoz>Kdw5y?E-m3^%( z0WnqE_i*g^@!2@yfg|xPn|mjOQ&XL`*;J-WPY2}lbaPTl%1r3@Kifu~21<|Pt<xrP zipR57;!V0)XKO`p_M9N&Q_i2pn>k<`<#C^mCe6I@<)f<9vxV`veL3L~_3cNDQ&2Y@ z*k50oyJ6OMN^>p}BFN^!<4z^Nia9Cc_GM(Gd(i#Far-Y{!`JVxC#vaMS`H!mN82B_ zU#ZM_<&-F$*+IeDTs}T0e0`i~X4wJR%XuDm%7*<j8^f6uPc^;Pif9t3>~{(H0>yfi z3hMN}C?R2wrqy|4l?DT1dnBIGkL4=<PMiYsy?ETuHB(w@C0J{hePk*Br0q|3-|D;} zksz?<(2gG^PBo)`cNbVL_x3B1-~ZNt9!(v8gKt_unP`P&RaK>9to<~h5t#{tA0T)7 z8TJ~AU^1|avwZql)9WtAoR~c1b@43^1G^n~W;p{xc7obMp3dPPmVb2DYAw)NVO!uJ z4xMQh28M<JSy66ou{gK!IoI_4{_KgjJ<`hWgwj@FIthV9D8rks;pOFZ<HijYZS6M{ z>nRhurqQ*#+#mL`)&=nrDqPap*}LZOMaQfxUV%Ud`%P;rnM23H5FDUKo2y`33as0X z?Gg_Cu}4^V%Fh4BD=3N6e{^^sh(CF0UA}7ycln6a4e^&Di%#~caD%<M;YEv1M|TP; z>{5%mc%Bh;F>L2VN=ACAKQ%z7L)ILM%xbJZqkotC(#%inO1B+g0t=cFH~syZg#`I{ z>d$etUOr&t+8k#`3D{mByMFG|d^cWgRe41jd5Wnzp|ticn=ibU06LA5?!r!#7A8d= zuI!hSeXML~*Bnf43m)E%N{4rS3!J!{p4bp2mckxrj^L(4L%TXs2L$<+(aZ!cDCivv zo?c`-*wJz~vzpG^A_#)WT58MVb`;@9f2S-8i$ruQY0e|as_~bKgWS=z3=duPBo!&a zk>#cNl#Jq@{y1iZK<|8(&I`iJOm=1DM2SPE!p6qNi4!LP@($h}*S%Jd)Y5YKgfUbJ z^i0tAFJCJ-!<;}`S#`~Zz0YB0-LxJ;+K)Cz=3RN^gB-%IPXtM@JV09{RJ7At8ME{c zPVDFHO?Ie1A6%td$}pa+uZ~&c$drndl<VSwcREV3v$e=$_@ng*qOT}-_Gn@0_{&IS zA)f^M4cUR2c&AdPs-_0hyY$h}(D3-?*2I(~J`J;d@inzknLq5{e|+KXXC9i8ik$G9 zTn+ea=6aM0m|(}yApp_4YejmMD?8JQu=iXNf@(#Qk?}|xf8%$<KXZkjS9ZcB1<i!o zzRtjdlvpG|>|v>UqL=Pdn+28=;TK3-qMufHJ}}~7edIx5|F}tRAxAoOG7Zuluw3G> z1cOP>g0hlmAD`JUH-1>C3J6J-JRuczjCrJMSQ-6zYFYOFC{!iMC;?)CTAY%+k?iMj z!y;E>^&Xf=h3@tocj)ZHkKX5Q_t0PBskpSoRT#W=^ytv)u<b$orf76Y+;cA&=S2TH z(Wd0Mca+I<ll(l!(8xD&;@&tAO1EAbWRELse4k+Gu>SQ>I^>7pu^RY=n_%M&yhxmO zBiE|x!#8m%h3C4|D3i`13oX)jgf{QB-Nl`gW;cK(Dcbt+omacnXb^AT9~U3Wk*=6P z;yW-4vf}QrL-}xmw@N}_l;}_N3S1}D_DaaYe)3=mX<Q&8q(^XiQ-MzHz72y+r2TV( zZrO0-sSwJ57iE$pW4HHx$FD23mTME?%Dwr^)0WO?NJzUjJuA+%8vXbK4f4lJ^Vo;< z<pnjub^03EntHn-^*R>~5_IK?Q!isdO}7co3L7^uI?E%TVR8_JlqfsX1Ep4tcb306 z&sWM8wIokMQ-o?_1lK9ts~b2nz4CydXm`!whB7qc^>8B*^?UaY@>SSdDvkdZg==>d z?>EAJ)9&EMAQT`av*q16lQXEK5z1i6*7)Tkx?ZQ9&><qZ;mGb<z1&1cLMrz*xZ4!; z;}kkX&K1Y}<U3&_w7H%$-RwcDKC(XG(AkT(*(lntRpf{clfxyRjpFtBb;SxA|CueW zQ<T9NH_4|Vq@$EUFH*lf^_rXHY{>C?q$P^;h>PM5T82ksuhFxF53<yWi6)Pukc@xH z^sqH+15hs54p!c5Gk$D%urw;^<&W`qNE&3Sb8wtBBWfYhwAtAX(9M0R6%+rfcsADE zQ&R6vHp6oLmrlyK<kQ+|8!J3*Hqw*CM~^G}OXCo5jaC5d$+p*FsCJ6zl!xFX|K*%; zztV*lmP3Y8GT9zkacjF-DKtpG8hIQ2R>jal0(mTD%mHsZfo8SA&-<u67I=?&g60O9 zgM=Mgf)lnrnsI0~n);Tk(He5d75DWYqD@~TeKgw>en{LEhP@gjZD{f8<QwF|&SEP9 zJoK-$_kpFi-p??zP=x?W+j=r6fH%RKoFSOf3^|>rV6kIpUNgyPnJYF=Vetvq*!vPw zK0tBLe^nuvS=b9dSrWShd#gp~M1QL6K|<)pa#WKPr8Juk3Cd8d(@@OIDNCoXwcJ*d zmE`jWz-0O~vSJPk1{PH@sY5Qlhv*RJtT+ftBe@&85=`TWrAJyHk`evz3mPntvtA@E zSc*=IX^`}6+RdhO1?)a3#Ohhx-G!z3Pv3Hv;4Dylh*a&yKgb$mjwF@M9yr6)QgYYY zhJQ*jnrXB&0=0UIemppMOF=>5HQ*SmvKJ|I{?p5LOML|ac)`|9X{hWOis;<F1GlzI z7I~@<#F`2L3dSCR6QF2jZj4bXg@hN57=SQXF0euiM&XJZ2KzbgHv&bQ!qw*qyNkiV zi{Nz(MztFY-2Na9Np<atE+3l$T&dCYH6X4am~{&1kVdK$ole`XT|o6)yVw4>Iu_WD zZz0}0E;W@L>kGoF)6F4NfRbKCGhJ>k@cf)9@~wI;5Mhqy-6*thN5pGd32m}|7<RSb z2Z@J81+!@UWpllB{vk_H<20Z=uOA<H^cd8{8w&=^$2S|#eI!+AEcZijKqVjrB^eC{ z#fWBh(wt==_nop^xotmi7BGU9d8>C2bhc$i*&!r{1`*Rx1X0emaeJn{I^F*&;a(pN zve>%!U_BmRm7MP@?Oy6%4D%ypcd*I^3<o~DTGJp`>T5te6`|jQp`L0?ub9|s5Cp2% zB9GOVD!@&Q9O=u7=#ZVs5)P+tuA!;c7zDkPM>#})16ejapt*ncW+;W!Zw})!cR%sf z2zGZ?B`@)RKYKbvEs8fh`oeD0a|I`wnvco)tXZ5ZI1+kZ|8BM}{XcSsu)3|C@BZo` zG>9I-PfkoDoa-tQ5f{P)`A{{&0ehpvwJY2!8_ir6OFaKKTr(s#Ip^O&KbC}_MS7p? z5;lf5MW7d8$jUvk`-PS~&)?AK=k6sIU}srv&Y>rYYH<N4yVCk6@L1QGMCVZ3dM0oa z*2Y@PbU`qfp6c(Z8|#wadeeVEML;Jp!Rcf?{CI-trPx2s-t!AR=a-eUO&;(3mqt|Q zo>pDRXY<XHCmLVD2-xC^c7oY5oQH7~`MT&?vGY^NVOBLAG8_@<6y5ZDHNe*zR(rh} z5Ey)}8Y^G<*mrbT-yAZK;n?7NQ;D4y@qB*|05UZw<DxJY=#Vxv`HSPTNL`!LWOMp* zB~{Y!o)eqpm|%{=o_<4Cj&0br_%}}L#Oi+(w!KE-QVNLkur;fAN1QIljD??zLz7*A zQK7m|Hr(5h1+rg<Tge$665AQ%_)IVx#~a8&BhcSJ&>=vjS7+umh(B>oRQd!2`31rs zHdU3r3x|PFKVZ=wfIDZ+Uhhb~k*ly2+APU8;5hg#B%}EIr$jKZ5(bCAo%P$(@E7vy zPz2XD;X(hWE-porb06`h2(=1nvh#$~De&OZzP4!r9-Zi>W3HrP>kUM7Q-w>p+0fMS z_ne$NL?(GH$o?dDmc^O!W0la46Bl{zuavk;KSOB;yu3PQ2h?`<<fDxuxjaM<c@SUa zkxJ857SK>ExwTT_Fg>oLb&1##f5*+;&hBaC4^U2yEI@++n`GeHo9@_Uy0I#qIlX3c zq#3Z8_R2WO&$+m`n7I+du5N^?#v3o#A#1h(9RfI_R)%UHk4a!>S9vQu2shpd1my?l z{xg6GO}jrcxFyUeEW%agQ&(wB&S*>5?lh2dICxkZrw0YnHo!I(I&<Ql7qFk0gtWF^ zIjo^59O}~y&-hxhkwjl6rlx*4OBNLly(C0m9;E*N3BDVO-xj)hIlXHqH9Ir4OMwL% z?znep2`_NMytgc?Y;s99s~_jbFxAage0e_PqIalYjAVq}`%8U7H0CFeTSraj;B=SF z@Msgb{nb+~>O{e{yG?L9f`NIMBD7CPGhWLh?A9n{Qo3@xMc&0ouG;}5C<BT?04XGG ztux|XS(#IUi$H^bdT;4<pn1PCE6Jjp<oO{({{=XNL5EjmRV4!sr#=K{VV&vA>c-HZ zx)<0bo}XWZ-IrG82#*p@6_`A-*+?AxuwN?no?<abg0L~x9Xfv?-HZ5FBBVRRQ1w0H z6p0=Ac|RUiB(1vLY1Uty7=Bc-H$Tr4Y34ZwSS8YPX^&cTonCrrV?FRDWGrUS2S4LT zq0qhhZ)f@n!l-{Iy(;SUjmX{yDyFcXz;9CNx;oXcvje+qrzgXyxPMn5#pvK)h(B4W z9NLj~F2Aj_v!u8<r1xP~&%?~@z7$$tN_%S{YUF{vr{~Kzx4me!_~PR9Z#&FP=-()} zx><*kW10!i+y5XJ=}-k`$G?`tiK`xG&g2~1tVnTUw}#_QF;^q7L&U?pMpZUW_*n_s zUt~&xwseXiSN_zKkT6;FtzP*r4z;n!Bi;?KruKhE!bRmUB!PeJUwbR}-C#HmDWf4A z<q&+>2uyH(unCM#?4kXK7QELwoChK`g@n7MVm!9ge|7NvfCbVZeuhO^l)>pq{zC_4 zV&72)S7U7zf5L+w;81cJbqMh%Ndtc>{^B5ian6-k+iA?Pw&Ks7Zj^vqN7OA7jpTp< z`UoLz3=GM!NZ_!3@>x?@I?aCBd6nPl2V*Ia+vOw*rwdfdpy8iiggJI119F0!4J!QG zWnu|?BVYM?@@qo!Szqz{FidWC1h2@qHRT6XJ6-Nwee%!Y7d*(Ko{KymbOvMq)?vYE zFkU?uzbbzO=!JI}fccc;X)n*dVI$Pp2in<gq0GN^1HIpXI(|K;m|k7YeugF^9O;bf zn)2XwQ6Adfqs^K^22u#0=qw8c@IN#+dEb9pu`_P|#oEf_o&)q2iG}3u{i2q?T!JIf zyS;q)09P4*+GKi}SdX)9#NHl`v<#(quW%TeKb>Ehq2UPJa!RTYzoFxLKyI!&!VAaD z?C99E1ZGj~S?!g2WZ5mVd$I$#X|@r^jV)Xpk^g<*Lyx{)F1)UAG@mS51A1O$sO`NS zKV_HW3@S&)nr?m@10;l`Dzv$!_Rb4-w_^dNDn924=-MA&i?6^?s_-UO4XdZzU~5H| zS1-8xdxx~o9}YA<8ykj>j6-e_B8MZPAp6LqX0p)BmisipwMY;PHi<s?K9$RJ)S<Hp z(f>33zd1p>COBC1EA%NOdZn1)N3)=qElF1#I&-)&74^H?j<Lx9(Qo-1!Z@ynJI^eE zJ_M&9&JCZZLxr<!>0F4>8k^^6>TlPtzlJzR;C1TVcNm!#|HGA0PyGCr3Bacv5lc_$ zsqOJ)XaQRtSSt^l(R#HYVMFEB)q!WIvB~?03n;vL(zFgKpwfEc*S{!=dk$znSQ&^L zo${XGK4EMah(iON{vJ&Q)c%zZ3<fxNAG+wnF9EhB`)6<Z6tWw$!1FuMEwf^Gfk^+) z(md=S<Bu2l=bxy@Y;rwTj{#+7)jcx`{oTY!<$$0W(f4k^Z}c@WF|iSWh=FC_k2xWj zw-qh_rp$fF0*#$sc+QVEo@*1eo8ee(sVO&=i@>?y8M71lxx*EP7!gCAnWo$>xXGgR z<7;}5O5GfV10KQIH~5x$`wIEzD`Fp(UoI|4M&khN%f(0SCh!~CFv1>gC;?H?J7)tX z+_I(@Rsa^!%9D-K&lEbMA(FXp!Yg3+U!<dlebxn>!+|8cE{P|I#j1=2ANeZ0y3<hV zk+xP(@Vj(6Ls8f_zYkgr41+!t|A^8X?-d^YMiY)SA2{~^l;&W`|0vCcFn3)+nW40$ zu6%9a--P?Y(sY%N61;z5=IRbT-G>n#fv?aErvhQfBNIcs=}7h3PSabrE|(3z(w+#6 zQ|;;9YD3e2AG-FBJbysMdRKK`^>LV2WBwN$F8!2@PF|)#2xhLhb7(&QhcFCbAw7GW zAFDusBXslUOmJMM$RtSy=HAd=-6D8su?Fx{*8K1|ciC`3uxZ6#a(>)^Z#yWIvJI@# z5uu3RosgnaLvTzRamrVv!6}t_ffVlpJNV*Kv0xh)Q2wves%wG87P!vGnehD4g60se z)QjAw4deTu{4cbr8V7U|Fv3%@#+*2K!3gh&CCEOZ>TjX8EN_OEF)r~U2efGA&a79O zHQ<r`mmt@sJ(-fvf$Pq}tG*NOiK^86@_W7r0?LrFU&Wrf<ju({0p*BpnTz-@`@|+j zXPZyB48Hub?|M-CSD&SuqeV@@qaZb3z(b0&U;KA!e1Wvima)(_lPfbz06%p?F6$d# JEWCgU`(G|XNS^=z literal 6204 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 Ul2s)9cYuJIiRGz$qido60X#*jkN^Mx diff --git a/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_wide.png b/Resources/Textures/Structures/Piping/Atmospherics/scrubber.rsi/scrub_wide.png index c7fd087c81d7f95f779b5626e7f086dc8f2313e4..087777a888b4e36294cf5c6e2b17f25d92bc1031 100644 GIT binary patch literal 10949 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 literal 6620 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 WbuYi0g#WG)usm*atlZo+{Qm$+I5~^} diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json index d22d006684..74e1688748 100644 --- a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/meta.json @@ -1,103 +1,37 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/32742/commits/44820f5b6e2c864a35bfad448e0a9437f01ad2e2", - "states": [ - { - "name": "vent_passive", - "directions": 4 - }, - { - "name": "vent_off", - "directions": 4 - }, - { - "name": "vent_welded", - "directions": 4 - }, - { - "name": "vent_out", - "directions": 4, - "delays": [ - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ], - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ], - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ], - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ] - ] - }, - { - "name": "vent_in", - "directions": 4, - "delays": [ - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ], - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ], - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ], - [ - 0.05, - 0.05, - 0.05, - 0.05, - 0.05, - 0.05 - ] - ] - }, - { - "name": "vent_lockout", - "directions": 4 - } - ] + "version":1, + "size":{ + "x":32, + "y":32 + }, + "license":"CC-BY-SA-3.0", + "copyright":"Taken from https://github.com/BeeStation/BeeStation-Hornet at commit 4ccd79de285e79e504308bcd6fa5908d6b7685f7", + "states":[ + { + "name":"vent_passive", + "directions" : 4 + }, + { + "name":"vent_off", + "directions" : 4 + }, + { + "name":"vent_welded", + "directions" : 4 + }, + { + "name":"vent_out", + "directions" : 4, + "delays":[ [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ] ] + }, + { + "name":"vent_in", + "directions" : 4, + "delays":[ [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ], [ 0.08, 0.08, 0.08, 0.08 ] ] + }, + { + "name":"vent_lockout", + "directions" : 4 + } + ] } diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_in.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_in.png index 17a740920f85f7902cdbd0bc8edebb1044023ad6..cf1b050c0246a699f147b5c266fe21f404b4f2fe 100644 GIT binary patch literal 1595 zcmY*a3pmqj82^ux4Q13iIl@pO!#qz%bj*ebDO5riA@@rZ$&zNail|gt(q&st&!J@N zI4p#@9TcJxl4CBJ>)giJ^54#X)v4z^&-cCG<$b^3@ArPs_q^X_Pj}}vDq1Q40IYF! zaoi7$WO+v@LAD+r*a84b3a*a!Uc~!?`$s%Jh60!TwTxA^WSi<~Zat`#S>hHEV3Kw_ z;(=k2o0SPGu{;xGfn>km6DX|xrS6fIN*D{R(mh)dZrjvR5rY<;+DWxjy@vQz@N^;G zM_;pl=4$ow?2fa51493Tx`Rv9o6x0}@$vB|65oBOZkZR#Nif&idgX+Yu-%ILk9qRx z(<tD2%ZMI=G6@67n_VaBBW<w?!gfPmoI=4<Q*5B<rK(`Gny&kZ)ucW?-9^Vt3-mwl zYJ5G-67^BBGX}P}p@@!{dG_gqJWSu!&c!>TqoS)<sP(o}Xl+XzAsjqmWM`g3HEm%@ zKQ#CaGeZtF(x%ggftBX&FotvW+0|{G5S4L;g1!1P$>Bx`Uk#t(=xL0)-i~gc@9)<| zP&|d@Ji6>MNZr)8Y&|mG6GG!cfkQ2p$){#G`t3M1d-d6c4|yW@1x(8Mc=*VEWxzdH zv19%qy`6pkPzvZfF+M{?XjW+KH2rxePJi(Aqp^}5D5u)6Y^Ubpsj{Mtohu8o>4Tpd zGl&jv`(dLu*v2Xj0>R#QyfX?Yl~vKB$Wz<a*J9)2fooxh@!TWvNaoEwYR7F-(hH{j z_8~7iz$Wk6l;!Ro92uhAo(#p7RF_l3xk6R`t=MUH(}ZPsu<Y<y6RhSyN{h0EZ_&WV z*^m{BTQ!Bz9KLBX&MK3guNz6gWKd`$TPk0Lo{BO~ovF{63o50Y?WTF~gG`G?c<sUN zpLn?|C85#=-`<?$e5toM?7gh8m3m<D`F-GqCt~iT(M`DQVMl+eS%~V9S7}w`ihJiE zY_pJ-+2=X}9T#s*dYX-f^2LdQ*jD7_y!;i|z6)M+Sbv_s?KHz#78e1lnLF#k?O~7P zxNWKLuXRgliU$CqPf~uBA{iN$%iCky(4IwlBDNujo%i8J-QE<$irYG5B*UQP2Op&@ z!y2-2-cggl;S*|rr#VeM^Y4<A;EQ$EB>3`6yQ{WjKPlN*ftC>~*0B_kB`a}{gROU2 zRS?MQz{PWLENEtA_vg{Z#zBp)Uh}}uvR^bkTv*rai%o-y1Z%geWqF$B*lyswVkfNT zyuvPJR*y_B0rr!z<&M^P{IT^;8YxB9rBza|H;e~H*;Jw=TI2bpwVtR|LZOhJ<M4ik zC-bfK;>Vj2a<y@%y8NU32Hy0s?`XO)e)AV_IilwRS{8kms5|kgr5YPNfrL@?^m+>i zc*ivueYy$fbt;Q1FNDWxQuI2j)bsfMFM54^q@{)Dt3MTjZD9lM;<mTEIc+=c+VDg( zmCj?zII|e<x&=%epJqXrU&N#W(d;JJ@NOnr%$G`{NWx>aQP4|ZzTOV*4!{k@bVz7+ zR)2Nvtxi&!`t{Px9!wx<^o2clZBK#Jn@#POa?Sy+H=l8R8m6*0^y+NICf09ut*fh} z2!Kldx$=!&=_|~|MBGo0(wwztOcKr{4ARFd4kQvJUS%(>!WappZA+s@lsg_@%E1pq zQJGQV5b+>jM)x3)n;?vQbWK{aQ1k9%0tlFYeuuOp03ZOhq%k-XO(p>n*ciM_otKp_ zU(|~h6g$3#e4UU5&`w$N7pDY9k$^<D*nSd%MvB||7!1U5yu2L!;72H%RBr4U5-%v0 z$W`bHsa*^bfSzv)3jae2Ax(M6=@%5CHums8dM0|nA(=pzYgzsAo5JrpIMB|30R$o! zikMg$uHwUspj_~utm0Eh2I=De^XqRen2ia@9DRrEkgFiJA`hoXV9Cu^Sr2n15K=L8 zRE`aFAem`jLFLy#R-FThat4d&ZwkL(Lr)BpZf3IF$wccF@UoWfqD!D$map?#LGfih g{<?4ZN9gn`Mj9k-GE3c534IEHtCPDU%OQaBFIKS+>Hq)$ literal 4224 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 DsvmDi diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_lockout.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_lockout.png index b32003c69875377f1c74b926270c3bb17a93c7d0..bf0b9c928eec6d868a5de6bcbfc05e05e547f4eb 100644 GIT binary patch delta 1283 zcmV+e1^oJ}36=_wBYy<lNkl<Zc%1E8L1^1n82+5DhT<(oIV7UICPYx2HrOu2hiql0 z#Uy4MCJAFb_0-EKJq>!;ZI@m;20N9oOHb>im$ZboIKen%j0Kv&V&g4lps?jJ6hmj6 z))W#F?-1UL)I_qRNP2AccabeU>HGCPz4uH1`$DZ&3!RJ}(SHGmMpppQ0f<Id0MP-6 z#(QQ5LZJ|Hxg1Xsnx@&ls4UC;_x${P$Zc?5@mpm&Qvq_hTx)D>3;>|2DkMp=9RL6* zio$-j+=$>MKLAsHQvn#trFG;BD~`wkAe$LSJdt#KUeNrO0;sAAN~z<UDVNqkDMjS{ z4{V<!ir-WKO@GrMNfIhmib|D285%SkpMCiF#Pe?7y1{!aHgd_)*cHLwb_k5d2nZpF zL?y%I^4<M!Oasqm#z84<cWGPjo8MA^dcDqjfT?=<;(0`)Q2@X%tH1NMZ2y%+oVV>C zkdI%~0fOK+6(B}-aWi)SAcfkt20{qpiKL+ydZT$vOn+wie@)X+F0ErUM$kVX<Ic<h zew^RM%a_h>+-rVU0`x}CV3?f6$c48kE*pCR0DsID7xKtlzlOOdPcbt+#oMG)eHbR^ z&>K19{O$wfZ#xG7N8^yq#B7%R<kQda;`uWaic7fqaT>K(bx+5C5d5|TVB=7)bfLI} z7tf!85PyPvVdYq^PN(|p-=RQ$Qvr6G``Dy=*w_m59;m&l<MS_W001T?vshd>9D{5e zvN1?0#l}_`n{*F5&3#ul9TdN*096{sgSj3QmsbG*>8l^%=bx6*Xf*KKAAcVO+Gqg4 zvHg`Q1(1TKg<S~{6u;#VkR-{Fhnf0T(D#BQNq??igo5I4I|u0B#O{9o!-;Kf-!cZK ze-k?`{N^_mfaP0#58VCgOItzfXJUQcc7mYzEuR2IQP6zz`ovk*P7sQsU~O&9(Ro4h zw;clUMAFq)o$h=5RPdYMv|7?B6(LIj{x7f+pyP|8T>(S~AR1i(L<b-mT>(S~AR1i( zM1Kb$8eIWI2Ot_9FM#Feu-VsGjO-ff?K{nVROwOe&F`;4FZmt&1M2lUZsra!OwRJQ zn{*Ek=6Vck_<s2V-0<VH{s2l3>vE$p!mF(#7vAzV8(U!%msk1m(HKGV&1=v60e<pZ z&H<{bB41bmAp`*UwzjQd_E8DTtN&p3QGW@wZOw3;Emo+i>guM0<ZtT_01nGi%FrMp zQ3=Y>Ak;tqLZwPU2r+E+?N|-(wEh6U`E6%`*@urI%QAi~l@U)Q@$J2@`6I@*ZY#hd z`5mXhMxy~)mNEC_Dc>i{GA>^{@0i>TyykZ-09$^VnVv$qw9fZ4(}Lgdn&0({P=BGg z#0^Y(n0a@+hFAQq1Xx_i^YwXVQqbE~{DznOjs^HIbqN!bSr9__`n=wz;y1kJw=KX) z3y_2mWUgOxP3{DK@w>_b4Dm#g&&EM!0WbMoWdZ%m#mw{+G))UM3wX(I%Ok|Vh*|n! zKHh9*99I%?XqtBHQS}mj@VE5`ynIUpfUmvlx9qsS-MiOuf}r@@`UCW41GeoSkhu#h zo$ABJRv48kHMH}}AK*8?ZGQl>n=l9FFgeHDY|=ddDM*sU+j;E|@QdG-Kj6Ps5pv}Z t=oEB(QM4<7=m12cD}d+#M5E&c_!sU&0|$7TVR!%l002ovPDHLkV1iqXa%cbm delta 1176 zcmV;J1ZVq}3abf_BYyx1a7bBm000ie000ie0hKEb8vp<VT}ebiRCt{2o9{~$K^VuM ze!K}nk&Esi13AR%jY3DB`433-CN+8`LM6Tsd}k5V3ttpO`7RKVQV?H7dcCReA5hOw zx(KY0!${$b4zU;Z%51+2bIdNcv$JzE3f+8QnPYc$zdO&&?0?KW&m57(VzF4Nmm{K! z?d|RRl?u$y&kHp~bar-Dte?qbg!;#WE}-zKRH`EJSS&{Iczi$XCCY)qcXV`Aq+ci$ zXlrY0UsMT!24L*$?9kNIRAlkt;bBT75|qp3BHzn{Lf}~{`o&@~G+(FzzJ6Jy?ygRX zor+0|7k?G${eQc+bnEsV>3f2}b5!+P(`})7Lk*B!`rsZTPoI>|4c)sRm>>Cu#$UL< zbr_%$eJut^w_c+9`g;1dwpKdV-`^LQANf#Y8yg#;;xd@l7aCxFeVtNGd(N-#G&-Jf z&)w+mqPBFa`<t%`{(OFSh2l-_2q5(mLE!#M^zr^-1b==VF$y#`Hq!R?HvQZxxV0eD z57GZ%{d4CpP%@cxKZ2^GKub#t<@0&>I}}y_bUZ<Ib#=7nv<T5Ca8&fL+S*z-oqBYJ zl8Id!cls7PAe8%<bJHfrP&jZN`H&xA6sQDtzp6fae-WYI0MPqz)2#v4_n4Id(uGBG zYX{f!g@2-xA1$CpsnELg(E?-;wg3iS1F-bvwzT^~0O`zZrc^V04d}w8e${^igk1oI zKU=%$97M_Hw0mwbyF{;NW=nb4_{^Ul=($Mr_p|fz5+xOY!k=`WlWJ1Xr%n2?9j+m4 z0ayzxWf!Hb&tSEHiO}5KoN^1mT3~YGrLsOILVwH4%jzuv@H4Tn85qOVOfagx_L*SV z42)rFCTK!G)BsnmUQ=F;=|EM#x3^a+pU?nU&toz&HZ~Ud1$2O=FqX7~gM-F2gdeAa z@W_ZbY>$-1VzF2(7K_DVvHZ7G{c2FSKLB1?e{cigDtLSO^H{gTf$7{+?orD71EB8@ zaepJ+1#d4O^gsw74%~)@hO+v~K0zjqP&52;a8Dst2XAlQ=kkU3c5-61ln<U9U6CQb zKD@msFb}-fOW8sxAKdaXk)hDQ2;5P85CXtY|Dfl$C*`jr)#VZ^r;j+r$lx(g>erXu z)FBlaf=e1+SER}2o36l%H-9|o==6#wpMOqF>Pr~_@GfZxJR6<!q^2>YFKqw@A~1mW z!vn<U4+7o#kqy9yr4WH(l-smm0^RzN4Zv7f%(}q`1R)LsUHZxf;N$babj_R6k8A+e z_xwZCL7`h;xdmWT0>rUd;V{spFKqxm4$t6+AJe0NDgBB@0l@km`wE*zx4u#rz<=;_ zcc8<QGW_GS33Td982|#XG*WCo!I!u1`Uy{(|Mbd}PbVhzLk)m9yMM^R2Be|qd!CfP zj#TGj$ghu;-s9;SPpYaPx<LX<N^CV@+f9Pj<5;4$rW;E6WVWiyfF&`u+OX|5!Ttzr q$!U+gEvM@LF=DY;EEY=@^ACczMiHO=TqtM&0000<MNUMnLSTZeO+^_1 diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_off.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_off.png index 8380b47e7c595a9d1bef7978146457b112ec41dd..6208c59db793f9026125288653ea9d2ffe249a05 100644 GIT binary patch delta 1097 zcmV-P1h)Id3Ec>gBYy-WNkl<Zc%1E;L2DaF7>3`LKn`vq_TpW_V8cRC6C)|GJva#o z3Bnd>F}4ZG56GqDSjeHbUV3Q><QQ_v56C46MhUVJGA<=Pc%hb1iYP3!3}tKxLQQh; zDLt5PGHXez-PP{upm{DM?ab`E`_0bG?#v5lG#ZU&dif$KbAM%J<rDoDLWDl4Wm)p~ z#>PgV#-#O61&KS30|4+m4~Aicz5oEQZJU06iW7va^oIt3Xf^jytM5h<2Y^a>5rtwY za=one0|VfB9ysTbZ>H7U2j?6!U!4hEXHxn@10aNeVHjw4INBW!dw$NB|M=;%f%Wd+ zyDM8P|Mi7PeSdcn`Xjr*LY{#!hMAn<8(bd#^3%`@uap<TIUjZEP^7IN7=UiKD_ek~ zdhz@@<Z?Lxz?;24Wm!6YsaTL@XHBdBq!GwMKQI6^3LhQ_Fvd_QmVB*nHdn*aaz*|Z zLZH>$$3mWA*0kU_4yx5^*!!J`eqaC&4o(9=Un>BRkAK<LW)0<=H}L$$ORTT0`l3(u z<C2B`$T0x;+z)9arcw6Rx8LFQt19Y^ZCt%}9f$9_iT3|2^g{)JT0o6-y|Inguc}~- zp;q7Ro2$p||5@n=2Ea6r!1?DEIDFT|?K^h?087giY;7L*LF$Lp2dM>2^C;@QX09I? z0M~WV*nimr09?O%1;78cgI=$Pw}1UB%ly~t0YKmJc4z!<kcEC=01U(M&BGM^Ak<bc z3?uf7P*(aQ#{l(B?7^ca1IygM=f5!ZO>A7!)*l)Gns3z>c<{sbp)Oh-iPd>K3R&p~ zJ^{9E<Ku_-14r2~7h&5rT-S|MFKhjgU7%1b#ee#$Q@+Q?B5nPtUlG!1G#ZUYqtR$I znyF;!zXl`w1G?QV9LMo(I+*4WT-WvO;iu&fNLoLXKY;V&b-9H+8@SraIndbIllcpI zhL0cKC*}`GQ~%4LOwaRBtM7s_1^_ZWJP>H??D<kPpEfHz&x>}q6VM;&4*-srrR@1R z%zxwz*z<Gn{{9E;4hLh*m#XDx4R2h3K-&6&Pk_qfr_W$n7XE0qP$-u0>(4*RM~u?A zE5MV~4;=ua*XzNuEIfblQXaD`3m4Cyi!2_8r1c{QfVQ93*H+PL?#tt3T1cCu^&<y> zs5iEyfk|bUcPD9*(vKB@t<9R;pC^-oYJXQrn<Vuk2jKEI7qGNk0b@+=&#N|-v`Jb& zbN~izKr+TqzIh|Icofpok2MPrg<?sL##zn+N$SU%1=N>|^|e(9Au^o>lGG375h6&K zrXTY0R?3UGR4hOU(f6n(NgDbi{Q)P10LZ;}HKlyD+{yDqAuIin{s7f%K<TV$NkSJE zrR@&)l}pMWkhXqke*oD{$botCdmK3S^ia8^{Q+s|PyLFJMx)VaG*is~ftjj!5{q<R P00000NkvXXu0mjfCuJRr delta 1202 zcmV;j1Wo(h2*nAIBYyx1a7bBm000ie000ie0hKEb8vp<VcS%G+RCt{2TDwjgK@`1_ z(j#ybyP!apr6d&vicS0jD2XTxq(#a@baV)%bQwkY04qvG9dLn?$Und<6;&QWh=Rh7 zVj;eOa3)-9yk5`D&SNQdk7SLtJG*D*+@06G_bz1|xd4=L<bMKC#*qu4x>>K+uUrZC z_V(`BKHF$CocY`BwvvCW0O<VO+?*46p-`Y=v3R9xL>$ohg@pwt{%*HRy<YE1Wd!XI zxV*fit*x!Z<jrQ2N~IDVA0Lwo&<VWDhQHtMYwKwR`1SJ#EiW~waIauY-v8UDZ(qOA z%U7?-6?l&=e}A<$udS;U;PB|X_<eZ)Zg6d5^X=IBsJHR)llbpL02h8Q0@SLHX?l8^ zexIBSuC1-T8CxIqV6pS_bMk@E{7M1N&dvrFV5}@J(R{5c{>zpax_)DU2M-^S3$7<G zC;t1zl9od$z~tm4EiNw7pI%p3fyW_RBWej;$M}QQ(0}=Ix$HCv;`!CpRWT1G<wxhy ze%(Z<6kuXvf-WvDMyvqvXNHD7nXid!vPB?(>necfPft&+_+dD-Uk9U|Adf?~0958N zhI0Ra#64I<zUK=e`HcjSEg)v&N=1;e1-5tEBhR>we^-8d0VYrifK3n}TY$$O{<B5o zu_#*rn|~M=@bk9(+<q050$}{_?(T~JFIJXCd2o0{pSO1gb$ES_UWdgnfw=(VpLd~2 z`2mx!Kq<h?%*@C-JXM$)QatWDTjBaVL7h&AY=P%_1+d{q`<+$+K;DVzc3_N9JHe#< z-gkn!9T+3jPA~+&R)D9^o?D;Be8869bpBBafPeEmHY2T8i*5s01u%x!*Vlt_j1>S* z1UNHX&+|6U5PlBM4043dBc=QTY#Z+jF77l_<W5n_IC23f<H!Y|j3XC-GLBpT$~bZX zDC1BHkVbr7g*5ULl=%U(v$Mh<5P6}9*vQv$ZifRCKD-!M=Ldj4>eEBG4iO(Y=mGC9 z9Dlg*0mkuL=Lax3Le22Y!9B&^UUXOnyti;*ay@u*qT(e5KOg0Xw-+6j0q-^6=g^#& z$PnC7@Uh{=@Xeu=JIW=%_fg_GAD*N*e#9zu{4j`#C&_3ML;wO_S2!L~?jIZuHHb^O zo==42H(mwcl4h?gM`WU9NQB}~ybK}&gMT1IRB6QL(|~XO!~!7vBu8KvNKQb5WJ`sB zZ+`2I5XK>b5162C1HSmJ1(4(O7=xiLABsP*06g|E^KyJXP59=w{sNGcfX@%<DZZDz zH2IAMVC8uh2IS=@^ePaF-)R*9c<k{k92&m)t%d+EKSO1uBL0Wi35Mi15;I)C6L zN1lPX+}Qj-Cgpm*5RzXj04FNSgh)c<{2MtBM{ba>`~bWMr$PDsIO%Z~8kaZ=MESjB zi{nU%R1;1&;S9{^c^pFEJkIq@$W4GFF;Z<f-G(zzqy7jO3jT<sX*tULfa@aGBQvgZ zao24_+&4~?SbpRz#N{o-C1g3}2P>ozpI0G`{Dj;oN*PBk0A(Dx0F-h30}z6R(yp-u QJOBUy07*qoM6N<$f~fj9OaK4? diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_out.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_out.png index 67890d4be28175861544e307599e49cd43eb7d5d..e038706b0e43c0aa10a935bb90a0ea0ebcb6b88f 100644 GIT binary patch literal 2926 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 b<gV%NX^PjbY{I?-bu@r+Jn2wnkG=grYz^Y% literal 4296 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 AH~;_u diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_passive.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_passive.png index 9c732a4e7a7c2622a04a6d110345e3cdcbc7f973..5ff27ef75900113079d1b41fd15a9f7bec222ff1 100644 GIT binary patch literal 2958 zcmcguYitx%6rO?+3O14$k)Vdj)CY#n&U<!dWaY72=n|GTrICUGy*qQK9lAR+%uIK; z1$hV<{Y5A$N}vd8d_)i=JhT`piCQ0tFG3U)_@SY`jg*8E6TP#q7PF;Q)J<k*=FYk2 z`_8%FIrlzZw_t9?xXI%%46BINMC#FfrhkpS9{s;!tT=;i<#x?t7sJNi<X>gjw(XP9 z*tbSQqt_Uluc%fs05mHO1DT|atTAl*jEoJ`7U<z|*kqU?;+L*t1a4>{Vv!J|V|Exe z8#V0?T-d&#L2YkQWsR6|A3i;!AO}h40X&mTn68ou5m~<qdiIAY0?(RwEg@o-4~RF$ z>hQ4TKwJ#aq)O8)9+U%&$nzpyg|jqEQ?x)aEXjxp%_~e0&;JO7=4iT7ADNTKLT@3W z+4F3LqSEPfAk76Vr-@=@S*B=~Vp$SdkZzmlfedN7l?4wG=&FukdxmA=zDE$ZTD=f~ znC3!A+C{gfn@<x;7?lAw#RO<Sq^zN)7VYd-Cy@o$R0<|w5}KZiY?-31-E4W5+iVTt zy7>7D0F>HTtcX#POEOu6aJ}jj3L~G8lGbiRn+>UY=vu9g3ae9yW@RB7*Q<vE`5eJ? zWS*UDD`5u$&vF_pD^XbGx<b4-%LG__>LSC`th9TNkCvYRBfx_p0xdaD(jv)94GgES zv_dn}XjY-=oN3I`485(SDW?eB6{bjU8t}ld#+s_=mXic1TSgKzLCQ9p2)wukO4v$R z4gyB(xWVJmaJbH~bR&U2xb<^q<I(D{$jBlhA7HX{V=*Oax*jl97>$Go6l=gRG({I= zAt(wmsd7P%j0-$R0$z)g41f#`Rh8!%y)Zvwsja?#{Q0?3(kvDE7@!vn>S8<|43c6{ zlt?k_P0~41P#IPe1t`I|R`6Eq7^s>-Vz5`AmFBb3;yfdA3@OXBOa^(LC1pmJNr6)( zEv^Gm6m`F5vNBX^3>U3&TfPbx!WH?agn?(3rvTNjs1Tw0YJiAAZrCW5kC7nf=ck(? za(We&<X~J&_tL<Dvzk!uhE*XoBzenBL1z$s8#n+pGU&J=LU*hrUQ`V3SvaumgrNdI za4KbL`DRgEDq=_+7o@J9BFIUCtn)lli>8qh$4exDL7fyO9mr4wI<F$h<YF(GB2J-& zLUsI;6y<%Z&A@DeXd9reAs9U<^D@gpQerik6h$78vLNuJq{%>#fE<?uR6kb@W}wvn z<6zWb6)?=A`?@HKWay-6&@l#SV6e`L6!5I#{vEtw6*sab^}jC?<!{lsc0>KO6Xo6` zxlGRSt24WcDJ6T(2sMbdH3fCtVh{dX-7=4FU2E6%`$jhKL1&f15IO+)kHwQ0dMTdW zpouEgK_|0{)k{xfSXpf}GOHnT>ZfO7<Bro4Hm=0pJ~-y(&fVi%&mQQT^j5O3d^3Ki ze@EhSdAM7-@F=xE)w$j^CFh3hkq}$E=9V+B8QZpRT5;Q!%8wTA*!`~Zowcm)x7Vw7 zK7C%kch%nSpTK%wn36o#f28a4{*K!}XesMnvgUBv=A%pBv-Y3(<ouH_{yrHC^#!Tk zuIESH+4u0&2V3W1eV=U-C;Z&~=H5>)eZ6i8cJgvpMen5(KdwEta_gwxT_2Z!(K7R$ z<*Awd0@mI;_tuxbTsIMW^`cz%)#yt%pS$kYJ9?_R`NyWLt=w?;*c{7&|M}}rUpSIp zK6}hvtInRfv3bwVZ+d!`b$r-y;E=bW>f&>q+YfJ@cXDFqvj<mqO#9)FUGFb_;Em%? sU0z(#ldfI72W#vdJ>aSYj&%P~OsI|Q+jw+e%r}fyFNo}&{m>(S0!xn73;+NC delta 823 zcmV-71IYZ27u5!kD}N5e000ie0hKEb8vp<U2T4RhRCt{2o4u+UK@`U)A-%|6qJ@Rn zB&jSU_Xb};l3-!d3(2j02Oq=Q7qE~d=mQ8zDyt-oSXgMtB0hn+f8oF|tn;l4ch3(l zb8%<(KXYbxKF*vKf?*hjDK1ZR7u)UjF;rl&SZFnL^m@Hu{eQ`1qSb$P?gAR$YPEvI zlOz$9O66#(L>6d#r_%}2-)^^Jx7!_cop9Cw#Nlud<MG&8d^jA6YPBks%cXN!88ia- z^3hMz)R@m`fIq)~iH{$8BDqPd#nXSO`1bXS`1JYSy39FnA7B03yEn$XMgx5R@$>ZO zLkt6i=tnWY-GA+CQLELQdtkHKSm)1EUu%H%dL7gQFJ8X#Dn~pFUP1cLD^+72tpUpA zvgmfZ;_q&2-3w%WG``Vj1Py{H-|zQN<B+R98jt#$212a?N~Mz6@AqE400V^10w}*) zt-SQnaj3ru;}`&3-ou#h|26cj4B-0&#KQLput948EPsN4Zx3J*69Sd@)u;OF&>8^m z|8zP%{qNcX$d3Um1ib&W3iX)@Y@PzG0qXU7&^-LGpAfUz%(|Qk%Dc<}sy^x;Gz$P; z2^M)J2;RPX@4Xv~fv>*p_@gxd_VZYbj7B5p3d8`j0N&xjU~n-Ft)t=^9vK~Zd!!hK zVHk#C7=MOg9xa964Qk^9n$70PAE4aubYdg_j(s~EnDF6c;2j?TebuLj<2s!9$cG;A z{=$I^A7GZgcYFYe<ER;aIk>0D+lvOvz<Ub^Cgp=CM>U=+R9@AGw-*hTf%lrOBgMId z&B@SHQwF%B;FANCqM_7aO6BWFW4Xk#^l?^+27k+`s&5<AVKe|Bha{zHg(y|?#p06s zRt7LtD0YLdsqbZg#{?T7?+WA%8zAor<P94j?+WA%8^EU!j-RvAYY|i5$^fbmoxQ8+ zr3`XOePet81uDuy2tuUz8#xX~u29U)5O#y|{jt-dC^Sm33sm)OqQ%edlh1uG;Ibb_ zd@un5C1ZXs;Np+K@ALUw>l7*c7b6VAFbq>*{sU6Z86Nb0d1(Lu002ovPDHLkV1lx? Bkd6QV diff --git a/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_welded.png b/Resources/Textures/Structures/Piping/Atmospherics/vent.rsi/vent_welded.png index 0ecc5b4c9cd6d85d2552a81664729f424ec6b3c7..b45ae1cb5fc160d9dc9635397c8cd049b0e6a306 100644 GIT binary patch delta 1945 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 delta 1831 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 Vulc<VO6mXr002ovPDHLkV1kpRe1rf1 From fe3fe95dfaa97bd9f2bb1645c510d79a6a27d03c Mon Sep 17 00:00:00 2001 From: metalgearsloth <comedian_vs_clown@hotmail.com> Date: Sun, 27 Apr 2025 00:44:02 +1000 Subject: [PATCH 616/622] Fix autorecharge --- .../Charges/Systems/SharedChargesSystem.cs | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Content.Shared/Charges/Systems/SharedChargesSystem.cs b/Content.Shared/Charges/Systems/SharedChargesSystem.cs index 4805e5a441..e915580bae 100644 --- a/Content.Shared/Charges/Systems/SharedChargesSystem.cs +++ b/Content.Shared/Charges/Systems/SharedChargesSystem.cs @@ -41,10 +41,9 @@ public abstract class SharedChargesSystem : EntitySystem } // only show the recharging info if it's not full - if (charges == comp.MaxCharges || !TryComp<AutoRechargeComponent>(uid, out var recharge)) + if (charges == comp.MaxCharges || !Resolve(uid, ref rechargeEnt.Comp2, false)) return; - rechargeEnt.Comp2 = recharge; var timeRemaining = GetNextRechargeTime(rechargeEnt); args.PushMarkup(Loc.GetString("limited-charges-recharging", ("seconds", timeRemaining.TotalSeconds.ToString("F1")))); } @@ -95,17 +94,12 @@ public abstract class SharedChargesSystem : EntitySystem /// <summary> /// Adds the specified charges. Does not reset the accumulator. /// </summary> - public void AddCharges(Entity<LimitedChargesComponent?> action, int addCharges) + public void AddCharges(Entity<LimitedChargesComponent?, AutoRechargeComponent?> action, int addCharges) { if (addCharges == 0) return; - action.Comp ??= EnsureComp<LimitedChargesComponent>(action.Owner); - - // 1. If we're going FROM max then set lastupdate to now (so it doesn't instantly recharge). - // 2. If we're going TO max then also set lastupdate to now. - // 3. Otherwise don't modify it. - // No idea if we go to 0 but future problem. + action.Comp1 ??= EnsureComp<LimitedChargesComponent>(action.Owner); var lastCharges = GetCurrentCharges(action); var charges = lastCharges + addCharges; @@ -113,13 +107,25 @@ public abstract class SharedChargesSystem : EntitySystem if (lastCharges == charges) return; - if (charges == action.Comp.MaxCharges || lastCharges == action.Comp.MaxCharges) + // If we were at max then need to reset the timer. + if (charges == action.Comp1.MaxCharges || lastCharges == action.Comp1.MaxCharges) { - action.Comp.LastUpdate = _timing.CurTime; + action.Comp1.LastUpdate = _timing.CurTime; + action.Comp1.LastCharges = action.Comp1.MaxCharges; + } + // If it has auto-recharge then make up the difference. + else if (Resolve(action.Owner, ref action.Comp2, false)) + { + var duration = action.Comp2.RechargeDuration; + var diff = (_timing.CurTime - action.Comp1.LastUpdate); + var remainder = (int) (diff / duration); + + action.Comp1.LastCharges += remainder; + action.Comp1.LastUpdate += (remainder * duration); } - action.Comp.LastCharges = Math.Clamp(charges, 0, action.Comp.MaxCharges); - Dirty(action); + action.Comp1.LastCharges = Math.Clamp(action.Comp1.LastCharges + addCharges, 0, action.Comp1.MaxCharges); + Dirty(action.Owner, action.Comp1); } public bool TryUseCharge(Entity<LimitedChargesComponent?> entity) From d4e40ae44b52603df550d419633c34cfe24cfad0 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 28 Apr 2025 13:38:43 -0400 Subject: [PATCH 617/622] Revert "Add new color turtlenecks in WinterDrobe" (#36983) Revert "Add new color turtlenecks in WinterDrobe (#32920)" This reverts commit 34cc49c175457710c5b025ba71582a7c8cbdc1fc. --- .../Inventories/winterdrobe.yml | 32 -- .../Clothing/Uniforms/color_turtlenecks.yml | 491 ------------------ .../Uniforms/color_turtlenecks_skirt.yml | 491 ------------------ .../equipped-INNERCLOTHING.png | Bin 5396 -> 0 bytes .../Jumpskirt/color_turtle.rsi/icon.png | Bin 4869 -> 0 bytes .../color_turtle.rsi/inhand-left.png | Bin 5079 -> 0 bytes .../color_turtle.rsi/inhand-right.png | Bin 5142 -> 0 bytes .../Jumpskirt/color_turtle.rsi/meta.json | 41 -- .../skirt-equipped-INNERCLOTHING.png | Bin 3034 -> 0 bytes .../Jumpskirt/color_turtle.rsi/skirt-icon.png | Bin 2835 -> 0 bytes .../color_turtle.rsi/skirt-inhand-left.png | Bin 5269 -> 0 bytes .../color_turtle.rsi/skirt-inhand-right.png | Bin 5401 -> 0 bytes .../equipped-INNERCLOTHING.png | Bin 5396 -> 0 bytes .../Jumpsuit/color_turtle.rsi/icon.png | Bin 4869 -> 0 bytes .../Jumpsuit/color_turtle.rsi/inhand-left.png | Bin 5079 -> 0 bytes .../color_turtle.rsi/inhand-right.png | Bin 5142 -> 0 bytes .../Jumpsuit/color_turtle.rsi/meta.json | 41 -- .../trousers-equipped-INNERCLOTHING.png | Bin 5305 -> 0 bytes .../color_turtle.rsi/trousers-icon.png | Bin 5127 -> 0 bytes .../color_turtle.rsi/trousers-inhand-left.png | Bin 5243 -> 0 bytes .../trousers-inhand-right.png | Bin 5375 -> 0 bytes 21 files changed, 1096 deletions(-) delete mode 100644 Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml delete mode 100644 Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/equipped-INNERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/icon.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-right.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-equipped-INNERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-icon.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-right.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/equipped-INNERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/icon.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-right.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-equipped-INNERCLOTHING.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-icon.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-left.png delete mode 100644 Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-right.png diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml index 510257c045..61089187e5 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/winterdrobe.yml @@ -19,38 +19,6 @@ ClothingHeadHatCanadaBeanie: 4 ClothingHeadHatSantahat: 2 ClothingHeadHatXmasCrown: 2 - ClothingUniformTurtleneckColorWhite: 2 - ClothingUniformTurtleneckColorGrey: 2 - ClothingUniformTurtleneckColorBlack: 2 - ClothingUniformTurtleneckColorBlue: 2 - ClothingUniformTurtleneckColorDarkBlue: 2 - ClothingUniformTurtleneckColorTeal: 2 - ClothingUniformTurtleneckColorGreen: 2 - ClothingUniformTurtleneckColorDarkGreen: 2 - ClothingUniformTurtleneckColorOrange: 2 - ClothingUniformTurtleneckColorPink: 2 - ClothingUniformTurtleneckColorRed: 2 - ClothingUniformTurtleneckColorYellow: 2 - ClothingUniformTurtleneckColorPurple: 2 - ClothingUniformTurtleneckColorLightBrown: 2 - ClothingUniformTurtleneckColorBrown: 2 - ClothingUniformTurtleneckColorMaroon: 2 - ClothingUniformTurtleneckSkirtColorWhite: 2 - ClothingUniformTurtleneckSkirtColorGrey: 2 - ClothingUniformTurtleneckSkirtColorBlack: 2 - ClothingUniformTurtleneckSkirtColorBlue: 2 - ClothingUniformTurtleneckSkirtColorDarkBlue: 2 - ClothingUniformTurtleneckSkirtColorTeal: 2 - ClothingUniformTurtleneckSkirtColorGreen: 2 - ClothingUniformTurtleneckSkirtColorDarkGreen: 2 - ClothingUniformTurtleneckSkirtColorOrange: 2 - ClothingUniformTurtleneckSkirtColorPink: 2 - ClothingUniformTurtleneckSkirtColorRed: 2 - ClothingUniformTurtleneckSkirtColorYellow: 2 - ClothingUniformTurtleneckSkirtColorPurple: 2 - ClothingUniformTurtleneckSkirtColorLightBrown: 2 - ClothingUniformTurtleneckSkirtColorBrown: 2 - ClothingUniformTurtleneckSkirtColorMaroon: 2 emaggedInventory: ClothingNeckScarfStripedSyndieGreen: 3 diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml deleted file mode 100644 index 81d9801482..0000000000 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks.yml +++ /dev/null @@ -1,491 +0,0 @@ -# White Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorWhite - name: white turtleneck - description: A generic white turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - - state: trousers-inhand-left - right: - - state: inhand-right - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - - state: trousers-equipped-INNERCLOTHING - -# Grey Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorGrey - name: grey turtleneck - description: A tasteful grey turtleneck that reminds you of the good old days. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#b3b3b3" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#b3b3b3" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#b3b3b3" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#b3b3b3" - - state: trousers-equipped-INNERCLOTHING - -# Black Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorBlack - name: black turtleneck - description: A generic black turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#3f3f3f" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#3f3f3f" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#3f3f3f" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#3f3f3f" - - state: trousers-equipped-INNERCLOTHING - -# Blue Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorBlue - name: blue turtleneck - description: A generic blue turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#52aecc" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#52aecc" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#52aecc" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#52aecc" - - state: trousers-equipped-INNERCLOTHING - -# Dark Blue Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorDarkBlue - name: dark blue turtleneck - description: A generic dark blue turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#3285ba" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#3285ba" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#3285ba" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#3285ba" - - state: trousers-equipped-INNERCLOTHING - -# Teal Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorTeal - name: teal turtleneck - description: A generic teal turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#77f3b7" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#77f3b7" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#77f3b7" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#77f3b7" - - state: trousers-equipped-INNERCLOTHING - -# Green Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorGreen - name: green turtleneck - description: A generic green turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#9ed63a" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#9ed63a" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#9ed63a" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#9ed63a" - - state: trousers-equipped-INNERCLOTHING - - # Dark Green Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorDarkGreen - name: dark green turtleneck - description: A generic dark green turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#79CC26" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#79CC26" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#79CC26" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#79CC26" - - state: trousers-equipped-INNERCLOTHING - -# Orange Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorOrange - name: orange turtleneck - description: A generic orange turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#ff8c19" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#ff8c19" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#ff8c19" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#ff8c19" - - state: trousers-equipped-INNERCLOTHING - -# Pink Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorPink - name: pink turtleneck - description: A generic pink turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#ffa69b" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#ffa69b" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#ffa69b" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#ffa69b" - - state: trousers-equipped-INNERCLOTHING - -# Red Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorRed - name: red turtleneck - description: A generic red turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#eb0c07" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#eb0c07" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#eb0c07" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#eb0c07" - - state: trousers-equipped-INNERCLOTHING - -# Yellow Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorYellow - name: yellow turtleneck - description: A generic yellow turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#ffe14d" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#ffe14d" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#ffe14d" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#ffe14d" - - state: trousers-equipped-INNERCLOTHING - -# Purple Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorPurple - name: purple turtleneck - description: A generic light purple turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#9f70cc" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#9f70cc" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#9f70cc" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#9f70cc" - - state: trousers-equipped-INNERCLOTHING - -# Light Brown Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorLightBrown - name: light brown turtleneck - description: A generic light brown turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#c59431" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#c59431" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#c59431" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#c59431" - - state: trousers-equipped-INNERCLOTHING - -# Brown Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorBrown - name: brown turtleneck - description: A generic brown turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#a17229" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#a17229" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#a17229" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#a17229" - - state: trousers-equipped-INNERCLOTHING - -# Maroon Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckColorMaroon - name: maroon turtleneck - description: A generic maroon turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - layers: - - state: icon - color: "#cc295f" - - state: trousers-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#cc295f" - - state: trousers-inhand-left - right: - - state: inhand-right - color: "#cc295f" - - state: trousers-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpsuit/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#cc295f" - - state: trousers-equipped-INNERCLOTHING diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml deleted file mode 100644 index 1a61e0803f..0000000000 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/color_turtlenecks_skirt.yml +++ /dev/null @@ -1,491 +0,0 @@ -# White Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorWhite - name: white turtleneck with skirt - description: A generic white turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - - state: skirt-inhand-left - right: - - state: inhand-right - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - - state: skirt-equipped-INNERCLOTHING - -# Grey Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorGrey - name: grey turtleneck with skirt - description: A tasteful grey turtleneck that reminds you of the good old days. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#b3b3b3" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#b3b3b3" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#b3b3b3" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#b3b3b3" - - state: skirt-equipped-INNERCLOTHING - -# Black Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorBlack - name: black turtleneck with skirt - description: A generic black turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#3f3f3f" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#3f3f3f" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#3f3f3f" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#3f3f3f" - - state: skirt-equipped-INNERCLOTHING - -# Blue Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorBlue - name: blue turtleneck with skirt - description: A generic blue turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#52aecc" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#52aecc" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#52aecc" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#52aecc" - - state: skirt-equipped-INNERCLOTHING - -# Dark Blue Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorDarkBlue - name: dark blue turtleneck with skirt - description: A generic dark blue turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#3285ba" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#3285ba" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#3285ba" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#3285ba" - - state: skirt-equipped-INNERCLOTHING - -# Teal Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorTeal - name: teal turtleneck with skirt - description: A generic teal turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#77f3b7" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#77f3b7" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#77f3b7" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#77f3b7" - - state: skirt-equipped-INNERCLOTHING - -# Green Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorGreen - name: green turtleneck with skirt - description: A generic green turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#9ed63a" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#9ed63a" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#9ed63a" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#9ed63a" - - state: skirt-equipped-INNERCLOTHING - - # Dark Green Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorDarkGreen - name: dark green turtleneck with skirt - description: A generic dark green turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#79CC26" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#79CC26" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#79CC26" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#79CC26" - - state: skirt-equipped-INNERCLOTHING - -# Orange Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorOrange - name: orange turtleneck with skirt - description: A generic orange turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#ff8c19" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#ff8c19" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#ff8c19" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#ff8c19" - - state: skirt-equipped-INNERCLOTHING - -# Pink Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorPink - name: pink turtleneck with skirt - description: A generic pink turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#ffa69b" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#ffa69b" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#ffa69b" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#ffa69b" - - state: skirt-equipped-INNERCLOTHING - -# Red Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorRed - name: red turtleneck with skirt - description: A generic red turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#eb0c07" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#eb0c07" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#eb0c07" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#eb0c07" - - state: skirt-equipped-INNERCLOTHING - -# Yellow Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorYellow - name: yellow turtleneck with skirt - description: A generic yellow turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#ffe14d" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#ffe14d" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#ffe14d" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#ffe14d" - - state: skirt-equipped-INNERCLOTHING - -# Purple Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorPurple - name: purple turtleneck with skirt - description: A generic light purple turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#9f70cc" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#9f70cc" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#9f70cc" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#9f70cc" - - state: skirt-equipped-INNERCLOTHING - -# Light Brown Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorLightBrown - name: light brown turtleneck with skirt - description: A generic light brown turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#c59431" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#c59431" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#c59431" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#c59431" - - state: skirt-equipped-INNERCLOTHING - -# Brown Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorBrown - name: brown turtleneck with skirt - description: A generic brown turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#a17229" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#a17229" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#a17229" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#a17229" - - state: skirt-equipped-INNERCLOTHING - -# Maroon Turtleneck -- type: entity - parent: ClothingUniformBase - id: ClothingUniformTurtleneckSkirtColorMaroon - name: maroon turtleneck with skirt - description: A generic maroon turtleneck with no rank markings. - components: - - type: Sprite - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - layers: - - state: icon - color: "#cc295f" - - state: skirt-icon - - type: Item - inhandVisuals: - left: - - state: inhand-left - color: "#cc295f" - - state: skirt-inhand-left - right: - - state: inhand-right - color: "#cc295f" - - state: skirt-inhand-right - - type: Clothing - sprite: Clothing/Uniforms/Jumpskirt/color_turtle.rsi - clothingVisuals: - jumpsuit: - - state: equipped-INNERCLOTHING - color: "#cc295f" - - state: skirt-equipped-INNERCLOTHING diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 30ec8b9d591fb5e2e97e6a093b02cfd5dd5eb67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5396 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/icon.png deleted file mode 100644 index 1194286cc560199b7bfaae37c3d2cd51386089ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4869 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 V9eMt#Wd5zd-g=AGH4Co;{{SVO`t1M! diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-left.png deleted file mode 100644 index 7d8c952aa084fcd29954838505c2f31ce38a5a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5079 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/inhand-right.png deleted file mode 100644 index c0da296e649577328b872b98099119933996c98b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 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 b{JRBt+x#`F54nxczb4sQI$GqJdF}fb`m9t- diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json deleted file mode 100644 index d4dc27c853..0000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/meta.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Derived from qmturtleneck sprite from beestation at commit https://github.com/BeeStation/BeeStation-Hornet/commit/a11e7468ca552cfc97c9164c69ccdafff09e794c and modified by Emisse, also modified by Ko4erga", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "skirt-icon" - }, - { - "name": "skirt-equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "skirt-inhand-left", - "directions": 4 - }, - { - "name": "skirt-inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-equipped-INNERCLOTHING.png deleted file mode 100644 index 4ed406823ac010ded3d1462a2bf9e112c380892c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3034 zcmV<03nlc4P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000U$X+uL$b5ch_ zAW20-HZeIiHZ3wPF#rHaiJg{rR8-d%htIutdZEoQ6e&aRy$v9}H>uJ@VVD_UC<6{N zG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$OrQF$}6R&?d%y_c8YA7_1QpS|}z zXYYO1x&V;8{kgn!SPFnNo`4_X<w}o?il$@x0Sxc}1Iz$mvNAIQLOsKPNIo8J^h}Wx z_#y~^H+RG<05^@igXnbd|4Eva!54_q1c}&!&B<hmxKPBY*@6tQeMZF8_!Ke2C^7Rz z2Nbcqm=hP-@Uzb%JByi}#$$_EeC7;x8e7agBHo%M<cJvY7jaP*my<2xTO!s>6{c}T z{8k*B#$jdxfFg<Q0uC!l#HJ!9@xwygM7$IL94YZDj{k}UoE(ApQf}!PxqNP7l7Ozu z(xaQ%+A`?goa|JNKwuQaWTi0qY`R-|S_YGs3&7%?KTAejTe_&o)@HWW)<)*WW?vQR zzi$3biF><9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv1)yUy0P^?0*fb9UASvow`@mQC zp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q{wNRKos+;6rV8ldy0Owz(}jF` zW(JeRp&R{qi2rfmU!TJ;gp<JGb9kbNaM6@;d5NNS^VnPgH=Rf4^8Qm3|6$mlv^duy zQ5rr0YOFDk8lVE?*FJ!v5CIZ%K(qt>(Kmm5I1s<Q2-S(jx&JKa-?PGH;w6)t_&Lrk zB#h1y^0OBA#Lp6-0Rcz?Do_9_Km+IkBVZ0}fIV;q9>5m_f-n#TRsj}B0%?E`vOzxB z2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G41dM~{U<SMa^AH4KAu>dP6d+Yd z3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4Es0sQWIt5*Tu0n&*J!lk~f_{hI z!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+AA{TB3-ERLHar49hi4Ih5D^-p zh8Q6X#0?2VqLBoIkE}zAkxHZ<X+gS>UgRb+f=natP#6>iMMoK->`~sR<tP?vHEJEI z6jhBnf@(+gpl+f@Q8TDdXfj#}ZGg5z`=BGyiRf%}5xNrHh;Bn)Lf=M@qu*dK7#c<g zV}tR=L}8LKYcQpl{g_tFdCVYY3^R+xVim9kSO;t%mWdT$i?DmK$FS$HL)dZbTO1Lm ziZjP~;-YapTmh~UcNBLPH-wwO&Euu;T6jBrAfAoS#h2k5@Ll);{5XD|AWhIAI1s`J z$%KuBDnbk465%1?6_H3(C)yH&iCp3aVioZ?@d|O2_>Lq)(kHo*Vn{;LcG6+edD1=7 zD>9j^O?D<nlLh4M<R<b(@?-K_35tZVgpUMUV!cF-M7zY0#0yEhq?V+M<SNNL$x6wS zk^_>{Qg|tCDK{ym)H<mesZ&zJQnS(&X*20S=``t5>7&wDr6*;uGTJg8GHjVbnL{!c zWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0WMyP6Wy582WNT#4$d1qunl{ac zmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8<LxoUn1`;&yg>dZ<W6-|6YNv;GvMBuv4K!;gKRr zQC~4wF<bF~;w8oDCDbMMOIS;amz-E~UkO&yR|-*DqjX5APia<JMcGR^LwT?AMdfJ~ znu@bZvPy-@S(PbOimIb3SG7X*oa!^WEZv2kO0S~#&}Y<?)V$S%YISP;YV+zk>dVy& z)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iutvy=3T65Yu+7a4Yv^%sXb>ww? zbn<kXbsp-Hb)9rq>(=Yu(!=O6^iuTp>)p_Y^{w=i^lS773}6Fm1Fpe-gF!>Ip{*g$ zu-<Ukh-Bnqlx5UxG-^yU_BSpt?l68~qG=LsveTs3<ddnDX{u?1=>szvGhed;vo5pW z&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*ZvFf(^Xl-N7w{EeXveC4Ov)N}e z%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx)P8cQ&Qi|OhNWW;>JChYI)@QQ zx?`N<LB|m%H7BN1z0(tC4QIA<qw|D|o=dXJF_#yvrmlR~HrF{fJGZrN=iL!^FZW{i zeh(Rs<sQ`@k3H2r6Fr+fXS}Su)_9%wMtl2t@AMw_QTAc^H2KW<+W4;Z?eQb|h5A+d zJ@MD~=lgdBzyZDiy8<3A(^|$`))5E-eFAp{J_^zaS{?LbFeW%CxF+~%h*?N}NN*@5 zG&b~T=$kOtu(GfR%XOCvmv@IthR1|Ah0jH}N0dj5M4Cjdjl3SE7{!h1jK)TXM>j^# zuJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_WICNY@+|jrX%s^&6b2i>5eqa0y z%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!ql}XcFH*PieWwLj2ZSq`7V9Mc? zh17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I-?$tAVKYn8-l({mqQ$Q8{O!WzM zg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!<xb>z=6$;cwT88(J6|n-WB%w`m$h~4pmp)< zy4P#0FI+#q!E3{jjf9OU8-FS=EhsN|y(wZ-SD|v@hQhJUUYnbXB#QV&!&~gP)NVy> z<!<fYX0dJWwok?E;%g<QC6y%~N?E1XzA^iz>YIh_3ETV2tjiAU!0h1dxU<t~=aF*h z^1Sk~T>-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dlbFb#!9eY1iCsp6Bajj|Hr?hX| zzPbJE{X++w546-O*Ot`2Kgd0Jx6Z4sy<WS%@(|`w)}f~j;SIgtGQMqURBSA1{CJpm zc;raPk)9@-rlzAxN6VVwW?}Qxv6y2wzH|Ssv&E>Tu9enWavU5N9)I?I-1m1*_?_rJ z$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$mU2Q)a|9JSc+Uc4zvS-T963!N$ zT{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;;JuhGEb?H5K#o@~7t9DmUU1MD9 zxNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX=)z6+o0o6-+`4{y+3mqQ%kSJB zju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@>;2q1Vm)$Z)P1z?N$8UYW2~{~ zzhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHsy69KwU-!MxeeuI@&cF4|M9z%A z<iA|_z4VpBtHZA?Uw6+2%|3pU_GW&r_^ra*BkvgRdf!L9pP0}7fc;SQQSW2dC%;b* z7t$6M{sjY=^ZcTx>jVG*0bfZ(K~#90?b^YOgD?~X&|$Tb4-OT$0ZO4K&fHxNrMLkq zFdTgHo>;L-P`(l5i_JVKLWwLqnLs$$01*)p5fKp)5fOcoN-`+t3;?j!=H;`#@6om` zhG9V0b-!chc@~{>kM;ap*7H}@>nP#^oO8LZYZzm2yWKEN)59^Pgcu{naXh?)J@ZQn z_&Pf1)rbms*8bY^D;Q%?*EO7TFE7;+XU<=A3jn|pB&GClj4=YhX}3V>{D=Mr+y{B) zj4yt#Wd2hMXqpDb7yv*@2>|}Q4<SfS`4*=Xa3y>S2(SR{0NPl9b^vWGKs$go7N8wK z8w=15pp6A+2hhd>v;$~k0onnyu>kD=+E{>g0BtNlJAgJ8P%_wBo3~!x`y4_zeFY_i zkiGYtIV5`s)-JO@04U!hz?C6^Z^<C(`uuwQ(O1Eq3=mx5m)Rcxl<yJvm-_=sGDr#_ cBBD?B15;)Z8e{&9ivR!s07*qoM6N<$f($Xwl>h($ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-icon.png deleted file mode 100644 index 9516069cb363781cabaa8e3a6a70bdf258c02a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-left.png deleted file mode 100644 index 74b28bdc7b2b3fd72565072488ae6fa982c1d196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5269 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color_turtle.rsi/skirt-inhand-right.png deleted file mode 100644 index f3554454405d8b168b2e44e3d86e9671c1abde1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5401 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/equipped-INNERCLOTHING.png deleted file mode 100644 index 30ec8b9d591fb5e2e97e6a093b02cfd5dd5eb67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5396 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/icon.png deleted file mode 100644 index 1194286cc560199b7bfaae37c3d2cd51386089ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4869 zcmb_f2|QG5|37FE*IG#w)1VYHb7nD{rR;=q(WO$E4TD+C48wG3TFBCFiBeHyt89@% zD{cwh%9fo<(ImTM={?&1_kI8O-v9ggzwdlLXU=n;=lff}zvX$(iFV#%t01Q#2LOPA zy`7Z{bcfAfvWuX9zDP6%-4^(mJDCGO!EyN+%0d8;b6{FpI`ds@EnxQ6mUuJ?k4IpT zXaKN_KIiJ==Gw1jI@vj9;SeQ`ci^}zmxZ}l#ERXR7gbLIX@}HRH%X$h?nYgNA6UL} zS>WBLDkloyF%jkklTx9w`Y*fn@ot?;of=_9eH8@GL|(-N$>-dMlrS^E#w*|IOhk?p zee?2>C_vi;kJMTxl#z3T?Uxa6N<zp-j~$l=x~GSSB+%+d=>^?&tW5yGZdnl7L!8;? zyrSln9H9FXa5=W}g$0nV3}AT6F$)2V93V*-BufK&0I*X_bA^)FPYN(*oZ2b_1V7WA zlm<%lT{lQ?x&&-mTeB=0_+1h3IDKhZERgR7=+~T#;!EY91-wqB)y4x}9{};W^=fn( zWp%*oqO!cJl<Wj>_k^wW5Fm?{(mxWP7xK*Ab4|S~01Oq<V_%<&cU#C_bG>r4=dPO} zsYHV173Y>iOAhr*-;{mBVAL#lRt3aiWdN~Fu$5S;e)1*BxRh+%Mr<YjTAcM+V<tB0 zXzb_H8}sf<NdbqRk6TX{m0!^S2GxO*;n>9Mt5X>Y;-*>DnMYbcqlLIHcTe4e9w;_$ z5f**kKBv!~^*2zFXGLW18K1haWS`WY@uJtzYFG2Y>6o~MH9sxXQt3V@UxX=)=b7wW zs~i(}cB9sC7jkA)=oqWKF7`Dw+xdvCL*-3Xrd<8wQ!%=7_KC|*+kK9U-d7}1N-FmU zyc)w7O<3%7E~{B2IgNznzZL6Aq=8q$t^?Uml@|f%MF-=AN&q-@_Va4rl|br?Q_EHX z;uR_p@(Cj;kJP0Au`JGcA>Q|(nfk$nEn=Ngv2n<L?b=A^r~^a~z``!V@q{JPFk+kY z0=;~d5{u=M$Q@aSZHUqcu5|tVg{9KX-D)P{-Rj~upd80*mANwJzLiH5o+?g)H$~~( zxAtBWZU?IFuUr#tCkMBVf9OItaybyMv+d#Tbgd~Z(y<h4<Qmh5rs+y6ZNe?hQq^lV zy~xt?i)>BvY|vD&xb*v!uiP!!I$Qat3ch+f4r*DPeOmN(`IuU3teNd^;N7?Ci?Njf zAhP;_ML~$+$~fBN0_qj%+<O`Y_$y1x_K#C_TJ}mu--UNC&^%zg<^*^erfUc{To<pJ zBfD6(?vUbr1q*FT{7~{k-2v6B(QGR-bYhZ4t)7~SK~zvBt#Y(-XQfoHrfPKMn&dc7 zyZz}z7Y*i;?D*?(4OV2!fi>fC)eq@~_!nm+=8Agq59N3&p~h3nQ@AN|sCed>MW(v* zs`Yd6Au;hTo3c|^rKeo<%>2ovI@{09HAmAZe#1rN<;0);vsn$f4N?O{r*qz0MpLby zKJ(4>O}K8;8ro{vYCt~6wi0F>ey%r`Ft+&<<&(8Yd)CzQAf>7st*XAcdQo+F^~!3~ zYJ;_L%<3^}HFkNeLanHe)JN+xUY;0pRc?=UdZ9(ej*RWEZ`H_e%gM>kxiKK!_-mtF z<E0$;ZMF?re%^j2M*CZN#eT&v{e%tG4ciA42hs+T2Qmg0H=?qYm?w;CaWgn8jR=it zTs?EF2uwuB{-#>^OOfC9H``?bRNGSOd@>6hTDl6#UR*k(aR!UKWHgG)HQMSo!2^%2 zJpANQcYNS6E}L)W`1EYAskI4XHokg&b7pztnVi=ddQBUe{GQ#)7&q5!o_M~cxih`v z;;h}_R9eQ;YjL?n4sXiqAG%GrO=jQEu5vx@SdkYyu%qARE%IqcW?P2w<;=Vlsq3D% zT@!BMSY5dEA>+d3JJz4$=klc<dnN9#^oqU5Jm^!pcJQcAcS6WwGruf<b>A#pyMGId z$fmP#%~^M|9=$z@u1oSy2`H~B?Feb8ysKMD&$d7KD9klyeKW36aF&_bzZ1(ZQZFj@ zMtEEH?dbb;^w-fvqleWT<+sLKs~M>g5cY|lj|Gp<B{pAiHdvSImg|?B+muyYR9q>_ z40?j=#WgdZF^!%NwtxZUEM9;{z^4FG$-R<=C5RG~#8J}w9{(b!HLOHf_#{8CcwcvF z57?G=H?6LRU~6ETMk{_<*I(N|_uSo)b8e0oIsVh|kzLq9azTnkN)x%*IE)t@m}pEO zE0rac>fVxYZ$4n~ACzXa$6m8?*KS^ZZJlRV8L4c2`?1p50rt!DgW<o2`CguK9IkCm zp4GC^l0IIcRZ%pwJ-TS3c3>Pgwk)J6#B3Ndp&Hs4svz1a$_&*W3GbnO(3vFljV8XS z-dSz@GInawN44qTY39ee@!XNU63(j&y<OcKHM*DO>vlWB(4aoowR`n#tvwI(-W;zF zPOb<DwpG^A$7F4IYoEU@-=q|=Kp}Z`A?a1ms^_F<Bt)8WjZ(*|Px`ec0YA4K?@1rZ z9~v0SR8drM&>`z=KPj)HWOF-uBzi-v2yCWa<FWT%_Y+tM!p7RvyOKtdIz7r-7zOUV zf?nOgtHZB8zWsRXV?k*6Xi2@M9e1<-=2FwHU&A|R9OMORbVK4z=b$vNo~Kq+s$=iH z%Hs!|&5wE+MqjwD!*qMNl)cn!MQC(MRAiM_FK^hZ(3TfE;v8dJ(-+_4_M{=EL1oES z7roGAwWJc`_bid`r@67{BS}XtJ8t%-_624~;&!#3%(#$nx>2Vnarq<BikpbmTfS~u zx_OUn3g7tL*w7-Ee9?iK=6Ol-I61-f+$fSjp7cF0I*-fqFKFx?k6k=EJ9=lAg$La8 z+3f~ye@;f&<MPw*cO5g_x})><{SfP(nEeS-21-{hUfsNB+;xALdFZ`&jp*Dqxp6sn zwTZkX9?zZAU35{mikiaS4+b3yIu+FME;Fy|_8h+;>mx5Z%-;IZZ!VPn*PK<ivuC`i zmLrjam^X#HH0?DrG&!7+c0sCVg~^@ref)=geTa{Vy@<RU$aYaS)uw8Yb)8kisz|t( zaJ9{;gwsA(u%US1m*TBK&lNjXzY~^stZxksJKcP(x<gdv5WKHN=LKKLx!c*NQFJCI zEIo`geZI-2IXL|BY{~5{nb*<>pNIF)b;_tLCJ*cyc&9X=W$3?2GhX4rVO7Ol)Af^O zO*Ut%E1Xg;pL)Rc2>tkCGP<kFOjVFRt3T=cQt9$W39*{|OZyQVimk=6XZ5p=`oAZc zO^56~ySJ@Co3*cf-~A!0ar?SBMy7A3+*YTQ`i-W+Ho@Mn0%~5&O+>s`s;@d<_Clre zX_(pDnJW3Y74<<P;rZKd1BWa1ZaDmg;-hYO2Ht+w{<<MZvM%$&u^?k1VNcM_R#Dyf zj-5|x&$~98=3S`h+57Uo(_EdwjlTAQo2HW!9mY$9q7N~HiXD$jCr85TXNMOXXsc?g zZFJe|HtaDOSob7xBVn98d0sO5{+&p5>XrGO{LfPx3qKDBrVgziWmcu$^O`;J^7m-U z=N|tjeWscr$h~G}E@QEuP{zAG%0KqF=j|!8q1i6pU9)G)%rBodPdCmrV|U*;9&yw( zJZ{Q+hBa*bUbwiE-z5x>ngWUEr%%oljKsapEO}ynL3;~*i{s2vnWWK~BUM2e^Y5HA zI~OMa5Um9O@gV^C1Wk$G0zeQ500UkCKu!XH72K3tKbt@cOSpF1`2e6;Ie$qd7$|B2 zz+!c#n}@)|$&pOsu#glwhsr>Pu(%K!08BQ9a49r@h5$xo_%PX~@DF8o;4miL6z*>1 z1Uhjo8NN(A5s%?2+TunN`O`>r_(n6BNeCHIz+wm}un<-Nn@<igg@4gYhQ{;LC^+m3 zMBr}<H=j2M^Kf#8S#o#`7zqg?XdsA&5lBcHhyig_j3EpIVz4L>g91qi5KqS7$!Hwx z+Yb(z<I%mzE><?*j6qMPa9@FdOGcrDLLpL!MRIsPC^U&gn%9BBARq*SAIcU`LJ(}e z&UXz~3_gv=<O-M^Hf&xag~|yMn8G1fzj9!4f2d{izr_iP7%GIqMWK=4Jf|-}I_(FJ z8^jCvVw_GxF#;GY23x>~u;?FHt}jQx;rnv_LiLa3e=-2Y*2(FIjX(8;#rk1_FR%`V zXnYIEpQ8D0p<D*ag~8_p@n{U|V8~6Kc{W_KC67T7aCmMUPQdp}Ie&K<hQT56F#Y-5 zfJV@mg~XtVMlg^;Kx0Yt^)Q&eJCjZ42>I*(po?Ke5im^QkPr@m1`!z04MdZTh-5U{ z0K}3(@GI1bLuY!2{%<ITjK!0&gnxoU<wU0lDE}vzP9uABcq|GO3nq)=!$5J_K5*EN z2$L;20URD=81fGL#S14VvOSwGps;BSdn;2o6b>YlNhjlI6e9*mBOn+QGy#EU;P414 zfsRGsK^zHdMDfO;G1Tw!RvcQ;eA2(m(;;~(9Y-R16L1JT8jVFz@i;nyNGCB6MsyMy zO~rsj9Qtb%Ap2W+OsMN90sn73P;>kb!|z(mAx3;CtNd@RV?puxHVR;x&C{HB6QmfC z2xvSJfyQF62s8nQMG(;>DgsUPrh*uZH;GCin4sqS1QPn%f`5?4fM^0pB~lPLEQx@i zp>b3Mg+xOm2sj)aPbC?l@o36lOVbHxA_jvoLeSArjTnJA27*FlKwrxsBnj;ZGz!k> z57J+}_(}rx_iVp(4%v=5&pz~<*RG7fAO6F>Gz*zRo8JUX;k5bcXVBr_rkQ_I4gX#? zzp54bG9aaYQ~F<Fe2%w3NZ~QeeW1$uPr45ESG@R?;J;_}@74HUvHF)T{V%inmJFIN zh3&(D4k8qMp68bu_?k-8zh?Q%+8=iJ?{MhIm>>Q)te}S<#~p(Wspdh4naKjldH|3D z?5)h*JR;sFv_)5fKUp8YaeC&KjC*=~kLs(nmlfQ-K3|p+rcG^bF_avW-X1BnM|o|J z4Jq7C(YxAse7xz-R`HUdlR(BYgN&A3;qHZ7wPn`;sX2>IxLj<iDKrdd3pSCt@=gON zpRKBp&hdjw-&H>tuWDSYE(55LU==(mNl|}=4m_Z(TKy$1Mz&%yu1gQQcV&*>RU`ka z$;q>%k|xJ(b#cwLGdq=OCKFSH#vRe<Pd-l~u=%JDyKXxGa8+LYwL>HyE8TWEU?{}I z)4l?lU32KtiuV2>8Ogc{_J@8Mjzn*&Xy#gc=Onkd_jALWj>x56(vIRKpwwW~QUV_z V9eMt#Wd5zd-g=AGH4Co;{{SVO`t1M! diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-left.png deleted file mode 100644 index 7d8c952aa084fcd29954838505c2f31ce38a5a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5079 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/inhand-right.png deleted file mode 100644 index c0da296e649577328b872b98099119933996c98b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 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 b{JRBt+x#`F54nxczb4sQI$GqJdF}fb`m9t- diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json deleted file mode 100644 index 530c661f35..0000000000 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/meta.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Derived from qmturtleneck sprite from beestation at commit https://github.com/BeeStation/BeeStation-Hornet/commit/a11e7468ca552cfc97c9164c69ccdafff09e794c and modified by Emisse, also modified by Ko4erga", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "trousers-icon" - }, - { - "name": "trousers-equipped-INNERCLOTHING", - "directions": 4 - }, - { - "name": "trousers-inhand-left", - "directions": 4 - }, - { - "name": "trousers-inhand-right", - "directions": 4 - } - ] -} diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-equipped-INNERCLOTHING.png deleted file mode 100644 index bccf027039d9ee513664b7c0efad816a1f26fa83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5305 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-icon.png deleted file mode 100644 index c3d1c9d61185b309b1e08246d396a6a5e8725634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5127 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 P&qcPDn=G!Hx$pl6sxvUn diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-left.png deleted file mode 100644 index 4b9e806da8be46d3872461395fc742d03c2161ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5243 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color_turtle.rsi/trousers-inhand-right.png deleted file mode 100644 index 2b5979d70d25d79bb858ddbd702c788e0af5e6ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5375 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 A2><{9 From 0a394d4af5b3b5320a011ae2bbe0542f41fe22dc Mon Sep 17 00:00:00 2001 From: keronshb <54602815+keronshb@users.noreply.github.com> Date: Mon, 28 Apr 2025 13:42:24 -0400 Subject: [PATCH 618/622] Wizard Teleport Scroll (Teleport Location ECS) (#36424) --- Content.Benchmarks/PvsBenchmark.cs | 1 + .../Teleportation/TeleportLocationsSystem.cs | 11 + .../Ui/TeleportLocationsBoundUserInterface.cs | 36 ++++ .../Teleportation/Ui/TeleportMenu.xaml | 10 + .../Teleportation/Ui/TeleportMenu.xaml.cs | 74 +++++++ .../Administration/Commands/WarpCommand.cs | 1 + Content.Server/Ghost/GhostSystem.cs | 1 + .../Systems/NinjaConditionsSystem.cs | 1 + Content.Server/Pinpointer/NavMapSystem.cs | 1 + .../Teleportation/TeleportLocationsSystem.cs | 71 +++++++ Content.Server/Warps/WarpPointComponent.cs | 18 -- Content.Server/Warps/WarpPointSystem.cs | 1 + .../Components/TeleportLocationsComponent.cs | 66 ++++++ .../Systems/SharedTeleportLocationsSystem.cs | 59 ++++++ .../Teleportation/TeleportLocationsUi.cs | 19 ++ Content.Shared/Warps/WarpPointComponent.cs | 27 +++ .../teleportation/teleportation-menu-gui.ftl | 6 + Resources/Maps/centcomm.yml | 194 +++++++++--------- .../Catalog/Fills/Lockers/suit_storage.yml | 5 +- .../Entities/Markers/warp_point.yml | 22 ++ .../Entities/Mobs/Player/narsie.yml | 6 + .../Entities/Mobs/Player/ratvar.yml | 6 + .../Entities/Mobs/Player/silicon.yml | 18 ++ .../Objects/Devices/station_beacon.yml | 47 +++++ .../Entities/Objects/Fun/immovable_rod.yml | 3 + .../Entities/Objects/Misc/dat_fukken_disk.yml | 4 + .../Entities/Objects/Power/powersink.yml | 6 + .../Entities/Structures/Machines/nuke.yml | 6 + .../Generation/Singularity/singularity.yml | 6 + .../Power/Generation/Tesla/energyball.yml | 6 + .../Prototypes/Magic/teleport_scroll.yml | 26 +++ .../Roles/Jobs/Fun/wizard_startinggear.yml | 8 +- Resources/Prototypes/tags.yml | 4 + 33 files changed, 645 insertions(+), 125 deletions(-) create mode 100644 Content.Client/Teleportation/TeleportLocationsSystem.cs create mode 100644 Content.Client/Teleportation/Ui/TeleportLocationsBoundUserInterface.cs create mode 100644 Content.Client/Teleportation/Ui/TeleportMenu.xaml create mode 100644 Content.Client/Teleportation/Ui/TeleportMenu.xaml.cs create mode 100644 Content.Server/Teleportation/TeleportLocationsSystem.cs delete mode 100644 Content.Server/Warps/WarpPointComponent.cs create mode 100644 Content.Shared/Teleportation/Components/TeleportLocationsComponent.cs create mode 100644 Content.Shared/Teleportation/Systems/SharedTeleportLocationsSystem.cs create mode 100644 Content.Shared/Teleportation/TeleportLocationsUi.cs create mode 100644 Content.Shared/Warps/WarpPointComponent.cs create mode 100644 Resources/Locale/en-US/teleportation/teleportation-menu-gui.ftl create mode 100644 Resources/Prototypes/Magic/teleport_scroll.yml diff --git a/Content.Benchmarks/PvsBenchmark.cs b/Content.Benchmarks/PvsBenchmark.cs index 2f87545426..1edbcb6448 100644 --- a/Content.Benchmarks/PvsBenchmark.cs +++ b/Content.Benchmarks/PvsBenchmark.cs @@ -7,6 +7,7 @@ using Content.IntegrationTests; using Content.IntegrationTests.Pair; using Content.Server.Mind; using Content.Server.Warps; +using Content.Shared.Warps; using Robust.Shared; using Robust.Shared.Analyzers; using Robust.Shared.EntitySerialization; diff --git a/Content.Client/Teleportation/TeleportLocationsSystem.cs b/Content.Client/Teleportation/TeleportLocationsSystem.cs new file mode 100644 index 0000000000..d191b8d385 --- /dev/null +++ b/Content.Client/Teleportation/TeleportLocationsSystem.cs @@ -0,0 +1,11 @@ +using Content.Shared.Teleportation.Systems; + +namespace Content.Client.Teleportation; + +/// <summary> +/// <inheritdoc cref="SharedTeleportLocationsSystem"/> +/// </summary> +public sealed partial class TeleportLocationsSystem : SharedTeleportLocationsSystem +{ + +} diff --git a/Content.Client/Teleportation/Ui/TeleportLocationsBoundUserInterface.cs b/Content.Client/Teleportation/Ui/TeleportLocationsBoundUserInterface.cs new file mode 100644 index 0000000000..80b4f30094 --- /dev/null +++ b/Content.Client/Teleportation/Ui/TeleportLocationsBoundUserInterface.cs @@ -0,0 +1,36 @@ +using Content.Shared.Teleportation; +using Content.Shared.Teleportation.Components; +using JetBrains.Annotations; +using Robust.Client.UserInterface; + +namespace Content.Client.Teleportation.Ui; + +[UsedImplicitly] +public sealed class TeleportLocationsBoundUserInterface : BoundUserInterface +{ + [ViewVariables] + private TeleportMenu? _menu; + + public TeleportLocationsBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + + _menu = this.CreateWindow<TeleportMenu>(); + + if (!EntMan.TryGetComponent<TeleportLocationsComponent>(Owner, out var teleComp)) + return; + + _menu.Title = Loc.GetString(teleComp.Name); + _menu.Warps = teleComp.AvailableWarps; + _menu.AddTeleportButtons(); + + _menu.TeleportClicked += (netEnt, pointName) => + { + SendPredictedMessage(new TeleportLocationDestinationMessage(netEnt, pointName)); + }; + } +} diff --git a/Content.Client/Teleportation/Ui/TeleportMenu.xaml b/Content.Client/Teleportation/Ui/TeleportMenu.xaml new file mode 100644 index 0000000000..50a77bbbcc --- /dev/null +++ b/Content.Client/Teleportation/Ui/TeleportMenu.xaml @@ -0,0 +1,10 @@ +<DefaultWindow xmlns="https://spacestation14.io" Title = "{Loc 'teleportation-scroll-window-title'}" MinSize="450 450" SetSize="450 450"> + <BoxContainer Orientation="Vertical" HorizontalExpand="True" SizeFlagsStretchRatio="0.4"> + <LineEdit Name="SearchBar" PlaceHolder="Search" HorizontalExpand="True" Margin="0 4" /> + <ScrollContainer Name="TeleportScroll" VerticalExpand="True" HorizontalExpand="True" HScrollEnabled="False"> + <BoxContainer Name="TeleportButtonContainer" Orientation="Vertical" VerticalExpand="True" SeparationOverride="5"> + <!-- Teleport buttons get added here by code --> + </BoxContainer> + </ScrollContainer> + </BoxContainer> +</DefaultWindow> diff --git a/Content.Client/Teleportation/Ui/TeleportMenu.xaml.cs b/Content.Client/Teleportation/Ui/TeleportMenu.xaml.cs new file mode 100644 index 0000000000..1a730bf747 --- /dev/null +++ b/Content.Client/Teleportation/Ui/TeleportMenu.xaml.cs @@ -0,0 +1,74 @@ +using System.Numerics; +using Content.Shared.Teleportation.Components; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; +using Robust.Client.UserInterface.Controls; + +namespace Content.Client.Teleportation.Ui; + +[GenerateTypedNameReferences] +public sealed partial class TeleportMenu : DefaultWindow +{ + public string SearchText = ""; + + public HashSet<TeleportPoint> Warps = new(); + + public event Action<NetEntity, string>? TeleportClicked; + + public TeleportMenu() + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + + SearchBar.OnTextChanged += OnSearchTextChanged; + } + + public void AddTeleportButtons() + { + foreach (var points in Warps) + { + var name = points.Location; + var teleportPoint = points.TelePoint; + + var currentButtonRef = new Button + { + Text = name, + TextAlign = Label.AlignMode.Right, + HorizontalAlignment = HAlignment.Center, + VerticalAlignment = VAlignment.Center, + SizeFlagsStretchRatio = 1, + MinSize = new Vector2(340, 20), + ClipText = true, + }; + + currentButtonRef.OnPressed += _ => TeleportClicked?.Invoke(teleportPoint, name); + currentButtonRef.Visible = ButtonIsVisible(currentButtonRef); + + TeleportButtonContainer.AddChild(currentButtonRef); + } + } + + private bool ButtonIsVisible(Button button) + { + return string.IsNullOrEmpty(SearchText) || button.Text == null || + button.Text.Contains(SearchText, StringComparison.OrdinalIgnoreCase); + } + + private void UpdateVisibleButtons() + { + foreach (var child in TeleportButtonContainer.Children) + { + if (child is Button button) + button.Visible = ButtonIsVisible(button); + } + } + + public void OnSearchTextChanged(LineEdit.LineEditEventArgs args) + { + SearchText = args.Text; + UpdateVisibleButtons(); + // Very funny it's called TeleportScroll + TeleportScroll.SetScrollValue(Vector2.Zero); + } +} diff --git a/Content.Server/Administration/Commands/WarpCommand.cs b/Content.Server/Administration/Commands/WarpCommand.cs index afc42c7e19..06d771ec2f 100644 --- a/Content.Server/Administration/Commands/WarpCommand.cs +++ b/Content.Server/Administration/Commands/WarpCommand.cs @@ -4,6 +4,7 @@ using Content.Server.Warps; using Content.Shared.Administration; using Content.Shared.Follower; using Content.Shared.Ghost; +using Content.Shared.Warps; using Robust.Shared.Console; using Robust.Shared.Enums; using Robust.Shared.Map; diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index 8596927b28..ac0455c9a7 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -28,6 +28,7 @@ using Content.Shared.NameModifier.EntitySystems; using Content.Shared.Popups; using Content.Shared.Storage.Components; using Content.Shared.Tag; +using Content.Shared.Warps; using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Configuration; diff --git a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs index ee99658f66..808829f6d9 100644 --- a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs +++ b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs @@ -4,6 +4,7 @@ using Content.Server.Warps; using Content.Shared.Objectives.Components; using Content.Shared.Ninja.Components; using Content.Shared.Roles; +using Content.Shared.Warps; using Robust.Shared.Random; namespace Content.Server.Objectives.Systems; diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs index 3ab0e8eff1..2819f5ba42 100644 --- a/Content.Server/Pinpointer/NavMapSystem.cs +++ b/Content.Server/Pinpointer/NavMapSystem.cs @@ -13,6 +13,7 @@ using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Timing; using System.Diagnostics.CodeAnalysis; +using Content.Shared.Warps; namespace Content.Server.Pinpointer; diff --git a/Content.Server/Teleportation/TeleportLocationsSystem.cs b/Content.Server/Teleportation/TeleportLocationsSystem.cs new file mode 100644 index 0000000000..14211d9672 --- /dev/null +++ b/Content.Server/Teleportation/TeleportLocationsSystem.cs @@ -0,0 +1,71 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Teleportation; +using Content.Shared.Teleportation.Components; +using Content.Shared.Teleportation.Systems; +using Content.Shared.UserInterface; +using Content.Shared.Warps; +using Content.Shared.Whitelist; + +namespace Content.Server.Teleportation; + +/// <summary> +/// <inheritdoc cref="SharedTeleportLocationsSystem"/> +/// </summary> +public sealed partial class TeleportLocationsSystem : SharedTeleportLocationsSystem +{ + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<TeleportLocationsComponent, MapInitEvent>(OnMapInit); + SubscribeLocalEvent<TeleportLocationsComponent, BeforeActivatableUIOpenEvent>(OnBeforeUiOpen); + } + + private void OnMapInit(Entity<TeleportLocationsComponent> ent, ref MapInitEvent args) + { + UpdateTeleportPoints(ent); + } + + private void OnBeforeUiOpen(Entity<TeleportLocationsComponent> ent, ref BeforeActivatableUIOpenEvent args) + { + UpdateTeleportPoints(ent); + } + + protected override void OnTeleportToLocationRequest(Entity<TeleportLocationsComponent> ent, ref TeleportLocationDestinationMessage args) + { + if (Delay.IsDelayed(ent.Owner, TeleportDelay)) + return; + + if (!string.IsNullOrWhiteSpace(ent.Comp.Speech)) + { + var msg = Loc.GetString(ent.Comp.Speech, ("location", args.PointName)); + _chat.TrySendInGameICMessage(args.Actor, msg, InGameICChatType.Speak, ChatTransmitRange.Normal); + } + + base.OnTeleportToLocationRequest(ent, ref args); + } + + // If it's in shared this doesn't populate the points on the UI + /// <summary> + /// Gets the teleport points to send to the BUI + /// </summary> + private void UpdateTeleportPoints(Entity<TeleportLocationsComponent> ent) + { + ent.Comp.AvailableWarps.Clear(); + + var allEnts = AllEntityQuery<WarpPointComponent>(); + + while (allEnts.MoveNext(out var warpEnt, out var warpPointComp)) + { + if (_whitelist.IsBlacklistPass(warpPointComp.Blacklist, warpEnt) || string.IsNullOrWhiteSpace(warpPointComp.Location)) + continue; + + ent.Comp.AvailableWarps.Add(new TeleportPoint(warpPointComp.Location, GetNetEntity(warpEnt))); + } + + Dirty(ent); + } +} diff --git a/Content.Server/Warps/WarpPointComponent.cs b/Content.Server/Warps/WarpPointComponent.cs deleted file mode 100644 index ce169f2e19..0000000000 --- a/Content.Server/Warps/WarpPointComponent.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Content.Server.Warps -{ - /// <summary> - /// Allows ghosts etc to warp to this entity by name. - /// </summary> - [RegisterComponent] - public sealed partial class WarpPointComponent : Component - { - [ViewVariables(VVAccess.ReadWrite), DataField] - public string? Location; - - /// <summary> - /// If true, ghosts warping to this entity will begin following it. - /// </summary> - [DataField] - public bool Follow; - } -} diff --git a/Content.Server/Warps/WarpPointSystem.cs b/Content.Server/Warps/WarpPointSystem.cs index d3b978a147..2e2264a81a 100644 --- a/Content.Server/Warps/WarpPointSystem.cs +++ b/Content.Server/Warps/WarpPointSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Examine; using Content.Shared.Ghost; +using Content.Shared.Warps; namespace Content.Server.Warps; diff --git a/Content.Shared/Teleportation/Components/TeleportLocationsComponent.cs b/Content.Shared/Teleportation/Components/TeleportLocationsComponent.cs new file mode 100644 index 0000000000..ef5d6c5b2c --- /dev/null +++ b/Content.Shared/Teleportation/Components/TeleportLocationsComponent.cs @@ -0,0 +1,66 @@ +using Content.Shared.Teleportation.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Teleportation.Components; + +// TODO: In the future assimilate ghost UI to use this. +/// <summary> +/// Used where you want an entity to display a list of player-safe teleport locations +/// They teleport to the location clicked +/// Looks for non Ghost-Only WarpPointComponents +/// </summary> +[RegisterComponent, NetworkedComponent, Access(typeof(SharedTeleportLocationsSystem)), AutoGenerateComponentState] +public sealed partial class TeleportLocationsComponent : Component +{ + /// <summary> + /// List of available warp points + /// </summary> + [DataField, AutoNetworkedField] + public HashSet<TeleportPoint> AvailableWarps = new(); + + /// <summary> + /// What should spawn as an effect when the user teleports? + /// </summary> + [DataField] + public EntProtoId? TeleportEffect; + + /// <summary> + /// Should this close the BUI after teleport? + /// </summary> + [DataField] + public bool CloseAfterTeleport; + + /// <summary> + /// Name of the Teleport Location menu + /// </summary> + [DataField] + public LocId Name; + + /// <summary> + /// Should the user have some speech if they teleport? + /// If enabled it will be prepended to the location name. + /// So something like "I am going to" would become "I am going to (Bridge)" + /// </summary> + [DataField] + public LocId? Speech; +} + +/// <summary> +/// A teleport point, which has a location (the destination) and the entity that it represents. +/// </summary> +[Serializable, NetSerializable, DataDefinition] +public partial record struct TeleportPoint +{ + [DataField] + public string Location; + [DataField] + public NetEntity TelePoint; + + public TeleportPoint(string Location, NetEntity TelePoint) + { + this.Location = Location; + this.TelePoint = TelePoint; + } +} diff --git a/Content.Shared/Teleportation/Systems/SharedTeleportLocationsSystem.cs b/Content.Shared/Teleportation/Systems/SharedTeleportLocationsSystem.cs new file mode 100644 index 0000000000..eb4be36ced --- /dev/null +++ b/Content.Shared/Teleportation/Systems/SharedTeleportLocationsSystem.cs @@ -0,0 +1,59 @@ +using Content.Shared.Teleportation.Components; +using Content.Shared.Timing; +using Content.Shared.UserInterface; +using Content.Shared.Warps; + +namespace Content.Shared.Teleportation.Systems; + +/// <summary> +/// <inheritdoc cref="TeleportLocationsComponent"/> +/// </summary> +public abstract partial class SharedTeleportLocationsSystem : EntitySystem +{ + [Dependency] protected readonly UseDelaySystem Delay = default!; + + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; + + protected const string TeleportDelay = "TeleportDelay"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent<TeleportLocationsComponent, ActivatableUIOpenAttemptEvent>(OnUiOpenAttempt); + SubscribeLocalEvent<TeleportLocationsComponent, TeleportLocationDestinationMessage>(OnTeleportToLocationRequest); + } + + private void OnUiOpenAttempt(Entity<TeleportLocationsComponent> ent, ref ActivatableUIOpenAttemptEvent args) + { + if (!Delay.IsDelayed(ent.Owner, TeleportDelay)) + return; + + args.Cancel(); + } + + protected virtual void OnTeleportToLocationRequest(Entity<TeleportLocationsComponent> ent, ref TeleportLocationDestinationMessage args) + { + if (!TryGetEntity(args.NetEnt, out var telePointEnt) || TerminatingOrDeleted(telePointEnt) || !HasComp<WarpPointComponent>(telePointEnt) || Delay.IsDelayed(ent.Owner, TeleportDelay)) + return; + + var comp = ent.Comp; + var originEnt = args.Actor; + var telePointXForm = Transform(telePointEnt.Value); + + SpawnAtPosition(comp.TeleportEffect, Transform(originEnt).Coordinates); + + _xform.SetMapCoordinates(originEnt, _xform.GetMapCoordinates(telePointEnt.Value, telePointXForm)); + + SpawnAtPosition(comp.TeleportEffect, telePointXForm.Coordinates); + + Delay.TryResetDelay(ent.Owner, true, id: TeleportDelay); + + if (!ent.Comp.CloseAfterTeleport) + return; + + // Teleport's done, now tell the BUI to close if needed. + _ui.CloseUi(ent.Owner, TeleportLocationUiKey.Key); + } +} diff --git a/Content.Shared/Teleportation/TeleportLocationsUi.cs b/Content.Shared/Teleportation/TeleportLocationsUi.cs new file mode 100644 index 0000000000..f4ca97584a --- /dev/null +++ b/Content.Shared/Teleportation/TeleportLocationsUi.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Teleportation; + +[Serializable, NetSerializable] +public enum TeleportLocationUiKey : byte +{ + Key +} + +/// <summary> +/// Sends message to request that the clicker teleports to the requested location +/// </summary> +[Serializable, NetSerializable] +public sealed class TeleportLocationDestinationMessage(NetEntity netEnt, string pointName) : BoundUserInterfaceMessage +{ + public NetEntity NetEnt = netEnt; + public string PointName = pointName; +} diff --git a/Content.Shared/Warps/WarpPointComponent.cs b/Content.Shared/Warps/WarpPointComponent.cs new file mode 100644 index 0000000000..61e84a660c --- /dev/null +++ b/Content.Shared/Warps/WarpPointComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared.Whitelist; +using Robust.Shared.GameStates; + +namespace Content.Shared.Warps; + +/// <summary> +/// Allows ghosts etc to warp to this entity by name. +/// </summary> +[RegisterComponent, NetworkedComponent] +public sealed partial class WarpPointComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite), DataField] + public string? Location; + + /// <summary> + /// If true, ghosts warping to this entity will begin following it. + /// </summary> + [DataField] + public bool Follow; + + /// <summary> + /// What points should be excluded? + /// Useful where you want things like a ghost to reach only like CentComm + /// </summary> + [DataField] + public EntityWhitelist? Blacklist; +} diff --git a/Resources/Locale/en-US/teleportation/teleportation-menu-gui.ftl b/Resources/Locale/en-US/teleportation/teleportation-menu-gui.ftl new file mode 100644 index 0000000000..847f2cbc54 --- /dev/null +++ b/Resources/Locale/en-US/teleportation/teleportation-menu-gui.ftl @@ -0,0 +1,6 @@ +## Default +teleportation-menu-default-window-title = Teleportation Menu + +## Wizard +teleportation-scroll-window-title = Teleportation Scroll +teleportation-scroll-speech-wizard = EY TCHEL TORT TU {$location} diff --git a/Resources/Maps/centcomm.yml b/Resources/Maps/centcomm.yml index 39ed39ed9e..6405c65923 100644 --- a/Resources/Maps/centcomm.yml +++ b/Resources/Maps/centcomm.yml @@ -1,10 +1,10 @@ meta: format: 7 category: Grid - engineVersion: 247.2.0 + engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 03/05/2025 09:01:26 + time: 04/24/2025 00:06:42 entityCount: 9680 maps: [] grids: @@ -21722,6 +21722,88 @@ entities: - type: Transform pos: 3.5,-12.5 parent: 1668 +- proto: ChemistryBottleEpinephrine + entities: + - uid: 6859 + components: + - type: Transform + parent: 6846 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 6860 + components: + - type: Transform + parent: 6846 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 6867 + components: + - type: Transform + parent: 6865 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 6871 + components: + - type: Transform + parent: 6865 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: ChemistryBottleOmnizine + entities: + - uid: 6862 + components: + - type: Transform + parent: 6846 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 6863 + components: + - type: Transform + parent: 6846 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 6866 + components: + - type: Transform + parent: 6865 + - type: Physics + canCollide: False + - type: InsideEntityStorage + - uid: 6876 + components: + - type: Transform + parent: 6865 + - type: Physics + canCollide: False + - type: InsideEntityStorage +- proto: ChemistryBottleUnstableMutagen + entities: + - uid: 1035 + components: + - type: Transform + pos: 7.383148,-17.230762 + parent: 1668 + - uid: 1036 + components: + - type: Transform + pos: 7.6053705,-17.223818 + parent: 1668 + - uid: 1037 + components: + - type: Transform + pos: 7.5012035,-17.411318 + parent: 1668 + - uid: 1038 + components: + - type: Transform + pos: 7.7303705,-17.411318 + parent: 1668 - proto: ChemistryHotplate entities: - uid: 671 @@ -23874,36 +23956,34 @@ entities: - type: Transform pos: -12.5,5.5 parent: 1668 -- proto: DefaultStationBeacon +- proto: DefaultStationBeaconCentComm entities: - uid: 4656 components: - type: Transform pos: -0.5,3.5 parent: 1668 - - type: NavMapBeacon - text: CentComm +- proto: DefaultStationBeaconCentCommAfterhours + entities: - uid: 9452 components: - type: Transform pos: 22.5,-21.5 parent: 1668 - - type: NavMapBeacon - text: Afterhours - - uid: 9479 - components: - - type: Transform - pos: -0.5,-41.5 - parent: 1668 - - type: NavMapBeacon - text: Thunderdome +- proto: DefaultStationBeaconCentCommERT + entities: - uid: 9480 components: - type: Transform pos: -41.5,-7.5 parent: 1668 - - type: NavMapBeacon - text: ERT +- proto: DefaultStationBeaconCentCommThunderdome + entities: + - uid: 9479 + components: + - type: Transform + pos: -0.5,-41.5 + parent: 1668 - proto: DefibrillatorCabinetFilled entities: - uid: 511 @@ -26409,36 +26489,6 @@ entities: - type: Transform pos: 13.91264,32.80469 parent: 1668 -- proto: EpinephrineChemistryBottle - entities: - - uid: 6859 - components: - - type: Transform - parent: 6846 - - type: Physics - canCollide: False - - type: InsideEntityStorage - - uid: 6860 - components: - - type: Transform - parent: 6846 - - type: Physics - canCollide: False - - type: InsideEntityStorage - - uid: 6867 - components: - - type: Transform - parent: 6865 - - type: Physics - canCollide: False - - type: InsideEntityStorage - - uid: 6871 - components: - - type: Transform - parent: 6865 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: ERTEngineerPDA entities: - uid: 6784 @@ -43141,36 +43191,6 @@ entities: - type: Transform pos: -1.4979519,1.1034296 parent: 1668 -- proto: OmnizineChemistryBottle - entities: - - uid: 6862 - components: - - type: Transform - parent: 6846 - - type: Physics - canCollide: False - - type: InsideEntityStorage - - uid: 6863 - components: - - type: Transform - parent: 6846 - - type: Physics - canCollide: False - - type: InsideEntityStorage - - uid: 6866 - components: - - type: Transform - parent: 6865 - - type: Physics - canCollide: False - - type: InsideEntityStorage - - uid: 6876 - components: - - type: Transform - parent: 6865 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: OreProcessor entities: - uid: 4080 @@ -53982,28 +54002,6 @@ entities: - Left: Reverse - Right: Forward - Middle: Off -- proto: UnstableMutagenChemistryBottle - entities: - - uid: 1035 - components: - - type: Transform - pos: 7.383148,-17.230762 - parent: 1668 - - uid: 1036 - components: - - type: Transform - pos: 7.6053705,-17.223818 - parent: 1668 - - uid: 1037 - components: - - type: Transform - pos: 7.5012035,-17.411318 - parent: 1668 - - uid: 1038 - components: - - type: Transform - pos: 7.7303705,-17.411318 - parent: 1668 - proto: UraniumReinforcedWindowDirectional entities: - uid: 9601 diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml b/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml index f334747024..a8fd6e2b2d 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml @@ -270,6 +270,7 @@ - type: StorageFill contents: - id: OxygenTankFilled - - id: ClothingOuterHardsuitWizard - id: ClothingMaskBreath - - id: JetpackVoidFilled + # TODO: Gone until reworked to have no space protection + #- id: ClothingOuterHardsuitWizard + #- id: JetpackVoidFilled diff --git a/Resources/Prototypes/Entities/Markers/warp_point.yml b/Resources/Prototypes/Entities/Markers/warp_point.yml index 2536fde474..675938c09b 100644 --- a/Resources/Prototypes/Entities/Markers/warp_point.yml +++ b/Resources/Prototypes/Entities/Markers/warp_point.yml @@ -16,6 +16,22 @@ - type: WarpPoint location: beacon +# Use for areas like CC +- type: entity + id: GhostWarpPoint + parent: MarkerBase + name: ghost only warp point + components: + - type: Tag + tags: + - GhostOnlyWarp + - type: WarpPoint + blacklist: + tags: + - GhostOnlyWarp + - type: Sprite + state: pink + - type: entity parent: WarpPoint id: WarpPointBombing @@ -23,8 +39,14 @@ suffix: ninja bombing target components: - type: BombingTarget + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint location: bombing target + blacklist: + tags: + - GhostOnlyWarp - type: Sprite layers: - state: pink diff --git a/Resources/Prototypes/Entities/Mobs/Player/narsie.yml b/Resources/Prototypes/Entities/Mobs/Player/narsie.yml index 5d07409b5f..f2b81f796c 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/narsie.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/narsie.yml @@ -94,6 +94,12 @@ - type: GravityWell baseRadialAcceleration: 6 maxRange: 8 + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint follow: true location: Nar'Sie + blacklist: + tags: + - GhostOnlyWarp diff --git a/Resources/Prototypes/Entities/Mobs/Player/ratvar.yml b/Resources/Prototypes/Entities/Mobs/Player/ratvar.yml index 530f5e1037..658f14a6d4 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/ratvar.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/ratvar.yml @@ -89,6 +89,12 @@ - type: GravityWell baseRadialAcceleration: 6 maxRange: 8 + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint follow: true location: Ratvar + blacklist: + tags: + - GhostOnlyWarp diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 934e9d3674..99a4cbd796 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -105,6 +105,9 @@ description: Handles AI interactions across holocards + AI cores components: - type: ItemSlots + - type: Tag + tags: + - GhostOnlyWarp - type: StationAiHolder slot: name: station-ai-mind-slot @@ -197,6 +200,9 @@ suffix: Empty components: - type: WarpPoint + blacklist: + tags: + - GhostOnlyWarp - type: ContainerComp proto: AiHeld container: station_ai_mind_slot @@ -327,8 +333,14 @@ categories: [ HideSpawnMenu, DoNotMap ] components: - type: NoFTL + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint follow: true + blacklist: + tags: + - GhostOnlyWarp - type: Eye pvsScale: 1.5 - type: Visibility @@ -349,8 +361,14 @@ components: - type: Transform anchored: true + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint follow: true + blacklist: + tags: + - GhostOnlyWarp - type: Eye - type: ContentEye - type: Examiner diff --git a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml index 3d5b78397e..569fd47d00 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml @@ -713,3 +713,50 @@ components: - type: NavMapBeacon defaultText: station-beacon-vox + +# Ghost Only Beacons +- type: entity + parent: DefaultStationBeacon + id: DefaultStationBeaconGhost + suffix: Boo + components: + - type: Tag + tags: + - GhostOnlyWarp + - type: WarpPoint + blacklist: + tags: + - GhostOnlyWarp + +# CentComm Beacons +- type: entity + parent: DefaultStationBeaconGhost + id: DefaultStationBeaconCentComm + suffix: CentComm + components: + - type: NavMapBeacon + text: CentComm + +- type: entity + parent: DefaultStationBeaconGhost + id: DefaultStationBeaconCentCommAfterhours + suffix: CentComm Afterhours + components: + - type: NavMapBeacon + text: Afterhours + +- type: entity + parent: DefaultStationBeaconGhost + id: DefaultStationBeaconCentCommThunderdome + suffix: CentComm Thunder Dome + components: + - type: NavMapBeacon + text: Thunderdome + +- type: entity + parent: DefaultStationBeaconGhost + id: DefaultStationBeaconCentCommERT + suffix: CentComm ERT + components: + - type: NavMapBeacon + text: ERT diff --git a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml index bbadf4f220..324502c3d1 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml @@ -32,6 +32,9 @@ - type: WarpPoint follow: true location: immovable rod + blacklist: + tags: + - GhostOnlyWarp - type: entity id: ImmovableRodDespawn diff --git a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml index e1fc3fa5b6..523385788b 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml @@ -17,9 +17,13 @@ - type: WarpPoint follow: true location: nuke disk + blacklist: + tags: + - GhostOnlyWarp - type: Tag tags: - HighRiskItem + - GhostOnlyWarp - type: StealTarget stealGroup: NukeDisk diff --git a/Resources/Prototypes/Entities/Objects/Power/powersink.yml b/Resources/Prototypes/Entities/Objects/Power/powersink.yml index 40406209a7..5d1043f08c 100644 --- a/Resources/Prototypes/Entities/Objects/Power/powersink.yml +++ b/Resources/Prototypes/Entities/Objects/Power/powersink.yml @@ -45,5 +45,11 @@ - type: Sprite sprite: Objects/Power/powersink.rsi state: powersink + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint location: powersink + blacklist: + tags: + - GhostOnlyWarp diff --git a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml index 7fdd80bd2b..0ac4a9e98f 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml @@ -107,9 +107,15 @@ Nuke: !type:ContainerSlot - type: StealTarget stealGroup: NuclearBomb + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint follow: true location: nuclear bomb + blacklist: + tags: + - GhostOnlyWarp - type: FTLSmashImmune - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml index 461b17efbb..1e439ddae4 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml @@ -66,9 +66,15 @@ - SingularityEngine - SingularityTeslaEngine - Power + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint follow: true location: singularity + blacklist: + tags: + - GhostOnlyWarp - type: Sprite sprite: Structures/Power/Generation/Singularity/singularity_1.rsi shader: unshaded diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml index 909601e066..d31f7526ab 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml @@ -89,9 +89,15 @@ - type: ChaoticJump jumpMinInterval: 8 jumpMaxInterval: 15 + - type: Tag + tags: + - GhostOnlyWarp - type: WarpPoint follow: true location: tesla ball + blacklist: + tags: + - GhostOnlyWarp - type: Sprite drawdepth: Effects sprite: Structures/Power/Generation/Tesla/energy_ball.rsi diff --git a/Resources/Prototypes/Magic/teleport_scroll.yml b/Resources/Prototypes/Magic/teleport_scroll.yml new file mode 100644 index 0000000000..89c9ae5163 --- /dev/null +++ b/Resources/Prototypes/Magic/teleport_scroll.yml @@ -0,0 +1,26 @@ +- type: entity + id: WizardTeleportScroll + name: teleport scroll + suffix: Wizard + parent: [ BaseItem, BaseMagicalContraband ] + components: + - type: UserInterface + interfaces: + enum.TeleportLocationUiKey.Key: + type: TeleportLocationsBoundUserInterface + - type: ActivatableUI + key: enum.TeleportLocationUiKey.Key + - type: Sprite + sprite: Objects/Magic/magicactions.rsi + layers: + - state: spell_default + - type: TeleportLocations + name: teleportation-scroll-window-title + teleportEffect: WizardSmoke + closeAfterTeleport: true + speech: teleportation-scroll-speech-wizard + - type: UseDelay + delay: 1 + delays: + TeleportDelay: !type:UseDelayInfo + length: 300 diff --git a/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml index d296a02754..d137df195e 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/wizard_startinggear.yml @@ -10,7 +10,7 @@ id: WizardPDA ears: ClothingHeadsetAltWizard belt: ClothingBeltWand - # pocket1: TODO: Include wizard teleport scroll + pocket1: WizardTeleportScroll pocket2: WizardsGrimoire - type: startingGear @@ -28,9 +28,3 @@ jumpsuit: ClothingUniformJumpsuitColorPurple head: ClothingHeadHatVioletwizard outerClothing: ClothingOuterWizardViolet - -- type: startingGear - id: WizardHardsuitGear - parent: WizardVioletGear - equipment: - outerClothing: ClothingOuterHardsuitWizard diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index efd74cfe64..9020bec89f 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -581,6 +581,10 @@ - type: Tag id: GeigerCounter +# Used for warps +- type: Tag + id: GhostOnlyWarp + - type: Tag id: GlassAirlock From b9b854e179ccbedc183adfaefc4561dc90cf285a Mon Sep 17 00:00:00 2001 From: Milon <milonpl.git@proton.me> Date: Tue, 29 Apr 2025 19:08:23 +0200 Subject: [PATCH 619/622] ringer bugfixes (#36936) AAAAAAAAAA --- .../PDA/Ringer/RingtoneMenu.xaml.cs | 63 ++++++++++--------- Content.Server/PDA/Ringer/RingerSystem.cs | 5 +- .../PDA/Ringer/RingerUplinkComponent.cs | 2 +- Content.Shared/PDA/SharedRingerSystem.cs | 15 +---- 4 files changed, 41 insertions(+), 44 deletions(-) diff --git a/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs b/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs index 989fe65843..83024c22fb 100644 --- a/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs +++ b/Content.Client/PDA/Ringer/RingtoneMenu.xaml.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Numerics; using Content.Client.UserInterface.Controls; using Robust.Client.AutoGenerated; @@ -29,48 +30,47 @@ namespace Content.Client.PDA.Ringer { var input = RingerNoteInputs[i]; var index = i; - var foo = () => // Prevents unauthorized characters from being entered into the LineEdit - { - input.Text = input.Text.ToUpper(); - - if (!IsNote(input.Text)) - { - input.Text = PreviousNoteInputs[index]; - } - else - PreviousNoteInputs[index] = input.Text; - - input.RemoveStyleClass("Caution"); - }; - - input.OnFocusExit += _ => foo(); - input.OnTextEntered += _ => - { - foo(); - input.CursorPosition = input.Text.Length; // Resets caret position to the end of the typed input - }; input.OnTextChanged += args => { - // Convert to uppercase - var upperText = args.Text.ToUpper(); + if (input.Text.Length <= 0) + return; - // Filter to only valid notes - var newText = upperText; - if (!IsNote(newText)) + input.Text = args.Text.ToUpper(); + + var isValid = IsNote(input.Text); + + if (!isValid) { - newText = PreviousNoteInputs[index]; + input.Text = PreviousNoteInputs[index]; input.AddStyleClass("Caution"); } else { - PreviousNoteInputs[index] = newText; + PreviousNoteInputs[index] = input.Text; input.RemoveStyleClass("Caution"); } - // Only update if there's a change - if (newText != input.Text) - input.Text = newText; + input.CursorPosition = input.Text.Length; + }; + + input.OnFocusExit += _ => + { + if (!IsNote(input.Text)) + { + input.Text = PreviousNoteInputs[index]; + input.RemoveStyleClass("Caution"); + } + }; + + input.OnTextEntered += _ => + { + if (!IsNote(input.Text)) + { + input.Text = PreviousNoteInputs[index]; + input.RemoveStyleClass("Caution"); + } + input.CursorPosition = input.Text.Length; }; } } @@ -86,6 +86,9 @@ namespace Content.Client.PDA.Ringer /// </summary> public static bool IsNote(string input) { + if (input.Any(char.IsDigit)) + return false; + input = input.Replace("#", "sharp"); return Enum.TryParse(input, true, out Note _); diff --git a/Content.Server/PDA/Ringer/RingerSystem.cs b/Content.Server/PDA/Ringer/RingerSystem.cs index dbdc5e83f3..b47ca0fde3 100644 --- a/Content.Server/PDA/Ringer/RingerSystem.cs +++ b/Content.Server/PDA/Ringer/RingerSystem.cs @@ -55,7 +55,6 @@ public sealed class RingerSystem : SharedRingerSystem /// </summary> private void OnGenerateUplinkCode(Entity<RingerUplinkComponent> ent, ref GenerateUplinkCodeEvent ev) { - // Generate a new uplink code var code = GenerateRingtone(); // Set the code on the component @@ -74,6 +73,10 @@ public sealed class RingerSystem : SharedRingerSystem if (!HasComp<StoreComponent>(uid)) return false; + // Wasn't generated yet + if (uplink.Code is null) + return false; + // On the server, we always check if the code matches if (!uplink.Code.SequenceEqual(ringtone)) return false; diff --git a/Content.Shared/PDA/Ringer/RingerUplinkComponent.cs b/Content.Shared/PDA/Ringer/RingerUplinkComponent.cs index e3170c84e3..2dbbfb5efc 100644 --- a/Content.Shared/PDA/Ringer/RingerUplinkComponent.cs +++ b/Content.Shared/PDA/Ringer/RingerUplinkComponent.cs @@ -14,7 +14,7 @@ public sealed partial class RingerUplinkComponent : Component /// Set via GenerateUplinkCodeEvent. /// </summary> [DataField] - public Note[] Code = new Note[SharedRingerSystem.RingtoneLength]; + public Note[]? Code; /// <summary> /// Whether to show the toggle uplink button in PDA settings. diff --git a/Content.Shared/PDA/SharedRingerSystem.cs b/Content.Shared/PDA/SharedRingerSystem.cs index 0fa5a570aa..8a9d8156a3 100644 --- a/Content.Shared/PDA/SharedRingerSystem.cs +++ b/Content.Shared/PDA/SharedRingerSystem.cs @@ -45,8 +45,8 @@ public abstract class SharedRingerSystem : EntitySystem /// <inheritdoc/> public override void Update(float frameTime) { - var ringerQuery = EntityQueryEnumerator<RingerComponent>(); - while (ringerQuery.MoveNext(out var uid, out var ringer)) + var ringerQuery = EntityQueryEnumerator<RingerComponent, TransformComponent>(); + while (ringerQuery.MoveNext(out var uid, out var ringer, out var xform)) { if (!ringer.Active || !ringer.NextNoteTime.HasValue) continue; @@ -63,10 +63,9 @@ public abstract class SharedRingerSystem : EntitySystem // and play it separately with PlayLocal, so that it's actually predicted if (_net.IsServer) { - var ringerXform = Transform(uid); _audio.PlayEntity( GetSound(ringer.Ringtone[ringer.NoteCount]), - Filter.Empty().AddInRange(_xform.GetMapCoordinates(uid, ringerXform), ringer.Range), + Filter.Empty().AddInRange(_xform.GetMapCoordinates(uid, xform), ringer.Range), uid, true, AudioParams.Default.WithMaxDistance(ringer.Range).WithVolume(ringer.Volume) @@ -257,14 +256,6 @@ public abstract class SharedRingerSystem : EntitySystem return true; } - /// <summary> - /// Helper method to determine if the mind is an antagonist. - /// </summary> - protected bool IsAntagonist(EntityUid? user) - { - return user != null && _mind.TryGetMind(user.Value, out var mindId, out _) && _role.MindIsAntagonist(mindId); - } - /// <summary> /// Gets the sound path for a specific note. /// </summary> From a8ff93076311a185d7b96264ae0466ec37847089 Mon Sep 17 00:00:00 2001 From: ActiveMammmoth <140334666+ActiveMammmoth@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:40:49 -0400 Subject: [PATCH 620/622] Staff of Animation Fixes & Recharging (#37021) --- .../Actions/ActionOnInteractComponent.cs | 5 ++-- .../Actions/ActionOnInteractSystem.cs | 28 +++++++++++++++++++ .../NPC/Systems/NPCUtilitySystem.cs | 3 ++ .../Magic/Systems/AnimateSpellSystem.cs | 2 +- Resources/Prototypes/Magic/animate_spell.yml | 8 +++--- Resources/Prototypes/Magic/staves.yml | 12 ++++++-- 6 files changed, 49 insertions(+), 9 deletions(-) diff --git a/Content.Server/Actions/ActionOnInteractComponent.cs b/Content.Server/Actions/ActionOnInteractComponent.cs index 3a7e15649b..4ae3d9e5f7 100644 --- a/Content.Server/Actions/ActionOnInteractComponent.cs +++ b/Content.Server/Actions/ActionOnInteractComponent.cs @@ -1,6 +1,5 @@ using Content.Shared.Interaction; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Server.Actions; @@ -20,8 +19,10 @@ namespace Content.Server.Actions; [RegisterComponent] public sealed partial class ActionOnInteractComponent : Component { - [DataField(required:true)] + [DataField(required: true)] public List<EntProtoId>? Actions; [DataField] public List<EntityUid>? ActionEntities; + + [DataField] public bool RequiresCharge; } diff --git a/Content.Server/Actions/ActionOnInteractSystem.cs b/Content.Server/Actions/ActionOnInteractSystem.cs index af9b0b1ddb..c658b3f90a 100644 --- a/Content.Server/Actions/ActionOnInteractSystem.cs +++ b/Content.Server/Actions/ActionOnInteractSystem.cs @@ -1,5 +1,7 @@ using System.Linq; using Content.Shared.Actions; +using Content.Shared.Charges.Components; +using Content.Shared.Charges.Systems; using Content.Shared.Interaction; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -15,6 +17,7 @@ public sealed class ActionOnInteractSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly SharedChargesSystem _charges = default!; public override void Initialize() { @@ -54,6 +57,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (options.Count == 0) return; + if (!TryUseCharge((uid, component))) + return; + var (actId, act) = _random.Pick(options); _actions.PerformAction(args.User, null, actId, act, act.Event, _timing.CurTime, false); args.Handled = true; @@ -85,6 +91,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (entOptions.Count > 0) { + if (!TryUseCharge((uid, component))) + return; + var (entActId, entAct) = _random.Pick(entOptions); if (entAct.Event != null) { @@ -108,6 +117,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (entWorldOptions.Count > 0) { + if (!TryUseCharge((uid, component))) + return; + var (entActId, entAct) = _random.Pick(entWorldOptions); if (entAct.Event != null) { @@ -132,6 +144,9 @@ public sealed class ActionOnInteractSystem : EntitySystem if (options.Count == 0) return; + if (!TryUseCharge((uid, component))) + return; + var (actId, act) = _random.Pick(options); if (act.Event != null) { @@ -163,4 +178,17 @@ public sealed class ActionOnInteractSystem : EntitySystem return valid; } + + private bool TryUseCharge(Entity<ActionOnInteractComponent> ent) + { + if (!ent.Comp.RequiresCharge) + return true; + + Entity<LimitedChargesComponent?> charges = ent.Owner; + if (_charges.IsEmpty(charges)) + return false; + + _charges.TryUseCharge(charges); + return true; + } } diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index eff4f2772b..7b485eeb96 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -232,6 +232,9 @@ public sealed class NPCUtilitySystem : EntitySystem { if (_container.TryGetContainingContainer(targetUid, out var container)) { + if (container.Owner == owner) + return 0f; + if (TryComp<EntityStorageComponent>(container.Owner, out var storageComponent)) { if (storageComponent is { Open: false } && _weldable.IsWelded(container.Owner)) diff --git a/Content.Shared/Magic/Systems/AnimateSpellSystem.cs b/Content.Shared/Magic/Systems/AnimateSpellSystem.cs index 458336dea1..202605a338 100644 --- a/Content.Shared/Magic/Systems/AnimateSpellSystem.cs +++ b/Content.Shared/Magic/Systems/AnimateSpellSystem.cs @@ -40,7 +40,7 @@ public sealed class AnimateSpellSystem : EntitySystem _container.AttachParentToContainerOrGrid((ent, xform)); // Items animated inside inventory now exit, they can't be picked up and so can't escape otherwise var ev = new AnimateSpellEvent(); - RaiseLocalEvent(ref ev); + RaiseLocalEvent(ent, ref ev); } } diff --git a/Resources/Prototypes/Magic/animate_spell.yml b/Resources/Prototypes/Magic/animate_spell.yml index d36afb49d9..6d1319944b 100644 --- a/Resources/Prototypes/Magic/animate_spell.yml +++ b/Resources/Prototypes/Magic/animate_spell.yml @@ -3,14 +3,12 @@ name: Animate description: Bring an inanimate object to life! components: - - type: LimitedCharges - maxCharges: 5 - type: EntityTargetAction useDelay: 0 itemIconStyle: BigAction whitelist: components: - - Animateable # Currently on: SeatBase, TableBase, ClosetBase, BaseMachine, ConstructibleMachine, BaseComputer, BaseItem, CrateGeneric, StorageTank, GasCanister, BaseTarget + - Animateable # Currently on: SeatBase, TableBase, ClosetBase, BaseMachine, ConstructibleMachine, BaseComputer, BaseItem, CrateGeneric, StorageTank, GasCanister blacklist: components: - MindContainer @@ -19,7 +17,7 @@ - AnomalyGenerator - TegGenerator - TegCirculator - - Artifact + - XenoArtifact canTargetSelf: false interactOnMiss: false sound: !type:SoundPathSpecifier @@ -70,9 +68,11 @@ collection: MetalBreak - type: Hands - type: CanEscapeInventory + - type: MobCollision toRemove: - RequireProjectileTarget - BlockMovement - Item + - MeleeRequiresWield speech: action-speech-spell-animate doSpeech: false diff --git a/Resources/Prototypes/Magic/staves.yml b/Resources/Prototypes/Magic/staves.yml index 8bfb30b887..ff43db866e 100644 --- a/Resources/Prototypes/Magic/staves.yml +++ b/Resources/Prototypes/Magic/staves.yml @@ -7,6 +7,10 @@ name: RGB staff description: Helps fix the underabundance of RGB gear on the station. components: + - type: LimitedCharges + maxCharges: 25 + - type: AutoRecharge + rechargeDuration: 30 - type: Sprite sprite: Objects/Weapons/Guns/Basic/staves.rsi layers: @@ -14,6 +18,7 @@ - state: nothing-unshaded shader: unshaded - type: ActionOnInteract + requiresCharge: true actions: - ActionRgbLight - type: Item @@ -38,11 +43,16 @@ name: staff of animation description: Brings inanimate objects to life! components: + - type: LimitedCharges + maxCharges: 5 + - type: AutoRecharge + rechargeDuration: 30 - type: Sprite sprite: Objects/Weapons/Guns/Basic/staves.rsi layers: - state: animation - type: ActionOnInteract + requiresCharge: true actions: - ActionAnimateSpell - type: Item @@ -59,8 +69,6 @@ - type: entity id: ActionRgbLight components: - - type: LimitedCharges - maxCharges: 25 - type: EntityTargetAction whitelist: { components: [ PointLight ] } sound: /Audio/Magic/blink.ogg From 84178dd5343399305e875c19bdb2a5393bb59905 Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:10:00 -0700 Subject: [PATCH 621/622] Puddle code hotfix 2 (#37046) --- .../SpillIfPuddlePresentTileReaction.cs | 30 +++++++++++++++++++ .../TileReactions/SpillTileReaction.cs | 28 +++++++++++++++++ .../Reagents/Consumable/Drink/base_drink.yml | 1 + .../Reagents/Consumable/Food/condiments.yml | 2 ++ Resources/Prototypes/Reagents/biological.yml | 4 +++ Resources/Prototypes/Reagents/cleaning.yml | 4 +++ 6 files changed, 69 insertions(+) create mode 100644 Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs create mode 100644 Content.Server/Chemistry/TileReactions/SpillTileReaction.cs diff --git a/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs new file mode 100644 index 0000000000..5acef8d1a8 --- /dev/null +++ b/Content.Server/Chemistry/TileReactions/SpillIfPuddlePresentTileReaction.cs @@ -0,0 +1,30 @@ +using Content.Server.Fluids.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using JetBrains.Annotations; +using Robust.Shared.Map; + +namespace Content.Server.Chemistry.TileReactions +{ + [UsedImplicitly] + [DataDefinition] + public sealed partial class SpillIfPuddlePresentTileReaction : ITileReaction + { + public FixedPoint2 TileReact(TileRef tile, + ReagentPrototype reagent, + FixedPoint2 reactVolume, + IEntityManager entityManager, + List<ReagentData>? data) + { + var spillSystem = entityManager.System<PuddleSystem>(); + if (!spillSystem.TryGetPuddle(tile, out _)) + return FixedPoint2.Zero; + + return spillSystem.TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out _, sound: false, tileReact: false) + ? reactVolume + : FixedPoint2.Zero; + } + } +} diff --git a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs new file mode 100644 index 0000000000..c371410909 --- /dev/null +++ b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs @@ -0,0 +1,28 @@ +using Content.Server.Fluids.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using JetBrains.Annotations; +using Robust.Shared.Map; + +namespace Content.Server.Chemistry.TileReactions +{ + [UsedImplicitly] + [DataDefinition] + public sealed partial class SpillTileReaction : ITileReaction + { + public FixedPoint2 TileReact(TileRef tile, + ReagentPrototype reagent, + FixedPoint2 reactVolume, + IEntityManager entityManager, + List<ReagentData>? data) + { + var spillSystem = entityManager.System<PuddleSystem>(); + + return spillSystem.TrySpillAt(tile, new Solution(reagent.ID, reactVolume, data), out _, sound: false, tileReact: false) + ? reactVolume + : FixedPoint2.Zero; + } + } +} diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml index dac16dcb1c..c5cbaea8d3 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/base_drink.yml @@ -19,6 +19,7 @@ amount: 1 tileReactions: - !type:ExtinguishTileReaction { } + - !type:SpillIfPuddlePresentTileReaction { } - type: reagent id: BaseSoda diff --git a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml index 1dde464128..addc85096d 100644 --- a/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml +++ b/Resources/Prototypes/Reagents/Consumable/Food/condiments.yml @@ -175,6 +175,8 @@ recognizable: true physicalDesc: reagent-physical-desc-sticky viscosity: 0.55 #Start using syrup to attach your remote recievers to your microwaves! + tileReactions: + - !type:SpillTileReaction metabolisms: Food: # 12 diona blood for 1 unit of syrup, this stuff better be worthwhile. diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index df5ed51945..7e7c544c12 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -66,6 +66,8 @@ recognizable: true physicalDesc: reagent-physical-desc-viscous viscosity: 0.25 + tileReactions: + - !type:SpillTileReaction metabolisms: Food: # Delicious! @@ -87,6 +89,8 @@ recognizable: true physicalDesc: reagent-physical-desc-sticky viscosity: 0.10 + tileReactions: + - !type:SpillTileReaction metabolisms: Food: # Sweet! diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml index 1c0f220160..3f289d0486 100644 --- a/Resources/Prototypes/Reagents/cleaning.yml +++ b/Resources/Prototypes/Reagents/cleaning.yml @@ -77,6 +77,8 @@ recognizable: true boilingPoint: 290.0 # Glycerin meltingPoint: 18.2 + tileReactions: + - !type:SpillTileReaction friction: 0.0 - type: reagent @@ -88,6 +90,8 @@ color: "#ffffff" boilingPoint: 250.0 meltingPoint: 380.0 + tileReactions: + - !type:SpillTileReaction viscosity: 0.5 reactiveEffects: Acidic: From 0e586e3faeb7119fb01a248c7ac7c6084f9ad7b2 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 30 Apr 2025 02:19:07 +0200 Subject: [PATCH 622/622] Hotfix: Fix item toggling crashing the client for slimes (#37054) fix item toggling crashing the server for slimes --- Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index e9ed89f560..6b91ddc7f4 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -347,6 +347,7 @@ public abstract class SharedStorageSystem : EntitySystem storage = null; if (!ContainerSystem.TryGetContainingContainer(itemEnt, out container) || + container.ID != StorageComponent.ContainerId || !TryComp(container.Owner, out storage) || !_itemQuery.Resolve(itemEnt, ref itemEnt.Comp, false)) {