From 37f68fca615684cba22e45a833083aef673a9249 Mon Sep 17 00:00:00 2001 From: riccardi48 <39341154+riccardi48@users.noreply.github.com> Date: Sat, 16 May 2026 17:07:33 +0100 Subject: [PATCH 01/52] Cargo order computer order cap is able to change (#43953) fixed order cap --- .../Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs | 5 +++++ Content.Client/Cargo/UI/CargoConsoleMenu.xaml | 3 ++- Resources/Locale/en-US/cargo/cargo-console-component.ftl | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs b/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs index 9cd614de14..6f6bcd8b8d 100644 --- a/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs +++ b/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs @@ -142,6 +142,11 @@ namespace Content.Client.Cargo.BUI return; _menu.ProductCatalogue = cState.Products; + _menu.ShuttleCapacityLabel.Text = Loc.GetString( + "cargo-console-menu-order-capacity-number", + ("count", OrderCount), + ("capacity", OrderCapacity) + ); _menu?.UpdateStation(station); Populate(cState.Orders); diff --git a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml index 3ecfad94aa..018ec3670b 100644 --- a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml +++ b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml @@ -52,7 +52,8 @@ From f28058e2d62ce9705002e7817805f9a532b246f3 Mon Sep 17 00:00:00 2001 From: ProPeperos <61984624+ProPeperos@users.noreply.github.com> Date: Sat, 16 May 2026 21:50:32 +0200 Subject: [PATCH 10/52] Quality and Sprite changes to Conveyor Belts (#43599) * Made the conveyor belt item stack to 5 * New conveyor sprite sheet WIP * ajusted animation timing AND synced sprites * unfinished new belts sprite * New final sprites * Credits * Trashing old sprites * fix credits * build fix * Removed old credits * meta.json formating * Stack the Price * maxstack, shape 2x2 added - stack sprites won't work * suggested fixes * desaturated the belts * Construction fix and cleanup * remove the belt tag for good * formatting * Update Resources/Textures/Structures/conveyor.rsi/meta.json --------- Co-authored-by: iaada Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Resources/Locale/en-US/stack/stacks.ftl | 4 + .../Entities/Structures/conveyor.yml | 37 ++- .../Graphs/structures/conveyor.yml | 55 ++-- Resources/Prototypes/Stacks/other.yml | 8 + Resources/Prototypes/tags.yml | 3 - .../conveyor.rsi/conveyor_loose.png | Bin 206 -> 558 bytes .../conveyor.rsi/conveyor_loose_2.png | Bin 0 -> 578 bytes .../conveyor.rsi/conveyor_loose_3.png | Bin 0 -> 597 bytes .../conveyor.rsi/conveyor_started.png | Bin 0 -> 3008 bytes .../conveyor.rsi/conveyor_started_ccw.png | Bin 6414 -> 0 bytes .../conveyor.rsi/conveyor_started_ccw_r.png | Bin 6309 -> 0 bytes .../conveyor.rsi/conveyor_started_cw.png | Bin 6390 -> 0 bytes .../conveyor.rsi/conveyor_started_cw_r.png | Bin 3197 -> 0 bytes .../conveyor.rsi/conveyor_started_r.png | Bin 0 -> 2997 bytes .../conveyor.rsi/conveyor_stopped.png | Bin 0 -> 1078 bytes .../conveyor.rsi/conveyor_stopped_ccw.png | Bin 2381 -> 0 bytes .../conveyor.rsi/conveyor_stopped_cw.png | Bin 1271 -> 0 bytes .../Structures/conveyor.rsi/meta.json | 278 +++++------------- 18 files changed, 140 insertions(+), 245 deletions(-) create mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_loose_2.png create mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_loose_3.png create mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_started.png delete mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_started_ccw.png delete mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_started_ccw_r.png delete mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw.png delete mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw_r.png create mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_started_r.png create mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_stopped.png delete mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_stopped_ccw.png delete mode 100644 Resources/Textures/Structures/conveyor.rsi/conveyor_stopped_cw.png diff --git a/Resources/Locale/en-US/stack/stacks.ftl b/Resources/Locale/en-US/stack/stacks.ftl index 0d4c6e8988..1ebbec36a5 100644 --- a/Resources/Locale/en-US/stack/stacks.ftl +++ b/Resources/Locale/en-US/stack/stacks.ftl @@ -80,6 +80,10 @@ stack-artifact-fragment = artifact {$amount -> [1] fragment *[other] fragments } +stack-conveyor-belt = {$amount -> + [1] conveyor belt + *[other] conveyor belts +} # best materials stack-ground-tobacco = ground tobacco diff --git a/Resources/Prototypes/Entities/Structures/conveyor.yml b/Resources/Prototypes/Entities/Structures/conveyor.yml index 4de44f8b7c..bcb7c4d4ba 100644 --- a/Resources/Prototypes/Entities/Structures/conveyor.yml +++ b/Resources/Prototypes/Entities/Structures/conveyor.yml @@ -13,8 +13,9 @@ anchored: true - type: Sprite sprite: Structures/conveyor.rsi - state: conveyor_stopped_cw + state: conveyor_stopped drawdepth: HighFloorObjects + - type: SyncSprite - type: ApcPowerReceiver - type: ExtensionCableReceiver - type: Physics @@ -39,17 +40,17 @@ range: 200 - type: DeviceLinkSink ports: - - Reverse - - Forward - - Off + - Reverse + - Forward + - Off - type: Appearance - type: GenericVisualizer visuals: enum.ConveyorVisuals.State: enum.ConveyorState.Off: - Off: { state: conveyor_stopped_cw } - Forward: { state: conveyor_started_cw } - Reverse: { state: conveyor_started_cw_r } + Off: { state: conveyor_stopped } + Forward: { state: conveyor_started } + Reverse: { state: conveyor_started_r } - type: Construction graph: ConveyorGraph node: entity @@ -74,15 +75,25 @@ suffix: assembly description: A conveyor belt assembly. Used to construct a conveyor belt. components: - - type: Tag - tags: - - ConveyorAssembly - type: Sprite sprite: Structures/conveyor.rsi - state: conveyor_loose + layers: + - state: conveyor_loose + map: [ "base" ] + - type: Item + size: Normal - type: Construction graph: ConveyorGraph node: item - - type: StaticPrice + - type: StackPrice price: 40 - + - type: Stack + stackType: ConveyorBeltStack + count: 1 + baseLayer: base + layerStates: + - conveyor_loose # 0-item state + - conveyor_loose + - conveyor_loose_2 + - conveyor_loose_3 + - type: Appearance diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml index 4554fd26a1..3eb70bc17c 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/conveyor.yml @@ -2,32 +2,29 @@ id: ConveyorGraph start: start graph: - - node: start - edges: - - to: entity - steps: - - tag: ConveyorAssembly - icon: - sprite: Structures/conveyor.rsi - state: conveyor_loose - name: construction-graph-tag-conveyor-belt-assembly - doAfter: 2 - - node: item - entity: ConveyorBeltAssembly - actions: - - !type:SetAnchor - value: false - - node: entity - entity: ConveyorBelt - actions: - - !type:SetAnchor - value: true - - !type:SnapToGrid - edges: - - to: item - steps: - - tool: Prying - doAfter: 3 - completed: - - !type:SetAnchor - value: false + + - node: start + edges: + - to: entity + steps: + - material: ConveyorBeltStack + amount: 1 + doAfter: 2 + + - node: item + entity: ConveyorBeltAssembly + actions: + - !type:SetAnchor + value: false + + - node: entity + entity: ConveyorBelt + actions: + - !type:SetAnchor + value: true + - !type:SnapToGrid + edges: + - to: item + steps: + - tool: Prying + doAfter: 3 diff --git a/Resources/Prototypes/Stacks/other.yml b/Resources/Prototypes/Stacks/other.yml index e5889915d1..78f255204a 100644 --- a/Resources/Prototypes/Stacks/other.yml +++ b/Resources/Prototypes/Stacks/other.yml @@ -13,3 +13,11 @@ name: stack-gunpowder icon: { sprite: /Textures/Objects/Misc/reagent_fillings.rsi, state: powderpile } spawn: MaterialGunpowder + +- type: stack + parent: BaseVerySmallStack + id: ConveyorBeltStack + name: stack-conveyor-belt + icon: { sprite: /Textures/Structures/conveyor.rsi, state: conveyor_loose } + spawn: ConveyorBeltAssembly + maxCount: 3 diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 1814fda380..f49e79f68e 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -357,9 +357,6 @@ - type: Tag id: ConstructionMaterial # Storage whitelist: BorgModuleConstruction -- type: Tag - id: ConveyorAssembly # ConstructionGraph: ConveyorGraph - - type: Tag id: Cooked # MetamorphRecipe: FoodBurgerCheese, FoodBurgerChicken, FoodBurgerCrab, FoodBurgerDuck diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_loose.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_loose.png index 60d86646c2fa430498c0211f980255f7827ef65b..72e3144ea58132c7b07868b28d85a200a5a0c2eb 100644 GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilI0(?ST&F#FbocyBV6BX3-TzsR|^(-9Ry?~NS85rsr7}6LR5)%`Be0+c+ zo=KPgdGrE@m741lk@J#dc)MDTOa#$Ip7+Dz@fh>?aq@iq(_cR!p z!QxCnwjm=EgCLNO0^-be7O;2@kPQN#$`~1507C&rqua{B0F<1-&cFgxYhYw-z_imtTM>b0?2~uGBhv%$u`&P%M@L>d>_c{@^o;f!$CICenRfzaF#1G5-V>BwQ;j1 zG%+Ug_B!mnuHvMfBeCDkQw350Wzo2j$14CkB z;!FmHG-HN_qgRc9iWy6S{DK)Ap4|Y-F+_X1IEH9UOiqy4P7D1+z6$|>pY@2_E;4%FkJ7|vU`4MPYBQ+22WQ%mvv4FO#m1yKV<*_ diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_loose_2.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_loose_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd890f3dfc951f48ed7f1981505d0b88f12f0f6 GIT binary patch literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilI0(?ST&F#FbocyBV6BX3-TzsR|^(-9Ry?~NS85rsr7}6LR5)%`Be0+c+ zo=KPgdGrE@m741lk@J#dc)MDTOa#$Ip7+Dz@fh>?aq@iq(_cR!p z!QxCnwjm=EgCLNO0^-be7O;2@kPQN#$`~1507C&rqua{B0F<1-&cFgxYhYw-z_imtTM>b0?2~uGBhv%$u`&P%M@L>d>_c1=jq}YV&Q-FVmDut z0T1hiLszz)`TPHU)$P9NlcbalKdOoBns{lJJ)0SyTR$Ym;Tp$vV>m&lXNBWoMiuYjL9N!2(rljtS4AFWh1d W{U<#~{Zk0Y(F~rhelF{r5}E+?2%@wA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_loose_3.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_loose_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9cf9b7679633069a3d9c89a69291a39ef642dc9e GIT binary patch literal 597 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 Ug<4S!{tW{F#@WlM+#xLSFQI3W=Kufz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_started_ccw.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_started_ccw.png deleted file mode 100644 index 9073e859cf52e14b6214dd472c32e202b35277e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6414 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 diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_started_ccw_r.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_started_ccw_r.png deleted file mode 100644 index 8cc2cae1f76c6267e6e8fb4da5a76fb467d982e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6309 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 W%U+LcTAqGCfXt1pjA{)$6aELUJEiLY diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw.png deleted file mode 100644 index cab28e89b0c0c89e00ef818bd938c9ad45fe44a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6390 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 diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw_r.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw_r.png deleted file mode 100644 index ce21cbb30ffc25f25009859c0263c12d228d8a4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped.png new file mode 100644 index 0000000000000000000000000000000000000000..39ceef68cdd9be1776a38b54d59f11ddcbd17b3b GIT binary patch literal 1078 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0}1^9%xs_R*}_(q%Cd09F6)iW^Y8r!zEwnoJ#R#sLfCMGJV={dN20o5*L zU`S(N@KIy%@$mt2t23=u11X`BAiv=M=z!tT{{2EgSL5h); zff2|8IYb)D26X6s4hbT1CVUnZiBEbR~R<{ z)irs#IEF;H-wnN3^jLxCNz$AveQ!T(qmI3&&SUnq~u zv{kw3S7YJ@#tF}EF@&CQ(q-&c5~yaJDA;!WYO&Cv>c-eE*8~P3)4q%&5^YKa?hO?w zQVPi|cT(*tzTQ8^?!ejjLFC7)r9V_ZYunr15MzC)X)x1&1IOeu_5PnVDo)gB*i5pW z{GI8mb)hAZg-)z~;ctFp!=*Z2_@lADI`xOqH+E8F) z|7P!8AIrsU>%N&XwTLQ6fe5`*4a$BBd**HsX0T$iJap^iABAS=7_~(=7_5#(@4EGH z!;*bm`sfSp^i)%)7kJ@3N8Z4`W}ou#$~O z)sm(K$?W>wSxo^c0uTSnKUyBX U_ohUT0w`sAy85}Sb4q9e0N00>%m4rY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped_ccw.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped_ccw.png deleted file mode 100644 index 05c488f1f4b716715332f9bc26281f653bd9c4cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2381 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 diff --git a/Resources/Textures/Structures/conveyor.rsi/meta.json b/Resources/Textures/Structures/conveyor.rsi/meta.json index 3bb9efe797..3845e5a433 100644 --- a/Resources/Textures/Structures/conveyor.rsi/meta.json +++ b/Resources/Textures/Structures/conveyor.rsi/meta.json @@ -1,7 +1,7 @@ { - "version": 1, + "version": 2, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and modified by Swept, switch-fwd and switch-rev modified by RedBookcase (Github)", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/8e33113cfe8b5da0e64d74c842bec0e6059d992d and modified by Swept and Peperos, switch-fwd and switch-rev modified by RedBookcase (Github)", "size": { "x": 32, "y": 32 @@ -11,228 +11,106 @@ "name": "conveyor_loose" }, { - "name": "conveyor_started_ccw", - "directions": 8, + "name": "conveyor_loose_2" + }, + { + "name": "conveyor_loose_3" + }, + { + "name": "conveyor_started", + "directions": 4, "delays": [ [ - 0.1, - 0.1, - 0.1, - 0.1 + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ], [ - 0.1, - 0.1, - 0.1, - 0.1 + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ], [ - 0.1, - 0.1, - 0.1, - 0.1 + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ], [ - 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.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ] ] }, { - "name": "conveyor_started_ccw_r", - "directions": 8, + "name": "conveyor_started_r", + "directions": 4, "delays": [ [ - 0.1, - 0.1, - 0.1, - 0.1 + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ], [ - 0.1, - 0.1, - 0.1, - 0.1 + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ], [ - 0.1, - 0.1, - 0.1, - 0.1 + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ], [ - 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.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032, + 0.032 ] ] }, { - "name": "conveyor_started_cw", - "directions": 8, - "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 - ] - ] - }, - { - "name": "conveyor_started_cw_r", - "directions": 8, - "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 - ] - ] - }, - { - "name": "conveyor_stopped_ccw", - "directions": 8 - }, - { - "name": "conveyor_stopped_cw", - "directions": 8 + "name": "conveyor_stopped", + "directions": 4 }, { "name": "switch" From adc4943628c0e11d280cb5d40af82af34cfe9932 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 16 May 2026 20:11:21 +0000 Subject: [PATCH 11/52] 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 f8bc1218a7..25fd387c80 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Jrpl - changes: - - message: Chameleon clothing made of Cloth can now be eaten by Moths. - type: Tweak - id: 9180 - time: '2025-11-01T13:37:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/41232 - author: SlamBamActionman changes: - message: Fixed the G.O.R.I.L.L.A gauntlet being able to unanchor walls, doors @@ -4080,3 +4073,12 @@ id: 9691 time: '2026-05-16T18:18:37.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/43804 +- author: ProPeperos + changes: + - message: Conveyor Belts now have a new directional sprite! + type: Add + - message: Conveyor Belts now stack to 3, but are 2 times bigger in inventory + type: Tweak + id: 9692 + time: '2026-05-16T20:10:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/43599 From 7e8cdd7f277bc4188239c5319372bba1e148c02e Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Sat, 16 May 2026 15:56:00 -0400 Subject: [PATCH 12/52] Add xmldocs to NUnit constraint extensions (#43887) --- .../Constraints/CompConstraintExtensions.cs | 42 ++++++++++ .../NUnit/Constraints/LifeStageConstraint.cs | 78 +++++++++++++++++++ 2 files changed, 120 insertions(+) diff --git a/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs b/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs index 1586c52e03..34cbe6f682 100644 --- a/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs +++ b/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs @@ -20,12 +20,14 @@ public static class CompConstraintExtensions { extension(Has) { + /// public static ResolvableConstraintExpression Comp(IIntegrationInstance instance) where T : IComponent { return new ConstraintExpression().Comp(instance); } + /// public static ResolvableConstraintExpression Comp(Type t, IIntegrationInstance instance) { return new ConstraintExpression().Comp(t, instance); @@ -34,12 +36,52 @@ public static class CompConstraintExtensions extension(ConstraintExpression expr) { + /// + /// Returns a new constraint which will either test for the existence of a + /// on the entity being tested or apply any following constraint to that component. + /// + /// The component Type to check for. + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity has an ItemComponent on the server. + /// Assert.That(myEntity, Has.Comp<ItemComponent>(Server)); + /// + /// // Assert that the server-sided entity myEntity has an ItemComponent with a Size field equal to "Small" + /// Assert.That(myEntity, + /// Has + /// .Comp<ItemComponent>(Server) + /// .Property(nameof(ItemComponent.Size)) + /// .EqualTo("Small") + /// ); + /// + /// public ResolvableConstraintExpression Comp(IIntegrationInstance instance) where T : IComponent { return expr.Append(new CompOperator(typeof(T), instance)); } + /// + /// Returns a new constraint which will either test for the existence of a component of the specified type + /// on the entity being tested or apply any following constraint to that component. + /// + /// The Type of the component to check for. + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity has an ItemComponent on the server. + /// Assert.That(myEntity, Has.Comp(typeof(ItemComponent), Server)); + /// + /// // Assert that the server-sided entity myEntity has an ItemComponent with a Size field equal to "Small" + /// Assert.That(myEntity, + /// Has + /// .Comp(typeof(ItemComponent), Server) + /// .Property(nameof(ItemComponent.Size)) + /// .EqualTo("Small") + /// ); + /// + /// public ResolvableConstraintExpression Comp(Type t, IIntegrationInstance instance) { return expr.Append(new CompOperator(t, instance)); diff --git a/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs b/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs index 0539a6b54e..be6c68da58 100644 --- a/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs +++ b/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs @@ -56,36 +56,43 @@ public static class LifeStageConstraintExtensions { extension(Is) { + /// public static LifeStageConstraint LifeStage(EntityLifeStage stage, IIntegrationInstance instance) { return new LifeStageConstraint(stage, instance); } + /// public static LifeStageConstraint PreInit(IIntegrationInstance instance) { return Is.LifeStage(EntityLifeStage.PreInit, instance); } + /// public static LifeStageConstraint Initializing(IIntegrationInstance instance) { return Is.LifeStage(EntityLifeStage.Initializing, instance); } + /// public static LifeStageConstraint Initialized(IIntegrationInstance instance) { return Is.LifeStage(EntityLifeStage.Initialized, instance); } + /// public static LifeStageConstraint MapInitialized(IIntegrationInstance instance) { return Is.LifeStage(EntityLifeStage.MapInitialized, instance); } + /// public static LifeStageConstraint Terminating(IIntegrationInstance instance) { return Is.LifeStage(EntityLifeStage.Terminating, instance); } + /// public static LifeStageConstraint Deleted(IIntegrationInstance instance) { return Is.LifeStage(EntityLifeStage.Deleted, instance); @@ -94,6 +101,17 @@ public static class LifeStageConstraintExtensions extension(ConstraintExpression expr) { + /// + /// Returns a new constraint that checks if the entity is in the given lifestage. + /// + /// The to check for. + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity is MapInitialized. + /// Assert.That(myEntity, Is.LifeStage(EntityLifeStage.MapInitialized, Server)); + /// + /// public LifeStageConstraint LifeStage(EntityLifeStage stage, IIntegrationInstance instance) { var c = new LifeStageConstraint(stage, instance); @@ -103,31 +121,91 @@ public static class LifeStageConstraintExtensions return c; } + /// + /// Returns a new constraint that checks if the entity is in the PreInit lifestage. + /// + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity has not yet been initialized. + /// Assert.That(myEntity, Is.PreInit(Server)); + /// + /// public LifeStageConstraint PreInit(IIntegrationInstance instance) { return expr.LifeStage(EntityLifeStage.PreInit, instance); } + /// + /// Returns a new constraint that checks if the entity is in the Intializing lifestage. + /// + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity is Initializing. + /// Assert.That(myEntity, Is.Initializing(Server)); + /// + /// public LifeStageConstraint Initializing(IIntegrationInstance instance) { return expr.LifeStage(EntityLifeStage.Initializing, instance); } + /// + /// Returns a new constraint that checks if the entity is in the Initialized lifestage. + /// + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity is Initialized. + /// Assert.That(myEntity, Is.Initialized(Server)); + /// + /// public LifeStageConstraint Initialized(IIntegrationInstance instance) { return expr.LifeStage(EntityLifeStage.Initialized, instance); } + /// + /// Returns a new constraint that checks if the entity is in the MapInitialized lifestage. + /// + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity is MapInitialized. + /// Assert.That(myEntity, Is.MapInitialized(Server)); + /// + /// public LifeStageConstraint MapInitialized(IIntegrationInstance instance) { return expr.LifeStage(EntityLifeStage.MapInitialized, instance); } + /// + /// Returns a new constraint that checks if the entity is in the Terminating lifestage. + /// + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity is Terminating. + /// Assert.That(myEntity, Is.Terminating(Server)); + /// + /// public LifeStageConstraint Terminating(IIntegrationInstance instance) { return expr.LifeStage(EntityLifeStage.Terminating, instance); } + /// + /// Returns a new constraint that checks if the entity is in the Deleted lifestage. + /// + /// The (i.e. Server or Client) on which to perform the test. + /// + /// + /// // Assert that the server-sided entity myEntity is Deleted. + /// Assert.That(myEntity, Is.Deleted(Server)); + /// + /// public LifeStageConstraint Deleted(IIntegrationInstance instance) { return expr.LifeStage(EntityLifeStage.Deleted, instance); From 988010c4667ca1a69897ebeda547412df45a681b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Sat, 16 May 2026 17:12:22 -0500 Subject: [PATCH 13/52] Buyable + destructible desk bell, desk bell variants (#36701) * .rsi * .yml * buzzer * desk horn and cleanup * changes * necro post * fixed * tiny shrink * tabs... * indentation * injurable --------- Co-authored-by: iaada Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Catalog/Fills/Crates/service.yml | 1 + .../Entities/Objects/Misc/desk_bell.yml | 230 +++++++++++++++--- .../Construction/Graphs/tools/bell.yml | 57 +++++ .../Prototypes/SoundCollections/bike_horn.yml | 5 + .../{normal.png => icon-bell.png} | Bin .../Misc/desk_bell.rsi/icon-buzzer.png | Bin 0 -> 260 bytes .../Objects/Misc/desk_bell.rsi/icon-empty.png | Bin 0 -> 185 bytes .../Objects/Misc/desk_bell.rsi/meta.json | 10 +- 8 files changed, 265 insertions(+), 38 deletions(-) create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml rename Resources/Textures/Objects/Misc/desk_bell.rsi/{normal.png => icon-bell.png} (100%) create mode 100644 Resources/Textures/Objects/Misc/desk_bell.rsi/icon-buzzer.png create mode 100644 Resources/Textures/Objects/Misc/desk_bell.rsi/icon-empty.png diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 1f1432e709..b9c6168dae 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -199,6 +199,7 @@ - id: NewtonCradle - id: BoxEnvelope - id: BrbSign + - id: DeskBell - type: entity parent: CrateGenericSteel diff --git a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml index f170aa899e..413a3fa63f 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml @@ -1,50 +1,208 @@ - type: entity parent: BaseItem + id: EmptyDeskBell + name: unfinished desk bell + description: An empty bell missing its noise maker. + components: + - type: Sprite + sprite: Objects/Misc/desk_bell.rsi + state: icon-empty + - type: Construction + graph: &BellGraph BellGraph + node: start + - type: Damageable + - type: Injurable + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: &DamageTrigger50 + !type:DamageTrigger + damage: 50 + behaviors: &OverkillBehavior + - !type:DoActsBehavior + acts: ["Destruction"] + - trigger: &DamageTrigger20 + !type:DamageTrigger + damage: 20 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 0 + max: 1 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: MeleeWeapon + wideAnimationRotation: 180 + soundHit: &BellSound + collection: DeskBell + params: &SoundParams + variation: 0.03 + volume: 3 + damage: + types: + Blunt: 4 + # Sound + - type: MeleeSound + soundGroups: + Brute: *BellSound + - type: EmitSoundOnLand + sound: *BellSound + - type: EmitSoundOnCollide + sound: *BellSound + +- type: entity + parent: EmptyDeskBell id: DeskBell name: desk bell description: The cornerstone of any customer service job. You feel an unending urge to ring it. components: - type: Sprite - sprite: Objects/Misc/desk_bell.rsi - state: "normal" + state: icon-bell - type: Tag - tags: - - Payload + tags: &PayloadTag + - Payload + - type: Construction + graph: *BellGraph + node: deskBellNode + - type: Destructible + thresholds: + - trigger: *DamageTrigger50 + behaviors: *OverkillBehavior + - trigger: *DamageTrigger20 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + PartRodMetal1: + min: 0 + max: 1 + - !type:ChangeConstructionNodeBehavior + node: start + - !type:DoActsBehavior + acts: ["Destruction"] - type: InteractionPopup successChance: 1 - interactSuccessSound: - collection: DeskBell - params: - variation: 0.03 - volume: 3 onActivate: true - - type: EmitSoundOnUse - sound: - collection: DeskBell - params: - variation: 0.03 - volume: 3 - - type: EmitSoundOnTrigger - sound: - collection: DeskBell - params: - variation: 0.03 - volume: 3 - - type: EmitSoundOnLand - sound: - collection: DeskBell - params: - variation: 0.03 - volume: 3 + interactSuccessSound: *BellSound - type: UseDelay delay: 0.5 + # Sound + - type: EmitSoundOnUse + sound: *BellSound + - type: EmitSoundOnTrigger + sound: *BellSound + +- type: entity + parent: EmptyDeskBell + id: DeskBuzzer + name: desk buzzer + description: An advanced customer service tool. You feel an unending urge to buzz it. + components: + - type: Sprite + state: icon-buzzer + - type: Tag + tags: *PayloadTag + - type: Construction + graph: *BellGraph + node: deskBuzzerNode + - type: Destructible + thresholds: + - trigger: *DamageTrigger50 + behaviors: *OverkillBehavior + - trigger: *DamageTrigger20 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + CableApcStack1: + min: 0 + max: 2 + - !type:ChangeConstructionNodeBehavior + node: start + - !type:DoActsBehavior + acts: ["Destruction"] + - type: StationAiWhitelist + - type: InteractionPopup + successChance: 1 + onActivate: true + interactSuccessSound: &BuzzerSound + collection: DeskBuzzer + params: *SoundParams + - type: UseDelay + delay: 0.5 + # Sound + - type: EmitSoundOnUse + sound: *BuzzerSound + - type: EmitSoundOnTrigger + sound: *BuzzerSound + - type: MeleeSound + soundGroups: + Brute: *BuzzerSound - type: MeleeWeapon - wideAnimationRotation: 180 - soundHit: - collection: DeskBell - params: - variation: 0.03 - volume: 3 - damage: - types: - Blunt: 4 + soundHit: *BuzzerSound + - type: EmitSoundOnLand + sound: *BuzzerSound + - type: EmitSoundOnCollide + sound: *BuzzerSound + +- type: entity + parent: EmptyDeskBell + id: DeskHorn + name: desk horn + description: The cornerstone of any clown business. You feel an unending urge to honk it. + components: + - type: Sprite + state: icon-buzzer + - type: Tag + tags: *PayloadTag + - type: Construction + graph: *BellGraph + node: deskHornNode + - type: Destructible + thresholds: + - trigger: *DamageTrigger50 + behaviors: *OverkillBehavior + - trigger: *DamageTrigger20 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + BikeHorn: + min: 1 + max: 1 + - !type:ChangeConstructionNodeBehavior + node: start + - !type:DoActsBehavior + acts: ["Destruction"] + - type: InteractionPopup + successChance: 1 + onActivate: true + interactSuccessSound: &HornSound + collection: BikeHorn + params: *SoundParams + - type: UseDelay + delay: 0.5 + # Sound + - type: EmitSoundOnUse + sound: *HornSound + - type: EmitSoundOnTrigger + sound: *HornSound + - type: MeleeSound + soundGroups: + Brute: *HornSound + - type: MeleeWeapon + soundHit: *HornSound + - type: EmitSoundOnLand + sound: *HornSound + - type: EmitSoundOnCollide + sound: *HornSound diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml b/Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml new file mode 100644 index 0000000000..d9877900b6 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml @@ -0,0 +1,57 @@ +- type: constructionGraph + id: BellGraph + start: start + graph: + - node: start + entity: EmptyDeskBell + edges: + - to: deskBellNode + steps: + - material: MetalRod + amount: 1 + doAfter: 1 + - to: deskBuzzerNode + steps: + - material: Cable + amount: 2 + doAfter: 1 + - to: deskHornNode + steps: + - tag: BikeHorn + name: construction-graph-tag-clown-bike-horn + icon: + sprite: Objects/Fun/bikehorn.rsi + state: icon + doAfter: 1 + + - node: deskBellNode + entity: DeskBell + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: PartRodMetal1 + amount: 1 + steps: &UnscrewStep + - tool: Screwing + doAfter: 1 + + - node: deskBuzzerNode + entity: DeskBuzzer + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 2 + steps: *UnscrewStep + + - node: deskHornNode + entity: DeskHorn + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: BikeHorn + amount: 1 + steps: *UnscrewStep diff --git a/Resources/Prototypes/SoundCollections/bike_horn.yml b/Resources/Prototypes/SoundCollections/bike_horn.yml index aeb3ec18f5..7045de3569 100644 --- a/Resources/Prototypes/SoundCollections/bike_horn.yml +++ b/Resources/Prototypes/SoundCollections/bike_horn.yml @@ -18,6 +18,11 @@ files: - /Audio/Items/desk_bell_ring.ogg +- type: soundCollection + id: DeskBuzzer + files: + - /Audio/Items/ring.ogg + - type: soundCollection id: BoxingBell files: diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/normal.png b/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-bell.png similarity index 100% rename from Resources/Textures/Objects/Misc/desk_bell.rsi/normal.png rename to Resources/Textures/Objects/Misc/desk_bell.rsi/icon-bell.png diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-buzzer.png b/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-buzzer.png new file mode 100644 index 0000000000000000000000000000000000000000..12334b69cc2afd43234c7c2835cbfa008e1d4807 GIT binary patch literal 260 zcmV+f0sH=mP)YXY~bLY#XW z7b!o+UlBY7{obhV#__|R|Cr(&r{m#!Q_z%XuDwubb45`U1>g=k`a%fodnU600000< KMNUMnLSTaSeQdA* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-empty.png b/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ed687409eb18cc3a00414782e84f4fa84fd7bc6b GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyq5(c3t_KbrFtuzopr03Sy~;s5{u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json b/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json index 2202fd0650..adcec14635 100644 --- a/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json @@ -1,14 +1,20 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/22e6ce8a6bed9356e312fabe5e7552f81b9bf19f/icons/obj/bureaucracy.dmi", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/22e6ce8a6bed9356e312fabe5e7552f81b9bf19f/icons/obj/bureaucracy.dmi, icon-empty and icon-buzzer edit by iaada (GitHub)", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "normal" + "name": "icon-bell" + }, + { + "name": "icon-empty" + }, + { + "name": "icon-buzzer" } ] } From 18d60a35c7c2a73d0ebccc6f0587330faf2151b2 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 16 May 2026 22:30:28 +0000 Subject: [PATCH 14/52] 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 25fd387c80..4aa85b61d0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Fixed the G.O.R.I.L.L.A gauntlet being able to unanchor walls, doors - etc. - type: Fix - id: 9181 - time: '2025-11-01T15:28:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/41219 - author: Hitlinemoss changes: - message: Towels in the trinkets loadout menu are now sorted by hue. @@ -4082,3 +4074,13 @@ id: 9692 time: '2026-05-16T20:10:12.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/43599 +- author: aada + changes: + - message: A desk bell is now included in the bureaucracy crate. + type: Add + - message: Variants can be crafted by adding 2 lv cable or a bike horn after screwdrivering + a desk bell. + type: Add + id: 9693 + time: '2026-05-16T22:29:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36701 From 6b215d64e614b340d75455fcf6bf9773121af800 Mon Sep 17 00:00:00 2001 From: Jessica M Date: Sat, 16 May 2026 15:55:09 -0700 Subject: [PATCH 15/52] make Ninja doorjack objective use counter condition (#43813) * doorjack to counter condition * howd i do that * partial * enumrate the * cleanup --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- .../Ninja/Systems/SpaceNinjaSystem.cs | 18 -------- .../Components/DoorjackConditionComponent.cs | 10 ++--- .../DoorJackObjectiveConditionSystem.cs | 44 +++++++++++++++++++ .../Systems/MailFraudObjectiveSystem.cs | 9 ++-- .../Systems/NinjaConditionsSystem.cs | 18 -------- Content.Shared/Mind/SharedMindSystem.cs | 32 ++++++++++++++ .../Prototypes/Objectives/base_objectives.yml | 3 +- Resources/Prototypes/Objectives/ninja.yml | 2 +- 8 files changed, 84 insertions(+), 52 deletions(-) create mode 100644 Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index a4d90eddc9..a130dd6e90 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -33,7 +33,6 @@ public sealed partial class SpaceNinjaSystem : SharedSpaceNinjaSystem { base.Initialize(); - SubscribeLocalEvent(OnDoorjack); SubscribeLocalEvent(OnResearchStolen); SubscribeLocalEvent(OnThreatCalledIn); SubscribeLocalEvent(OnCriminalRecordsHacked); @@ -113,23 +112,6 @@ public sealed partial class SpaceNinjaSystem : SharedSpaceNinjaSystem return GetNinjaBattery(user, out var uid, out var battery) && _battery.TryUseCharge((uid.Value, battery), charge); } - /// - /// Increment greentext when emagging a door. - /// - private void OnDoorjack(EntityUid uid, SpaceNinjaComponent comp, ref EmaggedSomethingEvent args) - { - // incase someone lets ninja emag non-doors double check it here - if (!HasComp(args.Target)) - return; - - // this popup is serverside since door emag logic is serverside (power funnies) - Popup.PopupEntity(Loc.GetString("ninja-doorjack-success", ("target", Identity.Entity(args.Target, EntityManager))), uid, uid, PopupType.Medium); - - // handle greentext - if (_mind.TryGetObjectiveComp(uid, out var obj)) - obj.DoorsJacked++; - } - /// /// Add to greentext when stealing technologies. /// diff --git a/Content.Server/Objectives/Components/DoorjackConditionComponent.cs b/Content.Server/Objectives/Components/DoorjackConditionComponent.cs index 470680ae6d..8780a0720e 100644 --- a/Content.Server/Objectives/Components/DoorjackConditionComponent.cs +++ b/Content.Server/Objectives/Components/DoorjackConditionComponent.cs @@ -5,11 +5,7 @@ namespace Content.Server.Objectives.Components; /// /// Objective condition that requires the player to be a ninja and have doorjacked at least a random number of airlocks. -/// Requires to function. +/// Requires and to function. /// -[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SharedSpaceNinjaSystem))] -public sealed partial class DoorjackConditionComponent : Component -{ - [DataField("doorsJacked"), ViewVariables(VVAccess.ReadWrite)] - public int DoorsJacked; -} +[RegisterComponent] +public sealed partial class DoorjackConditionComponent : Component; diff --git a/Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs b/Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs new file mode 100644 index 0000000000..5c9741e70b --- /dev/null +++ b/Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs @@ -0,0 +1,44 @@ +using Content.Server.Objectives.Components; +using Content.Shared.Doors.Components; +using Content.Shared.IdentityManagement; +using Content.Shared.Mind; +using Content.Shared.Ninja.Components; +using Content.Shared.Ninja.Systems; +using Content.Shared.Popups; + +namespace Content.Server.Objectives.Systems; + +public sealed partial class DoorJackObjectiveConditionSystem : EntitySystem +{ + [Dependency] private SharedPopupSystem _popupSystem = default!; + [Dependency] private SharedMindSystem _mind = default!; + [Dependency] private CounterConditionSystem _counterCondition = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnDoorjack); + } + + private void OnDoorjack(EntityUid uid, SpaceNinjaComponent comp, ref EmaggedSomethingEvent args) + { + // incase someone lets ninja emag non-doors double check it here + if (!HasComp(args.Target)) + return; + + if (!_mind.TryGetMind(uid, out var mindUid, out var mind)) + return; + + // this popup is serverside since door emag logic is serverside (power funnies) + _popupSystem.PopupEntity( + Loc.GetString("ninja-doorjack-success", ("target", Identity.Entity(args.Target, EntityManager))), + uid, + uid, + PopupType.Medium); + + foreach (var obj in _mind.EnumerateObjectives((mindUid, mind))) + { + _counterCondition.IncreaseCount(obj); + } + } +} diff --git a/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs b/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs index 0fa4bea603..f93b404b34 100644 --- a/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs +++ b/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs @@ -24,15 +24,12 @@ public sealed partial class MailFraudObjectiveSystem : EntitySystem if (_fingerprintReader.IsAllowed(ent.Owner, args.User, out var _, showPopup: false, checkGloves: false)) return; //cutting open your own letter - if (!_mind.TryGetMind(args.User, out _, out var mind)) + if (!_mind.TryGetMind(args.User, out var mindUid, out var mind)) return; - foreach (var obj in mind.Objectives) + foreach (var obj in _mind.EnumerateObjectives((mindUid, mind))) { - if (HasComp(obj)) - { - _counterCondition.IncreaseCount(obj); - } + _counterCondition.IncreaseCount(obj); } } } diff --git a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs index d261867add..477bc03445 100644 --- a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs +++ b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs @@ -22,30 +22,12 @@ public sealed partial class NinjaConditionsSystem : EntitySystem public override void Initialize() { - SubscribeLocalEvent(OnDoorjackGetProgress); - SubscribeLocalEvent(OnSpiderChargeRequirementCheck); SubscribeLocalEvent(OnSpiderChargeAfterAssign); SubscribeLocalEvent(OnStealResearchGetProgress); } - // doorjack - - private void OnDoorjackGetProgress(EntityUid uid, DoorjackConditionComponent comp, ref ObjectiveGetProgressEvent args) - { - args.Progress = DoorjackProgress(comp, _number.GetTarget(uid)); - } - - private float DoorjackProgress(DoorjackConditionComponent comp, int target) - { - // prevent divide-by-zero - if (target == 0) - return 1f; - - return MathF.Min(comp.DoorsJacked / (float) target, 1f); - } - // spider charge private void OnSpiderChargeRequirementCheck(EntityUid uid, SpiderChargeConditionComponent comp, ref RequirementCheckEvent args) { diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs index fe21618fa3..08152ab42c 100644 --- a/Content.Shared/Mind/SharedMindSystem.cs +++ b/Content.Shared/Mind/SharedMindSystem.cs @@ -1,3 +1,4 @@ +using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.Administration.Logs; @@ -469,6 +470,37 @@ public abstract partial class SharedMindSystem : EntitySystem return false; } + /// + /// Returns an enumerator of the input minds objectives + /// + public IEnumerable EnumerateObjectives(Entity mind) + { + if (!Resolve(mind, ref mind.Comp)) + yield break; + + foreach (var obj in mind.Comp.Objectives) + { + yield return obj; + } + } + + /// + /// Returns an enumerator of objectives with the specified component. + /// + public IEnumerable EnumerateObjectives(Entity mind) where T : IComponent + { + if (!Resolve(mind, ref mind.Comp)) + yield break; + + foreach (var obj in mind.Comp.Objectives) + { + if (!HasComp(obj)) + continue; + + yield return obj; + } + } + /// /// Gets a mind from uid and/or MindContainerComponent. Used for null checks. /// diff --git a/Resources/Prototypes/Objectives/base_objectives.yml b/Resources/Prototypes/Objectives/base_objectives.yml index 12204153c2..5f011cd3ce 100644 --- a/Resources/Prototypes/Objectives/base_objectives.yml +++ b/Resources/Prototypes/Objectives/base_objectives.yml @@ -125,7 +125,6 @@ abstract: true parent: BaseObjective id: BaseCounterObjective - description: We're interested in Nanotrasen's correspondence. Letter opener not provided. components: - type: CounterCondition - - type: NumberObjective # min and max to be set in the inheritor \ No newline at end of file + - type: NumberObjective # min and max to be set in the inheritor diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index f015dd8f72..03980f7b31 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -12,7 +12,7 @@ - NinjaRole - type: entity - parent: BaseNinjaObjective + parent: [BaseNinjaObjective, BaseCounterObjective] id: DoorjackObjective components: - type: Objective From a55e610c215cb03dfb3738a0ff140a18aa4b93aa Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sun, 17 May 2026 03:06:05 +0200 Subject: [PATCH 16/52] Add EntProtoId overloads to EntityWhitelists (#40807) * prototype whitelists * review * fix --- .../Tests/Utility/EntityWhitelistTest.cs | 76 +++++--- .../EntityWhitelistSystem.Prototype.cs | 166 ++++++++++++++++++ .../Whitelist/EntityWhitelistSystem.cs | 58 +++--- 3 files changed, 257 insertions(+), 43 deletions(-) create mode 100644 Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs diff --git a/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs b/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs index d7e1239603..724560d4ab 100644 --- a/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs +++ b/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs @@ -2,55 +2,61 @@ using System.Linq; using Content.IntegrationTests.Fixtures; using Content.Shared.Containers.ItemSlots; using Content.Shared.Whitelist; -using Robust.Shared.GameObjects; +using Robust.Shared.Prototypes; namespace Content.IntegrationTests.Tests.Utility { - [TestFixture] [TestOf(typeof(EntityWhitelist))] public sealed class EntityWhitelistTest : GameTest { private const string InvalidComponent = "Sprite"; private const string ValidComponent = "Physics"; + private const string WhitelistProtoId = "WhitelistDummy"; + private const string ValidComponentProtoId = "ValidComponentDummy"; + private const string WhitelistTestValidTagProtoId = "WhitelistTestValidTagDummy"; + private const string InvalidComponentProtoId = "InvalidComponentDummy"; + private const string WhitelistTestInvalidTagProtoId = "WhitelistTestInvalidTagDummy"; + [TestPrototypes] private const string Prototypes = $@" - type: Tag id: WhitelistTestValidTag + - type: Tag id: WhitelistTestInvalidTag - type: entity - id: WhitelistDummy + id: {WhitelistProtoId} components: - type: ItemSlots slots: slotName: whitelist: - prototypes: - - ValidPrototypeDummy components: - {ValidComponent} tags: - WhitelistTestValidTag - type: entity - id: InvalidComponentDummy + id: {InvalidComponentProtoId} components: - type: {InvalidComponent} + - type: entity - id: WhitelistTestInvalidTagDummy + id: {WhitelistTestInvalidTagProtoId} components: - type: Tag tags: - WhitelistTestInvalidTag - type: entity - id: ValidComponentDummy + id: {ValidComponentProtoId} components: - type: {ValidComponent} + - type: entity - id: WhitelistTestValidTagDummy + id: {WhitelistTestValidTagProtoId} components: - type: Tag tags: @@ -70,11 +76,17 @@ namespace Content.IntegrationTests.Tests.Utility await server.WaitAssertion(() => { - var validComponent = sEntities.SpawnEntity("ValidComponentDummy", mapCoordinates); - var WhitelistTestValidTag = sEntities.SpawnEntity("WhitelistTestValidTagDummy", mapCoordinates); + var prototypeManager = server.ResolveDependency(); - var invalidComponent = sEntities.SpawnEntity("InvalidComponentDummy", mapCoordinates); - var WhitelistTestInvalidTag = sEntities.SpawnEntity("WhitelistTestInvalidTagDummy", mapCoordinates); + var validComponentProto = prototypeManager.Index(ValidComponentProtoId); + var whitelistTestValidTagProto = prototypeManager.Index(WhitelistTestValidTagProtoId); + var invalidComponentProto = prototypeManager.Index(InvalidComponentProtoId); + var whitelistTestInvalidTagProto = prototypeManager.Index(WhitelistTestInvalidTagProtoId); + + var validComponentUid = sEntities.SpawnEntity(ValidComponentProtoId, mapCoordinates); + var whitelistTestValidTagUid = sEntities.SpawnEntity(WhitelistTestValidTagProtoId, mapCoordinates); + var invalidComponentUid = sEntities.SpawnEntity(InvalidComponentProtoId, mapCoordinates); + var whitelistTestInvalidTagUid = sEntities.SpawnEntity(WhitelistTestInvalidTagProtoId, mapCoordinates); // Test instantiated on its own var whitelistInst = new EntityWhitelist @@ -85,15 +97,25 @@ namespace Content.IntegrationTests.Tests.Utility Assert.Multiple(() => { - Assert.That(sys.IsValid(whitelistInst, validComponent), Is.True); - Assert.That(sys.IsValid(whitelistInst, WhitelistTestValidTag), Is.True); + Assert.That(sys.IsValid(whitelistInst, validComponentUid), Is.True); + Assert.That(sys.IsValid(whitelistInst, validComponentProto), Is.True); + Assert.That(sys.IsValid(whitelistInst, ValidComponentProtoId), Is.True); - Assert.That(sys.IsValid(whitelistInst, invalidComponent), Is.False); - Assert.That(sys.IsValid(whitelistInst, WhitelistTestInvalidTag), Is.False); + Assert.That(sys.IsValid(whitelistInst, whitelistTestValidTagUid), Is.True); + Assert.That(sys.IsValid(whitelistInst, whitelistTestValidTagProto), Is.True); + Assert.That(sys.IsValid(whitelistInst, WhitelistTestValidTagProtoId), Is.True); + + Assert.That(sys.IsValid(whitelistInst, invalidComponentUid), Is.False); + Assert.That(sys.IsValid(whitelistInst, invalidComponentProto), Is.False); + Assert.That(sys.IsValid(whitelistInst, InvalidComponentProtoId), Is.False); + + Assert.That(sys.IsValid(whitelistInst, whitelistTestInvalidTagUid), Is.False); + Assert.That(sys.IsValid(whitelistInst, whitelistTestInvalidTagProto), Is.False); + Assert.That(sys.IsValid(whitelistInst, WhitelistTestInvalidTagProtoId), Is.False); }); // Test from serialized - var dummy = sEntities.SpawnEntity("WhitelistDummy", mapCoordinates); + var dummy = sEntities.SpawnEntity(WhitelistProtoId, mapCoordinates); var whitelistSer = sEntities.GetComponent(dummy).Slots.Values.First().Whitelist; Assert.That(whitelistSer, Is.Not.Null); @@ -105,11 +127,21 @@ namespace Content.IntegrationTests.Tests.Utility Assert.Multiple(() => { - Assert.That(sys.IsValid(whitelistSer, validComponent), Is.True); - Assert.That(sys.IsValid(whitelistSer, WhitelistTestValidTag), Is.True); + Assert.That(sys.IsValid(whitelistSer, validComponentUid), Is.True); + Assert.That(sys.IsValid(whitelistSer, validComponentProto), Is.True); + Assert.That(sys.IsValid(whitelistSer, ValidComponentProtoId), Is.True); - Assert.That(sys.IsValid(whitelistSer, invalidComponent), Is.False); - Assert.That(sys.IsValid(whitelistSer, WhitelistTestInvalidTag), Is.False); + Assert.That(sys.IsValid(whitelistSer, whitelistTestValidTagUid), Is.True); + Assert.That(sys.IsValid(whitelistSer, whitelistTestValidTagProto), Is.True); + Assert.That(sys.IsValid(whitelistSer, WhitelistTestValidTagProtoId), Is.True); + + Assert.That(sys.IsValid(whitelistSer, invalidComponentUid), Is.False); + Assert.That(sys.IsValid(whitelistSer, invalidComponentProto), Is.False); + Assert.That(sys.IsValid(whitelistSer, InvalidComponentProtoId), Is.False); + + Assert.That(sys.IsValid(whitelistSer, whitelistTestInvalidTagUid), Is.False); + Assert.That(sys.IsValid(whitelistSer, whitelistTestInvalidTagProto), Is.False); + Assert.That(sys.IsValid(whitelistSer, WhitelistTestInvalidTagProtoId), Is.False); }); }); } diff --git a/Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs b/Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs new file mode 100644 index 0000000000..1526ae6e44 --- /dev/null +++ b/Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs @@ -0,0 +1,166 @@ +using Content.Shared.Item; +using Content.Shared.Tag; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Whitelist; + +public sealed partial class EntityWhitelistSystem +{ + /// + /// Checks whether a given EntProtoId satisfies a whitelist. + /// + public bool IsValid(EntityWhitelist list, [ForbidLiteral] EntProtoId protoId) + { + return IsValid(list, _proto.Index(protoId)); + } + + /// + /// Checks whether a given EntityPrototype satisfies a whitelist. + /// + public bool IsValid(EntityWhitelist list, EntityPrototype prototype) + { + list.Registrations ??= StringsToRegs(list.Components); + + if (list.Registrations != null) + { + foreach (var reg in list.Registrations) + { + if (prototype.Components.ContainsKey(reg.Name)) + { + if (!list.RequireAll) + return true; + } + else if (list.RequireAll) + return false; + } + } + + if (list.Sizes != null && prototype.TryGetComponent(_itemComponentName, out ItemComponent? itemComp)) + { + if (list.Sizes.Contains(itemComp.Size)) + return true; + } + + if (list.Tags != null && prototype.TryGetComponent(_tagComponentName, out TagComponent? tagComp)) + { + return list.RequireAll + ? _tag.HasAllTags(tagComp, list.Tags) + : _tag.HasAnyTag(tagComp, list.Tags); + } + + return list.RequireAll; + } + + /// + /// Checks whether a given EntProtoId is allowed by a whitelist and not blocked by a blacklist. + /// If a blacklist is provided and it matches then this returns false. + /// If a whitelist is provided and it does not match then this returns false. + /// If either list is null it does not get checked. + /// + public bool CheckBoth([ForbidLiteral] EntProtoId protoId, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null) + { + return CheckBoth(_proto.Index(protoId), blacklist, whitelist); + } + + /// + /// Checks whether a given EntityPrototype is allowed by a whitelist and not blocked by a blacklist. + /// If a blacklist is provided and it matches then this returns false. + /// If a whitelist is provided and it does not match then this returns false. + /// If either list is null it does not get checked. + /// + public bool CheckBoth(EntityPrototype prototype, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null) + { + if (blacklist != null && IsValid(blacklist, prototype)) + return false; + + return whitelist == null || IsValid(whitelist, prototype); + } + + /// + /// Helper function to determine if a whitelist is not null and the EntProtoId is on the list. + /// + public bool IsWhitelistPass(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId) + { + if (whitelist == null) + return false; + + return IsValid(whitelist, protoId); + } + + /// + /// Helper function to determine if a whitelist is not null and the EntityPrototype is on the list. + /// + public bool IsWhitelistPass(EntityWhitelist? whitelist, EntityPrototype prototype) + { + if (whitelist == null) + return false; + + return IsValid(whitelist, prototype); + } + + /// + /// Helper function to determine if a whitelist is not null and the EntProtoId is not on the list. + /// + public bool IsWhitelistFail(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId) + { + if (whitelist == null) + return false; + + return !IsValid(whitelist, protoId); + } + + /// + /// Helper function to determine if a whitelist is not null and the EntityPrototype is not on the list. + /// + public bool IsWhitelistFail(EntityWhitelist? whitelist, EntityPrototype prototype) + { + if (whitelist == null) + return false; + + return !IsValid(whitelist, prototype); + } + + /// + /// Helper function to determine if a whitelist is either null or the EntProtoId is on the list. + /// + public bool IsWhitelistPassOrNull(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId) + { + if (whitelist == null) + return true; + + return IsValid(whitelist, protoId); + } + + /// + /// Helper function to determine if a whitelist is either null or the EntityPrototype is on the list. + /// + public bool IsWhitelistPassOrNull(EntityWhitelist? whitelist, EntityPrototype prototype) + { + if (whitelist == null) + return true; + + return IsValid(whitelist, prototype); + } + + /// + /// Helper function to determine if a whitelist is either null or the EntProtoId is not on the list. + /// + public bool IsWhitelistFailOrNull(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId) + { + if (whitelist == null) + return true; + + return !IsValid(whitelist, protoId); + } + + /// + /// Helper function to determine if a whitelist is either null or the EntityPrototype is not on the list. + /// + public bool IsWhitelistFailOrNull(EntityWhitelist? whitelist, EntityPrototype prototype) + { + if (whitelist == null) + return true; + + return !IsValid(whitelist, prototype); + } +} diff --git a/Content.Shared/Whitelist/EntityWhitelistSystem.cs b/Content.Shared/Whitelist/EntityWhitelistSystem.cs index 85b7d62b83..a9218d5257 100644 --- a/Content.Shared/Whitelist/EntityWhitelistSystem.cs +++ b/Content.Shared/Whitelist/EntityWhitelistSystem.cs @@ -1,37 +1,35 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.Item; using Content.Shared.Tag; -using Robust.Shared.Utility; +using Robust.Shared.Prototypes; namespace Content.Shared.Whitelist; public sealed partial class EntityWhitelistSystem : EntitySystem { + [Dependency] private IPrototypeManager _proto = default!; [Dependency] private TagSystem _tag = default!; + [Dependency] private EntityQuery _itemQuery; - [Dependency] private EntityQuery _itemQuery = default!; + private string _itemComponentName = string.Empty; + private string _tagComponentName = string.Empty; - /// - public bool IsValid(EntityWhitelist list, [NotNullWhen(true)] EntityUid? uid) + public override void Initialize() { - return uid != null && IsValid(list, uid.Value); + base.Initialize(); + + // caching for minor performance improvement + _itemComponentName = Factory.GetComponentName(); + _tagComponentName = Factory.GetComponentName(); } /// - /// Checks whether a given entity is allowed by a whitelist and not blocked by a blacklist. - /// If a blacklist is provided and it matches then this returns false. - /// If a whitelist is provided and it does not match then this returns false. - /// If either list is null it does not get checked. + /// Checks whether a given entity satisfies a whitelist. + /// Returns false if the entity is null. /// - public bool CheckBoth([NotNullWhen(true)] EntityUid? uid, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null) + public bool IsValid(EntityWhitelist list, [NotNullWhen(true)] EntityUid? uid) { - if (uid == null) - return false; - - if (blacklist != null && IsValid(blacklist, uid)) - return false; - - return whitelist == null || IsValid(whitelist, uid); + return uid != null && IsValid(list, uid.Value); } /// @@ -70,13 +68,31 @@ public sealed partial class EntityWhitelistSystem : EntitySystem return list.RequireAll; } + /// The following are a list of "helper functions" that are basically the same as each other /// to help make code that uses EntityWhitelist a bit more readable because at the moment /// it is quite clunky having to write out component.Whitelist == null ? true : _whitelist.IsValid(component.Whitelist, uid) /// several times in a row and makes comparisons easier to read /// - /// Helper function to determine if Whitelist is not null and entity is on list + /// Checks whether a given entity is allowed by a whitelist and not blocked by a blacklist. + /// If a blacklist is provided and it matches then this returns false. + /// If a whitelist is provided and it does not match then this returns false. + /// If either list is null it does not get checked. + /// + public bool CheckBoth([NotNullWhen(true)] EntityUid? uid, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null) + { + if (uid == null) + return false; + + if (blacklist != null && IsValid(blacklist, uid)) + return false; + + return whitelist == null || IsValid(whitelist, uid); + } + + /// + /// Helper function to determine if a whitelist is not null and the entity is on list. /// public bool IsWhitelistPass(EntityWhitelist? whitelist, EntityUid uid) { @@ -87,7 +103,7 @@ public sealed partial class EntityWhitelistSystem : EntitySystem } /// - /// Helper function to determine if Whitelist is not null and entity is not on the list + /// Helper function to determine if a whitelist is not null and the entity is not on the list. /// public bool IsWhitelistFail(EntityWhitelist? whitelist, EntityUid uid) { @@ -98,7 +114,7 @@ public sealed partial class EntityWhitelistSystem : EntitySystem } /// - /// Helper function to determine if Whitelist is either null or the entity is on the list + /// Helper function to determine if a whitelist is either null or the entity is on the list. /// public bool IsWhitelistPassOrNull(EntityWhitelist? whitelist, EntityUid uid) { @@ -109,7 +125,7 @@ public sealed partial class EntityWhitelistSystem : EntitySystem } /// - /// Helper function to determine if Whitelist is either null or the entity is not on the list + /// Helper function to determine if a whitelist is either null or the entity is not on the list. /// public bool IsWhitelistFailOrNull(EntityWhitelist? whitelist, EntityUid uid) { From fc33ab61bf69732281eecd7340440d9a4eaa4fcd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 17 May 2026 08:25:23 +0200 Subject: [PATCH 17/52] Update Credits (#43969) Co-authored-by: PJBot --- 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 92ef688d49..8e2319c912 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0-Anon, 0leshe, 0tito, 0x6273, 11BelowStudio, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, actioninja, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, afflewaffle, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, ahandleman, Ahion, aiden, aidenkrz, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, Androclast, anri, Anzarot121, ApolloVector, Appiah, april-gras, ar4ill, Arcane-Waffle, arcanevaliance, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, arthropodia, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AshBats, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, Ataman, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, Axionyxx, azloserbits, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, baynarikattu, bea, BeatusCrow, bebr3ght, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, BombasterDS, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, buunie099, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Cabin-keeper, Caconym27, Calecute, Callmore, Camdot, cammusubi, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, CDWimmer, Centronias, Chaboricks, chairbender, chaisftw, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, CrazyPhantom779, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DaCookieCakes, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkie, DaturoDewitt, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, debugok, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, dimmoon1, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, 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, EchoOfNothing, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, erorr404v1, Errant-4, ertanic, esguard, estacaoespacialpirata, eternally-confused, eugene, eveloop, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, fillervk, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Fruitsalad, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, gem, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, Glissadia, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, happyrobot33, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonbailey, jacksonzck, JackspajfMain, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap-havok, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, JesterX666, Jewelots, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, johnjjohn, JohnJJohn, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, Kenionatus, kerisargit, keronshb, KeTuFaisPiKiNut, KIBORG04, KieueCaprie, Kimpes, kin98, KingFroozy, kipdotnet, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, kleinerstation13, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, korczoczek, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, kresny, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, Le-Arctic-Fox, leahcat, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, liem161, LightVillet, lilazero, liltenhead, linkbro1, LinkUyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, LukaSlade, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lyxcaster, lzimann, lzk228, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnnusson, magnuscrowe, maland1, malchanceux, MaloTV, manelnavola, ManelNavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, mastermiller01, matt, Matz05, max, MaxNox7, maylokana, mdrkrg, MDuch369, meara1179, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, mikeysaurus, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mohamedwidar, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, MrPersival, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, naxel11, NazrinNya, neborsh, nekokiwa, neomoth, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, Not-A-Chair, not-gavnaed, NotActuallyMarty, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, Nuggets219, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, Ohelig, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, PAFFhassoocks, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, Pharaz4, pheenty, philingham, Phill101, Phonix, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, piskaczek, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, Prole0, ProPandaBear, ProPeperos, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, RainyGale, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, Redrover1760, redspyy, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rewafflution, rhailrake, rhsvenson, riccardi48, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, robinthegirlthing, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, roryflowers, rosieposieeee, Roudenn, router, ruddygreat, rumaks-xyz, RumiTiger, Ruzihm, rwrv, S1rFl0, S1ss3l, Saakra, SabreML, Sadie-silly, saga3152, saintmuntzer, salarua, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, Shegare, shepardtothestars, shibechef, Sidzaru, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, skeeka-dev, skrybl, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SomegnihT, SonarZeBat, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, steel, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Synthestra, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taserthefox, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, theexetron, TheFlyingSentry, thefoty, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, 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, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, TriviaSolari, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, tuchila-adi-bogdan, Tunguso4ka, TurboTrackerss14, TVK-04, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, UpAndLeaves, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, VanderslootAssgiraffe, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, Venomii, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, zekins3366, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex +0-Anon, 0leshe, 0tito, 0x6273, 11BelowStudio, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, actioninja, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, afflewaffle, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, ahandleman, Ahion, aiden, Aidenkrz, aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, Androclast, anri, Anzarot121, ApolloVector, Appiah, april-gras, ar4ill, Arcane-Waffle, arcanevaliance, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, arthropodia, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AshBats, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, Ataman, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, Axionyxx, azloserbits, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, baynarikattu, bea, BeatusCrow, bebr3ght, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, BombasterDS, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, buunie099, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Cabin-keeper, Caconym27, Calecute, Callmore, Camdot, cammusubi, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, CDWimmer, Centronias, Chaboricks, chairbender, chaisftw, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, CrazyPhantom779, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DaCookieCakes, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkie, DaturoDewitt, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, debugok, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, dimmoon1, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, 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, EchoOfNothing, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, erorr404v1, Errant-4, ertanic, esguard, estacaoespacialpirata, eternally-confused, eugene, eveloop, Ewanderer, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, fillervk, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Fruitsalad, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, gem, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, Glissadia, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, happyrobot33, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonbailey, jacksonzck, JackspajfMain, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap-havok, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jewelots, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, JohnJJohn, johnjjohn, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, Kenionatus, kerisargit, keronshb, KeTuFaisPiKiNut, Khaomi, KIBORG04, KieueCaprie, Kimpes, kin98, KingFroozy, kipdotnet, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, kleinerstation13, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, korczoczek, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, kresny, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, Le-Arctic-Fox, leahcat, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, liem161, LightVillet, lilazero, liltenhead, linkbro1, LinkUyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, LukaSlade, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lyxcaster, lzimann, lzk228, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnnusson, magnuscrowe, maland1, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, mastermiller01, matt, Matz05, max, MaxNox7, maylokana, mdrkrg, MDuch369, meara1179, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, mikeysaurus, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mohamedwidar, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, MrPersival, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, naxel11, NazrinNya, neborsh, nekokiwa, neomoth, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, Not-A-Chair, not-gavnaed, NotActuallyMarty, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, Nuggets219, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, Ohelig, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, PAFFhassoocks, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, PGrayCS, pgraycs, Pgriha, phantom-lily, Pharaz4, pheenty, philingham, Phill101, Phonix, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, piskaczek, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, Prole0, ProPandaBear, ProPeperos, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, RainyGale, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, Redrover1760, redspyy, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rewafflution, rhailrake, rhsvenson, riccardi48, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, robinthegirlthing, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, roryflowers, rosieposieeee, Roudenn, router, ruddygreat, rumaks-xyz, RumiTiger, Ruzihm, rwrv, S1rFl0, S1ss3l, Saakra, SabreML, Sadie-silly, saga3152, saintmuntzer, salarua, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, Shegare, shepardtothestars, shibechef, Sidzaru, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, skeeka-dev, skrybl, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SomegnihT, SonarZeBat, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, steel, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Synthestra, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taserthefox, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, theexetron, TheFlyingSentry, thefoty, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, 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, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, TriviaSolari, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, tuchila-adi-bogdan, Tunguso4ka, TurboTrackerss14, TVK-04, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, UpAndLeaves, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, VanderslootAssgiraffe, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, Venomii, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, yuriykiss, YuriyKiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, zekins3366, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex From 863f3019510ea8df327e516a6c4e8c59badf56b0 Mon Sep 17 00:00:00 2001 From: Connor Huffine Date: Sun, 17 May 2026 06:14:54 -0400 Subject: [PATCH 18/52] Make atmos devices respect map serialized enables (#43970) * Add early failout * Create map loading test * docs and test fixes --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Tests/Atmos/AtmosMapLoadSettingsTest.cs | 86 ++++++++ .../Piping/EntitySystems/AtmosDeviceSystem.cs | 6 + .../Atmospherics/load_atmos_test_room.yml | 205 ++++++++++++++++++ 3 files changed, 297 insertions(+) create mode 100644 Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs create mode 100644 Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml diff --git a/Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs b/Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs new file mode 100644 index 0000000000..e1cce573e6 --- /dev/null +++ b/Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs @@ -0,0 +1,86 @@ +using Content.Server.Atmos.Piping.Trinary.Components; +using Content.Shared.Atmos.Components; +using Content.Shared.Atmos.Piping.Binary.Components; +using Robust.Shared.Utility; + +namespace Content.IntegrationTests.Tests.Atmos; + +/// +/// Test for ensuring that atmospherics components deserialize and spawn with settings applied. +/// +[TestFixture] +public sealed class AtmosMapLoadSettingsTest : AtmosTest +{ + // These values correspond to settings in the test map. + private const float PumpSetting = 180f; + private const float MixerMainSetting = 0.1f; + private const float MixerSideSetting = 0.9f; + + /// + /// Test map containing saved atmos components. + /// + protected override ResPath? TestMapPath => new("Maps/Test/Atmospherics/load_atmos_test_room.yml"); + + /// + /// Test to verify that the settings have been properly applied. + /// + [Test] + public async Task TestMapLoading() + { + await Server.WaitAssertion(() => + { + var volumePumpQuery = SEntMan.EntityQueryEnumerator(); + while (volumePumpQuery.MoveNext(out var volumePump)) + { + using (Assert.EnterMultipleScope()) + { + Assert.That(volumePump.Enabled, Is.True, "Volume pump did not load enabled!"); + Assert.That( + volumePump.TransferRate, + Is.EqualTo(PumpSetting), + "Volume pump did not load correct setting!" + ); + } + } + + var pressurePumpQuery = SEntMan.EntityQueryEnumerator(); + while (pressurePumpQuery.MoveNext(out var pressurePump)) + { + using (Assert.EnterMultipleScope()) + { + Assert.That(pressurePump.Enabled, Is.True, "Pressure pump did not load enabled!"); + Assert.That( + pressurePump.TargetPressure, + Is.EqualTo(PumpSetting), + "Pressure pump did not load correct setting!" + ); + } + } + + var mixerQuery = SEntMan.EntityQueryEnumerator(); + while (mixerQuery.MoveNext(out var mixer)) + { + using (Assert.EnterMultipleScope()) + { + Assert.That(mixer.Enabled, Is.True, "Mixer did not load enabled!"); + Assert.That( + mixer.TargetPressure, + Is.EqualTo(PumpSetting), + "Mixer pump did not load correct setting!" + ); + Assert.That( + mixer.InletOneConcentration, + Is.EqualTo(MixerMainSetting), + "Mixer split did not load correct setting!" + ); + Assert.That( + mixer.InletTwoConcentration, + Is.EqualTo(MixerSideSetting), + "Mixer split did not load correct setting!" + ); + } + } + + }); + } +} diff --git a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs index 2cd4b37371..e35072daa1 100644 --- a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs +++ b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs @@ -112,6 +112,12 @@ namespace Content.Server.Atmos.Piping.EntitySystems private void OnDeviceParentChanged(Entity ent, ref EntParentChangedMessage args) { + // Event is raised when a map is loaded in. Since this event mutates comp.Enabled, + // it will overwrite whatever saved value it had + // (so devices saved as enabled will just be disabled). + if (args.OldParent is null) + return; + RejoinAtmosphere(ent); } diff --git a/Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml b/Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml new file mode 100644 index 0000000000..044460731a --- /dev/null +++ b/Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml @@ -0,0 +1,205 @@ +meta: + format: 7 + category: Map + engineVersion: 277.0.0 + forkId: "" + forkVersion: "" + time: 05/17/2026 04:58:27 + entityCount: 22 +maps: +- 1 +grids: +- 2 +orphans: [] +nullspace: [] +tilemap: + 1: Space + 0: Plating +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: Map Entity + - type: Transform + - type: Map + mapPaused: True + - type: GridTree + - type: Broadphase + - type: OccluderTree + - uid: 2 + components: + - type: MetaData + name: grid + - type: Transform + pos: 2.754969,-0.5660831 + parent: 1 + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA== + version: 7 + - type: Broadphase + - type: Physics + bodyStatus: InAir + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: TileHistory + chunkHistory: {} + - type: SpreaderGrid + - type: Shuttle + dampingModifier: 0.25 + - type: ImplicitRoof + - 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: 61152 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + Oxygen: 21.824879 + Nitrogen: 82.10312 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance + - type: ExplosionAirtightGrid +- proto: DebugAPCRecharging + entities: + - uid: 22 + components: + - type: Transform + pos: 2.5,4.5 + parent: 2 + - type: Fixtures + fixtures: {} +- proto: GasMixer + entities: + - uid: 21 + components: + - type: Transform + pos: 3.5,3.5 + parent: 2 + - type: GasMixer + inletTwoConcentration: 0.9 + inletOneConcentration: 0.1 + targetPressure: 180 + enabled: True +- proto: GasPressurePump + entities: + - uid: 19 + components: + - type: Transform + pos: 1.5,3.5 + parent: 2 + - type: GasPressurePump + targetPressure: 180 + enabled: True +- proto: GasVolumePump + entities: + - uid: 20 + components: + - type: Transform + pos: 2.5,3.5 + parent: 2 + - type: GasVolumePump + transferRate: 180 + enabled: True +- proto: WallReinforced + entities: + - uid: 3 + components: + - type: Transform + pos: 0.5,4.5 + parent: 2 + - uid: 4 + components: + - type: Transform + pos: 0.5,3.5 + parent: 2 + - uid: 5 + components: + - type: Transform + pos: 0.5,2.5 + parent: 2 + - uid: 6 + components: + - type: Transform + pos: 0.5,1.5 + parent: 2 + - uid: 7 + components: + - type: Transform + pos: 0.5,0.5 + parent: 2 + - uid: 8 + components: + - type: Transform + pos: 1.5,0.5 + parent: 2 + - uid: 9 + components: + - type: Transform + pos: 2.5,0.5 + parent: 2 + - uid: 10 + components: + - type: Transform + pos: 3.5,0.5 + parent: 2 + - uid: 11 + components: + - type: Transform + pos: 4.5,0.5 + parent: 2 + - uid: 12 + components: + - type: Transform + pos: 4.5,1.5 + parent: 2 + - uid: 13 + components: + - type: Transform + pos: 4.5,2.5 + parent: 2 + - uid: 14 + components: + - type: Transform + pos: 4.5,3.5 + parent: 2 + - uid: 15 + components: + - type: Transform + pos: 4.5,4.5 + parent: 2 + - uid: 16 + components: + - type: Transform + pos: 3.5,4.5 + parent: 2 + - uid: 17 + components: + - type: Transform + pos: 2.5,4.5 + parent: 2 + - uid: 18 + components: + - type: Transform + pos: 1.5,4.5 + parent: 2 +... From 6f8dd94726eeaaaaf4d0289ae870dceaf1409797 Mon Sep 17 00:00:00 2001 From: pathetic meowmeow Date: Sun, 17 May 2026 06:32:51 -0400 Subject: [PATCH 19/52] Add test plan to PR template (#43839) --- .github/PULL_REQUEST_TEMPLATE.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 200a83aff5..5bdccc2cd0 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -9,6 +9,11 @@ ## Technical details +## Test plan + + ## Media @@ -16,6 +21,7 @@ Small fixes/refactors are exempt. Media may be used in SS14 progress reports wit ## Requirements - [ ] I have read and am following the [Pull Request and Changelog Guidelines](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html). +- [ ] I have tested this pull request and written instructions on how to test it - [ ] I have added media to this PR or it does not require an in-game showcase. From 1723a8a169119c124e3ef3852da94fb4ba9302cb Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 17 May 2026 10:33:41 +0000 Subject: [PATCH 20/52] 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 4aa85b61d0..612414c6cf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: Hitlinemoss - changes: - - message: Towels in the trinkets loadout menu are now sorted by hue. - type: Tweak - - message: White towels no longer have a playtime requirement. - type: Tweak - - message: Dark green towels are now actually darker than green towels. - type: Fix - id: 9182 - time: '2025-11-01T16:01:07.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/39831 - author: SlamBamActionman changes: - message: Added new signs, spawners and consoles to Exo, along with some minor @@ -4084,3 +4073,10 @@ id: 9693 time: '2026-05-16T22:29:20.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36701 +- author: Nem + changes: + - message: Atmos devices can now be mapped in an enabled state. + type: Fix + id: 9694 + time: '2026-05-17T10:32:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/43970 From 22a547c7c8aa1f0f6ac5f8c3e9941f2dfc25bd17 Mon Sep 17 00:00:00 2001 From: Eveloop <26272940+eveloop@users.noreply.github.com> Date: Sun, 17 May 2026 18:59:37 +0300 Subject: [PATCH 21/52] Use dependency injection for `EntityQuery`s in `Content.Server` (#43566) * Replace usages of EntityQuery with dependency injected ones in Content.Server * Remove unused EntityQuery dependencies * Restore CheckPressureAndFire override method * Revert EntityQuery refactor changes to DisposalTubeSystem.cs & DisposableSystem.cs * Infer Transform/Metadata directly instead of passing (#43479) * Resolve RA0049, RA0051 errors (#43479) * Resolve RA0049, RA0051 errors (#43479) * Apply suggestions from code review Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Movement/Systems/MobCollisionSystem.cs | 2 - Content.Server/Ame/AmeNodeGroup.cs | 1 - .../Anomaly/AnomalySystem.Generator.cs | 4 +- .../Anomaly/Effects/BluespaceAnomalySystem.cs | 5 +- .../Anomaly/Effects/EntityAnomalySystem.cs | 5 -- .../Anomaly/Effects/InjectionAnomalySystem.cs | 8 +-- .../Effects/ProjectileAnomalySystem.cs | 13 ++-- .../Atmos/EntitySystems/AirtightSystem.cs | 1 - .../EntitySystems/AtmosphereSystem.API.cs | 35 +++++------ .../AtmosphereSystem.Commands.cs | 4 +- .../AtmosphereSystem.HighPressureDelta.cs | 13 ++-- .../AtmosphereSystem.Processing.cs | 7 +-- .../Atmos/EntitySystems/AtmosphereSystem.cs | 14 ++--- .../Atmos/EntitySystems/FlammableSystem.cs | 7 +-- .../EntitySystems/GasTileOverlaySystem.cs | 13 ++-- .../PipeRestrictOverlapSystem.cs | 5 +- .../Atmos/Monitor/Systems/AirAlarmSystem.cs | 4 +- .../Atmos/Monitor/Systems/FireAlarmSystem.cs | 4 +- .../Body/Systems/InternalsSystem.cs | 5 -- .../Cargo/Systems/CargoSystem.Bounty.cs | 19 +++--- .../Cargo/Systems/CargoSystem.Orders.cs | 2 +- .../Cargo/Systems/CargoSystem.TradeStation.cs | 14 ++--- Content.Server/Cargo/Systems/CargoSystem.cs | 13 +--- Content.Server/Chat/SuicideSystem.cs | 4 +- Content.Server/Chat/Systems/ChatSystem.cs | 10 ++- .../TileReactions/CleanTileReaction.cs | 4 +- Content.Server/Chunking/ChunkingSystem.cs | 7 +-- .../Systems/PowerSensorSystem.cs | 9 +-- .../DeviceNetwork/Systems/DeviceListSystem.cs | 12 ++-- .../Systems/NetworkConfiguratorSystem.cs | 7 +-- .../Doors/Systems/FirelockSystem.cs | 37 +++++------ Content.Server/Dragon/DragonSystem.cs | 9 +-- .../EntitySystems/ExplosionSystem.GridMap.cs | 7 +-- .../ExplosionSystem.Processing.cs | 13 ---- .../EntitySystems/ExplosionSystem.cs | 24 +++---- .../Fluids/EntitySystems/PuddleSystem.cs | 17 ++--- .../Fluids/EntitySystems/SmokeSystem.cs | 12 +--- .../Fluids/EntitySystems/SpraySystem.cs | 7 +-- .../GameTicking/GameTicker.Spawning.cs | 7 +-- .../GameTicking/Rules/ZombieRuleSystem.cs | 4 +- Content.Server/Ghost/GhostSystem.cs | 7 +-- Content.Server/Ghost/Roles/GhostRoleSystem.cs | 6 +- Content.Server/Hands/Systems/HandsSystem.cs | 5 +- .../Instruments/InstrumentSystem.cs | 29 ++++----- .../EntitySystems/LightReplacerSystem.cs | 5 +- .../Light/EntitySystems/RoofSystem.cs | 6 +- .../Movement/Systems/MobCollisionSystem.cs | 5 +- .../Movement/Systems/PullController.cs | 24 +++---- .../NPC/Pathfinding/PathfindingSystem.Grid.cs | 10 +-- .../NPC/Pathfinding/PathfindingSystem.cs | 24 +++---- .../NPC/Systems/NPCCombatSystem.Melee.cs | 16 ++--- .../NPC/Systems/NPCCombatSystem.Ranged.cs | 16 ++--- Content.Server/NPC/Systems/NPCJukeSystem.cs | 14 +---- .../Systems/NPCSteeringSystem.Obstacles.cs | 22 +++---- .../NPC/Systems/NPCSteeringSystem.cs | 15 ++--- .../NPC/Systems/NPCUtilitySystem.cs | 15 +---- .../EntitySystems/NodeContainerSystem.cs | 10 ++- .../EntitySystems/NodeGroupSystem.cs | 15 +++-- .../Systems/HijackShuttleConditionSystem.cs | 10 +-- .../Systems/StealConditionSystem.cs | 5 +- Content.Server/Parallax/BiomeSystem.cs | 20 ++---- .../ParticleAcceleratorSystem.Emitter.cs | 7 +-- .../Physics/Controllers/MoverController.cs | 12 ++-- Content.Server/Pinpointer/NavMapSystem.cs | 13 ++-- Content.Server/Pinpointer/PinpointerSystem.cs | 13 ++-- .../Pointing/EntitySystems/PointingSystem.cs | 4 +- .../EntitySystems/ExtensionCableSystem.cs | 10 ++- .../Power/EntitySystems/PowerNetSystem.cs | 20 +++--- .../EntitySystems/PowerReceiverSystem.cs | 11 ++-- .../Power/Generation/Teg/TegSystem.cs | 5 +- Content.Server/Procedural/DungeonSystem.cs | 4 -- .../Radiation/Systems/RadiationSystem.cs | 1 + .../Radio/EntitySystems/RadioSystem.cs | 5 +- .../EntitySystems/RevenantSystem.Abilities.cs | 34 +++++----- .../Revenant/EntitySystems/RevenantSystem.cs | 1 - .../Salvage/SalvageSystem.Magnet.cs | 16 ++--- Content.Server/Salvage/SalvageSystem.cs | 7 +-- .../SensorMonitoringConsoleSystem.cs | 5 +- .../Shuttles/Systems/ArrivalsSystem.cs | 10 +-- .../Shuttles/Systems/DockingSystem.Shuttle.cs | 23 +++---- .../Shuttles/Systems/DockingSystem.cs | 45 ++++++-------- .../Systems/ShuttleConsoleSystem.FTL.cs | 11 ++-- .../Shuttles/Systems/ShuttleConsoleSystem.cs | 15 ++--- .../Systems/ShuttleSystem.FasterThanLight.cs | 62 +++++++++---------- .../Systems/ShuttleSystem.GridFill.cs | 10 ++- .../Shuttles/Systems/ShuttleSystem.Impact.cs | 17 ++--- .../Shuttles/Systems/ShuttleSystem.cs | 12 +--- .../Shuttles/Systems/SpaceGarbageSystem.cs | 7 +-- .../Shuttles/Systems/ThrusterSystem.cs | 36 +++++------ .../Silicons/StationAi/StationAiSystem.cs | 5 +- .../ContainmentFieldGeneratorSystem.cs | 11 ++-- .../EntitySystems/EventHorizonSystem.cs | 5 +- .../EntitySystems/GravityWellSystem.cs | 14 ++--- .../SingularityGeneratorSystem.cs | 4 +- .../Speech/EntitySystems/ListeningSystem.cs | 7 +-- Content.Server/Spreader/KudzuSystem.cs | 17 ++--- Content.Server/Spreader/SpreaderSystem.cs | 43 +++++++------ .../Station/Systems/StationSystem.cs | 13 ++-- .../StationEvents/Events/GreytideVirusRule.cs | 10 +-- .../SurveillanceCameraMicrophoneSystem.cs | 7 +-- .../SurveillanceCameraSpeakerSystem.cs | 1 + .../Systems/TemperatureSystem.Damage.cs | 10 +-- Content.Server/Tiles/RequiresTileSystem.cs | 5 +- .../Artifact/XAE/XAEIgniteSystem.cs | 11 +--- .../Artifact/XAE/XAELightFlickerSystem.cs | 13 +--- .../XAE/XAEThrowThingsAroundSystem.cs | 11 +--- .../Parallax/Biomes/BiomeComponent.cs | 3 - 107 files changed, 451 insertions(+), 822 deletions(-) diff --git a/Content.Client/Movement/Systems/MobCollisionSystem.cs b/Content.Client/Movement/Systems/MobCollisionSystem.cs index 476150acb1..948f93b658 100644 --- a/Content.Client/Movement/Systems/MobCollisionSystem.cs +++ b/Content.Client/Movement/Systems/MobCollisionSystem.cs @@ -1,9 +1,7 @@ using System.Numerics; using Content.Shared.CCVar; -using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Robust.Client.Player; -using Robust.Shared.Physics.Components; using Robust.Shared.Timing; namespace Content.Client.Movement.Systems; diff --git a/Content.Server/Ame/AmeNodeGroup.cs b/Content.Server/Ame/AmeNodeGroup.cs index bef5cf5611..3cb83056cc 100644 --- a/Content.Server/Ame/AmeNodeGroup.cs +++ b/Content.Server/Ame/AmeNodeGroup.cs @@ -4,7 +4,6 @@ using Content.Server.Ame.EntitySystems; using Content.Server.Chat.Managers; using Content.Server.Explosion.EntitySystems; using Content.Server.NodeContainer.NodeGroups; -using Content.Server.NodeContainer.Nodes; using Content.Shared.NodeContainer; using Content.Shared.NodeContainer.NodeGroups; using Robust.Server.GameObjects; diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs index d1545adc32..e8788f57a4 100644 --- a/Content.Server/Anomaly/AnomalySystem.Generator.cs +++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs @@ -22,6 +22,7 @@ public sealed partial class AnomalySystem { [Dependency] private SharedMapSystem _mapSystem = default!; [Dependency] private SharedTransformSystem _transform = default!; + [Dependency] private EntityQuery _physicsQuery = default!; private void InitializeGenerator() { @@ -106,13 +107,12 @@ public sealed partial class AnomalySystem } // don't spawn inside of solid objects - var physQuery = GetEntityQuery(); var valid = true; // TODO: This should be using static lookup. foreach (var ent in _mapSystem.GetAnchoredEntities(grid, gridComp, tile)) { - if (!physQuery.TryGetComponent(ent, out var body)) + if (!_physicsQuery.TryGetComponent(ent, out var body)) continue; if (body.BodyType != BodyType.Static || !body.Hard || diff --git a/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs b/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs index a16a674047..4681ed75e8 100644 --- a/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs @@ -30,8 +30,7 @@ public sealed partial class BluespaceAnomalySystem : EntitySystem private void OnPulse(EntityUid uid, BluespaceAnomalyComponent component, ref AnomalyPulseEvent args) { - var xformQuery = GetEntityQuery(); - var xform = xformQuery.GetComponent(uid); + var xform = Transform(uid); var range = component.MaxShuffleRadius * args.Severity * args.PowerModifier; // get a list of all entities in range with the MobStateComponent // we filter out those inside a container @@ -42,7 +41,7 @@ public sealed partial class BluespaceAnomalySystem : EntitySystem var coords = new ValueList(); foreach (var ent in allEnts) { - if (xformQuery.TryGetComponent(ent, out var allXform)) + if (TryComp(ent, out TransformComponent? allXform)) coords.Add(_xform.GetWorldPosition(allXform)); } diff --git a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs index 3e62ba8359..018af0fb50 100644 --- a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs @@ -3,7 +3,6 @@ using Content.Shared.Anomaly.Components; using Content.Shared.Anomaly.Effects; using Content.Shared.Anomaly.Effects.Components; using Robust.Shared.Map.Components; -using Robust.Shared.Physics.Components; using Robust.Shared.Random; namespace Content.Server.Anomaly.Effects; @@ -14,13 +13,9 @@ public sealed partial class EntityAnomalySystem : SharedEntityAnomalySystem [Dependency] private IRobustRandom _random = default!; [Dependency] private SharedMapSystem _mapSystem = default!; - private EntityQuery _physicsQuery; - /// public override void Initialize() { - _physicsQuery = GetEntityQuery(); - SubscribeLocalEvent(OnPulse); SubscribeLocalEvent(OnSupercritical); SubscribeLocalEvent(OnStabilityChanged); diff --git a/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs b/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs index 7c6e934e2b..4e58b3800e 100644 --- a/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs @@ -18,15 +18,12 @@ public sealed partial class InjectionAnomalySystem : EntitySystem [Dependency] private EntityLookupSystem _lookup = default!; [Dependency] private SharedSolutionContainerSystem _solutionContainer = default!; [Dependency] private TransformSystem _transform = default!; - - private EntityQuery _injectableQuery; + [Dependency] private EntityQuery _injectableQuery = default!; public override void Initialize() { SubscribeLocalEvent(OnPulse); SubscribeLocalEvent(OnSupercritical, before: new[] { typeof(SharedSolutionContainerSystem) }); - - _injectableQuery = GetEntityQuery(); } private void OnPulse(Entity entity, ref AnomalyPulseEvent args) @@ -45,8 +42,7 @@ public sealed partial class InjectionAnomalySystem : EntitySystem return; //We get all the entity in the radius into which the reagent will be injected. - var xformQuery = GetEntityQuery(); - var xform = xformQuery.GetComponent(entity); + var xform = Transform(entity); var allEnts = _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(entity, xform: xform), injectRadius) .Select(x => x.Owner).ToList(); diff --git a/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs b/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs index 5d8aa1d8c3..9117bf262d 100644 --- a/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs @@ -21,9 +21,7 @@ public sealed partial class ProjectileAnomalySystem : EntitySystem [Dependency] private IMapManager _mapManager = default!; [Dependency] private GunSystem _gunSystem = default!; [Dependency] private SharedMapSystem _map = default!; - - private EntityQuery _xFormQuery; - private EntityQuery _mobQuery; + [Dependency] private EntityQuery _mobStateQuery = default!; /// Pre-allocated collection for calculating entities in range. private readonly HashSet _inRange = new(); @@ -32,9 +30,6 @@ public sealed partial class ProjectileAnomalySystem : EntitySystem { SubscribeLocalEvent(OnPulse); SubscribeLocalEvent(OnSupercritical); - - _xFormQuery = GetEntityQuery(); - _mobQuery = GetEntityQuery(); } private void OnPulse(EntityUid uid, ProjectileAnomalyComponent component, ref AnomalyPulseEvent args) @@ -51,7 +46,7 @@ public sealed partial class ProjectileAnomalySystem : EntitySystem { var projectileCount = (int)MathF.Round(MathHelper.Lerp(component.MinProjectiles, component.MaxProjectiles, severity)); - var xform = _xFormQuery.GetComponent(uid); + var xform = Transform(uid); _inRange.Clear(); _lookup.GetEntitiesInRange(uid, component.ProjectileRange * severity, _inRange, LookupFlags.Dynamic); @@ -62,7 +57,7 @@ public sealed partial class ProjectileAnomalySystem : EntitySystem var priority = new List(); foreach (var entity in _inRange) { - if (_mobQuery.HasComponent(entity)) + if (_mobStateQuery.HasComponent(entity)) priority.Add(entity); } @@ -74,7 +69,7 @@ public sealed partial class ProjectileAnomalySystem : EntitySystem ? _random.PickAndTake(priority) : _random.Pick(_inRange); - var targetXForm= _xFormQuery.GetComponent(target); + var targetXForm = Transform(target); var targetCoords = targetXForm.Coordinates.Offset(_random.NextVector2(0.5f)); ShootProjectile( diff --git a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs index 0f1ca21d0c..37e98fd902 100644 --- a/Content.Server/Atmos/EntitySystems/AirtightSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AirtightSystem.cs @@ -126,7 +126,6 @@ namespace Content.Server.Atmos.EntitySystems public void InvalidatePosition(Entity grid, Vector2i pos) { - var query = GetEntityQuery(); _explosionSystem.UpdateAirtightMap(grid, pos, grid); _atmosphereSystem.InvalidateTile(grid.Owner, pos); } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs index 7bb2c0c89c..27e9f33653 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs @@ -7,7 +7,6 @@ using Content.Shared.Atmos.EntitySystems; using Content.Shared.Atmos.Reactions; using JetBrains.Annotations; using Robust.Shared.Map.Components; -using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.Server.Atmos.EntitySystems; @@ -29,7 +28,7 @@ public partial class AtmosphereSystem [PublicAPI] public bool HasAtmosphere(EntityUid gridUid) { - return _atmosQuery.HasComponent(gridUid); + return _gridAtmosQuery.HasComponent(gridUid); } /// @@ -95,7 +94,7 @@ public partial class AtmosphereSystem [PublicAPI] public void InvalidateTile(Entity entity, Vector2i tile) { - if (_atmosQuery.Resolve(entity.Owner, ref entity.Comp, false)) + if (_gridAtmosQuery.Resolve(entity.Owner, ref entity.Comp, false)) entity.Comp.InvalidatedCoords.Add(tile); } @@ -181,7 +180,7 @@ public partial class AtmosphereSystem var handled = false; // If we've been passed a grid, try to let it handle it. - if (grid is { } gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp1)) + if (grid is { } gridEnt && _gridAtmosQuery.Resolve(gridEnt, ref gridEnt.Comp1)) { if (excite) Resolve(gridEnt, ref gridEnt.Comp2); @@ -244,7 +243,7 @@ public partial class AtmosphereSystem { // If we've been passed a grid, try to let it handle it. if (grid is { } gridEnt - && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp1, false) + && _gridAtmosQuery.Resolve(gridEnt, ref gridEnt.Comp1, false) && gridEnt.Comp1.Tiles.TryGetValue(gridTile, out var tile)) { if (excite) @@ -440,7 +439,7 @@ public partial class AtmosphereSystem Vector2i tile, AtmosDirection directions = AtmosDirection.All) { - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return false; if (!grid.Comp.Tiles.TryGetValue(tile, out var atmosTile)) @@ -463,7 +462,7 @@ public partial class AtmosphereSystem [PublicAPI] public AtmosDirection GetAirflowDirections(Entity grid, Vector2i tile) { - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return AtmosDirection.Invalid; if (!grid.Comp.Tiles.TryGetValue(tile, out var atmosTile)) @@ -486,7 +485,7 @@ public partial class AtmosphereSystem [PublicAPI] public bool IsTileSpace(Entity? grid, Entity? map, Vector2i tile) { - if (grid is { } gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp, false) + if (grid is { } gridEnt && _gridAtmosQuery.Resolve(gridEnt, ref gridEnt.Comp, false) && gridEnt.Comp.Tiles.TryGetValue(tile, out var tileAtmos)) { return tileAtmos.Space; @@ -541,7 +540,7 @@ public partial class AtmosphereSystem public TileMixtureEnumerator GetAdjacentTileMixtures(Entity grid, Vector2i tile, bool includeBlocked = false, bool excite = false) { // TODO ATMOS includeBlocked and excite parameters are unhandled currently. - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return TileMixtureEnumerator.Empty; return !grid.Comp.Tiles.TryGetValue(tile, out var atmosTile) @@ -572,7 +571,7 @@ public partial class AtmosphereSystem EntityUid? sparkSourceUid = null, bool soh = false) { - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return; if (grid.Comp.Tiles.TryGetValue(tile, out var atmosTile)) @@ -600,7 +599,7 @@ public partial class AtmosphereSystem EntityUid? sparkSourceUid = null, bool soh = false) { - if (!_atmosQuery.TryGetComponent(tile.GridIndex, out var atmos)) + if (!_gridAtmosQuery.TryGetComponent(tile.GridIndex, out var atmos)) return; DebugTools.Assert(atmos.Tiles.TryGetValue(tile.GridIndices, out var tmp) && tmp == tile); @@ -644,7 +643,7 @@ public partial class AtmosphereSystem [PublicAPI] public bool AddPipeNet(Entity grid, PipeNet pipeNet) { - return _atmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Add(pipeNet); + return _gridAtmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Add(pipeNet); } /// @@ -664,7 +663,7 @@ public partial class AtmosphereSystem RaiseLocalEvent(ref ev); } - return _atmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Remove(pipeNet); + return _gridAtmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Remove(pipeNet); } /// @@ -679,7 +678,7 @@ public partial class AtmosphereSystem DebugTools.Assert(device.Comp.JoinedGrid == null); DebugTools.Assert(Transform(device).GridUid == grid); - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return false; if (!grid.Comp.AtmosDevices.Add(device)) @@ -699,7 +698,7 @@ public partial class AtmosphereSystem { DebugTools.Assert(device.Comp.JoinedGrid == grid); - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return false; if (!grid.Comp.AtmosDevices.Remove(device)) @@ -732,7 +731,7 @@ public partial class AtmosphereSystem // Entity should be on the grid it's being added to. Debug.Assert(xform.GridUid == grid.Owner); - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return false; if (grid.Comp.DeltaPressureEntityLookup.ContainsKey(ent.Owner)) @@ -759,7 +758,7 @@ public partial class AtmosphereSystem [PublicAPI] public bool TryRemoveDeltaPressureEntity(Entity grid, Entity ent) { - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return false; if (!grid.Comp.DeltaPressureEntityLookup.TryGetValue(ent.Owner, out var index)) @@ -797,7 +796,7 @@ public partial class AtmosphereSystem public bool IsDeltaPressureEntityInList(Entity grid, Entity ent) { // Dict and list must be in sync - deep-fried if we aren't. - if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) + if (!_gridAtmosQuery.Resolve(grid, ref grid.Comp, false)) return false; var contains = grid.Comp.DeltaPressureEntityLookup.ContainsKey(ent.Owner); diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs index 154673a980..abe382d733 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Commands.cs @@ -13,6 +13,7 @@ namespace Content.Server.Atmos.EntitySystems; public sealed partial class AtmosphereSystem { [Dependency] private IConsoleHost _consoleHost = default!; + [Dependency] private EntityQuery _atmosFixMarkerQuery = default!; private void InitializeCommands() { @@ -113,7 +114,6 @@ public sealed partial class AtmosphereSystem RebuildGridTiles(grid); - var query = GetEntityQuery(); foreach (var (indices, tile) in ent.Comp1.Tiles.ToArray()) { if (tile.Air is not {Immutable: false} air) @@ -124,7 +124,7 @@ public sealed partial class AtmosphereSystem var enumerator = _mapSystem.GetAnchoredEntitiesEnumerator(grid, grid, indices); while (enumerator.MoveNext(out var entUid)) { - if (query.TryComp(entUid, out var marker)) + if (_atmosFixMarkerQuery.TryComp(entUid, out var marker)) mixtureId = marker.Mode; } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index 0c37bcefaf..7049f3e1d4 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -14,6 +14,9 @@ namespace Content.Server.Atmos.EntitySystems { public sealed partial class AtmosphereSystem { + [Dependency] private EntityQuery _physicsQuery = default!; + [Dependency] private EntityQuery _movedByPressureQuery = default!; + private static readonly ProtoId DefaultSpaceWindSounds = "SpaceWind"; private const int SpaceWindSoundCooldownCycles = 75; @@ -100,7 +103,7 @@ namespace Content.Server.Atmos.EntitySystems _activePressures.Add((uid, component)); } - private void HighPressureMovements(Entity gridAtmosphere, TileAtmosphere tile, EntityQuery bodies, EntityQuery xforms, EntityQuery pressureQuery, EntityQuery metas) + private void HighPressureMovements(Entity gridAtmosphere, TileAtmosphere tile) { // TODO ATMOS finish this @@ -156,12 +159,12 @@ namespace Content.Server.Atmos.EntitySystems { // Ideally containers would have their own EntityQuery internally or something given recursively it may need to slam GetComp anyway. // Also, don't care about static bodies (but also due to collisionwakestate can't query dynamic directly atm). - if (!bodies.TryGetComponent(entity, out var body) || - !pressureQuery.TryGetComponent(entity, out var pressure) || + if (!_physicsQuery.TryGetComponent(entity, out var body) || + !_movedByPressureQuery.TryGetComponent(entity, out var pressure) || !pressure.Enabled) continue; - if (_containers.IsEntityInContainer(entity, metas.GetComponent(entity))) continue; + if (_containers.IsEntityInContainer(entity)) continue; var pressureMovements = EnsureComp(entity); if (pressure.LastHighPressureMovementAirCycle < gridAtmosphere.Comp.UpdateCounter) @@ -174,7 +177,7 @@ namespace Content.Server.Atmos.EntitySystems tile.PressureDirection, 0, tile.PressureSpecificTarget != null ? _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.PressureSpecificTarget.GridIndices) : EntityCoordinates.Invalid, gridWorldRotation, - xforms.GetComponent(entity), + Transform(entity), body); } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs index 698d654609..7227d642f8 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Processing.cs @@ -395,14 +395,9 @@ namespace Content.Server.Atmos.EntitySystems // Note: This is still processed even if space wind is turned off since this handles playing the sounds. var number = 0; - var bodies = GetEntityQuery(); - var xforms = GetEntityQuery(); - var metas = GetEntityQuery(); - var pressureQuery = GetEntityQuery(); - while (atmosphere.CurrentRunTiles.TryDequeue(out var tile)) { - HighPressureMovements(ent, tile, bodies, xforms, pressureQuery, metas); + HighPressureMovements(ent, tile); tile.PressureDifference = 0f; tile.LastPressureDirection = tile.PressureDirection; tile.PressureDirection = AtmosDirection.Invalid; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index 356dc99647..f7eb65c88d 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -42,13 +42,14 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem [Dependency] public PuddleSystem Puddle = default!; [Dependency] private DamageableSystem _damage = default!; + [Dependency] private EntityQuery _gridAtmosQuery = default!; + [Dependency] private EntityQuery _mapAtmosQuery = default!; + [Dependency] private EntityQuery _airtightQuery = default!; + [Dependency] private EntityQuery _firelockQuery = default!; + private const float ExposedUpdateDelay = 1f; private float _exposedTimer = 0f; - private EntityQuery _atmosQuery; - private EntityQuery _mapAtmosQuery; - private EntityQuery _airtightQuery; - private EntityQuery _firelockQuery; private HashSet _entSet = new(); private string[] _burntDecals = []; @@ -65,11 +66,6 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem InitializeGridAtmosphere(); InitializeMap(); - _atmosQuery = GetEntityQuery(); - _mapAtmosQuery = GetEntityQuery(); - _airtightQuery = GetEntityQuery(); - _firelockQuery = GetEntityQuery(); - SubscribeLocalEvent(OnTileChanged); SubscribeLocalEvent(OnPrototypesReloaded); diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index f729c81fd9..bb282bf25d 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -51,8 +51,8 @@ namespace Content.Server.Atmos.EntitySystems [Dependency] private IRobustRandom _random = default!; [Dependency] private IGameTiming _timing = default!; - private EntityQuery _inventoryQuery; - private EntityQuery _physicsQuery; + [Dependency] private EntityQuery _inventoryQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; private static readonly TimeSpan UpdateTime = TimeSpan.FromSeconds(1); @@ -62,9 +62,6 @@ namespace Content.Server.Atmos.EntitySystems { UpdatesAfter.Add(typeof(AtmosphereSystem)); - _inventoryQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnCollide); diff --git a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs index 4aca1696d5..f57b59614d 100644 --- a/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -1,4 +1,3 @@ -using Content.Server.Atmos.Components; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Atmos.EntitySystems; @@ -33,6 +32,9 @@ namespace Content.Server.Atmos.EntitySystems [Robust.Shared.IoC.Dependency] private AtmosphereSystem _atmosphereSystem = default!; [Robust.Shared.IoC.Dependency] private ChunkingSystem _chunkingSys = default!; + [Robust.Shared.IoC.Dependency] private EntityQuery _mapGridQuery = default!; + [Robust.Shared.IoC.Dependency] private EntityQuery _gasTileOverlayQuery = default!; + /// /// Per-tick cache of sessions. /// @@ -57,16 +59,11 @@ namespace Content.Server.Atmos.EntitySystems private float _updateInterval; private int _thresholds; - private EntityQuery _gridQuery; - private EntityQuery _query; public override void Initialize() { base.Initialize(); - _query = GetEntityQuery(); - _gridQuery = GetEntityQuery(); - _updateJob = new UpdatePlayerJob() { EntManager = EntityManager, @@ -77,7 +74,7 @@ namespace Content.Server.Atmos.EntitySystems MapManager = _mapManager, ChunkViewerPool = _chunkViewerPool, LastSentChunks = _lastSentChunks, - GridQuery = _gridQuery, + GridQuery = _mapGridQuery, }; _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; @@ -136,7 +133,7 @@ namespace Content.Server.Atmos.EntitySystems [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Invalidate(Entity grid, Vector2i index) { - if (_query.Resolve(grid.Owner, ref grid.Comp)) + if (_gasTileOverlayQuery.Resolve(grid.Owner, ref grid.Comp)) grid.Comp.InvalidTiles.Add(index); } diff --git a/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs b/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs index 0edea35c7c..48b9d8c032 100644 --- a/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs +++ b/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs @@ -1,6 +1,5 @@ using System.Linq; using Content.Server.Atmos.Components; -using Content.Server.NodeContainer; using Content.Server.NodeContainer.Nodes; using Content.Server.Popups; using Content.Shared.Atmos; @@ -21,17 +20,15 @@ public sealed partial class PipeRestrictOverlapSystem : EntitySystem [Dependency] private MapSystem _map = default!; [Dependency] private PopupSystem _popup = default!; [Dependency] private TransformSystem _xform = default!; + [Dependency] private EntityQuery _nodeContainerQuery = default!; private readonly List _anchoredEntities = new(); - private EntityQuery _nodeContainerQuery; /// public override void Initialize() { SubscribeLocalEvent(OnAnchorStateChanged); SubscribeLocalEvent(OnAnchorAttempt); - - _nodeContainerQuery = GetEntityQuery(); } private void OnAnchorStateChanged(Entity ent, ref AnchorStateChangedEvent args) diff --git a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs index a4af7fd76f..830f6a6262 100644 --- a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs @@ -45,6 +45,7 @@ public sealed partial class AirAlarmSystem : EntitySystem [Dependency] private DeviceListSystem _deviceList = default!; [Dependency] private PopupSystem _popup = default!; [Dependency] private UserInterfaceSystem _ui = default!; + [Dependency] private EntityQuery _deviceNetworkQuery = default!; #region Device Network API @@ -193,10 +194,9 @@ public sealed partial class AirAlarmSystem : EntitySystem private void OnDeviceListUpdate(EntityUid uid, AirAlarmComponent component, DeviceListUpdateEvent args) { - var query = GetEntityQuery(); foreach (var device in args.OldDevices) { - if (!query.TryGetComponent(device, out var deviceNet)) + if (!_deviceNetworkQuery.TryGetComponent(device, out var deviceNet)) { continue; } diff --git a/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs index a8e3848463..12433ef98f 100644 --- a/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/FireAlarmSystem.cs @@ -19,6 +19,7 @@ public sealed partial class FireAlarmSystem : EntitySystem [Dependency] private SharedInteractionSystem _interactionSystem = default!; [Dependency] private AccessReaderSystem _access = default!; [Dependency] private IConfigurationManager _configManager = default!; + [Dependency] private EntityQuery _deviceNetworkQuery = default!; public override void Initialize() { @@ -29,10 +30,9 @@ public sealed partial class FireAlarmSystem : EntitySystem private void OnDeviceListSync(EntityUid uid, FireAlarmComponent component, DeviceListUpdateEvent args) { - var query = GetEntityQuery(); foreach (var device in args.OldDevices) { - if (!query.TryGetComponent(device, out var deviceNet)) + if (!_deviceNetworkQuery.TryGetComponent(device, out var deviceNet)) { continue; } diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs index ef70db9a38..b403923c89 100644 --- a/Content.Server/Body/Systems/InternalsSystem.cs +++ b/Content.Server/Body/Systems/InternalsSystem.cs @@ -14,14 +14,9 @@ public sealed partial class InternalsSystem : SharedInternalsSystem [Dependency] private GasTankSystem _gasTank = default!; [Dependency] private RespiratorSystem _respirator = default!; - private EntityQuery _internalsQuery; - public override void Initialize() { base.Initialize(); - - _internalsQuery = GetEntityQuery(); - SubscribeLocalEvent(OnInhaleLocation); SubscribeLocalEvent(OnStartingGear); } diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs index 4feb2afcc7..cd5b4f626e 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs @@ -17,7 +17,6 @@ using Robust.Server.Containers; using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Robust.Shared.Timing; using Robust.Shared.Utility; namespace Content.Server.Cargo.Systems; @@ -28,11 +27,11 @@ public sealed partial class CargoSystem [Dependency] private NameIdentifierSystem _nameIdentifier = default!; [Dependency] private EntityWhitelistSystem _whitelistSys = default!; - private static readonly ProtoId BountyNameIdentifierGroup = "Bounty"; + [Dependency] private EntityQuery _stackQuery = default!; + [Dependency] private EntityQuery _containerManagerQuery = default!; + [Dependency] private EntityQuery _cargoBountyLabelQuery = default!; - private EntityQuery _stackQuery; - private EntityQuery _containerQuery; - private EntityQuery _bountyLabelQuery; + private static readonly ProtoId BountyNameIdentifierGroup = "Bounty"; private void InitializeBounty() { @@ -42,10 +41,6 @@ public sealed partial class CargoSystem SubscribeLocalEvent(OnGetBountyPrice); SubscribeLocalEvent(OnSold); SubscribeLocalEvent(OnMapInit); - - _stackQuery = GetEntityQuery(); - _containerQuery = GetEntityQuery(); - _bountyLabelQuery = GetEntityQuery(); } private void OnBountyConsoleOpened(EntityUid uid, CargoBountyConsoleComponent component, BoundUIOpenedEvent args) @@ -196,7 +191,7 @@ public sealed partial class CargoSystem { labelEnt = null; labelComp = null; - if (!_containerQuery.TryGetComponent(uid, out var containerMan)) + if (!_containerManagerQuery.TryGetComponent(uid, out var containerMan)) return false; // make sure this label was actually applied to a crate. @@ -204,7 +199,7 @@ public sealed partial class CargoSystem return false; if (container.ContainedEntities.FirstOrNull() is not { } label || - !_bountyLabelQuery.TryGetComponent(label, out var component)) + !_cargoBountyLabelQuery.TryGetComponent(label, out var component)) return false; labelEnt = label; @@ -377,7 +372,7 @@ public sealed partial class CargoSystem { foreach (var ent in container.ContainedEntities) { - if (_bountyLabelQuery.HasComponent(ent)) + if (_cargoBountyLabelQuery.HasComponent(ent)) continue; var children = GetBountyEntities(ent); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index c6d9af1d8f..a362ce4af9 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -297,7 +297,7 @@ namespace Content.Server.Cargo.Systems { foreach (var gridUid in data.Grids) { - if (!_tradeQuery.HasComponent(gridUid)) + if (!_tradeStationQuery.HasComponent(gridUid)) continue; ents.Add(gridUid); diff --git a/Content.Server/Cargo/Systems/CargoSystem.TradeStation.cs b/Content.Server/Cargo/Systems/CargoSystem.TradeStation.cs index ffb39d4dd6..766f32f957 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.TradeStation.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.TradeStation.cs @@ -6,7 +6,6 @@ using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Events; using Content.Shared.Cargo.Prototypes; using Content.Shared.CCVar; -using Content.Shared.HijackBeacon; using Robust.Shared.Audio; using Robust.Shared.Prototypes; @@ -169,13 +168,13 @@ public sealed partial class CargoSystem // - anything anchored (e.g. light fixtures) // - anything blacklisted (e.g. players). if (toSell.Contains(ent) || - _xformQuery.TryGetComponent(ent, out var xform) && - (xform.Anchored || !CanSell(ent, xform))) + TryComp(ent, out TransformComponent? xform) && + (xform.Anchored || !CanSell(ent))) { continue; } - if (_blacklistQuery.HasComponent(ent)) + if (_cargoSellBlacklistQuery.HasComponent(ent)) continue; var price = _pricing.GetPrice(ent); @@ -187,9 +186,9 @@ public sealed partial class CargoSystem } } - private bool CanSell(EntityUid uid, TransformComponent xform) + private bool CanSell(EntityUid uid) { - if (_mobQuery.HasComponent(uid)) + if (_mobStateQuery.HasComponent(uid)) { return false; } @@ -197,13 +196,14 @@ public sealed partial class CargoSystem var complete = IsBountyComplete(uid, out var bountyEntities); // Recursively check for mobs at any point. + var xform = Transform(uid); var children = xform.ChildEnumerator; while (children.MoveNext(out var child)) { if (complete && bountyEntities.Contains(child)) continue; - if (!CanSell(child, _xformQuery.GetComponent(child))) + if (!CanSell(child)) return false; } diff --git a/Content.Server/Cargo/Systems/CargoSystem.cs b/Content.Server/Cargo/Systems/CargoSystem.cs index cdf8e2102d..a573eda6f0 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.cs @@ -42,10 +42,9 @@ public sealed partial class CargoSystem : SharedCargoSystem [Dependency] private RadioSystem _radio = default!; [Dependency] private IdentitySystem _identity = default!; - private EntityQuery _xformQuery; - private EntityQuery _blacklistQuery; - private EntityQuery _mobQuery; - private EntityQuery _tradeQuery; + [Dependency] private EntityQuery _cargoSellBlacklistQuery = default!; + [Dependency] private EntityQuery _mobStateQuery = default!; + [Dependency] private EntityQuery _tradeStationQuery = default!; private HashSet _setEnts = new(); private List _listEnts = new(); @@ -54,12 +53,6 @@ public sealed partial class CargoSystem : SharedCargoSystem public override void Initialize() { base.Initialize(); - - _xformQuery = GetEntityQuery(); - _blacklistQuery = GetEntityQuery(); - _mobQuery = GetEntityQuery(); - _tradeQuery = GetEntityQuery(); - InitializeConsole(); InitializeShuttle(); InitializeTelepad(); diff --git a/Content.Server/Chat/SuicideSystem.cs b/Content.Server/Chat/SuicideSystem.cs index 2ceff59755..11b0dff3b9 100644 --- a/Content.Server/Chat/SuicideSystem.cs +++ b/Content.Server/Chat/SuicideSystem.cs @@ -28,6 +28,7 @@ public sealed partial class SuicideSystem : EntitySystem [Dependency] private SharedPopupSystem _popup = default!; [Dependency] private GhostSystem _ghostSystem = default!; [Dependency] private SharedSuicideSystem _suicide = default!; + [Dependency] private EntityQuery _itemQuery = default!; private static readonly ProtoId CannotSuicideTag = "CannotSuicide"; @@ -132,11 +133,10 @@ public sealed partial class SuicideSystem : EntitySystem // Try to suicide by nearby entities, like Microwaves or Crematoriums, by raising an event on it // Returns upon being handled by any entity - var itemQuery = GetEntityQuery(); foreach (var entity in _entityLookupSystem.GetEntitiesInRange(victim, 1, LookupFlags.Approximate | LookupFlags.Static)) { // Skip any nearby items that can be picked up, we already checked the active held item above - if (itemQuery.HasComponent(entity)) + if (_itemQuery.HasComponent(entity)) continue; RaiseLocalEvent(entity, suicideByEnvironmentEvent); diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 2ce464b21a..b23520784a 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -21,7 +21,6 @@ using Content.Shared.Players; using Content.Shared.Players.RateLimiting; using Content.Shared.Radio; using Content.Shared.Station.Components; -using Content.Shared.Whitelist; using Robust.Server.Player; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -58,6 +57,7 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private SharedAudioSystem _audio = default!; [Dependency] private ReplacementAccentSystem _wordreplacement = default!; [Dependency] private ExamineSystemShared _examineSystem = default!; + [Dependency] private EntityQuery _ghostHearingQuery = default!; private bool _loocEnabled = true; private bool _deadLoocEnabled; @@ -792,10 +792,8 @@ public sealed partial class ChatSystem : SharedChatSystem // TODO proper speech occlusion var recipients = new Dictionary(); - var ghostHearing = GetEntityQuery(); - var xforms = GetEntityQuery(); - var transformSource = xforms.GetComponent(source); + var transformSource = Transform(source); var sourceMapId = transformSource.MapID; var sourceCoords = transformSource.Coordinates; @@ -804,12 +802,12 @@ public sealed partial class ChatSystem : SharedChatSystem if (player.AttachedEntity is not { Valid: true } playerEntity) continue; - var transformEntity = xforms.GetComponent(playerEntity); + var transformEntity = Transform(playerEntity); if (transformEntity.MapID != sourceMapId) continue; - var observer = ghostHearing.HasComponent(playerEntity); + var observer = _ghostHearingQuery.HasComponent(playerEntity); // even if they are a ghost hearer, in some situations we still need the range if (sourceCoords.TryDistance(EntityManager, transformEntity.Coordinates, out var distance) && distance < voiceGetRange) diff --git a/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs b/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs index f2d1bcebe1..add3e71428 100644 --- a/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs +++ b/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs @@ -34,8 +34,8 @@ public sealed partial class CleanTileReaction : ITileReaction FixedPoint2 ITileReaction.TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume, - IEntityManager entityManager - , List? data) + IEntityManager entityManager, + List? data) { var entities = entityManager.System().GetLocalEntitiesIntersecting(tile, 0f).ToArray(); var puddleQuery = entityManager.GetEntityQuery(); diff --git a/Content.Server/Chunking/ChunkingSystem.cs b/Content.Server/Chunking/ChunkingSystem.cs index 9a6a6d3fd4..7d2399182f 100644 --- a/Content.Server/Chunking/ChunkingSystem.cs +++ b/Content.Server/Chunking/ChunkingSystem.cs @@ -1,5 +1,3 @@ -using System.Linq; -using Content.Shared.Decals; using Microsoft.Extensions.ObjectPool; using Robust.Shared; using Robust.Shared.Configuration; @@ -22,14 +20,11 @@ public sealed partial class ChunkingSystem : EntitySystem [Dependency] private IMapManager _mapManager = default!; [Dependency] private SharedTransformSystem _transform = default!; - private EntityQuery _xformQuery; - private Box2 _baseViewBounds; public override void Initialize() { base.Initialize(); - _xformQuery = GetEntityQuery(); Subs.CVar(_configurationManager, CVars.NetMaxUpdateRange, OnPvsRangeChanged, true); } @@ -67,7 +62,7 @@ public sealed partial class ChunkingSystem : EntitySystem int chunkSize, float viewEnlargement) { - if (!_xformQuery.TryGetComponent(viewer, out var xform)) + if (!TryComp(viewer, out TransformComponent? xform)) return; var pos = _transform.GetWorldPosition(xform); diff --git a/Content.Server/DeviceLinking/Systems/PowerSensorSystem.cs b/Content.Server/DeviceLinking/Systems/PowerSensorSystem.cs index ac07c1f94a..79d67c3c0c 100644 --- a/Content.Server/DeviceLinking/Systems/PowerSensorSystem.cs +++ b/Content.Server/DeviceLinking/Systems/PowerSensorSystem.cs @@ -1,5 +1,4 @@ using Content.Server.DeviceLinking.Components; -using Content.Server.NodeContainer; using Content.Server.Power.EntitySystems; using Content.Server.Power.Nodes; using Content.Server.Power.NodeGroups; @@ -26,16 +25,10 @@ public sealed partial class PowerSensorSystem : EntitySystem [Dependency] private SharedToolSystem _tool = default!; [Dependency] private UseDelaySystem _useDelay = default!; - private EntityQuery _nodeQuery; - private EntityQuery _xformQuery; - public override void Initialize() { base.Initialize(); - _nodeQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnInteractUsing); @@ -99,7 +92,7 @@ public sealed partial class PowerSensorSystem : EntitySystem var deviceNode = (CableDeviceNode) nodeContainer.Nodes[cable.Node]; // update state based on the power stats retrieved from the selected power network - var xform = _xformQuery.GetComponent(uid); + var xform = Transform(uid); if (!TryComp(xform.GridUid, out MapGridComponent? grid)) return; diff --git a/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs index 30ed7c7160..f12ed6d245 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs @@ -11,6 +11,7 @@ namespace Content.Server.DeviceNetwork.Systems; public sealed partial class DeviceListSystem : SharedDeviceListSystem { [Dependency] private NetworkConfiguratorSystem _configurator = default!; + [Dependency] private EntityQuery _deviceNetworkQuery = default!; public override void Initialize() { @@ -28,10 +29,9 @@ public sealed partial class DeviceListSystem : SharedDeviceListSystem _configurator.OnDeviceListShutdown(conf, (uid, component)); } - var query = GetEntityQuery(); foreach (var device in component.Devices) { - if (query.TryGetComponent(device, out var comp)) + if (_deviceNetworkQuery.TryGetComponent(device, out var comp)) comp.DeviceLists.Remove(uid); } component.Devices.Clear(); @@ -125,7 +125,6 @@ public sealed partial class DeviceListSystem : SharedDeviceListSystem private void OnMapSave(BeforeSerializationEvent ev) { List toRemove = new(); - var query = GetEntityQuery(); var enumerator = AllEntityQuery(); while (enumerator.MoveNext(out var uid, out var device, out var xform)) { @@ -134,7 +133,7 @@ public sealed partial class DeviceListSystem : SharedDeviceListSystem foreach (var ent in device.Devices) { - if (!query.TryGetComponent(ent, out var linkedXform)) + if (!TryComp(ent, out TransformComponent? linkedXform)) { // Entity was deleted. // TODO remove these on deletion instead of on-save. @@ -190,7 +189,6 @@ public sealed partial class DeviceListSystem : SharedDeviceListSystem return DeviceListUpdateResult.TooManyDevices; } - var query = GetEntityQuery(); var oldDevices = deviceList.Devices.ToList(); foreach (var device in oldDevices) { @@ -198,13 +196,13 @@ public sealed partial class DeviceListSystem : SharedDeviceListSystem continue; deviceList.Devices.Remove(device); - if (query.TryGetComponent(device, out var comp)) + if (_deviceNetworkQuery.TryGetComponent(device, out var comp)) comp.DeviceLists.Remove(uid); } foreach (var device in newDevices) { - if (!query.TryGetComponent(device, out var comp)) + if (!_deviceNetworkQuery.TryGetComponent(device, out var comp)) continue; if (!deviceList.Devices.Add(device)) diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index 8cabf5b40f..51360bc48b 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -37,6 +37,7 @@ public sealed partial class NetworkConfiguratorSystem : SharedNetworkConfigurato [Dependency] private SharedAppearanceSystem _appearanceSystem = default!; [Dependency] private IGameTiming _gameTiming = default!; [Dependency] private IAdminLogManager _adminLogger = default!; + [Dependency] private EntityQuery _deviceNetworkQuery = default!; public override void Initialize() { @@ -632,10 +633,9 @@ public sealed partial class NetworkConfiguratorSystem : SharedNetworkConfigurato private void ClearDevices(EntityUid uid, NetworkConfiguratorComponent component) { - var query = GetEntityQuery(); foreach (var device in component.Devices.Values) { - if (query.TryGetComponent(device, out var comp)) + if (_deviceNetworkQuery.TryGetComponent(device, out var comp)) comp.Configurators.Remove(uid); } @@ -794,10 +794,9 @@ public sealed partial class NetworkConfiguratorSystem : SharedNetworkConfigurato ClearDevices(uid, component); - var query = GetEntityQuery(); foreach (var (addr, device) in _deviceListSystem.GetDeviceList(component.ActiveDeviceList.Value)) { - if (query.TryGetComponent(device, out var comp)) + if (_deviceNetworkQuery.TryGetComponent(device, out var comp)) { component.Devices.Add(addr, device); comp.Configurators.Add(uid); diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs index dac2e004eb..16ebacaa95 100644 --- a/Content.Server/Doors/Systems/FirelockSystem.cs +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.Monitor.Components; using Content.Server.Atmos.Monitor.Systems; -using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Shuttles.Components; using Content.Shared.Atmos; @@ -24,7 +23,10 @@ namespace Content.Server.Doors.Systems [Dependency] private SharedMapSystem _mapping = default!; [Dependency] private PointLightSystem _pointLight = default!; - private EntityQuery _atmosAlarmQuery; + [Dependency] private EntityQuery _atmosAlarmQuery = default!; + [Dependency] private EntityQuery _airtightQuery = default!; + [Dependency] private EntityQuery _appearanceQuery = default!; + [Dependency] private EntityQuery _pointLightQuery = default!; private const int UpdateInterval = 30; private int _accumulatedTicks; @@ -35,8 +37,6 @@ namespace Content.Server.Doors.Systems SubscribeLocalEvent(OnAtmosAlarm); SubscribeLocalEvent(PowerChanged); - - _atmosAlarmQuery = GetEntityQuery(); } private void PowerChanged(EntityUid uid, FirelockComponent component, ref PowerChangedEvent args) @@ -53,10 +53,6 @@ namespace Content.Server.Doors.Systems _accumulatedTicks = 0; - var airtightQuery = GetEntityQuery(); - var appearanceQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var pointLightQuery = GetEntityQuery(); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var firelock, out var door)) @@ -77,11 +73,10 @@ namespace Content.Server.Doors.Systems continue; } - if (airtightQuery.TryGetComponent(uid, out var airtight) - && xformQuery.TryGetComponent(uid, out var xform) - && appearanceQuery.TryGetComponent(uid, out var appearance)) + if (_airtightQuery.TryGetComponent(uid, out var airtight) + && _appearanceQuery.TryGetComponent(uid, out var appearance)) { - var (pressure, fire) = CheckPressureAndFire(uid, firelock, xform, airtight, airtightQuery); + var (pressure, fire) = CheckPressureAndFire(uid, firelock, airtight); _appearance.SetData(uid, DoorVisuals.ClosedLights, fire || pressure, appearance); firelock.Temperature = fire; firelock.Pressure = pressure; @@ -89,7 +84,7 @@ namespace Content.Server.Doors.Systems _appearance.SetData(uid, FirelockVisuals.TemperatureWarning, fire, appearance); Dirty(uid, firelock); - if (pointLightQuery.TryComp(uid, out var pointLight)) + if (_pointLightQuery.TryComp(uid, out var pointLight)) { _pointLight.SetEnabled(uid, fire | pressure, pointLight); } @@ -118,18 +113,15 @@ namespace Content.Server.Doors.Systems public (bool Pressure, bool Fire) CheckPressureAndFire(EntityUid uid, FirelockComponent firelock) { - var query = GetEntityQuery(); - if (query.TryGetComponent(uid, out AirtightComponent? airtight)) - return CheckPressureAndFire(uid, firelock, Transform(uid), airtight, query); + if (_airtightQuery.TryGetComponent(uid, out AirtightComponent? airtight)) + return CheckPressureAndFire(uid, firelock, airtight); return (false, false); } public (bool Pressure, bool Fire) CheckPressureAndFire( EntityUid uid, FirelockComponent firelock, - TransformComponent xform, - AirtightComponent airtight, - EntityQuery airtightQuery) + AirtightComponent airtight) { if (!airtight.AirBlocked) return (false, false); @@ -140,6 +132,7 @@ namespace Content.Server.Doors.Systems return (false, false); } + var xform = Transform(uid); if (!HasComp(xform.ParentUid)) return (false, false); @@ -190,7 +183,7 @@ namespace Content.Server.Doors.Systems { // Is there some airtight entity blocking this direction? If yes, don't include this direction in the // pressure differential - if (HasAirtightBlocker(_mapping.GetAnchoredEntities(xform.ParentUid, grid, adjacentPos), dir.GetOpposite(), airtightQuery)) + if (HasAirtightBlocker(_mapping.GetAnchoredEntities(xform.ParentUid, grid, adjacentPos), dir.GetOpposite())) continue; var p = gas.Pressure; @@ -233,11 +226,11 @@ namespace Content.Server.Doors.Systems return (holdingPressure, holdingFire); } - private bool HasAirtightBlocker(IEnumerable enumerable, AtmosDirection dir, EntityQuery airtightQuery) + private bool HasAirtightBlocker(IEnumerable enumerable, AtmosDirection dir) { foreach (var ent in enumerable) { - if (!airtightQuery.TryGetComponent(ent, out var airtight) || !airtight.AirBlocked) + if (!_airtightQuery.TryGetComponent(ent, out var airtight) || !airtight.AirBlocked) continue; if ((airtight.AirBlockedDirection & dir) == dir) diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index f952a0d81e..d06d8932c1 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -8,7 +8,6 @@ using Content.Shared.Dragon; using Content.Shared.Gibbing; using Content.Shared.Maps; using Content.Shared.Mind; -using Content.Shared.Mind.Components; using Content.Shared.Mobs; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Systems; @@ -36,7 +35,7 @@ public sealed partial class DragonSystem : EntitySystem [Dependency] private GibbingSystem _gibbing = default!; [Dependency] private SmokeSystem _smoke = default!; - private EntityQuery _objQuery; + [Dependency] private EntityQuery _carpRiftsConditionQuery = default!; /// /// Minimum distance between 2 rifts allowed. @@ -54,8 +53,6 @@ public sealed partial class DragonSystem : EntitySystem { base.Initialize(); - _objQuery = GetEntityQuery(); - SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnSpawnRift); @@ -244,7 +241,7 @@ public sealed partial class DragonSystem : EntitySystem foreach (var objId in mind.Objectives) { - if (_objQuery.TryGetComponent(objId, out var obj)) + if (_carpRiftsConditionQuery.TryGetComponent(objId, out var obj)) { _carpRifts.ResetRifts(objId, obj); break; @@ -265,7 +262,7 @@ public sealed partial class DragonSystem : EntitySystem foreach (var objId in mind.Objectives) { - if (_objQuery.TryGetComponent(objId, out var obj)) + if (_carpRiftsConditionQuery.TryGetComponent(objId, out var obj)) { _carpRifts.RiftCharged(objId, obj); break; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs index 3767d0c238..8564fbb546 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs @@ -1,8 +1,6 @@ using System.Numerics; using Content.Shared.Atmos; -using Content.Shared.Explosion; using Content.Shared.Explosion.Components; -using Content.Shared.Explosion.EntitySystems; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -102,9 +100,8 @@ public sealed partial class ExplosionSystem continue; } - var xforms = GetEntityQuery(); - var xform = xforms.GetComponent(gridToTransform); - var (_, gridWorldRotation, gridWorldMatrix, invGridWorldMatrid) = _transformSystem.GetWorldPositionRotationMatrixWithInv(xform, xforms); + var xform = Transform(gridToTransform); + var (_, gridWorldRotation, gridWorldMatrix, invGridWorldMatrid) = _transformSystem.GetWorldPositionRotationMatrixWithInv(xform); var localEpicentre = (Vector2i) Vector2.Transform(epicentre.Position, invGridWorldMatrid); var matrix = offsetMatrix * gridWorldMatrix * targetMatrix; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index ab65c04633..003a9462c9 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -681,13 +681,6 @@ sealed class Explosion /// private readonly Dictionary, List<(Vector2i, Tile)>> _tileUpdateDict = new(); - // Entity Queries - private readonly EntityQuery _xformQuery; - private readonly EntityQuery _physicsQuery; - private readonly EntityQuery _damageQuery; - private readonly EntityQuery _projectileQuery; - private readonly EntityQuery _tagQuery; - /// /// Total area that the explosion covers. /// @@ -753,12 +746,6 @@ sealed class Explosion _entMan = entMan; _damageable = damageable; - _xformQuery = entMan.GetEntityQuery(); - _physicsQuery = entMan.GetEntityQuery(); - _damageQuery = entMan.GetEntityQuery(); - _tagQuery = entMan.GetEntityQuery(); - _projectileQuery = entMan.GetEntityQuery(); - if (spaceData != null) { var mapUid = mapSystem.GetMap(epicenter.MapId); diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 7bb697b1ee..2a43695dd4 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -59,15 +59,14 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem [Dependency] private DestructibleSystem _destructibleSystem = default!; [Dependency] private AtmosphereSystem _atmosphere = default!; - private EntityQuery _flammableQuery; - private EntityQuery _physicsQuery; - private EntityQuery _projectileQuery; - private EntityQuery _actorQuery; - private EntityQuery _destructibleQuery; - private EntityQuery _damageableQuery; + [Dependency] private EntityQuery _flammableQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; + [Dependency] private EntityQuery _actorQuery = default!; + [Dependency] private EntityQuery _destructibleQuery = default!; + [Dependency] private EntityQuery _damageableQuery = default!; [Dependency] private EntityQuery _injurableQuery = default!; - private EntityQuery _airtightQuery; - private EntityQuery _tileHistoryQuery; + [Dependency] private EntityQuery _airtightQuery = default!; + [Dependency] private EntityQuery _tileHistoryQuery = default!; /// /// "Tile-size" for space when there are no nearby grids to use as a reference. @@ -103,15 +102,6 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem InitAirtightMap(); InitVisuals(); - _flammableQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - _projectileQuery = GetEntityQuery(); - _actorQuery = GetEntityQuery(); - _destructibleQuery = GetEntityQuery(); - _damageableQuery = GetEntityQuery(); - _airtightQuery = GetEntityQuery(); - _tileHistoryQuery = GetEntityQuery(); - _prototypeManager.PrototypesReloaded += ReloadExplosionPrototypes; } diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index d1c6bd3d3b..3bef3e594e 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -37,7 +37,8 @@ public sealed partial class PuddleSystem : SharedPuddleSystem [Dependency] private SharedTransformSystem _transform = default!; [Dependency] private TurfSystem _turf = default!; - private EntityQuery _puddleQuery; + [Dependency] private EntityQuery _puddleQuery = default!; + [Dependency] private EntityQuery _evaporationSparklesQuery = default!; /* * TODO: Need some sort of way to do blood slash / vomit solution spill on its own @@ -49,8 +50,6 @@ public sealed partial class PuddleSystem : SharedPuddleSystem { base.Initialize(); - _puddleQuery = GetEntityQuery(); - SubscribeLocalEvent(OnPuddleSpread); SubscribeLocalEvent(OnPuddleSlip); } @@ -151,7 +150,7 @@ public sealed partial class PuddleSystem : SharedPuddleSystem break; } - // If there is nothing left to overflow from our tile, then we'll stop this tile being a active spreader + // If there is nothing left to overflow from our tile, then we'll stop this tile being an active spreader if (overflow.Volume == FixedPoint2.Zero) { RemCompDeferred(entity); @@ -517,19 +516,17 @@ public sealed partial class PuddleSystem : SharedPuddleSystem // Get normalized co-ordinate for spill location and spill it in the centre // TODO: Does SnapGrid or something else already do this? var anchored = _map.GetAnchoredEntitiesEnumerator(gridId, mapGrid, tileRef.GridIndices); - var puddleQuery = GetEntityQuery(); - var sparklesQuery = GetEntityQuery(); while (anchored.MoveNext(out var ent)) { // If there's existing sparkles then delete it - if (sparklesQuery.TryGetComponent(ent, out var sparkles)) + if (_evaporationSparklesQuery.TryGetComponent(ent, out var sparkles)) { QueueDel(ent.Value); continue; } - if (!puddleQuery.TryGetComponent(ent, out var puddle)) + if (!_puddleQuery.TryGetComponent(ent, out var puddle)) continue; if (TryAddSolution(ent.Value, solution, sound, puddleComponent: puddle)) @@ -565,11 +562,9 @@ public sealed partial class PuddleSystem : SharedPuddleSystem return false; var anc = _map.GetAnchoredEntitiesEnumerator(tile.GridUid, grid, tile.GridIndices); - var puddleQuery = GetEntityQuery(); - while (anc.MoveNext(out var ent)) { - if (!puddleQuery.HasComponent(ent.Value)) + if (!_puddleQuery.HasComponent(ent.Value)) continue; puddleUid = ent.Value; diff --git a/Content.Server/Fluids/EntitySystems/SmokeSystem.cs b/Content.Server/Fluids/EntitySystems/SmokeSystem.cs index 005d9e0b5b..d132b0f63e 100644 --- a/Content.Server/Fluids/EntitySystems/SmokeSystem.cs +++ b/Content.Server/Fluids/EntitySystems/SmokeSystem.cs @@ -1,6 +1,5 @@ using Content.Server.Administration.Logs; using Content.Server.Body.Systems; -using Content.Shared.EntityEffects.Effects; using Content.Server.Spreader; using Content.Shared.Body.Components; using Content.Shared.Chemistry; @@ -45,17 +44,14 @@ public sealed partial class SmokeSystem : EntitySystem [Dependency] private SharedPhysicsSystem _physics = default!; [Dependency] private SharedSolutionContainerSystem _solutionContainerSystem = default!; - private EntityQuery _smokeQuery; - private EntityQuery _smokeAffectedQuery; + [Dependency] private EntityQuery _smokeQuery = default!; + [Dependency] private EntityQuery _smokeAffectedQuery = default!; /// public override void Initialize() { base.Initialize(); - _smokeQuery = GetEntityQuery(); - _smokeAffectedQuery = GetEntityQuery(); - SubscribeLocalEvent(OnStartCollide); SubscribeLocalEvent(OnEndCollide); SubscribeLocalEvent(OnReactionAttempt); @@ -165,12 +161,10 @@ public sealed partial class SmokeSystem : EntitySystem // We have no more neighbours to spread to. So instead we will randomly distribute our volume to neighbouring smoke tiles. - var smokeQuery = GetEntityQuery(); - _random.Shuffle(args.Neighbors); foreach (var neighbor in args.Neighbors) { - if (!smokeQuery.TryGetComponent(neighbor, out var smoke)) + if (!_smokeQuery.TryGetComponent(neighbor, out var smoke)) continue; smoke.SpreadAmount++; diff --git a/Content.Server/Fluids/EntitySystems/SpraySystem.cs b/Content.Server/Fluids/EntitySystems/SpraySystem.cs index 9de4fce071..03d4368894 100644 --- a/Content.Server/Fluids/EntitySystems/SpraySystem.cs +++ b/Content.Server/Fluids/EntitySystems/SpraySystem.cs @@ -49,7 +49,7 @@ public sealed partial class SpraySystem : SharedSpraySystem args.Handled = true; - var targetMapPos = _transform.GetMapCoordinates(GetEntityQuery().GetComponent(args.Target)); + var targetMapPos = _transform.GetMapCoordinates(Transform(args.Target)); Spray(entity, targetMapPos, args.User); } @@ -104,8 +104,7 @@ public sealed partial class SpraySystem : SharedSpraySystem return; } - var xformQuery = GetEntityQuery(); - var sprayerXform = xformQuery.GetComponent(entity); + var sprayerXform = Transform(entity); var sprayerMapPos = _transform.GetMapCoordinates(sprayerXform); var clickMapPos = mapcoord; @@ -149,7 +148,7 @@ public sealed partial class SpraySystem : SharedSpraySystem // Spawn the vapor cloud onto the grid/map the user is present on. Offset the start position based on how far the target destination is. var vaporPos = sprayerMapPos.Offset(distance < 1 ? quarter : threeQuarters); var vapor = Spawn(entity.Comp.SprayedPrototype, vaporPos); - var vaporXform = xformQuery.GetComponent(vapor); + var vaporXform = Transform(vapor); _transform.SetWorldRotation(vaporXform, rotation); diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index a333580fad..cae4bfd863 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -4,7 +4,6 @@ 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; @@ -454,15 +453,13 @@ namespace Content.Server.GameTicking _possiblePositions.Add(transform.Coordinates); } - var metaQuery = GetEntityQuery(); - // Fallback to a random grid. if (_possiblePositions.Count == 0) { var query = AllEntityQuery(); while (query.MoveNext(out var uid, out var grid)) { - if (!metaQuery.TryGetComponent(uid, out var meta) || meta.EntityPaused || TerminatingOrDeleted(uid)) + if (!TryComp(uid, out MetaDataComponent? meta) || meta.EntityPaused || TerminatingOrDeleted(uid)) { continue; } @@ -501,7 +498,7 @@ namespace Content.Server.GameTicking { var mapUid = _map.GetMapOrInvalid(map); - if (!metaQuery.TryGetComponent(mapUid, out var meta) + if (!TryComp(mapUid, out MetaDataComponent? meta) || meta.EntityPaused || TerminatingOrDeleted(mapUid)) { diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index ac5b03bb2d..80bfcd7425 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -35,6 +35,7 @@ public sealed partial class ZombieRuleSystem : GameRuleSystem _zombieQuery = default!; public override void Initialize() { @@ -198,13 +199,12 @@ public sealed partial class ZombieRuleSystem : GameRuleSystem(); - var zombers = GetEntityQuery(); while (players.MoveNext(out var uid, out _, out _, out var mob, out var xform)) { if (!_mobState.IsAlive(uid, mob)) continue; - if (zombers.HasComponent(uid)) + if (_zombieQuery.HasComponent(uid)) continue; if (!includeOffStation && !stationGrids.Contains(xform.GridUid ?? EntityUid.Invalid)) diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index 19269befb0..bb9d3d9f53 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -68,8 +68,8 @@ namespace Content.Server.Ghost [Dependency] private NameModifierSystem _nameMod = default!; [Dependency] private GhostSpriteStateSystem _ghostState = default!; - private EntityQuery _ghostQuery; - private EntityQuery _physicsQuery; + [Dependency] private EntityQuery _ghostQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; private static readonly ProtoId AllowGhostShownByEventTag = "AllowGhostShownByEvent"; private static readonly ProtoId AsphyxiationDamageType = "Asphyxiation"; @@ -78,9 +78,6 @@ namespace Content.Server.Ghost { base.Initialize(); - _ghostQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - SubscribeLocalEvent(OnGhostStartup); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnGhostShutdown); diff --git a/Content.Server/Ghost/Roles/GhostRoleSystem.cs b/Content.Server/Ghost/Roles/GhostRoleSystem.cs index 9431f97693..a5802e44bb 100644 --- a/Content.Server/Ghost/Roles/GhostRoleSystem.cs +++ b/Content.Server/Ghost/Roles/GhostRoleSystem.cs @@ -622,8 +622,7 @@ public sealed partial class GhostRoleSystem : EntitySystem /// public int GetGhostRoleCount() { - var metaQuery = GetEntityQuery(); - return _ghostRoles.Count(pair => metaQuery.GetComponent(pair.Value.Owner).EntityPaused == false); + return _ghostRoles.Count(pair => MetaData(pair.Value.Owner).EntityPaused == false); } /// @@ -635,11 +634,10 @@ public sealed partial class GhostRoleSystem : EntitySystem public GhostRoleInfo[] GetGhostRolesInfo(ICommonSession? player) { var roles = new List(); - var metaQuery = GetEntityQuery(); foreach (var (id, (uid, role)) in _ghostRoles) { - if (metaQuery.GetComponent(uid).EntityPaused) + if (MetaData(uid).EntityPaused) continue; diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index 629c2439e5..76e63da3d9 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -32,8 +32,7 @@ namespace Content.Server.Hands.Systems [Dependency] private SharedTransformSystem _transformSystem = default!; [Dependency] private PullingSystem _pullingSystem = default!; [Dependency] private ThrowingSystem _throwingSystem = default!; - - private EntityQuery _physicsQuery; + [Dependency] private EntityQuery _physicsQuery = default!; /// /// Items dropped when the holder falls down will be launched in @@ -57,8 +56,6 @@ namespace Content.Server.Hands.Systems CommandBinds.Builder .Bind(ContentKeyFunctions.ThrowItemInHand, new PointerInputCmdHandler(HandleThrowItem)) .Register(); - - _physicsQuery = GetEntityQuery(); } public override void Shutdown() diff --git a/Content.Server/Instruments/InstrumentSystem.cs b/Content.Server/Instruments/InstrumentSystem.cs index bbbc6ab072..20abcae9ff 100644 --- a/Content.Server/Instruments/InstrumentSystem.cs +++ b/Content.Server/Instruments/InstrumentSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.Administration; using Content.Server.Administration.Logs; -using Content.Server.Interaction; using Content.Server.Popups; using Content.Server.Stunnable; using Content.Shared.Administration; @@ -10,7 +9,6 @@ using Content.Shared.Database; using Content.Shared.Examine; using Content.Shared.Instruments; using Content.Shared.Instruments.UI; -using Content.Shared.Physics; using Content.Shared.Popups; using JetBrains.Annotations; using Robust.Server.GameObjects; @@ -19,9 +17,7 @@ using Robust.Shared.Collections; using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.GameStates; -using Robust.Shared.Player; using Robust.Shared.Timing; -using Robust.Shared.Utility; namespace Content.Server.Instruments; @@ -36,7 +32,10 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem [Dependency] private PopupSystem _popup = default!; [Dependency] private TransformSystem _transform = default!; [Dependency] private ExamineSystemShared _examineSystem = default!; - [Dependency] private IAdminLogManager _admingLogSystem = default!; + [Dependency] private IAdminLogManager _adminLogSystem = default!; + + [Dependency] private EntityQuery _instrumentQuery = default!; + [Dependency] private EntityQuery _activeInstrumentQuery = default!; private const float MaxInstrumentBandRange = 10f; @@ -170,7 +169,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem .Where(t => t != null) .Select(t => t!.ToString())); - _admingLogSystem.Add( + _adminLogSystem.Add( LogType.Instrument, LogImpact.Low, $"{ToPrettyString(args.SenderSession.AttachedEntity)} set the midi channels for {ToPrettyString(uid)} to {tracksString}"); @@ -271,13 +270,10 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem public (NetEntity, string)[] GetBands(EntityUid uid) { - var metadataQuery = GetEntityQuery(); - if (Deleted(uid)) return Array.Empty<(NetEntity, string)>(); var list = new ValueList<(NetEntity, string)>(); - var instrumentQuery = GetEntityQuery(); if (!TryComp(uid, out InstrumentComponent? originInstrument) || originInstrument.InstrumentPlayer is not {} originPlayer) @@ -291,7 +287,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem continue; // Don't grab puppet instruments. - if (!instrumentQuery.TryGetComponent(entity, out var instrument) || instrument.Master != null) + if (!_instrumentQuery.TryGetComponent(entity, out var instrument) || instrument.Master != null) continue; // We want to use the instrument player's name. @@ -303,8 +299,8 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!_examineSystem.InRangeUnOccluded(uid, entity, MaxInstrumentBandRange, e => e == playerUid || e == originPlayer)) continue; - if (!metadataQuery.TryGetComponent(playerUid, out var playerMetadata) - || !metadataQuery.TryGetComponent(entity, out var metadata)) + if (!TryComp(playerUid, out MetaDataComponent? playerMetadata) + || !TryComp(entity, out MetaDataComponent? metadata)) continue; list.Add((GetNetEntity(entity), $"{playerMetadata.EntityName} - {metadata.EntityName}")); @@ -427,9 +423,6 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem _bandRequestQueue.Clear(); } - var activeQuery = GetEntityQuery(); - var transformQuery = GetEntityQuery(); - var query = AllEntityQuery(); while (query.MoveNext(out var uid, out _, out var instrument)) { @@ -441,15 +434,15 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem continue; } - var masterActive = activeQuery.CompOrNull(master); + _activeInstrumentQuery.TryComp(master, out var masterActive); if (masterActive == null) { Clean(uid, instrument); continue; } - var trans = transformQuery.GetComponent(uid); - var masterTrans = transformQuery.GetComponent(master); + var trans = Transform(uid); + var masterTrans = Transform(master); if (!_transform.InRange(masterTrans.Coordinates, trans.Coordinates, 10f)) { Clean(uid, instrument); diff --git a/Content.Server/Light/EntitySystems/LightReplacerSystem.cs b/Content.Server/Light/EntitySystems/LightReplacerSystem.cs index 92116039c9..fa2df6a718 100644 --- a/Content.Server/Light/EntitySystems/LightReplacerSystem.cs +++ b/Content.Server/Light/EntitySystems/LightReplacerSystem.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Server.Light.Components; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Light.EntitySystems; @@ -7,7 +6,6 @@ using Content.Shared.Light.Components; using Content.Shared.Popups; using Content.Shared.Storage; using JetBrains.Annotations; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -44,10 +42,9 @@ public sealed partial class LightReplacerSystem : SharedLightReplacerSystem args.PushMarkup(Loc.GetString("comp-light-replacer-has-lights")); var groups = new Dictionary(); - var metaQuery = GetEntityQuery(); foreach (var bulb in component.InsertedBulbs.ContainedEntities) { - var metaData = metaQuery.GetComponent(bulb); + var metaData = MetaData(bulb); groups[metaData.EntityName] = groups.GetValueOrDefault(metaData.EntityName) + 1; } diff --git a/Content.Server/Light/EntitySystems/RoofSystem.cs b/Content.Server/Light/EntitySystems/RoofSystem.cs index b34d26f076..01117b445b 100644 --- a/Content.Server/Light/EntitySystems/RoofSystem.cs +++ b/Content.Server/Light/EntitySystems/RoofSystem.cs @@ -8,13 +8,11 @@ namespace Content.Server.Light.EntitySystems; public sealed partial class RoofSystem : SharedRoofSystem { [Dependency] private SharedMapSystem _maps = default!; - - private EntityQuery _gridQuery; + [Dependency] private EntityQuery _mapGridQuery = default!; public override void Initialize() { base.Initialize(); - _gridQuery = GetEntityQuery(); SubscribeLocalEvent(OnFlagStartup); } @@ -22,7 +20,7 @@ public sealed partial class RoofSystem : SharedRoofSystem { var xform = Transform(ent.Owner); - if (_gridQuery.TryComp(xform.GridUid, out var grid)) + if (_mapGridQuery.TryComp(xform.GridUid, out var grid)) { var index = _maps.LocalToTile(xform.GridUid.Value, grid, xform.Coordinates); SetRoof((xform.GridUid.Value, grid, null), index, ent.Comp.Value); diff --git a/Content.Server/Movement/Systems/MobCollisionSystem.cs b/Content.Server/Movement/Systems/MobCollisionSystem.cs index 2badac5676..56664fab19 100644 --- a/Content.Server/Movement/Systems/MobCollisionSystem.cs +++ b/Content.Server/Movement/Systems/MobCollisionSystem.cs @@ -6,14 +6,13 @@ using Robust.Shared.Player; namespace Content.Server.Movement.Systems; -public sealed class MobCollisionSystem : SharedMobCollisionSystem +public sealed partial class MobCollisionSystem : SharedMobCollisionSystem { - private EntityQuery _actorQuery; + [Dependency] private EntityQuery _actorQuery = default!; public override void Initialize() { base.Initialize(); - _actorQuery = GetEntityQuery(); SubscribeLocalEvent(OnServerMobCollision); } diff --git a/Content.Server/Movement/Systems/PullController.cs b/Content.Server/Movement/Systems/PullController.cs index 064cd66765..811f6d481e 100644 --- a/Content.Server/Movement/Systems/PullController.cs +++ b/Content.Server/Movement/Systems/PullController.cs @@ -7,9 +7,7 @@ using Content.Shared.Gravity; using Content.Shared.Input; using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Pulling.Events; -using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Rotatable; -using Robust.Server.Physics; using Robust.Shared.Containers; using Robust.Shared.Input.Binding; using Robust.Shared.Map; @@ -61,6 +59,10 @@ public sealed partial class PullController : VirtualController [Dependency] private SharedGravitySystem _gravity = default!; [Dependency] private SharedTransformSystem _transformSystem = default!; + [Dependency] private EntityQuery _physicsQuery = default!; + [Dependency] private EntityQuery _pullableQuery = default!; + [Dependency] private EntityQuery _pullerQuery = default!; + /// /// If distance between puller and pulled entity lower that this threshold, /// pulled entity will not change its rotation. @@ -76,22 +78,12 @@ public sealed partial class PullController : VirtualController /// private const float ThresholdRotAngle = 22.5f; - private EntityQuery _physicsQuery; - private EntityQuery _pullableQuery; - private EntityQuery _pullerQuery; - private EntityQuery _xformQuery; - public override void Initialize() { CommandBinds.Builder .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) .Register(); - _physicsQuery = GetEntityQuery(); - _pullableQuery = GetEntityQuery(); - _pullerQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - UpdatesAfter.Add(typeof(MoverController)); SubscribeLocalEvent(OnPullStop); SubscribeLocalEvent(OnPullerMove); @@ -202,8 +194,8 @@ public sealed partial class PullController : VirtualController if (!rotatable.RotateWhilePulling) return; - var pulledXform = _xformQuery.GetComponent(pulled); - var pullerXform = _xformQuery.GetComponent(puller); + var pulledXform = Transform(pulled); + var pullerXform = Transform(puller); var pullerData = TransformSystem.GetWorldPositionRotation(pullerXform); var pulledData = TransformSystem.GetWorldPositionRotation(pulledXform); @@ -245,7 +237,7 @@ public sealed partial class PullController : VirtualController if (pullable.Puller is not {Valid: true} puller) continue; - var pullerXform = _xformQuery.Get(puller); + var pullerXform = Transform(puller); var pullerPosition = TransformSystem.GetMapCoordinates(pullerXform); var movingTo = TransformSystem.ToMapCoordinates(mover.MovingTo); @@ -305,7 +297,7 @@ public sealed partial class PullController : VirtualController // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). // doing it under gravity produces an unsatisfying wiggling when pulling. // If player can't move, assume they are on a chair and we need to prevent pull-moving. - if (_gravity.IsWeightless(puller) && pullerXform.Comp.GridUid == null || !_actionBlockerSystem.CanMove(puller)) + if (_gravity.IsWeightless(puller) && pullerXform.GridUid == null || !_actionBlockerSystem.CanMove(puller)) { PhysicsSystem.WakeBody(puller); PhysicsSystem.ApplyLinearImpulse(puller, -impulse); diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs index 4aef7dca96..dfb7f131e0 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs @@ -96,7 +96,7 @@ public sealed partial class PathfindingSystem // TODO: Dump all this shit and just do it live it's probably fast enough. if (comp.DirtyChunks.Count == 0 || curTime < comp.NextUpdate || - !_gridQuery.TryGetComponent(uid, out var mapGridComp)) + !_mapGridQuery.TryGetComponent(uid, out var mapGridComp)) { continue; } @@ -272,7 +272,7 @@ public sealed partial class PathfindingSystem { if (!_fixturesQuery.TryGetComponent(ev.Sender, out var fixtures) || !IsBodyRelevant(fixtures) || - _gridQuery.HasComponent(ev.Sender)) + _mapGridQuery.HasComponent(ev.Sender)) { return; } @@ -441,7 +441,7 @@ public sealed partial class PathfindingSystem continue; } - var xform = _xformQuery.GetComponent(ent); + var xform = Transform(ent); if (xform.ParentUid != grid.Owner || _maps.LocalToTile(grid.Owner, grid.Comp, xform.Coordinates) != tilePos) @@ -494,7 +494,7 @@ public sealed partial class PathfindingSystem } if (!intersects || - !_xformQuery.TryGetComponent(ent, out var xform)) + !TryComp(ent, out TransformComponent? xform)) { continue; } @@ -513,7 +513,7 @@ public sealed partial class PathfindingSystem if (!colliding) continue; - if (_accessQuery.HasComponent(ent)) + if (_accessReaderQuery.HasComponent(ent)) { flags |= PathfindingBreadcrumbFlag.Access; } diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs index ddd31d24c6..1244b60a9c 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.cs @@ -53,6 +53,13 @@ namespace Content.Server.NPC.Pathfinding [Dependency] private SharedPhysicsSystem _physics = default!; [Dependency] private SharedTransformSystem _transform = default!; + [Dependency] private EntityQuery _accessReaderQuery = default!; + [Dependency] private EntityQuery _destructibleQuery = default!; + [Dependency] private EntityQuery _doorQuery = default!; + [Dependency] private EntityQuery _climbableQuery = default!; + [Dependency] private EntityQuery _fixturesQuery = default!; + [Dependency] private EntityQuery _mapGridQuery = default!; + private readonly Dictionary _subscribedSessions = new(); [ViewVariables] @@ -68,26 +75,9 @@ namespace Content.Server.NPC.Pathfinding private int _portalIndex; private readonly Dictionary _portals = new(); - private EntityQuery _accessQuery; - private EntityQuery _destructibleQuery; - private EntityQuery _doorQuery; - private EntityQuery _climbableQuery; - private EntityQuery _fixturesQuery; - private EntityQuery _gridQuery; - private EntityQuery _xformQuery; - public override void Initialize() { base.Initialize(); - - _accessQuery = GetEntityQuery(); - _destructibleQuery = GetEntityQuery(); - _doorQuery = GetEntityQuery(); - _climbableQuery = GetEntityQuery(); - _fixturesQuery = GetEntityQuery(); - _gridQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - _playerManager.PlayerStatusChanged += OnPlayerChange; InitializeGrid(); SubscribeNetworkEvent(OnBreadcrumbs); diff --git a/Content.Server/NPC/Systems/NPCCombatSystem.Melee.cs b/Content.Server/NPC/Systems/NPCCombatSystem.Melee.cs index 2ae20817e2..f6cf49c14d 100644 --- a/Content.Server/NPC/Systems/NPCCombatSystem.Melee.cs +++ b/Content.Server/NPC/Systems/NPCCombatSystem.Melee.cs @@ -3,7 +3,6 @@ using Content.Server.NPC.Components; using Content.Shared.CombatMode; using Content.Shared.NPC; using Robust.Shared.Map; -using Robust.Shared.Physics.Components; using Robust.Shared.Random; namespace Content.Server.NPC.Systems; @@ -38,25 +37,22 @@ public sealed partial class NPCCombatSystem private void UpdateMelee(float frameTime) { - var combatQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var physicsQuery = GetEntityQuery(); var curTime = _timing.CurTime; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var comp, out _)) { - if (!combatQuery.TryGetComponent(uid, out var combat) || !combat.IsInCombatMode) + if (!_combatQuery.TryGetComponent(uid, out var combat) || !combat.IsInCombatMode) { RemComp(uid); continue; } - Attack(uid, comp, curTime, physicsQuery, xformQuery); + Attack(uid, comp, curTime); } } - private void Attack(EntityUid uid, NPCMeleeCombatComponent component, TimeSpan curTime, EntityQuery physicsQuery, EntityQuery xformQuery) + private void Attack(EntityUid uid, NPCMeleeCombatComponent component, TimeSpan curTime) { component.Status = CombatStatus.Normal; @@ -66,8 +62,8 @@ public sealed partial class NPCCombatSystem return; } - if (!xformQuery.TryGetComponent(uid, out var xform) || - !xformQuery.TryGetComponent(component.Target, out var targetXform)) + if (!TryComp(uid, out TransformComponent? xform) || + !TryComp(component.Target, out TransformComponent? targetXform)) { component.Status = CombatStatus.TargetUnreachable; return; @@ -105,7 +101,7 @@ public sealed partial class NPCCombatSystem return; if (_random.Prob(component.MissChance) && - physicsQuery.TryGetComponent(component.Target, out var targetPhysics) && + _physicsQuery.TryGetComponent(component.Target, out var targetPhysics) && targetPhysics.LinearVelocity.LengthSquared() != 0f) { _melee.AttemptLightAttackMiss(uid, weaponUid, weapon, targetXform.Coordinates.Offset(_random.NextVector2(0.5f))); diff --git a/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs b/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs index 43d240ce1b..c01601e9bd 100644 --- a/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs +++ b/Content.Server/NPC/Systems/NPCCombatSystem.Ranged.cs @@ -14,11 +14,11 @@ public sealed partial class NPCCombatSystem [Dependency] private SharedCombatModeSystem _combat = default!; [Dependency] private RotateToFaceSystem _rotate = default!; - private EntityQuery _combatQuery; - private EntityQuery _steeringQuery; - private EntityQuery _rechargeQuery; - private EntityQuery _physicsQuery; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _combatQuery = default!; + [Dependency] private EntityQuery _steeringQuery = default!; + [Dependency] private EntityQuery _rechargeQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; + [Dependency] private EntityQuery _xformQuery = default!; // TODO: Don't predict for hitscan private const float ShootSpeed = 20f; @@ -30,12 +30,6 @@ public sealed partial class NPCCombatSystem private void InitializeRanged() { - _combatQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - _rechargeQuery = GetEntityQuery(); - _steeringQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - SubscribeLocalEvent(OnRangedStartup); SubscribeLocalEvent(OnRangedShutdown); } diff --git a/Content.Server/NPC/Systems/NPCJukeSystem.cs b/Content.Server/NPC/Systems/NPCJukeSystem.cs index e66f92df58..5e3a6b33bd 100644 --- a/Content.Server/NPC/Systems/NPCJukeSystem.cs +++ b/Content.Server/NPC/Systems/NPCJukeSystem.cs @@ -1,14 +1,10 @@ using System.Numerics; using Content.Server.NPC.Components; using Content.Server.NPC.Events; -using Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat; using Content.Server.Weapons.Melee; using Content.Shared.NPC; -using Content.Shared.Weapons.Melee; -using Robust.Shared.Collections; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -23,17 +19,13 @@ public sealed partial class NPCJukeSystem : EntitySystem [Dependency] private SharedMapSystem _mapSystem = default!; [Dependency] private SharedTransformSystem _transform = default!; - private EntityQuery _npcMeleeQuery; - private EntityQuery _npcRangedQuery; - private EntityQuery _physicsQuery; + [Dependency] private EntityQuery _npcMeleeQuery = default!; + [Dependency] private EntityQuery _npcRangedQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; public override void Initialize() { base.Initialize(); - _npcMeleeQuery = GetEntityQuery(); - _npcRangedQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - SubscribeLocalEvent(OnJukeSteering); } diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs index e0886f141a..b84f2cdaee 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs @@ -1,18 +1,15 @@ using Content.Server.Destructible; using Content.Server.NPC.Components; using Content.Server.NPC.Pathfinding; -using Content.Shared.Climbing; using Content.Shared.CombatMode; using Content.Shared.DoAfter; using Content.Shared.Doors.Components; using Content.Shared.NPC; using Robust.Shared.Map.Components; using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; using Robust.Shared.Utility; using ClimbableComponent = Content.Shared.Climbing.Components.ClimbableComponent; using ClimbingComponent = Content.Shared.Climbing.Components.ClimbingComponent; -using Robust.Shared.Random; namespace Content.Server.NPC.Systems; @@ -37,6 +34,9 @@ public sealed partial class NPCSteeringSystem * Also need to make sure it picks nearest obstacle path so it starts smashing in front of it. */ + [Dependency] private EntityQuery _doorQuery = default!; + [Dependency] private EntityQuery _climbableQuery = default!; + [Dependency] private EntityQuery _destructibleQuery = default!; private SteeringObstacleStatus TryHandleFlags(EntityUid uid, NPCSteeringComponent component, PathPoly poly) { @@ -84,12 +84,10 @@ public sealed partial class NPCSteeringSystem // Just walk into it stupid if (isDoor && !isAccessRequired) { - var doorQuery = GetEntityQuery(); - // ... At least if it's not a bump open. foreach (var ent in obstacleEnts) { - if (!doorQuery.TryGetComponent(ent, out var door)) + if (!_doorQuery.TryGetComponent(ent, out var door)) continue; if (!door.BumpOpen && (component.Flags & PathFlags.Interact) != 0x0) @@ -107,12 +105,10 @@ public sealed partial class NPCSteeringSystem if ((component.Flags & PathFlags.Prying) != 0x0 && isDoor) { - var doorQuery = GetEntityQuery(); - // Get the relevant obstacle foreach (var ent in obstacleEnts) { - if (doorQuery.TryGetComponent(ent, out var door) && door.State != DoorState.Open) + if (_doorQuery.TryGetComponent(ent, out var door) && door.State != DoorState.Open) { // TODO: Use the verb. @@ -141,12 +137,10 @@ public sealed partial class NPCSteeringSystem return SteeringObstacleStatus.Continuing; } - var climbableQuery = GetEntityQuery(); - // Get the relevant obstacle foreach (var ent in obstacleEnts) { - if (climbableQuery.TryGetComponent(ent, out var table) && + if (_climbableQuery.TryGetComponent(ent, out var table) && _climb.CanVault(table, uid, uid, out _) && _climb.TryClimb(uid, uid, ent, out id, table, climbing)) { @@ -165,8 +159,6 @@ public sealed partial class NPCSteeringSystem if (_melee.TryGetWeapon(uid, out _, out var meleeWeapon) && meleeWeapon.NextAttack <= _timing.CurTime && TryComp(uid, out var combatMode)) { _combat.SetInCombatMode(uid, true, combatMode); - var destructibleQuery = GetEntityQuery(); - // TODO: This is a hack around grilles and windows. _random.Shuffle(obstacleEnts); var attackResult = false; @@ -174,7 +166,7 @@ public sealed partial class NPCSteeringSystem foreach (var ent in obstacleEnts) { // TODO: Validate we can damage it - if (destructibleQuery.HasComponent(ent)) + if (_destructibleQuery.HasComponent(ent)) { attackResult = _melee.AttemptLightAttack(uid, uid, meleeWeapon, ent); break; diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.cs index 597de187f8..3487548c27 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.cs @@ -68,11 +68,11 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem [Dependency] private SharedTransformSystem _transform = default!; [Dependency] private SharedCombatModeSystem _combat = default!; - private EntityQuery _fixturesQuery; - private EntityQuery _modifierQuery; - private EntityQuery _factionQuery; - private EntityQuery _physicsQuery; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _fixturesQuery = default!; + [Dependency] private EntityQuery _modifierQuery = default!; + [Dependency] private EntityQuery _factionQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; + [Dependency] private EntityQuery _xformQuery = default!; private ObjectPool> _entSetPool = new DefaultObjectPool>(new SetPolicy()); @@ -99,11 +99,6 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem base.Initialize(); Log.Level = LogLevel.Info; - _fixturesQuery = GetEntityQuery(); - _modifierQuery = GetEntityQuery(); - _factionQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); for (var i = 0; i < InterestDirections; i++) { diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index 1126ddb69c..eecf1d538d 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -60,9 +60,7 @@ public sealed partial class NPCUtilitySystem : EntitySystem [Dependency] private TurretTargetSettingsSystem _turretTargetSettings = default!; [Dependency] private DamageableSystem _damageable = default!; [Dependency] private SharedStealthSystem _stealth = default!; - - private EntityQuery _puddleQuery; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _puddleQuery = default!; private ObjectPool> _entPool = new DefaultObjectPool>(new SetPolicy(), 256); @@ -72,13 +70,6 @@ public sealed partial class NPCUtilitySystem : EntitySystem private HashSet> _entitySet = new(); private List _compTypes = new(); - public override void Initialize() - { - base.Initialize(); - _puddleQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - } - /// /// Runs the UtilityQueryPrototype and returns the best-matching entities. /// @@ -429,7 +420,7 @@ public sealed partial class NPCUtilitySystem : EntitySystem if (compQuery.Components.Count == 0) return; - var mapPos = _transform.GetMapCoordinates(owner, xform: _xformQuery.GetComponent(owner)); + var mapPos = _transform.GetMapCoordinates(owner, xform: Transform(owner)); _compTypes.Clear(); var i = -1; EntityPrototype.ComponentRegistryEntry compZero = default!; @@ -507,7 +498,7 @@ public sealed partial class NPCUtilitySystem : EntitySystem private void RecursiveAdd(EntityUid uid, HashSet entities) { // TODO: Probably need a recursive struct enumerator on engine. - var xform = _xformQuery.GetComponent(uid); + var xform = Transform(uid); var enumerator = xform.ChildEnumerator; entities.Add(uid); diff --git a/Content.Server/NodeContainer/EntitySystems/NodeContainerSystem.cs b/Content.Server/NodeContainer/EntitySystems/NodeContainerSystem.cs index 9328f7ee31..ff20b5d7b6 100644 --- a/Content.Server/NodeContainer/EntitySystems/NodeContainerSystem.cs +++ b/Content.Server/NodeContainer/EntitySystems/NodeContainerSystem.cs @@ -16,7 +16,7 @@ namespace Content.Server.NodeContainer.EntitySystems public sealed partial class NodeContainerSystem : SharedNodeContainerSystem { [Dependency] private NodeGroupSystem _nodeGroupSystem = default!; - private EntityQuery _query; + [Dependency] private EntityQuery _nodeContainerQuery = default!; public override void Initialize() { @@ -29,8 +29,6 @@ namespace Content.Server.NodeContainer.EntitySystems SubscribeLocalEvent(OnReAnchor); SubscribeLocalEvent(OnMoveEvent); SubscribeLocalEvent(OnExamine); - - _query = GetEntityQuery(); } public bool TryGetNode(NodeContainerComponent component, string? identifier, [NotNullWhen(true)] out T? node) where T : Node @@ -53,7 +51,7 @@ namespace Content.Server.NodeContainer.EntitySystems public bool TryGetNode(Entity ent, string identifier, [NotNullWhen(true)] out T? node) where T : Node { - if (_query.Resolve(ent, ref ent.Comp, false) + if (_nodeContainerQuery.Resolve(ent, ref ent.Comp, false) && ent.Comp.Nodes.TryGetValue(identifier, out var n) && n is T t) { @@ -74,7 +72,7 @@ namespace Content.Server.NodeContainer.EntitySystems where T1 : Node where T2 : Node { - if (_query.Resolve(ent, ref ent.Comp, false) + if (_nodeContainerQuery.Resolve(ent, ref ent.Comp, false) && ent.Comp.Nodes.TryGetValue(id1, out var n1) && n1 is T1 t1 && ent.Comp.Nodes.TryGetValue(id2, out var n2) @@ -102,7 +100,7 @@ namespace Content.Server.NodeContainer.EntitySystems where T2 : Node where T3 : Node { - if (_query.Resolve(ent, ref ent.Comp, false) + if (_nodeContainerQuery.Resolve(ent, ref ent.Comp, false) && ent.Comp.Nodes.TryGetValue(id1, out var n1) && n1 is T1 t1 && ent.Comp.Nodes.TryGetValue(id2, out var n2) diff --git a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs index 6cb416dc0a..5b7c72efcc 100644 --- a/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs +++ b/Content.Server/NodeContainer/EntitySystems/NodeGroupSystem.cs @@ -25,6 +25,8 @@ namespace Content.Server.NodeContainer.EntitySystems [Dependency] private IAdminManager _adminManager = default!; [Dependency] private INodeGroupFactory _nodeGroupFactory = default!; [Dependency] private ILogManager _logManager = default!; + [Dependency] private EntityQuery _nodeContainerQuery = default!; + [Dependency] private EntityQuery _xformQuery = default!; private readonly List _visDeletes = new(); private readonly List _visSends = new(); @@ -166,9 +168,6 @@ namespace Content.Server.NodeContainer.EntitySystems var sw = Stopwatch.StartNew(); - var xformQuery = GetEntityQuery(); - var nodeQuery = GetEntityQuery(); - foreach (var toRemove in _toRemove) { if (toRemove.NodeGroup == null) @@ -214,7 +213,7 @@ namespace Content.Server.NodeContainer.EntitySystems // based on position & anchored neighbours However, here more than one node could be attached to the // same parent. So there is probably a better way of doing this. - foreach (var compatible in GetCompatibleNodes(node, xformQuery, nodeQuery)) + foreach (var compatible in GetCompatibleNodes(node)) { ClearReachableIfNecessary(compatible); @@ -346,20 +345,20 @@ namespace Content.Server.NodeContainer.EntitySystems return allNodes; } - private IEnumerable GetCompatibleNodes(Node node, EntityQuery xformQuery, EntityQuery nodeQuery) + private IEnumerable GetCompatibleNodes(Node node) { - var xform = xformQuery.GetComponent(node.Owner); + var xform = Transform(node.Owner); Entity? gridEnt = TryComp(xform.GridUid, out var grid) ? (xform.GridUid.Value, grid) : null; if (!node.Connectable(EntityManager, xform)) yield break; - foreach (var reachable in node.GetReachableNodes((node.Owner, xform), nodeQuery, xformQuery, gridEnt, EntityManager)) + foreach (var reachable in node.GetReachableNodes((node.Owner, xform), _nodeContainerQuery, _xformQuery, gridEnt, EntityManager)) { DebugTools.Assert(reachable != node, "GetReachableNodes() should not include self."); if (reachable.NodeGroupID == node.NodeGroupID - && reachable.Connectable(EntityManager, xformQuery.GetComponent(reachable.Owner))) + && reachable.Connectable(EntityManager, Transform(reachable.Owner))) { yield return reachable; } diff --git a/Content.Server/Objectives/Systems/HijackShuttleConditionSystem.cs b/Content.Server/Objectives/Systems/HijackShuttleConditionSystem.cs index 2e44afd793..753c064446 100644 --- a/Content.Server/Objectives/Systems/HijackShuttleConditionSystem.cs +++ b/Content.Server/Objectives/Systems/HijackShuttleConditionSystem.cs @@ -19,6 +19,9 @@ public sealed partial class HijackShuttleConditionSystem : EntitySystem [Dependency] private SharedRoleSystem _role = default!; [Dependency] private MobStateSystem _mobState = default!; + [Dependency] private EntityQuery _humanoidsQuery = default!; + [Dependency] private EntityQuery _cuffableQuery = default!; + public override void Initialize() { base.Initialize(); @@ -61,9 +64,6 @@ public sealed partial class HijackShuttleConditionSystem : EntitySystem private bool IsShuttleHijacked(EntityUid shuttleGridId, EntityUid mindId) { var gridPlayers = Filter.BroadcastGrid(shuttleGridId).Recipients; - var humanoids = GetEntityQuery(); - var cuffable = GetEntityQuery(); - EntityQuery(); var agentOnShuttle = false; foreach (var player in gridPlayers) @@ -78,7 +78,7 @@ public sealed partial class HijackShuttleConditionSystem : EntitySystem continue; } - var isHumanoid = humanoids.HasComponent(player.AttachedEntity.Value); + var isHumanoid = _humanoidsQuery.HasComponent(player.AttachedEntity.Value); if (!isHumanoid) // Only humanoids count as enemies continue; @@ -91,7 +91,7 @@ public sealed partial class HijackShuttleConditionSystem : EntitySystem continue; var isPersonCuffed = - cuffable.TryGetComponent(player.AttachedEntity.Value, out var cuffed) + _cuffableQuery.TryGetComponent(player.AttachedEntity.Value, out var cuffed) && cuffed.CuffedHandCount > 0; if (isPersonCuffed) // Allow handcuffed continue; diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index aaf505e002..c7e7790cf1 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -24,8 +24,7 @@ public sealed partial class StealConditionSystem : EntitySystem [Dependency] private SharedInteractionSystem _interaction = default!; [Dependency] private SharedObjectivesSystem _objectives = default!; [Dependency] private EntityLookupSystem _lookup = default!; - - private EntityQuery _containerQuery; + [Dependency] private EntityQuery _containerQuery = default!; private HashSet> _nearestEnts = new(); private HashSet _countedItems = new(); @@ -34,8 +33,6 @@ public sealed partial class StealConditionSystem : EntitySystem { base.Initialize(); - _containerQuery = GetEntityQuery(); - SubscribeLocalEvent(OnAssigned); SubscribeLocalEvent(OnAfterAssign); SubscribeLocalEvent(OnGetProgress); diff --git a/Content.Server/Parallax/BiomeSystem.cs b/Content.Server/Parallax/BiomeSystem.cs index 8250900895..f9498e7a6d 100644 --- a/Content.Server/Parallax/BiomeSystem.cs +++ b/Content.Server/Parallax/BiomeSystem.cs @@ -1,15 +1,11 @@ -using System.Linq; using System.Numerics; using System.Threading.Tasks; -using Content.Server.Atmos; -using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Decals; using Content.Server.Ghost.Roles.Components; using Content.Server.Shuttles.Events; using Content.Server.Shuttles.Systems; using Content.Shared.Atmos; -using Content.Shared.Decals; using Content.Shared.Ghost; using Content.Shared.Gravity; using Content.Shared.Light.Components; @@ -53,10 +49,10 @@ public sealed partial class BiomeSystem : SharedBiomeSystem [Dependency] private ShuttleSystem _shuttles = default!; [Dependency] private TagSystem _tags = default!; - private EntityQuery _biomeQuery; - private EntityQuery _fixturesQuery; - private EntityQuery _ghostQuery; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _biomeQuery = default!; + [Dependency] private EntityQuery _fixturesQuery = default!; + [Dependency] private EntityQuery _ghostQuery = default!; + [Dependency] private EntityQuery _xformQuery = default!; private readonly HashSet _handledEntities = new(); private const float DefaultLoadRange = 16f; @@ -85,10 +81,6 @@ public sealed partial class BiomeSystem : SharedBiomeSystem { base.Initialize(); Log.Level = LogLevel.Debug; - _biomeQuery = GetEntityQuery(); - _fixturesQuery = GetEntityQuery(); - _ghostQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); SubscribeLocalEvent(OnBiomeMapInit); SubscribeLocalEvent(OnFTLStarted); SubscribeLocalEvent(OnShuttleFlatten); @@ -924,11 +916,9 @@ public sealed partial class BiomeSystem : SharedBiomeSystem // Ideally any entities that aren't modified just get deleted and re-generated later // This is because if we want to save the map (e.g. persistent server) it makes the file much smaller // and also if the map is enormous will make stuff like physics broadphase much faster - var xformQuery = GetEntityQuery(); - foreach (var (ent, tile) in component.LoadedEntities[chunk]) { - if (Deleted(ent) || !xformQuery.TryGetComponent(ent, out var xform)) + if (Deleted(ent) || !TryComp(ent, out TransformComponent? xform)) { modified.Add(tile); continue; diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs index f8a5cc8430..cf6138423a 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Emitter.cs @@ -14,8 +14,7 @@ public sealed partial class ParticleAcceleratorSystem if (!Resolve(uid, ref emitter)) return; - var xformQuery = GetEntityQuery(); - if (!xformQuery.TryGetComponent(uid, out var xform)) + if (!TryComp(uid, out TransformComponent? xform)) { Log.Error("ParticleAccelerator attempted to emit a particle without (having) a transform from which to base its initial position and orientation."); return; @@ -23,12 +22,12 @@ public sealed partial class ParticleAcceleratorSystem var emitted = Spawn(emitter.EmittedPrototype, xform.Coordinates); - if (xformQuery.TryGetComponent(emitted, out var particleXform)) + if (TryComp(emitted, out TransformComponent? particleXform)) _transformSystem.SetLocalRotation(emitted, xform.LocalRotation, particleXform); if (TryComp(emitted, out var particlePhys)) { - var angle = _transformSystem.GetWorldRotation(uid, xformQuery); + var angle = _transformSystem.GetWorldRotation(uid); _physicsSystem.SetBodyStatus(emitted, particlePhys, BodyStatus.InAir); var velocity = angle.ToWorldVec() * 20f; diff --git a/Content.Server/Physics/Controllers/MoverController.cs b/Content.Server/Physics/Controllers/MoverController.cs index 68f5e4a1ba..1fe140bb63 100644 --- a/Content.Server/Physics/Controllers/MoverController.cs +++ b/Content.Server/Physics/Controllers/MoverController.cs @@ -22,11 +22,11 @@ public sealed partial class MoverController : SharedMoverController [Dependency] private ThrusterSystem _thruster = default!; - private Dictionary)> _shuttlePilots = new(); + [Dependency] private EntityQuery _activeQuery = default!; + [Dependency] private EntityQuery _droneQuery = default!; + [Dependency] private EntityQuery _shuttleQuery = default!; - private EntityQuery _activeQuery; - private EntityQuery _droneQuery; - private EntityQuery _shuttleQuery; + private Dictionary)> _shuttlePilots = new(); // Not needed for persistence; just used to save an alloc private readonly HashSet _seenMovers = []; @@ -44,10 +44,6 @@ public sealed partial class MoverController : SharedMoverController SubscribeLocalEvent(OnRelayPlayerDetached); SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); - - _activeQuery = GetEntityQuery(); - _droneQuery = GetEntityQuery(); - _shuttleQuery = GetEntityQuery(); } private void OnEntityPaused(Entity ent, ref EntityPausedEvent args) diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs index da42df6c88..ae28365c40 100644 --- a/Content.Server/Pinpointer/NavMapSystem.cs +++ b/Content.Server/Pinpointer/NavMapSystem.cs @@ -3,7 +3,6 @@ using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Station.Systems; using Content.Shared.Database; -using Content.Shared.Examine; using Content.Shared.Localizations; using Content.Shared.Maps; using Content.Shared.Pinpointer; @@ -29,13 +28,13 @@ public sealed partial class NavMapSystem : SharedNavMapSystem [Dependency] private IGameTiming _gameTiming = default!; [Dependency] private TurfSystem _turfSystem = default!; + [Dependency] private EntityQuery _airtightQuery = default!; + [Dependency] private EntityQuery _gridQuery = default!; + [Dependency] private EntityQuery _navQuery = default!; + public const float CloseDistance = 15f; public const float FarDistance = 30f; - private EntityQuery _airtightQuery; - private EntityQuery _gridQuery; - private EntityQuery _navQuery; - public override void Initialize() { base.Initialize(); @@ -44,10 +43,6 @@ public sealed partial class NavMapSystem : SharedNavMapSystem if (Categories != categories) throw new Exception($"{nameof(Categories)} must be equal to the number of chunk types"); - _airtightQuery = GetEntityQuery(); - _gridQuery = GetEntityQuery(); - _navQuery = GetEntityQuery(); - // Initialization events SubscribeLocalEvent(OnStationInit); diff --git a/Content.Server/Pinpointer/PinpointerSystem.cs b/Content.Server/Pinpointer/PinpointerSystem.cs index 0a4ea4d7f2..6ccc743361 100644 --- a/Content.Server/Pinpointer/PinpointerSystem.cs +++ b/Content.Server/Pinpointer/PinpointerSystem.cs @@ -12,12 +12,9 @@ public sealed partial class PinpointerSystem : SharedPinpointerSystem [Dependency] private SharedTransformSystem _transform = default!; [Dependency] private SharedAppearanceSystem _appearance = default!; - private EntityQuery _xformQuery; - public override void Initialize() { base.Initialize(); - _xformQuery = GetEntityQuery(); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnLocateTarget); @@ -121,7 +118,7 @@ public sealed partial class PinpointerSystem : SharedPinpointerSystem foreach (var (otherUid, _) in EntityManager.GetAllComponents(whitelist)) { - if (!_xformQuery.TryGetComponent(otherUid, out var compXform) || compXform.MapID != mapId) + if (!TryComp(otherUid, out TransformComponent? compXform) || compXform.MapID != mapId) continue; var dist = (_transform.GetWorldPosition(compXform) - worldPos).LengthSquared(); @@ -175,12 +172,10 @@ public sealed partial class PinpointerSystem : SharedPinpointerSystem /// Null if failed to calculate distance between two entities private Vector2? CalculateDirection(EntityUid pinUid, EntityUid trgUid) { - var xformQuery = GetEntityQuery(); - // check if entities have transform component - if (!xformQuery.TryGetComponent(pinUid, out var pin)) + if (!TryComp(pinUid, out TransformComponent? pin)) return null; - if (!xformQuery.TryGetComponent(trgUid, out var trg)) + if (!TryComp(trgUid, out TransformComponent? trg)) return null; // check if they are on same map @@ -188,7 +183,7 @@ public sealed partial class PinpointerSystem : SharedPinpointerSystem return null; // get world direction vector - var dir = _transform.GetWorldPosition(trg, xformQuery) - _transform.GetWorldPosition(pin, xformQuery); + var dir = _transform.GetWorldPosition(trg) - _transform.GetWorldPosition(pin); return dir; } diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index c066211918..f7fed9a154 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -46,6 +46,7 @@ namespace Content.Server.Pointing.EntitySystems [Dependency] private SharedMapSystem _map = default!; [Dependency] private IAdminLogManager _adminLogger = default!; [Dependency] private ExamineSystemShared _examine = default!; + [Dependency] private EntityQuery _inventoryQuery = default!; private TimeSpan _pointDelay = TimeSpan.FromSeconds(0.5f); @@ -213,10 +214,9 @@ namespace Content.Server.Pointing.EntitySystems EntityUid? containingInventory = null; // Search up through the target's containing containers until we find an inventory - var inventoryQuery = GetEntityQuery(); foreach (var container in _container.GetContainingContainers(pointed)) { - if (inventoryQuery.HasComp(container.Owner)) + if (_inventoryQuery.HasComp(container.Owner)) { // We want the innermost inventory, since that's the "owner" of the item containingInventory = container.Owner; diff --git a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs index b1270ca163..062c81b9b4 100644 --- a/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs +++ b/Content.Server/Power/EntitySystems/ExtensionCableSystem.cs @@ -9,6 +9,7 @@ namespace Content.Server.Power.EntitySystems public sealed partial class ExtensionCableSystem : EntitySystem { [Dependency] private SharedMapSystem _map = default!; + [Dependency] private EntityQuery _cableProviderQuery = default!; public override void Initialize() { @@ -255,25 +256,22 @@ namespace Content.Server.Power.EntitySystems var coordinates = xform.Coordinates; var nearbyEntities = _map.GetCellsInSquareArea(xform.GridUid.Value, grid, coordinates, (int)Math.Ceiling(range / grid.TileSize)); - var cableQuery = GetEntityQuery(); - var metaQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); Entity? closestCandidate = null; var closestDistanceFound = float.MaxValue; foreach (var entity in nearbyEntities) { - if (entity == owner || !cableQuery.TryGetComponent(entity, out var provider) || !provider.Connectable) + if (entity == owner || !_cableProviderQuery.TryGetComponent(entity, out var provider) || !provider.Connectable) continue; if (EntityManager.IsQueuedForDeletion(entity)) continue; - if (!metaQuery.TryGetComponent(entity, out var meta) || meta.EntityLifeStage > EntityLifeStage.MapInitialized) + if (!TryComp(entity, out MetaDataComponent? meta) || meta.EntityLifeStage > EntityLifeStage.MapInitialized) continue; // Find the closest provider - if (!xformQuery.TryGetComponent(entity, out var entityXform)) + if (!TryComp(entity, out TransformComponent? entityXform)) continue; var distance = (entityXform.LocalPosition - xform.LocalPosition).Length(); if (distance >= closestDistanceFound) diff --git a/Content.Server/Power/EntitySystems/PowerNetSystem.cs b/Content.Server/Power/EntitySystems/PowerNetSystem.cs index bf6518dc07..93b47c5331 100644 --- a/Content.Server/Power/EntitySystems/PowerNetSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerNetSystem.cs @@ -26,22 +26,20 @@ namespace Content.Server.Power.EntitySystems [Dependency] private IParallelManager _parMan = default!; [Dependency] private BatterySystem _battery = default!; + [Dependency] private EntityQuery _apcBatteryQuery = default!; + [Dependency] private EntityQuery _powerNetworkBatteryQuery = default!; + [Dependency] private EntityQuery _batteryQuery = default!; + private readonly PowerState _powerState = new(); private readonly HashSet _powerNetReconnectQueue = new(); private readonly HashSet _apcNetReconnectQueue = new(); - private EntityQuery _apcBatteryQuery; - private EntityQuery _batteryQuery; - private BatteryRampPegSolver _solver = new(); public override void Initialize() { base.Initialize(); - _apcBatteryQuery = GetEntityQuery(); - _batteryQuery = GetEntityQuery(); - UpdatesAfter.Add(typeof(NodeGroupSystem)); _solver = new(_cfg.GetCVar(CCVars.DebugPow3rDisableParallel)); @@ -480,11 +478,9 @@ namespace Content.Server.Power.EntitySystems DoReconnectBasePowerNet(net, netNode); - var batteryQuery = GetEntityQuery(); - foreach (var apc in net.Apcs) { - var netBattery = batteryQuery.GetComponent(apc.Owner); + var netBattery = _powerNetworkBatteryQuery.GetComponent(apc.Owner); netNode.BatterySupplies.Add(netBattery.NetworkBattery.Id); netBattery.NetworkBattery.LinkedNetworkDischarging = netNode.Id; } @@ -501,18 +497,16 @@ namespace Content.Server.Power.EntitySystems DoReconnectBasePowerNet(net, netNode); - var batteryQuery = GetEntityQuery(); - foreach (var charger in net.Chargers) { - var battery = batteryQuery.GetComponent(charger.Owner); + var battery = _powerNetworkBatteryQuery.GetComponent(charger.Owner); netNode.BatteryLoads.Add(battery.NetworkBattery.Id); battery.NetworkBattery.LinkedNetworkCharging = netNode.Id; } foreach (var discharger in net.Dischargers) { - var battery = batteryQuery.GetComponent(discharger.Owner); + var battery = _powerNetworkBatteryQuery.GetComponent(discharger.Owner); netNode.BatterySupplies.Add(battery.NetworkBattery.Id); battery.NetworkBattery.LinkedNetworkDischarging = netNode.Id; } diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index f40b833bd4..db30708a15 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -15,8 +15,10 @@ namespace Content.Server.Power.EntitySystems public sealed partial class PowerReceiverSystem : SharedPowerReceiverSystem { [Dependency] private IAdminManager _adminManager = default!; - private EntityQuery _recQuery; - private EntityQuery _provQuery; + + [Dependency] private EntityQuery _recQuery = default!; + [Dependency] private EntityQuery _provQuery = default!; + [Dependency] private EntityQuery _handsQuery = default!; public override void Initialize() { @@ -34,9 +36,6 @@ namespace Content.Server.Power.EntitySystems SubscribeLocalEvent>(AddSwitchPowerVerb); SubscribeLocalEvent(OnGetState); - - _recQuery = GetEntityQuery(); - _provQuery = GetEntityQuery(); } private void OnExamined(Entity ent, ref ExaminedEvent args) @@ -112,7 +111,7 @@ namespace Content.Server.Power.EntitySystems if(!args.CanAccess || !args.CanInteract) return; - if (!HasComp(args.User)) + if (!_handsQuery.HasComp(args.User)) return; if (!_recQuery.TryGetComponent(uid, out var receiver)) diff --git a/Content.Server/Power/Generation/Teg/TegSystem.cs b/Content.Server/Power/Generation/Teg/TegSystem.cs index 12ca09a7be..d1e18875bf 100644 --- a/Content.Server/Power/Generation/Teg/TegSystem.cs +++ b/Content.Server/Power/Generation/Teg/TegSystem.cs @@ -72,8 +72,7 @@ public sealed partial class TegSystem : EntitySystem [Dependency] private DeviceNetworkSystem _deviceNetwork = default!; [Dependency] private PointLightSystem _pointLight = default!; [Dependency] private SharedPowerReceiverSystem _receiver = default!; - - private EntityQuery _nodeContainerQuery; + [Dependency] private EntityQuery _nodeContainerQuery = default!; public override void Initialize() { @@ -84,8 +83,6 @@ public sealed partial class TegSystem : EntitySystem SubscribeLocalEvent(DeviceNetworkPacketReceived); SubscribeLocalEvent(GeneratorExamined); - - _nodeContainerQuery = GetEntityQuery(); } private void GeneratorExamined(EntityUid uid, TegGeneratorComponent component, ExaminedEvent args) diff --git a/Content.Server/Procedural/DungeonSystem.cs b/Content.Server/Procedural/DungeonSystem.cs index 5b6450eb7a..6b4287d4e7 100644 --- a/Content.Server/Procedural/DungeonSystem.cs +++ b/Content.Server/Procedural/DungeonSystem.cs @@ -1,6 +1,5 @@ using System.Threading; using System.Threading.Tasks; -using Content.Server.Construction; using Robust.Shared.CPUJob.JobQueues.Queues; using Content.Server.Decals; using Content.Server.GameTicking.Events; @@ -10,9 +9,6 @@ using Content.Shared.GameTicking; using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Procedural; -using Content.Shared.Tag; -using Robust.Server.GameObjects; -using Robust.Shared.Collections; using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.EntitySerialization; diff --git a/Content.Server/Radiation/Systems/RadiationSystem.cs b/Content.Server/Radiation/Systems/RadiationSystem.cs index 83ef294afb..ec354d723d 100644 --- a/Content.Server/Radiation/Systems/RadiationSystem.cs +++ b/Content.Server/Radiation/Systems/RadiationSystem.cs @@ -17,6 +17,7 @@ public sealed partial class RadiationSystem : SharedRadiationSystem [Dependency] private SharedStackSystem _stack = default!; [Dependency] private SharedMapSystem _maps = default!; + [Dependency] private EntityQuery _receiverQuery = default!; [Dependency] private EntityQuery _blockerQuery = default!; [Dependency] private EntityQuery _resistanceQuery = default!; [Dependency] private EntityQuery _gridQuery = default!; diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index b1a4f244b4..2648400c11 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -27,19 +27,16 @@ public sealed partial class RadioSystem : EntitySystem [Dependency] private IPrototypeManager _prototype = default!; [Dependency] private IRobustRandom _random = default!; [Dependency] private ChatSystem _chat = default!; + [Dependency] private EntityQuery _exemptQuery = default!; // set used to prevent radio feedback loops. private readonly HashSet _messages = new(); - private EntityQuery _exemptQuery; - public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnIntrinsicReceive); SubscribeLocalEvent(OnIntrinsicSpeak); - - _exemptQuery = GetEntityQuery(); } private void OnIntrinsicSpeak(EntityUid uid, IntrinsicRadioTransmitterComponent component, EntitySpokeEvent args) diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs index 3037f40852..2a1d239133 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs @@ -4,7 +4,6 @@ using Content.Shared.Revenant; using Robust.Shared.Random; using Content.Shared.Tag; using Content.Shared.Storage.Components; -using Content.Server.Light.Components; using Content.Server.Ghost; using Robust.Shared.Physics; using Content.Shared.Throwing; @@ -47,6 +46,12 @@ public sealed partial class RevenantSystem [Dependency] private SharedTransformSystem _transformSystem = default!; [Dependency] private SharedMapSystem _mapSystem = default!; + [Dependency] private EntityQuery _tagQuery = default!; + [Dependency] private EntityQuery _entityStorageQuery = default!; + [Dependency] private EntityQuery _itemQuery = default!; + [Dependency] private EntityQuery _poweredLightQuery = default!; + [Dependency] private EntityQuery _mobStateQuery = default!; + private static readonly ProtoId WindowTag = "Window"; private void InitializeAbilities() @@ -76,7 +81,7 @@ public sealed partial class RevenantSystem return; } - if (!HasComp(target) || !HasComp(target) || HasComp(target)) + if (!_mobStateQuery.HasComp(target) || !HasComp(target) || HasComp(target)) return; args.Handled = true; @@ -143,7 +148,7 @@ public sealed partial class RevenantSystem return; } - if (TryComp(target, out var mobstate) && mobstate.CurrentState == MobState.Alive && !HasComp(target)) + if (_mobStateQuery.TryComp(target, out var mobstate) && mobstate.CurrentState == MobState.Alive && !HasComp(target)) { _popup.PopupEntity(Loc.GetString("revenant-soul-too-powerful"), target, uid); return; @@ -198,7 +203,7 @@ public sealed partial class RevenantSystem _store.TryAddCurrency(new Dictionary { {component.StolenEssenceCurrencyPrototype, essence.EssenceAmount} }, uid); - if (!HasComp(args.Args.Target)) + if (!_mobStateQuery.HasComp(args.Args.Target)) return; if (_mobState.IsAlive(args.Args.Target.Value) || _mobState.IsCritical(args.Args.Target.Value)) @@ -228,8 +233,6 @@ public sealed partial class RevenantSystem args.Handled = true; - //var coords = Transform(uid).Coordinates; - //var gridId = coords.GetGridUid(EntityManager); var xform = Transform(uid); if (!TryComp(xform.GridUid, out var map)) return; @@ -250,15 +253,10 @@ public sealed partial class RevenantSystem } var lookup = _lookup.GetEntitiesInRange(uid, component.DefileRadius, LookupFlags.Approximate | LookupFlags.Static); - var tags = GetEntityQuery(); - var entityStorage = GetEntityQuery(); - var items = GetEntityQuery(); - var lights = GetEntityQuery(); - foreach (var ent in lookup) { //break windows - if (tags.HasComponent(ent) && _tag.HasTag(ent, WindowTag)) + if (_tagQuery.HasComponent(ent) && _tag.HasTag(ent, WindowTag)) { //hardcoded damage specifiers til i die. var dspec = new DamageSpecifier(); @@ -270,16 +268,16 @@ public sealed partial class RevenantSystem continue; //randomly opens some lockers and such. - if (entityStorage.TryGetComponent(ent, out var entstorecomp)) + if (_entityStorageQuery.TryGetComponent(ent, out var entstorecomp)) _entityStorage.OpenStorage(ent, entstorecomp); //chucks shit - if (items.HasComponent(ent) && + if (_itemQuery.HasComponent(ent) && TryComp(ent, out var phys) && phys.BodyType != BodyType.Static) _throwing.TryThrow(ent, _random.NextAngle().ToWorldVec()); //flicker lights - if (lights.HasComponent(ent)) + if (_poweredLightQuery.HasComponent(ent)) _ghost.DoGhostBooEvent(ent); } } @@ -295,17 +293,15 @@ public sealed partial class RevenantSystem args.Handled = true; var xform = Transform(uid); - var poweredLights = GetEntityQuery(); - var mobState = GetEntityQuery(); var lookup = _lookup.GetEntitiesInRange(uid, component.OverloadRadius); //TODO: feels like this might be a sin and a half foreach (var ent in lookup) { - if (!mobState.HasComponent(ent) || !_mobState.IsAlive(ent)) + if (!_mobStateQuery.HasComp(ent) || !_mobState.IsAlive(ent)) continue; var nearbyLights = _lookup.GetEntitiesInRange(ent, component.OverloadZapRadius) - .Where(e => poweredLights.HasComponent(e) && !HasComp(e) && + .Where(e => _poweredLightQuery.HasComp(e) && !HasComp(e) && _interact.InRangeUnobstructed(e, uid, -1)).ToArray(); if (!nearbyLights.Any()) diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs index e76ce1e646..e6dae76609 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs @@ -1,5 +1,4 @@ using System.Numerics; -using Content.Server.Actions; using Content.Server.Atmos.EntitySystems; using Content.Server.GameTicking; using Content.Server.Store.Systems; diff --git a/Content.Server/Salvage/SalvageSystem.Magnet.cs b/Content.Server/Salvage/SalvageSystem.Magnet.cs index 6ca7b15658..644d7b9ea8 100644 --- a/Content.Server/Salvage/SalvageSystem.Magnet.cs +++ b/Content.Server/Salvage/SalvageSystem.Magnet.cs @@ -9,7 +9,6 @@ using Content.Shared.Salvage.Magnet; using Robust.Shared.Exceptions; using Robust.Shared.Map; using Robust.Shared.Prototypes; -using Robust.Shared.Random; namespace Content.Server.Salvage; @@ -17,18 +16,15 @@ public sealed partial class SalvageSystem { [Dependency] private IRuntimeLog _runtimeLog = default!; - private static readonly ProtoId MagnetChannel = "Supply"; + [Dependency] private EntityQuery _salvMobQuery = default!; + [Dependency] private EntityQuery _mobStateQuery = default!; - private EntityQuery _salvMobQuery; - private EntityQuery _mobStateQuery; + private static readonly ProtoId MagnetChannel = "Supply"; private List<(Entity Entity, EntityUid MapUid, Vector2 LocalPosition)> _detachEnts = new(); private void InitializeMagnet() { - _salvMobQuery = GetEntityQuery(); - _mobStateQuery = GetEntityQuery(); - SubscribeLocalEvent(OnMagnetDataMapInit); SubscribeLocalEvent(OnMagnetTargetSplit); @@ -346,7 +342,7 @@ public sealed partial class SalvageSystem } } - var magnetXform = _xformQuery.GetComponent(magnet.Owner); + var magnetXform = Transform(magnet.Owner); var magnetGridUid = magnetXform.GridUid; var attachedBounds = new Box2Rotated(); var mapId = MapId.Nullspace; @@ -354,7 +350,7 @@ public sealed partial class SalvageSystem if (magnetGridUid != null) { - var magnetGridXform = _xformQuery.GetComponent(magnetGridUid.Value); + var magnetGridXform = Transform(magnetGridUid.Value); var (gridPos, gridRot) = _transform.GetWorldPositionRotation(magnetGridXform); var gridAABB = _gridQuery.GetComponent(magnetGridUid.Value).LocalAABB; @@ -386,7 +382,7 @@ public sealed partial class SalvageSystem // It worked, move it into position and cleanup values. while (mapChildren.MoveNext(out var mapChild)) { - var salvXForm = _xformQuery.GetComponent(mapChild); + var salvXForm = Transform(mapChild); var localPos = salvXForm.LocalPosition; _transform.SetParent(mapChild, salvXForm, spawnUid.Value); diff --git a/Content.Server/Salvage/SalvageSystem.cs b/Content.Server/Salvage/SalvageSystem.cs index dc00f7a1ea..23ad01b315 100644 --- a/Content.Server/Salvage/SalvageSystem.cs +++ b/Content.Server/Salvage/SalvageSystem.cs @@ -45,17 +45,12 @@ namespace Content.Server.Salvage [Dependency] private ShuttleConsoleSystem _shuttleConsoles = default!; [Dependency] private StationSystem _station = default!; [Dependency] private UserInterfaceSystem _ui = default!; - - private EntityQuery _gridQuery; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _gridQuery = default!; public override void Initialize() { base.Initialize(); - _gridQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - InitializeExpeditions(); InitializeMagnet(); InitializeRunner(); diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs index 38faff7a9a..de33473616 100644 --- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs +++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.cs @@ -26,11 +26,10 @@ public sealed partial class SensorMonitoringConsoleSystem : EntitySystem // Deleting connected devices causes exceptions // UI sucks. need a way to make basic dashboards like Grafana, and save them. - private EntityQuery _deviceNetworkQuery; - [Dependency] private IGameTiming _gameTiming = default!; [Dependency] private DeviceNetworkSystem _deviceNetwork = default!; [Dependency] private UserInterfaceSystem _userInterface = default!; + [Dependency] private EntityQuery _deviceNetworkQuery = default!; public override void Initialize() { @@ -44,8 +43,6 @@ public sealed partial class SensorMonitoringConsoleSystem : EntitySystem SubscribeLocalEvent(ConsoleStartup); SubscribeLocalEvent(DevicePacketReceived); SubscribeLocalEvent(AtmosUpdate); - - _deviceNetworkQuery = GetEntityQuery(); } public override void Update(float frameTime) diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index a1831ad46e..824ac48d26 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -64,9 +64,9 @@ public sealed partial class ArrivalsSystem : EntitySystem [Dependency] private StationSystem _station = default!; [Dependency] private AntagSelectionSystem _antag = default!; - private EntityQuery _pendingQuery; - private EntityQuery _blacklistQuery; - private EntityQuery _mobQuery; + [Dependency] private EntityQuery _pendingQuery = default!; + [Dependency] private EntityQuery _blacklistQuery = default!; + [Dependency] private EntityQuery _mobQuery = default!; /// /// If enabled then spawns players on an alternate map so they can take a shuttle to the station. @@ -107,10 +107,6 @@ public sealed partial class ArrivalsSystem : EntitySystem SubscribeLocalEvent(SendDirections); - _pendingQuery = GetEntityQuery(); - _blacklistQuery = GetEntityQuery(); - _mobQuery = GetEntityQuery(); - // Don't invoke immediately as it will get set in the natural course of things. Enabled = _cfgManager.GetCVar(CCVars.ArrivalsShuttles); ArrivalsGodmode = _cfgManager.GetCVar(CCVars.GodmodeArrivals); diff --git a/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs b/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs index 57ebf13e73..f660e677f1 100644 --- a/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs +++ b/Content.Server/Shuttles/Systems/DockingSystem.Shuttle.cs @@ -37,10 +37,10 @@ public sealed partial class DockingSystem /// Checks if 2 docks can be connected by moving the shuttle directly onto docks. /// private bool CanDock( + EntityUid shuttleDockUid, DockingComponent shuttleDock, - TransformComponent shuttleDockXform, + EntityUid gridDockUid, DockingComponent gridDock, - TransformComponent gridDockXform, Box2 shuttleAABB, Angle targetGridRotation, FixturesComponent shuttleFixtures, @@ -54,6 +54,9 @@ public sealed partial class DockingSystem gridRotation = Angle.Zero; matty = Matrix3x2.Identity; + var shuttleDockXform = Transform(shuttleDockUid); + var gridDockXform = Transform(gridDockUid); + if (shuttleDock.Docked || gridDock.Docked || !shuttleDockXform.Anchored || @@ -164,7 +167,7 @@ public sealed partial class DockingSystem return validDockConfigs; var targetGridGrid = _gridQuery.GetComponent(targetGrid); - var targetGridXform = _xformQuery.GetComponent(targetGrid); + var targetGridXform = Transform(targetGrid); var targetGridAngle = _transform.GetWorldRotation(targetGridXform).Reduced(); var shuttleFixturesComp = Comp(shuttleUid); var shuttleAABB = _gridQuery.GetComponent(shuttleUid).LocalAABB; @@ -177,15 +180,13 @@ public sealed partial class DockingSystem // We'll try all combinations of shuttle docks and see which one is most suitable foreach (var (dockUid, shuttleDock) in shuttleDocks) { - var shuttleDockXform = _xformQuery.GetComponent(dockUid); - foreach (var (gridDockUid, gridDock) in gridDocks) { - var gridXform = _xformQuery.GetComponent(gridDockUid); - if (!CanDock( - shuttleDock, shuttleDockXform, - gridDock, gridXform, + dockUid, + shuttleDock, + gridDockUid, + gridDock, shuttleAABB, targetGridAngle, shuttleFixturesComp, @@ -236,10 +237,10 @@ public sealed partial class DockingSystem continue; if (!CanDock( + otherUid, other, - _xformQuery.GetComponent(otherUid), + otherGridUid, otherGrid, - _xformQuery.GetComponent(otherGridUid), shuttleAABB, targetGridAngle, shuttleFixturesComp, diff --git a/Content.Server/Shuttles/Systems/DockingSystem.cs b/Content.Server/Shuttles/Systems/DockingSystem.cs index b55e554280..c9d1847536 100644 --- a/Content.Server/Shuttles/Systems/DockingSystem.cs +++ b/Content.Server/Shuttles/Systems/DockingSystem.cs @@ -1,4 +1,3 @@ -using System.Numerics; using Content.Server.Doors.Systems; using Content.Server.NPC.Pathfinding; using Content.Server.Shuttles.Components; @@ -6,13 +5,10 @@ using Content.Server.Shuttles.Events; using Content.Shared.Doors; using Content.Shared.Doors.Components; using Content.Shared.Popups; -using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Events; using Content.Shared.Shuttles.Systems; using Robust.Shared.Map; using Robust.Shared.Map.Components; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Dynamics.Joints; using Robust.Shared.Physics.Systems; @@ -32,11 +28,11 @@ namespace Content.Server.Shuttles.Systems [Dependency] private SharedPopupSystem _popup = default!; [Dependency] private SharedTransformSystem _transform = default!; - private const string DockingJoint = "docking"; + [Dependency] private EntityQuery _gridQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; + [Dependency] private EntityQuery _dockingQuery = default!; - private EntityQuery _gridQuery; - private EntityQuery _physicsQuery; - private EntityQuery _xformQuery; + private const string DockingJoint = "docking"; private readonly HashSet> _dockingSet = new(); private readonly HashSet> _dockingBoltSet = new(); @@ -44,9 +40,6 @@ namespace Content.Server.Shuttles.Systems public override void Initialize() { base.Initialize(); - _gridQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnShutdown); @@ -94,7 +87,7 @@ namespace Content.Server.Shuttles.Systems private void OnShutdown(EntityUid uid, DockingComponent component, ComponentShutdown args) { if (component.DockedWith == null || - Comp(uid).EntityLifeStage > EntityLifeStage.MapInitialized) + MetaData(uid).EntityLifeStage > EntityLifeStage.MapInitialized) { return; } @@ -119,7 +112,7 @@ namespace Content.Server.Shuttles.Systems var dockBUid = dockA.DockedWith; if (dockBUid == null || - !TryComp(dockBUid, out DockingComponent? dockB)) + !_dockingQuery.TryComp(dockBUid, out var dockB)) { DebugTools.Assert(false); Log.Error($"Tried to cleanup {dockAUid} but not docked?"); @@ -137,8 +130,8 @@ namespace Content.Server.Shuttles.Systems dockA.DockJointId = null; // If these grids are ever null then need to look at fixing ordering for unanchored events elsewhere. - var gridAUid = Comp(dockAUid).GridUid; - var gridBUid = Comp(dockBUid.Value).GridUid; + var gridAUid = Transform(dockAUid).GridUid; + var gridBUid = Transform(dockBUid.Value).GridUid; var msg = new UndockEvent { @@ -159,7 +152,7 @@ namespace Content.Server.Shuttles.Systems var component = entity.Comp; // Use startup so transform already initialized - if (!Comp(uid).Anchored) + if (!Transform(uid).Anchored) return; // This little gem is for docking deserialization @@ -169,7 +162,7 @@ namespace Content.Server.Shuttles.Systems if (MetaData(component.DockedWith.Value).EntityLifeStage < EntityLifeStage.Initialized) return; - var otherDock = Comp(component.DockedWith.Value); + var otherDock = _dockingQuery.Comp(component.DockedWith.Value); DebugTools.Assert(otherDock.DockedWith != null); Dock((uid, component), (component.DockedWith.Value, otherDock)); @@ -220,8 +213,8 @@ namespace Content.Server.Shuttles.Systems // https://gamedev.stackexchange.com/questions/98772/b2distancejoint-with-frequency-equal-to-0-vs-b2weldjoint // We could also potentially use a prismatic joint? Depending if we want clamps that can extend or whatever - var dockAXform = Comp(dockAUid); - var dockBXform = Comp(dockBUid); + var dockAXform = Transform(dockAUid); + var dockBXform = Transform(dockBUid); DebugTools.Assert(dockAXform.GridUid != null); DebugTools.Assert(dockBXform.GridUid != null); @@ -235,8 +228,8 @@ namespace Content.Server.Shuttles.Systems SharedJointSystem.LinearStiffness( 2f, 0.7f, - Comp(gridA).Mass, - Comp(gridB).Mass, + _physicsQuery.Comp(gridA).Mass, + _physicsQuery.Comp(gridB).Mass, out var stiffness, out var damping); @@ -255,8 +248,8 @@ namespace Content.Server.Shuttles.Systems joint = _jointSystem.GetOrCreateWeldJoint(gridA, gridB, DockingJoint + dockAUid); } - var gridAXform = Comp(gridA); - var gridBXform = Comp(gridB); + var gridAXform = Transform(gridA); + var gridBXform = Transform(gridB); var anchorA = dockAXform.LocalPosition + dockAXform.LocalRotation.ToWorldVec() / 2f; var anchorB = dockBXform.LocalPosition + dockBXform.LocalRotation.ToWorldVec() / 2f; @@ -359,7 +352,7 @@ namespace Content.Server.Shuttles.Systems private void OnRequestUndock(EntityUid uid, ShuttleConsoleComponent component, UndockRequestMessage args) { if (!TryGetEntity(args.DockEntity, out var dockEnt) || - !TryComp(dockEnt, out DockingComponent? dockComp)) + !_dockingQuery.TryComp(dockEnt, out var dockComp)) { _popup.PopupCursor(Loc.GetString("shuttle-console-undock-fail")); return; @@ -396,8 +389,8 @@ namespace Content.Server.Shuttles.Systems if (!TryGetEntity(args.DockEntity, out var ourDock) || !TryGetEntity(args.TargetDockEntity, out var targetDock) || - !TryComp(ourDock, out DockingComponent? ourDockComp) || - !TryComp(targetDock, out DockingComponent? targetDockComp)) + !_dockingQuery.TryComp(ourDock, out var ourDockComp) || + !_dockingQuery.TryComp(targetDock, out var targetDockComp)) { _popup.PopupCursor(Loc.GetString("shuttle-console-dock-fail")); return; diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs index eac2535e8b..d9ac71cc87 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs @@ -1,11 +1,8 @@ using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; -using Content.Shared.Shuttles.BUIStates; -using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Events; using Content.Shared.Shuttles.UI.MapObjects; using Robust.Shared.Map; -using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; namespace Content.Server.Shuttles.Systems; @@ -38,7 +35,7 @@ public sealed partial class ShuttleConsoleSystem private void OnBeaconFTLMessage(Entity ent, ref ShuttleConsoleFTLBeaconMessage args) { var beaconEnt = GetEntity(args.Beacon); - if (!_xformQuery.TryGetComponent(beaconEnt, out var targetXform)) + if (!TryComp(beaconEnt, out TransformComponent? targetXform)) { return; } @@ -82,14 +79,14 @@ public sealed partial class ShuttleConsoleSystem while (beaconQuery.MoveNext(out var destUid, out _)) { - var meta = _metaQuery.GetComponent(destUid); + var meta = MetaData(destUid); var name = meta.EntityName; if (string.IsNullOrEmpty(name)) name = Loc.GetString("shuttle-console-unknown"); // Can't travel to same map (yet) - var destXform = _xformQuery.GetComponent(destUid); + var destXform = Transform(destUid); beacons ??= new List(); beacons.Add(new ShuttleBeaconObject(GetNetEntity(destUid), GetNetCoordinates(destXform.Coordinates), name)); } @@ -119,7 +116,7 @@ public sealed partial class ShuttleConsoleSystem if (consoleUid == null) return; - var shuttleUid = _xformQuery.GetComponent(consoleUid.Value).GridUid; + var shuttleUid = Transform(consoleUid.Value).GridUid; if (!TryComp(shuttleUid, out ShuttleComponent? shuttleComp)) return; diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index ff5208cebf..ce11a47f28 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -1,4 +1,3 @@ -using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; @@ -38,9 +37,7 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem [Dependency] private TagSystem _tags = default!; [Dependency] private UserInterfaceSystem _ui = default!; [Dependency] private SharedContentEyeSystem _eyeSystem = default!; - - private EntityQuery _metaQuery; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _pilotQuery = default!; private readonly HashSet> _consoles = new(); @@ -50,9 +47,6 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem { base.Initialize(); - _metaQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - SubscribeLocalEvent(OnConsoleShutdown); SubscribeLocalEvent(OnConsolePowerChange); SubscribeLocalEvent(OnConsoleAnchorChange); @@ -231,7 +225,7 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem Angle = xform.LocalRotation, Entity = GetNetEntity(uid), GridDockedWith = - _xformQuery.TryGetComponent(comp.DockedWith, out var otherDockXform) ? + TryComp(comp.DockedWith, out TransformComponent? otherDockXform) ? GetNetEntity(otherDockXform.GridUid) : null, Color = comp.RadarColor, @@ -335,7 +329,7 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem pilotComponent.Console = uid; ActionBlockerSystem.UpdateCanMove(entity); - pilotComponent.Position = Comp(entity).Coordinates; + pilotComponent.Position = Transform(entity).Coordinates; Dirty(entity, pilotComponent); } @@ -371,10 +365,9 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem public void ClearPilots(ShuttleConsoleComponent component) { - var query = GetEntityQuery(); while (component.SubscribedPilots.TryGetValue(0, out var pilot)) { - if (query.TryGetComponent(pilot, out var pilotComponent)) + if (_pilotQuery.TryGetComponent(pilot, out var pilotComponent)) RemovePilot(pilot, pilotComponent); } } diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 54bfdbad14..60568a5b04 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -10,7 +10,6 @@ using Content.Shared.Database; using Content.Shared.Parallax; using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Systems; -using Content.Shared.StatusEffect; using Content.Shared.Timing; using Content.Shared.Whitelist; using JetBrains.Annotations; @@ -24,7 +23,6 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Player; using Robust.Shared.Utility; using FTLMapComponent = Content.Shared.Shuttles.Components.FTLMapComponent; -using Robust.Shared.Random; namespace Content.Server.Shuttles.Systems; @@ -34,6 +32,11 @@ public sealed partial class ShuttleSystem * This is a way to move a shuttle from one location to another, via an intermediate map for fanciness. */ + [Dependency] private EntityQuery _bodyQuery = default!; + [Dependency] private EntityQuery _immuneQuery = default!; + [Dependency] private EntityQuery _mapGridQuery = default!; + [Dependency] private EntityQuery _mapQuery = default!; + private readonly SoundSpecifier _startupSound = new SoundPathSpecifier("/Audio/Effects/Shuttle/hyperspace_begin.ogg") { Params = AudioParams.Default.WithVolume(-5f), @@ -71,19 +74,11 @@ public sealed partial class ShuttleSystem private readonly HashSet _immuneEnts = new(); private readonly HashSet> _noFtls = new(); - private EntityQuery _bodyQuery; - private EntityQuery _immuneQuery; - private EntityQuery _statusQuery; - private void InitializeFTL() { SubscribeLocalEvent(OnStationPostInit); SubscribeLocalEvent(OnFtlShutdown); - _bodyQuery = GetEntityQuery(); - _immuneQuery = GetEntityQuery(); - _statusQuery = GetEntityQuery(); - _cfg.OnValueChanged(CCVars.FTLStartupTime, time => DefaultStartupTime = time, true); _cfg.OnValueChanged(CCVars.FTLTravelTime, time => DefaultTravelTime = time, true); _cfg.OnValueChanged(CCVars.FTLArrivalTime, time => DefaultArrivalTime = time, true); @@ -104,8 +99,7 @@ public sealed partial class ShuttleSystem // Add all grid maps as ftl destinations that anyone can FTL to. foreach (var gridUid in ev.Station.Comp.Grids) { - var gridXform = _xformQuery.GetComponent(gridUid); - + var gridXform = Transform(gridUid); if (gridXform.MapUid == null) { continue; @@ -226,7 +220,7 @@ public sealed partial class ShuttleSystem return false; } - if (TryComp(shuttleUid, out var shuttlePhysics)) + if (_physicsQuery.TryComp(shuttleUid, out var shuttlePhysics)) { // Too large to FTL @@ -371,7 +365,7 @@ public sealed partial class ShuttleSystem { var uid = entity.Owner; var comp = entity.Comp1; - var xform = _xformQuery.GetComponent(entity); + var xform = Transform(entity); DoTheDinosaur(xform); comp.State = FTLState.Travelling; @@ -379,7 +373,7 @@ public sealed partial class ShuttleSystem var fromMatrix = _transform.GetWorldMatrix(xform); var fromRotation = _transform.GetWorldRotation(xform); - var grid = Comp(uid); + var grid = _mapGridQuery.Comp(uid); var width = grid.LocalAABB.Width; var ftlMap = EnsureFTLMap(); var body = _physicsQuery.GetComponent(entity); @@ -461,7 +455,7 @@ public sealed partial class ShuttleSystem private void UpdateFTLArriving(Entity entity) { var uid = entity.Owner; - var xform = _xformQuery.GetComponent(uid); + var xform = Transform(uid); var body = _physicsQuery.GetComponent(uid); var comp = entity.Comp1; DoTheDinosaur(xform); @@ -488,8 +482,8 @@ public sealed partial class ShuttleSystem TryFTLProximity(uid, _mapSystem.GetMap(mapId)); } // Docking FTL - else if (HasComp(target.EntityId) && - !HasComp(target.EntityId)) + else if (_mapGridQuery.HasComp(target.EntityId) && + !_mapQuery.HasComp(target.EntityId)) { var config = _dockSystem.GetDockingConfigAt(uid, target.EntityId, target, entity.Comp1.TargetAngle); var mapCoordinates = _transform.ToMapCoordinates(target); @@ -521,7 +515,7 @@ public sealed partial class ShuttleSystem // Disable shuttle if it's on a planet; unfortunately can't do this in parent change messages due // to event ordering and awake body shenanigans (at least for now). - if (HasComp(xform.MapUid)) + if (_mapGridQuery.HasComp(xform.MapUid)) { Disable(uid, component: body); } @@ -600,7 +594,7 @@ public sealed partial class ShuttleSystem private float GetSoundRange(EntityUid uid) { - if (!TryComp(uid, out var grid)) + if (!_mapGridQuery.TryComp(uid, out var grid)) return 4f; return MathF.Max(grid.LocalAABB.Width, grid.LocalAABB.Height) + 12.5f; @@ -614,9 +608,9 @@ public sealed partial class ShuttleSystem // Get enumeration exceptions from people dropping things if we just paralyze as we go var toKnock = new ValueList(); KnockOverKids(xform, ref toKnock); - TryComp(xform.GridUid, out var grid); + _mapGridQuery.TryComp(xform.GridUid, out var grid); - if (TryComp(xform.GridUid, out var shuttleBody)) + if (_physicsQuery.TryComp(xform.GridUid, out var shuttleBody)) { foreach (var child in toKnock) { @@ -640,7 +634,7 @@ public sealed partial class ShuttleSystem foreach (var childUid in _noFtls) { - if (!_xformQuery.TryComp(childUid, out var childXform)) + if (!TryComp(childUid, out TransformComponent? childXform)) continue; // If we're not parented directly to the grid the matrix may be wrong. @@ -674,7 +668,7 @@ public sealed partial class ShuttleSystem { var shuttleGrid = shuttleEntity.Comp1; var shuttleBody = shuttleEntity.Comp2; - if (!_xformQuery.TryGetComponent(tossed, out var childXform)) + if (!TryComp(tossed, out TransformComponent? childXform)) return; // only toss if its on lattice/space @@ -717,8 +711,8 @@ public sealed partial class ShuttleSystem { config = null; - if (!_xformQuery.TryGetComponent(shuttleUid, out var shuttleXform) || - !_xformQuery.TryGetComponent(targetUid, out var targetXform) || + if (!TryComp(shuttleUid, out TransformComponent? shuttleXform) || + !TryComp(targetUid, out TransformComponent? targetXform) || targetXform.MapUid == null || !targetXform.MapUid.Value.IsValid()) { @@ -782,7 +776,7 @@ public sealed partial class ShuttleSystem // We essentially expand the Box2 of the target area until nothing else is added then we know it's valid. // Can't just get an AABB of every grid as we may spawn very far away. var nearbyGrids = new HashSet(); - var shuttleAABB = Comp(shuttleUid).LocalAABB; + var shuttleAABB = _mapGridQuery.Comp(shuttleUid).LocalAABB; // Start with small point. // If our target pos is offset we mot even intersect our target's AABB so we don't include it. @@ -819,7 +813,7 @@ public sealed partial class ShuttleSystem // Include the other grid's AABB (expanded by ours) as well. targetAABB = targetAABB.Union( _transform.GetWorldMatrix(grid) - .TransformBox(Comp(grid).LocalAABB.Enlarged(expansionAmount))); + .TransformBox(_mapGridQuery.Comp(grid).LocalAABB.Enlarged(expansionAmount))); } // Can do proximity @@ -844,7 +838,7 @@ public sealed partial class ShuttleSystem targetAABB = targetAABB.Union( _transform.GetWorldMatrix(uid) - .TransformBox(Comp(uid).LocalAABB.Enlarged(expansionAmount))); + .TransformBox(_mapGridQuery.Comp(uid).LocalAABB.Enlarged(expansionAmount))); } break; @@ -853,7 +847,7 @@ public sealed partial class ShuttleSystem // Now we have a targetAABB. This has already been expanded to account for our fat ass. Vector2 spawnPos; - if (TryComp(shuttleUid, out var shuttleBody)) + if (_physicsQuery.TryComp(shuttleUid, out var shuttleBody)) { _physics.SetLinearVelocity(shuttleUid, Vector2.Zero, body: shuttleBody); _physics.SetAngularVelocity(shuttleUid, 0f, body: shuttleBody); @@ -861,7 +855,7 @@ public sealed partial class ShuttleSystem // TODO: This should prefer the position's angle instead. // TODO: This is pretty crude for multiple landings. - if (nearbyGrids.Count > 1 || !HasComp(targetXform.GridUid)) + if (nearbyGrids.Count > 1 || !_mapQuery.HasComp(targetXform.GridUid)) { // Pick a random angle var offsetAngle = _random.NextAngle(); @@ -882,12 +876,12 @@ public sealed partial class ShuttleSystem var offset = Vector2.Zero; // Offset it because transform does not correspond to AABB position. - if (TryComp(shuttleUid, out MapGridComponent? shuttleGrid)) + if (_mapGridQuery.TryComp(shuttleUid, out var shuttleGrid)) { offset = -shuttleGrid.LocalAABB.Center; } - if (!HasComp(targetXform.GridUid)) + if (!_mapQuery.HasComp(targetXform.GridUid)) { angle = _random.NextAngle(); } @@ -986,7 +980,7 @@ public sealed partial class ShuttleSystem } // If it's on our grid ignore it. - if (!_xformQuery.TryComp(ent, out var childXform) || childXform.GridUid == uid) + if (!TryComp(ent, out TransformComponent? childXform) || childXform.GridUid == uid) { continue; } diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs index ca704d8e50..1f74cc64ea 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.GridFill.cs @@ -14,6 +14,8 @@ namespace Content.Server.Shuttles.Systems; public sealed partial class ShuttleSystem { + [Dependency] private EntityQuery _dockingQuery = default!; + private void InitializeGridFills() { SubscribeLocalEvent(OnGridSpawnPostInit); @@ -276,15 +278,11 @@ public sealed partial class ShuttleSystem private (EntityUid Entity, DockingComponent Component)? GetSingleDock(EntityUid uid) { - var dockQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var xform = xformQuery.GetComponent(uid); - - var rator = xform.ChildEnumerator; + var rator = Transform(uid).ChildEnumerator; while (rator.MoveNext(out var child)) { - if (!dockQuery.TryGetComponent(child, out var dock)) + if (!_dockingQuery.TryGetComponent(child, out var dock)) continue; return (child, dock); diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs index cbc48b3cca..3e1d18592b 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs @@ -2,14 +2,11 @@ using Content.Server.Shuttles.Components; using Content.Shared.Atmos.Components; using Content.Shared.Audio; using Content.Shared.CCVar; -using Content.Shared.Clothing; using Content.Shared.Damage; using Content.Shared.Database; -using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Projectiles; -using Content.Shared.Slippery; using Robust.Shared.Audio; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -27,6 +24,9 @@ namespace Content.Server.Shuttles.Systems; // shuttle impact damage ported from Goobstation (AGPLv3) with agreement of all coders involved public sealed partial class ShuttleSystem { + [Dependency] private EntityQuery _damageableQuery = default!; + [Dependency] private EntityQuery _movedByPressureQuery = default!; + private bool _enabled; private float _minimumImpactInertia; private float _minimumImpactVelocity; @@ -54,9 +54,6 @@ public sealed partial class ShuttleSystem private readonly ProtoId _platingId = "Plating"; private readonly EntProtoId _sparkEffect = "EffectSparks"; - private EntityQuery _dmgQuery; - private EntityQuery _projQuery; - private HashSet _countedEnts = new(); private HashSet _intersecting = new(); // for _adminLogSpacing @@ -66,9 +63,6 @@ public sealed partial class ShuttleSystem { SubscribeLocalEvent(OnShuttleCollide); - _dmgQuery = GetEntityQuery(); - _projQuery = GetEntityQuery(); - Subs.CVar(_cfg, CCVars.ImpactEnabled, value => _enabled = value, true); Subs.CVar(_cfg, CCVars.MinimumImpactInertia, value => _minimumImpactInertia = value, true); Subs.CVar(_cfg, CCVars.MinimumImpactInertia, value => _minimumImpactInertia = value, true); @@ -227,7 +221,6 @@ public sealed partial class ShuttleSystem /// private void ThrowEntitiesOnGrid(EntityUid gridUid, TransformComponent xform, Vector2 direction) { - var movedByPressureQuery = GetEntityQuery(); var knockdownTime = TimeSpan.FromSeconds(5); var minsq = _minThrowVelocity * _minThrowVelocity; @@ -250,7 +243,7 @@ public sealed partial class ShuttleSystem continue; // don't throw them if they have magboots - if (movedByPressureQuery.TryComp(ent, out var moved) && !moved.Enabled) + if (_movedByPressureQuery.TryComp(ent, out var moved) && !moved.Enabled) continue; if (direction.LengthSquared() > minsq) @@ -389,7 +382,7 @@ public sealed partial class ShuttleSystem if (MathF.Abs(toCenter.X) > 0.5f || MathF.Abs(toCenter.Y) > 0.5f) continue; - if (_dmgQuery.TryComp(localEnt, out var damageable)) + if (_damageableQuery.TryComp(localEnt, out var damageable)) { // Apply damage scaled by distance but capped to prevent gibbing var scaledDamage = tileData.Energy * _damageMultiplier; diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.cs index 67f92e36cd..0ff09e9e8b 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.cs @@ -64,20 +64,14 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem [Dependency] private UserInterfaceSystem _uiSystem = default!; [Dependency] private TurfSystem _turf = default!; - private EntityQuery _buckleQuery; - private EntityQuery _gridQuery; - private EntityQuery _physicsQuery; - private EntityQuery _xformQuery; + [Dependency] private EntityQuery _buckleQuery = default!; + [Dependency] private EntityQuery _gridQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; public override void Initialize() { base.Initialize(); - _buckleQuery = GetEntityQuery(); - _gridQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - InitializeFTL(); InitializeGridFills(); InitializeIFF(); diff --git a/Content.Server/Shuttles/Systems/SpaceGarbageSystem.cs b/Content.Server/Shuttles/Systems/SpaceGarbageSystem.cs index e3443edfd7..f00c543c67 100644 --- a/Content.Server/Shuttles/Systems/SpaceGarbageSystem.cs +++ b/Content.Server/Shuttles/Systems/SpaceGarbageSystem.cs @@ -10,12 +10,9 @@ namespace Content.Server.Shuttles.Systems; /// public sealed class SpaceGarbageSystem : EntitySystem { - private EntityQuery _xformQuery; - public override void Initialize() { base.Initialize(); - _xformQuery = GetEntityQuery(); SubscribeLocalEvent(OnCollide); } @@ -24,8 +21,8 @@ public sealed class SpaceGarbageSystem : EntitySystem if (args.OtherBody.BodyType != BodyType.Static) return; - var ourXform = _xformQuery.GetComponent(uid); - var otherXform = _xformQuery.GetComponent(args.OtherEntity); + var ourXform = Transform(uid); + var otherXform = Transform(args.OtherEntity); if (ourXform.GridUid == otherXform.GridUid) return; diff --git a/Content.Server/Shuttles/Systems/ThrusterSystem.cs b/Content.Server/Shuttles/Systems/ThrusterSystem.cs index 9837ffeb3c..33050c67e3 100644 --- a/Content.Server/Shuttles/Systems/ThrusterSystem.cs +++ b/Content.Server/Shuttles/Systems/ThrusterSystem.cs @@ -32,6 +32,9 @@ public sealed partial class ThrusterSystem : EntitySystem [Dependency] private SharedAppearanceSystem _appearance = default!; [Dependency] private TurfSystem _turf = default!; + [Dependency] private EntityQuery _thrusterQuery = default!; + [Dependency] private EntityQuery _appearanceQuery = default!; + // Essentially whenever thruster enables we update the shuttle's available impulses which are used for movement. // This is done for each direction available. @@ -100,8 +103,6 @@ public sealed partial class ThrusterSystem : EntitySystem var tilePos = change.GridIndices; var grid = Comp(uid); - var xformQuery = GetEntityQuery(); - var thrusterQuery = GetEntityQuery(); for (var x = -1; x <= 1; x++) { @@ -115,11 +116,11 @@ public sealed partial class ThrusterSystem : EntitySystem while (enumerator.MoveNext(out var ent)) { - if (!thrusterQuery.TryGetComponent(ent.Value, out var thruster) || !thruster.RequireSpace) + if (!_thrusterQuery.TryGetComponent(ent.Value, out var thruster) || !thruster.RequireSpace) continue; // Work out if the thruster is facing this direction - var xform = xformQuery.GetComponent(ent.Value); + var xform = Transform(ent.Value); var direction = xform.LocalRotation.ToWorldVec(); if (new Vector2i((int)direction.X, (int)direction.Y) != new Vector2i(x, y)) @@ -337,8 +338,6 @@ public sealed partial class ThrusterSystem : EntitySystem { // TODO: Only refresh relevant directions. var center = Vector2.Zero; - var thrustQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); foreach (var dir in new[] { Direction.South, Direction.East, Direction.North, Direction.West }) @@ -349,7 +348,7 @@ public sealed partial class ThrusterSystem : EntitySystem foreach (var ent in pop) { - if (!thrustQuery.TryGetComponent(ent, out var thruster) || !xformQuery.TryGetComponent(ent, out var xform)) + if (!_thrusterQuery.TryGetComponent(ent, out var thruster) || !TryComp(ent, out TransformComponent? xform)) continue; center += xform.LocalPosition * thruster.Thrust; @@ -511,16 +510,14 @@ public sealed partial class ThrusterSystem : EntitySystem component.ThrustDirections |= direction; var index = GetFlagIndex(direction); - var appearanceQuery = GetEntityQuery(); - var thrusterQuery = GetEntityQuery(); foreach (var uid in component.LinearThrusters[index]) { - if (!thrusterQuery.TryGetComponent(uid, out var comp)) + if (!_thrusterQuery.TryGetComponent(uid, out var comp)) continue; comp.Firing = true; - appearanceQuery.TryGetComponent(uid, out var appearance); + _appearanceQuery.TryGetComponent(uid, out var appearance); _appearance.SetData(uid, ThrusterVisualState.Thrusting, true, appearance); } } @@ -536,15 +533,13 @@ public sealed partial class ThrusterSystem : EntitySystem component.ThrustDirections &= ~direction; var index = GetFlagIndex(direction); - var appearanceQuery = GetEntityQuery(); - var thrusterQuery = GetEntityQuery(); foreach (var uid in component.LinearThrusters[index]) { - if (!thrusterQuery.TryGetComponent(uid, out var comp)) + if (!_thrusterQuery.TryGetComponent(uid, out var comp)) continue; - appearanceQuery.TryGetComponent(uid, out var appearance); + _appearanceQuery.TryGetComponent(uid, out var appearance); comp.Firing = false; _appearance.SetData(uid, ThrusterVisualState.Thrusting, false, appearance); } @@ -562,17 +557,14 @@ public sealed partial class ThrusterSystem : EntitySystem public void SetAngularThrust(ShuttleComponent component, bool on) { - var appearanceQuery = GetEntityQuery(); - var thrusterQuery = GetEntityQuery(); - if (on) { foreach (var uid in component.AngularThrusters) { - if (!thrusterQuery.TryGetComponent(uid, out var comp)) + if (!_thrusterQuery.TryGetComponent(uid, out var comp)) continue; - appearanceQuery.TryGetComponent(uid, out var appearance); + _appearanceQuery.TryGetComponent(uid, out var appearance); comp.Firing = true; _appearance.SetData(uid, ThrusterVisualState.Thrusting, true, appearance); } @@ -581,10 +573,10 @@ public sealed partial class ThrusterSystem : EntitySystem { foreach (var uid in component.AngularThrusters) { - if (!thrusterQuery.TryGetComponent(uid, out var comp)) + if (!_thrusterQuery.TryGetComponent(uid, out var comp)) continue; - appearanceQuery.TryGetComponent(uid, out var appearance); + _appearanceQuery.TryGetComponent(uid, out var appearance); comp.Firing = false; _appearance.SetData(uid, ThrusterVisualState.Thrusting, false, appearance); } diff --git a/Content.Server/Silicons/StationAi/StationAiSystem.cs b/Content.Server/Silicons/StationAi/StationAiSystem.cs index aa504326c1..f65fa7907b 100644 --- a/Content.Server/Silicons/StationAi/StationAiSystem.cs +++ b/Content.Server/Silicons/StationAi/StationAiSystem.cs @@ -362,9 +362,8 @@ public sealed partial class StationAiSystem : SharedStationAiSystem private void OnExpandICChatRecipients(ExpandICChatRecipientsEvent ev) { - var xformQuery = GetEntityQuery(); var sourceXform = Transform(ev.Source); - var sourcePos = _xforms.GetWorldPosition(sourceXform, xformQuery); + var sourcePos = _xforms.GetWorldPosition(sourceXform); // This function ensures that chat popups appear on camera views that have connected microphones. var query = EntityQueryEnumerator(); @@ -382,7 +381,7 @@ public sealed partial class StationAiSystem : SharedStationAiSystem var range = (xform.MapID != sourceXform.MapID) ? -1 - : (sourcePos - _xforms.GetWorldPosition(xform, xformQuery)).Length(); + : (sourcePos - _xforms.GetWorldPosition(xform)).Length(); if (range < 0 || range > ev.VoiceRange) continue; diff --git a/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs b/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs index 54360db856..9e2f6ecf2c 100644 --- a/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs @@ -12,7 +12,6 @@ using Robust.Server.GameObjects; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; -using Robust.Shared.Utility; namespace Content.Server.Singularity.EntitySystems; @@ -25,6 +24,7 @@ public sealed partial class ContainmentFieldGeneratorSystem : EntitySystem [Dependency] private SharedPointLightSystem _light = default!; [Dependency] private SharedTransformSystem _transformSystem = default!; [Dependency] private TagSystem _tags = default!; + [Dependency] private EntityQuery _genQuery = default!; public override void Initialize() { @@ -281,13 +281,12 @@ public sealed partial class ContainmentFieldGeneratorSystem : EntitySystem var ray = new CollisionRay(genWorldPosRot.WorldPosition, dirRad.ToVec(), component.CollisionMask); var rayCastResults = _physics.IntersectRay(gen1XForm.MapID, ray, component.MaxLength, generator, false); - var genQuery = GetEntityQuery(); RayCastResults? closestResult = null; foreach (var result in rayCastResults) { - if (genQuery.HasComponent(result.HitEntity)) + if (_genQuery.HasComponent(result.HitEntity)) closestResult = result; break; @@ -385,12 +384,10 @@ public sealed partial class ContainmentFieldGeneratorSystem : EntitySystem /// public void GridCheck(Entity generator) { - var xFormQuery = GetEntityQuery(); - foreach (var (_, generators) in generator.Comp.Connections) { - var gen1ParentGrid = xFormQuery.GetComponent(generator).ParentUid; - var gent2ParentGrid = xFormQuery.GetComponent(generators.Item1).ParentUid; + var gen1ParentGrid = Transform(generator).ParentUid; + var gent2ParentGrid = Transform(generators.Item1).ParentUid; if (gen1ParentGrid != gent2ParentGrid) RemoveConnections(generator); diff --git a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs index 48123bac25..7c9eec38c0 100644 --- a/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs +++ b/Content.Server/Singularity/EntitySystems/EventHorizonSystem.cs @@ -34,18 +34,15 @@ public sealed partial class EventHorizonSystem : SharedEventHorizonSystem [Dependency] private SharedTransformSystem _xformSystem = default!; [Dependency] private SharedMapSystem _mapSystem = default!; [Dependency] private TagSystem _tagSystem = default!; + [Dependency] private EntityQuery _physicsQuery = default!; #endregion Dependencies private static readonly ProtoId HighRiskItemTag = "HighRiskItem"; - private EntityQuery _physicsQuery; - public override void Initialize() { base.Initialize(); - _physicsQuery = GetEntityQuery(); - SubscribeLocalEvent(PreventConsume); SubscribeLocalEvent(PreventConsume); SubscribeLocalEvent(OnHorizonMapInit); diff --git a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs index 61cde942a7..e92f30e5be 100644 --- a/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs +++ b/Content.Server/Singularity/EntitySystems/GravityWellSystem.cs @@ -26,6 +26,11 @@ public sealed partial class GravityWellSystem : SharedGravityWellSystem [Dependency] private EntityLookupSystem _lookup = default!; [Dependency] private SharedPhysicsSystem _physics = default!; [Dependency] private SharedTransformSystem _transform = default!; + + [Dependency] private EntityQuery _wellQuery = default!; + [Dependency] private EntityQuery _mapQuery = default!; + [Dependency] private EntityQuery _gridQuery = default!; + [Dependency] private EntityQuery _physicsQuery = default!; #endregion Dependencies /// @@ -34,20 +39,11 @@ public sealed partial class GravityWellSystem : SharedGravityWellSystem /// public const float MinGravPulseRange = 0.00001f; - private EntityQuery _wellQuery; - private EntityQuery _mapQuery; - private EntityQuery _gridQuery; - private EntityQuery _physicsQuery; - private HashSet _entSet = new(); public override void Initialize() { base.Initialize(); - _wellQuery = GetEntityQuery(); - _mapQuery = GetEntityQuery(); - _gridQuery = GetEntityQuery(); - _physicsQuery = GetEntityQuery(); SubscribeLocalEvent(OnGravityWellMapInit); var vvHandle = _vvManager.GetTypeHandler(); diff --git a/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs b/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs index ee270b35c6..2655594954 100644 --- a/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/SingularityGeneratorSystem.cs @@ -17,6 +17,7 @@ public sealed partial class SingularityGeneratorSystem : SharedSingularityGenera [Dependency] private SharedTransformSystem _transformSystem = default!; [Dependency] private PhysicsSystem _physics = default!; [Dependency] private IGameTiming _timing = default!; + [Dependency] private EntityQuery _containmentFieldQuery = default!; #endregion Dependencies public override void Initialize() @@ -173,13 +174,12 @@ public sealed partial class SingularityGeneratorSystem : SharedSingularityGenera var ray = new CollisionRay(worldPosition, dirRad.ToVec(), component.CollisionMask); var rayCastResults = _physics.IntersectRay(transform.MapID, ray, component.FailsafeDistance, generator, false); - var genQuery = GetEntityQuery(); RayCastResults? closestResult = null; foreach (var result in rayCastResults) { - if (!genQuery.HasComponent(result.HitEntity)) + if (!_containmentFieldQuery.HasComponent(result.HitEntity)) continue; closestResult = result; diff --git a/Content.Server/Speech/EntitySystems/ListeningSystem.cs b/Content.Server/Speech/EntitySystems/ListeningSystem.cs index fd498f6acd..d05e4fb2eb 100644 --- a/Content.Server/Speech/EntitySystems/ListeningSystem.cs +++ b/Content.Server/Speech/EntitySystems/ListeningSystem.cs @@ -28,9 +28,8 @@ public sealed partial class ListeningSystem : EntitySystem // TODO whispering / audio volume? Microphone sensitivity? // for now, whispering just arbitrarily reduces the listener's max range. - var xformQuery = GetEntityQuery(); - var sourceXform = xformQuery.GetComponent(source); - var sourcePos = _xforms.GetWorldPosition(sourceXform, xformQuery); + var sourceXform = Transform(source); + var sourcePos = _xforms.GetWorldPosition(sourceXform); var attemptEv = new ListenAttemptEvent(source); var ev = new ListenEvent(message, source); @@ -44,7 +43,7 @@ public sealed partial class ListeningSystem : EntitySystem // range checks // TODO proper speech occlusion - var distance = (sourcePos - _xforms.GetWorldPosition(xform, xformQuery)).LengthSquared(); + var distance = (sourcePos - _xforms.GetWorldPosition(xform)).LengthSquared(); if (distance > listener.Range * listener.Range) continue; diff --git a/Content.Server/Spreader/KudzuSystem.cs b/Content.Server/Spreader/KudzuSystem.cs index 606b9f06e7..edaf5b7a76 100644 --- a/Content.Server/Spreader/KudzuSystem.cs +++ b/Content.Server/Spreader/KudzuSystem.cs @@ -16,6 +16,10 @@ public sealed partial class KudzuSystem : EntitySystem [Dependency] private SharedAppearanceSystem _appearance = default!; [Dependency] private DamageableSystem _damageable = default!; + [Dependency] private EntityQuery _appearanceQuery = default!; + [Dependency] private EntityQuery _kudzuQuery = default!; + [Dependency] private EntityQuery _damageableQuery = default!; + private static readonly ProtoId KudzuGroup = "Kudzu"; /// @@ -92,20 +96,17 @@ public sealed partial class KudzuSystem : EntitySystem /// public override void Update(float frameTime) { - var appearanceQuery = GetEntityQuery(); - var query = EntityQueryEnumerator(); - var kudzuQuery = GetEntityQuery(); - var damageableQuery = GetEntityQuery(); + var kudzuEnumerator = EntityQueryEnumerator(); var curTime = _timing.CurTime; - while (query.MoveNext(out var uid, out var grow)) + while (kudzuEnumerator.MoveNext(out var uid, out var grow)) { if (grow.NextTick > curTime) continue; grow.NextTick = curTime + TimeSpan.FromSeconds(0.5); - if (!kudzuQuery.TryGetComponent(uid, out var kudzu)) + if (!_kudzuQuery.TryGetComponent(uid, out var kudzu)) { RemCompDeferred(uid, grow); continue; @@ -116,7 +117,7 @@ public sealed partial class KudzuSystem : EntitySystem continue; } - if (damageableQuery.TryGetComponent(uid, out var damage)) + if (_damageableQuery.TryGetComponent(uid, out var damage)) { var totalDamage = _damageable.GetTotalDamage((uid, damage)); if (totalDamage > 1.0) @@ -145,7 +146,7 @@ public sealed partial class KudzuSystem : EntitySystem RemCompDeferred(uid, grow); } - if (appearanceQuery.TryGetComponent(uid, out var appearance)) + if (_appearanceQuery.TryGetComponent(uid, out var appearance)) { _appearance.SetData(uid, KudzuVisuals.GrowthLevel, kudzu.GrowthLevel, appearance); } diff --git a/Content.Server/Spreader/SpreaderSystem.cs b/Content.Server/Spreader/SpreaderSystem.cs index 7dbc377c32..9120b30b63 100644 --- a/Content.Server/Spreader/SpreaderSystem.cs +++ b/Content.Server/Spreader/SpreaderSystem.cs @@ -25,6 +25,10 @@ public sealed partial class SpreaderSystem : EntitySystem [Dependency] private TagSystem _tag = default!; [Dependency] private TurfSystem _turf = default!; + [Dependency] private EntityQuery _edgeSpreaderQuery = default!; + [Dependency] private EntityQuery _airtightQuery = default!; + [Dependency] private EntityQuery _dockingQuery = default!; + /// /// Cached maximum number of updates per spreader prototype. This is applied per-grid. /// @@ -36,8 +40,6 @@ public sealed partial class SpreaderSystem : EntitySystem // TODO PERFORMANCE Assign each prototype to an index and convert dictionary to array private readonly Dictionary> _gridUpdates = []; - private EntityQuery _query; - public const float SpreadCooldownSeconds = 1; private static readonly ProtoId IgnoredTag = "SpreaderIgnore"; @@ -51,8 +53,6 @@ public sealed partial class SpreaderSystem : EntitySystem SubscribeLocalEvent(OnTerminating); SetupPrototypes(); - - _query = GetEntityQuery(); } private void OnPrototypeReload(PrototypesReloadedEventArgs obj) @@ -106,9 +106,6 @@ public sealed partial class SpreaderSystem : EntitySystem return; var query = EntityQueryEnumerator(); - var xforms = GetEntityQuery(); - var spreaderQuery = GetEntityQuery(); - var spreaders = new List<(EntityUid Uid, ActiveEdgeSpreaderComponent Comp)>(Count()); // Build a list of all existing Edgespreaders, shuffle them @@ -124,7 +121,7 @@ public sealed partial class SpreaderSystem : EntitySystem foreach (var (uid, comp) in spreaders) { // Get xform first, as entity may have been deleted due to interactions triggered by other spreaders. - if (!xforms.TryGetComponent(uid, out var xform)) + if (!TryComp(uid, out TransformComponent? xform)) continue; if (xform.GridUid == null) @@ -136,7 +133,7 @@ public sealed partial class SpreaderSystem : EntitySystem if (!_gridUpdates.TryGetValue(xform.GridUid.Value, out var groupUpdates)) continue; - if (!spreaderQuery.TryGetComponent(uid, out var spreader)) + if (!_edgeSpreaderQuery.TryGetComponent(uid, out var spreader)) { RemComp(uid, comp); continue; @@ -188,10 +185,6 @@ public sealed partial class SpreaderSystem : EntitySystem return; var tile = _map.TileIndicesFor(comp.GridUid.Value, grid, comp.Coordinates); - var spreaderQuery = GetEntityQuery(); - var airtightQuery = GetEntityQuery(); - var dockQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); var blockedAtmosDirs = AtmosDirection.Invalid; // Due to docking ports they may not necessarily be opposite directions. @@ -203,17 +196,23 @@ public sealed partial class SpreaderSystem : EntitySystem while (ourEnts.MoveNext(out var ent)) { // Spread via docks in a special-case. - if (dockQuery.TryGetComponent(ent, out var dock) && + if (_dockingQuery.TryGetComponent(ent, out var dock) && dock.Docked && - xformQuery.TryGetComponent(ent, out var xform) && - xformQuery.TryGetComponent(dock.DockedWith, out var dockedXform) && + TryComp(ent, out TransformComponent? xform) && + TryComp(dock.DockedWith, out TransformComponent? dockedXform) && TryComp(dockedXform.GridUid, out var dockedGrid)) { - neighborTiles.Add((dockedXform.GridUid.Value, dockedGrid, _map.CoordinatesToTile(dockedXform.GridUid.Value, dockedGrid, dockedXform.Coordinates), xform.LocalRotation.ToAtmosDirection(), dockedXform.LocalRotation.ToAtmosDirection())); + neighborTiles.Add(( + dockedXform.GridUid.Value, dockedGrid, + _map.CoordinatesToTile(dockedXform.GridUid.Value, + dockedGrid, + dockedXform.Coordinates), + xform.LocalRotation.ToAtmosDirection(), + dockedXform.LocalRotation.ToAtmosDirection())); } // If we're on a blocked tile work out which directions we can go. - if (!airtightQuery.TryGetComponent(ent, out var airtight) || !airtight.AirBlocked || + if (!_airtightQuery.TryGetComponent(ent, out var airtight) || !airtight.AirBlocked || _tag.HasTag(ent.Value, IgnoredTag)) { continue; @@ -255,7 +254,7 @@ public sealed partial class SpreaderSystem : EntitySystem while (directionEnumerator.MoveNext(out var ent)) { - if (!airtightQuery.TryGetComponent(ent, out var airtight) || !airtight.AirBlocked || _tag.HasTag(ent.Value, IgnoredTag)) + if (!_airtightQuery.TryGetComponent(ent, out var airtight) || !airtight.AirBlocked || _tag.HasTag(ent.Value, IgnoredTag)) { continue; } @@ -275,7 +274,7 @@ public sealed partial class SpreaderSystem : EntitySystem while (directionEnumerator.MoveNext(out var ent)) { - if (!spreaderQuery.TryGetComponent(ent, out var spreader)) + if (!_edgeSpreaderQuery.TryGetComponent(ent, out var spreader)) continue; if (spreader.Id != prototype) @@ -326,7 +325,7 @@ public sealed partial class SpreaderSystem : EntitySystem DebugTools.Assert(Transform(entity.Value).Anchored); // Activate any edge spreaders that are non-terminating - if (_query.HasComponent(entity) && !TerminatingOrDeleted(entity)) + if (_edgeSpreaderQuery.HasComponent(entity) && !TerminatingOrDeleted(entity)) EnsureComp(entity.Value); } @@ -341,7 +340,7 @@ public sealed partial class SpreaderSystem : EntitySystem DebugTools.Assert(Transform(entity.Value).Anchored); // Activate any edge spreaders that are non-terminating - if (_query.HasComponent(entity) && !TerminatingOrDeleted(entity)) + if (_edgeSpreaderQuery.HasComponent(entity) && !TerminatingOrDeleted(entity)) EnsureComp(entity.Value); } } diff --git a/Content.Server/Station/Systems/StationSystem.cs b/Content.Server/Station/Systems/StationSystem.cs index a35443d669..f7b877cd36 100644 --- a/Content.Server/Station/Systems/StationSystem.cs +++ b/Content.Server/Station/Systems/StationSystem.cs @@ -31,12 +31,10 @@ public sealed partial class StationSystem : SharedStationSystem [Dependency] private SharedTransformSystem _transform = default!; [Dependency] private MetaDataSystem _metaData = default!; [Dependency] private PvsOverrideSystem _pvsOverride = default!; + [Dependency] private EntityQuery _gridQuery = default!; private ISawmill _sawmill = default!; - private EntityQuery _gridQuery; - private EntityQuery _xformQuery; - private ValueList _mapIds; private ValueList<(Box2Rotated Bounds, MapId MapId)> _gridBounds; @@ -47,9 +45,6 @@ public sealed partial class StationSystem : SharedStationSystem _sawmill = _logManager.GetSawmill("station"); - _gridQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - SubscribeLocalEvent(OnRoundEnd); SubscribeLocalEvent(OnPostGameMapLoad); SubscribeLocalEvent(OnStationAdd); @@ -218,7 +213,7 @@ public sealed partial class StationSystem : SharedStationSystem // First collect all valid map IDs where station grids exist foreach (var gridUid in dataComponent.Grids) { - if (!_xformQuery.TryGetComponent(gridUid, out var xform)) + if (!TryComp(gridUid, out TransformComponent? xform)) continue; var mapId = xform.MapID; @@ -232,7 +227,7 @@ public sealed partial class StationSystem : SharedStationSystem foreach (var gridUid in dataComponent.Grids) { if (!_gridQuery.TryComp(gridUid, out var grid) || - !_xformQuery.TryGetComponent(gridUid, out var gridXform)) + !TryComp(gridUid, out TransformComponent? gridXform)) { continue; } @@ -252,7 +247,7 @@ public sealed partial class StationSystem : SharedStationSystem foreach (var session in Filter.GetAllPlayers(_player)) { var entity = session.AttachedEntity; - if (entity == null || !_xformQuery.TryGetComponent(entity, out var xform)) + if (entity == null || !TryComp(entity, out TransformComponent? xform)) continue; var mapId = xform.MapID; diff --git a/Content.Server/StationEvents/Events/GreytideVirusRule.cs b/Content.Server/StationEvents/Events/GreytideVirusRule.cs index c9b0118477..39ea7c7ae3 100644 --- a/Content.Server/StationEvents/Events/GreytideVirusRule.cs +++ b/Content.Server/StationEvents/Events/GreytideVirusRule.cs @@ -25,6 +25,9 @@ public sealed partial class GreytideVirusRule : StationEventSystem _firelockQuery = default!; + [Dependency] private EntityQuery _accessReaderQuery = default!; + protected override void Added(EntityUid uid, GreytideVirusRuleComponent virusComp, GameRuleComponent gameRule, GameRuleAddedEvent args) { if (!TryComp(uid, out var stationEvent)) @@ -58,13 +61,10 @@ public sealed partial class GreytideVirusRule : StationEventSystem(); - var accessQuery = GetEntityQuery(); - var lockQuery = AllEntityQuery(); while (lockQuery.MoveNext(out var lockUid, out var lockComp, out var xform)) { - if (!accessQuery.TryComp(lockUid, out var accessComp)) + if (!_accessReaderQuery.TryComp(lockUid, out var accessComp)) continue; // make sure not to hit CentCom or other maps @@ -86,7 +86,7 @@ public sealed partial class GreytideVirusRule : StationEventSystem(); var sourceXform = Transform(ev.Source); - var sourcePos = _xforms.GetWorldPosition(sourceXform, xformQuery); + var sourcePos = _xforms.GetWorldPosition(sourceXform); // This function ensures that chat popups appear on camera views that have connected microphones. foreach (var (_, __, camera, xform) in EntityQuery()) @@ -36,7 +35,7 @@ public sealed partial class SurveillanceCameraMicrophoneSystem : EntitySystem // get range to camera. This way wispers will still appear as obfuscated if they are too far from the camera's microphone var range = (xform.MapID != sourceXform.MapID) ? -1 - : (sourcePos - _xforms.GetWorldPosition(xform, xformQuery)).Length(); + : (sourcePos - _xforms.GetWorldPosition(xform)).Length(); if (range < 0 || range > ev.VoiceRange) continue; diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs index 4b7bc68cc0..4ad44ec9ac 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Chat.Systems; using Content.Server.Speech; +using Content.Server.SurveillanceCamera.Systems; using Content.Shared.Speech; using Content.Shared.Chat; using Robust.Shared.Audio.Systems; diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.Damage.cs b/Content.Server/Temperature/Systems/TemperatureSystem.Damage.cs index 2ebdd7b699..c7e31bad81 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.Damage.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.Damage.cs @@ -24,9 +24,9 @@ public sealed partial class TemperatureSystem [Dependency] private IAdminLogManager _adminLogger = default!; [Dependency] private IGameTiming _gameTiming = default!; - private EntityQuery _tempDamageQuery; - private EntityQuery _containerTemperatureQuery; - private EntityQuery _thermalRegulatorQuery; + [Dependency] private EntityQuery _tempDamageQuery = default!; + [Dependency] private EntityQuery _containerTemperatureQuery = default!; + [Dependency] private EntityQuery _thermalRegulatorQuery = default!; /// /// All the components that will have their damage updated at the end of the tick. @@ -61,10 +61,6 @@ public sealed partial class TemperatureSystem SubscribeLocalEvent(OnParentChange); SubscribeLocalEvent(OnParentThresholdStartup); SubscribeLocalEvent(OnParentThresholdShutdown); - - _tempDamageQuery = GetEntityQuery(); - _containerTemperatureQuery = GetEntityQuery(); - _thermalRegulatorQuery = GetEntityQuery(); } private void UpdateDamage() diff --git a/Content.Server/Tiles/RequiresTileSystem.cs b/Content.Server/Tiles/RequiresTileSystem.cs index 4f119e9592..812c54660a 100644 --- a/Content.Server/Tiles/RequiresTileSystem.cs +++ b/Content.Server/Tiles/RequiresTileSystem.cs @@ -1,6 +1,5 @@ using Content.Shared.Tiles; using Robust.Shared.Map.Components; -using Robust.Shared.Map.Enumerators; namespace Content.Server.Tiles; @@ -11,13 +10,11 @@ public sealed partial class RequiresTileSystem : EntitySystem */ [Dependency] private SharedMapSystem _maps = default!; - - private EntityQuery _tilesQuery; + [Dependency] private EntityQuery _tilesQuery = default!; public override void Initialize() { base.Initialize(); - _tilesQuery = GetEntityQuery(); SubscribeLocalEvent(OnTileChange); } diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEIgniteSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEIgniteSystem.cs index 1ca5419915..15cce608d9 100644 --- a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEIgniteSystem.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEIgniteSystem.cs @@ -15,20 +15,11 @@ public sealed partial class XAEIgniteSystem : BaseXAESystem [Dependency] private IRobustRandom _random = default!; [Dependency] private EntityLookupSystem _lookup = default!; [Dependency] private FlammableSystem _flammable = default!; - - private EntityQuery _flammables; + [Dependency] private EntityQuery _flammables = default!; /// 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) { diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAELightFlickerSystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAELightFlickerSystem.cs index 1948e50769..d37224de4c 100644 --- a/Content.Server/Xenoarchaeology/Artifact/XAE/XAELightFlickerSystem.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAELightFlickerSystem.cs @@ -15,20 +15,11 @@ public sealed partial class XAELightFlickerSystem : BaseXAESystem _lights; + [Dependency] private EntityQuery _poweredLightsQuery = default!; /// 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) { @@ -36,7 +27,7 @@ public sealed partial class XAELightFlickerSystem : BaseXAESystem _physQuery; + [Dependency] private EntityQuery _physQuery = default!; /// 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) { diff --git a/Content.Shared/Parallax/Biomes/BiomeComponent.cs b/Content.Shared/Parallax/Biomes/BiomeComponent.cs index af8eb88683..2999ef5de7 100644 --- a/Content.Shared/Parallax/Biomes/BiomeComponent.cs +++ b/Content.Shared/Parallax/Biomes/BiomeComponent.cs @@ -1,11 +1,8 @@ using Content.Shared.Parallax.Biomes.Layers; using Content.Shared.Parallax.Biomes.Markers; using Robust.Shared.GameStates; -using Robust.Shared.Noise; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Parallax.Biomes; From 5897dfa123c215653a5ae6bae2d1df7e5eb09cbb Mon Sep 17 00:00:00 2001 From: Minerva <218184747+mnva0@users.noreply.github.com> Date: Sun, 17 May 2026 12:10:54 -0400 Subject: [PATCH 22/52] Capitalization fix in loadout groups (#43849) * Capitalization fix in loadout groups * Nevermind I like this spelling more --- .../Locale/en-US/preferences/loadout-groups.ftl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Locale/en-US/preferences/loadout-groups.ftl b/Resources/Locale/en-US/preferences/loadout-groups.ftl index 566e7f6aab..1503f46d8a 100644 --- a/Resources/Locale/en-US/preferences/loadout-groups.ftl +++ b/Resources/Locale/en-US/preferences/loadout-groups.ftl @@ -7,11 +7,11 @@ loadout-group-jobtrinkets = Job trinkets loadout-group-glasses = Glasses loadout-group-backpack = Backpack loadout-group-instruments = Instruments -loadout-group-survival-basic = Survival Box -loadout-group-survival-extended = Extended Survival Box -loadout-group-survival-clown = Clown Survival Box -loadout-group-survival-medical = Medical Survival Box -loadout-group-survival-security = Security Survival Box +loadout-group-survival-basic = Survival box +loadout-group-survival-extended = Extended survival box +loadout-group-survival-clown = Clown survival box +loadout-group-survival-medical = Medical survival box +loadout-group-survival-security = Security survival box loadout-group-survival-syndicate = Github is forcing me to write text that is literally twice-impossible for the player to ever see, send help loadout-group-survival-military = See line 14, no one will ever see this so :3 loadout-group-breath-tool = Species-dependent breath tools @@ -19,7 +19,7 @@ loadout-group-tank-harness = Species-specific survival equipment loadout-group-EVA-tank = Species-specific gas tank loadout-group-vox-tank = Vox-specific gas tank loadout-group-pocket-tank-double = Species-specific double emergency tank in pocket -loadout-group-survival-mime = Mime Survival Box +loadout-group-survival-mime = Mime survival box # Command loadout-group-captain-head = Captain head @@ -161,7 +161,7 @@ loadout-group-warden-outerclothing = Warden outer clothing loadout-group-security-head = Security head loadout-group-security-jumpsuit = Security jumpsuit loadout-group-security-backpack = Security backpack -loadout-group-security-belt = Security Belt +loadout-group-security-belt = Security belt loadout-group-security-outerclothing = Security outer clothing loadout-group-security-shoes = Security shoes loadout-group-security-id = Security ID From c264ec0a60636fc0793d553795fa30e1a7d144a7 Mon Sep 17 00:00:00 2001 From: riccardi48 <39341154+riccardi48@users.noreply.github.com> Date: Sun, 17 May 2026 17:38:39 +0100 Subject: [PATCH 23/52] Default requester text in cargo request console from ID (#43938) * Request text from ID * Requested Changes * Removed TryGetIdentityShortInfoEvent() * Removed unused using * cleanup * . * Wrong if statement * Revert "Merge branch 'identity-getname-cleanup' into cargo-console-requester-id" This reverts commit 89245a4f6445dac723b417e2c19e176b96bbdef5, reversing changes made to d6ce7e03aee7da7470f170a570f99c3b68e18565. * missed one * whitespace * . * updated to match other PR * Moved to Dependency * added partial class * Update Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../CargoOrderConsoleBoundUserInterface.cs | 22 ++++++------------- .../en-US/cargo/cargo-console-component.ftl | 2 +- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs b/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs index 6f6bcd8b8d..b509b13767 100644 --- a/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs +++ b/Content.Client/Cargo/BUI/CargoOrderConsoleBoundUserInterface.cs @@ -1,5 +1,5 @@ -using Content.Shared.Cargo; using Content.Client.Cargo.UI; +using Content.Shared.Cargo; using Content.Shared.Cargo.BUI; using Content.Shared.Cargo.Components; using Content.Shared.Cargo.Events; @@ -7,15 +7,15 @@ using Content.Shared.Cargo.Prototypes; using Content.Shared.IdentityManagement; using Robust.Client.GameObjects; using Robust.Client.Player; -using Robust.Shared.Utility; using Robust.Shared.Prototypes; -using static Robust.Client.UserInterface.Controls.BaseButton; +using Robust.Shared.Utility; namespace Content.Client.Cargo.BUI { - public sealed class CargoOrderConsoleBoundUserInterface : BoundUserInterface + public sealed partial class CargoOrderConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) { - private readonly SharedCargoSystem _cargoSystem; + [Dependency] private SharedCargoSystem _cargoSystem = default!; + [Dependency] private IdentitySystem _identity = default!; [ViewVariables] private CargoConsoleMenu? _menu; @@ -44,11 +44,6 @@ namespace Content.Client.Cargo.BUI [ViewVariables] private CargoProductPrototype? _product; - public CargoOrderConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) - { - _cargoSystem = EntMan.System(); - } - protected override void Open() { base.Open(); @@ -59,12 +54,9 @@ namespace Content.Client.Cargo.BUI var localPlayer = dependencies.Resolve().LocalEntity; var description = new FormattedMessage(); - string orderRequester; - + var orderRequester = Loc.GetString("cargo-console-paper-approver-default"); if (EntMan.EntityExists(localPlayer)) - orderRequester = Identity.Name(localPlayer.Value, EntMan); - else - orderRequester = string.Empty; + orderRequester = _identity.GetIdentityShortInfo(localPlayer.Value, Owner) ?? orderRequester; _orderMenu = new CargoConsoleOrderMenu(); diff --git a/Resources/Locale/en-US/cargo/cargo-console-component.ftl b/Resources/Locale/en-US/cargo/cargo-console-component.ftl index 047661a7cc..ca68ada0dc 100644 --- a/Resources/Locale/en-US/cargo/cargo-console-component.ftl +++ b/Resources/Locale/en-US/cargo/cargo-console-component.ftl @@ -54,7 +54,7 @@ cargo-console-fund-transfer-broadcast = [bold]{$name} transferred {$amount} spes cargo-console-fund-transfer-user-unknown = Unknown cargo-console-paper-reason-default = None -cargo-console-paper-approver-default = Self +cargo-console-paper-approver-default = Unknown cargo-console-paper-print-name = Order #{$orderNumber} cargo-console-paper-print-text = [head=2]Order #{$orderNumber}[/head] {"[bold]Item:[/bold]"} {$itemName} (x{$orderQuantity}) From c689bec79b73296fbe7defb7928dbeccb9938ccd Mon Sep 17 00:00:00 2001 From: TakoDragon <69509841+BackeTako@users.noreply.github.com> Date: Sun, 17 May 2026 20:59:00 +0200 Subject: [PATCH 24/52] Signal valve construction bug (#43975) hide --- Resources/Prototypes/Recipes/Construction/utilities.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Recipes/Construction/utilities.yml b/Resources/Prototypes/Recipes/Construction/utilities.yml index e863689677..7c154ed6ee 100644 --- a/Resources/Prototypes/Recipes/Construction/utilities.yml +++ b/Resources/Prototypes/Recipes/Construction/utilities.yml @@ -825,6 +825,7 @@ - type: construction id: SignalControlledValveAlt1 + hide: true graph: GasBinary startNode: start targetNode: signalvalveAlt1 @@ -840,6 +841,7 @@ - type: construction id: SignalControlledValveAlt2 + hide: true graph: GasBinary startNode: start targetNode: signalvalveAlt2 From 79ba18f314520a049f4cb7f7de81931a0b18907a Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Sun, 17 May 2026 21:01:18 +0200 Subject: [PATCH 25/52] replace chainsaw sounds, delete current ones (#43976) replace chainsaw soundfx, delete old sound files --- Resources/Audio/Weapons/attributions.yml | 13 +++++++++---- Resources/Audio/Weapons/chainsaw.ogg | Bin 34718 -> 0 bytes Resources/Audio/Weapons/chainsaw_pull.ogg | Bin 0 -> 42141 bytes Resources/Audio/Weapons/chainsaw_rev.ogg | Bin 0 -> 35869 bytes Resources/Audio/Weapons/chainsawidle.ogg | Bin 10963 -> 0 bytes Resources/Audio/Weapons/chainsawwield.ogg | Bin 29080 -> 0 bytes .../Entities/Objects/Weapons/Melee/chainsaw.yml | 8 +++----- 7 files changed, 12 insertions(+), 9 deletions(-) delete mode 100644 Resources/Audio/Weapons/chainsaw.ogg create mode 100644 Resources/Audio/Weapons/chainsaw_pull.ogg create mode 100644 Resources/Audio/Weapons/chainsaw_rev.ogg delete mode 100644 Resources/Audio/Weapons/chainsawidle.ogg delete mode 100644 Resources/Audio/Weapons/chainsawwield.ogg diff --git a/Resources/Audio/Weapons/attributions.yml b/Resources/Audio/Weapons/attributions.yml index 989e2472f6..63f1904f79 100644 --- a/Resources/Audio/Weapons/attributions.yml +++ b/Resources/Audio/Weapons/attributions.yml @@ -8,10 +8,15 @@ copyright: "User tosha73 on freesound.org" source: "https://freesound.org/people/tosha73/sounds/509902/" -- files: ["chainsaw.ogg, chainsawidle.ogg, chainsawwield.ogg"] - license: "Custom" - copyright: "https://www.soundjay.com/tos.html" - source: "https://www.soundjay.com/chainsaw-sound-effect.html" +- files: ["chainsaw_pull.ogg"] + license: "CC-BY-4.0" + copyright: "User SonoFxAudio on freesound.org, modified by Errant" + source: "https://freesound.org/people/SonoFxAudio/sounds/656676/" + +- files: ["chainsaw_rev.ogg"] + license: "CC-BY-4.0" + copyright: "User kyles on freesound.org, modified by Errant" + source: "https://freesound.org/people/kyles/sounds/453260/" - files: ["guitarsmash.ogg"] license: "CC0-1.0" diff --git a/Resources/Audio/Weapons/chainsaw.ogg b/Resources/Audio/Weapons/chainsaw.ogg deleted file mode 100644 index 6c1ce9b62bbadcc516b96ad7f0ef4f66fc707bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34718 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/chainsaw_rev.ogg b/Resources/Audio/Weapons/chainsaw_rev.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2859cf20da3aaf91abb37534546cac77579d30dd GIT binary patch literal 35869 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 C4$Axh literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/chainsawidle.ogg b/Resources/Audio/Weapons/chainsawidle.ogg deleted file mode 100644 index b0a33894e967d5c270dae2ec37465c14763027fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10963 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 diff --git a/Resources/Audio/Weapons/chainsawwield.ogg b/Resources/Audio/Weapons/chainsawwield.ogg deleted file mode 100644 index 364cca262bd97212e16404fb1bdc7372ad2ca2c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29080 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 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml index c1fc5668b5..4f67f2b876 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml @@ -6,9 +6,7 @@ components: - type: Wieldable wieldSound: !type:SoundPathSpecifier - path: /Audio/Weapons/chainsawwield.ogg - params: - volume: -3 + path: /Audio/Weapons/chainsaw_pull.ogg - type: Sharp - type: Sprite sprite: Objects/Weapons/Melee/chainsaw.rsi @@ -24,9 +22,9 @@ Blunt: 2 Structural: 4 soundHit: - path: /Audio/Weapons/chainsaw.ogg + path: /Audio/Weapons/chainsaw_rev.ogg params: - volume: -3 + volume: -2 - type: IncreaseDamageOnWield damage: types: From 28f4b4d36af78552b5d4cb4473fc60f44fcff295 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 17 May 2026 19:19:09 +0000 Subject: [PATCH 26/52] 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 612414c6cf..39478cefe9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Added new signs, spawners and consoles to Exo, along with some minor - balance tweaks and improvements. - type: Tweak - id: 9183 - time: '2025-11-01T21:00:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/41234 - author: PickelSilly changes: - message: Added a new voice sensor item craftable at an autolathe, record a key @@ -4080,3 +4072,10 @@ id: 9694 time: '2026-05-17T10:32:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/43970 +- author: Errant + changes: + - message: Chainsaw sound effects have been replaced. + type: Tweak + id: 9695 + time: '2026-05-17T19:17:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/43976 From 9eef804b4f444e3816ba25b485ed0641c614193f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Sun, 17 May 2026 14:24:05 -0500 Subject: [PATCH 27/52] Cleanup of lighter.yml (#43950) * a massacre * changed my mind * other stuff * make up your mind, babe * how come you always have another change after you push the pr, girl --------- Co-authored-by: iaada --- .../Entities/Objects/Tools/lighters.yml | 336 ++++++------------ 1 file changed, 115 insertions(+), 221 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml index 8d6446287b..111a51647e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml @@ -53,11 +53,13 @@ - ReagentId: WeldingFuel Quantity: 7.5 +## Basic + - type: entity - name: basic lighter parent: [SolutionLighter, BaseLighter] id: Lighter - description: "A simple plastic cigarette lighter." + name: basic lighter + description: A simple plastic cigarette lighter. components: - type: Sprite sprite: Objects/Tools/Lighters/lighters.rsi @@ -84,14 +86,8 @@ basic_icon_base-9: "" basic_icon_base-10: "" basic_icon_base-11: "" - - type: GenericVisualizer - visuals: - enum.ToggleableVisuals.Enabled: - flame: - True: { visible: true } - False: { visible: false } - type: ToggleableVisuals - spriteLayer: lighter_flame + spriteLayer: flame inhandVisuals: left: - state: inhand-left-flame @@ -103,10 +99,10 @@ sprite: Objects/Tools/Lighters/lighters.rsi - type: entity - name: cheap lighter - parent: BaseLighter + parent: Lighter id: CheapLighter - description: "A dangerously inexpensive plastic lighter, don't burn your thumb!" + name: cheap lighter + description: "A dangerously inexpensive plastic lighter. Don't burn your thumb!" components: - type: Sprite sprite: Objects/Tools/Lighters/lighters.rsi @@ -128,79 +124,47 @@ fuelLitCost: 0.2 - type: entity - name: flippo lighter - parent: BaseBrandedLighter - id: FlippoLighter - description: "A rugged metal lighter, lasts quite a while." + parent: [ SolutionLighter, BaseLighter ] + id: DiscountDanLighter + name: Discount Dan's lighter + description: The worst lighter ever produced. Lighter burn is inevitable, do not refuel while lit. components: - type: Sprite sprite: Objects/Tools/Lighters/lighters.rsi layers: - - state: zippo_icon_base - map: ["base"] - - state: zippo_top - map: ["top"] - visible: false - - state: zippo_open - map: ["open"] - visible: false + - state: icon_map + - state: discount_icon_base + - state: basic_icon_top - state: lighter_flame - map: ["flame"] visible: false shader: unshaded + map: [ "flame" ] + - type: Welder # the single worst lighter invented by mankind + fuelConsumption: 0.4 + fuelLitCost: 0.2 + tankSafe: false - type: Item sprite: Objects/Tools/Lighters/lighters.rsi - heldPrefix: zippo - - type: GenericVisualizer - visuals: - enum.ToggleableVisuals.Enabled: - flame: - True: { visible: true } - False: { visible: false } - open: - True: { visible: true } - False: { visible: false } - top: - True: { visible: true } - False: { visible: false } - base: - True: { visible: false } - False: { visible: true } - type: ToggleableVisuals - spriteLayer: lighter_flame + spriteLayer: flame inhandVisuals: left: - - state: zippo-inhand-left-flame + - state: inhand-left-flame shader: unshaded right: - - state: zippo-inhand-right-flame + - state: inhand-right-flame shader: unshaded - type: PointLight - radius: 1.2 #slightly stronger than the other lighters + radius: 1.5 + color: yellow + - type: ComponentToggler + components: + - type: DamageOnHolding # todo this needs to make a sound or something to tell people it's burning them + damage: + types: + Heat: 2 -- type: entity - name: flippo engraved lighter - parent: FlippoLighter - id: FlippoEngravedLighter - description: "A rugged golden lighter, lasts quite a while. Engravings serve no tactical advantage whatsoever." - components: - - type: Sprite - sprite: Objects/Tools/Lighters/lighters.rsi - layers: - - state: zippo_engraved_icon_base - map: ["base"] - - state: zippo_top - map: ["top"] - visible: false - - state: zippo_engraved_open - map: ["open"] - visible: false - - state: lighter_flame - map: ["flame"] - visible: false - shader: unshaded - - type: StealTarget - stealGroup: FlippoEngravedLighter +## Flippos - type: entity abstract: true @@ -234,9 +198,6 @@ - type: GenericVisualizer visuals: enum.ToggleableVisuals.Enabled: - flame: - True: { visible: true } - False: { visible: false } open: True: { visible: true } False: { visible: false } @@ -247,7 +208,7 @@ True: { visible: false } False: { visible: true } - type: ToggleableVisuals - spriteLayer: lighter_flame + spriteLayer: flame inhandVisuals: left: - state: inhand-left-lit @@ -255,6 +216,65 @@ right: - state: inhand-right-lit shader: unshaded + - type: PointLight + radius: 1.5 #slightly stronger than the other lighters + +- type: entity + parent: BaseBrandedLighter + id: FlippoLighter + name: flippo lighter + description: A rugged metal lighter that lasts quite a while. + components: + - type: Sprite + sprite: Objects/Tools/Lighters/lighters.rsi + layers: + - state: zippo_icon_base + map: ["base"] + - state: zippo_top + map: ["top"] + visible: false + - state: zippo_open + map: ["open"] + visible: false + - state: lighter_flame + map: ["flame"] + visible: false + shader: unshaded + - type: Item + sprite: Objects/Tools/Lighters/lighters.rsi + heldPrefix: zippo + - type: ToggleableVisuals + inhandVisuals: + left: + - state: zippo-inhand-left-flame + shader: unshaded + right: + - state: zippo-inhand-right-flame + shader: unshaded + +- type: entity + parent: FlippoLighter + id: FlippoEngravedLighter + name: flippo engraved lighter + description: A rugged golden lighter that lasts quite a while. Engravings serve no tactical advantage whatsoever. + components: + - type: Sprite + sprite: Objects/Tools/Lighters/lighters.rsi + layers: + - state: zippo_engraved_icon_base + map: ["base"] + - state: zippo_top + map: ["top"] + visible: false + - state: zippo_engraved_open + map: ["open"] + visible: false + - state: lighter_flame + map: ["flame"] + visible: false + shader: unshaded + - type: StealTarget + stealGroup: FlippoEngravedLighter - type: entity parent: [BaseBrandedLighter, BaseSyndicateContraband] @@ -266,82 +286,20 @@ sprite: Objects/Tools/Lighters/syndielighter.rsi - type: Item sprite: Objects/Tools/Lighters/syndielighter.rsi - - type: Welder - fuelConsumption: 0.005 - fuelLitCost: 0.01 - tankSafe: true - type: PointLight - enabled: false - netsync: false - radius: 2 color: green -- type: entity - parent: Lighter - id: DiscountDanLighter - name: Discount Dan's lighter - description: "The worst lighter ever produced, lighterburn is inevitable, do not refuel while lit." - components: - - type: Sprite - sprite: Objects/Tools/Lighters/lighters.rsi - layers: - - state: icon_map - - state: discount_icon_base - map: [ "skin" ] - - state: basic_icon_top - - state: lighter_flame - visible: false - shader: unshaded - map: [ "flame" ] - - type: Welder # the single worst lighter invented by mankind - fuelConsumption: 0.4 - fuelLitCost: 0.2 - tankSafe: false - - type: Item - sprite: Objects/Tools/Lighters/lighters.rsi - - type: ToggleableVisuals - spriteLayer: lighter_flame - inhandVisuals: - left: - - state: inhand-left-flame - shader: unshaded - right: - - state: inhand-right-flame - shader: unshaded - - type: RandomSprite - available: - - skin: - discount_icon_base: "" - - type: PointLight - enabled: false - netsync: false - radius: 1.5 - color: yellow - - type: ComponentToggler - components: - - type: DamageOnHolding - damage: - types: - Heat: 2 - - type: entity parent: [BaseBrandedLighter, BaseSyndicateContraband] id: CybersunFlippo name: CyberSun Flippo - description: "A Sleek black and magenta flippo lighter, bearing the logo and iconography of CyberSun Industries." + description: A sleek black and magenta flippo lighter, bearing the logo and iconography of CyberSun Industries. components: - type: Sprite sprite: Objects/Tools/Lighters/cybersun.rsi - type: Item sprite: Objects/Tools/Lighters/cybersun.rsi - - type: Welder # - fuelConsumption: 0.005 - fuelLitCost: 0.01 - tankSafe: true - type: PointLight - enabled: false - netsync: false - radius: 2 color: magenta - type: entity @@ -354,42 +312,29 @@ sprite: Objects/Tools/Lighters/interdyne.rsi - type: Item sprite: Objects/Tools/Lighters/interdyne.rsi - - type: Welder # - fuelConsumption: 0.005 - fuelLitCost: 0.01 - tankSafe: true - type: ItemToggleMeleeWeapon activatedDamage: - types: - Radiation: 1 + types: + Radiation: 1 - type: PointLight - enabled: false - netsync: false - radius: 2 color: cyan - type: entity parent: [BaseBrandedLighter] id: NanotrasenFlippo name: Nanotrasen Flippo - description: "A navy blue luxury flippo, generally handed out to loyal heads of staff instead of a payraise. Fueled with liquid plasma" + description: A navy blue luxury flippo, generally handed out to loyal heads of staff instead of a pay raise. Fueled with liquid plasma. components: - type: Sprite sprite: Objects/Tools/Lighters/nanotrasen.rsi - type: Item sprite: Objects/Tools/Lighters/nanotrasen.rsi - - type: Welder # + - type: Welder fuelConsumption: 0.005 fuelLitCost: 1 fuelReagent: Plasma - tankSafe: true - type: PointLight - enabled: false - netsync: false - radius: 2 color: blue - - type: RefillableSolution - solution: welder - type: Solution solution: reagents: @@ -400,7 +345,7 @@ parent: [SolutionToolWelderExperimental, BaseBrandedLighter, BaseCentcommContraband] id: CentCommFlippo name: Gilded CentComm Flippo - description: "An Ornate, jade embossed and gilded flippo frame containing a bluespace powered jet. The latch is secured by a miniature access reader that only responds to CentComm officials. The nicest lighter known to man." + description: An Ornate, jade embossed and gilded flippo frame containing a bluespace powered jet. The latch is secured by a miniature access reader that only responds to CentComm officials. The nicest lighter known to man. suffix: DO NOT MAP components: - type: Sprite @@ -409,18 +354,13 @@ sprite: Objects/Tools/Lighters/centcomm.rsi - type: ItemToggleRequiresLock requireLocked: false - - type: Welder # + - type: Welder fuelConsumption: 0.0 fuelLitCost: 10 fuelReagent: Plasma - tankSafe: true - type: PointLight - enabled: false - netsync: false radius: 4 #Excessively powerful color: Gold - - type: RefillableSolution - solution: Welder - type: Tool useSound: collection: Welder @@ -433,101 +373,60 @@ parent: [BaseBrandedLighter, BaseMajorContraband] id: SpiderclanFlippo name: Spider-Clan lighter - description: "A high tech jet lighter, engineered to function even in deep space. Runs on a tiny microfusion cell." + description: A high tech jet lighter, engineered to function even in deep space. Runs on a tiny microfusion cell. components: - type: Sprite sprite: Objects/Tools/Lighters/spiderclan.rsi - type: Item sprite: Objects/Tools/Lighters/spiderclan.rsi - - type: Welder # + - type: Welder fuelConsumption: 0 fuelLitCost: 0 - tankSafe: true - type: PointLight - enabled: false - netsync: false - radius: 2 color: green - type: entity parent: [BaseBrandedLighter, BaseSyndicateContraband] id: WaffleCoFlippo name: Waffle Co. flippo - description: "A robust mass produced lighter. The Waffle Co. logo turns the spark wheel when pushed up, minimising risk of lighter burns for even the most inept user." + description: A robust mass produced lighter. The Waffle Co. logo turns the spark wheel when pushed up, minimising risk of lighter burns for even the most inept user. components: - type: Sprite sprite: Objects/Tools/Lighters/waffleco.rsi - type: Item sprite: Objects/Tools/Lighters/waffleco.rsi - - type: Welder # - fuelConsumption: 0.005 - fuelLitCost: 0.05 - tankSafe: true - type: PointLight - enabled: false - netsync: false - radius: 2 color: brown - type: entity parent: [BaseBrandedLighter] id: HonkCoFlippo name: Honk Co. flippo - description: "A slippery gag lighter produced by Honk Co. hidden inside of a real banana peel." + description: A gag lighter hidden inside of a banana peel. Produced by Honk Co. components: - type: Sprite sprite: Objects/Tools/Lighters/honkco.rsi - type: Item sprite: Objects/Tools/Lighters/honkco.rsi - - type: ComponentToggler # This is super cursed and ends up deleting the fixtures when toggled off - components: - - type: Slippery - - type: StepTrigger - intersectRatio: 0.2 - - type: CollisionWake - enabled: false - - type: Physics - bodyType: Dynamic - - type: Fixtures - fixtures: - slips: - shape: - !type:PhysShapeAabb - bounds: "-0.4,-0.3,0.4,0.3" - layer: - - SlipLayer - hard: false - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.4,-0.3,0.4,0.3" - density: 10 - mask: - - ItemMask - - type: Welder # + - type: Welder fuelConsumption: 0.1 fuelLitCost: 1 - tankSafe: true + # Used to be slippery while lit, but worked very poorly and caused the fixtures to disappear - type: PointLight - enabled: false - netsync: false - radius: 2 color: yellow - type: entity - parent: [BaseBrandedLighter] + parent: [SolutionLighter, BaseBrandedLighter] id: DonkcoLighter name: Donk Co. flippo - description: "The flippo of choice for the seasoned traitor. A Breaded novelty lighter made by Donk Co. Somehow edible while lit." + description: The flippo of choice for the seasoned traitor. An edible novelty lighter made by Donk Co. components: - type: Sprite sprite: Objects/Tools/Lighters/donkco.rsi - type: Item sprite: Objects/Tools/Lighters/donkco.rsi - - type: Welder # - fuelConsumption: 0.02 - fuelLitCost: 0.1 - tankSafe: true + - type: PointLight + color: orange - type: Tag tags: - DonkPocket @@ -537,14 +436,9 @@ - SolutionFoodDonkpocketWarm - type: FlavorProfile flavors: - - bread - - meaty - - cheap - - type: ComponentToggler - components: - - type: Edible # This shouldn't be component toggler, but doesn't work when it's not - - type: PointLight - enabled: false - netsync: false - radius: 2 - color: orange + - bread + - meaty + - cheap + - type: Edible + trash: + - DiscountDanLighter # A prize hidden inside the donk! From ac547301bdc3eeae7ebca9e5d86a29c9b09f0883 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Sun, 17 May 2026 15:43:40 -0400 Subject: [PATCH 28/52] Code Cleanup Example: Admin Log Add tests (#43875) * Remove `var pair = Pair;` We can just use Pair directly. * Remove pair.Server and pair.Client We can just use Server and Client directly * Convert EntityManager resolves to SEntMan/CEntMan Some older tests still manually resolve these managers. More recent tests may use Server.EntMan/Client.EntMan, which should also be replaced by SEntMan/CEntMan. Although not shown here, this also applies to PrototypeManager, which shoud be replaced by SProtoMan/CProtoMan. * Convert System lookups to SidedDependencies * Convert entity spawning to use GameTest proxy methods. These methods also automatically track spawned entities for cleanup. Note that there are several methods, including an async one that can be awaited for use outside of WaitPost delegates. --- .../Tests/Administration/Logs/AddTests.cs | 149 +++++++----------- 1 file changed, 54 insertions(+), 95 deletions(-) diff --git a/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs b/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs index 71cb0fd7ed..d53b07b552 100644 --- a/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs +++ b/Content.IntegrationTests/Tests/Administration/Logs/AddTests.cs @@ -2,13 +2,13 @@ using System.Collections.Generic; using System.Linq; using Content.IntegrationTests.Fixtures; +using Content.IntegrationTests.Fixtures.Attributes; using Content.Server.Administration.Logs; using Content.Server.Database; using Content.Server.GameTicking; using Content.Shared.Administration.Logs; using Content.Shared.Database; using Robust.Server.Player; -using Robust.Shared.GameObjects; namespace Content.IntegrationTests.Tests.Administration.Logs; @@ -23,29 +23,28 @@ public sealed class AddTests : GameTest Connected = true }; + [SidedDependency(Side.Server)] private readonly IAdminLogManager _sAdminLogManager = null!; + [SidedDependency(Side.Server)] private readonly IServerDbManager _sDbManager = null!; + [SidedDependency(Side.Server)] private readonly GameTicker _sGameTicker = null!; + [SidedDependency(Side.Server)] private readonly IPlayerManager _sPlayerManager = null!; + [Test] public async Task AddAndGetSingleLog() { - var pair = Pair; - var server = pair.Server; - var sEntities = server.ResolveDependency(); - - var sAdminLogSystem = server.ResolveDependency(); - var guid = Guid.NewGuid(); - await pair.CreateTestMap(); - var coordinates = pair.TestMap!.GridCoords; - await server.WaitPost(() => + await Pair.CreateTestMap(); + var coordinates = Pair.TestMap!.GridCoords; + await Server.WaitPost(() => { - var entity = sEntities.SpawnEntity(null, coordinates); + var entity = SSpawnAtPosition(null, coordinates); - sAdminLogSystem.Add(LogType.Unknown, $"{entity:Entity} test log: {guid}"); + _sAdminLogManager.Add(LogType.Unknown, $"{entity:Entity} test log: {guid}"); }); - await PoolManager.WaitUntil(server, async () => + await PoolManager.WaitUntil(Server, async () => { - var logs = sAdminLogSystem.CurrentRoundJson(new LogFilter + var logs = _sAdminLogManager.CurrentRoundJson(new LogFilter { Search = guid.ToString() }); @@ -69,32 +68,22 @@ public sealed class AddTests : GameTest [Test] public async Task AddAndGetUnformattedLog() { - var pair = Pair; - var server = pair.Server; - - var sDatabase = server.ResolveDependency(); - var sEntities = server.ResolveDependency(); - var sSystems = server.ResolveDependency(); - - var sAdminLogSystem = server.ResolveDependency(); - var sGamerTicker = sSystems.GetEntitySystem(); - var guid = Guid.NewGuid(); - var testMap = await pair.CreateTestMap(); + var testMap = await Pair.CreateTestMap(); var coordinates = testMap.GridCoords; - await server.WaitPost(() => + await Server.WaitPost(() => { - var entity = sEntities.SpawnEntity(null, coordinates); + var entity = SSpawnAtPosition(null, coordinates); - sAdminLogSystem.Add(LogType.Unknown, $"{entity} test log: {guid}"); + _sAdminLogManager.Add(LogType.Unknown, $"{entity} test log: {guid}"); }); SharedAdminLog log = default; - await PoolManager.WaitUntil(server, async () => + await PoolManager.WaitUntil(Server, async () => { - var logs = await sAdminLogSystem.CurrentRoundLogs(new LogFilter + var logs = await _sAdminLogManager.CurrentRoundLogs(new LogFilter { Search = guid.ToString() }); @@ -110,12 +99,12 @@ public sealed class AddTests : GameTest var filter = new LogFilter { - Round = sGamerTicker.RoundId, + Round = _sGameTicker.RoundId, Search = log.Message, Types = new HashSet { log.Type }, }; - await foreach (var json in sDatabase.GetAdminLogsJson(filter)) + await foreach (var json in _sDbManager.GetAdminLogsJson(filter)) { var root = json.RootElement; @@ -133,27 +122,21 @@ public sealed class AddTests : GameTest [TestCase(500)] public async Task BulkAddLogs(int amount) { - var pair = Pair; - var server = pair.Server; - - var sEntities = server.ResolveDependency(); - var sAdminLogSystem = server.ResolveDependency(); - - var testMap = await pair.CreateTestMap(); + var testMap = await Pair.CreateTestMap(); var coordinates = testMap.GridCoords; - await server.WaitPost(() => + await Server.WaitPost(() => { - var entity = sEntities.SpawnEntity(null, coordinates); + var entity = SSpawnAtPosition(null, coordinates); for (var i = 0; i < amount; i++) { - sAdminLogSystem.Add(LogType.Unknown, $"{entity:Entity} test log."); + _sAdminLogManager.Add(LogType.Unknown, $"{entity:Entity} test log."); } }); - await PoolManager.WaitUntil(server, async () => + await PoolManager.WaitUntil(Server, async () => { - var messages = await sAdminLogSystem.CurrentRoundLogs(); + var messages = await _sAdminLogManager.CurrentRoundLogs(); return messages.Count >= amount; }); } @@ -161,28 +144,22 @@ public sealed class AddTests : GameTest [Test] public async Task AddPlayerSessionLog() { - var pair = Pair; - var server = pair.Server; - - var sPlayers = server.ResolveDependency(); - - var sAdminLogSystem = server.ResolveDependency(); Guid playerGuid = default; - await server.WaitPost(() => + await Server.WaitPost(() => { - var player = sPlayers.Sessions.First(); + var player = _sPlayerManager.Sessions.First(); playerGuid = player.UserId; Assert.DoesNotThrow(() => { - sAdminLogSystem.Add(LogType.Unknown, $"{player:Player} test log."); + _sAdminLogManager.Add(LogType.Unknown, $"{player:Player} test log."); }); }); - await PoolManager.WaitUntil(server, async () => + await PoolManager.WaitUntil(Server, async () => { - var logs = await sAdminLogSystem.CurrentRoundLogs(); + var logs = await _sAdminLogManager.CurrentRoundLogs(); if (logs.Count == 0) { return false; @@ -196,24 +173,18 @@ public sealed class AddTests : GameTest [Test] public async Task DuplicatePlayerDoesNotThrowTest() { - var pair = Pair; - var server = pair.Server; - - var sPlayers = server.ResolveDependency(); - var sAdminLogSystem = server.ResolveDependency(); - var guid = Guid.NewGuid(); - await server.WaitPost(() => + await Server.WaitPost(() => { - var player = sPlayers.Sessions.Single(); + var player = _sPlayerManager.Sessions.Single(); - sAdminLogSystem.Add(LogType.Unknown, $"{player} {player} test log: {guid}"); + _sAdminLogManager.Add(LogType.Unknown, $"{player} {player} test log: {guid}"); }); - await PoolManager.WaitUntil(server, async () => + await PoolManager.WaitUntil(Server, async () => { - var logs = await sAdminLogSystem.CurrentRoundLogs(new LogFilter + var logs = await _sAdminLogManager.CurrentRoundLogs(new LogFilter { Search = guid.ToString() }); @@ -230,25 +201,18 @@ public sealed class AddTests : GameTest [Test] public async Task DuplicatePlayerIdDoesNotThrowTest() { - var pair = Pair; - var server = pair.Server; - - var sPlayers = server.ResolveDependency(); - - var sAdminLogSystem = server.ResolveDependency(); - var guid = Guid.NewGuid(); - await server.WaitPost(() => + await Server.WaitPost(() => { - var player = sPlayers.Sessions.Single(); + var player = _sPlayerManager.Sessions.Single(); - sAdminLogSystem.Add(LogType.Unknown, $"{player:first} {player:second} test log: {guid}"); + _sAdminLogManager.Add(LogType.Unknown, $"{player:first} {player:second} test log: {guid}"); }); - await PoolManager.WaitUntil(server, async () => + await PoolManager.WaitUntil(Server, async () => { - var logs = await sAdminLogSystem.CurrentRoundLogs(new LogFilter + var logs = await _sAdminLogManager.CurrentRoundLogs(new LogFilter { Search = guid.ToString() }); @@ -272,35 +236,30 @@ public sealed class PreRoundAddTests : GameTest AdminLogsEnabled = true }; + [SidedDependency(Side.Server)] private readonly IAdminLogManager _sAdminLogManager = null!; + [SidedDependency(Side.Server)] private readonly IServerDbManager _sDbManager = null!; + [SidedDependency(Side.Server)] private readonly GameTicker _sGameTicker = null!; + [Test] public async Task PreRoundAddAndGetSingle() { - var pair = Pair; - var server = pair.Server; - - var sDatabase = server.ResolveDependency(); - var sSystems = server.ResolveDependency(); - - var sAdminLogSystem = server.ResolveDependency(); - var sGamerTicker = sSystems.GetEntitySystem(); - var guid = Guid.NewGuid(); - await server.WaitPost(() => + await Server.WaitPost(() => { - sAdminLogSystem.Add(LogType.Unknown, $"test log: {guid}"); + _sAdminLogManager.Add(LogType.Unknown, $"test log: {guid}"); }); - await server.WaitPost(() => + await Server.WaitPost(() => { - sGamerTicker.StartRound(true); + _sGameTicker.StartRound(true); }); SharedAdminLog log = default; - await PoolManager.WaitUntil(server, async () => + await PoolManager.WaitUntil(Server, async () => { - var logs = await sAdminLogSystem.CurrentRoundLogs(new LogFilter + var logs = await _sAdminLogManager.CurrentRoundLogs(new LogFilter { Search = guid.ToString() }); @@ -316,12 +275,12 @@ public sealed class PreRoundAddTests : GameTest var filter = new LogFilter { - Round = sGamerTicker.RoundId, + Round = _sGameTicker.RoundId, Search = log.Message, Types = new HashSet { log.Type }, }; - await foreach (var json in sDatabase.GetAdminLogsJson(filter)) + await foreach (var json in _sDbManager.GetAdminLogsJson(filter)) { var root = json.RootElement; From f20935b2a4872daeadebb26c2e4d643eed2f7b5c Mon Sep 17 00:00:00 2001 From: Connor Huffine Date: Sun, 17 May 2026 16:12:25 -0400 Subject: [PATCH 29/52] Fix MapInit NavMapBeacon Custom Text (#43898) Fix missing path to UpdateNavMapBeaconData --- Content.Server/Pinpointer/NavMapSystem.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs index ae28365c40..bef26e9867 100644 --- a/Content.Server/Pinpointer/NavMapSystem.cs +++ b/Content.Server/Pinpointer/NavMapSystem.cs @@ -163,11 +163,11 @@ public sealed partial class NavMapSystem : SharedNavMapSystem private void OnNavMapBeaconMapInit(EntityUid uid, NavMapBeaconComponent component, MapInitEvent args) { - if (component.DefaultText == null || component.Text != null) - return; - - component.Text = Loc.GetString(component.DefaultText); - Dirty(uid, component); + if (component.DefaultText != null && component.Text == null) + { + component.Text = Loc.GetString(component.DefaultText); + Dirty(uid, component); + } UpdateNavMapBeaconData(uid, component); } From 53da8728a464eff2a35a9f4e0f14c66e7d8912bc Mon Sep 17 00:00:00 2001 From: scrivoy <179060466+scrivoy@users.noreply.github.com> Date: Sun, 17 May 2026 22:13:19 +0200 Subject: [PATCH 30/52] Add Fake Wizard Robes (#36384) * add sprite * rename ID and add to magivend * move fake wizard clothes to AutoDrobe * reduce fake wizard clothes to one per machine * Update fake wizard robe inhand sprites to match standardized version --- .../VendingMachines/Inventories/magivend.yml | 1 - .../VendingMachines/Inventories/theater.yml | 2 ++ .../Entities/Clothing/OuterClothing/misc.yml | 11 +++++++ .../equipped-OUTERCLOTHING-vox.png | Bin 0 -> 5709 bytes .../equipped-OUTERCLOTHING.png | Bin 0 -> 5379 bytes .../Misc/wizard_fake.rsi/icon.png | Bin 0 -> 4689 bytes .../Misc/wizard_fake.rsi/inhand-left.png | Bin 0 -> 382 bytes .../Misc/wizard_fake.rsi/inhand-right.png | Bin 0 -> 345 bytes .../Misc/wizard_fake.rsi/meta.json | 30 ++++++++++++++++++ 9 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/equipped-OUTERCLOTHING-vox.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/icon.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml index b4f3bc80df..14699c40ce 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/magivend.yml @@ -3,7 +3,6 @@ startingInventory: ClothingHeadHatWizard: 3 ClothingOuterWizard: 3 - ClothingHeadHatWizardFake: 3 ClothingHeadHatRedwizard: 3 ClothingOuterWizardRed: 3 ClothingHeadHatVioletwizard: 3 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index 4ceaeef80c..4d2902fe0d 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -56,6 +56,8 @@ ClothingShoesBootsCowboyBrown: 1 ClothingShoesBootsCowboyBlack: 1 ClothingShoesBootsCowboyWhite: 1 + ClothingHeadHatWizardFake: 1 + ClothingOuterWizardFake: 1 contrabandInventory: ClothingHeadHatRichard: 1 ToyFigurineBoxer: 1 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml index f79e251e54..6ad290d4e3 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml @@ -233,6 +233,17 @@ tags: - WhitelistChameleon +- type: entity + parent: ClothingOuterBase + id: ClothingOuterWizardFake + name: fake wizard robes + description: Covered in glittery stars and mystery stains. Instantly boosts your arcane fashion sense. + components: + - type: Sprite + sprite: Clothing/OuterClothing/Misc/wizard_fake.rsi + - type: Clothing + sprite: Clothing/OuterClothing/Misc/wizard_fake.rsi + - type: entity parent: ClothingOuterBase id: ClothingOuterSkub diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/equipped-OUTERCLOTHING-vox.png b/Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/equipped-OUTERCLOTHING-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1d610bc38201625d0f33a202c110c3f3dffe35 GIT binary patch literal 5709 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 P65<2|`TzXQvb28#qyV1* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6b38752ae4ac208daa0fef5678d58fd0f78e66 GIT binary patch literal 5379 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/inhand-left.png b/Resources/Textures/Clothing/OuterClothing/Misc/wizard_fake.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..99c3c4d67c12a2952becb9b07002cd5b07150b6c GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofvPP)Tsw@SkfJR9T^xl z_H+M9WCijSl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP{KRF zC&bkd$Y5a5$~eKSm(OHWEo@Q9?KG8Vj=N^qEcUU zH>Ls2Vk`;r3ubV5b_2xWEbxddW?Tjv*0;-%i`e)nLHm(!E_~ z=BNMh*-`APn@w0QK9t*1aA6ON?5%4p0#18+79V_m=j0V@b3f6*-X29hVZ{S8*(1aR zE*gH*ygg-l+JmL?Mt|KIdBh!grU>2HU-eD@3hN7-6vY;SM-4}RH?rwV9y=Q^v}2)0 nN2s90%`V{`^?E<k44ofvPP)Tsw@SkfJR9T^xl z_H+M9WCijSl0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP(mfZ zC&U#<0|B#MK9f Date: Sun, 17 May 2026 20:30:56 +0000 Subject: [PATCH 31/52] 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 39478cefe9..fad90fd933 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: PickelSilly - changes: - - message: Added a new voice sensor item craftable at an autolathe, record a key - phrase, and speak it to trigger linked devices. - type: Add - id: 9184 - time: '2025-11-03T22:43:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/41098 - author: Centronias changes: - message: Bleach now actually does what its description says and can be used for @@ -4079,3 +4071,10 @@ id: 9695 time: '2026-05-17T19:17:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/43976 +- author: Nem + changes: + - message: Custom NavMapBeacon text is displayed + type: Fix + id: 9696 + time: '2026-05-17T20:29:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/43898 From 906db123e912430b08ca31ca9eac1fe2651c3495 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Sun, 17 May 2026 17:25:29 -0400 Subject: [PATCH 32/52] Test Cleanup: XenoArtifact (#43930) * GameTest conversion * Move string ids to consts * Description attributes * RunOnSide * TestOf --- .../Tests/XenoArtifactTest.cs | 434 ++++++++---------- 1 file changed, 199 insertions(+), 235 deletions(-) diff --git a/Content.IntegrationTests/Tests/XenoArtifactTest.cs b/Content.IntegrationTests/Tests/XenoArtifactTest.cs index 35b03470e9..584c17534e 100644 --- a/Content.IntegrationTests/Tests/XenoArtifactTest.cs +++ b/Content.IntegrationTests/Tests/XenoArtifactTest.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.IntegrationTests.Fixtures; +using Content.IntegrationTests.Fixtures.Attributes; using Content.Shared.Xenoarchaeology.Artifact; using Content.Shared.Xenoarchaeology.Artifact.Components; using Robust.Shared.GameObjects; @@ -7,12 +8,21 @@ using Robust.Shared.GameObjects; namespace Content.IntegrationTests.Tests; [TestFixture] +[TestOf(typeof(SharedXenoArtifactSystem))] public sealed class XenoArtifactTest : GameTest { + private const string TestArtifact = "TestArtifact"; + private const string TestArtifactNode = "TestArtifactNode"; + private const string TestGenArtifactFlat = "TestGenArtifactFlat"; + private const string TestGenArtifactTall = "TestGenArtifactTall"; + private const string TestGenArtifactFull = "TestGenArtifactFull"; + + [SidedDependency(Side.Server)] private SharedXenoArtifactSystem _sArtifactSystem = null!; + [TestPrototypes] - private const string Prototypes = @" + private const string Prototypes = $@" - type: entity - id: TestArtifact + id: {TestArtifact} parent: BaseXenoArtifact name: artifact components: @@ -22,7 +32,7 @@ public sealed class XenoArtifactTest : GameTest tableId: XenoArtifactEffectsDefaultTable - type: entity - id: TestGenArtifactFlat + id: {TestGenArtifactFlat} parent: BaseXenoArtifact name: artifact components: @@ -41,7 +51,7 @@ public sealed class XenoArtifactTest : GameTest tableId: XenoArtifactEffectsDefaultTable - type: entity - id: TestGenArtifactTall + id: {TestGenArtifactTall} parent: BaseXenoArtifact name: artifact components: @@ -60,7 +70,7 @@ public sealed class XenoArtifactTest : GameTest tableId: XenoArtifactEffectsDefaultTable - type: entity - id: TestGenArtifactFull + id: {TestGenArtifactFull} name: artifact components: - type: XenoArtifact @@ -78,7 +88,7 @@ public sealed class XenoArtifactTest : GameTest tableId: XenoArtifactEffectsDefaultTable - type: entity - id: TestArtifactNode + id: {TestArtifactNode} name: artifact node components: - type: XenoArtifactNode @@ -89,314 +99,268 @@ public sealed class XenoArtifactTest : GameTest /// Checks that adding nodes and edges properly adds them into the adjacency matrix /// [Test] + [Description("Checks that adding nodes and edges properly adds them into the adjacency matrix")] + [RunOnSide(Side.Server)] public async Task XenoArtifactAddNodeTest() { - var pair = Pair; - var server = pair.Server; + var artifactUid = SSpawn(TestArtifact); + var artifactEnt = (artifactUid, comp: SComp(artifactUid)); - var entManager = server.ResolveDependency(); - var artifactSystem = entManager.System(); + // Create 3 nodes + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node1, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node2, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node3, false)); - await server.WaitPost(() => - { - var artifactUid = entManager.Spawn("TestArtifact"); - var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + Assert.That(_sArtifactSystem.GetAllNodeIndices(artifactEnt).Count(), Is.EqualTo(3)); - // 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 from 1 -> 2 and 2-> 3 + _sArtifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); - Assert.That(artifactSystem.GetAllNodeIndices(artifactEnt).Count(), Is.EqualTo(3)); + // Assert that successors and direct successors are counted correctly for node 1. + Assert.That(_sArtifactSystem.GetDirectSuccessorNodes(artifactEnt, node1!.Value), Has.Count.EqualTo(1)); + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node1!.Value), Has.Count.EqualTo(2)); + // Assert that we didn't somehow get predecessors on node 1. + Assert.That(_sArtifactSystem.GetDirectPredecessorNodes(artifactEnt, node1!.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node1!.Value), Is.Empty); - // 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 2. + Assert.That(_sArtifactSystem.GetDirectSuccessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); + // Assert that predecessors and direct predecessors are counted correctly for node 2. + Assert.That(_sArtifactSystem.GetDirectPredecessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node2!.Value), Has.Count.EqualTo(1)); - // 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)); - }); + // Assert that successors and direct successors are counted correctly for node 3. + Assert.That(_sArtifactSystem.GetDirectSuccessorNodes(artifactEnt, node3!.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node3!.Value), Is.Empty); + // Assert that predecessors and direct predecessors are counted correctly for node 3. + Assert.That(_sArtifactSystem.GetDirectPredecessorNodes(artifactEnt, node3!.Value), Has.Count.EqualTo(1)); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node3!.Value), Has.Count.EqualTo(2)); } /// /// Checks to make sure that removing nodes properly cleans up all connections. /// [Test] + [Description("Checks to make sure that removing nodes properly cleans up all connections.")] + [RunOnSide(Side.Server)] public async Task XenoArtifactRemoveNodeTest() { - var pair = Pair; - var server = pair.Server; + var artifactUid = SSpawn(TestArtifact); + var artifactEnt = (artifactUid, comp: SComp(artifactUid)); - var entManager = server.ResolveDependency(); - var artifactSystem = entManager.System(); + // Create 3 nodes + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node1, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node2, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node3, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node4, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node5, false)); - await server.WaitPost(() => - { - var artifactUid = entManager.Spawn("TestArtifact"); - var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + Assert.That(_sArtifactSystem.GetAllNodeIndices(artifactEnt).Count(), Is.EqualTo(5)); - // 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)); + // Add connection: 1 -> 2 -> 3 -> 4 -> 5 + _sArtifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node3!.Value, node4!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node4!.Value, node5!.Value, false); - Assert.That(artifactSystem.GetAllNodeIndices(artifactEnt).Count(), Is.EqualTo(5)); + // Make sure we have a continuous connection between the two ends of the graph. + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node1.Value), Has.Count.EqualTo(4)); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node5.Value), Has.Count.EqualTo(4)); - // 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); + // Remove the node and make sure it's no longer in the artifact. + Assert.That(_sArtifactSystem.RemoveNode(artifactEnt, node3!.Value, false)); + Assert.That(_sArtifactSystem.TryGetIndex(artifactEnt, node3!.Value, out _), Is.False, "Node 3 still present in artifact."); - // 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); - }); + // Check to make sure that we got rid of all the connections. + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node2!.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node4!.Value), Is.Empty); } /// /// Sets up series of linked nodes and ensures that resizing the adjacency matrix doesn't disturb the connections /// [Test] + [Description("Sets up series of linked nodes and ensures that resizing the adjacency matrix doesn't disturb the connections")] + [RunOnSide(Side.Server)] public async Task XenoArtifactResizeTest() { - var pair = Pair; - var server = pair.Server; + var artifactUid = SSpawn(TestArtifact); + var artifactEnt = (artifactUid, comp: SComp(artifactUid)); - var entManager = server.ResolveDependency(); - var artifactSystem = entManager.System(); + // Create 3 nodes + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node1, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node2, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node3, false)); - await server.WaitPost(() => - { - var artifactUid = entManager.Spawn("TestArtifact"); - var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + // Add connection: 1 -> 2 -> 3 + _sArtifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); - // 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)); + // Make sure our connection is set up + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node1.Value, node2.Value)); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node2.Value, node3.Value)); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node2.Value, node1.Value), Is.False); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node3.Value, node2.Value), Is.False); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node1.Value, node3.Value), Is.False); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node3.Value, node1.Value), Is.False); - // Add connection: 1 -> 2 -> 3 - artifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); - artifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); + Assert.That(_sArtifactSystem.GetIndex(artifactEnt, node1!.Value), Is.Zero); + Assert.That(_sArtifactSystem.GetIndex(artifactEnt, node2!.Value), Is.EqualTo(1)); + Assert.That(_sArtifactSystem.GetIndex(artifactEnt, node3!.Value), Is.EqualTo(2)); - // 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); + // Add a new node, resizing the original adjacency matrix and array. + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node4)); - 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 our connections haven't changed. + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node1.Value, node2.Value)); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node2.Value, node3.Value)); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node2.Value, node1.Value), Is.False); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node3.Value, node2.Value), Is.False); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node1.Value, node3.Value), Is.False); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node3.Value, node1.Value), Is.False); - // Add a new node, resizing the original adjacency matrix and array. - Assert.That(artifactSystem.AddNode(artifactEnt, "TestArtifactNode", out var node4)); + // Has our array shifted any when we resized? + Assert.That(_sArtifactSystem.GetIndex(artifactEnt, node1!.Value), Is.Zero); + Assert.That(_sArtifactSystem.GetIndex(artifactEnt, node2!.Value), Is.EqualTo(1)); + Assert.That(_sArtifactSystem.GetIndex(artifactEnt, node3!.Value), Is.EqualTo(2)); - // 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); - }); + // Check that 4 didn't somehow end up with connections + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node4!.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node4!.Value), Is.Empty); } /// /// Checks if removing a node and adding a new node into its place in the adjacency matrix doesn't accidentally retain extra data. /// [Test] + [Description("Checks if removing a node and adding a new node into its place in the adjacency matrix doesn't accidentally retain extra data.")] + [RunOnSide(Side.Server)] public async Task XenoArtifactReplaceTest() { - var pair = Pair; - var server = pair.Server; + var artifactUid = SSpawn(TestArtifact); + var artifactEnt = (artifactUid, Comp: SComp(artifactUid)); - var entManager = server.ResolveDependency(); - var artifactSystem = entManager.System(); + // Create 3 nodes + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node1, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node2, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node3, false)); - await server.WaitPost(() => - { - var artifactUid = entManager.Spawn("TestArtifact"); - var artifactEnt = (artifactUid, comp: entManager.GetComponent(artifactUid)); + // Add connection: 1 -> 2 -> 3 + _sArtifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); - // 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)); + // Make sure our connection is set up + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node1.Value, node2.Value)); + Assert.That(_sArtifactSystem.NodeHasEdge(artifactEnt, node2.Value, node3.Value)); - // Add connection: 1 -> 2 -> 3 - artifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); - artifactSystem.AddEdge(artifactEnt, node2!.Value, node3!.Value, false); + // Remove middle node, severing connections + _sArtifactSystem.RemoveNode(artifactEnt, node2!.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)); + // Make sure our connection are properly severed. + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node1.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node3.Value), Is.Empty); - // Remove middle node, severing connections - artifactSystem.RemoveNode(artifactEnt, node2!.Value, false); + // Make sure our matrix is 3x3 + Assert.That(artifactEnt.Comp.NodeAdjacencyMatrixRows, Is.EqualTo(3)); + Assert.That(artifactEnt.Comp.NodeAdjacencyMatrixColumns, Is.EqualTo(3)); - // 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); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node4, false)); - // Make sure our matrix is 3x3 - Assert.That(artifactEnt.Item2.NodeAdjacencyMatrixRows, Is.EqualTo(3)); - Assert.That(artifactEnt.Item2.NodeAdjacencyMatrixColumns, Is.EqualTo(3)); + // Make sure that adding in a new node didn't add a new slot but instead re-used the middle slot. + Assert.That(artifactEnt.Comp.NodeAdjacencyMatrixRows, Is.EqualTo(3)); + Assert.That(artifactEnt.Comp.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); - - }); + // Ensure that all connections are still severed + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node1.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node3.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetSuccessorNodes(artifactEnt, node4!.Value), Is.Empty); + Assert.That(_sArtifactSystem.GetPredecessorNodes(artifactEnt, node4!.Value), Is.Empty); } /// /// Checks if the active nodes are properly detected. /// [Test] + [Description("Checks if the active nodes are properly detected.")] + [RunOnSide(Side.Server)] public async Task XenoArtifactBuildActiveNodesTest() { - var pair = Pair; - var server = pair.Server; + var artifactUid = SSpawn(TestArtifact); + Entity artifactEnt = (artifactUid, SComp(artifactUid)); - var entManager = server.ResolveDependency(); - var artifactSystem = entManager.System(); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node1, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node2, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node3, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node4, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node5, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node6, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node7, false)); + Assert.That(_sArtifactSystem.AddNode(artifactEnt, TestArtifactNode, out var node8, false)); - await server.WaitPost(() => - { - var artifactUid = entManager.Spawn("TestArtifact"); - Entity artifactEnt = (artifactUid, entManager.GetComponent(artifactUid)); + // /----( 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. + _sArtifactSystem.AddEdge(artifactEnt, node1!.Value, node2!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node1!.Value, node3!.Value, false); - 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)); + _sArtifactSystem.AddEdge(artifactEnt, node2!.Value, node4!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node2!.Value, node5!.Value, 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); + _sArtifactSystem.AddEdge(artifactEnt, node3!.Value, node6!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node3!.Value, node7!.Value, false); - artifactSystem.AddEdge(artifactEnt, node2!.Value, node4!.Value, false); - artifactSystem.AddEdge(artifactEnt, node2!.Value, node5!.Value, false); + _sArtifactSystem.AddEdge(artifactEnt, node7!.Value, node8!.Value, false); - artifactSystem.AddEdge(artifactEnt, node3!.Value, node6!.Value, false); - artifactSystem.AddEdge(artifactEnt, node3!.Value, node7!.Value, false); + _sArtifactSystem.SetNodeUnlocked(node1!.Value); + _sArtifactSystem.SetNodeUnlocked(node2!.Value); + _sArtifactSystem.SetNodeUnlocked(node3!.Value); + _sArtifactSystem.SetNodeUnlocked(node5!.Value); - 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)); - - }); + NetEntity[] expectedActiveNodes = + [ + SEntMan.GetNetEntity(node3!.Value.Owner), + SEntMan.GetNetEntity(node5!.Value.Owner) + ]; + Assert.That(artifactEnt.Comp.CachedActiveNodes, Is.SupersetOf(expectedActiveNodes)); + Assert.That(artifactEnt.Comp.CachedActiveNodes, Has.Count.EqualTo(expectedActiveNodes.Length)); } [Test] + [RunOnSide(Side.Server)] public async Task XenoArtifactGenerateSegmentsTest() { - var pair = Pair; - var server = pair.Server; + var artifact1Uid = SSpawn(TestGenArtifactFlat); + Entity artifact1Ent = (artifact1Uid, SComp(artifact1Uid)); - var entManager = server.ResolveDependency(); - var artifactSystem = entManager.System(); + var segments1 = _sArtifactSystem.GetSegments(artifact1Ent); + Assert.That(segments1, Has.Count.EqualTo(2)); + Assert.That(segments1[0], Has.Count.EqualTo(1)); + Assert.That(segments1[1], Has.Count.EqualTo(1)); - await server.WaitPost(() => - { - var artifact1Uid = entManager.Spawn("TestGenArtifactFlat"); - Entity artifact1Ent = (artifact1Uid, entManager.GetComponent(artifact1Uid)); + var artifact2Uid = SSpawn(TestGenArtifactTall); + Entity artifact2Ent = (artifact2Uid, SComp(artifact2Uid)); - 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 segments2 = _sArtifactSystem.GetSegments(artifact2Ent); + Assert.That(segments2, Has.Count.EqualTo(1)); + Assert.That(segments2[0], Has.Count.EqualTo(2)); - var artifact2Uid = entManager.Spawn("TestGenArtifactTall"); - Entity artifact2Ent = (artifact2Uid, entManager.GetComponent(artifact2Uid)); + var artifact3Uid = SSpawn(TestGenArtifactFull); + Entity artifact3Ent = (artifact3Uid, SComp(artifact3Uid)); - 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! - - }); + var segments3 = _sArtifactSystem.GetSegments(artifact3Ent); + Assert.That(segments3, Has.Count.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! } } From 7bcfc74cee3b08d45b09758b7a8fb721cb771709 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sun, 17 May 2026 23:58:59 +0200 Subject: [PATCH 33/52] Add integration test for wielding and multi-handed items (#41028) * one hand test * the rest of the owl * fix test * client fix * fix the fix * const strings * breaking changes --- .../Tests/Hands/MultiHandedItemTest.cs | 495 ++++++++++++++++++ .../Interaction/InteractionTest.Helpers.cs | 31 ++ .../HTN/Preconditions/WieldedPrecondition.cs | 2 +- .../Operators/Combat/WieldOperator.cs | 4 +- .../EntitySystems/SharedHandsSystem.Drop.cs | 14 + .../SharedHandsSystem.Interactions.cs | 24 +- .../Hands/EntitySystems/SharedHandsSystem.cs | 21 + .../Item/MultiHandedItemComponent.cs | 3 + .../Wieldable/SharedWieldableSystem.cs | 81 +-- 9 files changed, 619 insertions(+), 56 deletions(-) create mode 100644 Content.IntegrationTests/Tests/Hands/MultiHandedItemTest.cs diff --git a/Content.IntegrationTests/Tests/Hands/MultiHandedItemTest.cs b/Content.IntegrationTests/Tests/Hands/MultiHandedItemTest.cs new file mode 100644 index 0000000000..69594a5211 --- /dev/null +++ b/Content.IntegrationTests/Tests/Hands/MultiHandedItemTest.cs @@ -0,0 +1,495 @@ +using Content.IntegrationTests.Tests.Interaction; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Inventory.VirtualItem; +using Content.Shared.Item; +using Content.Shared.Wieldable; +using Content.Shared.Wieldable.Components; + +namespace Content.IntegrationTests.Tests.Hands; + +[TestOf(typeof(MultiHandedItemComponent))] +[TestOf(typeof(WieldableComponent))] +public abstract class BaseMultiHandedItemTest : InteractionTest +{ + protected SharedHandsSystem CHands = default!; + protected SharedHandsSystem SHands = default!; + protected SharedWieldableSystem SWieldable = default!; + + protected const string Dummy1 = "DummyOneHanded"; + protected const string Dummy2 = "DummyTwoHanded"; + protected const string Dummy3 = "DummyThreeHanded"; + protected const string Dummy4 = "DummyFourHanded"; + protected const string Crowbar1 = "CrowbarOneHanded"; + protected const string Crowbar2 = "CrowbarTwoHanded"; + protected const string Crowbar3 = "CrowbarThreeHanded"; + protected const string CrowbarWield1 = "CrowbarWieldableOneHanded"; + protected const string CrowbarWield2 = "CrowbarWieldableTwoHanded"; + protected const string CrowbarWield3 = "CrowbarWieldableThreeHanded"; + + [TestPrototypes] + private const string TestPrototypes = @$" +- type: entity + id: {Dummy1} + name: Urist McOneHand + components: + - type: DoAfter + - type: Hands + hands: + hand_right: + location: Right + sortedHands: + - hand_right + - type: ComplexInteraction + - type: MindContainer + - type: Puller + +- type: entity + parent: {Dummy1} + id: {Dummy2} + name: Urist McTwoHands + components: + - type: Hands + hands: + hand_right: + location: Right + hand_left: + location: Left + sortedHands: + - hand_right + - hand_left + +- type: entity + parent: {Dummy1} + id: {Dummy3} + name: Urist McThreeHands + components: + - type: Hands + hands: + hand_right: + location: Right + hand_middle: + location: Middle + hand_left: + location: Left + sortedHands: + - hand_right + - hand_middle + - hand_left + +- type: entity + parent: {Dummy1} + id: {Dummy4} + name: Urist McFourHands + components: + - type: Hands + hands: + hand_right1: + location: Right + hand_right2: + location: Right + hand_left1: + location: Left + hand_left2: + location: Left + sortedHands: + - hand_right1 + - hand_right2 + - hand_left1 + - hand_left2 + +- type: entity + parent: BaseItem + id: {Crowbar1} + components: + - type: Sprite + sprite: Objects/Tools/crowbar.rsi + state: icon + +- type: entity + parent: {Crowbar1} + id: {Crowbar2} + components: + - type: MultiHandedItem + handsNeeded: 2 + +- type: entity + parent: {Crowbar1} + id: {Crowbar3} + components: + - type: MultiHandedItem + handsNeeded: 3 + +- type: entity + parent: {Crowbar1} + id: {CrowbarWield1} + components: + - type: Wieldable + freeHandsRequired: 0 + +- type: entity + parent: {Crowbar1} + id: {CrowbarWield2} + components: + - type: Wieldable + freeHandsRequired: 1 + +- type: entity + parent: {Crowbar1} + id: {CrowbarWield3} + components: + - type: Wieldable + freeHandsRequired: 2 +"; + + [SetUp] + public override async Task Setup() + { + await base.Setup(); + + CHands = CEntMan.System(); + SHands = SEntMan.System(); + SWieldable = SEntMan.System(); + } + + protected async Task AssertHandItems(int hands, int freeHands, int items, int virtualItems) + { + await RunTicks(3); + await Server.WaitAssertion(() => + { + + var itemCount = 0; + var virtualItemCount = 0; + + foreach (var item in SHands.EnumerateHeld(SPlayer)) + { + itemCount++; + if (SEntMan.HasComponent(item)) + virtualItemCount++; + } + + Assert.Multiple(() => + { + Assert.That(SHands.GetHandCount(SPlayer), Is.EqualTo(hands)); + Assert.That(SHands.CountFreeHands(SPlayer), Is.EqualTo(freeHands)); + Assert.That(itemCount, Is.EqualTo(items)); + Assert.That(virtualItemCount, Is.EqualTo(virtualItems)); + }); + }); + await Client.WaitAssertion(() => + { + var itemCount = 0; + var virtualItemCount = 0; + + foreach (var item in CHands.EnumerateHeld(CPlayer)) + { + itemCount++; + if (CEntMan.HasComponent(item)) + virtualItemCount++; + } + + Assert.Multiple(() => + { + Assert.That(CHands.GetHandCount(CPlayer), Is.EqualTo(hands)); + Assert.That(CHands.CountFreeHands(CPlayer), Is.EqualTo(freeHands)); + Assert.That(itemCount, Is.EqualTo(items)); + Assert.That(virtualItemCount, Is.EqualTo(virtualItems)); + }); + }); + } +} + +// we need a separate fixture for each hand amount so that we can override the PlayerPrototype +public sealed class OneHandedItemTestFixture : BaseMultiHandedItemTest +{ + protected override string PlayerPrototype => Dummy1; + + /// + /// Tries out a few possible combinations for using multi-handed and wieldable items while having one hand. + /// This does not cover all possible scenarios, so if something breaks at some point then add it here as well. + /// + [Test] + public async Task OneHandedItemTest() + { + // Start with one empty hand + await AssertHandItems(1, 1, 0, 0); + + // We can pick up a one-handed item with one hand + await SpawnTarget(Crowbar1); + await Pickup(); + await SwapHands(); // does nothing but we try anyways + await AssertHandItems(1, 0, 1, 0); + + // We cannot pick up a second item + await SpawnTarget(Crowbar1); + await Server.WaitAssertion(() => + { + Assert.That(SHands.TryPickupAnyHand(SPlayer, STarget.Value), Is.False); + }); + await AssertHandItems(1, 0, 1, 0); + + // We can drop our current item to free up the hand + await Drop(); + await AssertHandItems(1, 1, 0, 0); + + // We cannot pick up a multi-handed item + await SpawnTarget(Crowbar2); + await Server.WaitAssertion(() => + { + Assert.That(SHands.TryPickupAnyHand(SPlayer, STarget.Value), Is.False); + }); + await AssertHandItems(1, 1, 0, 0); + + // Spawn a wieldable Crowbar that does not need extra hands, pick it up, wield it + await SpawnTarget(CrowbarWield1); + await Pickup(); + await AssertHandItems(1, 0, 1, 0); + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.True); + }); + await AssertHandItems(1, 0, 1, 0); + + // Drop the wielded item + await Drop(); + await AssertHandItems(1, 1, 0, 0); + + // Spawn a wieldable Crowbar that needs extra hands, pick it up, fail to wield it + await SpawnTarget(CrowbarWield2); + await Pickup(); + await AssertHandItems(1, 0, 1, 0); + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.False); + }); + await AssertHandItems(1, 0, 1, 0); + + // Drop the unwielded item + await Drop(); + await AssertHandItems(1, 1, 0, 0); + } +} + +public sealed class TwoHandedItemTestFixture : BaseMultiHandedItemTest +{ + protected override string PlayerPrototype => Dummy2; + + /// + /// Tries out a few possible combinations for using multi-handed and wieldable items while having two hands. + /// This does not cover all possible scenarios, so if something breaks at some point then add it here as well. + /// + [Test] + public async Task TwoHandedItemTest() + { + // Start with two empty hands + await AssertHandItems(2, 2, 0, 0); + + // We can pick up a one-handed item with one hand + await SpawnTarget(Crowbar1); + await Pickup(); + await SwapHands(); + await AssertHandItems(2, 1, 1, 0); + + // We can pick up another one-handed item with the second hand + await SpawnTarget(Crowbar1); + await Pickup(); + await SwapHands(); + await AssertHandItems(2, 0, 2, 0); + + // We cannot pick up a third item + await SpawnTarget(Crowbar1); + await Server.WaitAssertion(() => + { + Assert.That(SHands.TryPickupAnyHand(SPlayer, STarget.Value), Is.False); + }); + await AssertHandItems(2, 0, 2, 0); + + // Drop all items + await DropAll(); + await AssertHandItems(2, 2, 0, 0); + + // We can pick up a two-handed item with two hands + await SpawnTarget(Crowbar2); + await Pickup(); + await SwapHands(); + await AssertHandItems(2, 0, 2, 1); + + // We cannot pick up a second item + await SpawnTarget(Crowbar1); + await Server.WaitAssertion(() => + { + Assert.That(SHands.TryPickupAnyHand(SPlayer, STarget.Value), Is.False); + }); + await AssertHandItems(2, 0, 2, 1); + + // Drop all items + await DropAll(); + await AssertHandItems(2, 2, 0, 0); + + // We can pick up a one-handed item with one hand + var handOneItem = await SpawnTarget(Crowbar1); + await Pickup(); + await SwapHands(); + await AssertHandItems(2, 1, 1, 0); + + // We cannot pick up a two-handed item with only one free hand + await SpawnTarget(Crowbar2); + await Server.WaitAssertion(() => + { + Assert.That(SHands.TryPickupAnyHand(SPlayer, STarget.Value), Is.False); + }); + await AssertHandItems(2, 1, 1, 0); + + // We can pick up a one handed wieldable item + await SpawnTarget(CrowbarWield1); + await Pickup(); + await AssertHandItems(2, 0, 2, 0); + + // We can wield the one-handed wieldable item without dropping other items + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.True); + }); + Assert.That(SHands.IsHolding(SPlayer, ToServer(handOneItem)), Is.True); + await AssertHandItems(2, 0, 2, 0); + + // Drop it and pick up a two-handed wieldable item + await Drop(); + await AssertHandItems(2, 1, 1, 0); + await SpawnTarget(CrowbarWield2); + await Pickup(); + await AssertHandItems(2, 0, 2, 0); + + // We can wield the two-handed wieldable item, but drop the item in the other hand while doing so + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.True); + }); + Assert.That(SHands.IsHolding(SPlayer, ToServer(handOneItem)), Is.False); + await AssertHandItems(2, 0, 2, 1); + + // Drop the wielded item + await Drop(); + await AssertHandItems(2, 2, 0, 0); + + // We cannot pick up a three-handed item + await SpawnTarget(Crowbar3); + await Server.WaitAssertion(() => + { + Assert.That(SHands.TryPickupAnyHand(SPlayer, STarget.Value), Is.False); + }); + await AssertHandItems(2, 2, 0, 0); + + // We can pick up a three-handed wieldable item + await SpawnTarget(CrowbarWield3); + await Server.WaitAssertion(() => + { + Assert.That(SHands.TryPickupAnyHand(SPlayer, STarget.Value), Is.True); + }); + await AssertHandItems(2, 1, 1, 0); + + // But we cannot wield it + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.False); + }); + await AssertHandItems(2, 1, 1, 0); + } +} + +public sealed class ThreeHandedItemTestFixture : BaseMultiHandedItemTest +{ + protected override string PlayerPrototype => Dummy3; + + /// + /// Tries out a few possible combinations for using multi-handed and wieldable items while having three hands. + /// This does not cover all possible scenarios, so if something breaks at some point then add it here as well. + /// + [Test] + public async Task ThreeHandedItemTest() + { + // Start with three empty hands + await AssertHandItems(3, 3, 0, 0); + + // We can pick up a three-handed item + await SpawnTarget(Crowbar3); + await Pickup(); + await AssertHandItems(3, 0, 3, 2); + + // Drop it + await Drop(); + await AssertHandItems(3, 3, 0, 0); + + // We can pick up a two-handed wieldable item + var handOneItem = await SpawnTarget(CrowbarWield2); + await Pickup(); + await AssertHandItems(3, 2, 1, 0); + + // And we can wield it + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.True); + }); + await AssertHandItems(3, 1, 2, 1); + + // We can pick up a second two-handed wieldable item + await SwapHands(); + await SwapHands(); + await SpawnTarget(CrowbarWield2); + await Pickup(); + await AssertHandItems(3, 0, 3, 1); + + // And wielding it drops the first item + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.True); + }); + Assert.That(SHands.IsHolding(SPlayer, ToServer(handOneItem)), Is.False); + await AssertHandItems(3, 1, 2, 1); + } +} + +public sealed class FourHandedItemTestFixture : BaseMultiHandedItemTest +{ + protected override string PlayerPrototype => Dummy4; + + /// + /// Tries out a few possible combinations for using multi-handed and wieldable items while having four hands. + /// This does not cover all possible scenarios, so if something breaks at some point then add it here as well. + /// + [Test] + public async Task FourHandedItemTest() + { + // Start with four empty hands + await AssertHandItems(4, 4, 0, 0); + + // We can wield two two-handed wieldable items at the same time + await SpawnTarget(CrowbarWield2); + await Pickup(); + await AssertHandItems(4, 3, 1, 0); + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.True); + }); + await AssertHandItems(4, 2, 2, 1); + await SwapHands(); + await SwapHands(); + await SpawnTarget(CrowbarWield2); + await Pickup(); + await AssertHandItems(4, 1, 3, 1); + await Server.WaitAssertion(() => + { + Assert.That(SWieldable.TryWield(STarget.Value, SPlayer), Is.True); + }); + await AssertHandItems(4, 0, 4, 2); + + // Drop the first item + await Drop(); + await AssertHandItems(4, 2, 2, 1); + + // Drop the second item + await SwapHands(); + await SwapHands(); + await Drop(); + await AssertHandItems(4, 4, 0, 0); + } +} diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs index 0f85397901..19f3c503ec 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs @@ -259,6 +259,7 @@ public abstract partial class InteractionTest /// /// Drops the currently held entity. + /// Causes an error if no entity was held. /// protected async Task Drop() { @@ -277,6 +278,36 @@ public abstract partial class InteractionTest Assert.That(HandSys.GetActiveItem((ToServer(Player), Hands)), Is.Null); } + /// + /// Drops all currently held entities. + /// Does nothing if no entity was held. + /// + protected async Task DropAll() + { + await Server.WaitPost(() => + { + HandSys.DropAll((ToServer(Player), Hands)); + }); + + await RunTicks(1); + + // make sure that all hands are empty + Assert.That(HandSys.GetEmptyHandCount((ToServer(Player), Hands)), Is.EqualTo(HandSys.GetHandCount((ToServer(Player), Hands)))); + } + + /// + /// Swaps the current hand. + /// + protected async Task SwapHands(bool reverse = false) + { + await Server.WaitPost(() => + { + HandSys.SwapHands((ToServer(Player), Hands), reverse: reverse); + }); + + await RunTicks(1); + } + #region Interact /// diff --git a/Content.Server/NPC/HTN/Preconditions/WieldedPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/WieldedPrecondition.cs index fa6901645a..ee6a89d61c 100644 --- a/Content.Server/NPC/HTN/Preconditions/WieldedPrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/WieldedPrecondition.cs @@ -40,6 +40,6 @@ public sealed partial class WieldedPrecondition : HTNPrecondition return false; var wieldableSystem = _entManager.System(); - return wieldableSystem.CanWield(heldEntity.Value, wieldable, owner, quiet: true); + return wieldableSystem.CanWield((heldEntity.Value, wieldable), owner, quiet: true); } } diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/WieldOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/WieldOperator.cs index 6c57a683e8..c70a8407db 100644 --- a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/WieldOperator.cs +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/WieldOperator.cs @@ -38,7 +38,7 @@ public sealed partial class WieldOperator : HTNOperator if (wieldable.Wielded) return HTNOperatorStatus.Failed; - return wieldableSystem.TryWield(weaponUid.Value, wieldable, owner) + return wieldableSystem.TryWield((weaponUid.Value, wieldable), owner) ? HTNOperatorStatus.Finished : HTNOperatorStatus.Failed; } @@ -46,7 +46,7 @@ public sealed partial class WieldOperator : HTNOperator if (!wieldable.Wielded) return HTNOperatorStatus.Failed; - return wieldableSystem.TryUnwield(weaponUid.Value, wieldable, owner) + return wieldableSystem.TryUnwield((weaponUid.Value, wieldable), owner) ? HTNOperatorStatus.Finished : HTNOperatorStatus.Failed; } diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs index 0d32d279be..516cae61e9 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Drop.cs @@ -190,6 +190,20 @@ public abstract partial class SharedHandsSystem return true; } + /// + /// Tries to drop all currently held items. + /// + public void DropAll(Entity ent, EntityCoordinates? targetDropLocation = null, bool checkActionBlocker = true, bool doDropInteraction = true) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + foreach (var hand in EnumerateHands(ent)) + { + TryDrop(ent, hand, targetDropLocation, checkActionBlocker, doDropInteraction); + } + } + /// /// Calculates the final location a dropped item will end up at, accounting for max drop range and collision along the targeted drop path, Does a check to see if a user should bypass those checks as well. /// diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs index cd6085535a..4dad0cb92a 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs @@ -81,30 +81,18 @@ public abstract partial class SharedHandsSystem : EntitySystem private void SwapHandsPressed(ICommonSession? session) { - SwapHands(session, false); + if (session?.AttachedEntity is not { } player) + return; + + SwapHands(player, true, false); } private void SwapHandsReversePressed(ICommonSession? session) { - SwapHands(session, true); - } - - private void SwapHands(ICommonSession? session, bool reverse) - { - if (!TryComp(session?.AttachedEntity, out HandsComponent? component)) + if (session?.AttachedEntity is not { } player) return; - if (!_actionBlocker.CanInteract(session.AttachedEntity.Value, null)) - return; - - if (component.ActiveHandId == null || component.Hands.Count < 2) - return; - - var currentIndex = component.SortedHands.IndexOf(component.ActiveHandId); - var newActiveIndex = (currentIndex + (reverse ? -1 : 1) + component.Hands.Count) % component.Hands.Count; - var nextHand = component.SortedHands[newActiveIndex]; - - TrySetActiveHand((session.AttachedEntity.Value, component), nextHand); + SwapHands(player, true, true); } private bool DropPressed(ICommonSession? session, EntityCoordinates coords, EntityUid netEntity) diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs index c469c6b9a7..b6584cfdc8 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.cs @@ -341,6 +341,27 @@ public abstract partial class SharedHandsSystem return true; } + /// + /// Cycles the currently active hand. + /// + public void SwapHands(Entity ent, bool checkActionBlocker = false, bool reverse = false) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + if (checkActionBlocker && !_actionBlocker.CanInteract(ent.Owner, null)) + return; + + if (ent.Comp.ActiveHandId == null || ent.Comp.Hands.Count < 2) + return; + + var currentIndex = ent.Comp.SortedHands.IndexOf(ent.Comp.ActiveHandId); + var newActiveIndex = (currentIndex + (reverse ? -1 : 1) + ent.Comp.Hands.Count) % ent.Comp.Hands.Count; + var nextHand = ent.Comp.SortedHands[newActiveIndex]; + + TrySetActiveHand(ent, nextHand); + } + public bool IsHolding(Entity entity, [NotNullWhen(true)] EntityUid? item) { return IsHolding(entity, item, out _); diff --git a/Content.Shared/Item/MultiHandedItemComponent.cs b/Content.Shared/Item/MultiHandedItemComponent.cs index 3a0ac23bcd..e54b14f464 100644 --- a/Content.Shared/Item/MultiHandedItemComponent.cs +++ b/Content.Shared/Item/MultiHandedItemComponent.cs @@ -9,6 +9,9 @@ namespace Content.Shared.Item; [RegisterComponent, NetworkedComponent] public sealed partial class MultiHandedItemComponent : Component { + /// + /// Number of free hands required to hold the item. + /// [DataField] public int HandsNeeded = 2; } diff --git a/Content.Shared/Wieldable/SharedWieldableSystem.cs b/Content.Shared/Wieldable/SharedWieldableSystem.cs index 97dd8796bb..570073bd44 100644 --- a/Content.Shared/Wieldable/SharedWieldableSystem.cs +++ b/Content.Shared/Wieldable/SharedWieldableSystem.cs @@ -1,4 +1,3 @@ -using System.Linq; using Content.Shared.Examine; using Content.Shared.Hands; using Content.Shared.Hands.Components; @@ -115,7 +114,7 @@ public abstract partial class SharedWieldableSystem : EntitySystem if (_hands.GetHandCount(args.User) > 2) return; - TryUnwield(uid, component, args.User); + TryUnwield((uid, component), args.User); } private void OnGunRefreshModifiers(Entity bonus, ref GunRefreshModifiersEvent args) @@ -179,8 +178,8 @@ public abstract partial class SharedWieldableSystem : EntitySystem { Text = component.Wielded ? Loc.GetString("wieldable-verb-text-unwield") : Loc.GetString("wieldable-verb-text-wield"), Act = component.Wielded - ? () => TryUnwield(uid, component, args.User) - : () => TryWield(uid, component, args.User) + ? () => TryUnwield((uid, component), args.User) + : () => TryWield((uid, component), args.User) }; args.Verbs.Add(verb); @@ -193,12 +192,12 @@ public abstract partial class SharedWieldableSystem : EntitySystem if (!component.Wielded) { - TryWield(uid, component, args.User); + TryWield((uid, component), args.User); args.Handled = true; // always mark as handled or we will cycle ammo when wielding is blocked } else if (component.UnwieldOnUse) { - TryUnwield(uid, component, args.User); + TryUnwield((uid, component), args.User); args.Handled = true; } @@ -241,8 +240,14 @@ public abstract partial class SharedWieldableSystem : EntitySystem args.Cancelled = true; } - public bool CanWield(EntityUid uid, WieldableComponent component, EntityUid user, bool quiet = false) + /// + /// Returns true if the given player can currently wield the given wieldable item. + /// + public bool CanWield(Entity wieldable, EntityUid user, bool quiet = false) { + if (!Resolve(wieldable, ref wieldable.Comp, false)) + return false; + // Do they have enough hands free? if (!TryComp(user, out var hands)) { @@ -252,19 +257,19 @@ public abstract partial class SharedWieldableSystem : EntitySystem } // Is it.. actually in one of their hands? - if (!_hands.IsHolding((user, hands), uid, out _)) + if (!_hands.IsHolding((user, hands), wieldable, out _)) { if (!quiet) - _popup.PopupClient(Loc.GetString("wieldable-component-not-in-hands", ("item", uid)), user, user); + _popup.PopupClient(Loc.GetString("wieldable-component-not-in-hands", ("item", wieldable.Owner)), user, user); return false; } - if (_hands.CountFreeableHands((user, hands), except: uid) < component.FreeHandsRequired) + if (_hands.CountFreeableHands((user, hands), except: wieldable.Owner) < wieldable.Comp.FreeHandsRequired) { if (!quiet) { var message = Loc.GetString("wieldable-component-not-enough-free-hands", - ("number", component.FreeHandsRequired), ("item", uid)); + ("number", wieldable.Comp.FreeHandsRequired), ("item", wieldable.Owner)); _popup.PopupClient(message, user, user); } return false; @@ -278,18 +283,21 @@ public abstract partial class SharedWieldableSystem : EntitySystem /// Attempts to wield an item, starting a UseDelay after. /// /// True if the attempt wasn't blocked. - public bool TryWield(EntityUid used, WieldableComponent component, EntityUid user) + public bool TryWield(Entity wieldable, EntityUid user) { - if (!CanWield(used, component, user)) + if (!Resolve(wieldable, ref wieldable.Comp, false)) return false; - if (TryComp(used, out UseDelayComponent? useDelay) && component.UseDelayOnWield) + if (!CanWield(wieldable, user)) + return false; + + if (TryComp(wieldable, out UseDelayComponent? useDelay) && wieldable.Comp.UseDelayOnWield) { - if (!_delay.TryResetDelay((used, useDelay), true)) + if (!_delay.TryResetDelay((wieldable.Owner, useDelay), true)) return false; } - var attemptEv = new WieldAttemptEvent(user, used); + var attemptEv = new WieldAttemptEvent(user, wieldable.Owner); RaiseLocalEvent(user, ref attemptEv); if (attemptEv.Cancelled) @@ -299,23 +307,23 @@ public abstract partial class SharedWieldableSystem : EntitySystem return false; } - if (TryComp(used, out var item)) + if (TryComp(wieldable, out var item)) { - component.OldInhandPrefix = item.HeldPrefix; - _item.SetHeldPrefix(used, component.WieldedInhandPrefix, component: item); + wieldable.Comp.OldInhandPrefix = item.HeldPrefix; + _item.SetHeldPrefix(wieldable.Owner, wieldable.Comp.WieldedInhandPrefix, component: item); } - SetWielded((used, component), true); + SetWielded(wieldable!, true); - if (component.WieldSound != null) - _audio.PlayPredicted(component.WieldSound, used, user); + if (wieldable.Comp.WieldSound != null) + _audio.PlayPredicted(wieldable.Comp.WieldSound, wieldable.Owner, user); //This section handles spawning the virtual item(s) to occupy the required additional hand(s). var virtuals = new ValueList(); - for (var i = 0; i < component.FreeHandsRequired; i++) + for (var i = 0; i < wieldable.Comp.FreeHandsRequired; i++) { // don't show a popup when dropping items because it will overlap with the popup for wielding - if (_virtualItem.TrySpawnVirtualItemInHand(used, user, out var virtualItem, true, silent: true)) + if (_virtualItem.TrySpawnVirtualItemInHand(wieldable.Owner, user, out var virtualItem, true, silent: true)) { virtuals.Add(virtualItem.Value); continue; @@ -329,12 +337,12 @@ public abstract partial class SharedWieldableSystem : EntitySystem return false; } - var selfMessage = Loc.GetString("wieldable-component-successful-wield", ("item", used)); - var othersMessage = Loc.GetString("wieldable-component-successful-wield-other", ("user", Identity.Entity(user, EntityManager)), ("item", used)); + var selfMessage = Loc.GetString("wieldable-component-successful-wield", ("item", wieldable.Owner)); + var othersMessage = Loc.GetString("wieldable-component-successful-wield-other", ("user", Identity.Entity(user, EntityManager)), ("item", wieldable.Owner)); _popup.PopupPredicted(selfMessage, othersMessage, user, user); var ev = new ItemWieldedEvent(user); - RaiseLocalEvent(used, ref ev); + RaiseLocalEvent(wieldable.Owner, ref ev); return true; } @@ -343,14 +351,17 @@ public abstract partial class SharedWieldableSystem : EntitySystem /// Attempts to unwield an item, with no use delay. /// /// True if the attempt wasn't blocked. - public bool TryUnwield(EntityUid used, WieldableComponent component, EntityUid user, bool force = false) + public bool TryUnwield(Entity wieldable, EntityUid user, bool force = false) { - if (!component.Wielded) + if (!Resolve(wieldable, ref wieldable.Comp, false)) + return false; + + if (!wieldable.Comp.Wielded) return false; // already unwielded if (!force) { - var attemptEv = new UnwieldAttemptEvent(user, used); + var attemptEv = new UnwieldAttemptEvent(user, wieldable.Owner); RaiseLocalEvent(user, ref attemptEv); if (attemptEv.Cancelled) @@ -361,10 +372,10 @@ public abstract partial class SharedWieldableSystem : EntitySystem } } - SetWielded((used, component), false); + SetWielded(wieldable!, false); var ev = new ItemUnwieldedEvent(user, force); - RaiseLocalEvent(used, ref ev); + RaiseLocalEvent(wieldable.Owner, ref ev); return true; } @@ -377,7 +388,7 @@ public abstract partial class SharedWieldableSystem : EntitySystem foreach (var held in _hands.EnumerateHeld(wielder)) { if (TryComp(held, out var wieldable)) - TryUnwield(held, wieldable, wielder, force); + TryUnwield((held, wieldable), wielder, force); } } @@ -412,13 +423,13 @@ public abstract partial class SharedWieldableSystem : EntitySystem private void OnItemLeaveHand(EntityUid uid, WieldableComponent component, GotUnequippedHandEvent args) { if (uid == args.Unequipped) - TryUnwield(uid, component, args.User, force: true); + TryUnwield((uid, component), args.User, force: true); } private void OnVirtualItemDeleted(EntityUid uid, WieldableComponent component, VirtualItemDeletedEvent args) { if (args.BlockingEntity == uid) - TryUnwield(uid, component, args.User, force: true); + TryUnwield((uid, component), args.User, force: true); } private void OnGetMeleeDamage(EntityUid uid, IncreaseDamageOnWieldComponent component, ref GetMeleeDamageEvent args) From cbaae040f4d15ba2737317ad123cb4dc069b1b10 Mon Sep 17 00:00:00 2001 From: ProPeperos <61984624+ProPeperos@users.noreply.github.com> Date: Mon, 18 May 2026 00:13:59 +0200 Subject: [PATCH 34/52] Tradestation now has automated atmos! (#43973) trade station baby!!! --- Resources/Maps/Shuttles/trading_outpost.yml | 221 +++++++++++++++----- 1 file changed, 163 insertions(+), 58 deletions(-) diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index 42b906eaa1..e80173a951 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Grid - engineVersion: 260.2.0 + engineVersion: 277.0.0 forkId: "" forkVersion: "" - time: 05/28/2025 08:16:27 - entityCount: 1096 + time: 05/17/2026 11:34:03 + entityCount: 1104 maps: [] grids: - 2 @@ -529,7 +529,8 @@ entities: -1,-7: 1: 43694 0,-6: - 0: 2730 + 2: 546 + 3: 2184 -1,-6: 1: 35562 1,-8: @@ -568,37 +569,26 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 21.824879 - - 82.10312 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + Oxygen: 21.824879 + Nitrogen: 82.10312 - volume: 2500 immutable: True + moles: {} + - volume: 2500 + temperature: 293.15 moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + Oxygen: 6666.982 + - volume: 2500 + temperature: 293.15 + moles: + Nitrogen: 6666.982 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance - type: ImplicitRoof + - type: TileHistory + chunkHistory: {} + - type: ExplosionAirtightGrid - proto: AirAlarm entities: - uid: 424 @@ -613,6 +603,8 @@ entities: - 402 - 411 - 400 + - type: Fixtures + fixtures: {} - uid: 803 components: - type: Transform @@ -625,6 +617,8 @@ entities: - 402 - 400 - 411 + - type: Fixtures + fixtures: {} - uid: 805 components: - type: Transform @@ -635,11 +629,15 @@ entities: devices: - 1036 - 1037 + - type: Fixtures + fixtures: {} - uid: 1025 components: - type: Transform pos: 6.5,-12.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 1026 components: - type: Transform @@ -650,6 +648,8 @@ entities: devices: - 305 - 515 + - type: Fixtures + fixtures: {} - uid: 1075 components: - type: Transform @@ -660,6 +660,8 @@ entities: devices: - 1086 - 1088 + - type: Fixtures + fixtures: {} - uid: 1076 components: - type: Transform @@ -670,6 +672,15 @@ entities: devices: - 1087 - 1089 + - type: Fixtures + fixtures: {} +- proto: AirCanister + entities: + - uid: 1104 + components: + - type: Transform + pos: 4.5,-17.5 + parent: 2 - proto: AirlockAtmosphericsLocked entities: - uid: 23 @@ -787,42 +798,56 @@ entities: rot: 3.141592653589793 rad pos: 6.5,-25.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 597 components: - type: Transform rot: 1.5707963267948966 rad pos: -0.5,0.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 657 components: - type: Transform rot: 1.5707963267948966 rad pos: -0.5,6.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 867 components: - type: Transform rot: -1.5707963267948966 rad pos: 10.5,-27.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 891 components: - type: Transform rot: -1.5707963267948966 rad pos: 10.5,-13.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 904 components: - type: Transform rot: -1.5707963267948966 rad pos: 5.5,-13.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 1019 components: - type: Transform rot: 1.5707963267948966 rad pos: -0.5,-9.5 parent: 2 + - type: Fixtures + fixtures: {} - proto: AtmosDeviceFanDirectional entities: - uid: 560 @@ -873,6 +898,40 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,-2.5 parent: 2 +- proto: AtmosFixNitrogenMarker + entities: + - uid: 1097 + components: + - type: Transform + pos: 3.5,-23.5 + parent: 2 + - uid: 1098 + components: + - type: Transform + pos: 3.5,-22.5 + parent: 2 + - uid: 1099 + components: + - type: Transform + pos: 3.5,-21.5 + parent: 2 +- proto: AtmosFixOxygenMarker + entities: + - uid: 1100 + components: + - type: Transform + pos: 1.5,-23.5 + parent: 2 + - uid: 1101 + components: + - type: Transform + pos: 1.5,-22.5 + parent: 2 + - uid: 1102 + components: + - type: Transform + pos: 1.5,-21.5 + parent: 2 - proto: Bed entities: - uid: 231 @@ -3366,12 +3425,16 @@ entities: rot: 3.141592653589793 rad pos: 5.5,0.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 361 components: - type: Transform rot: 3.141592653589793 rad pos: 5.5,-9.5 parent: 2 + - type: Fixtures + fixtures: {} - proto: filingCabinetDrawerRandom entities: - uid: 306 @@ -3395,6 +3458,8 @@ entities: - 555 - 583 - 584 + - type: Fixtures + fixtures: {} - uid: 586 components: - type: Transform @@ -3409,6 +3474,8 @@ entities: - 555 - 572 - 582 + - type: Fixtures + fixtures: {} - proto: FirelockEdge entities: - uid: 572 @@ -3503,13 +3570,18 @@ entities: parent: 2 - proto: GasMixerFlipped entities: - - uid: 457 + - uid: 409 components: - type: Transform - pos: 3.5,-17.5 + pos: 3.5,-16.5 parent: 2 + - type: GasMixer + inletTwoConcentration: 0.79 + inletOneConcentration: 0.21 + targetPressure: 202.75 + enabled: True - type: AtmosPipeColor - color: '#0055CCFF' + color: '#03FCD3FF' - proto: GasPassiveVent entities: - uid: 188 @@ -3519,7 +3591,7 @@ entities: pos: 1.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#FF1212FF' + color: '#0335FCFF' - uid: 383 components: - type: Transform @@ -3535,7 +3607,7 @@ entities: pos: 3.5,-21.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#FF1212FF' - proto: GasPipeBend entities: - uid: 285 @@ -3546,14 +3618,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#990000FF' - - uid: 409 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,-17.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 458 components: - type: Transform @@ -3615,6 +3679,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0055CCFF' + - uid: 512 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,-16.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 1079 components: - type: Transform @@ -3654,11 +3726,10 @@ entities: - uid: 258 components: - type: Transform - rot: 3.141592653589793 rad - pos: 3.5,-16.5 + pos: 1.5,-17.5 parent: 2 - type: AtmosPipeColor - color: '#0055CCFF' + color: '#0335FCFF' - uid: 311 components: - type: Transform @@ -3801,6 +3872,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#990000FF' + - uid: 457 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-16.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 459 components: - type: Transform @@ -4098,14 +4177,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 512 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-17.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 656 components: - type: Transform @@ -4129,7 +4200,7 @@ entities: pos: 3.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#FF1212FF' - uid: 873 components: - type: Transform @@ -4137,7 +4208,7 @@ entities: pos: 3.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#FF1212FF' - uid: 874 components: - type: Transform @@ -4145,7 +4216,7 @@ entities: pos: 1.5,-19.5 parent: 2 - type: AtmosPipeColor - color: '#FF1212FF' + color: '#0335FCFF' - uid: 906 components: - type: Transform @@ -4153,7 +4224,7 @@ entities: pos: 1.5,-18.5 parent: 2 - type: AtmosPipeColor - color: '#FF1212FF' + color: '#0335FCFF' - uid: 910 components: - type: Transform @@ -4161,7 +4232,7 @@ entities: pos: 3.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#FF1212FF' - uid: 911 components: - type: Transform @@ -4169,7 +4240,7 @@ entities: pos: 1.5,-20.5 parent: 2 - type: AtmosPipeColor - color: '#FF1212FF' + color: '#0335FCFF' - uid: 1052 components: - type: Transform @@ -4382,6 +4453,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#990000FF' + - uid: 1103 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-17.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - proto: GasPipeTJunction entities: - uid: 261 @@ -4495,6 +4574,8 @@ entities: - type: Transform pos: 4.5,-13.5 parent: 2 + - type: AtmosPipeColor + color: '#0055CCFF' - proto: GasPressurePump entities: - uid: 892 @@ -5491,6 +5572,8 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-26.5 parent: 2 + - type: Fixtures + fixtures: {} - proto: PottedPlantRandom entities: - uid: 295 @@ -5997,6 +6080,8 @@ entities: 290: - - Pressed - Toggle + - type: Fixtures + fixtures: {} - uid: 549 components: - type: Transform @@ -6008,6 +6093,8 @@ entities: 288: - - Pressed - Toggle + - type: Fixtures + fixtures: {} - uid: 550 components: - type: Transform @@ -6019,6 +6106,8 @@ entities: 279: - - Pressed - Toggle + - type: Fixtures + fixtures: {} - uid: 551 components: - type: Transform @@ -6030,6 +6119,8 @@ entities: 289: - - Pressed - Toggle + - type: Fixtures + fixtures: {} - proto: SignAtmos entities: - uid: 28 @@ -6038,6 +6129,8 @@ entities: rot: 3.141592653589793 rad pos: 1.5,-12.5 parent: 2 + - type: Fixtures + fixtures: {} - proto: SignCargoDock entities: - uid: 271 @@ -6045,11 +6138,15 @@ entities: - type: Transform pos: 13.5,-4.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 287 components: - type: Transform pos: -2.5,-4.5 parent: 2 + - type: Fixtures + fixtures: {} - proto: SignEngineering entities: - uid: 884 @@ -6057,11 +6154,15 @@ entities: - type: Transform pos: 9.5,-12.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 1015 components: - type: Transform pos: 9.5,-25.5 parent: 2 + - type: Fixtures + fixtures: {} - proto: SignSecureMed entities: - uid: 144 @@ -6070,12 +6171,16 @@ entities: rot: 3.141592653589793 rad pos: 5.5,-8.5 parent: 2 + - type: Fixtures + fixtures: {} - uid: 145 components: - type: Transform rot: 3.141592653589793 rad pos: 5.5,-0.5 parent: 2 + - type: Fixtures + fixtures: {} - proto: SMESAdvanced entities: - uid: 527 From 4345bac4ab3607347ab457bd9623f042d98ec249 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 17 May 2026 22:32:29 +0000 Subject: [PATCH 35/52] Automatic changelog update --- Resources/Changelog/Maps.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Maps.yml b/Resources/Changelog/Maps.yml index df01e9ce16..85f83b0deb 100644 --- a/Resources/Changelog/Maps.yml +++ b/Resources/Changelog/Maps.yml @@ -1087,4 +1087,11 @@ id: 133 time: '2026-04-06T18:34:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/43481 +- author: ProPeperos + changes: + - message: On Trade Station - Atmos systems are now fully automated + type: Tweak + id: 134 + time: '2026-05-17T22:31:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/43973 Order: 2 From af2d5d401abfd3ba371203a60195bb3a26eb707b Mon Sep 17 00:00:00 2001 From: chromiumboy <50505512+chromiumboy@users.noreply.github.com> Date: Mon, 18 May 2026 08:23:41 -0500 Subject: [PATCH 36/52] Minor improvements for holopads (#40444) * Initial commit * Fixing merge conflict * Merge conflict fixed * Additional fixes * Reverted change * Serialization fix * Holopad UIs will update when one is deleted or changes map * Minor clean up * Removed obsolete variables * Addressed review comments --- Content.Client/Holopad/HolopadWindow.xaml | 7 +- Content.Client/Holopad/HolopadWindow.xaml.cs | 143 +++++++++--------- Content.Server/Holopad/HolopadSystem.cs | 109 ++++++++----- Content.Server/Telephone/TelephoneSystem.cs | 84 ++++++---- Content.Shared/Holopad/HolopadComponent.cs | 28 ++-- Content.Shared/Holopad/SharedHolopadSystem.cs | 14 +- .../Telephone/SharedTelephoneSystem.cs | 9 +- .../Telephone/TelephoneComponent.cs | 48 +++--- 8 files changed, 261 insertions(+), 181 deletions(-) diff --git a/Content.Client/Holopad/HolopadWindow.xaml b/Content.Client/Holopad/HolopadWindow.xaml index 5a7ad05bea..1eb4e14784 100644 --- a/Content.Client/Holopad/HolopadWindow.xaml +++ b/Content.Client/Holopad/HolopadWindow.xaml @@ -1,6 +1,5 @@ @@ -10,7 +9,7 @@ - + @@ -52,8 +51,8 @@ - - + + diff --git a/Content.Client/Holopad/HolopadWindow.xaml.cs b/Content.Client/Holopad/HolopadWindow.xaml.cs index 16ec37bb7e..6a19e46d03 100644 --- a/Content.Client/Holopad/HolopadWindow.xaml.cs +++ b/Content.Client/Holopad/HolopadWindow.xaml.cs @@ -10,7 +10,6 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Timing; using Robust.Shared.Utility; -using System.Linq; namespace Content.Client.Holopad; @@ -19,22 +18,18 @@ public sealed partial class HolopadWindow : FancyWindow { [Dependency] private IEntityManager _entManager = default!; [Dependency] private IPlayerManager _playerManager = default!; + [Dependency] private ILogManager _logManager = default!; [Dependency] private IGameTiming _timing = default!; private readonly SharedHolopadSystem _holopadSystem = default!; private readonly SharedTelephoneSystem _telephoneSystem = default!; private readonly AccessReaderSystem _accessReaderSystem = default!; private readonly PopupSystem _popupSystem = default!; + private readonly ISawmill _sawmill = default!; private EntityUid? _owner = null; private HolopadUiKey _currentUiKey; - private TelephoneState _currentState; - private TelephoneState _previousState; - private TimeSpan _buttonUnlockTime; - private float _updateTimer = 0.25f; - - private const float UpdateTime = 0.25f; - private TimeSpan _buttonUnlockDelay = TimeSpan.FromSeconds(0.5f); + private string _currentSearch = string.Empty; public event Action? SendHolopadStartNewCallMessageAction; public event Action? SendHolopadAnswerCallMessageAction; @@ -43,6 +38,9 @@ public sealed partial class HolopadWindow : FancyWindow public event Action? SendHolopadActivateProjectorMessageAction; public event Action? SendHolopadRequestStationAiMessageAction; + private TimeSpan _updateDelay = TimeSpan.FromSeconds(0.25f); + private TimeSpan _nextUpdate; + public HolopadWindow() { RobustXamlLoader.Load(this); @@ -52,8 +50,7 @@ public sealed partial class HolopadWindow : FancyWindow _telephoneSystem = _entManager.System(); _accessReaderSystem = _entManager.System(); _popupSystem = _entManager.System(); - - _buttonUnlockTime = _timing.CurTime + _buttonUnlockDelay; + _sawmill = _logManager.GetSawmill("Holopad"); // Assign button actions AnswerCallButton.OnPressed += args => { OnHolopadAnswerCallMessage(); }; @@ -78,10 +75,6 @@ public sealed partial class HolopadWindow : FancyWindow { BackgroundColor = new Color(82, 82, 82), }; - - EmergencyBroadcastText.SetMessage(FormattedMessage.FromMarkupOrThrow(Loc.GetString("holopad-window-emergency-broadcast-in-progress"))); - SubtitleText.SetMessage(FormattedMessage.FromMarkupOrThrow(Loc.GetString("holopad-window-subtitle"))); - OptionsText.SetMessage(FormattedMessage.FromMarkupOrThrow(Loc.GetString("holopad-window-options"))); } #region: Button actions @@ -166,16 +159,28 @@ public sealed partial class HolopadWindow : FancyWindow public void UpdateState(Dictionary holopads) { - if (_owner == null || !_entManager.TryGetComponent(_owner.Value, out var telephone)) + if (!_entManager.TryGetComponent(_owner, out var telephone)) return; - // Caller ID text - var callerId = _telephoneSystem.GetFormattedCallerIdForEntity(telephone.LastCallerId.Item1, telephone.LastCallerId.Item2, Color.LightGray, "Default", 11); - var holoapdId = _telephoneSystem.GetFormattedDeviceIdForEntity(telephone.LastCallerId.Item3, Color.LightGray, "Default", 11); + // Caller and holopad ID text + var callerId = _telephoneSystem.GetFormattedCallerIdForEntity(telephone.LastCallerId?.CallerId, telephone.LastCallerId?.CallerJob, Color.LightGray, "Default", 11); + var holopadId = _telephoneSystem.GetFormattedDeviceIdForEntity(telephone.LastCallerId?.DeviceId, Color.LightGray, "Default", 11); - CallerIdText.SetMessage(FormattedMessage.FromMarkupPermissive(callerId)); - HolopadIdText.SetMessage(FormattedMessage.FromMarkupPermissive(holoapdId)); - LockOutIdText.SetMessage(FormattedMessage.FromMarkupPermissive(callerId)); + if (!FormattedMessage.TryFromMarkup(callerId, out var callerIdMsg)) + { + callerIdMsg = FormattedMessage.FromMarkupPermissive(callerId); + _sawmill.Error($"CallerId markup text was incorrectly formatted: {callerIdMsg}"); + } + + if (!FormattedMessage.TryFromMarkup(holopadId, out var holopadIdMsg)) + { + holopadIdMsg = FormattedMessage.FromMarkupPermissive(holopadId); + _sawmill.Error($"HolopadId markup text was incorrectly formatted: {holopadIdMsg}"); + } + + CallerIdText.SetMessage(callerIdMsg); + LockOutIdText.SetMessage(callerIdMsg); + HolopadIdText.SetMessage(holopadIdMsg); // Sort holopads alphabetically var holopadArray = holopads.ToArray(); @@ -183,7 +188,9 @@ public sealed partial class HolopadWindow : FancyWindow // Clear excess children from the contact list while (ContactsList.ChildCount > holopadArray.Length) + { ContactsList.RemoveChild(ContactsList.GetChild(ContactsList.ChildCount - 1)); + } // Make / update required children for (int i = 0; i < holopadArray.Length; i++) @@ -213,55 +220,57 @@ public sealed partial class HolopadWindow : FancyWindow private void UpdateAppearance() { - if (_owner == null || !_entManager.TryGetComponent(_owner.Value, out var telephone)) + if (!_entManager.TryGetComponent(_owner, out var telephone)) return; - if (_owner == null || !_entManager.TryGetComponent(_owner.Value, out var holopad)) + if (!_entManager.TryGetComponent(_owner, out var holopad)) return; - var hasBroadcastAccess = !_holopadSystem.IsHolopadBroadcastOnCoolDown((_owner.Value, holopad)); + var broadcastOnCooldown = _holopadSystem.IsHolopadBroadcastOnCoolDown((_owner.Value, holopad)); var localPlayer = _playerManager.LocalSession?.AttachedEntity; + // Update container visibility ControlsLockOutContainer.Visible = _holopadSystem.IsHolopadControlLocked((_owner.Value, holopad), localPlayer); ControlsContainer.Visible = !ControlsLockOutContainer.Visible; - // Temporarily disable the interface buttons when the call state changes to prevent any misclicks - if (_currentState != telephone.CurrentState) + // Update contact button visibility + if (SearchLineEdit.Text != _currentSearch) { - _previousState = _currentState; - _currentState = telephone.CurrentState; - _buttonUnlockTime = _timing.CurTime + _buttonUnlockDelay; + _currentSearch = SearchLineEdit.Text; + + foreach (var child in ContactsList.Children) + { + if (child is not HolopadContactButton contactButton) + continue; + + var passesFilter = string.IsNullOrEmpty(SearchLineEdit.Text) || + contactButton.Text?.Contains(SearchLineEdit.Text, StringComparison.CurrentCultureIgnoreCase) == true; + + contactButton.Visible = passesFilter; + } } - var lockButtons = _timing.CurTime < _buttonUnlockTime; - - // Make / update required children - foreach (var child in ContactsList.Children) + // Update timers + if (ControlsContainer.Visible) { - if (child is not HolopadContactButton contactButton) - continue; + var cooldown = _holopadSystem.GetHolopadBroadcastCoolDown((_owner.Value, holopad)); + var cooldownString = $"{cooldown.Minutes:00}:{cooldown.Seconds:00}"; - var passesFilter = string.IsNullOrEmpty(SearchLineEdit.Text) || - contactButton.Text?.Contains(SearchLineEdit.Text, StringComparison.CurrentCultureIgnoreCase) == true; - - contactButton.Visible = passesFilter; - contactButton.Disabled = (_currentState != TelephoneState.Idle || lockButtons); + StartBroadcastButton.Text = broadcastOnCooldown + ? Loc.GetString("holopad-window-emergency-broadcast-with-countdown", ("countdown", cooldownString)) + : Loc.GetString("holopad-window-emergency-broadcast"); } - // Update control text - var cooldown = _holopadSystem.GetHolopadBroadcastCoolDown((_owner.Value, holopad)); - var cooldownString = $"{cooldown.Minutes:00}:{cooldown.Seconds:00}"; + if (ControlsLockOutContainer.Visible) + { + var lockout = _holopadSystem.GetHolopadControlLockedPeriod((_owner.Value, holopad)); + var lockoutString = $"{lockout.Minutes:00}:{lockout.Seconds:00}"; - StartBroadcastButton.Text = _holopadSystem.IsHolopadBroadcastOnCoolDown((_owner.Value, holopad)) ? - Loc.GetString("holopad-window-emergency-broadcast-with-countdown", ("countdown", cooldownString)) : - Loc.GetString("holopad-window-emergency-broadcast"); + LockOutCountDownText.Text = Loc.GetString("holopad-window-controls-unlock-countdown", ("countdown", lockoutString)); + } - var lockout = _holopadSystem.GetHolopadControlLockedPeriod((_owner.Value, holopad)); - var lockoutString = $"{lockout.Minutes:00}:{lockout.Seconds:00}"; - - LockOutCountDownText.Text = Loc.GetString("holopad-window-controls-unlock-countdown", ("countdown", lockoutString)); - - switch (_currentState) + // Update call status text + switch (telephone.CurrentState) { case TelephoneState.Idle: CallStatusText.Text = Loc.GetString("holopad-window-no-calls-in-progress"); break; @@ -277,7 +286,7 @@ public sealed partial class HolopadWindow : FancyWindow CallStatusText.Text = Loc.GetString("holopad-window-call-in-progress"); break; case TelephoneState.EndingCall: - if (_previousState == TelephoneState.Calling || _previousState == TelephoneState.Idle) + if (telephone.PreviousState == TelephoneState.Calling || telephone.PreviousState == TelephoneState.Idle) CallStatusText.Text = Loc.GetString("holopad-window-call-rejected"); else CallStatusText.Text = Loc.GetString("holopad-window-call-ending"); @@ -285,31 +294,29 @@ public sealed partial class HolopadWindow : FancyWindow } // Update control disability - AnswerCallButton.Disabled = (_currentState != TelephoneState.Ringing || lockButtons); - EndCallButton.Disabled = (_currentState == TelephoneState.Idle || _currentState == TelephoneState.EndingCall || lockButtons); - StartBroadcastButton.Disabled = (_currentState != TelephoneState.Idle || !hasBroadcastAccess || lockButtons); - RequestStationAiButton.Disabled = (_currentState != TelephoneState.Idle || lockButtons); - ActivateProjectorButton.Disabled = (_currentState != TelephoneState.Idle || lockButtons); + AnswerCallButton.Disabled = telephone.CurrentState is not TelephoneState.Ringing; + EndCallButton.Disabled = telephone.CurrentState is TelephoneState.Idle or TelephoneState.EndingCall; + StartBroadcastButton.Disabled = telephone.CurrentState is not TelephoneState.Idle || broadcastOnCooldown; + RequestStationAiButton.Disabled = telephone.CurrentState is not TelephoneState.Idle; + ActivateProjectorButton.Disabled = telephone.CurrentState is not TelephoneState.Idle; // Update control visibility - FetchingAvailableHolopadsContainer.Visible = (ContactsList.ChildCount == 0); - ActiveCallControlsContainer.Visible = (_currentState != TelephoneState.Idle || _currentUiKey == HolopadUiKey.AiRequestWindow); + FetchingAvailableHolopadsContainer.Visible = ContactsList.ChildCount == 0; + ActiveCallControlsContainer.Visible = telephone.CurrentState is not TelephoneState.Idle || _currentUiKey is HolopadUiKey.AiRequestWindow; CallPlacementControlsContainer.Visible = !ActiveCallControlsContainer.Visible; - CallerIdContainer.Visible = (_currentState == TelephoneState.Ringing); - AnswerCallButton.Visible = (_currentState == TelephoneState.Ringing); + CallerIdContainer.Visible = telephone.CurrentState is TelephoneState.Ringing; + AnswerCallButton.Visible = telephone.CurrentState is TelephoneState.Ringing; } protected override void FrameUpdate(FrameEventArgs args) { base.FrameUpdate(args); - _updateTimer += args.DeltaSeconds; + if (_timing.CurTime < _nextUpdate) + return; - if (_updateTimer >= UpdateTime) - { - _updateTimer -= UpdateTime; - UpdateAppearance(); - } + _nextUpdate = _timing.CurTime + _updateDelay; + UpdateAppearance(); } private sealed class HolopadContactButton : Button diff --git a/Content.Server/Holopad/HolopadSystem.cs b/Content.Server/Holopad/HolopadSystem.cs index 1afd6c2ba1..651db65f5a 100644 --- a/Content.Server/Holopad/HolopadSystem.cs +++ b/Content.Server/Holopad/HolopadSystem.cs @@ -42,9 +42,7 @@ public sealed partial class HolopadSystem : SharedHolopadSystem [Dependency] private IGameTiming _timing = default!; [Dependency] private PvsOverrideSystem _pvs = default!; [Dependency] private SharedPowerStateSystem _powerState = default!; - - private float _updateTimer = 1.0f; - private const float UpdateTime = 1.0f; + [Dependency] private MetaDataSystem _meta = default!; public override void Initialize() { @@ -79,10 +77,10 @@ public sealed partial class HolopadSystem : SharedHolopadSystem SubscribeLocalEvent(OnJumpToCore); SubscribeLocalEvent>(AddToggleProjectorVerb); SubscribeLocalEvent(OnAiRemove); - SubscribeLocalEvent(OnParentChanged); + SubscribeLocalEvent(OnMapUidChanged); SubscribeLocalEvent(OnPowerChanged); + SubscribeLocalEvent(OnAnchorChanged); SubscribeLocalEvent(OnMobStateChanged); - } #region: Holopad UI bound user interface messages @@ -263,6 +261,8 @@ public sealed partial class HolopadSystem : SharedHolopadSystem SetHolopadAmbientState(holopad, this.IsPowered(holopad, EntityManager)); break; } + + UpdateUIState(holopad); } private void OnHoloCallCommenced(Entity source, ref TelephoneCallCommencedEvent args) @@ -315,7 +315,7 @@ public sealed partial class HolopadSystem : SharedHolopadSystem if (receiverHolopad.Comp.Hologram == null) continue; - _appearanceSystem.SetData(receiverHolopad.Comp.Hologram.Value.Owner, TypingIndicatorVisuals.State, ev.State); + _appearanceSystem.SetData(receiverHolopad.Comp.Hologram.Value, TypingIndicatorVisuals.State, ev.State); } } } @@ -328,6 +328,8 @@ public sealed partial class HolopadSystem : SharedHolopadSystem { if (entity.Comp.User != null) LinkHolopadToUser(entity, entity.Comp.User.Value); + + _meta.AddFlag(entity, MetaDataFlags.ExtraTransformEvents); } private void OnHolopadUserInit(Entity entity, ref ComponentInit args) @@ -343,6 +345,7 @@ public sealed partial class HolopadSystem : SharedHolopadSystem ShutDownHolopad(entity); SetHolopadAmbientState(entity, false); + UpdateAllUIStates(); } private void OnHolopadUserShutdown(Entity entity, ref ComponentShutdown args) @@ -444,15 +447,25 @@ public sealed partial class HolopadSystem : SharedHolopadSystem _telephoneSystem.EndTelephoneCalls((entity, entityTelephone)); } - private void OnParentChanged(Entity entity, ref EntParentChangedMessage args) + private void OnMapUidChanged(Entity entity, ref MapUidChangedEvent args) { UpdateHolopadControlLockoutStartTime(entity); + UpdateAllUIStates(); } private void OnPowerChanged(Entity entity, ref PowerChangedEvent args) { if (args.Powered) + { UpdateHolopadControlLockoutStartTime(entity); + } + + UpdateAllUIStates(); + } + + private void OnAnchorChanged(Entity entity, ref AnchorStateChangedEvent args) + { + UpdateAllUIStates(); } private void OnMobStateChanged(Entity ent, ref MobStateChangedEvent args) @@ -472,27 +485,37 @@ public sealed partial class HolopadSystem : SharedHolopadSystem { base.Update(frameTime); - _updateTimer += frameTime; - - if (_updateTimer >= UpdateTime) + var query = AllEntityQuery(); + while (query.MoveNext(out var uid, out var holopadUser, out var xform)) { - _updateTimer -= UpdateTime; + if (HasComp(uid)) + continue; - var query = AllEntityQuery(); - while (query.MoveNext(out var uid, out var holopad, out var telephone, out var xform)) + foreach (var holopad in holopadUser.LinkedHolopads) { - UpdateUIState((uid, holopad), telephone); - - if (holopad.User != null && - !HasComp(holopad.User) && - !_xformSystem.InRange((holopad.User.Value, Transform(holopad.User.Value)), (uid, xform), telephone.ListeningRange)) + if (TryComp(holopad, out var telephone) && + !_xformSystem.InRange((holopad.Owner, Transform(holopad)), (uid, xform), telephone.ListeningRange)) { - UnlinkHolopadFromUser((uid, holopad), holopad.User.Value); + UnlinkHolopadFromUser(holopad, (uid, holopadUser)); } } } } + public void UpdateAllUIStates() + { + var querySources = AllEntityQuery(); + while (querySources.MoveNext(out var uid, out var holopad, out var telephone, out var ui)) + { + var uiKey = HasComp(uid) ? HolopadUiKey.AiActionWindow : HolopadUiKey.InteractionWindow; + + if (!_userInterfaceSystem.IsUiOpen((uid, ui), uiKey)) + continue; + + UpdateUIState((uid, holopad), telephone); + } + } + public void UpdateUIState(Entity entity, TelephoneComponent? telephone = null) { if (!Resolve(entity.Owner, ref telephone, false)) @@ -571,23 +594,26 @@ public sealed partial class HolopadSystem : SharedHolopadSystem return; } - if (!TryComp(user, out var holopadUser)) - holopadUser = AddComp(user.Value); + var holopadUser = EnsureComp(user.Value); + var userEnt = (user.Value, holopadUser); - if (user != entity.Comp.User?.Owner) + if (user != entity.Comp.User) { // Removes the old user from the holopad - UnlinkHolopadFromUser(entity, entity.Comp.User); + if (TryComp(entity.Comp.User, out var oldHolopadUser)) + { + UnlinkHolopadFromUser(entity, (entity.Comp.User.Value, oldHolopadUser)); + } // Assigns the new user in their place - holopadUser.LinkedHolopads.Add(entity); - entity.Comp.User = (user.Value, holopadUser); + holopadUser?.LinkedHolopads.Add(entity); + entity.Comp.User = user.Value; } // Add the new user to PVS and sync their appearance with any // holopads connected to the one they are using _pvs.AddGlobalOverride(user.Value); - SyncHolopadHologramAppearanceWithTarget(entity, entity.Comp.User); + SyncHolopadHologramAppearanceWithTarget(entity, userEnt); } private void UnlinkHolopadFromUser(Entity entity, Entity? user) @@ -611,14 +637,14 @@ public sealed partial class HolopadSystem : SharedHolopadSystem { foreach (var linkedHolopad in GetLinkedHolopads(entity)) { - if (linkedHolopad.Comp.Hologram == null) + if (!TryComp(linkedHolopad.Comp.Hologram, out var holopadHologram)) continue; if (user == null) - _appearanceSystem.SetData(linkedHolopad.Comp.Hologram.Value.Owner, TypingIndicatorVisuals.State, false); + _appearanceSystem.SetData(linkedHolopad.Comp.Hologram.Value, TypingIndicatorVisuals.State, false); - linkedHolopad.Comp.Hologram.Value.Comp.LinkedEntity = user; - Dirty(linkedHolopad.Comp.Hologram.Value); + holopadHologram.LinkedEntity = user; + Dirty(linkedHolopad.Comp.Hologram.Value, holopadHologram); } } @@ -626,8 +652,8 @@ public sealed partial class HolopadSystem : SharedHolopadSystem { entity.Comp.ControlLockoutOwner = null; - if (entity.Comp.Hologram != null) - DeleteHologram(entity.Comp.Hologram.Value, entity); + if (TryComp(entity.Comp.Hologram, out var holopadHologram)) + DeleteHologram((entity.Comp.Hologram.Value, holopadHologram), entity); // Check if the associated holopad user is an AI if (HasComp(entity.Comp.User) && @@ -643,9 +669,9 @@ public sealed partial class HolopadSystem : SharedHolopadSystem _telephoneSystem.EndTelephoneCalls((stationAiCore.Owner, stationAiCoreTelephone)); } } - else + else if (TryComp(entity.Comp.User, out var holopadUser)) { - UnlinkHolopadFromUser(entity, entity.Comp.User); + UnlinkHolopadFromUser(entity, (entity.Comp.User.Value, holopadUser)); } Dirty(entity); @@ -749,14 +775,16 @@ public sealed partial class HolopadSystem : SharedHolopadSystem // Lock out the controls of all involved holopads for a set duration source.Comp.ControlLockoutOwner = user; - source.Comp.ControlLockoutStartTime = _timing.CurTime; + source.Comp.ControlLockoutEndTime = _timing.CurTime + source.Comp.ControlLockoutDuration; + source.Comp.ControlLockoutCoolDownEndTime = _timing.CurTime + source.Comp.ControlLockoutCoolDown; Dirty(source); foreach (var receiver in GetLinkedHolopads(source)) { receiver.Comp.ControlLockoutOwner = user; - receiver.Comp.ControlLockoutStartTime = _timing.CurTime; + receiver.Comp.ControlLockoutEndTime = _timing.CurTime + source.Comp.ControlLockoutDuration; + receiver.Comp.ControlLockoutCoolDownEndTime = _timing.CurTime + source.Comp.ControlLockoutCoolDown; Dirty(receiver); } @@ -796,15 +824,20 @@ public sealed partial class HolopadSystem : SharedHolopadSystem if (!_telephoneSystem.IsSourceInRangeOfReceiver(sourceTelephoneEntity, receiverTelephoneEntity)) continue; - if (receiverHolopad.ControlLockoutStartTime > source.Comp.ControlLockoutStartTime) + if (receiverHolopad.ControlLockoutEndTime > source.Comp.ControlLockoutEndTime || + receiverHolopad.ControlLockoutCoolDownEndTime > source.Comp.ControlLockoutCoolDownEndTime) { - source.Comp.ControlLockoutStartTime = receiverHolopad.ControlLockoutStartTime; + source.Comp.ControlLockoutEndTime = receiverHolopad.ControlLockoutEndTime; + source.Comp.ControlLockoutCoolDownEndTime = receiverHolopad.ControlLockoutCoolDownEndTime; + isDirty = true; } } if (isDirty) + { Dirty(source); + } } private void SetHolopadAmbientState(Entity entity, bool isEnabled) diff --git a/Content.Server/Telephone/TelephoneSystem.cs b/Content.Server/Telephone/TelephoneSystem.cs index 1ab5425416..050961677e 100644 --- a/Content.Server/Telephone/TelephoneSystem.cs +++ b/Content.Server/Telephone/TelephoneSystem.cs @@ -105,7 +105,9 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem RaiseLocalEvent(args.MessageSource, nameEv); // Determine if speech should be relayed via the telephone itself or a designated speaker - var speaker = entity.Comp.Speaker != null ? entity.Comp.Speaker.Value.Owner : entity.Owner; + var speaker = entity.Comp.Speaker != null + ? entity.Comp.Speaker.Value + : entity.Owner; var name = Loc.GetString("chat-telephone-name-relay", ("originalName", nameEv.VoiceName), @@ -130,8 +132,13 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem if (IsTelephoneEngaged(entity)) { - foreach (var receiver in telephone.LinkedTelephones) + foreach (var receiverUid in telephone.LinkedTelephones) { + if (!TryComp(receiverUid, out var receiverTelephone)) + continue; + + var receiver = (receiverUid, receiverTelephone); + if (!IsSourceInRangeOfReceiver(entity, receiver) && !IsSourceInRangeOfReceiver(receiver, entity)) { @@ -144,28 +151,28 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem { // Try to play ring tone if ringing case TelephoneState.Ringing: - if (_timing.CurTime > telephone.StateStartTime + TimeSpan.FromSeconds(telephone.RingingTimeout)) + if (_timing.CurTime > telephone.StateStartTime + telephone.RingingTimeout) EndTelephoneCalls(entity); else if (telephone.RingTone != null && _timing.CurTime > telephone.NextRingToneTime) { _audio.PlayPvs(telephone.RingTone, uid); - telephone.NextRingToneTime = _timing.CurTime + TimeSpan.FromSeconds(telephone.RingInterval); + telephone.NextRingToneTime = _timing.CurTime + telephone.RingInterval; } break; // Try to hang up if there has been no recent in-call activity case TelephoneState.InCall: - if (_timing.CurTime > telephone.StateStartTime + TimeSpan.FromSeconds(telephone.IdlingTimeout)) + if (_timing.CurTime > telephone.StateStartTime + telephone.IdlingTimeout) EndTelephoneCalls(entity); break; // Try to terminate if the telephone has finished hanging up case TelephoneState.EndingCall: - if (_timing.CurTime > telephone.StateStartTime + TimeSpan.FromSeconds(telephone.HangingUpTimeout)) + if (_timing.CurTime > telephone.StateStartTime + telephone.HangingUpTimeout) TerminateTelephoneCalls(entity); break; @@ -180,12 +187,21 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem if (IsTelephoneEngaged(source)) return; + // Save the user as the last caller + source.Comp.LastCallerId = GetNameAndJobOfCallingEntity(user); + Dirty(source); + + // Attempt to call all receivers foreach (var receiver in receivers) + { TryCallTelephone(source, receiver, user, options); + } // If no connections could be made, hang up the telephone if (!IsTelephoneEngaged(source)) + { EndTelephoneCalls(source); + } } public void CallTelephone(Entity source, Entity receiver, EntityUid user, TelephoneCallOptions? options = null) @@ -222,12 +238,12 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem var callerInfo = GetNameAndJobOfCallingEntity(user); // Base the name of the device on its label - string? deviceName = null; - if (TryComp(source, out var label)) - deviceName = label.CurrentLabel; + { + callerInfo.DeviceId = label.CurrentLabel; + } - receiver.Comp.LastCallerId = (callerInfo.Item1, callerInfo.Item2, deviceName); // This will be networked when the state changes + receiver.Comp.LastCallerId = callerInfo; // This will be networked when the state changes receiver.Comp.LinkedTelephones.Add(source); receiver.Comp.Muted = options?.MuteReceiver == true; @@ -257,8 +273,12 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem if (receiver.Comp.LinkedTelephones.Count != 1) return; - var source = receiver.Comp.LinkedTelephones.First(); - CommenceTelephoneCall(source, receiver); + var sourceUid = receiver.Comp.LinkedTelephones.First(); + + if (!TryComp(sourceUid, out var sourceTelephone)) + return; + + CommenceTelephoneCall((sourceUid, sourceTelephone), receiver); } private void CommenceTelephoneCall(Entity source, Entity receiver) @@ -311,13 +331,18 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem private void HandleEndingTelephoneCalls(Entity entity, TelephoneState newState) { - foreach (var linkedTelephone in entity.Comp.LinkedTelephones) + foreach (var linkedUid in entity.Comp.LinkedTelephones) { - if (!linkedTelephone.Comp.LinkedTelephones.Remove(entity)) + if (!TryComp(linkedUid, out var linkedTelephone)) continue; - if (!IsTelephoneEngaged(linkedTelephone)) - EndTelephoneCalls(linkedTelephone); + if (!linkedTelephone.LinkedTelephones.Remove(entity)) + continue; + + var linked = (linkedUid, linkedTelephone); + + if (!IsTelephoneEngaged(linked)) + EndTelephoneCalls(linked); } entity.Comp.LinkedTelephones.Clear(); @@ -372,10 +397,13 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem var evReceivedMessage = new TelephoneMessageReceivedEvent(message, chatMsg, messageSource, source); - foreach (var receiver in source.Comp.LinkedTelephones) + foreach (var receiverUid in source.Comp.LinkedTelephones) { - RaiseLocalEvent(receiver, ref evReceivedMessage); - receiver.Comp.StateStartTime = _timing.CurTime; + if (!TryComp(receiverUid, out var receiverTelephone)) + continue; + + RaiseLocalEvent(receiverUid, ref evReceivedMessage); + receiverTelephone.StateStartTime = _timing.CurTime; } if (name != Name(messageSource)) @@ -390,6 +418,7 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem { var oldState = entity.Comp.CurrentState; + entity.Comp.PreviousState = entity.Comp.CurrentState; entity.Comp.CurrentState = newState; entity.Comp.StateStartTime = _timing.CurTime; Dirty(entity); @@ -419,24 +448,21 @@ public sealed partial class TelephoneSystem : SharedTelephoneSystem entity.Comp.Speaker = speaker; } - private (string?, string?) GetNameAndJobOfCallingEntity(EntityUid uid) + private TelephoneCallRecord GetNameAndJobOfCallingEntity(EntityUid uid) { - string? presumedName = null; - string? presumedJob = null; + var record = new TelephoneCallRecord(); if (HasComp(uid) || HasComp(uid)) { - presumedName = Name(uid); - return (presumedName, presumedJob); + record.CallerId = Name(uid); } - - if (_idCardSystem.TryFindIdCard(uid, out var idCard)) + else if (_idCardSystem.TryFindIdCard(uid, out var idCard)) { - presumedName = string.IsNullOrWhiteSpace(idCard.Comp.FullName) ? null : idCard.Comp.FullName; - presumedJob = idCard.Comp.LocalizedJobTitle; + record.CallerId = string.IsNullOrWhiteSpace(idCard.Comp.FullName) ? null : idCard.Comp.FullName; + record.CallerJob = idCard.Comp.LocalizedJobTitle; } - return (presumedName, presumedJob); + return record; } public bool IsSourceAbleToReachReceiver(Entity source, Entity receiver) diff --git a/Content.Shared/Holopad/HolopadComponent.cs b/Content.Shared/Holopad/HolopadComponent.cs index 98f05b03f9..d4618b37cc 100644 --- a/Content.Shared/Holopad/HolopadComponent.cs +++ b/Content.Shared/Holopad/HolopadComponent.cs @@ -11,21 +11,21 @@ namespace Content.Shared.Holopad; /// /// Holopads also require a to function /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] [Access(typeof(SharedHolopadSystem))] public sealed partial class HolopadComponent : Component { /// /// The entity being projected by the holopad /// - [ViewVariables] - public Entity? Hologram; + [DataField] + public EntityUid? Hologram; /// /// The entity using the holopad /// - [ViewVariables] - public Entity? User; + [DataField] + public EntityUid? User; /// /// Proto ID for the user's hologram @@ -36,26 +36,32 @@ public sealed partial class HolopadComponent : Component /// /// The entity that has locked out the controls of this device /// - [ViewVariables, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntityUid? ControlLockoutOwner = null; /// - /// The game tick the control lockout was initiated + /// The time the control lockout will end /// - [ViewVariables, AutoNetworkedField] - public TimeSpan ControlLockoutStartTime; + [DataField, AutoNetworkedField, AutoPausedField] + public TimeSpan ControlLockoutEndTime; + + /// + /// The time the control lockout cool down will end + /// + [DataField, AutoNetworkedField, AutoPausedField] + public TimeSpan ControlLockoutCoolDownEndTime; /// /// The duration that the control lockout will last in seconds /// [DataField] - public float ControlLockoutDuration { get; private set; } = 90f; + public TimeSpan ControlLockoutDuration { get; private set; } = TimeSpan.FromSeconds(90); /// /// The duration before the controls can be lockout again in seconds /// [DataField] - public float ControlLockoutCoolDown { get; private set; } = 180f; + public TimeSpan ControlLockoutCoolDown { get; private set; } = TimeSpan.FromSeconds(180); } #region: Event messages diff --git a/Content.Shared/Holopad/SharedHolopadSystem.cs b/Content.Shared/Holopad/SharedHolopadSystem.cs index 63c91928c2..8029e3f201 100644 --- a/Content.Shared/Holopad/SharedHolopadSystem.cs +++ b/Content.Shared/Holopad/SharedHolopadSystem.cs @@ -8,10 +8,7 @@ public abstract partial class SharedHolopadSystem : EntitySystem public bool IsHolopadControlLocked(Entity entity, EntityUid? user = null) { - if (entity.Comp.ControlLockoutStartTime == TimeSpan.Zero) - return false; - - if (entity.Comp.ControlLockoutStartTime + TimeSpan.FromSeconds(entity.Comp.ControlLockoutDuration) < _timing.CurTime) + if (_timing.CurTime > entity.Comp.ControlLockoutEndTime) return false; if (entity.Comp.ControlLockoutOwner == null || entity.Comp.ControlLockoutOwner == user) @@ -22,15 +19,12 @@ public abstract partial class SharedHolopadSystem : EntitySystem public TimeSpan GetHolopadControlLockedPeriod(Entity entity) { - return entity.Comp.ControlLockoutStartTime + TimeSpan.FromSeconds(entity.Comp.ControlLockoutDuration) - _timing.CurTime; + return entity.Comp.ControlLockoutEndTime - _timing.CurTime; } public bool IsHolopadBroadcastOnCoolDown(Entity entity) { - if (entity.Comp.ControlLockoutStartTime == TimeSpan.Zero) - return false; - - if (entity.Comp.ControlLockoutStartTime + TimeSpan.FromSeconds(entity.Comp.ControlLockoutCoolDown) < _timing.CurTime) + if (_timing.CurTime > entity.Comp.ControlLockoutCoolDownEndTime) return false; return true; @@ -38,6 +32,6 @@ public abstract partial class SharedHolopadSystem : EntitySystem public TimeSpan GetHolopadBroadcastCoolDown(Entity entity) { - return entity.Comp.ControlLockoutStartTime + TimeSpan.FromSeconds(entity.Comp.ControlLockoutCoolDown) - _timing.CurTime; + return entity.Comp.ControlLockoutCoolDownEndTime - _timing.CurTime; } } diff --git a/Content.Shared/Telephone/SharedTelephoneSystem.cs b/Content.Shared/Telephone/SharedTelephoneSystem.cs index 78a72d59a5..b576fd381e 100644 --- a/Content.Shared/Telephone/SharedTelephoneSystem.cs +++ b/Content.Shared/Telephone/SharedTelephoneSystem.cs @@ -1,3 +1,4 @@ +using Robust.Shared.Utility; using System.Linq; namespace Content.Shared.Telephone; @@ -21,15 +22,15 @@ public abstract class SharedTelephoneSystem : EntitySystem if (presumedJob != null) callerId = Loc.GetString("chat-telephone-caller-id-with-job", - ("callerName", presumedName), - ("callerJob", presumedJob), + ("callerName", FormattedMessage.RemoveMarkupPermissive(presumedName)), + ("callerJob", FormattedMessage.RemoveMarkupPermissive(presumedJob)), ("color", fontColor), ("fontType", fontType), ("fontSize", fontSize)); else callerId = Loc.GetString("chat-telephone-caller-id-without-job", - ("callerName", presumedName), + ("callerName", FormattedMessage.RemoveMarkupPermissive(presumedName)), ("color", fontColor), ("fontType", fontType), ("fontSize", fontSize)); @@ -48,7 +49,7 @@ public abstract class SharedTelephoneSystem : EntitySystem } return Loc.GetString("chat-telephone-device-id", - ("deviceName", deviceName), + ("deviceName", FormattedMessage.RemoveMarkupPermissive(deviceName)), ("color", fontColor), ("fontType", fontType), ("fontSize", fontSize)); diff --git a/Content.Shared/Telephone/TelephoneComponent.cs b/Content.Shared/Telephone/TelephoneComponent.cs index 89748d78a4..834453edeb 100644 --- a/Content.Shared/Telephone/TelephoneComponent.cs +++ b/Content.Shared/Telephone/TelephoneComponent.cs @@ -1,12 +1,11 @@ using Content.Shared.Chat; -using Content.Shared.Speech; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Telephone; -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] [Access(typeof(SharedTelephoneSystem))] public sealed partial class TelephoneComponent : Component { @@ -14,19 +13,19 @@ public sealed partial class TelephoneComponent : Component /// Sets how long the telephone will ring before it automatically hangs up /// [DataField] - public float RingingTimeout = 30; + public TimeSpan RingingTimeout = TimeSpan.FromSeconds(30); /// /// Sets how long the telephone can remain idle in-call before it automatically hangs up /// [DataField] - public float IdlingTimeout = 60; + public TimeSpan IdlingTimeout = TimeSpan.FromSeconds(60); /// /// Sets how long the telephone will stay in the hanging up state before return to idle /// [DataField] - public float HangingUpTimeout = 2; + public TimeSpan HangingUpTimeout = TimeSpan.FromSeconds(2); /// /// Tone played while the phone is ringing @@ -38,7 +37,7 @@ public sealed partial class TelephoneComponent : Component /// Sets the number of seconds before the next ring tone is played /// [DataField] - public float RingInterval = 2f; + public TimeSpan RingInterval = TimeSpan.FromSeconds(2); /// /// The time at which the next tone will be played @@ -90,8 +89,8 @@ public sealed partial class TelephoneComponent : Component /// /// Speech is relayed through this entity instead of the telephone /// - [ViewVariables(VVAccess.ReadOnly)] - public Entity? Speaker = null; + [DataField] + public EntityUid? Speaker = null; /// /// Telephone number for this device @@ -99,41 +98,56 @@ public sealed partial class TelephoneComponent : Component /// /// For future use - a system for generating and handling telephone numbers has not been implemented yet /// - [ViewVariables] + [DataField] public int TelephoneNumber = -1; /// - /// Linked telephone + /// Other telephones that have been linked to this one /// - [ViewVariables] - public HashSet> LinkedTelephones = new(); + [DataField] + public HashSet LinkedTelephones = new(); /// /// Defines the current state the telephone is in /// - [ViewVariables, AutoNetworkedField] + [DataField, AutoNetworkedField] public TelephoneState CurrentState = TelephoneState.Idle; + /// + /// Defines the previous state the telephone was in + /// + [DataField, AutoNetworkedField] + public TelephoneState PreviousState = TelephoneState.Idle; + /// /// The game tick the current state started /// - [ViewVariables] + [DataField, AutoPausedField] public TimeSpan StateStartTime; /// /// Sets whether the telphone can pick up nearby speech /// - [ViewVariables] + [DataField] public bool Muted = false; /// /// The presumed name and/or job of the last person to call this telephone /// and the name of the device that they used to do so /// - [ViewVariables, AutoNetworkedField] - public (string?, string?, string?) LastCallerId; + [DataField, AutoNetworkedField] + public TelephoneCallRecord? LastCallerId; } +/// +/// A telephone call record. +/// +/// The name of the person who placed the call. +/// The job of the person who placed the call. +/// The name of the device used to make the call. +[Serializable, NetSerializable] +public record struct TelephoneCallRecord(string? CallerId, string? CallerJob, string? DeviceId); + #region: Telephone events /// From 6f5206e235b2d0b32510ddb864f31237f9c23b32 Mon Sep 17 00:00:00 2001 From: TheMas3212 Date: Tue, 19 May 2026 00:18:29 +1000 Subject: [PATCH 37/52] Reorder Cow and Goat Mob parent order to give correct stomach type (#43983) Fix: Reorder Cow and Goat Mob parent order to give correct stomach type --- Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index fba5bbce03..398f407a11 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -863,7 +863,7 @@ - type: entity name: cow - parent: [ SimpleMobBase, BaseMobRuminant ] + parent: [ BaseMobRuminant, SimpleMobBase ] id: MobCow description: Moo. components: @@ -1022,7 +1022,7 @@ - type: entity name: goat - parent: [ SimpleMobBase, BaseMobRuminant ] + parent: [ BaseMobRuminant, SimpleMobBase ] id: MobGoat description: Her spine consists of long sharp segments, no wonder she is so grumpy. components: From 7e3fcb75881df2b103fc98e3046876b2eb37a9c3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 18 May 2026 14:37:02 +0000 Subject: [PATCH 38/52] 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 fad90fd933..df5f0eef7c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Centronias - changes: - - message: Bleach now actually does what its description says and can be used for - cleaning as a better alternative to Space Cleaner! - type: Add - id: 9185 - time: '2025-11-04T23:20:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/41276 - author: Kittygyat changes: - message: Fixed several unintended burn groupings with the clumsy gun explosions @@ -4078,3 +4070,10 @@ id: 9696 time: '2026-05-17T20:29:48.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/43898 +- author: TheMas3212 + changes: + - message: Cows and Goats are now able to eat wheat as intended + type: Fix + id: 9697 + time: '2026-05-18T14:35:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/43983 From 679744311eaf4361dfe568588f8df3db2135b73f Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Mon, 18 May 2026 17:47:34 +0200 Subject: [PATCH 39/52] fix cauterization popup prediction (#39283) * fix popup * Add comment * Apply suggestion --------- Co-authored-by: Fildrance --- Content.Shared/Body/Systems/SharedBloodstreamSystem.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs index 44982edf75..52cb9812ab 100644 --- a/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs +++ b/Content.Shared/Body/Systems/SharedBloodstreamSystem.cs @@ -231,8 +231,12 @@ public abstract partial class SharedBloodstreamSystem : EntitySystem // because it's burn damage that cauterized their wounds. // We'll play a special sound and popup for feedback. - _popup.PopupEntity(Loc.GetString("bloodstream-component-wounds-cauterized"), ent, - ent, PopupType.Medium); // only the burned entity can see this + // Only the burned entity can see the popup. + // TODO: Make the PopupSystem API more sane so that this is handled by a single method. + if (args.Origin == ent.Owner) // predict the popup on the client if they caused damage to themselves + _popup.PopupClient(Loc.GetString("bloodstream-component-wounds-cauterized"), ent, ent, PopupType.Medium); + else + _popup.PopupEntity(Loc.GetString("bloodstream-component-wounds-cauterized"), ent, ent, PopupType.Medium); _audio.PlayPredicted(ent.Comp.BloodHealedSound, ent, args.Origin); } } From b8519626ee9bbfece24e1642b623db1dc8615e64 Mon Sep 17 00:00:00 2001 From: Atakku Date: Mon, 18 May 2026 23:16:17 +0200 Subject: [PATCH 40/52] Fixed MaxLimit not being properly ignored when set to 0 (#41852) * Fixed the issue * Remove stray line --- Content.Shared/Preferences/Loadouts/RoleLoadout.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs index 6f77725f22..3db8d972cc 100644 --- a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs +++ b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs @@ -124,7 +124,7 @@ public sealed partial class RoleLoadout : IEquatable continue; } - var loadouts = groupLoadouts[..Math.Min(groupLoadouts.Count, groupProto.MaxLimit)]; + var loadouts = groupProto.MaxLimit > 0 ? groupLoadouts[..Math.Min(groupLoadouts.Count, groupProto.MaxLimit)] : groupLoadouts; // Validate first for (var i = loadouts.Count - 1; i >= 0; i--) @@ -297,7 +297,8 @@ public sealed partial class RoleLoadout : IEquatable var groupLoadouts = SelectedLoadouts[selectedGroup]; // Need to unselect existing ones if we're at or above limit - var limit = Math.Max(0, groupLoadouts.Count + 1 - protoManager.Index(selectedGroup).MaxLimit); + var groupProto = protoManager.Index(selectedGroup); + var limit = groupProto.MaxLimit > 0 ? Math.Max(0, groupLoadouts.Count + 1 - protoManager.Index(selectedGroup).MaxLimit) : 0; for (var i = 0; i < groupLoadouts.Count; i++) { From 590dfe7d0afb9a192e38abdd97c97301c6e585e0 Mon Sep 17 00:00:00 2001 From: Atakku Date: Tue, 19 May 2026 01:09:11 +0200 Subject: [PATCH 41/52] Fix pipe placement (and possibly other things) in mappingclientsidesetup (#43301) This simple fix, fixes everything --- Content.Client/Actions/ActionsSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index ae37b35060..90cf4190f2 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -262,7 +262,7 @@ namespace Content.Client.Actions SetIcon(actionId, new SpriteSpecifier.EntityPrototype(id)); SetEvent(actionId, new StartPlacementActionEvent() { - PlacementOption = "SnapgridCenter", + PlacementOption = proto.PlacementMode, EntityType = id }); _metaData.SetEntityName(actionId, proto.Name); From 95cb9ab60d81c23a15f1494fedc6ef99d971d891 Mon Sep 17 00:00:00 2001 From: Pok <113675512+Pok27@users.noreply.github.com> Date: Tue, 19 May 2026 14:40:54 +0300 Subject: [PATCH 42/52] Fix chat with open radial menu (#40929) * chat-with-open-radial-menu * refactor: reuse checks in RadialMenuContextualCentralTextureButton.KeyBindUp in relevant codeparts of radial menu --------- Co-authored-by: pa.pecherskij --- .../UserInterface/Controls/RadialMenu.cs | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/Content.Client/UserInterface/Controls/RadialMenu.cs b/Content.Client/UserInterface/Controls/RadialMenu.cs index 0cc207dd89..6c2ee8b810 100644 --- a/Content.Client/UserInterface/Controls/RadialMenu.cs +++ b/Content.Client/UserInterface/Controls/RadialMenu.cs @@ -239,11 +239,15 @@ public abstract class RadialMenuButtonBase : BaseButton /// protected override void KeyBindUp(GUIBoundKeyEventArgs args) { - if (args.Function == EngineKeyFunctions.UIClick - || args.Function == ContentKeyFunctions.AltActivateItemInWorld) - { + if (args.Function.IsClickOrAltClick()) base.KeyBindUp(args); - } + } + + /// + protected override void KeyBindDown(GUIBoundKeyEventArgs args) + { + if (args.Function.IsClickOrAltClick()) + base.KeyBindDown(args); } } @@ -285,11 +289,15 @@ public sealed class RadialMenuContextualCentralTextureButton : TextureButton /// protected override void KeyBindUp(GUIBoundKeyEventArgs args) { - if (args.Function == EngineKeyFunctions.UIClick - || args.Function == ContentKeyFunctions.AltActivateItemInWorld) - { + if (args.Function.IsClickOrAltClick()) base.KeyBindUp(args); - } + } + + /// + protected override void KeyBindDown(GUIBoundKeyEventArgs args) + { + if (args.Function.IsClickOrAltClick()) + base.KeyBindDown(args); } } @@ -684,3 +692,12 @@ public class RadialMenuButtonWithSector : RadialMenuButton, IRadialMenuItemWithS return new Angle(angleSectorFrom).EqualsApprox(new Angle(angleSectorTo)); } } + +static file class RadialMenuButtonsHelpers +{ + public static bool IsClickOrAltClick(this BoundKeyFunction function) + { + return function == EngineKeyFunctions.UIClick + || function == ContentKeyFunctions.AltActivateItemInWorld; + } +} From f81ae218537804215c4f4a58ee1843d5af3ab8ff Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 19 May 2026 12:00:22 +0000 Subject: [PATCH 43/52] 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 df5f0eef7c..785c487753 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Kittygyat - changes: - - message: Fixed several unintended burn groupings with the clumsy gun explosions - & bible misuse. - type: Fix - id: 9186 - time: '2025-11-05T03:43:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/41307 - author: chromiumboy changes: - message: Gas analyzers now correctly report the total volume and the number of @@ -4077,3 +4069,11 @@ id: 9697 time: '2026-05-18T14:35:54.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/43983 +- author: Pok27 + changes: + - message: Radial menus no longer prevent sending to chat, or deleting text from + the chat input box. + type: Fix + id: 9698 + time: '2026-05-19T11:59:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40929 From 726a307b3d48bdc821375b7704c354eba15ea017 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 20 May 2026 08:35:47 +0200 Subject: [PATCH 44/52] Predict LubeSystem and LubedSystem (#39279) * predict lube * cleanup * cleanup * Update Content.Shared/Lube/LubeSystem.cs Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com> --------- Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com> --- Content.Server/Lube/LubedSystem.cs | 73 ------------------- Content.Shared/Lube/LubeComponent.cs | 32 ++++---- .../Lube/LubeSystem.cs | 34 +++++---- Content.Shared/Lube/LubedComponent.cs | 21 ++++-- Content.Shared/Lube/LubedSystem.cs | 62 ++++++++++++++++ 5 files changed, 115 insertions(+), 107 deletions(-) delete mode 100644 Content.Server/Lube/LubedSystem.cs rename {Content.Server => Content.Shared}/Lube/LubeSystem.cs (73%) create mode 100644 Content.Shared/Lube/LubedSystem.cs diff --git a/Content.Server/Lube/LubedSystem.cs b/Content.Server/Lube/LubedSystem.cs deleted file mode 100644 index fe017126b6..0000000000 --- a/Content.Server/Lube/LubedSystem.cs +++ /dev/null @@ -1,73 +0,0 @@ -using Content.Shared.Hands; -using Content.Shared.Hands.EntitySystems; -using Content.Shared.IdentityManagement; -using Content.Shared.Item; -using Content.Shared.Lube; -using Content.Shared.NameModifier.EntitySystems; -using Content.Shared.Popups; -using Content.Shared.Throwing; -using Robust.Shared.Random; - -namespace Content.Server.Lube; - -public sealed partial class LubedSystem : EntitySystem -{ - [Dependency] private ThrowingSystem _throwing = default!; - [Dependency] private IRobustRandom _random = default!; - [Dependency] private SharedTransformSystem _transform = default!; - [Dependency] private SharedPopupSystem _popup = default!; - [Dependency] private NameModifierSystem _nameMod = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnHandPickUp); - SubscribeLocalEvent(OnRefreshNameModifiers); - } - - private void OnInit(EntityUid uid, LubedComponent component, ComponentInit args) - { - _nameMod.RefreshNameModifiers(uid); - } - - /// - /// Note to whoever makes this predicted—there is a mispredict here that - /// would be nice to keep! If this is in shared, the client will predict - /// this and not run the pickup animation in - /// which would (probably) make this effect look less funny. You will - /// probably want to either tweak - /// to be able to cancel but still run the animation or something—we do want - /// the event to run before the animation for stuff like - /// . - /// - private void OnHandPickUp(Entity ent, ref BeforeGettingEquippedHandEvent args) - { - if (args.Cancelled) - return; - - if (ent.Comp.SlipsLeft <= 0) - { - RemComp(ent); - _nameMod.RefreshNameModifiers(ent.Owner); - return; - } - - ent.Comp.SlipsLeft--; - args.Cancelled = true; - - _transform.SetCoordinates(ent, Transform(args.User).Coordinates); - _transform.AttachToGridOrMap(ent); - _throwing.TryThrow(ent, _random.NextVector2(), ent.Comp.SlipStrength); - _popup.PopupEntity(Loc.GetString("lube-slip", ("target", Identity.Entity(ent, EntityManager))), - args.User, - args.User, - PopupType.MediumCaution); - } - - private void OnRefreshNameModifiers(Entity entity, ref RefreshNameModifiersEvent args) - { - args.AddModifier("lubed-name-prefix"); - } -} diff --git a/Content.Shared/Lube/LubeComponent.cs b/Content.Shared/Lube/LubeComponent.cs index 6a99e3cf14..9c8e434fd9 100644 --- a/Content.Shared/Lube/LubeComponent.cs +++ b/Content.Shared/Lube/LubeComponent.cs @@ -2,46 +2,52 @@ using Content.Shared.Chemistry.Reagent; using Content.Shared.FixedPoint; using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; namespace Content.Shared.Lube; -[RegisterComponent, NetworkedComponent] +/// +/// Used by lube bottles to apply to an item. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class LubeComponent : Component { - [DataField("squeeze")] + [DataField, AutoNetworkedField] public SoundSpecifier Squeeze = new SoundPathSpecifier("/Audio/Items/squeezebottle.ogg"); /// - /// Solution on the entity that contains the glue. + /// Solution on the entity that contains the lube. /// - [DataField("solution")] + [DataField, AutoNetworkedField] public string Solution = "drink"; /// - /// Reagent that will be used as glue. + /// Reagent that will be used as lube. /// - [DataField("reagent", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Reagent = "SpaceLube"; + [DataField, AutoNetworkedField] + public ProtoId Reagent = "SpaceLube"; /// /// Reagent consumption per use. /// - [DataField("consumption"), ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public FixedPoint2 Consumption = FixedPoint2.New(3); /// /// Min slips per unit /// - [DataField("minSlips"), ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public int MinSlips = 1; /// /// Max slips per unit /// - [DataField("maxSlips"), ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public int MaxSlips = 6; - [DataField("slipStrength"), ViewVariables(VVAccess.ReadWrite)] - public int SlipStrength = 10; + /// + /// The velocity the lubed item will be thrown at. + /// + [DataField, AutoNetworkedField] + public float SlipStrength = 10.0f; } diff --git a/Content.Server/Lube/LubeSystem.cs b/Content.Shared/Lube/LubeSystem.cs similarity index 73% rename from Content.Server/Lube/LubeSystem.cs rename to Content.Shared/Lube/LubeSystem.cs index e929486dce..8f89b9765d 100644 --- a/Content.Server/Lube/LubeSystem.cs +++ b/Content.Shared/Lube/LubeSystem.cs @@ -1,26 +1,26 @@ -using Content.Server.Administration.Logs; +using Content.Shared.Administration.Logs; +using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Database; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Item; -using Content.Shared.Lube; using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Popups; +using Content.Shared.Random.Helpers; using Content.Shared.Verbs; -using Content.Shared.Chemistry.EntitySystems; using Robust.Shared.Audio.Systems; -using Robust.Shared.Random; +using Robust.Shared.Timing; -namespace Content.Server.Lube; +namespace Content.Shared.Lube; public sealed partial class LubeSystem : EntitySystem { [Dependency] private SharedAudioSystem _audio = default!; [Dependency] private SharedPopupSystem _popup = default!; [Dependency] private SharedSolutionContainerSystem _solutionContainer = default!; - [Dependency] private IRobustRandom _random = default!; - [Dependency] private IAdminLogManager _adminLogger = default!; + [Dependency] private ISharedAdminLogManager _adminLogger = default!; [Dependency] private OpenableSystem _openable = default!; + [Dependency] private IGameTiming _timing = default!; public override void Initialize() { @@ -65,25 +65,27 @@ public sealed partial class LubeSystem : EntitySystem { if (HasComp(target) || !HasComp(target)) { - _popup.PopupEntity(Loc.GetString("lube-failure", ("target", Identity.Entity(target, EntityManager))), actor, actor, PopupType.Medium); + _popup.PopupClient(Loc.GetString("lube-failure", ("target", Identity.Entity(target, EntityManager))), actor, actor, PopupType.Medium); return false; } - if (HasComp(target) && _solutionContainer.TryGetSolution(entity.Owner, entity.Comp.Solution, out _, out var solution)) + if (HasComp(target) && _solutionContainer.TryGetSolution(entity.Owner, entity.Comp.Solution, out var solutionEntity, out _)) { - var quantity = solution.RemoveReagent(entity.Comp.Reagent, entity.Comp.Consumption); + var quantity = _solutionContainer.RemoveReagent(solutionEntity.Value, entity.Comp.Reagent, entity.Comp.Consumption); if (quantity > 0) { - var lubed = EnsureComp(target); - lubed.SlipsLeft = _random.Next(entity.Comp.MinSlips * quantity.Int(), entity.Comp.MaxSlips * quantity.Int()); - lubed.SlipStrength = entity.Comp.SlipStrength; + _audio.PlayPredicted(entity.Comp.Squeeze, entity.Owner, actor); + _popup.PopupClient(Loc.GetString("lube-success", ("target", Identity.Entity(target, EntityManager))), actor, actor, PopupType.Medium); _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(actor):actor} lubed {ToPrettyString(target):subject} with {ToPrettyString(entity.Owner):tool}"); - _audio.PlayPvs(entity.Comp.Squeeze, entity.Owner); - _popup.PopupEntity(Loc.GetString("lube-success", ("target", Identity.Entity(target, EntityManager))), actor, actor, PopupType.Medium); + var lubed = EnsureComp(target); + var rand = SharedRandomExtensions.PredictedRandom(_timing, GetNetEntity(entity)); + lubed.SlipsLeft = rand.Next(entity.Comp.MinSlips * quantity.Int(), 1 + entity.Comp.MaxSlips * quantity.Int()); + lubed.SlipStrength = entity.Comp.SlipStrength; + Dirty(target, lubed); return true; } } - _popup.PopupEntity(Loc.GetString("lube-failure", ("target", Identity.Entity(target, EntityManager))), actor, actor, PopupType.Medium); + _popup.PopupClient(Loc.GetString("lube-failure", ("target", Identity.Entity(target, EntityManager))), actor, actor, PopupType.Medium); return false; } } diff --git a/Content.Shared/Lube/LubedComponent.cs b/Content.Shared/Lube/LubedComponent.cs index 9d032a077e..906147eddb 100644 --- a/Content.Shared/Lube/LubedComponent.cs +++ b/Content.Shared/Lube/LubedComponent.cs @@ -1,11 +1,22 @@ +using Robust.Shared.GameStates; + namespace Content.Shared.Lube; -[RegisterComponent] +/// +/// If you try to pick up an item with this component it will be thrown. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class LubedComponent : Component { - [DataField("slipsLeft"), ViewVariables(VVAccess.ReadWrite)] - public int SlipsLeft; + /// + /// The number of throws before this component will be removed. + /// + [DataField, AutoNetworkedField] + public int SlipsLeft = 1; - [DataField("slipStrength"), ViewVariables(VVAccess.ReadWrite)] - public int SlipStrength; + /// + /// The throwing velocity. + /// + [DataField, AutoNetworkedField] + public float SlipStrength = 10.0f; } diff --git a/Content.Shared/Lube/LubedSystem.cs b/Content.Shared/Lube/LubedSystem.cs new file mode 100644 index 0000000000..4c361d8278 --- /dev/null +++ b/Content.Shared/Lube/LubedSystem.cs @@ -0,0 +1,62 @@ +using Content.Shared.Hands; +using Content.Shared.IdentityManagement; +using Content.Shared.NameModifier.EntitySystems; +using Content.Shared.Popups; +using Content.Shared.Throwing; +using Robust.Shared.Network; +using Robust.Shared.Random; + +namespace Content.Shared.Lube; + +public sealed partial class LubedSystem : EntitySystem +{ + [Dependency] private INetManager _net = default!; + [Dependency] private IRobustRandom _random = default!; + [Dependency] private NameModifierSystem _nameMod = default!; + [Dependency] private SharedPopupSystem _popup = default!; + [Dependency] private SharedTransformSystem _transform = default!; + [Dependency] private ThrowingSystem _throwing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnHandPickUp); + SubscribeLocalEvent(OnRefreshNameModifiers); + } + + private void OnInit(Entity ent, ref ComponentInit args) + { + _nameMod.RefreshNameModifiers(ent.Owner); + } + + private void OnHandPickUp(Entity ent, ref BeforeGettingEquippedHandEvent args) + { + var user = args.User; + + // Throwing is not predicted yet, so we don't want to predict setting the coordinates either, or it will look weird. + if (_net.IsServer) + { + args.Cancelled = true; + _transform.SetCoordinates(ent, Transform(user).Coordinates); + _transform.AttachToGridOrMap(ent); + _throwing.TryThrow(ent, _random.NextVector2(), baseThrowSpeed: ent.Comp.SlipStrength); + _popup.PopupEntity(Loc.GetString("lube-slip", ("target", Identity.Entity(ent, EntityManager))), user, user, PopupType.MediumCaution); + } + + ent.Comp.SlipsLeft--; + Dirty(ent); + if (ent.Comp.SlipsLeft <= 0) + { + RemCompDeferred(ent); + _nameMod.RefreshNameModifiers(ent.Owner); + } + } + + private void OnRefreshNameModifiers(Entity ent, ref RefreshNameModifiersEvent args) + { + if (ent.Comp.SlipsLeft > 0) // The component is removed deferred, so it might still exist when we refresh. + args.AddModifier("lubed-name-prefix"); + } +} From e44f44b2280a0e8633b4e96ca664e6fcb7cb488d Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Wed, 20 May 2026 09:04:27 +0200 Subject: [PATCH 45/52] Exo Station - Psychologist, Botany & Sec updates (#43533) * Changes to Security, Botany, added Psychology * Fix invalid entries --- Resources/Maps/exo.yml | 2213 ++++++++++++++++++++--------- Resources/Prototypes/Maps/exo.yml | 5 +- 2 files changed, 1536 insertions(+), 682 deletions(-) diff --git a/Resources/Maps/exo.yml b/Resources/Maps/exo.yml index feb26e058e..756adc8cd8 100644 --- a/Resources/Maps/exo.yml +++ b/Resources/Maps/exo.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 272.0.0 + engineVersion: 275.2.0 forkId: "" forkVersion: "" - time: 03/08/2026 15:02:53 - entityCount: 20047 + time: 04/09/2026 13:14:58 + entityCount: 20154 maps: - 1 grids: @@ -101,95 +101,95 @@ entities: chunks: 0,0: ind: 0,0 - tiles: YAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAEAYAAAAAADAGAAAAAAAQBgAAAAAAEAYAAAAAAAAIEAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAQBgAAAAAAMAYAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: YAAAAAACAGAAAAAAAgBgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAADAIEAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAFgAAAAABABYAAAAAAgAWAAAAAAIAFgAAAAAAABYAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAgBgAAAAAAMAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABYAAAAAAAAWAAAAAAIAFgAAAAABABYAAAAAAwCBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABYAAAAAAQAWAAAAAAEAgQAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAABgAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAFgAAAAADABYAAAAAAwAWAAAAAAIAFgAAAAADABYAAAAAAwBgAAAAAAEAYAAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABYAAAAAAQAWAAAAAAMAFgAAAAAAABYAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAADAGAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABYAAAAAAwAWAAAAAAIAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 0,-1: ind: 0,-1 - tiles: JQAAAAABACUAAAAAAAAlAAAAAAIAgQAAAAAAAGAAAAAAAQBgAAAAAAMAYAAAAAAAAGAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAQCBAAAAAAAAYAAAAAABAIEAAAAAAAAlAAAAAAMAJQAAAAACAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAIAJQAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAgCBAAAAAAAAKwAAAAACACsAAAAAAgCBAAAAAAAAKwAAAAADACsAAAAAAAArAAAAAAIAKwAAAAACACsAAAAAAQArAAAAAAEAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwCBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAIAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAMAgQAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAQBgAAAAAAIAgQAAAAAAAIEAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAABAIEAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAQBgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAACAIEAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: JQAAAAABACUAAAAAAQAlAAAAAAIAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAwCBAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAMAYAAAAAACAGAAAAAAAQCBAAAAAAAAYAAAAAACAIEAAAAAAAAlAAAAAAAAJQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAAAJQAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAQCBAAAAAAAAKwAAAAABACsAAAAAAgCBAAAAAAAAKwAAAAAAACsAAAAAAwArAAAAAAMAKwAAAAAAACsAAAAAAAArAAAAAAEAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAMAYAAAAAACAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAABgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAEAgQAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAIAgQAAAAAAAIEAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAADAIEAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 -1,-1: ind: -1,-1 - tiles: gQAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAIEAAAAAAAAkAAAAAAEAJAAAAAACAIEAAAAAAAAlAAAAAAEAJQAAAAABACUAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAADACUAAAAAAwAlAAAAAAIAgQAAAAAAAGAAAAAAAQBgAAAAAAMAgQAAAAAAACUAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAEYAAAAAAAALQAAAAAAAS4AAAAAAAMlAAAAAAMARAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAABAEQAAAAAAAAlAAAAAAMAKwAAAAABACsAAAAAAQArAAAAAAIAKwAAAAACACsAAAAAAwArAAAAAAMAGAAAAAAAACUAAAAAAQAtAAAAAAAAJQAAAAADAIEAAAAAAACBAAAAAAAARAAAAAAAAEQAAAAAAACBAAAAAAAAJQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAARgAAAAAAAAtAAAAAAABLgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAQAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAMAgQAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAQBgAAAAAAEAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAgBgAAAAAAEAYAAAAAADAIEAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAwBgAAAAAAEAYAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAABAIEAAAAAAABgAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAIAYAAAAAADAIEAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAgCBAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAACAGAAAAAAAwBgAAAAAAIAgQAAAAAAAGAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAABAIEAAAAAAABgAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAACAGAAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAIEAAAAAAAAkAAAAAAEAJAAAAAADAIEAAAAAAAAlAAAAAAMAJQAAAAACACUAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAADACUAAAAAAAAlAAAAAAIAgQAAAAAAAGAAAAAAAABgAAAAAAMAgQAAAAAAACUAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAEYAAAAAAAALQAAAAAAAS4AAAAAAAMlAAAAAAIARAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAACAEQAAAAAAAAlAAAAAAAAKwAAAAABACsAAAAAAwArAAAAAAEAKwAAAAADACsAAAAAAwArAAAAAAAAGAAAAAAAACUAAAAAAAAtAAAAAAAAJQAAAAACAIEAAAAAAACBAAAAAAAARAAAAAAAAEQAAAAAAACBAAAAAAAAJQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAARgAAAAAAAAtAAAAAAABLgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAMAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAADAGAAAAAAAQBgAAAAAAMAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAABAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAADAIEAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAACAIEAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAgBgAAAAAAMAgQAAAAAAAGAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAQBgAAAAAAEAgQAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAACAIEAAAAAAABgAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 -1,-2: ind: -1,-2 - tiles: GAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAC4AAAAAAAItAAAAAAAAJQAAAAADABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAABHAAAAAAAARwAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy4AAAAAAAIuAAAAAAAALQAAAAAAACsAAAAAAgeBAAAAAAAAgQAAAAAAACAAAAAAAQCBAAAAAAAARwAAAAAAAEcAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHgQAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAAAAEcAAAAAAABHAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAMAgQAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAABAIEAAAAAAAAtAAAAAAAAKwAAAAAAB4EAAAAAAAAgAAAAAAEALgAAAAAAAi0AAAAAAAMuAAAAAAADIAAAAAACAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAADACAAAAAAAgCBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAIAAAAAACAC0AAAAAAAAEAAAAAAAALQAAAAAAACAAAAAAAQAgAAAAAAIAgQAAAAAAAC0AAAAAAAAZAAAAAAIAGQAAAAADABkAAAAAAwAZAAAAAAIAgQAAAAAAAC0AAAAAAAArAAAAAAMHIAAAAAACACAAAAAAAwAuAAAAAAABLQAAAAAAAy4AAAAAAAAgAAAAAAIAIAAAAAABACAAAAAAAQAtAAAAAAAAHgAAAAAAABkAAAAAAAAZAAAAAAIAGQAAAAADAIEAAAAAAAAtAAAAAAAAKwAAAAAAByAAAAAAAgAgAAAAAAEAIAAAAAADACAAAAAAAAAgAAAAAAMAIAAAAAACACAAAAAAAgAgAAAAAAIALQAAAAAAAB4AAAAAAAAZAAAAAAIAGQAAAAAAABkAAAAAAwCBAAAAAAAALQAAAAAAACsAAAAAAgeBAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAAAAgAAAAAAAAIAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHRAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAEQAAAAAAAAtAAAAAAAAGAAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAABy0AAAAAAAAuAAAAAAADLQAAAAAAAC4AAAAAAAIuAAAAAAACLQAAAAAAAy0AAAAAAAAuAAAAAAACLgAAAAAAACAAAAAAAgAgAAAAAAMAIAAAAAADAB4AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQcuAAAAAAAALgAAAAAAAS0AAAAAAAAuAAAAAAAALgAAAAAAAi0AAAAAAAMuAAAAAAAALQAAAAAAABgAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAgAeAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAy0AAAAAAAMtAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy8AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAACUAAAAAAQCBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAACQAAAAAAgCBAAAAAAAAgQAAAAAAACQAAAAAAwAkAAAAAAAAJQAAAAAAACUAAAAAAwAlAAAAAAMAJQAAAAACAC4AAAAAAAEtAAAAAAADgQAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAIEAAAAAAAAkAAAAAAEAJAAAAAACAC8AAAAAAAAkAAAAAAMAJQAAAAADACUAAAAAAgAlAAAAAAAAJQAAAAADACUAAAAAAwAlAAAAAAAAJQAAAAACAA== + tiles: GAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAC4AAAAAAAItAAAAAAAAJQAAAAABABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAABHAAAAAAAARwAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy4AAAAAAAIuAAAAAAAALQAAAAAAACsAAAAAAQeBAAAAAAAAgQAAAAAAACAAAAAAAwCBAAAAAAAARwAAAAAAAEcAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHgQAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAACAEcAAAAAAABHAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAACAIEAAAAAAAAtAAAAAAAAKwAAAAADB4EAAAAAAAAgAAAAAAAALgAAAAAAAi0AAAAAAAMuAAAAAAADIAAAAAABAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAgCBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAIAAAAAADAC0AAAAAAAAEAAAAAAAALQAAAAAAACAAAAAAAwAgAAAAAAEAgQAAAAAAAC0AAAAAAAAZAAAAAAMAGQAAAAABABkAAAAAAwAZAAAAAAEAgQAAAAAAAC0AAAAAAAArAAAAAAEHIAAAAAACACAAAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAAAgAAAAAAMAIAAAAAACACAAAAAAAAAtAAAAAAAAHgAAAAAAABkAAAAAAwAZAAAAAAEAGQAAAAADAIEAAAAAAAAtAAAAAAAAKwAAAAABByAAAAAAAgAgAAAAAAEAIAAAAAABACAAAAAAAAAgAAAAAAIAIAAAAAADACAAAAAAAQAgAAAAAAIALQAAAAAAAB4AAAAAAAAZAAAAAAIAGQAAAAABABkAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAweBAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAIAAgAAAAAAAAIAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHRAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAEQAAAAAAAAtAAAAAAAAGAAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy0AAAAAAAAuAAAAAAADLQAAAAAAAC4AAAAAAAIuAAAAAAACLQAAAAAAAy0AAAAAAAAuAAAAAAACLgAAAAAAACAAAAAAAwAgAAAAAAMAIAAAAAACAB4AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQcuAAAAAAAALgAAAAAAAS0AAAAAAAAuAAAAAAAALgAAAAAAAi0AAAAAAAMuAAAAAAAALQAAAAAAABgAAAAAAAAgAAAAAAIAIAAAAAACACAAAAAAAQAeAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAAy0AAAAAAAMtAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy8AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAACUAAAAAAwCBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAACQAAAAAAACBAAAAAAAAgQAAAAAAACQAAAAAAgAkAAAAAAIAJQAAAAAAACUAAAAAAgAlAAAAAAIAJQAAAAADAC4AAAAAAAEtAAAAAAADgQAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAIEAAAAAAAAkAAAAAAIAJAAAAAACAC8AAAAAAAAkAAAAAAAAJQAAAAAAACUAAAAAAAAlAAAAAAMAJQAAAAAAACUAAAAAAAAlAAAAAAAAJQAAAAABAA== version: 7 0,-2: ind: 0,-2 - tiles: KwAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAADAC4AAAAAAAKBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAQAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAG8AAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAMALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAQCBAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAAAYAAAAAADABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAgBgAAAAAAMAYAAAAAABAGAAAAAAAQBgAAAAAAEAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAgAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAADAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwAVAAAAAAAAFQAAAAAAABUAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAgAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAFQAAAAAAABUAAAAAAAAVAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAABAGAAAAAAAQCBAAAAAAAAYAAAAAADABUAAAAAAAAVAAAAAAAAFQAAAAABAGAAAAAAAgAyAAAAAAAAMgAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAgBgAAAAAAIAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAAAAGAAAAAAAABgAAAAAAMAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAIALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAwCBAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAAAJQAAAAADACUAAAAAAQCBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAYAAAAAACAIEAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAABAIEAAAAAAABgAAAAAAIAJQAAAAABAIEAAAAAAABEAAAAAAAARAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAMAYAAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAAAAG8AAAAAAACBAAAAAAAAYAAAAAABAA== + tiles: KwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAMAYAAAAAADAC4AAAAAAAKBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAADAGAAAAAAAgAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAG8AAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAMALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADAIEAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAMAYAAAAAACABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAQBgAAAAAAEAgQAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAACAGAAAAAAAQAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAAAYAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgAVAAAAAAMAFQAAAAADABUAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAgAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAFQAAAAADABUAAAAAAQAVAAAAAAIAYAAAAAAAAGAAAAAAAABgAAAAAAEALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAABAGAAAAAAAACBAAAAAAAAYAAAAAAAABUAAAAAAQAVAAAAAAIAFQAAAAACAGAAAAAAAAAyAAAAAAAAMgAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAABgAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAMAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAMAYAAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAABgAAAAAAMALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAACAGAAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAADAGAAAAAAAwBgAAAAAAIAYAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAAAJQAAAAADACUAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAYAAAAAACAIEAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAQBgAAAAAAMAYAAAAAACAIEAAAAAAABgAAAAAAAAJQAAAAACAIEAAAAAAABEAAAAAAAARAAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAIAYAAAAAADAG8AAAAAAACBAAAAAAAAYAAAAAABAA== version: 7 1,-1: ind: 1,-1 - tiles: YAAAAAACAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAABAIEAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQMtAAAAAAAAgQAAAAAAACkAAAAAAgApAAAAAAEAKQAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi4AAAAAAAArAAAAAAADLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACkAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAlAAAAAAMAJQAAAAACAC4AAAAAAAEtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAKwAAAAADACsAAAAAAgArAAAAAAMAKwAAAAABACsAAAAAAwArAAAAAAMAKwAAAAADACUAAAAAAAAlAAAAAAAAJQAAAAACACUAAAAAAgArAAAAAAAAJQAAAAAAAC0AAAAAAACBAAAAAAAAKQAAAAACAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAgQAAAAAAACkAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQCBAAAAAAAAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: YAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQMtAAAAAAAAgQAAAAAAACkAAAAAAQApAAAAAAAAKQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi4AAAAAAAArAAAAAAIDLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACkAAAAAAwAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAlAAAAAAIAJQAAAAABAC4AAAAAAAEtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAKwAAAAABACsAAAAAAQArAAAAAAEAKwAAAAACACsAAAAAAwArAAAAAAEAKwAAAAACACUAAAAAAgAlAAAAAAAAJQAAAAACACUAAAAAAwArAAAAAAEAJQAAAAABAC0AAAAAAACBAAAAAAAAKQAAAAABAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAgQAAAAAAACkAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAACBAAAAAAAAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 1,-2: ind: 1,-2 - tiles: YAAAAAACAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAIAgQAAAAAAAC0AAAAAAAAlAAAAAAIALQAAAAAAAIEAAAAAAACBAAAAAAAAKQAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAIAYAAAAAADAIEAAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAACBAAAAAAAAKQAAAAADACkAAAAAAQApAAAAAAIAJQAAAAACACUAAAAAAwBgAAAAAAIAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAQCBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAACkAAAAAAgAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAMAYAAAAAABAGAAAAAAAQBgAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAApAAAAAAIAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAGAAAAAAAQBgAAAAAAMAYAAAAAADAGAAAAAAAwBgAAAAAAEAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAKQAAAAACABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAAApAAAAAAMAKQAAAAACACUAAAAAAgAlAAAAAAMAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAACABYAAAAAAwCBAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy4AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAMAYAAAAAADAGAAAAAAAwBgAAAAAAIAgQAAAAAAAIEAAAAAAAAeAAAAAAAALgAAAAAAAi4AAAAAAAMuAAAAAAABHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAC0AAAAAAANgAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAIAHgAAAAAAAC4AAAAAAAEuAAAAAAAAJQAAAAADACsAAAAAAQArAAAAAAAAKwAAAAACACsAAAAAAAArAAAAAAEAgQAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAABAB4AAAAAAAAtAAAAAAADLgAAAAAAAysAAAAAAwMuAAAAAAACLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAABgAAAAAAIAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAy0AAAAAAAArAAAAAAIDLQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAADAGAAAAAAAwBgAAAAAAMAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAAAy0AAAAAAACBAAAAAAAAKQAAAAAAACkAAAAAAAApAAAAAAIAYAAAAAADAGAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAADAGAAAAAAAwCBAAAAAAAALQAAAAAAACsAAAAAAQMtAAAAAAAAGAAAAAAAACkAAAAAAgApAAAAAAMAKQAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAMAYAAAAAABAGAAAAAAAABgAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMDLQAAAAAAABgAAAAAAAApAAAAAAEAKQAAAAADACkAAAAAAwBgAAAAAAEAYAAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAADAGAAAAAAAwBgAAAAAAAAYAAAAAACAIEAAAAAAAAtAAAAAAAAKwAAAAABAy0AAAAAAACBAAAAAAAAKQAAAAABACkAAAAAAwApAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAQCBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAAAKQAAAAACAA== + tiles: YAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAAAgQAAAAAAAC0AAAAAAAAlAAAAAAIALQAAAAAAAIEAAAAAAACBAAAAAAAAKQAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAIAYAAAAAADAIEAAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAACBAAAAAAAAKQAAAAACACkAAAAAAAApAAAAAAMAJQAAAAADACUAAAAAAQBgAAAAAAMAYAAAAAACAGAAAAAAAwBgAAAAAAMAYAAAAAAAAGAAAAAAAgCBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAACkAAAAAAgAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAABgAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAApAAAAAAMAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAEAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAKQAAAAABABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAAApAAAAAAIAKQAAAAABACUAAAAAAAAlAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAACABYAAAAAAgCBAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy4AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAAAAGAAAAAAAgBgAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAALgAAAAAAAi4AAAAAAAMuAAAAAAABHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAC0AAAAAAANgAAAAAAIAYAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAwBgAAAAAAMAHgAAAAAAAC4AAAAAAAEuAAAAAAAAJQAAAAABACsAAAAAAwArAAAAAAAAKwAAAAADACsAAAAAAgArAAAAAAEAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAABgAAAAAAMAYAAAAAADAB4AAAAAAAAtAAAAAAADLgAAAAAAAysAAAAAAwMuAAAAAAACLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAABgAAAAAAMAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAy0AAAAAAAArAAAAAAADLQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAABgAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABAy0AAAAAAACBAAAAAAAAKQAAAAADACkAAAAAAwApAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAMAYAAAAAACAGAAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAgMtAAAAAAAAGAAAAAAAACkAAAAAAQApAAAAAAAAKQAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAABgAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEDLQAAAAAAABgAAAAAAAApAAAAAAAAKQAAAAADACkAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAACAGAAAAAAAABgAAAAAAMAYAAAAAADAIEAAAAAAAAtAAAAAAAAKwAAAAACAy0AAAAAAACBAAAAAAAAKQAAAAABACkAAAAAAQApAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAAAYAAAAAACAGAAAAAAAwCBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAMAKQAAAAADAA== version: 7 0,-3: ind: 0,-3 - tiles: IAAAAAADAAMAAAAAAAADAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAIAAAAAAAACUAAAAAAQAlAAAAAAAAJQAAAAACACUAAAAAAQAlAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAcAAAAAAAADAAAAAAAAAwAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAALgAAAAAAAi0AAAAAAAMHAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAALwAAAAAAAC8AAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAC0AAAAAAAAlAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS4AAAAAAAOBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAuAAAAAAABLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAKwAAAAAABy4AAAAAAAEYAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADKwAAAAADACsAAAAAAgArAAAAAAMAKwAAAAABACUAAAAAAAArAAAAAAMAGAAAAAAAACsAAAAAAAArAAAAAAEAKwAAAAABACsAAAAAAQArAAAAAAIAKwAAAAAAACsAAAAAAwArAAAAAAAAKwAAAAABAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAEAYAAAAAADAA== + tiles: IAAAAAACAAMAAAAAAAADAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAIAAAAAADACUAAAAAAwAlAAAAAAAAJQAAAAACACUAAAAAAQAlAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAcAAAAAAAADAAAAAAAAAwAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAALgAAAAAAAi0AAAAAAAMHAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAALwAAAAAAAC8AAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAC0AAAAAAAAlAAAAAAMALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS4AAAAAAAOBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAuAAAAAAABLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAKwAAAAABBy4AAAAAAAEYAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADKwAAAAAAACsAAAAAAwArAAAAAAAAKwAAAAADACUAAAAAAgArAAAAAAMAGAAAAAAAACsAAAAAAQArAAAAAAMAKwAAAAACACsAAAAAAQArAAAAAAEAKwAAAAADACsAAAAAAQArAAAAAAAAKwAAAAACAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAgBgAAAAAAIAYAAAAAADAA== version: 7 1,-3: ind: 1,-3 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAYAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAADFwAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS4AAAAAAAOBAAAAAAAAIAAAAAAAACsAAAAAAAAgAAAAAAAAgQAAAAAAAG8AAAAAAAAlAAAAAAEAJQAAAAABACUAAAAAAwAlAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAABgAAAAAAABvAAAAAAAAJQAAAAAAACUAAAAAAQAlAAAAAAEAJQAAAAADAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAAAYAAAAAAAAbwAAAAAAACUAAAAAAAAlAAAAAAAAJQAAAAACACUAAAAAAwAJAAAAAAAABAAAAAAAAAkAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAG8AAAAAAAAlAAAAAAAAJQAAAAADACUAAAAAAQAlAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAABvAAAAAAAAJQAAAAACACUAAAAAAwAlAAAAAAEAJQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAbwAAAAAAACUAAAAAAgAlAAAAAAIAJQAAAAADACUAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi4AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAgctAAAAAAAAgQAAAAAAAG8AAAAAAAAlAAAAAAEAJQAAAAAAACUAAAAAAgAlAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAXAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAQAAAAAAIAEAAAAAABABAAAAAAAgAQAAAAAAEAJQAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAABy0AAAAAAACBAAAAAAAAEAAAAAAAABAAAAAAAwAQAAAAAAAAEAAAAAADAG8AAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMYAAAAAAAALgAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAKwAAAAACACsAAAAAAQArAAAAAAAAKwAAAAAAACsAAAAAAQArAAAAAAEAGAAAAAAAACsAAAAAAAAlAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAuAAAAAAADKwAAAAAABy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAYAAAAAADAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAYAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAADFwAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS4AAAAAAAOBAAAAAAAAIAAAAAAAACsAAAAAAgAgAAAAAAAAgQAAAAAAAG8AAAAAAAAlAAAAAAEAJQAAAAABACUAAAAAAQAlAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAABgAAAAAAABvAAAAAAAAJQAAAAAAACUAAAAAAAAlAAAAAAEAJQAAAAADAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAAAYAAAAAAAAbwAAAAAAACUAAAAAAAAlAAAAAAIAJQAAAAABACUAAAAAAwAJAAAAAAAABAAAAAAAAAkAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAAgQAAAAAAAG8AAAAAAAAlAAAAAAAAJQAAAAACACUAAAAAAQAlAAAAAAEACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAABvAAAAAAAAJQAAAAABACUAAAAAAwAlAAAAAAMAJQAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAACBAAAAAAAAbwAAAAAAACUAAAAAAgAlAAAAAAAAJQAAAAACACUAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi4AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAG8AAAAAAAAlAAAAAAIAJQAAAAABACUAAAAAAgAlAAAAAAMALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAXAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAQAAAAAAEAEAAAAAACABAAAAAAAwAQAAAAAAIAJQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAEAAAAAABABAAAAAAAAAQAAAAAAAAEAAAAAACAG8AAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMYAAAAAAAALgAAAAAAACsAAAAAAwctAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAKwAAAAAAACsAAAAAAgArAAAAAAMAKwAAAAACACsAAAAAAAArAAAAAAMAGAAAAAAAACsAAAAAAAAlAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAuAAAAAAADKwAAAAACBy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAYAAAAAADAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 -1,-3: ind: -1,-3 - tiles: gQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAAAeAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAMAgQAAAAAAACAAAAAAAAAgAAAAAAMAIAAAAAABACAAAAAAAQAgAAAAAAAAIAAAAAACAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADAIEAAAAAAAAgAAAAAAAAgQAAAAAAACAAAAAAAAAYAAAAAAAALQAAAAAAACsAAAAAAgctAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAEAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAC8AAAAAAACBAAAAAAAAIAAAAAADAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAALwAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy0AAAAAAAAuAAAAAAABLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABcAAAAAAAAYAAAAAAAALQAAAAAAACUAAAAAAwArAAAAAAAAJQAAAAACAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAACAAAAAAAgCBAAAAAAAAGAAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABvAAAAAAAALQAAAAAABxgAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAuAAAAAAABbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAC4AAAAAAAEtAAAAAAADGAAAAAAAAIEAAAAAAAAYAAAAAAAALQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAAAYAAAAAAAAJQAAAAABABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABvAAAAAAAALQAAAAAAACsAAAAAAgcYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAC0AAAAAAAArAAAAAAMHGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAAAtAAAAAAAAKwAAAAACBw== + tiles: gQAAAAAAAC0AAAAAAAArAAAAAAAHLQAAAAAAAIEAAAAAAAAeAAAAAAAAIAAAAAABACAAAAAAAgAgAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAABACAAAAAAAgAgAAAAAAEAIAAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACAIEAAAAAAAAgAAAAAAIAgQAAAAAAACAAAAAAAgAYAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC8AAAAAAAAYAAAAAAAALwAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAC8AAAAAAACBAAAAAAAAIAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAALwAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAAAuAAAAAAABLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABcAAAAAAAAYAAAAAAAALQAAAAAAACUAAAAAAQArAAAAAAMAJQAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAACAAAAAAAgCBAAAAAAAAGAAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABvAAAAAAAALQAAAAAABxgAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAuAAAAAAABbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAC4AAAAAAAEtAAAAAAADGAAAAAAAAIEAAAAAAAAYAAAAAAAALQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAAAYAAAAAAAAJQAAAAABABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABvAAAAAAAALQAAAAAAACsAAAAAAQcYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAC0AAAAAAAArAAAAAAIHGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAAAtAAAAAAAAKwAAAAABBw== version: 7 -2,-2: ind: -2,-2 - tiles: gQAAAAAAAIEAAAAAAAAtAAAAAAAAJQAAAAACAC0AAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAIEAAAAAAAABAAAAAAEAAQAAAAABAAEAAAAAAQAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAABy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAHgAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAvAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAADAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAACAAAAAAAQAgAAAAAAIALgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAMgAAAAAAIALgAAAAAAA4EAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAIAAAAAABAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAIAAAAAAAAC4AAAAAAAAYAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAIAIAAAAAADACAAAAAAAgAgAAAAAAAAIAAAAAACACAAAAAAAQAgAAAAAAEAIAAAAAABACAAAAAAAQAuAAAAAAADGAAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAARAAAAAAAAEQAAAAAAAAYAAAAAAAARAAAAAAAAC0AAAAAAAAYAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy4AAAAAAAMuAAAAAAAAGAAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAABgAAAAAAAAtAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAALQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAAEQAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAC0AAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAABEAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAAAtAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAEAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAAAtAAAAAAAAJQAAAAADAC0AAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAIEAAAAAAAABAAAAAAIAAQAAAAABAAEAAAAAAgAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAHgAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAvAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAACAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAAHLQAAAAAAACAAAAAAAgAgAAAAAAAALgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAMgAAAAAAMALgAAAAAAA4EAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAIAAAAAADAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAIAAAAAABAC4AAAAAAAAYAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAACACAAAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAwAgAAAAAAAAIAAAAAABACAAAAAAAAAuAAAAAAADGAAAAAAAAC0AAAAAAAArAAAAAAAHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAARAAAAAAAAEQAAAAAAAAYAAAAAAAARAAAAAAAAC0AAAAAAAAYAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy4AAAAAAAMuAAAAAAAAGAAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAABgAAAAAAAAtAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAxgAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAALQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAAEQAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAC0AAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAABEAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAABy0AAAAAAAAtAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAEAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAA== version: 7 -2,-1: ind: -2,-1 - tiles: HgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAABy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAABEAAAAAAAARAAAAAAAAB4AAAAAAAAeAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAALgAAAAAAAi4AAAAAAAArAAAAAAAHLgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAlAAAAAAIAJQAAAAADACsAAAAAAwArAAAAAAMAKwAAAAABACsAAAAAAwArAAAAAAEAKwAAAAACACsAAAAAAwArAAAAAAMAKwAAAAABACsAAAAAAwArAAAAAAIAKwAAAAADACsAAAAAAAArAAAAAAEAJQAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: HgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAABEAAAAAAAARAAAAAAAAB4AAAAAAAAeAAAAAAAALQAAAAAAACsAAAAAAgctAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAALgAAAAAAAi4AAAAAAAArAAAAAAMHLgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAAlAAAAAAMAJQAAAAADACsAAAAAAQArAAAAAAIAKwAAAAABACsAAAAAAwArAAAAAAMAKwAAAAACACsAAAAAAwArAAAAAAEAKwAAAAADACsAAAAAAQArAAAAAAAAKwAAAAADACsAAAAAAQArAAAAAAEAJQAAAAAAAC4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 -2,-3: ind: -2,-3 - tiles: gQAAAAAAAIEAAAAAAAAtAAAAAAACKwAAAAACARgAAAAAAAAtAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAAAgAAAAAAMAIAAAAAADAIEAAAAAAACBAAAAAAAALwAAAAAAAAAAAAAAAACBAAAAAAAALQAAAAAAAisAAAAAAgEYAAAAAAAALQAAAAAAAoEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAADACAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAAC0AAAAAAAIrAAAAAAEBGAAAAAAAAC0AAAAAAAKBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAABACAAAAAAAgAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAAAtAAAAAAACKwAAAAABARgAAAAAAAAtAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAQAgAAAAAAIAIAAAAAADAIEAAAAAAAAYAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAisAAAAAAAEYAAAAAAAALQAAAAAAAoEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC0AAAAAAAIrAAAAAAIBGAAAAAAAAC0AAAAAAAIYAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAtAAAAAAACKwAAAAABAS4AAAAAAAIuAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAHgAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAAAAAAAAAAgQAAAAAAAAEAAAAAAQABAAAAAAEAAQAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAS4AAAAAAAOBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAIEAAAAAAAArAAAAAAIAKwAAAAAAACsAAAAAAwAYAAAAAAAAGAAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAAAtAAAAAAACKwAAAAADARgAAAAAAAAtAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAAAAAAAAAACBAAAAAAAALQAAAAAAAisAAAAAAQEYAAAAAAAALQAAAAAAAoEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAAC0AAAAAAAIrAAAAAAMBGAAAAAAAAC0AAAAAAAKBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAIAIAAAAAAAACAAAAAAAgAgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAAAtAAAAAAACKwAAAAACARgAAAAAAAAtAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAQAgAAAAAAMAIAAAAAACAIEAAAAAAAAYAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAisAAAAAAgEYAAAAAAAALQAAAAAAAoEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC0AAAAAAAIrAAAAAAABGAAAAAAAAC0AAAAAAAIYAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAtAAAAAAACKwAAAAABAS4AAAAAAAIuAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAHgAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAAAAAAAAAAgQAAAAAAAAEAAAAAAgABAAAAAAEAAQAAAAACABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAS4AAAAAAAOBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAIEAAAAAAAArAAAAAAEAKwAAAAADACsAAAAAAQAYAAAAAAAAGAAAAAAAAA== version: 7 0,-4: ind: 0,-4 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAArAAAAAAEHKwAAAAABB4EAAAAAAAAYAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAADAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAKwAAAAAABysAAAAAAweBAAAAAAAAGAAAAAAAACAAAAAAAwAgAAAAAAEAIAAAAAABACAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAABkAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAAAgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAIAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAABvAAAAAAAAbwAAAAAAACAAAAAAAwAgAAAAAAEAIAAAAAACACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAADAAcAAAAAAAAHAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAABvAAAAAAAAIAAAAAADACAAAAAAAwAgAAAAAAIAIAAAAAACACAAAAAAAAAgAAAAAAMABwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAbwAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAAAACAAAAAAAgCBAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAwCBAAAAAAAAIAAAAAACACAAAAAAAgAgAAAAAAAALgAAAAAAAi0AAAAAAAMtAAAAAAADGAAAAAAAAC4AAAAAAAAtAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAyAAAAAAAAAgAAAAAAAAIAAAAAABAC0AAAAAAAAlAAAAAAAAKwAAAAAAABgAAAAAAAArAAAAAAMAKwAAAAACACsAAAAAAgArAAAAAAEAKwAAAAABACsAAAAAAAArAAAAAAIAKwAAAAAAACsAAAAAAAAgAAAAAAAAIAAAAAACACAAAAAAAgAtAAAAAAAALQAAAAAAAC4AAAAAAAIYAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAAMAAAAAAAADAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAlAAAAAAIAJQAAAAADACUAAAAAAQAlAAAAAAAAJQAAAAADAIEAAAAAAAAgAAAAAAMALgAAAAAAAi0AAAAAAAMDAAAAAAAAAwAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAAAgAAAAAAEAJQAAAAADACAAAAAAAwAgAAAAAAAAIAAAAAAAACUAAAAAAACBAAAAAAAAIAAAAAABAC0AAAAAAAAlAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAACUAAAAAAgAgAAAAAAMAIAAAAAAAACAAAAAAAAAlAAAAAAMAgQAAAAAAACAAAAAAAAAuAAAAAAABLQAAAAAAAw== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAArAAAAAAMHKwAAAAACB4EAAAAAAAAYAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAEAIAAAAAABAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAKwAAAAADBysAAAAAAweBAAAAAAAAGAAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAACACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAABkAAAAAAgCBAAAAAAAAIAAAAAADACAAAAAAAQAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAMAIAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAABvAAAAAAAAbwAAAAAAACAAAAAAAwAgAAAAAAMAIAAAAAABACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAQAgAAAAAAIAIAAAAAADAAcAAAAAAAAHAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAABvAAAAAAAAIAAAAAAAACAAAAAAAgAgAAAAAAMAIAAAAAADACAAAAAAAAAgAAAAAAIABwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAbwAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAADACAAAAAAAwCBAAAAAAAAIAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQCBAAAAAAAAIAAAAAABACAAAAAAAwAgAAAAAAIALgAAAAAAAi0AAAAAAAMtAAAAAAADGAAAAAAAAC4AAAAAAAAtAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAyAAAAAAAAAgAAAAAAEAIAAAAAADAC0AAAAAAAAlAAAAAAIAKwAAAAAAABgAAAAAAAArAAAAAAAAKwAAAAAAACsAAAAAAwArAAAAAAMAKwAAAAADACsAAAAAAQArAAAAAAEAKwAAAAACACsAAAAAAgAgAAAAAAIAIAAAAAABACAAAAAAAgAtAAAAAAAALQAAAAAAAC4AAAAAAAIYAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAAMAAAAAAAADAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAACACUAAAAAAgAlAAAAAAMAJQAAAAACAIEAAAAAAAAgAAAAAAEALgAAAAAAAi0AAAAAAAMDAAAAAAAAAwAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAAAgAAAAAAAAJQAAAAADACAAAAAAAgAgAAAAAAMAIAAAAAABACUAAAAAAQCBAAAAAAAAIAAAAAAAAC0AAAAAAAAlAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAACUAAAAAAQAgAAAAAAEAIAAAAAABACAAAAAAAgAlAAAAAAAAgQAAAAAAACAAAAAAAgAuAAAAAAABLQAAAAAAAw== version: 7 1,-4: ind: 1,-4 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAAAeAAAAAAAAIAAAAAAAAIEAAAAAAAAKAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy0AAAAAAACBAAAAAAAAHgAAAAAAACAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACsAAAAAAAAgAAAAAAAAgQAAAAAAAB4AAAAAAAAgAAAAAAEAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAIAAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAGAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADLgAAAAAAABgAAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAAOBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAIuAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAABLgAAAAAAA4EAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAIuAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAACLQAAAAAAAy4AAAAAAAMYAAAAAAAAGAAAAAAAAC4AAAAAAAEuAAAAAAADgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAACHgAAAAAAAB4AAAAAAAAeAAAAAAAALgAAAAAAAxgAAAAAAAAYAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAABgAAAAAAAAtAAAAAAADLgAAAAAAABgAAAAAAAAuAAAAAAACHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAuAAAAAAADGAAAAAAAAC4AAAAAAAEtAAAAAAADGAAAAAAAACsAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAgAAAAAAIAGAAAAAAAAC0AAAAAAAMuAAAAAAADGAAAAAAAAC4AAAAAAAEeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC4AAAAAAAAYAAAAAAAALgAAAAAAAi0AAAAAAAMYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAABgAAAAAAAAYAAAAAAAALgAAAAAAAR4AAAAAAAAeAAAAAAAAHgAAAAAAAC4AAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAADgQAAAAAAAC4AAAAAAAEuAAAAAAADGAAAAAAAABgAAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAIuAAAAAAAAgQAAAAAAACAAAAAAAwAlAAAAAAAALQAAAAAAAIEAAAAAAAAuAAAAAAADLgAAAAAAAS4AAAAAAAMYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAIuAAAAAAAALgAAAAAAAoEAAAAAAAAgAAAAAAAALQAAAAAAAy4AAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAAMYAAAAAAAALgAAAAAAAi0AAAAAAAMuAAAAAAAALgAAAAAAAi4AAAAAAACBAAAAAAAAIAAAAAACAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAAAeAAAAAAAAIAAAAAADAIEAAAAAAAAKAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy0AAAAAAACBAAAAAAAAHgAAAAAAACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACsAAAAAAQAgAAAAAAMAgQAAAAAAAB4AAAAAAAAgAAAAAAMAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAIAAAAAABAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAGAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADLgAAAAAAABgAAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAAOBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAIuAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAABLgAAAAAAA4EAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAIuAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAACLQAAAAAAAy4AAAAAAAMYAAAAAAAAGAAAAAAAAC4AAAAAAAEuAAAAAAADgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAACHgAAAAAAAB4AAAAAAAAeAAAAAAAALgAAAAAAAxgAAAAAAAAYAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAABgAAAAAAAAtAAAAAAADLgAAAAAAABgAAAAAAAAuAAAAAAACHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAuAAAAAAADGAAAAAAAAC4AAAAAAAEtAAAAAAADGAAAAAAAACsAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAgAAAAAAMAGAAAAAAAAC0AAAAAAAMuAAAAAAADGAAAAAAAAC4AAAAAAAEeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC4AAAAAAAAYAAAAAAAALgAAAAAAAi0AAAAAAAMYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAABgAAAAAAAAYAAAAAAAALgAAAAAAAR4AAAAAAAAeAAAAAAAAHgAAAAAAAC4AAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAADgQAAAAAAAC4AAAAAAAEuAAAAAAADGAAAAAAAABgAAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAIuAAAAAAAAgQAAAAAAACAAAAAAAQAlAAAAAAEALQAAAAAAAIEAAAAAAAAuAAAAAAADLgAAAAAAAS4AAAAAAAMYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAIuAAAAAAAALgAAAAAAAoEAAAAAAAAgAAAAAAAALQAAAAAAAy4AAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAAuAAAAAAABLQAAAAAAAy4AAAAAAAMYAAAAAAAALgAAAAAAAi0AAAAAAAMuAAAAAAAALgAAAAAAAi4AAAAAAACBAAAAAAAAIAAAAAADAA== version: 7 -1,-4: ind: -1,-4 - tiles: gQAAAAAAABsAAAAAAAAbAAAAAAAAGwAAAAAAABsAAAAAAACBAAAAAAAAIAAAAAAAACAAAAAAAwAgAAAAAAMAIAAAAAADACAAAAAAAgAgAAAAAAMAIAAAAAABACAAAAAAAAAgAAAAAAMAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAADACAAAAAAAQAgAAAAAAEAIAAAAAACACAAAAAAAwAgAAAAAAIAIAAAAAADACAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAEAYAAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAADACAAAAAAAgAgAAAAAAMAIAAAAAADACAAAAAAAwAgAAAAAAIAIAAAAAABACAAAAAAAwAgAAAAAAEAYAAAAAACAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAQCBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAAAAGAAAAAAAgBgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAcAAAAAAAAgAAAAAAMAIAAAAAACAAcAAAAAAAAHAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAADLwAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAHAAAAAAAAIAAAAAACACAAAAAAAAAgAAAAAAIAIAAAAAABAIEAAAAAAAAlAAAAAAAALgAAAAAAAS4AAAAAAAMvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAABwAAAAAAACAAAAAAAwAgAAAAAAEAIAAAAAAAACAAAAAAAgCBAAAAAAAAJQAAAAAAACUAAAAAAgAuAAAAAAABLgAAAAAAA4EAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAAcAAAAAAAAgAAAAAAIAIAAAAAABACAAAAAAAgAgAAAAAAIAIAAAAAABAC4AAAAAAAMlAAAAAAAAJQAAAAACACAAAAAAAgBvAAAAAAAAHgAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAAAgAAAAAAIAIAAAAAADAAcAAAAAAAAHAAAAAAAABwAAAAAAACAAAAAAAQAuAAAAAAABLgAAAAAAAyUAAAAAAwAgAAAAAAEAbwAAAAAAAB4AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAwAHAAAAAAAABwAAAAAAAAcAAAAAAAAgAAAAAAMAgQAAAAAAAC0AAAAAAAArAAAAAAAHIAAAAAAAAG8AAAAAAAAeAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAADACAAAAAAAQAgAAAAAAMAIAAAAAABAIEAAAAAAAAtAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAHgAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAADACAAAAAAAQCBAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAAgQAAAAAAAB4AAAAAAAAgAAAAAAIAIAAAAAADACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAEAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAACAAAAAAAgAeAAAAAAAAIAAAAAAAACAAAAAAAQAgAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAMAIAAAAAADACAAAAAAAwCBAAAAAAAAIAAAAAAAAA== + tiles: gQAAAAAAABsAAAAAAAAbAAAAAAAAGwAAAAAAABsAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAAAgAAAAAAIAIAAAAAABACAAAAAAAwAgAAAAAAIAIAAAAAABACAAAAAAAwAgAAAAAAAAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAAAACAAAAAAAQAgAAAAAAAAIAAAAAADACAAAAAAAwAgAAAAAAAAIAAAAAACACAAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAAAYAAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAADACAAAAAAAwAgAAAAAAEAIAAAAAACACAAAAAAAAAgAAAAAAIAYAAAAAADAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAQCBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAgBgAAAAAAAAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAcAAAAAAAAgAAAAAAMAIAAAAAAAAAcAAAAAAAAHAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAADLwAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAHAAAAAAAAIAAAAAABACAAAAAAAAAgAAAAAAAAIAAAAAADAIEAAAAAAAAlAAAAAAMALgAAAAAAAS4AAAAAAAMvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAABwAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAADACAAAAAAAQCBAAAAAAAAJQAAAAABACUAAAAAAAAuAAAAAAABLgAAAAAAA4EAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAAcAAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAAAgAAAAAAAAIAAAAAAAAC4AAAAAAAMlAAAAAAEAJQAAAAACACAAAAAAAwBvAAAAAAAAHgAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAAAAAcAAAAAAAAHAAAAAAAABwAAAAAAACAAAAAAAAAuAAAAAAABLgAAAAAAAyUAAAAAAgAgAAAAAAEAbwAAAAAAAB4AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAAAHAAAAAAAABwAAAAAAAAcAAAAAAAAgAAAAAAEAgQAAAAAAAC0AAAAAAAArAAAAAAIHIAAAAAABAG8AAAAAAAAeAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAACAIEAAAAAAAAtAAAAAAAAKwAAAAACBy0AAAAAAACBAAAAAAAAHgAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAgAgAAAAAAIAIAAAAAABACAAAAAAAgCBAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAB4AAAAAAAAgAAAAAAAAIAAAAAACACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAgQAAAAAAAC0AAAAAAAArAAAAAAAHLQAAAAAAACAAAAAAAgAeAAAAAAAAIAAAAAABACAAAAAAAAAgAAAAAAMAgQAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAAAACAAAAAAAACBAAAAAAAAIAAAAAACAA== version: 7 0,-5: ind: 0,-5 - tiles: LwAAAAAAAIEAAAAAAAAbAAAAAAAAGwAAAAAAABsAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy8AAAAAAACBAAAAAAAAGwAAAAAAACkAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAACUAAAAAAgArAAAAAAIAKwAAAAACACsAAAAAAAArAAAAAAMAJQAAAAACACsAAAAAAQAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACkAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAysAAAAAAwcuAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAABsAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAADACUAAAAAAwAlAAAAAAAAJQAAAAACAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAAAgQAAAAAAACkAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAQAlAAAAAAEAJQAAAAAAAIEAAAAAAAAuAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAKQAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAArAAAAAAMHLQAAAAAAABsAAAAAAACBAAAAAAAAKQAAAAAAACkAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAACUAAAAAAQArAAAAAAEAKwAAAAADACsAAAAAAgArAAAAAAMAJQAAAAACAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAAHLgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAALQAAAAAAAy0AAAAAAAMuAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAABy0AAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAgBgAAAAAAMAYAAAAAACAC0AAAAAAAMuAAAAAAADLQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAQAgAAAAAAIALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAIAAAAAAAAC0AAAAAAAAuAAAAAAABLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAKwAAAAABBy0AAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAACAAAAAAAAAtAAAAAAAAJQAAAAADACsAAAAAAwArAAAAAAAAKwAAAAADACsAAAAAAgArAAAAAAIAKwAAAAADACUAAAAAAQAtAAAAAAAAIAAAAAADAB4AAAAAAAAgAAAAAAEAIAAAAAAAACAAAAAAAAAgAAAAAAEALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAIEAAAAAAAAKAAAAAAAACgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: LwAAAAAAAIEAAAAAAAAbAAAAAAAAGwAAAAAAABsAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy8AAAAAAACBAAAAAAAAGwAAAAAAACkAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAACUAAAAAAgArAAAAAAEAKwAAAAADACsAAAAAAQArAAAAAAEAJQAAAAADACsAAAAAAwAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACkAAAAAAwCBAAAAAAAAgQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAysAAAAAAgcuAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAABsAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAAAACUAAAAAAgAlAAAAAAAAJQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAMAgQAAAAAAACkAAAAAAwCBAAAAAAAAgQAAAAAAACUAAAAAAwAlAAAAAAEAJQAAAAABAIEAAAAAAAAuAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAArAAAAAAEHLQAAAAAAABsAAAAAAACBAAAAAAAAKQAAAAADAIEAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACBAAAAAAAALQAAAAAAACUAAAAAAwArAAAAAAAAKwAAAAABACsAAAAAAgArAAAAAAAAJQAAAAABAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAABoAAAAAAABgAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAALQAAAAAAAy0AAAAAAAMuAAAAAAADgQAAAAAAAGAAAAAAAAAaAAAAAAAAYAAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAAABy0AAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAgBgAAAAAAIAYAAAAAADAC0AAAAAAAMuAAAAAAADLQAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAwAgAAAAAAIALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAApAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAIAAAAAABAC0AAAAAAAAuAAAAAAABLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAKwAAAAADBy0AAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAACAAAAAAAwAtAAAAAAAAJQAAAAACACsAAAAAAQArAAAAAAEAKwAAAAABACsAAAAAAgArAAAAAAIAKwAAAAAAACUAAAAAAwAtAAAAAAAAIAAAAAABAB4AAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAAAgAAAAAAIALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAIEAAAAAAAAKAAAAAAAACgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 -2,-4: ind: -2,-4 - tiles: YAAAAAADAGAAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAABAGAAAAAAAABgAAAAAAEAgQAAAAAAACAAAAAAAQCBAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAgCBAAAAAAAAgQAAAAAAACAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAIAgQAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAMAYAAAAAABAGAAAAAAAwBgAAAAAAMAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAAAYAAAAAACAIEAAAAAAABrAAAAAAAAawAAAAABAGsAAAAAAABrAAAAAAMAgQAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAIEAAAAAAABgAAAAAAMAYAAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAgAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAA8AAAAAAgCBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAIAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAArAAAAAAEAKwAAAAACACsAAAAAAQAlAAAAAAIAJQAAAAACAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAADJQAAAAACACUAAAAAAwArAAAAAAMAKwAAAAACACsAAAAAAAAlAAAAAAIABAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAy4AAAAAAAEYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAADGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAACUAAAAAAwAlAAAAAAMAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAGAAAAAAAACAAAAAAAQAlAAAAAAIAJQAAAAADACAAAAAAAgAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAHgAAAAAAAC0AAAAAAAIrAAAAAAABLgAAAAAAAS4AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAADACAAAAAAAQAgAAAAAAEAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAB4AAAAAAAAtAAAAAAACKwAAAAAAARgAAAAAAAAtAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAA== + tiles: YAAAAAABAGAAAAAAAgCBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAABgAAAAAAIAgQAAAAAAACAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAwBgAAAAAAAAYAAAAAACAGAAAAAAAgCBAAAAAAAAgQAAAAAAACAAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAAAYAAAAAAAAGAAAAAAAQBgAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAAAYAAAAAABAIEAAAAAAABrAAAAAAMAawAAAAABAGsAAAAAAgBrAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAACAIEAAAAAAABgAAAAAAIAYAAAAAADAIEAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAgCBAAAAAAAAYAAAAAADAGAAAAAAAgAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAA8AAAAAAwCBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAMAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAIAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAArAAAAAAAAKwAAAAACACsAAAAAAgAlAAAAAAIAJQAAAAADAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAADJQAAAAACACUAAAAAAwArAAAAAAEAKwAAAAAAACsAAAAAAQAlAAAAAAMABAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAy4AAAAAAAEYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAADGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACUAAAAAAgAlAAAAAAAAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAGAAAAAAAACAAAAAAAQAlAAAAAAEAJQAAAAACACAAAAAAAwAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAHgAAAAAAAC0AAAAAAAIrAAAAAAABLgAAAAAAAS4AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAAAACAAAAAAAgAgAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAB4AAAAAAAAtAAAAAAACKwAAAAABARgAAAAAAAAtAAAAAAACgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAA== version: 7 -3,-4: ind: -3,-4 - tiles: gQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAtAAAAAAAAJQAAAAACAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAADgQAAAAAAABgAAAAAAAAYAAAAAAAALgAAAAAAAi0AAAAAAAMtAAAAAAADIAAAAAACAIEAAAAAAAAgAAAAAAIAIAAAAAABAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAwCBAAAAAAAAIAAAAAACACAAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAIAAAAAABACAAAAAAAAAgAAAAAAEAIAAAAAADACAAAAAAAAAgAAAAAAMAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAADgQAAAAAAACAAAAAAAwAgAAAAAAIAIAAAAAACACAAAAAAAQAgAAAAAAAAIAAAAAADAIEAAAAAAAAgAAAAAAIAIAAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAC0AAAAAAAMtAAAAAAAALQAAAAAAAC0AAAAAAAMuAAAAAAADLgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAC0AAAAAAAAuAAAAAAADLQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAeAAAAAAAALQAAAAAAAy0AAAAAAAOBAAAAAAAALQAAAAAAAC0AAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMYAAAAAAAALQAAAAAAAy0AAAAAAAMuAAAAAAADLQAAAAAAAC0AAAAAAAAeAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAgctAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAAHLQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAtAAAAAAAAJQAAAAABAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALgAAAAAAAS0AAAAAAAMuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAuAAAAAAADgQAAAAAAABgAAAAAAAAYAAAAAAAALgAAAAAAAi0AAAAAAAMtAAAAAAADIAAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAACAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAAgAAAAAAMAIAAAAAAAACAAAAAAAgCBAAAAAAAAIAAAAAACACAAAAAAAQCBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAAIAAAAAAAACAAAAAAAgAgAAAAAAMAIAAAAAACACAAAAAAAgAgAAAAAAIAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAADgQAAAAAAACAAAAAAAgAgAAAAAAMAIAAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAACAIEAAAAAAAAgAAAAAAMAIAAAAAADAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAC0AAAAAAAMtAAAAAAAALQAAAAAAAC0AAAAAAAMuAAAAAAADLgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAC0AAAAAAAAuAAAAAAADLQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAxgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAB4AAAAAAAAeAAAAAAAALQAAAAAAAy0AAAAAAAOBAAAAAAAALQAAAAAAAC0AAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMYAAAAAAAALQAAAAAAAy0AAAAAAAMuAAAAAAADLQAAAAAAAC0AAAAAAAAeAAAAAAAAgQAAAAAAAA== version: 7 -3,-3: ind: -3,-3 - tiles: LQAAAAAAAC4AAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAAuAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAA4EAAAAAAAAtAAAAAAAALQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAxgAAAAAAAAtAAAAAAADLQAAAAAAAy4AAAAAAAAtAAAAAAAALQAAAAAAAB4AAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAAtAAAAAAAALgAAAAAAAC0AAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAHgAAAAAAAC0AAAAAAAMtAAAAAAAALQAAAAAAAC0AAAAAAAMuAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAAAtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACQAAAAAAQAkAAAAAAIAKQAAAAABACkAAAAAAwAkAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAALQAAAAAAA4EAAAAAAAAkAAAAAAMAJAAAAAABAIEAAAAAAACBAAAAAAAAJAAAAAACACQAAAAAAQAkAAAAAAMAJAAAAAACAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAKBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAAAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAA== + tiles: LQAAAAAAAC4AAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAAuAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAA4EAAAAAAAAtAAAAAAAALQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAxgAAAAAAAAtAAAAAAADLQAAAAAAAy4AAAAAAAAtAAAAAAAALQAAAAAAAB4AAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAAtAAAAAAAALgAAAAAAAC0AAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAeAAAAAAAAHgAAAAAAAC0AAAAAAAMtAAAAAAAALQAAAAAAAC0AAAAAAAMuAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAAIEAAAAAAAAtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACQAAAAAAQAkAAAAAAAAKQAAAAAAACkAAAAAAwAkAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAALQAAAAAAA4EAAAAAAAAkAAAAAAIAJAAAAAABAIEAAAAAAACBAAAAAAAAJAAAAAAAACQAAAAAAgAkAAAAAAAAJAAAAAACAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAKBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAtAAAAAAAAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAA== version: 7 -3,-2: ind: -3,-2 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAACgAAAAAAAIEAAAAAAAAKAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAKAAAAAAAAgQAAAAAAAAoAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAA4EAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAAALgAAAAAAAS0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADgQAAAAAAAC8AAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAEtAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFgAAAAACABYAAAAAAQCBAAAAAAAALgAAAAAAAi0AAAAAAAMuAAAAAAADgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAACgAAAAAAAIEAAAAAAAAKAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAKAAAAAAAAgQAAAAAAAAoAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAA4EAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAEALgAAAAAAAS0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAItAAAAAAADgQAAAAAAAC8AAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAEtAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFgAAAAABABYAAAAAAQCBAAAAAAAALgAAAAAAAi0AAAAAAAMuAAAAAAADgQAAAAAAAA== version: 7 -3,-1: ind: -3,-1 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABYAAAAAAgAWAAAAAAIAFgAAAAADABYAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLgAAAAAAAoEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAWAAAAAAMAFgAAAAADABYAAAAAAwAWAAAAAAMAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAgAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFgAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAAAACAAAAAAAQAgAAAAAAAAIAAAAAACACAAAAAAAQAgAAAAAAEAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC8AAAAAAAAgAAAAAAMAIAAAAAACACAAAAAAAAAgAAAAAAEAIAAAAAACACAAAAAAAwAgAAAAAAIAIAAAAAADAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAwAgAAAAAAEAIAAAAAACACAAAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAwAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABYAAAAAAAAWAAAAAAEAFgAAAAAAABYAAAAAAQCBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLgAAAAAAAoEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAWAAAAAAEAFgAAAAAAABYAAAAAAQAWAAAAAAEAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAAAgAAAAAAMALQAAAAAAAC0AAAAAAAAvAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFgAAAAABAIEAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAEAIAAAAAACACAAAAAAAQAgAAAAAAEAIAAAAAAAACAAAAAAAAAgAAAAAAMAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC8AAAAAAAAgAAAAAAMAIAAAAAABACAAAAAAAAAgAAAAAAAAIAAAAAABACAAAAAAAQAgAAAAAAAAIAAAAAACAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAgAgAAAAAAEAIAAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAADACAAAAAAAQAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 -4,-1: ind: -4,-1 @@ -197,7 +197,7 @@ entities: version: 7 -4,-2: ind: -4,-2 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAAsAAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAArAAAAAAEAKwAAAAABACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAALAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAAKwAAAAACACsAAAAAAQAgAAAAAAIAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAACwAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAACsAAAAAAwArAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAADMAAAAACwAzAAAAAAwAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAMwAAAAAJAIEAAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAAsAAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAArAAAAAAEAKwAAAAABACAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAALAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAAKwAAAAABACsAAAAAAAAgAAAAAAIAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAACwAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAACsAAAAAAQArAAAAAAMAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAADMAAAAABwAzAAAAAAQAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAMwAAAAAAAIEAAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 -5,-2: ind: -5,-2 @@ -205,7 +205,7 @@ entities: version: 7 -4,-4: ind: -4,-4 - tiles: DAAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAALAAAAAAAAgQAAAAAAAA0AAAAAAAANAAAAAAAAKwAAAAACACsAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAMAAAAAAAACwAAAAAAAIEAAAAAAAANAAAAAAAADQAAAAAAACsAAAAAAAArAAAAAAIAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAsAAAAAAACBAAAAAAAADQAAAAAAAA0AAAAAAAArAAAAAAAAKwAAAAACAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAxcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAuAAAAAAABFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAAuAAAAAAABLQAAAAAAAxcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAtAAAAAAADLgAAAAAAAy4AAAAAAAIuAAAAAAAALgAAAAAAAi0AAAAAAAMXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAALgAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAy4AAAAAAAAuAAAAAAACFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALgAAAAAAAYEAAAAAAACBAAAAAAAALgAAAAAAAQ== + tiles: DAAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAALAAAAAAAAgQAAAAAAAA0AAAAAAAANAAAAAAAAKwAAAAADACsAAAAAAwCBAAAAAAAAgQAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAMAAAAAAAACwAAAAAAAIEAAAAAAAANAAAAAAAADQAAAAAAACsAAAAAAgArAAAAAAIAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAMAAAAAAAADAAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAsAAAAAAACBAAAAAAAADQAAAAAAAA0AAAAAAAArAAAAAAEAKwAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAxcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAuAAAAAAABFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAAuAAAAAAABLQAAAAAAAxcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAtAAAAAAADLgAAAAAAAy4AAAAAAAIuAAAAAAAALgAAAAAAAi0AAAAAAAMXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAALgAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAy4AAAAAAAAuAAAAAAACFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALgAAAAAAAYEAAAAAAACBAAAAAAAALgAAAAAAAQ== version: 7 -4,-3: ind: -4,-3 @@ -213,7 +213,7 @@ entities: version: 7 -3,-5: ind: -3,-5 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALwAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAALQAAAAAAAy0AAAAAAAAuAAAAAAABLgAAAAAAAw8AAAAAAwAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAAAJQAAAAACAC0AAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALwAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAALQAAAAAAAy0AAAAAAAAuAAAAAAABLgAAAAAAAw8AAAAAAgAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAAAJQAAAAACAC0AAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAACsAAAAAAgctAAAAAAAAgQAAAAAAAA== version: 7 -4,-5: ind: -4,-5 @@ -233,47 +233,47 @@ entities: version: 7 -2,-5: ind: -2,-5 - tiles: gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAawAAAAABAGsAAAAAAQBrAAAAAAIAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAACQAAAAAAAGAAAAAAAQBgAAAAAAMAYAAAAAACAGAAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAMAgQAAAAAAAAkAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAgQAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAABAIEAAAAAAAAJAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAADAIEAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAwBgAAAAAAEAYAAAAAACAGAAAAAAAACBAAAAAAAAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAQBgAAAAAAMAYAAAAAACAGAAAAAAAABgAAAAAAIAgQAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAADAGAAAAAAAgBgAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAACAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAMAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAEAYAAAAAADAA== + tiles: gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAawAAAAAAAGsAAAAAAABrAAAAAAAAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAACQAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAQCBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAAAgQAAAAAAAAkAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAABAIEAAAAAAAAJAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAAAAIEAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAgCBAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAIAYAAAAAAAAGAAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQCBAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAAAYAAAAAADAGAAAAAAAwBgAAAAAAEAYAAAAAABAGAAAAAAAABgAAAAAAEAgQAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAIAgQAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAACAGAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAAAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAIAYAAAAAAAAA== version: 7 -1,-5: ind: -1,-5 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC0AAAAAAAAgAAAAAAIALQAAAAAAAC8AAAAAAACBAAAAAAAALwAAAAAAAC0AAAAAAAAgAAAAAAEALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAgQAAAAAAAC8AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAALgAAAAAAAC0AAAAAAAAuAAAAAAAALwAAAAAAAIEAAAAAAAAvAAAAAAAALgAAAAAAAC0AAAAAAAAuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAABsAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAbAAAAAAAAGwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAABsAAAAAAACBAAAAAAAAGwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAGwAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAABsAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAgAgAAAAAAAAgQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAgAgAAAAAAAAIAAAAAADACAAAAAAAgAgAAAAAAEAIAAAAAAAACAAAAAAAQAgAAAAAAIAIAAAAAACAIEAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAAAbAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAIAIAAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAABACAAAAAAAwAgAAAAAAEAIAAAAAADACAAAAAAAgCBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAGwAAAAAAAIEAAAAAAAAgAAAAAAIAIAAAAAACACAAAAAAAwAgAAAAAAEAIAAAAAAAACAAAAAAAgAgAAAAAAAAIAAAAAABACAAAAAAAgAgAAAAAAMAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAgAgAAAAAAIAIAAAAAABACAAAAAAAgAgAAAAAAMAIAAAAAACACAAAAAAAAAgAAAAAAEAIAAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC0AAAAAAAAgAAAAAAIALQAAAAAAAC8AAAAAAACBAAAAAAAALwAAAAAAAC0AAAAAAAAgAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAAAvAAAAAAAAgQAAAAAAAC8AAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAALgAAAAAAAC0AAAAAAAAuAAAAAAAALwAAAAAAAIEAAAAAAAAvAAAAAAAALgAAAAAAAC0AAAAAAAAuAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAABsAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAbAAAAAAAAGwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAABsAAAAAAACBAAAAAAAAGwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAGwAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAi0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAABsAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAgAgAAAAAAIAgQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAAAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAwAgAAAAAAAAIAAAAAAAACAAAAAAAwAgAAAAAAEAIAAAAAABACAAAAAAAAAgAAAAAAAAIAAAAAAAAIEAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAAAbAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAADACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAwAgAAAAAAIAIAAAAAAAACAAAAAAAgCBAAAAAAAACQAAAAAAAAkAAAAAAAAJAAAAAAAAGwAAAAAAAIEAAAAAAAAgAAAAAAIAIAAAAAAAACAAAAAAAQAgAAAAAAIAIAAAAAACACAAAAAAAwAgAAAAAAMAIAAAAAADACAAAAAAAgAgAAAAAAMAgQAAAAAAAAkAAAAAAAAJAAAAAAAACQAAAAAAAAkAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAAAgAAAAAAIAIAAAAAABACAAAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAgAgAAAAAAAAIAAAAAADAA== version: 7 -1,-6: ind: -1,-6 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAgQAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAgQAAAAAAAA== version: 7 0,-6: ind: 0,-6 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAwBgAAAAAAEAYAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAMAYAAAAAADAGAAAAAAAQBgAAAAAAAAYAAAAAADAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAgBgAAAAAAEAYAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAACAIEAAAAAAAAXAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAAAQAAAAAAMAEAAAAAAAABAAAAAAAwCBAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAEAAAAAABABAAAAAAAQAQAAAAAAIAgQAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAgQAAAAAAABAAAAAAAwAQAAAAAAMAEAAAAAADAIEAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAQAAAAAAEAEAAAAAAAABAAAAAAAQCBAAAAAAAAFwAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAABAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAEAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAABAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAARAAAAAAAAIEAAAAAAABEAAAAAAAAgQAAAAAAAEQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAEQAAAAAAACBAAAAAAAARAAAAAAAAIEAAAAAAABEAAAAAAAAgQAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAQBgAAAAAAEAYAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAwBgAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABAAAAAAAwAQAAAAAAAAEAAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAAAQAAAAAAIAEAAAAAABABAAAAAAAQCBAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAEAAAAAACABAAAAAAAwAQAAAAAAAAgQAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAgQAAAAAAABAAAAAAAgAQAAAAAAIAEAAAAAABAIEAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAMAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAQAAAAAAMAEAAAAAACABAAAAAAAwCBAAAAAAAAFwAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAwAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAMAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAABgAAAAAAIAYAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAARAAAAAAAAIEAAAAAAABEAAAAAAAAgQAAAAAAAEQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAEQAAAAAAACBAAAAAAAARAAAAAAAAIEAAAAAAABEAAAAAAAAgQAAAAAAAA== version: 7 0,-7: ind: 0,-7 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAwBgAAAAAAMAYAAAAAABAGAAAAAAAgBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAEAYAAAAAADAGAAAAAAAQBgAAAAAAAAYAAAAAABAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAAAAA== version: 7 1,-6: ind: 1,-6 - tiles: YAAAAAACAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAgAaAAAAAAMAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAADAIEAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAwBgAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAMAYAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADABoAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAADAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAQBgAAAAAAMAYAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAACAGAAAAAAAgBgAAAAAAAAYAAAAAABAIEAAAAAAABgAAAAAAEAYAAAAAACAGsAAAAAAgBgAAAAAAMAYAAAAAAAAGsAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAwBrAAAAAAIAYAAAAAAAAGsAAAAAAwBgAAAAAAMAYAAAAAADAGAAAAAAAQCBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAADAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAIAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAABgAAAAAAIAYAAAAAADAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAQBgAAAAAAAAYAAAAAADAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: YAAAAAADAGAAAAAAAABgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAwAaAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAQBgAAAAAAMAYAAAAAADAIEAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAwCBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAEAYAAAAAADABoAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAQBgAAAAAAMAYAAAAAACAGAAAAAAAQBgAAAAAAIAgQAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAABAIEAAAAAAABgAAAAAAAAYAAAAAABAGsAAAAAAABgAAAAAAMAYAAAAAADAGsAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAABrAAAAAAMAYAAAAAAAAGsAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAgCBAAAAAAAAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAIAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAQBgAAAAAAMAYAAAAAABAIEAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAQBgAAAAAAEAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 1,-7: ind: 1,-7 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAgQAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAACAIEAAAAAAABgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAwCBAAAAAAAAYAAAAAABAIEAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAQCBAAAAAAAAYAAAAAACAIEAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAwCBAAAAAAAAGgAAAAAAAGAAAAAAAQBgAAAAAAIAgQAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAMAgQAAAAAAAGAAAAAAAQCBAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAAAgQAAAAAAABoAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAgAaAAAAAAIAYAAAAAABAGAAAAAAAABgAAAAAAEAYAAAAAACAGAAAAAAAABgAAAAAAMAYAAAAAACAIEAAAAAAAAaAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAQBgAAAAAAMAYAAAAAADAGAAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAMAYAAAAAACAGAAAAAAAQBgAAAAAAEAYAAAAAAAABoAAAAAAwBgAAAAAAEAYAAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAMAYAAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAABAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAADAIEAAAAAAABgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAwCBAAAAAAAAYAAAAAACAIEAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAgCBAAAAAAAAGgAAAAACAGAAAAAAAwBgAAAAAAMAgQAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAIAgQAAAAAAAGAAAAAAAQCBAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAAAgQAAAAAAABoAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAAAAGAAAAAAAgAaAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAABAIEAAAAAAAAaAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAIAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAABAGAAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAgCBAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAIAYAAAAAABABoAAAAAAQBgAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAQBgAAAAAAEAYAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAABAA== version: 7 1,-5: ind: 1,-5 - tiles: LQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACsAAAAAAwArAAAAAAMAKwAAAAABACsAAAAAAwArAAAAAAAAKwAAAAADACsAAAAAAAArAAAAAAEAJQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAysAAAAAAwctAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAoEAAAAAAAAPAAAAAAMADwAAAAABAA8AAAAAAQCBAAAAAAAALgAAAAAAAy0AAAAAAAArAAAAAAEHLQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAADwAAAAAAAA8AAAAAAAAPAAAAAAMAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAADwAAAAADAA8AAAAAAgAPAAAAAAMADwAAAAACAA8AAAAAAwCBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAA8AAAAAAAAPAAAAAAMADwAAAAADAA8AAAAAAgAPAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAgAAAAAAIAIAAAAAABAIEAAAAAAAAPAAAAAAMADwAAAAADAA8AAAAAAQAPAAAAAAAADwAAAAACAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAADwAAAAADAA8AAAAAAQAPAAAAAAMADwAAAAADAA8AAAAAAQCBAAAAAAAALQAAAAAAACsAAAAAAActAAAAAAAAgQAAAAAAACAAAAAAAwAgAAAAAAIAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAA8AAAAAAAAPAAAAAAAADwAAAAAAAA8AAAAAAwAkAAAAAAMAgQAAAAAAAC0AAAAAAAArAAAAAAIHLQAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAABACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy0AAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAgAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAALQAAAAAAACsAAAAAAgctAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAACAAAAAAAAAgAAAAAAIAIAAAAAADACAAAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAEHLgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAABACAAAAAAAgAgAAAAAAMAHgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABAIEAAAAAAAAKAAAAAAAAgQAAAAAAAA== + tiles: LQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACsAAAAAAwArAAAAAAIAKwAAAAABACsAAAAAAwArAAAAAAEAKwAAAAACACsAAAAAAgArAAAAAAAAJQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAysAAAAAAActAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAoEAAAAAAAAPAAAAAAMADwAAAAADAA8AAAAAAQCBAAAAAAAALgAAAAAAAy0AAAAAAAArAAAAAAEHLQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAADwAAAAABAA8AAAAAAgAPAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAADwAAAAADAA8AAAAAAgAPAAAAAAIADwAAAAADAA8AAAAAAQCBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAA8AAAAAAQAPAAAAAAEADwAAAAADAA8AAAAAAgAPAAAAAAMAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAgAAAAAAEAIAAAAAACAIEAAAAAAAAPAAAAAAIADwAAAAABAA8AAAAAAAAPAAAAAAMADwAAAAABAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAADwAAAAAAAA8AAAAAAQAPAAAAAAAADwAAAAAAAA8AAAAAAgCBAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA8AAAAAAAAPAAAAAAEADwAAAAAAAA8AAAAAAwAkAAAAAAEAgQAAAAAAAC0AAAAAAAArAAAAAAEHLQAAAAAAACAAAAAAAwAgAAAAAAIAIAAAAAADACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy0AAAAAAAAgAAAAAAIAIAAAAAADACAAAAAAAQAgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAALQAAAAAAACsAAAAAAwctAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAACAAAAAAAwAgAAAAAAIAIAAAAAADACAAAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAIHLgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADgQAAAAAAACAAAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAQAgAAAAAAEAHgAAAAAAAIEAAAAAAAAtAAAAAAAAKwAAAAABBy4AAAAAAAItAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAA4EAAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAAAACBAAAAAAAALQAAAAAAACsAAAAAAQctAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAArAAAAAAMHLQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAAIEAAAAAAAAKAAAAAAAAgQAAAAAAAA== version: 7 2,-6: ind: 2,-6 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAA== version: 7 2,-5: ind: 2,-5 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAwCBAAAAAAAACgAAAAAAAAoAAAAAAACBAAAAAAAAgQAAAAAAAAoAAAAAAAAKAAAAAAAACgAAAAAAAAoAAAAAAAAKAAAAAAAAgQAAAAAAAAoAAAAAAAAKAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAoAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAKAAAAAAAACgAAAAAAAAoAAAAAAAAKAAAAAAAACgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAQCBAAAAAAAACgAAAAAAAAoAAAAAAACBAAAAAAAAgQAAAAAAAAoAAAAAAAAKAAAAAAAACgAAAAAAAAoAAAAAAAAKAAAAAAAAgQAAAAAAAAoAAAAAAAAKAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAoAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAKAAAAAAAACgAAAAAAAAoAAAAAAAAKAAAAAAAACgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 2,-7: ind: 2,-7 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAA== version: 7 3,-5: ind: 3,-5 @@ -289,7 +289,7 @@ entities: version: 7 4,-4: ind: 4,-4 - tiles: gQAAAAAAAIEAAAAAAAAvAAAAAAAALwAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAACgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAADAGAAAAAAAwBgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAMAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC8AAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAADAGAAAAAAAwBgAAAAAAMARAAAAAAAAEQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAIAYAAAAAADAGAAAAAAAgAaAAAAAAIAGgAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACABAAAAAAAgAQAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAEAgQAAAAAAACAAAAAAAwAgAAAAAAMAIAAAAAAAACAAAAAAAgAQAAAAAAMAEAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAAAvAAAAAAAALwAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAACgAAAAAAAB4AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAC8AAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAwBgAAAAAAAARAAAAAAAAEQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAADAGAAAAAAAgAaAAAAAAEAGgAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAABAAAAAAAQAQAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAQAAAAAAMAEAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 5,-4: ind: 5,-4 @@ -301,39 +301,39 @@ entities: version: 7 3,-4: ind: 3,-4 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAACBAAAAAAAAGAAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAACACUAAAAAAAAlAAAAAAEAJQAAAAAAACUAAAAAAAAlAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAIAJQAAAAAAACUAAAAAAgAlAAAAAAEAJQAAAAABACUAAAAAAQAlAAAAAAEAJQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAAAACUAAAAAAAAlAAAAAAIAJQAAAAACACUAAAAAAAAlAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAAAJQAAAAADACUAAAAAAQAlAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAOBAAAAAAAAJQAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAFAAAAAAAwBEAAAAAAAARAAAAAAAAEQAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABQAAAAAAIAUAAAAAACAFAAAAAAAgBQAAAAAAAAUAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAUAAAAAAAAFAAAAAAAwBQAAAAAAEAUAAAAAABAFAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAFAAAAAAAwBQAAAAAAMAUAAAAAADAFAAAAAAAgBQAAAAAAMAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAACBAAAAAAAAGAAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAACACUAAAAAAgAlAAAAAAMAJQAAAAABACUAAAAAAQAlAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAABACUAAAAAAQAlAAAAAAMAJQAAAAACACUAAAAAAAAlAAAAAAAAJQAAAAABAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAAAACUAAAAAAQAlAAAAAAIAJQAAAAACACUAAAAAAQAlAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAAAJQAAAAADACUAAAAAAwAlAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAC0AAAAAAAOBAAAAAAAAJQAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAFAAAAAAAABEAAAAAAAARAAAAAAAAEQAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAAtAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABQAAAAAAAAUAAAAAABAFAAAAAAAQBQAAAAAAIAUAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAALQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAUAAAAAACAFAAAAAAAgBQAAAAAAMAUAAAAAACAFAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAAALQAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAFAAAAAAAwBQAAAAAAAAUAAAAAAAAFAAAAAAAQBQAAAAAAAAgQAAAAAAAA== version: 7 4,-3: ind: 4,-3 - tiles: YAAAAAADAGAAAAAAAgBgAAAAAAAAIAAAAAACACAAAAAAAgAgAAAAAAAAIAAAAAAAACAAAAAAAwAgAAAAAAMAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADAIEAAAAAAAAgAAAAAAIAIAAAAAAAACAAAAAAAwAgAAAAAAEAIAAAAAABACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAwBgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACYAAAAAAwAmAAAAAAMAYAAAAAABAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAADAGAAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAMAgQAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAABAGAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAgBgAAAAAAIAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAIAYAAAAAADAGAAAAAAAQCBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAMAgQAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAADAGAAAAAAAABgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAIAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACAEQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAQCBAAAAAAAAIAAAAAABACAAAAAAAwBEAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAIAAAAAACACAAAAAAAgAgAAAAAAMARAAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAADACAAAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAQCBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAwAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: YAAAAAACAGAAAAAAAwBgAAAAAAIAIAAAAAACACAAAAAAAwAgAAAAAAIAIAAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAACAGAAAAAAAABgAAAAAAEAYAAAAAACAIEAAAAAAAAgAAAAAAMAIAAAAAABACAAAAAAAwAgAAAAAAEAIAAAAAAAACAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAACAAAAAAAQBgAAAAAAEAYAAAAAADAGAAAAAAAQBgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACYAAAAAAwAmAAAAAAIAYAAAAAADAGAAAAAAAwBgAAAAAAIAYAAAAAACAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAQBgAAAAAAMAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAQBgAAAAAAEAgQAAAAAAAIEAAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAABvAAAAAAAAbwAAAAAAAG8AAAAAAABvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAMAgQAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAAAAGAAAAAAAABgAAAAAAMAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAEAYAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAQBgAAAAAAMAYAAAAAADAGAAAAAAAQBgAAAAAAAAYAAAAAACAGAAAAAAAwCBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAMAgQAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAABAGAAAAAAAgBgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAABAIEAAAAAAACBAAAAAAAARAAAAAAAAEQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAQCBAAAAAAAAIAAAAAABACAAAAAAAAAgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAEAIAAAAAACACAAAAAAAwAgAAAAAAMAIAAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAABACAAAAAAAAAgAAAAAAMAIAAAAAABACAAAAAAAgCBAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAgCBAAAAAAAARAAAAAAAAEQAAAAAAABEAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 5,-3: ind: 5,-3 - tiles: IAAAAAADACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAAQAAAAAAAAEAAAAAAAAGAAAAAAAACAAAAAAAAAgAAAAAAEAIAAAAAADABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAABAAAAAAAABgAAAAAAAAmAAAAAAAAJgAAAAADACYAAAAAAgAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAEAAAAAAAAgQAAAAAAAAQAAAAAAABHAAAAAAAABAAAAAAAAAQAAAAAAAAYAAAAAAAAIAAAAAADACAAAAAAAgAgAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAEAAAAAAAAGAAAAAAAACAAAAAAAwAgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAEAAAAAAAABAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAEAAAAAAAABAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAA== + tiles: IAAAAAABACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAAQAAAAAAAAEAAAAAAAAGAAAAAAAACAAAAAAAAAgAAAAAAEAIAAAAAADABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAABAAAAAAAABgAAAAAAAAmAAAAAAIAJgAAAAACACYAAAAAAQAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAEAAAAAAAAgQAAAAAAAAQAAAAAAABHAAAAAAAABAAAAAAAAAQAAAAAAAAYAAAAAAAAIAAAAAAAACAAAAAAAQAgAAAAAAEAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAEAAAAAAAAGAAAAAAAACAAAAAAAQAgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAEAAAAAAAABAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAEAAAAAAAABAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAA== version: 7 3,-3: ind: 3,-3 - tiles: gQAAAAAAAIEAAAAAAAAtAAAAAAAAIAAAAAADAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAFAAAAAAAABQAAAAAAMAUAAAAAACAFAAAAAAAwBQAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAuAAAAAAABLgAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAUAAAAAADAFAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAIAAAAAAAAC4AAAAAAAEtAAAAAAABLQAAAAAAAYEAAAAAAACBAAAAAAAAUAAAAAACAFAAAAAAAwBQAAAAAAMAUAAAAAACAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAuAAAAAAAALgAAAAAAAS4AAAAAAAMgAAAAAAIAIAAAAAACACAAAAAAAgAgAAAAAAMAIAAAAAADAFAAAAAAAwBQAAAAAAAAUAAAAAADAFAAAAAAAwAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAAAtAAAAAAAAIAAAAAAAACAAAAAAAgAgAAAAAAIAIAAAAAACACAAAAAAAQAgAAAAAAEAIAAAAAABACAAAAAAAwAgAAAAAAAAIAAAAAACAGAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAACACAAAAAAAwAgAAAAAAMAIAAAAAACACAAAAAAAwAgAAAAAAAAIAAAAAACACAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAwAgAAAAAAEAIAAAAAADACAAAAAAAAAgAAAAAAAAIAAAAAABACAAAAAAAwAgAAAAAAIAgQAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAABAIEAAAAAAABgAAAAAAEAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIARAAAAAAAAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAIAIAAAAAADACAAAAAAAwCBAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAMAgQAAAAAAAGAAAAAAAwBgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAQAgAAAAAAMAgQAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAADAIEAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAwAgAAAAAAEAIAAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAACAGAAAAAAAQBgAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAgCBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAABAIEAAAAAAACBAAAAAAAAFgAAAAADABYAAAAAAQBgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAABAGAAAAAAAgBgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAAAYAAAAAABAGAAAAAAAwCBAAAAAAAAgQAAAAAAABYAAAAAAgAWAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAAAYAAAAAADAGAAAAAAAwBgAAAAAAIAYAAAAAADAGAAAAAAAQBgAAAAAAEAYAAAAAABAGAAAAAAAwBgAAAAAAEAgQAAAAAAAIEAAAAAAAAWAAAAAAAAFgAAAAAAABYAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAABAA== + tiles: gQAAAAAAAIEAAAAAAAAtAAAAAAAAIAAAAAAAAC0AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAFAAAAAAAgBQAAAAAAIAUAAAAAACAFAAAAAAAwBQAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAC0AAAAAAAAuAAAAAAABLgAAAAAAA4EAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAUAAAAAACAFAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAAtAAAAAAAAIAAAAAABAC4AAAAAAAEtAAAAAAABLQAAAAAAAYEAAAAAAACBAAAAAAAAUAAAAAACAFAAAAAAAQBQAAAAAAAAUAAAAAABAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAuAAAAAAAALgAAAAAAAS4AAAAAAAMgAAAAAAAAIAAAAAADACAAAAAAAQAgAAAAAAMAIAAAAAAAAFAAAAAAAABQAAAAAAEAUAAAAAACAFAAAAAAAAAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAwAtAAAAAAAAIAAAAAAAACAAAAAAAgAgAAAAAAAAIAAAAAACACAAAAAAAQAgAAAAAAMAIAAAAAADACAAAAAAAAAgAAAAAAEAIAAAAAADAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAAAIAAAAAADACAAAAAAAQAgAAAAAAIAIAAAAAADACAAAAAAAwAgAAAAAAMAIAAAAAABACAAAAAAAABgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAAAgAAAAAAMAIAAAAAABACAAAAAAAwAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAEAgQAAAAAAAIEAAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAADAIEAAAAAAABgAAAAAAEAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEARAAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAwCBAAAAAAAAYAAAAAABAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAAAACAAAAAAAwCBAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAMAYAAAAAABAGAAAAAAAgBgAAAAAAEAgQAAAAAAAGAAAAAAAwBgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAABACAAAAAAAQAgAAAAAAMAgQAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAwAgAAAAAAAAIAAAAAABAIEAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAABgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwCBAAAAAAAAYAAAAAADAGAAAAAAAQCBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAAAAIEAAAAAAACBAAAAAAAAFgAAAAADABYAAAAAAABgAAAAAAEAYAAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAEAYAAAAAACAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAQCBAAAAAAAAgQAAAAAAABYAAAAAAAAWAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAMAgQAAAAAAAIEAAAAAAAAWAAAAAAMAFgAAAAABABYAAAAAAgBgAAAAAAEAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAACAGAAAAAAAgBgAAAAAAEAYAAAAAACAGAAAAAAAQBgAAAAAAMAYAAAAAAAAA== version: 7 4,-2: ind: 4,-2 - tiles: YAAAAAABAGAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAACBAAAAAAAAgQAAAAAAABIAAAAAAAASAAAAAAAAEgAAAAAAABIAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAAAAB4AAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAwAgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAYAAAAAACAGAAAAAAAwAeAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAIAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAMAHgAAAAAAABIAAAAAAAASAAAAAAAAEgAAAAAAABIAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAARwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAS8AAAAAAAAtAAAAAAABLQAAAAAAAS0AAAAAAAEuAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAEvAAAAAAAALQAAAAAAAS0AAAAAAAEuAAAAAAADLgAAAAAAAS4AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAABLwAAAAAAAC0AAAAAAAGBAAAAAAAALgAAAAAAAS0AAAAAAAEtAAAAAAAALwAAAAAAACAAAAAAAAAgAAAAAAEAIAAAAAACACAAAAAAAgAgAAAAAAMAIAAAAAADACAAAAAAAgAgAAAAAAEAgQAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS4AAAAAAAOBAAAAAAAAIAAAAAADACAAAAAAAQAgAAAAAAMAIAAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAMtAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAIAIAAAAAACACAAAAAAAwAgAAAAAAIAIAAAAAADACAAAAAAAwCBAAAAAAAAIAAAAAABACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAABLgAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAAAgAAAAAAEAIAAAAAACACAAAAAAAAAgAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAOBAAAAAAAAIAAAAAACACAAAAAAAQAgAAAAAAEAIAAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAABACAAAAAAAgCBAAAAAAAAIQAAAAABACEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAA== + tiles: YAAAAAABAGAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwCBAAAAAAAAgQAAAAAAABIAAAAAAAASAAAAAAAAEgAAAAAAABIAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAABAB4AAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAQAgAAAAAAMAEgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAYAAAAAADAGAAAAAAAAAeAAAAAAAAIAAAAAABACAAAAAAAQAgAAAAAAIAIAAAAAACACAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAGAAAAAAAwBgAAAAAAAAHgAAAAAAACAAAAAAAgAgAAAAAAMAHgAAAAAAAB4AAAAAAAAeAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAARwAAAAAAAIEAAAAAAACBAAAAAAAAEgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAS8AAAAAAAAtAAAAAAABgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC0AAAAAAAEvAAAAAAAALQAAAAAAAS0AAAAAAAEtAAAAAAABLQAAAAAAAS4AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAABLwAAAAAAAC0AAAAAAAEtAAAAAAABLQAAAAAAAS0AAAAAAAEtAAAAAAAALwAAAAAAACAAAAAAAAAgAAAAAAIAIAAAAAACACAAAAAAAgAgAAAAAAEAIAAAAAAAACAAAAAAAwAgAAAAAAIAgQAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAAAS4AAAAAAAOBAAAAAAAAIAAAAAACACAAAAAAAAAgAAAAAAIAIAAAAAADACAAAAAAAQAgAAAAAAMAIAAAAAADAIEAAAAAAAAgAAAAAAMAIAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAMtAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAAAIAAAAAACACAAAAAAAwAgAAAAAAEAIAAAAAABACAAAAAAAQCBAAAAAAAAIAAAAAABACAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAABLgAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAABACAAAAAAAQAgAAAAAAIAIAAAAAACACAAAAAAAAAgAAAAAAIAgQAAAAAAACAAAAAAAQAgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAALQAAAAAAAy0AAAAAAAOBAAAAAAAAIAAAAAADACAAAAAAAAAgAAAAAAAAIAAAAAACACAAAAAAAgAgAAAAAAEAIAAAAAACACAAAAAAAAAgAAAAAAEAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAwCBAAAAAAAAIQAAAAABACEAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAA== version: 7 3,-2: ind: 3,-2 - tiles: gQAAAAAAAIEAAAAAAAAWAAAAAAMAFgAAAAACABYAAAAAAABgAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAIEAAAAAAABgAAAAAAIAYAAAAAABAIEAAAAAAABgAAAAAAAAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAgCBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAIAYAAAAAAAAGAAAAAAAwBgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAAAYAAAAAABAGAAAAAAAwBgAAAAAAMAYAAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAYAAAAAABAGAAAAAAAgBgAAAAAAEAYAAAAAADAGAAAAAAAQBgAAAAAAEAYAAAAAACAGAAAAAAAQAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAYAAAAAAAAGAAAAAAAgCBAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAEAgQAAAAAAAIEAAAAAAABHAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALgAAAAAAAiAAAAAAAQAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAABLwAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAADLgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAABLQAAAAAAAS8AAAAAAAAuAAAAAAABLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAS0AAAAAAAEvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAACACAAAAAAAgAgAAAAAAIAgQAAAAAAACAAAAAAAgBgAAAAAAMAYAAAAAADAGAAAAAAAwBgAAAAAAEAYAAAAAABAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAAAgAAAAAAEAIAAAAAABACAAAAAAAwAgAAAAAAIAIgAAAAABACIAAAAAAwAiAAAAAAEAIgAAAAADACQAAAAAAQAiAAAAAAEAIgAAAAAAACIAAAAAAABgAAAAAAAAIAAAAAACACAAAAAAAQAgAAAAAAMAIAAAAAADACAAAAAAAgCBAAAAAAAAIAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAQAiAAAAAAIAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAwAfAAAAAAMAgQAAAAAAAAcAAAAAAAAHAAAAAAAABwAAAAAAAIEAAAAAAABgAAAAAAAAIgAAAAABAGAAAAAAAABHAAAAAAAAIAAAAAABACAAAAAAAgAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAgQAAAAAAAGAAAAAAAQCBAAAAAAAAgQAAAAAAAGAAAAAAAgAiAAAAAAEAIgAAAAACACIAAAAAAQBgAAAAAAMAgQAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAAAACAAAAAAAwAgAAAAAAEAIAAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAAAWAAAAAAMAFgAAAAABABYAAAAAAABgAAAAAAMAgQAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAADAIEAAAAAAABgAAAAAAAAYAAAAAADAIEAAAAAAABgAAAAAAAAYAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAwCBAAAAAAAAYAAAAAAAAGAAAAAAAgBgAAAAAAEAYAAAAAABAGAAAAAAAwBgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAwBgAAAAAAAAYAAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAABgAAAAAAEAYAAAAAADAGAAAAAAAQAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAQBgAAAAAAAAgQAAAAAAAIEAAAAAAABHAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALgAAAAAAAiAAAAAAAgAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAtAAAAAAABLwAAAAAAAC0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAADLgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAABLQAAAAAAAS8AAAAAAAAuAAAAAAABLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAALgAAAAAAAS0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAS0AAAAAAAEvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACAAAAAAAgAgAAAAAAAAIAAAAAADACAAAAAAAAAgAAAAAAIAgQAAAAAAACAAAAAAAQBgAAAAAAAAYAAAAAADAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAABAGAAAAAAAACBAAAAAAAAIAAAAAAAACAAAAAAAQAgAAAAAAEAIAAAAAADACAAAAAAAwAgAAAAAAMAIgAAAAADACIAAAAAAAAiAAAAAAMAIgAAAAACACQAAAAAAQAiAAAAAAIAIgAAAAAAACIAAAAAAgBgAAAAAAEAIAAAAAACACAAAAAAAgAgAAAAAAEAIAAAAAAAACAAAAAAAQCBAAAAAAAAIAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAAAAGAAAAAAAwBgAAAAAAEAYAAAAAADAGAAAAAAAwAiAAAAAAEAYAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAgAfAAAAAAMAgQAAAAAAAAcAAAAAAAAHAAAAAAAABwAAAAAAAIEAAAAAAABgAAAAAAEAIgAAAAABAGAAAAAAAABHAAAAAAAAIAAAAAAAACAAAAAAAQAgAAAAAAAAIAAAAAADACAAAAAAAwAgAAAAAAMAgQAAAAAAAGAAAAAAAACBAAAAAAAAgQAAAAAAAGAAAAAAAAAiAAAAAAEAIgAAAAADACIAAAAAAwBgAAAAAAIAgQAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAACAA== version: 7 2,-2: ind: 2,-2 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALwAAAAAAACUAAAAAAgAlAAAAAAMAJQAAAAAAACkAAAAAAQCBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAApAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACkAAAAAAwCBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAlAAAAAAAAJQAAAAACACkAAAAAAwApAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMuAAAAAAACLgAAAAAAA4EAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC0AAAAAAAMYAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAMtAAAAAAADLgAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAIrAAAAAAMAGAAAAAAAACsAAAAAAAArAAAAAAEAKwAAAAADACUAAAAAAAAtAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAALQAAAAAAAxgAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAApAAAAAAIAKQAAAAAAAIEAAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAACAGAAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAQBgAAAAAAEAKQAAAAADACkAAAAAAgCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAAAZAAAAAAEAgQAAAAAAACIAAAAAAQAiAAAAAAIAIgAAAAAAACIAAAAAAwAiAAAAAAIAIgAAAAAAACkAAAAAAAApAAAAAAEAKQAAAAADACkAAAAAAQApAAAAAAMAgQAAAAAAABcAAAAAAACBAAAAAAAAYAAAAAAAACIAAAAAAwAiAAAAAAAAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAADAGAAAAAAAgApAAAAAAMAKQAAAAADACkAAAAAAgApAAAAAAMAKQAAAAADAIEAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAwAiAAAAAAIAYAAAAAAAAIEAAAAAAAAfAAAAAAMAHwAAAAACAGAAAAAAAQAfAAAAAAMAKQAAAAAAAIEAAAAAAACBAAAAAAAAKQAAAAADAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAEAIgAAAAAAAGAAAAAAAQBgAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAEAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAALwAAAAAAACUAAAAAAgAlAAAAAAMAJQAAAAABACkAAAAAAwCBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAApAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACkAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAYAAAAAAAAGAAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAACACkAAAAAAAApAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAuAAAAAAACLQAAAAAAAy0AAAAAAAMuAAAAAAACLgAAAAAAA4EAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC0AAAAAAAMYAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAMtAAAAAAADLgAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy4AAAAAAAIrAAAAAAAAGAAAAAAAACsAAAAAAgArAAAAAAMAKwAAAAACACUAAAAAAQAtAAAAAAAALQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLQAAAAAAAy0AAAAAAAMuAAAAAAAALQAAAAAAAxgAAAAAAAAtAAAAAAADLQAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAC8AAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAApAAAAAAEAKQAAAAABAIEAAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAACAGAAAAAAAgBgAAAAAAMAKQAAAAABACkAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAAAZAAAAAAAAgQAAAAAAACIAAAAAAgAiAAAAAAEAIgAAAAACACIAAAAAAgAiAAAAAAIAIgAAAAACACkAAAAAAgApAAAAAAMAKQAAAAAAACkAAAAAAgApAAAAAAEAgQAAAAAAABcAAAAAAACBAAAAAAAAYAAAAAABACIAAAAAAQAiAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAAAYAAAAAADAGAAAAAAAwApAAAAAAAAKQAAAAACACkAAAAAAwApAAAAAAEAKQAAAAACAIEAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAAAiAAAAAAAAYAAAAAAAAIEAAAAAAAAfAAAAAAEAHwAAAAABAGAAAAAAAwAfAAAAAAMAKQAAAAABAIEAAAAAAACBAAAAAAAAKQAAAAADAIEAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAMAIgAAAAACAGAAAAAAAQBgAAAAAAMAgQAAAAAAAIEAAAAAAABgAAAAAAEAgQAAAAAAAA== version: 7 2,-3: ind: 2,-3 - tiles: gQAAAAAAACAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAIAgQAAAAAAACAAAAAAAAAPAAAAAAMADwAAAAAAAA8AAAAAAAAPAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAAABAAAAAAAAAQAAAAAAACAAAAAAAwAPAAAAAAMADwAAAAABAA8AAAAAAwAPAAAAAAMADwAAAAAAAA8AAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAABAG8AAAAAAAAgAAAAAAMAAQAAAAADAAEAAAAAAAAgAAAAAAIADwAAAAACAA8AAAAAAQAPAAAAAAAADwAAAAADAA8AAAAAAQAPAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAAAACUAAAAAAwBvAAAAAAAAIAAAAAABAAEAAAAAAAABAAAAAAMAIAAAAAACAA8AAAAAAwAPAAAAAAEADwAAAAABAA8AAAAAAQAPAAAAAAEADwAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAwAlAAAAAAMAbwAAAAAAACAAAAAAAgABAAAAAAAAAQAAAAACACAAAAAAAgAPAAAAAAMADwAAAAACAA8AAAAAAAAPAAAAAAIADwAAAAABAA8AAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAADAG8AAAAAAAAgAAAAAAAAAQAAAAADAAEAAAAAAQAgAAAAAAEADwAAAAADAA8AAAAAAQAPAAAAAAMADwAAAAABAA8AAAAAAwAPAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAAAACUAAAAAAgBvAAAAAAAAIAAAAAAAAAEAAAAAAAABAAAAAAIAgQAAAAAAAA8AAAAAAwAPAAAAAAEADwAAAAACAA8AAAAAAAAPAAAAAAMADwAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAwAlAAAAAAIAbwAAAAAAAIEAAAAAAAABAAAAAAEAAQAAAAADACAAAAAAAQAPAAAAAAIADwAAAAACAA8AAAAAAgAPAAAAAAAADwAAAAACAA8AAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAACAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAACACUAAAAAAABvAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAAA0AAAAAAAANAAAAAALABgAAAAAAAAYAAAAAAAANAAAAAAAADQAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAEAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAADQAAAAAAAA0AAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAADQAAAAAAAAYAAAAAAAAGAAAAAAAADQAAAAAAAA0AAAAAAoANAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAADQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAGAAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAABgAAAAAAAAvAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAACAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAEAgQAAAAAAACAAAAAAAAAPAAAAAAAADwAAAAADAA8AAAAAAQAPAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAAABAAAAAAMAAQAAAAAAACAAAAAAAQAPAAAAAAAADwAAAAACAA8AAAAAAwAPAAAAAAAADwAAAAAAAA8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAAAJQAAAAADAG8AAAAAAAAgAAAAAAIAAQAAAAAAAAEAAAAAAQAgAAAAAAAADwAAAAADAA8AAAAAAwAPAAAAAAIADwAAAAACAA8AAAAAAQAPAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAAAACUAAAAAAwBvAAAAAAAAIAAAAAADAAEAAAAAAwABAAAAAAIAIAAAAAACAA8AAAAAAAAPAAAAAAMADwAAAAACAA8AAAAAAgAPAAAAAAIADwAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAwAlAAAAAAAAbwAAAAAAACAAAAAAAgABAAAAAAIAAQAAAAABACAAAAAAAwAPAAAAAAIADwAAAAACAA8AAAAAAwAPAAAAAAIADwAAAAABAA8AAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAAAJQAAAAAAAG8AAAAAAAAgAAAAAAMAAQAAAAAAAAEAAAAAAwAgAAAAAAMADwAAAAAAAA8AAAAAAQAPAAAAAAAADwAAAAAAAA8AAAAAAgAPAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAABACUAAAAAAQBvAAAAAAAAIAAAAAADAAEAAAAAAwABAAAAAAMAgQAAAAAAAA8AAAAAAwAPAAAAAAAADwAAAAACAA8AAAAAAgAPAAAAAAMADwAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAACUAAAAAAQAlAAAAAAIAbwAAAAAAAIEAAAAAAAABAAAAAAMAAQAAAAADACAAAAAAAwAPAAAAAAIADwAAAAABAA8AAAAAAAAPAAAAAAIADwAAAAABAA8AAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAABAG8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAJQAAAAADACUAAAAAAQBvAAAAAAAAgQAAAAAAAC8AAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAAA0AAAAAAAANAAAAAAAABgAAAAAAAAYAAAAAAAANAAAAAAKADQAAAAADACBAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAlAAAAAAMAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAADQAAAAACQA0AAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAADQAAAAAAAAYAAAAAAAAGAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAADQAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAALwAAAAAAAIEAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAAC8AAAAAAAAvAAAAAAAAGAAAAAAAAC8AAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAvAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALwAAAAAAABgAAAAAAAAvAAAAAAAAgQAAAAAAAA== version: 7 5,-2: ind: 5,-2 - tiles: gQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAMAgQAAAAAAACAAAAAAAAAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAgAgAAAAAAEAIAAAAAABACAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAgQAAAAAAACAAAAAAAAAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAABAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAHAAAAAACABwAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAIAgQAAAAAAACAAAAAAAgAgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAwAgAAAAAAAAIAAAAAACACAAAAAAAwCBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAgQAAAAAAACAAAAAAAQAgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAHAAAAAACABwAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 5,-1: ind: 5,-1 @@ -341,7 +341,7 @@ entities: version: 7 3,-1: ind: 3,-1 - tiles: YAAAAAADAGAAAAAAAABgAAAAAAMAYAAAAAAAACIAAAAAAQAiAAAAAAEAYAAAAAAAAGAAAAAAAgBgAAAAAAAARwAAAAAAACAAAAAAAQAgAAAAAAMAIAAAAAADACAAAAAAAQCBAAAAAAAAgQAAAAAAACIAAAAAAAAiAAAAAAMAIgAAAAADACIAAAAAAwAiAAAAAAMAIwAAAAAAACMAAAAAAAAjAAAAAAAAIwAAAAAAAIEAAAAAAAAlAAAAAAIAJQAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAADAGAAAAAAAgBgAAAAAAEAYAAAAAADACMAAAAAAAAjAAAAAAAAHwAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: YAAAAAABAGAAAAAAAgBgAAAAAAEAYAAAAAADACIAAAAAAAAiAAAAAAMAYAAAAAAAAGAAAAAAAABgAAAAAAIARwAAAAAAACAAAAAAAgAgAAAAAAAAIAAAAAAAACAAAAAAAACBAAAAAAAAgQAAAAAAACIAAAAAAwAiAAAAAAAAIgAAAAACACIAAAAAAQAiAAAAAAIAIwAAAAAAACMAAAAAAAAjAAAAAAAAIwAAAAAAAIEAAAAAAAAlAAAAAAEAJQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAwBgAAAAAAAAYAAAAAACACMAAAAAAAAjAAAAAAAAHwAAAAADAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 4,-1: ind: 4,-1 @@ -349,11 +349,11 @@ entities: version: 7 2,-1: ind: 2,-1 - tiles: KQAAAAACACkAAAAAAQApAAAAAAEAKQAAAAACACkAAAAAAgCBAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAMAIgAAAAAAAGAAAAAAAgCBAAAAAAAAYAAAAAABAGAAAAAAAQBgAAAAAAIAYAAAAAADACkAAAAAAQApAAAAAAIAKQAAAAACACkAAAAAAgApAAAAAAEAgQAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAADACIAAAAAAQAiAAAAAAMAIgAAAAACACIAAAAAAwAiAAAAAAAAIgAAAAACACIAAAAAAgCBAAAAAAAAgQAAAAAAACkAAAAAAAApAAAAAAMAKQAAAAABAIEAAAAAAAAXAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAwBgAAAAAAIAYAAAAAAAAGAAAAAAAgBgAAAAAAEAKQAAAAABAIEAAAAAAAApAAAAAAMAKQAAAAACACkAAAAAAQCBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACkAAAAAAACBAAAAAAAAKQAAAAAAACkAAAAAAAApAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: KQAAAAACACkAAAAAAwApAAAAAAAAKQAAAAABACkAAAAAAACBAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAMAIgAAAAACAGAAAAAAAQCBAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAEAYAAAAAAAACkAAAAAAAApAAAAAAMAKQAAAAACACkAAAAAAQApAAAAAAMAgQAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAADACIAAAAAAgAiAAAAAAAAIgAAAAABACIAAAAAAQAiAAAAAAEAIgAAAAADACIAAAAAAACBAAAAAAAAgQAAAAAAACkAAAAAAgApAAAAAAMAKQAAAAACAIEAAAAAAAAXAAAAAAAAgQAAAAAAAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAgBgAAAAAAMAYAAAAAAAAGAAAAAAAQBgAAAAAAIAKQAAAAAAAIEAAAAAAAApAAAAAAIAKQAAAAABACkAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACkAAAAAAQCBAAAAAAAAKQAAAAAAACkAAAAAAwApAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAXAAAAAAAAFwAAAAAAABcAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 2,-4: ind: 2,-4 - tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAALQAAAAAAAC0AAAAAAAMtAAAAAAADGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAAy0AAAAAAAMuAAAAAAAGgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAMuAAAAAAADGAAAAAAAAC0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAMtAAAAAAAALQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAABBgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAEtAAAAAAADLgAAAAAAAy4AAAAAAAEtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAMAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAyAAAAAAAAAgAAAAAAMAIAAAAAABACAAAAAAAAAgAAAAAAIAIAAAAAADAIEAAAAAAAAgAAAAAAMAIAAAAAADACAAAAAAAgAYAAAAAAAAIAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAIAIAAAAAABACAAAAAAAwAgAAAAAAIAIAAAAAACACAAAAAAAwAgAAAAAAAAIAAAAAAAACAAAAAAAAAYAAAAAAAAGAAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAADACAAAAAAAwAgAAAAAAMAIAAAAAAAACAAAAAAAAAgAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== + tiles: gQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAFwAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAXAAAAAAAAAAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABcAAAAAAAAXAAAAAAAALQAAAAAAAC0AAAAAAAMtAAAAAAADGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALQAAAAAAAy0AAAAAAAMuAAAAAAAGgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAC0AAAAAAAMuAAAAAAADGAAAAAAAAC0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAMtAAAAAAADLgAAAAAAAy0AAAAAAAMtAAAAAAAALQAAAAAAAy0AAAAAAAOBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAALgAAAAAABBgAAAAAAAAYAAAAAAAAGAAAAAAAAC4AAAAAAAEtAAAAAAADLgAAAAAAAy4AAAAAAAEtAAAAAAADgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAACAAAAAAAgAgAAAAAAEAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAABgAAAAAAACBAAAAAAAAgQAAAAAAAC4AAAAAAAEtAAAAAAADLQAAAAAAAyAAAAAAAwAgAAAAAAMAIAAAAAADACAAAAAAAwAgAAAAAAAAIAAAAAAAAIEAAAAAAAAgAAAAAAMAIAAAAAAAACAAAAAAAgAYAAAAAAAAIAAAAAACAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAgAAAAAAEAIAAAAAADACAAAAAAAgAgAAAAAAIAIAAAAAACACAAAAAAAgAgAAAAAAAAIAAAAAACACAAAAAAAgAYAAAAAAAAGAAAAAAAACAAAAAAAQCBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAIAAAAAACACAAAAAAAQAgAAAAAAEAIAAAAAADACAAAAAAAAAgAAAAAAIAgQAAAAAAAIEAAAAAAACBAAAAAAAAGAAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAA== version: 7 -2,-6: ind: -2,-6 @@ -385,7 +385,7 @@ entities: version: 7 3,-7: ind: 3,-7 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAABAGAAAAAAAQBgAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAMAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAABAGAAAAAAAgBgAAAAAAEAYAAAAAACAGAAAAAAAgBgAAAAAAMAYAAAAAAAAGAAAAAAAQCBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAgBgAAAAAAMAYAAAAAACAGAAAAAAAABgAAAAAAIAYAAAAAAAAGAAAAAAAwBgAAAAAAMAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAADAGAAAAAAAgBgAAAAAAAAYAAAAAABAGAAAAAAAABgAAAAAAAAYAAAAAABAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAIAYAAAAAABAGAAAAAAAABgAAAAAAMAYAAAAAADAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAGAAAAAAAQBgAAAAAAMAYAAAAAABAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAgQAAAAAAAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAABgAAAAAAMAYAAAAAAAAGAAAAAAAABgAAAAAAEAgQAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAwBgAAAAAAMAYAAAAAACAGAAAAAAAQBgAAAAAAIAYAAAAAADAGAAAAAAAgCBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAACAGAAAAAAAwBgAAAAAAAAYAAAAAADAGAAAAAAAQBgAAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAAAAABgAAAAAAIAYAAAAAACAGAAAAAAAwBgAAAAAAEAYAAAAAAAAGAAAAAAAQBgAAAAAAEAYAAAAAABAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAAAAAAAAYAAAAAADAGAAAAAAAwBgAAAAAAIAYAAAAAACAGAAAAAAAABgAAAAAAEAYAAAAAADAIEAAAAAAACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAAG8AAAAAAABvAAAAAAAAbwAAAAAAAGAAAAAAAgBgAAAAAAAAYAAAAAADAIEAAAAAAACBAAAAAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== version: 7 -5,-3: ind: -5,-3 @@ -1990,6 +1990,23 @@ entities: id: FullTileOverlayGreyscale decals: 4385: 31,-17 + - node: + color: '#5287D431' + id: FullTileOverlayGreyscale + decals: + 5421: 5,-74 + 5422: 4,-72 + 5423: 6,-74 + 5424: 6,-73 + 5425: 4,-71 + 5426: 5,-73 + 5427: 4,-73 + 5428: 4,-70 + 5429: 5,-70 + 5430: 6,-70 + 5431: 6,-71 + 5432: 6,-72 + 5433: 6,-69 - node: color: '#A4610696' id: FullTileOverlayGreyscale @@ -2892,6 +2909,12 @@ entities: decals: 285: 24,-98 287: 24,-100 + - node: + color: '#5287D431' + id: MiniTileOverlay + decals: + 5434: 5,-72 + 5435: 5,-71 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerSw @@ -3422,6 +3445,7 @@ entities: decals: 4666: 59,-39 4702: 65,-36 + 5395: 68,-29 - node: color: '#D381C9FF' id: WarnCornerSmallGreyscaleNW @@ -3471,6 +3495,7 @@ entities: 4098: 45,-72 4663: 59,-39 4698: 65,-36 + 5390: 68,-29 - node: color: '#FFFFFFFF' id: WarnCornerSmallNW @@ -3607,6 +3632,8 @@ entities: 5321: 10,-67 5337: -34,-67 5345: -28,-27 + 5391: 68,-28 + 5392: 68,-27 - node: color: '#33A9E7FF' id: WarnLineGreyscaleE @@ -3644,6 +3671,8 @@ entities: 4664: 59,-38 4699: 65,-35 4700: 65,-34 + 5393: 68,-27 + 5394: 68,-28 - node: color: '#EFB341FF' id: WarnLineGreyscaleE @@ -3684,6 +3713,11 @@ entities: 4239: 51,-32 4551: 59,-45 4552: 60,-45 + 5396: 69,-29 + 5397: 70,-29 + 5398: 71,-29 + 5401: 68,-34 + 5402: 69,-34 - node: color: '#FFFFFFFF' id: WarnLineGreyscaleN @@ -3970,6 +4004,11 @@ entities: 5205: 81,-45 5274: 1,-56 5275: 1,-57 + 5387: 69,-29 + 5388: 70,-29 + 5389: 71,-29 + 5399: 68,-34 + 5400: 69,-34 - node: angle: 4.71238898038469 rad color: '#FFFFFFFF' @@ -4755,21 +4794,21 @@ entities: -1,-20: 0: 20479 0,-19: - 0: 65533 + 0: 30717 -1,-19: 0: 65535 0,-18: - 0: 65400 + 0: 30576 -1,-18: 0: 53232 1,-20: 0: 30711 1,-19: - 0: 9831 + 0: 30247 + 1,-18: + 0: 18295 1,-17: 0: 4095 - 1,-18: - 0: 18022 2,-20: 0: 4095 2,-19: @@ -5373,7 +5412,7 @@ entities: 0: 1606 1: 59528 9,-24: - 1: 768 + 1: 782 9,-23: 0: 8755 1: 34944 @@ -5385,16 +5424,18 @@ entities: 1: 2176 9,-20: 0: 62067 + 10,-24: + 1: 15 10,-22: 1: 12561 10,-21: 1: 24234 + 11,-24: + 1: 143 11,-21: 1: 57343 11,-22: 1: 49152 - 11,-24: - 1: 136 12,-24: 1: 4080 12,-22: @@ -5445,21 +5486,21 @@ entities: 0: 4927 1: 2048 8,-26: - 1: 32 + 1: 160 0: 57344 + 9,-26: + 1: 57584 9,-25: 0: 255 1: 3584 - 9,-26: - 1: 57344 10,-26: + 1: 57584 0: 4096 - 1: 57344 10,-25: 0: 511 1: 3584 11,-26: - 1: 4096 + 1: 4336 0: 8192 11,-25: 0: 767 @@ -5530,7 +5571,7 @@ entities: 17,-18: 0: 26351 17,-17: - 0: 56660 + 0: 64852 17,-16: 0: 43229 17,-21: @@ -5744,7 +5785,7 @@ entities: 18,-9: 0: 20375 18,-8: - 0: 53015 + 0: 52775 19,-11: 0: 5917 19,-10: @@ -5830,11 +5871,11 @@ entities: 15,-8: 0: 57231 16,-7: - 0: 65327 + 0: 63279 15,-7: 0: 64671 16,-6: - 0: 60967 + 0: 60975 15,-6: 0: 64399 16,-5: @@ -5842,9 +5883,9 @@ entities: 15,-5: 0: 65419 17,-8: - 0: 30576 + 0: 65392 17,-7: - 0: 29447 + 0: 28927 17,-6: 0: 56783 17,-5: @@ -5852,8 +5893,6 @@ entities: 1: 32768 16,-4: 1: 48808 - 18,-7: - 0: 36631 18,-6: 0: 61167 17,-4: @@ -5861,6 +5900,8 @@ entities: 18,-5: 1: 61440 0: 14 + 18,-7: + 0: 36390 18,-4: 1: 61443 19,-7: @@ -6220,6 +6261,15 @@ entities: components: - type: Transform parent: 17933 + - uid: 18199 + mapInit: true + paused: true + components: + - type: Transform + parent: 18198 + - type: Action + originalIconColor: '#FFFFFFFF' + container: 18198 - uid: 18388 components: - type: Transform @@ -6233,6 +6283,15 @@ entities: - type: Action originalIconColor: '#FFFFFFFF' container: 18513 + - uid: 18567 + mapInit: true + paused: true + components: + - type: Transform + parent: 19423 + - type: Action + originalIconColor: '#FFFFFFFF' + container: 19423 - uid: 18754 components: - type: Transform @@ -6241,6 +6300,15 @@ entities: components: - type: Transform parent: 18755 + - uid: 19632 + mapInit: true + paused: true + components: + - type: Transform + parent: 19590 + - type: Action + originalIconColor: '#FFFFFFFF' + container: 19590 - proto: ActionToggleJetpack entities: - uid: 7161 @@ -6266,6 +6334,15 @@ entities: components: - type: Transform parent: 17933 + - uid: 18203 + mapInit: true + paused: true + components: + - type: Transform + parent: 19423 + - type: Action + originalIconColor: '#FFFFFFFF' + container: 19423 - proto: ActionToggleLight entities: - uid: 167 @@ -6777,7 +6854,7 @@ entities: parent: 2 - type: DeviceList devices: - - 14730 + - 3192 - 3448 - 3441 - 4166 @@ -7292,7 +7369,7 @@ entities: - type: DeviceList devices: - 19875 - - 14730 + - 3192 - 3448 - 19873 - 19874 @@ -8175,6 +8252,17 @@ entities: - 11935 - type: Fixtures fixtures: {} + - uid: 19475 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-55.5 + parent: 2 + - type: DeviceList + devices: + - 19472 + - type: Fixtures + fixtures: {} - uid: 19853 components: - type: Transform @@ -8358,6 +8446,18 @@ entities: - 9701 - type: Fixtures fixtures: {} + - uid: 20153 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,-69.5 + parent: 2 + - type: DeviceList + devices: + - 20152 + - 20151 + - type: Fixtures + fixtures: {} - proto: AirCanister entities: - uid: 6560 @@ -8416,23 +8516,11 @@ entities: parent: 2 - proto: AirlockArmoryGlassLocked entities: - - uid: 3617 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 66.5,-33.5 - parent: 2 - uid: 5427 components: - type: Transform pos: 60.5,-36.5 parent: 2 - - uid: 7279 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 66.5,-34.5 - parent: 2 - uid: 7951 components: - type: Transform @@ -10120,6 +10208,11 @@ entities: - type: Transform pos: 28.5,-31.5 parent: 2 + - uid: 7770 + components: + - type: Transform + pos: 5.5,-74.5 + parent: 2 - proto: AirlockMaintSecLocked entities: - uid: 601 @@ -10166,7 +10259,7 @@ entities: pos: 11.5,-30.5 parent: 2 - type: Door - secondsUntilStateChange: -260311.42 + secondsUntilStateChange: -268731.2 state: Opening - type: DeviceLinkSource lastSignals: @@ -10213,6 +10306,11 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,-22.5 parent: 2 + - uid: 14198 + components: + - type: Transform + pos: 6.5,-68.5 + parent: 2 - proto: AirlockMedicalMorgueLocked entities: - uid: 3714 @@ -10352,6 +10450,16 @@ entities: - type: Transform pos: 64.5,-30.5 parent: 2 + - uid: 3609 + components: + - type: Transform + pos: 66.5,-34.5 + parent: 2 + - uid: 3617 + components: + - type: Transform + pos: 66.5,-33.5 + parent: 2 - uid: 7190 components: - type: Transform @@ -10522,7 +10630,7 @@ entities: pos: 34.5,-36.5 parent: 2 - type: Door - secondsUntilStateChange: -35809.105 + secondsUntilStateChange: -44228.855 state: Opening - type: DeviceLinkSource lastSignals: @@ -10622,11 +10730,6 @@ entities: - type: Transform pos: -1.5,-76.5 parent: 2 - - uid: 737 - components: - - type: Transform - pos: 6.5,-68.5 - parent: 2 - uid: 739 components: - type: Transform @@ -10760,6 +10863,11 @@ entities: - type: Transform pos: 67.5,-70.5 parent: 2 + - uid: 7166 + components: + - type: Transform + pos: 67.5,-23.5 + parent: 2 - uid: 7261 components: - type: Transform @@ -10842,6 +10950,12 @@ entities: rot: 3.141592653589793 rad pos: -11.5,-56.5 parent: 2 + - uid: 12851 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 69.5,-64.5 + parent: 2 - uid: 12960 components: - type: Transform @@ -10852,11 +10966,6 @@ entities: - type: Transform pos: 61.5,-24.5 parent: 2 - - uid: 13811 - components: - - type: Transform - pos: 67.5,-25.5 - parent: 2 - uid: 13855 components: - type: Transform @@ -10882,11 +10991,6 @@ entities: - type: Transform pos: 52.5,-76.5 parent: 2 - - uid: 15470 - components: - - type: Transform - pos: 5.5,-72.5 - parent: 2 - uid: 16387 components: - type: Transform @@ -11787,6 +11891,16 @@ entities: parent: 2 - type: Fixtures fixtures: {} + - uid: 7227 + components: + - type: MetaData + name: Psychology APC + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,-72.5 + parent: 2 + - type: Fixtures + fixtures: {} - uid: 7248 components: - type: MetaData @@ -13302,10 +13416,10 @@ entities: parent: 2 - proto: BikeHorn entities: - - uid: 18036 + - uid: 14730 components: - type: Transform - pos: 72.49216,-25.507568 + pos: 73.45033,-25.510593 parent: 2 - proto: Biogenerator entities: @@ -14231,6 +14345,12 @@ entities: rot: -1.5707963267948966 rad pos: 36.5,-27.5 parent: 2 + - uid: 16048 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 72.5,-28.5 + parent: 2 - uid: 16507 components: - type: Transform @@ -14349,6 +14469,12 @@ entities: rot: 3.141592653589793 rad pos: 10.5,-76.5 parent: 2 + - uid: 20144 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,-73.5 + parent: 2 - proto: ButtonFrameJanitor entities: - uid: 5811 @@ -14593,6 +14719,16 @@ entities: - type: Transform pos: -13.5,-19.5 parent: 2 + - uid: 2401 + components: + - type: Transform + pos: 4.5,-72.5 + parent: 2 + - uid: 2414 + components: + - type: Transform + pos: 3.5,-72.5 + parent: 2 - uid: 2483 components: - type: Transform @@ -14698,11 +14834,6 @@ entities: - type: Transform pos: -9.5,-22.5 parent: 2 - - uid: 3127 - components: - - type: Transform - pos: 5.5,-73.5 - parent: 2 - uid: 3129 components: - type: Transform @@ -14763,11 +14894,6 @@ entities: - type: Transform pos: 63.5,-64.5 parent: 2 - - uid: 3192 - components: - - type: Transform - pos: 72.5,-25.5 - parent: 2 - uid: 3197 components: - type: Transform @@ -14778,11 +14904,6 @@ entities: - type: Transform pos: 74.5,-27.5 parent: 2 - - uid: 3200 - components: - - type: Transform - pos: 72.5,-30.5 - parent: 2 - uid: 3204 components: - type: Transform @@ -15193,6 +15314,11 @@ entities: - type: Transform pos: 74.5,-31.5 parent: 2 + - uid: 3782 + components: + - type: Transform + pos: 68.5,-27.5 + parent: 2 - uid: 3786 components: - type: Transform @@ -15298,11 +15424,6 @@ entities: - type: Transform pos: 9.5,-48.5 parent: 2 - - uid: 4070 - components: - - type: Transform - pos: 72.5,-27.5 - parent: 2 - uid: 4080 components: - type: Transform @@ -15938,6 +16059,11 @@ entities: - type: Transform pos: 29.5,-29.5 parent: 2 + - uid: 7157 + components: + - type: Transform + pos: 5.5,-72.5 + parent: 2 - uid: 7175 components: - type: Transform @@ -16628,6 +16754,11 @@ entities: - type: Transform pos: -2.5,-37.5 parent: 2 + - uid: 10194 + components: + - type: Transform + pos: 73.5,-30.5 + parent: 2 - uid: 10199 components: - type: Transform @@ -19798,16 +19929,6 @@ entities: - type: Transform pos: 73.5,-29.5 parent: 2 - - uid: 11832 - components: - - type: Transform - pos: 72.5,-29.5 - parent: 2 - - uid: 11836 - components: - - type: Transform - pos: 72.5,-31.5 - parent: 2 - uid: 11837 components: - type: Transform @@ -21818,16 +21939,6 @@ entities: - type: Transform pos: 5.5,-75.5 parent: 2 - - uid: 12412 - components: - - type: Transform - pos: 6.5,-71.5 - parent: 2 - - uid: 12413 - components: - - type: Transform - pos: 6.5,-70.5 - parent: 2 - uid: 12435 components: - type: Transform @@ -25918,6 +26029,11 @@ entities: - type: Transform pos: 85.5,-46.5 parent: 2 + - uid: 15204 + components: + - type: Transform + pos: 73.5,-26.5 + parent: 2 - uid: 15263 components: - type: Transform @@ -26583,16 +26699,6 @@ entities: - type: Transform pos: -14.5,-76.5 parent: 2 - - uid: 17050 - components: - - type: Transform - pos: 2.5,-72.5 - parent: 2 - - uid: 17051 - components: - - type: Transform - pos: 2.5,-73.5 - parent: 2 - uid: 17198 components: - type: Transform @@ -26913,11 +27019,6 @@ entities: - type: Transform pos: 74.5,-25.5 parent: 2 - - uid: 17970 - components: - - type: Transform - pos: 72.5,-26.5 - parent: 2 - uid: 17974 components: - type: Transform @@ -27718,16 +27819,6 @@ entities: - type: Transform pos: 21.5,-23.5 parent: 2 - - uid: 19537 - components: - - type: Transform - pos: 5.5,-72.5 - parent: 2 - - uid: 19584 - components: - - type: Transform - pos: 5.5,-71.5 - parent: 2 - uid: 19585 components: - type: Transform @@ -27738,6 +27829,11 @@ entities: - type: Transform pos: 5.5,-74.5 parent: 2 + - uid: 19596 + components: + - type: Transform + pos: 70.5,-27.5 + parent: 2 - uid: 19597 components: - type: Transform @@ -27938,6 +28034,26 @@ entities: - type: Transform pos: 60.5,-67.5 parent: 2 + - uid: 20095 + components: + - type: Transform + pos: 5.5,-71.5 + parent: 2 + - uid: 20097 + components: + - type: Transform + pos: 5.5,-70.5 + parent: 2 + - uid: 20098 + components: + - type: Transform + pos: 5.5,-69.5 + parent: 2 + - uid: 20099 + components: + - type: Transform + pos: 6.5,-72.5 + parent: 2 - proto: CableApcStack entities: - uid: 9765 @@ -28482,6 +28598,11 @@ entities: - type: Transform pos: 39.5,-17.5 parent: 2 + - uid: 4108 + components: + - type: Transform + pos: 67.5,-23.5 + parent: 2 - uid: 4110 components: - type: Transform @@ -29347,16 +29468,6 @@ entities: - type: Transform pos: 28.5,-69.5 parent: 2 - - uid: 7991 - components: - - type: Transform - pos: 67.5,-24.5 - parent: 2 - - uid: 8072 - components: - - type: Transform - pos: 66.5,-24.5 - parent: 2 - uid: 8118 components: - type: Transform @@ -32414,11 +32525,6 @@ entities: - type: Transform pos: 54.5,-76.5 parent: 2 - - uid: 13871 - components: - - type: Transform - pos: 68.5,-24.5 - parent: 2 - uid: 13919 components: - type: Transform @@ -33781,6 +33887,11 @@ entities: - type: Transform pos: -21.5,-23.5 parent: 2 + - uid: 737 + components: + - type: Transform + pos: 3.5,-72.5 + parent: 2 - uid: 751 components: - type: Transform @@ -33906,6 +34017,16 @@ entities: - type: Transform pos: -20.5,-15.5 parent: 2 + - uid: 2398 + components: + - type: Transform + pos: -5.5,-74.5 + parent: 2 + - uid: 2400 + components: + - type: Transform + pos: 1.5,-74.5 + parent: 2 - uid: 2404 components: - type: Transform @@ -34206,6 +34327,11 @@ entities: - type: Transform pos: 25.5,-23.5 parent: 2 + - uid: 4613 + components: + - type: Transform + pos: 2.5,-73.5 + parent: 2 - uid: 4691 components: - type: Transform @@ -34321,6 +34447,26 @@ entities: - type: Transform pos: 33.5,-70.5 parent: 2 + - uid: 5386 + components: + - type: Transform + pos: 65.5,-24.5 + parent: 2 + - uid: 5388 + components: + - type: Transform + pos: 67.5,-24.5 + parent: 2 + - uid: 5403 + components: + - type: Transform + pos: 68.5,-24.5 + parent: 2 + - uid: 5405 + components: + - type: Transform + pos: 66.5,-24.5 + parent: 2 - uid: 5410 components: - type: Transform @@ -34801,6 +34947,11 @@ entities: - type: Transform pos: 48.5,-45.5 parent: 2 + - uid: 7163 + components: + - type: Transform + pos: 2.5,-74.5 + parent: 2 - uid: 7174 components: - type: Transform @@ -36911,11 +37062,6 @@ entities: - type: Transform pos: 72.5,-20.5 parent: 2 - - uid: 11823 - components: - - type: Transform - pos: 66.5,-25.5 - parent: 2 - uid: 11910 components: - type: Transform @@ -37781,6 +37927,11 @@ entities: - type: Transform pos: 57.5,-48.5 parent: 2 + - uid: 13860 + components: + - type: Transform + pos: 2.5,-72.5 + parent: 2 - uid: 13865 components: - type: Transform @@ -38016,26 +38167,21 @@ entities: - type: Transform pos: 51.5,-52.5 parent: 2 - - uid: 15466 + - uid: 15470 components: - type: Transform - pos: 69.5,-25.5 + pos: -1.5,-74.5 parent: 2 - - uid: 15467 + - uid: 15485 components: - type: Transform - pos: 68.5,-25.5 + pos: -2.5,-74.5 parent: 2 - uid: 15923 components: - type: Transform pos: -8.5,-22.5 parent: 2 - - uid: 16101 - components: - - type: Transform - pos: 67.5,-25.5 - parent: 2 - uid: 16104 components: - type: Transform @@ -38121,6 +38267,21 @@ entities: - type: Transform pos: -15.5,-77.5 parent: 2 + - uid: 17050 + components: + - type: Transform + pos: -0.5,-74.5 + parent: 2 + - uid: 17051 + components: + - type: Transform + pos: 0.5,-74.5 + parent: 2 + - uid: 17104 + components: + - type: Transform + pos: -4.5,-74.5 + parent: 2 - uid: 17280 components: - type: Transform @@ -38566,6 +38727,11 @@ entities: - type: Transform pos: 25.5,-15.5 parent: 2 + - uid: 20090 + components: + - type: Transform + pos: -3.5,-74.5 + parent: 2 - proto: CableTerminal entities: - uid: 3002 @@ -39399,6 +39565,16 @@ entities: - type: Transform pos: -51.5,-60.5 parent: 2 + - uid: 20110 + components: + - type: Transform + pos: 5.5,-69.5 + parent: 2 + - uid: 20118 + components: + - type: Transform + pos: 4.5,-69.5 + parent: 2 - proto: CarpetChapel entities: - uid: 5030 @@ -39471,6 +39647,28 @@ entities: - type: Transform pos: 2.5,-3.5 parent: 2 + - uid: 11893 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -6.5,-2.5 + parent: 2 + - uid: 19483 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-2.5 + parent: 2 + - uid: 20135 + components: + - type: Transform + pos: 6.5,-72.5 + parent: 2 + - uid: 20136 + components: + - type: Transform + pos: 6.5,-71.5 + parent: 2 - proto: CarpetOrange entities: - uid: 6690 @@ -40560,11 +40758,6 @@ entities: - type: Transform pos: 73.5,-29.5 parent: 2 - - uid: 3782 - components: - - type: Transform - pos: 72.5,-29.5 - parent: 2 - uid: 3784 components: - type: Transform @@ -41060,6 +41253,12 @@ entities: rot: 3.141592653589793 rad pos: 39.5,-50.5 parent: 2 + - uid: 6009 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 70.5,-19.5 + parent: 2 - uid: 6149 components: - type: Transform @@ -41641,11 +41840,6 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-60.5 parent: 2 - - uid: 16040 - components: - - type: Transform - pos: 68.5,-23.5 - parent: 2 - uid: 16164 components: - type: Transform @@ -42309,6 +42503,11 @@ entities: rot: 1.5707963267948966 rad pos: -35.5,-15.5 parent: 2 + - uid: 13833 + components: + - type: Transform + pos: 66.5,-27.5 + parent: 2 - uid: 13852 components: - type: Transform @@ -42390,12 +42589,29 @@ entities: - type: Transform pos: 21.5,-81.5 parent: 2 + - uid: 19354 + components: + - type: Transform + pos: 67.5,-27.5 + parent: 2 - uid: 19393 components: - type: Transform rot: -1.5707963267948966 rad pos: -26.5,-16.5 parent: 2 + - uid: 19599 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 59.5,-34.5 + parent: 2 + - uid: 19600 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 60.5,-34.5 + parent: 2 - proto: ChairFolding entities: - uid: 86 @@ -42750,6 +42966,12 @@ entities: rot: -1.5707963267948966 rad pos: 28.41108,-29.119923 parent: 2 + - uid: 20109 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,-71.5 + parent: 2 - proto: ChairPilotSeat entities: - uid: 5926 @@ -42842,12 +43064,6 @@ entities: rot: 1.5707963267948966 rad pos: 41.5,-77.5 parent: 2 - - uid: 7008 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 5.5,-70.5 - parent: 2 - uid: 8152 components: - type: Transform @@ -43393,11 +43609,6 @@ entities: - type: Transform pos: 35.5,-97.5 parent: 2 - - uid: 8177 - components: - - type: Transform - pos: 70.5,-19.5 - parent: 2 - uid: 8207 components: - type: Transform @@ -43693,10 +43904,10 @@ entities: parent: 2 - proto: ClosetL3Filled entities: - - uid: 4613 + - uid: 8125 components: - type: Transform - pos: 3.5,-71.5 + pos: -0.5,-72.5 parent: 2 - uid: 18902 components: @@ -43891,6 +44102,11 @@ entities: - type: Transform pos: 40.5,-77.5 parent: 2 + - uid: 19598 + components: + - type: Transform + pos: 72.5,-31.5 + parent: 2 - proto: ClosetRadiationSuitFilled entities: - uid: 5058 @@ -44926,6 +45142,24 @@ entities: rot: -1.5707963267948966 rad pos: 38.522278,-19.49277 parent: 2 +- proto: ClothingOuterHardsuitSecurity + entities: + - uid: 18200 + components: + - type: Transform + parent: 17376 + - type: Physics + canCollide: False + - type: InsideEntityStorage + storage: 17376 + - uid: 19729 + components: + - type: Transform + parent: 19584 + - type: Physics + canCollide: False + - type: InsideEntityStorage + storage: 19584 - proto: ClothingOuterHospitalGown entities: - uid: 5937 @@ -45148,6 +45382,13 @@ entities: rot: -1.5707963267948966 rad pos: 67.63037,-53.474205 parent: 2 +- proto: ClothingUniformJumpskirtYellowOldDress + entities: + - uid: 15236 + components: + - type: Transform + pos: -47.497868,-43.43454 + parent: 2 - proto: ClothingUniformJumpsuitColorGrey entities: - uid: 7216 @@ -45283,10 +45524,10 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,-77.5 parent: 2 - - uid: 17965 + - uid: 18036 components: - type: Transform - pos: 72.5,-25.5 + pos: 73.5,-25.5 parent: 2 - uid: 18909 components: @@ -45312,11 +45553,11 @@ entities: - type: Transform pos: -44.5,-22.5 parent: 2 - - uid: 12989 + - uid: 11823 components: - type: Transform rot: 1.5707963267948966 rad - pos: 72.5,-29.5 + pos: 73.5,-29.5 parent: 2 - uid: 14159 components: @@ -46846,10 +47087,10 @@ entities: parent: 2 - proto: CrateHydroponicsSeeds entities: - - uid: 19590 + - uid: 20093 components: - type: Transform - pos: 6.5,-73.5 + pos: 6.5,-77.5 parent: 2 - proto: CrateLockBoxEngineering entities: @@ -46929,10 +47170,10 @@ entities: parent: 2 - proto: CrateMindShieldImplants entities: - - uid: 6628 + - uid: 17322 components: - type: Transform - pos: 68.5,-36.5 + pos: 67.5,-35.5 parent: 2 - proto: CrateNPCHamlet entities: @@ -47223,6 +47464,21 @@ entities: - type: Transform pos: -37.5,-52.5 parent: 2 + - uid: 20103 + components: + - type: Transform + pos: 7.5,-70.5 + parent: 2 + - uid: 20104 + components: + - type: Transform + pos: 7.5,-71.5 + parent: 2 + - uid: 20105 + components: + - type: Transform + pos: 7.5,-72.5 + parent: 2 - proto: CurtainsOrangeOpen entities: - uid: 6832 @@ -47602,6 +47858,13 @@ entities: - type: Transform pos: -23.5,-63.5 parent: 2 +- proto: DefaultStationBeaconPsychology + entities: + - uid: 20131 + components: + - type: Transform + pos: 5.5,-71.5 + parent: 2 - proto: DefaultStationBeaconQMRoom entities: - uid: 16218 @@ -54377,6 +54640,25 @@ entities: - type: Transform pos: 8.980915,-47.69106 parent: 2 +- proto: DrinkTeacupEmpty + entities: + - uid: 20129 + components: + - type: Transform + pos: 6.2513485,-72.200775 + parent: 2 + - uid: 20130 + components: + - type: Transform + pos: 6.3138485,-72.32586 + parent: 2 +- proto: DrinkTeapot + entities: + - uid: 20128 + components: + - type: Transform + pos: 6.5117655,-71.929756 + parent: 2 - proto: DrinkWaterBottleFull entities: - uid: 901 @@ -54414,6 +54696,16 @@ entities: - type: Transform pos: 1.6360426,-62.150143 parent: 2 + - uid: 20107 + components: + - type: Transform + pos: 6.563849,-72.294586 + parent: 2 + - uid: 20127 + components: + - type: Transform + pos: 6.6992655,-72.388405 + parent: 2 - proto: DrinkWaterCup entities: - uid: 18325 @@ -54710,6 +55002,11 @@ entities: rot: 3.141592653589793 rad pos: -12.5,-21.5 parent: 2 + - uid: 16250 + components: + - type: Transform + pos: 67.5,-27.5 + parent: 2 - uid: 16419 components: - type: Transform @@ -54876,12 +55173,6 @@ entities: rot: -1.5707963267948966 rad pos: 65.5,-31.5 parent: 2 - - uid: 19354 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 70.5,-29.5 - parent: 2 - uid: 19952 components: - type: Transform @@ -55135,6 +55426,13 @@ entities: parent: 2 - type: FaxMachine name: Cargo + - uid: 20134 + components: + - type: Transform + pos: 4.5,-72.5 + parent: 2 + - type: FaxMachine + name: Psychologist's - proto: FaxMachineCaptain entities: - uid: 3831 @@ -55243,6 +55541,11 @@ entities: - type: Transform pos: -16.5,-26.5 parent: 2 + - uid: 20108 + components: + - type: Transform + pos: 6.5,-73.5 + parent: 2 - proto: filingCabinetRandom entities: - uid: 2341 @@ -55360,7 +55663,6 @@ entities: parent: 2 - type: DeviceList devices: - - 14730 - 3448 - 7109 - 14728 @@ -57259,6 +57561,15 @@ entities: - 1876 - 9178 - 16800 + - uid: 3192 + components: + - type: Transform + pos: 67.5,-23.5 + parent: 2 + - type: DeviceNetwork + deviceLists: + - 6358 + - 18059 - uid: 3279 components: - type: Transform @@ -58636,16 +58947,6 @@ entities: - 18059 - 10791 - 579 - - uid: 14730 - components: - - type: Transform - pos: 67.5,-25.5 - parent: 2 - - type: DeviceNetwork - deviceLists: - - 18059 - - 10791 - - 6358 - uid: 14753 components: - type: Transform @@ -60370,11 +60671,6 @@ entities: - type: Transform pos: -6.5,-71.5 parent: 2 - - uid: 17104 - components: - - type: Transform - pos: 5.5,-71.5 - parent: 2 - uid: 17108 components: - type: Transform @@ -61336,22 +61632,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 4108 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 70.5,-23.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 4120 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 70.5,-23.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 4202 components: - type: Transform @@ -61426,22 +61706,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 7162 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 68.5,-24.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 7166 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 68.5,-23.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 7250 components: - type: Transform @@ -61620,6 +61884,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 8072 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 70.5,-24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 8657 components: - type: Transform @@ -61900,14 +62172,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 9379 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 70.5,-24.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 9424 components: - type: Transform @@ -62154,14 +62418,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 9967 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 69.5,-25.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 9980 components: - type: Transform @@ -62513,14 +62769,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13833 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 69.5,-24.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 14293 components: - type: Transform @@ -63268,6 +63516,22 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 19391 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-53.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 19443 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,-53.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 19480 components: - type: Transform @@ -63503,6 +63767,13 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 8231 + components: + - type: Transform + pos: 65.5,-23.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 9486 components: - type: Transform @@ -64540,6 +64811,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 8177 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 68.5,-24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 8198 components: - type: Transform @@ -64591,6 +64870,14 @@ entities: - type: Transform pos: 47.5,-77.5 parent: 2 + - uid: 8634 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 67.5,-23.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 8636 components: - type: Transform @@ -66267,6 +66554,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 9224 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 68.5,-23.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 9226 components: - type: Transform @@ -66278,8 +66573,8 @@ entities: - uid: 9227 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 68.5,-25.5 + rot: -1.5707963267948966 rad + pos: 69.5,-23.5 parent: 2 - type: AtmosPipeColor color: '#FF1212FF' @@ -66322,8 +66617,8 @@ entities: - uid: 9286 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 67.5,-25.5 + rot: -1.5707963267948966 rad + pos: 70.5,-23.5 parent: 2 - type: AtmosPipeColor color: '#FF1212FF' @@ -66343,6 +66638,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 9349 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 66.5,-23.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 9368 components: - type: Transform @@ -66377,11 +66680,18 @@ entities: - uid: 9378 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 66.5,-25.5 + pos: 70.5,-23.5 parent: 2 - type: AtmosPipeColor - color: '#FF1212FF' + color: '#0335FCFF' + - uid: 9379 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 69.5,-24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 9380 components: - type: Transform @@ -66996,13 +67306,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 9525 - components: - - type: Transform - pos: 10.5,-70.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 9526 components: - type: Transform @@ -68564,14 +68867,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 9843 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-52.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 9849 components: - type: Transform @@ -70363,14 +70658,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 10194 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 69.5,-23.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 10195 components: - type: Transform @@ -71826,13 +72113,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13105 - components: - - type: Transform - pos: 8.5,-72.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13138 components: - type: Transform @@ -75275,6 +75555,13 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,-56.5 parent: 2 + - uid: 19448 + components: + - type: Transform + pos: 1.5,-54.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 19607 components: - type: Transform @@ -76170,6 +76457,54 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 20145 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,-72.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 20146 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,-72.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 20147 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-70.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 20148 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-70.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 20149 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 7.5,-70.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 20150 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,-70.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - proto: GasPipeStraightAlt1 entities: - uid: 8817 @@ -76687,14 +77022,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 9224 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 65.5,-25.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 9308 components: - type: Transform @@ -76813,6 +77140,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 9525 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-70.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 9532 components: - type: Transform @@ -77032,6 +77367,13 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 9843 + components: + - type: Transform + pos: 2.5,-52.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 9844 components: - type: Transform @@ -77471,6 +77813,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#03FCD3FF' + - uid: 13105 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-72.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 13234 components: - type: Transform @@ -77692,14 +78042,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 16250 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 65.5,-23.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 16262 components: - type: Transform @@ -79674,6 +80016,17 @@ entities: - 9195 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 20152 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,-70.5 + parent: 2 + - type: DeviceNetwork + deviceLists: + - 20153 + - type: AtmosPipeColor + color: '#0335FCFF' - proto: GasVentScrubber entities: - uid: 1104 @@ -80985,6 +81338,17 @@ entities: - 6406 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 19472 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-55.5 + parent: 2 + - type: DeviceNetwork + deviceLists: + - 19475 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 19873 components: - type: Transform @@ -81006,6 +81370,17 @@ entities: - 9195 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 20151 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.5,-72.5 + parent: 2 + - type: DeviceNetwork + deviceLists: + - 20153 + - type: AtmosPipeColor + color: '#FF1212FF' - proto: GasVolumePump entities: - uid: 3026 @@ -82056,6 +82431,11 @@ entities: - type: Transform pos: -28.5,-8.5 parent: 2 + - uid: 1449 + components: + - type: Transform + pos: 7.5,-72.5 + parent: 2 - uid: 1453 components: - type: Transform @@ -85670,6 +86050,12 @@ entities: - type: Transform pos: -17.5,-73.5 parent: 2 + - uid: 19378 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 42.5,-102.5 + parent: 2 - uid: 19384 components: - type: Transform @@ -85771,6 +86157,48 @@ entities: - type: Transform pos: -60.5,-32.5 parent: 2 + - uid: 19495 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 40.5,-102.5 + parent: 2 + - uid: 19497 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 41.5,-102.5 + parent: 2 + - uid: 19511 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 43.5,-95.5 + parent: 2 + - uid: 19512 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 42.5,-95.5 + parent: 2 + - uid: 19543 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 38.5,-102.5 + parent: 2 + - uid: 19549 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 45.5,-102.5 + parent: 2 + - uid: 19552 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 39.5,-95.5 + parent: 2 - uid: 19721 components: - type: Transform @@ -85781,6 +86209,16 @@ entities: - type: Transform pos: 57.5,-98.5 parent: 2 + - uid: 20100 + components: + - type: Transform + pos: 7.5,-71.5 + parent: 2 + - uid: 20101 + components: + - type: Transform + pos: 7.5,-70.5 + parent: 2 - proto: GrilleBroken entities: - uid: 2496 @@ -85931,6 +86369,48 @@ entities: - type: Transform pos: -62.5,-54.5 parent: 2 + - uid: 19488 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 37.5,-102.5 + parent: 2 + - uid: 19491 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 41.5,-95.5 + parent: 2 + - uid: 19538 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 43.5,-102.5 + parent: 2 + - uid: 19542 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 46.5,-102.5 + parent: 2 + - uid: 19550 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 44.5,-95.5 + parent: 2 + - uid: 19551 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 39.5,-102.5 + parent: 2 + - uid: 19576 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 38.5,-95.5 + parent: 2 - proto: GrilleDiagonal entities: - uid: 1797 @@ -87050,6 +87530,9 @@ entities: - type: Transform pos: 63.5,-34.5 parent: 2 + - type: AccessReader + accessListsOriginal: + - - Command - proto: HolopadSecurityInterrogation entities: - uid: 18002 @@ -87071,6 +87554,19 @@ entities: - type: Transform pos: 70.5,-41.5 parent: 2 + - type: AccessReader + accessListsOriginal: + - - Command + - uid: 19615 + components: + - type: Transform + pos: 67.5,-28.5 + parent: 2 + - type: Label + currentLabel: Security - Genpop Lockers + - type: AccessReader + accessListsOriginal: + - - Command - proto: HolopadSecurityPerma entities: - uid: 19146 @@ -87524,6 +88020,22 @@ entities: parent: 2 - type: Fixtures fixtures: {} + - uid: 19484 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 84.5,-47.5 + parent: 2 + - type: Fixtures + fixtures: {} + - uid: 19580 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 11.5,-60.5 + parent: 2 + - type: Fixtures + fixtures: {} - proto: IntercomEngineering entities: - uid: 16536 @@ -87618,6 +88130,13 @@ entities: parent: 2 - type: Fixtures fixtures: {} + - uid: 14725 + components: + - type: Transform + pos: 69.5,-25.5 + parent: 2 + - type: Fixtures + fixtures: {} - uid: 19381 components: - type: Transform @@ -87679,8 +88198,9 @@ entities: - uid: 17933 components: - type: Transform - pos: 67.341934,-35.365723 - parent: 2 + parent: 19584 + - type: Physics + canCollide: False - type: GasTank toggleActionEntity: 10251 - type: Jetpack @@ -87692,11 +88212,43 @@ entities: ents: - 7161 - 10251 + - type: InsideEntityStorage + storage: 19584 + - uid: 18201 + components: + - type: Transform + parent: 17376 + - type: Physics + canCollide: False + - type: InsideEntityStorage + storage: 17376 - uid: 19423 components: - type: Transform - pos: 67.498184,-35.475098 - parent: 2 + parent: 17376 + - type: GasTank + toggleActionEntity: 18567 + - type: Jetpack + toggleActionEntity: 18203 + - type: Physics + canCollide: False + - type: ActionsContainer + - type: ContainerContainer + containers: + actions: !type:Container + ents: + - 18203 + - 18567 + - type: InsideEntityStorage + storage: 17376 + - uid: 19644 + components: + - type: Transform + parent: 19584 + - type: Physics + canCollide: False + - type: InsideEntityStorage + storage: 19584 - proto: Jug entities: - uid: 734 @@ -88416,53 +88968,39 @@ entities: parent: 2 - proto: LockerPrisoner entities: - - uid: 5386 - components: - - type: Transform - pos: 68.5,-27.5 - parent: 2 -- proto: LockerPrisoner2 - entities: - - uid: 5388 - components: - - type: Transform - pos: 69.5,-27.5 - parent: 2 -- proto: LockerPrisoner3 - entities: - - uid: 5403 - components: - - type: Transform - pos: 70.5,-27.5 - parent: 2 -- proto: LockerPrisoner4 - entities: - - uid: 5405 + - uid: 11832 components: - type: Transform pos: 67.5,-30.5 parent: 2 -- proto: LockerPrisoner5 +- proto: LockerPrisoner2 entities: - - uid: 5406 + - uid: 12989 components: - type: Transform pos: 68.5,-30.5 parent: 2 -- proto: LockerPrisoner6 +- proto: LockerPrisoner3 entities: - - uid: 5409 + - uid: 11836 components: - type: Transform pos: 69.5,-30.5 parent: 2 -- proto: LockerPrisoner7 +- proto: LockerPrisoner4 entities: - - uid: 6090 + - uid: 13811 components: - type: Transform pos: 70.5,-30.5 parent: 2 +- proto: LockerPrisoner5 + entities: + - uid: 9967 + components: + - type: Transform + pos: 71.5,-29.5 + parent: 2 - proto: LockerQuarterMasterFilled entities: - uid: 6815 @@ -88891,11 +89429,6 @@ entities: - type: Transform pos: 75.5,-36.5 parent: 2 - - uid: 7770 - components: - - type: Transform - pos: 6.5,-74.5 - parent: 2 - uid: 7799 components: - type: Transform @@ -89137,10 +89670,10 @@ entities: parent: 2 - proto: MaterialWoodPlank10 entities: - - uid: 7461 + - uid: 7008 components: - type: Transform - pos: 5.5223966,-74.49242 + pos: 3.494131,-74.47642 parent: 2 - proto: MedicalBed entities: @@ -89580,6 +90113,11 @@ entities: - type: Transform pos: 31.5,-33.5 parent: 2 + - uid: 4102 + components: + - type: Transform + pos: 70.5,-19.5 + parent: 2 - uid: 6907 components: - type: Transform @@ -89615,11 +90153,6 @@ entities: - type: Transform pos: -43.5,-79.5 parent: 2 - - uid: 16048 - components: - - type: Transform - pos: 68.5,-23.5 - parent: 2 - uid: 19351 components: - type: Transform @@ -89642,6 +90175,38 @@ entities: - type: Transform pos: 45.59677,-75.42367 parent: 2 + - uid: 18198 + components: + - type: Transform + parent: 17376 + - type: GasTank + toggleActionEntity: 18199 + - type: Physics + canCollide: False + - type: ActionsContainer + - type: ContainerContainer + containers: + actions: !type:Container + ents: + - 18199 + - type: InsideEntityStorage + storage: 17376 + - uid: 19590 + components: + - type: Transform + parent: 19584 + - type: GasTank + toggleActionEntity: 19632 + - type: Physics + canCollide: False + - type: ActionsContainer + - type: ContainerContainer + containers: + actions: !type:Container + ents: + - 19632 + - type: InsideEntityStorage + storage: 19584 - proto: NitrousOxideCanister entities: - uid: 5055 @@ -89829,11 +90394,6 @@ entities: - type: Transform pos: -42.5,-76.5 parent: 2 - - uid: 18567 - components: - - type: Transform - pos: -0.5,-72.5 - parent: 2 - uid: 18770 components: - type: Transform @@ -89866,6 +90426,15 @@ entities: - type: Transform pos: 45.417492,-75.34028 parent: 2 +- proto: PaintingCafeTerraceAtNight + entities: + - uid: 20140 + components: + - type: Transform + pos: 3.5,-69.5 + parent: 2 + - type: Fixtures + fixtures: {} - proto: PaintingNightHawks entities: - uid: 18784 @@ -89876,6 +90445,15 @@ entities: parent: 2 - type: Fixtures fixtures: {} +- proto: PaintingOldGuitarist + entities: + - uid: 20139 + components: + - type: Transform + pos: 3.5,-70.5 + parent: 2 + - type: Fixtures + fixtures: {} - proto: PaintingRedBlueYellow entities: - uid: 5015 @@ -90046,6 +90624,11 @@ entities: - type: Transform pos: -53.5,-48.5 parent: 2 + - uid: 20133 + components: + - type: Transform + pos: 6.5,-71.5 + parent: 2 - proto: PaperBin20 entities: - uid: 1890 @@ -90349,6 +90932,13 @@ entities: - type: Transform pos: -52.315937,-52.474583 parent: 2 +- proto: PillCanisterRandom + entities: + - uid: 20137 + components: + - type: Transform + pos: 6.5025344,-73.19147 + parent: 2 - proto: PillSpaceDrugs entities: - uid: 18015 @@ -90853,6 +91443,13 @@ entities: - type: Transform pos: 91.5,-45.5 parent: 2 +- proto: PlushieArachind + entities: + - uid: 20121 + components: + - type: Transform + pos: 5.417511,-69.24368 + parent: 2 - proto: PlushieAtmosian entities: - uid: 892 @@ -90878,6 +91475,18 @@ entities: - type: Transform pos: 83.57618,-18.55573 parent: 2 + - uid: 20120 + components: + - type: Transform + pos: 5.2693624,-69.42899 + parent: 2 +- proto: PlushieDiona + entities: + - uid: 20119 + components: + - type: Transform + pos: 4.773992,-69.164925 + parent: 2 - proto: PlushieHampter entities: - uid: 16194 @@ -90892,6 +91501,18 @@ entities: - type: Transform pos: 10.276115,-44.41428 parent: 2 + - uid: 20122 + components: + - type: Transform + pos: 5.625844,-69.164925 + parent: 2 +- proto: PlushieLizard + entities: + - uid: 20111 + components: + - type: Transform + pos: 5.523992,-69.58437 + parent: 2 - proto: PlushieLizardInversed entities: - uid: 6922 @@ -90923,6 +91544,11 @@ entities: - type: Transform pos: -31.508543,-62.98768 parent: 2 + - uid: 20123 + components: + - type: Transform + pos: 5.6860294,-69.66991 + parent: 2 - proto: PlushiePenguin entities: - uid: 15800 @@ -90930,6 +91556,13 @@ entities: - type: Transform pos: 36.477215,-72.420235 parent: 2 +- proto: PlushieRatvar + entities: + - uid: 20112 + components: + - type: Transform + pos: 5.1952887,-69.130585 + parent: 2 - proto: PlushieRGBee entities: - uid: 15420 @@ -90973,6 +91606,11 @@ entities: - type: Transform pos: -51.020004,-60.457893 parent: 2 + - uid: 20117 + components: + - type: Transform + pos: 4.602696,-69.46879 + parent: 2 - proto: PlushieSlime entities: - uid: 5788 @@ -90987,6 +91625,11 @@ entities: - type: Transform pos: -39.603485,-58.0853 parent: 2 + - uid: 20113 + components: + - type: Transform + pos: 5.1814,-69.66991 + parent: 2 - proto: PlushieVox entities: - uid: 19377 @@ -90994,6 +91637,11 @@ entities: - type: Transform pos: 9.483602,-47.419678 parent: 2 + - uid: 20115 + components: + - type: Transform + pos: 5.463807,-69.237144 + parent: 2 - proto: PlushieVulp entities: - uid: 13963 @@ -91001,6 +91649,11 @@ entities: - type: Transform pos: 21.464287,-73.453964 parent: 2 + - uid: 20114 + components: + - type: Transform + pos: 4.352696,-69.23905 + parent: 2 - proto: PlushieXeno entities: - uid: 11682 @@ -91013,6 +91666,11 @@ entities: - type: Transform pos: -22.499308,-16.520548 parent: 2 + - uid: 20116 + components: + - type: Transform + pos: 5.536271,-69.37542 + parent: 2 - proto: PortableFlasher entities: - uid: 2164 @@ -92096,10 +92754,10 @@ entities: - type: Transform pos: 24.5,-21.5 parent: 2 - - uid: 17134 + - uid: 20087 components: - type: Transform - pos: 3.5,-69.5 + pos: 1.5,-70.5 parent: 2 - proto: PottedPlantBioluminscent entities: @@ -92419,6 +93077,12 @@ entities: rot: -1.5707963267948966 rad pos: -12.5,-54.5 parent: 2 + - uid: 5406 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 71.5,-29.5 + parent: 2 - uid: 5682 components: - type: Transform @@ -92477,6 +93141,11 @@ entities: rot: 3.141592653589793 rad pos: 15.5,-20.5 parent: 2 + - uid: 7162 + components: + - type: Transform + pos: 68.5,-26.5 + parent: 2 - uid: 7199 components: - type: Transform @@ -92998,12 +93667,6 @@ entities: rot: 3.141592653589793 rad pos: 60.5,-29.5 parent: 2 - - uid: 15204 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 70.5,-28.5 - parent: 2 - uid: 15206 components: - type: Transform @@ -93040,12 +93703,6 @@ entities: rot: 3.141592653589793 rad pos: 53.5,-34.5 parent: 2 - - uid: 15236 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 69.5,-34.5 - parent: 2 - uid: 15248 components: - type: Transform @@ -93371,6 +94028,12 @@ entities: - type: Transform pos: 84.5,-44.5 parent: 2 + - uid: 20096 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 67.5,-35.5 + parent: 2 - proto: PoweredlightCyan entities: - uid: 1336 @@ -93378,12 +94041,6 @@ entities: - type: Transform pos: 10.5,-77.5 parent: 2 - - uid: 1449 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 8.5,-71.5 - parent: 2 - uid: 10302 components: - type: Transform @@ -93407,6 +94064,12 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-68.5 parent: 2 + - uid: 20092 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 10.5,-70.5 + parent: 2 - proto: PoweredlightExterior entities: - uid: 3393 @@ -93999,12 +94662,6 @@ entities: rot: -1.5707963267948966 rad pos: 10.5,-88.5 parent: 2 - - uid: 14198 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 5.5,-70.5 - parent: 2 - uid: 14213 components: - type: Transform @@ -94311,6 +94968,18 @@ entities: rot: 3.141592653589793 rad pos: 60.5,-60.5 parent: 2 + - uid: 20141 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,-73.5 + parent: 2 + - uid: 20142 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,-70.5 + parent: 2 - proto: PoweredWarmSmallLight entities: - uid: 1431 @@ -94381,6 +95050,13 @@ entities: - type: Transform pos: 69.654045,-72.594284 parent: 2 +- proto: PsychBed + entities: + - uid: 20106 + components: + - type: Transform + pos: 4.5,-69.5 + parent: 2 - proto: PuddleBlood entities: - uid: 801 @@ -95808,11 +96484,6 @@ entities: - type: Transform pos: 21.5,-20.5 parent: 2 - - uid: 17376 - components: - - type: Transform - pos: 5.5,-69.5 - parent: 2 - proto: RandomGreyStalagmite entities: - uid: 3766 @@ -96083,11 +96754,6 @@ entities: - type: Transform pos: 26.5,-82.5 parent: 2 - - uid: 17155 - components: - - type: Transform - pos: 8.5,-71.5 - parent: 2 - uid: 17156 components: - type: Transform @@ -96174,6 +96840,11 @@ entities: - type: Transform pos: -42.5,-67.5 parent: 2 + - uid: 10767 + components: + - type: Transform + pos: -3.5,-69.5 + parent: 2 - uid: 10802 components: - type: Transform @@ -96211,6 +96882,11 @@ entities: - type: Transform pos: 42.5,-75.5 parent: 2 + - uid: 20088 + components: + - type: Transform + pos: -3.5,-70.5 + parent: 2 - proto: RCD entities: - uid: 5860 @@ -96697,6 +97373,12 @@ entities: - type: Transform pos: 19.5,-45.5 parent: 2 + - uid: 19346 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 49.5,-62.5 + parent: 2 - uid: 19569 components: - type: Transform @@ -98416,11 +99098,6 @@ entities: - type: Transform pos: 32.50578,-91.53216 parent: 2 - - uid: 7163 - components: - - type: Transform - pos: 67.6259,-35.272655 - parent: 2 - uid: 8096 components: - type: Transform @@ -98441,6 +99118,11 @@ entities: - type: Transform pos: 45.696777,-73.20621 parent: 2 + - uid: 17134 + components: + - type: Transform + pos: 67.5,-32.5 + parent: 2 - proto: SheetSteel10 entities: - uid: 3911 @@ -98553,19 +99235,19 @@ entities: parent: 2 - proto: ShotGunCabinetFilled entities: - - uid: 3609 + - uid: 17155 components: - type: Transform rot: -1.5707963267948966 rad - pos: 70.5,-32.5 + pos: 70.5,-34.5 parent: 2 - type: Fixtures fixtures: {} - - uid: 7311 + - uid: 17318 components: - type: Transform rot: -1.5707963267948966 rad - pos: 70.5,-33.5 + pos: 70.5,-35.5 parent: 2 - type: Fixtures fixtures: {} @@ -99860,6 +100542,19 @@ entities: - Off - type: Fixtures fixtures: {} + - uid: 16040 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 72.5,-28.5 + parent: 2 + - type: DeviceLinkSource + linkedPorts: + 6621: + - - Pressed + - DoorBolt + - type: Fixtures + fixtures: {} - uid: 16241 components: - type: Transform @@ -99964,6 +100659,22 @@ entities: - Toggle - type: Fixtures fixtures: {} + - uid: 20143 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,-73.5 + parent: 2 + - type: DeviceLinkSource + linkedPorts: + 20142: + - - Pressed + - Toggle + 20141: + - - Pressed + - Toggle + - type: Fixtures + fixtures: {} - proto: SignAnomaly entities: - uid: 16210 @@ -100812,6 +101523,14 @@ entities: parent: 2 - type: Fixtures fixtures: {} + - uid: 17374 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.499954,-68.59174 + parent: 2 + - type: Fixtures + fixtures: {} - uid: 17409 components: - type: Transform @@ -100844,14 +101563,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} - - uid: 18198 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 7.5,-69.5 - parent: 2 - - type: Fixtures - fixtures: {} - uid: 18205 components: - type: Transform @@ -100962,6 +101673,14 @@ entities: fixtures: {} - proto: SignDirectionalHop entities: + - uid: 12413 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.499954,-68.807945 + parent: 2 + - type: Fixtures + fixtures: {} - uid: 16132 components: - type: Transform @@ -100977,14 +101696,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} - - uid: 18200 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 7.498763,-69.71605 - parent: 2 - - type: Fixtures - fixtures: {} - proto: SignDirectionalHydro entities: - uid: 14430 @@ -101067,6 +101778,14 @@ entities: parent: 2 - type: Fixtures fixtures: {} + - uid: 2399 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.499954,-68.15935 + parent: 2 + - type: Fixtures + fixtures: {} - uid: 3000 components: - type: Transform @@ -101120,14 +101839,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} - - uid: 18201 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 7.5010014,-69.072586 - parent: 2 - - type: Fixtures - fixtures: {} - uid: 19639 components: - type: Transform @@ -101148,6 +101859,14 @@ entities: fixtures: {} - proto: SignDirectionalSci entities: + - uid: 3176 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.499954,-68.37554 + parent: 2 + - type: Fixtures + fixtures: {} - uid: 11099 components: - type: Transform @@ -101196,14 +101915,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} - - uid: 18199 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 7.4985375,-69.28461 - parent: 2 - - type: Fixtures - fixtures: {} - proto: SignDirectionalSec entities: - uid: 10664 @@ -101357,14 +102068,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} - - uid: 14725 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 67.5,-23.5 - parent: 2 - - type: Fixtures - fixtures: {} - uid: 14819 components: - type: Transform @@ -101706,15 +102409,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} -- proto: SignFlammableMed - entities: - - uid: 19346 - components: - - type: Transform - pos: 2.5,-55.5 - parent: 2 - - type: Fixtures - fixtures: {} - proto: SignGravity entities: - uid: 16203 @@ -101915,6 +102609,15 @@ entities: parent: 2 - type: Fixtures fixtures: {} +- proto: SignPsychology + entities: + - uid: 20138 + components: + - type: Transform + pos: 5.5,-68.5 + parent: 2 + - type: Fixtures + fixtures: {} - proto: SignRadiation entities: - uid: 18444 @@ -103556,6 +104259,13 @@ entities: - type: Transform pos: 3.5,-3.5 parent: 2 +- proto: SpawnPointPsychologist + entities: + - uid: 20132 + components: + - type: Transform + pos: 4.5,-71.5 + parent: 2 - proto: SpawnPointQuartermaster entities: - uid: 15351 @@ -104239,14 +104949,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} - - uid: 18203 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-70.5 - parent: 2 - - type: Fixtures - fixtures: {} - uid: 18834 components: - type: Transform @@ -104257,6 +104959,24 @@ entities: fixtures: {} - proto: SteelBench entities: + - uid: 3899 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 69.5,-27.5 + parent: 2 + - uid: 4070 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 69.5,-26.5 + parent: 2 + - uid: 4120 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 71.5,-26.5 + parent: 2 - uid: 7781 components: - type: Transform @@ -104275,6 +104995,12 @@ entities: rot: 3.141592653589793 rad pos: 51.5,-15.5 parent: 2 + - uid: 16101 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 71.5,-27.5 + parent: 2 - proto: Stool entities: - uid: 6167 @@ -104688,26 +105414,57 @@ entities: - type: Transform pos: 61.5,-51.5 parent: 2 - - uid: 7157 - components: - - type: Transform - pos: 69.5,-36.5 - parent: 2 - uid: 7226 components: - type: Transform pos: 59.5,-51.5 parent: 2 - - uid: 7227 + - uid: 17376 components: - type: Transform - pos: 69.5,-34.5 + pos: 68.5,-36.5 parent: 2 - - uid: 8125 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + Oxygen: 1.7459903 + Nitrogen: 6.568249 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 18201 + - 18200 + - 18198 + - 19423 + - uid: 19584 components: - type: Transform - pos: 69.5,-35.5 + pos: 69.5,-36.5 parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + Oxygen: 1.7459903 + Nitrogen: 6.568249 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 19644 + - 17933 + - 19590 + - 19729 - proto: SuitStorageWarden entities: - uid: 5413 @@ -105704,6 +106461,17 @@ entities: - SurveillanceCameraMedical nameSet: True id: Medical Bay + - uid: 20154 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,-70.5 + parent: 2 + - type: SurveillanceCamera + setupAvailableNetworks: + - SurveillanceCameraMedical + nameSet: True + id: Psychologist's Office - proto: SurveillanceCameraRouterCommand entities: - uid: 15917 @@ -106901,11 +107669,6 @@ entities: - type: Transform pos: 22.5,-20.5 parent: 2 - - uid: 13860 - components: - - type: Transform - pos: 67.5,-35.5 - parent: 2 - uid: 14624 components: - type: Transform @@ -107432,11 +108195,6 @@ entities: - type: Transform pos: 2.5,-78.5 parent: 2 - - uid: 17374 - components: - - type: Transform - pos: 5.5,-69.5 - parent: 2 - uid: 17801 components: - type: Transform @@ -108046,6 +108804,21 @@ entities: - type: Transform pos: -42.5,-52.5 parent: 2 + - uid: 20124 + components: + - type: Transform + pos: 6.5,-72.5 + parent: 2 + - uid: 20125 + components: + - type: Transform + pos: 6.5,-71.5 + parent: 2 + - uid: 20126 + components: + - type: Transform + pos: 4.5,-72.5 + parent: 2 - proto: TableXeno entities: - uid: 486 @@ -109574,6 +110347,9 @@ entities: - type: Transform pos: 70.5,-42.5 parent: 2 + - type: AccessReader + accessListsOriginal: + - - Security - proto: VendingMachineSeeds entities: - uid: 12475 @@ -110841,11 +111617,6 @@ entities: - type: Transform pos: -19.5,-58.5 parent: 2 - - uid: 4102 - components: - - type: Transform - pos: 68.5,-26.5 - parent: 2 - uid: 4109 components: - type: Transform @@ -111129,6 +111900,12 @@ entities: - type: Transform pos: 11.5,-13.5 parent: 2 + - uid: 5409 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 69.5,-25.5 + parent: 2 - uid: 5435 components: - type: Transform @@ -111166,11 +111943,6 @@ entities: - type: Transform pos: 38.5,-80.5 parent: 2 - - uid: 6621 - components: - - type: Transform - pos: 67.5,-26.5 - parent: 2 - uid: 6630 components: - type: Transform @@ -111517,6 +112289,12 @@ entities: - type: Transform pos: 71.5,-54.5 parent: 2 + - uid: 7991 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 67.5,-26.5 + parent: 2 - uid: 8068 components: - type: Transform @@ -111578,6 +112356,18 @@ entities: rot: 1.5707963267948966 rad pos: 20.5,-26.5 parent: 2 + - uid: 8627 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 67.5,-25.5 + parent: 2 + - uid: 8651 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 68.5,-25.5 + parent: 2 - uid: 9407 components: - type: Transform @@ -111606,11 +112396,6 @@ entities: rot: -1.5707963267948966 rad pos: 67.5,-45.5 parent: 2 - - uid: 10767 - components: - - type: Transform - pos: 70.5,-34.5 - parent: 2 - uid: 10781 components: - type: Transform @@ -111784,6 +112569,17 @@ entities: - type: Transform pos: 14.5,13.5 parent: 2 + - uid: 15307 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 70.5,-34.5 + parent: 2 + - uid: 15308 + components: + - type: Transform + pos: 70.5,-33.5 + parent: 2 - uid: 15328 components: - type: Transform @@ -111804,11 +112600,6 @@ entities: - type: Transform pos: 66.5,-35.5 parent: 2 - - uid: 15485 - components: - - type: Transform - pos: 70.5,-36.5 - parent: 2 - uid: 15490 components: - type: Transform @@ -111909,21 +112700,11 @@ entities: - type: Transform pos: -29.5,-58.5 parent: 2 - - uid: 17318 - components: - - type: Transform - pos: 70.5,-35.5 - parent: 2 - uid: 17319 components: - type: Transform pos: 36.5,-80.5 parent: 2 - - uid: 17322 - components: - - type: Transform - pos: 70.5,-33.5 - parent: 2 - uid: 17345 components: - type: Transform @@ -111939,11 +112720,6 @@ entities: - type: Transform pos: -28.5,-58.5 parent: 2 - - uid: 17602 - components: - - type: Transform - pos: 69.5,-26.5 - parent: 2 - uid: 17666 components: - type: Transform @@ -112109,6 +112885,17 @@ entities: - type: Transform pos: 55.5,-95.5 parent: 2 + - uid: 20053 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 70.5,-35.5 + parent: 2 + - uid: 20094 + components: + - type: Transform + pos: 70.5,-36.5 + parent: 2 - proto: WallReinforcedChitin entities: - uid: 39 @@ -116471,6 +117258,11 @@ entities: - type: Transform pos: 84.5,-47.5 parent: 2 + - uid: 3200 + components: + - type: Transform + pos: 72.5,-26.5 + parent: 2 - uid: 3201 components: - type: Transform @@ -117001,7 +117793,7 @@ entities: - uid: 3633 components: - type: Transform - pos: 70.5,-26.5 + pos: 72.5,-25.5 parent: 2 - uid: 3739 components: @@ -118395,12 +119187,6 @@ entities: - type: Transform pos: 73.5,-36.5 parent: 2 - - uid: 6009 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 71.5,-29.5 - parent: 2 - uid: 6012 components: - type: Transform @@ -118432,6 +119218,11 @@ entities: - type: Transform pos: 37.5,-18.5 parent: 2 + - uid: 6090 + components: + - type: Transform + pos: 72.5,-27.5 + parent: 2 - uid: 6091 components: - type: Transform @@ -119135,24 +119926,12 @@ entities: rot: -1.5707963267948966 rad pos: 74.5,-50.5 parent: 2 - - uid: 8627 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 71.5,-28.5 - parent: 2 - uid: 8629 components: - type: Transform rot: 1.5707963267948966 rad pos: 95.5,-51.5 parent: 2 - - uid: 8634 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 71.5,-27.5 - parent: 2 - uid: 8635 components: - type: Transform @@ -119164,12 +119943,6 @@ entities: rot: 1.5707963267948966 rad pos: 94.5,-51.5 parent: 2 - - uid: 8651 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 71.5,-26.5 - parent: 2 - uid: 8685 components: - type: Transform @@ -119656,11 +120429,6 @@ entities: - type: Transform pos: 73.5,-40.5 parent: 2 - - uid: 13844 - components: - - type: Transform - pos: 67.5,-23.5 - parent: 2 - uid: 13849 components: - type: Transform @@ -119851,6 +120619,18 @@ entities: - type: Transform pos: 4.5,-81.5 parent: 2 + - uid: 15466 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 72.5,-29.5 + parent: 2 + - uid: 15467 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 72.5,-30.5 + parent: 2 - uid: 15722 components: - type: Transform @@ -120076,6 +120856,11 @@ entities: - type: Transform pos: -24.5,-89.5 parent: 2 + - uid: 17602 + components: + - type: Transform + pos: 70.5,-25.5 + parent: 2 - uid: 17635 components: - type: Transform @@ -120126,6 +120911,16 @@ entities: - type: Transform pos: 55.5,-73.5 parent: 2 + - uid: 17965 + components: + - type: Transform + pos: 72.5,-28.5 + parent: 2 + - uid: 17970 + components: + - type: Transform + pos: 71.5,-25.5 + parent: 2 - uid: 18004 components: - type: Transform @@ -122618,7 +123413,8 @@ entities: - uid: 2390 components: - type: Transform - pos: 5.5,-68.5 + rot: -1.5707963267948966 rad + pos: 3.5,-72.5 parent: 2 - uid: 2394 components: @@ -122640,26 +123436,6 @@ entities: - type: Transform pos: 4.5,-68.5 parent: 2 - - uid: 2398 - components: - - type: Transform - pos: 4.5,-69.5 - parent: 2 - - uid: 2399 - components: - - type: Transform - pos: 4.5,-70.5 - parent: 2 - - uid: 2400 - components: - - type: Transform - pos: 4.5,-71.5 - parent: 2 - - uid: 2401 - components: - - type: Transform - pos: 4.5,-72.5 - parent: 2 - uid: 2402 components: - type: Transform @@ -122675,11 +123451,6 @@ entities: - type: Transform pos: 7.5,-68.5 parent: 2 - - uid: 2414 - components: - - type: Transform - pos: 7.5,-72.5 - parent: 2 - uid: 2415 components: - type: Transform @@ -122970,11 +123741,6 @@ entities: - type: Transform pos: 6.5,-62.5 parent: 2 - - uid: 3176 - components: - - type: Transform - pos: 7.5,-69.5 - parent: 2 - uid: 3177 components: - type: Transform @@ -123295,11 +124061,6 @@ entities: - type: Transform pos: 36.5,-25.5 parent: 2 - - uid: 3899 - components: - - type: Transform - pos: 73.5,-30.5 - parent: 2 - uid: 3900 components: - type: Transform @@ -123325,22 +124086,12 @@ entities: - type: Transform pos: 72.5,-24.5 parent: 2 - - uid: 3945 - components: - - type: Transform - pos: 71.5,-25.5 - parent: 2 - uid: 3948 components: - type: Transform rot: 3.141592653589793 rad pos: -15.5,-36.5 parent: 2 - - uid: 3951 - components: - - type: Transform - pos: 72.5,-28.5 - parent: 2 - uid: 3957 components: - type: Transform @@ -123954,6 +124705,11 @@ entities: - type: Transform pos: 60.5,-65.5 parent: 2 + - uid: 6628 + components: + - type: Transform + pos: 3.5,-71.5 + parent: 2 - uid: 6657 components: - type: Transform @@ -124052,6 +124808,12 @@ entities: - type: Transform pos: 78.5,-65.5 parent: 2 + - uid: 7461 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-74.5 + parent: 2 - uid: 7537 components: - type: Transform @@ -124320,11 +125082,6 @@ entities: - type: Transform pos: 60.5,-61.5 parent: 2 - - uid: 9349 - components: - - type: Transform - pos: 70.5,-25.5 - parent: 2 - uid: 9359 components: - type: Transform @@ -124552,12 +125309,6 @@ entities: rot: 3.141592653589793 rad pos: 69.5,-65.5 parent: 2 - - uid: 11893 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 69.5,-64.5 - parent: 2 - uid: 11895 components: - type: Transform @@ -124600,10 +125351,10 @@ entities: - type: Transform pos: -14.5,-30.5 parent: 2 - - uid: 12408 + - uid: 12412 components: - type: Transform - pos: 6.5,-72.5 + pos: 7.5,-69.5 parent: 2 - uid: 12473 components: @@ -124745,11 +125496,6 @@ entities: - type: Transform pos: 44.5,-75.5 parent: 2 - - uid: 13880 - components: - - type: Transform - pos: 73.5,-26.5 - parent: 2 - uid: 13903 components: - type: Transform @@ -124964,16 +125710,6 @@ entities: - type: Transform pos: 30.5,-33.5 parent: 2 - - uid: 15307 - components: - - type: Transform - pos: 7.5,-70.5 - parent: 2 - - uid: 15308 - components: - - type: Transform - pos: 7.5,-71.5 - parent: 2 - uid: 15314 components: - type: Transform @@ -125177,6 +125913,29 @@ entities: - type: Transform pos: 33.5,-34.5 parent: 2 + - uid: 20085 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-69.5 + parent: 2 + - uid: 20086 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-68.5 + parent: 2 + - uid: 20089 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,-73.5 + parent: 2 + - uid: 20102 + components: + - type: Transform + pos: 5.5,-68.5 + parent: 2 - proto: WardrobeCargoFilled entities: - uid: 6961 @@ -125203,10 +125962,10 @@ entities: - type: Transform pos: 61.5,-15.5 parent: 2 - - uid: 8231 + - uid: 13844 components: - type: Transform - pos: 67.5,-27.5 + pos: 68.5,-26.5 parent: 2 - uid: 18043 components: @@ -125447,6 +126206,24 @@ entities: - type: DeviceNetwork deviceLists: - 10829 + - uid: 19485 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 96.5,-47.5 + parent: 2 + - type: DeviceNetwork + deviceLists: + - 10829 + - uid: 19486 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 96.5,-43.5 + parent: 2 + - type: DeviceNetwork + deviceLists: + - 10829 - proto: WeaponEnergyTurretAIControlPanel entities: - uid: 10829 @@ -125459,6 +126236,8 @@ entities: devices: - 10842 - 7576 + - 19485 + - 19486 - proto: WeaponEnergyTurretCommand entities: - uid: 7140 @@ -125948,12 +126727,34 @@ entities: rot: 3.141592653589793 rad pos: 58.5,-40.5 parent: 2 + - uid: 7311 + components: + - type: Transform + pos: 68.5,-32.5 + parent: 2 - uid: 9217 components: - type: Transform rot: 3.141592653589793 rad pos: 59.5,-40.5 parent: 2 + - uid: 12408 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 69.5,-35.5 + parent: 2 + - uid: 19537 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 69.5,-34.5 + parent: 2 + - uid: 19616 + components: + - type: Transform + pos: 69.5,-32.5 + parent: 2 - proto: WindoorSecureAtmosphericsLocked entities: - uid: 8009 @@ -126180,6 +126981,12 @@ entities: rot: -1.5707963267948966 rad pos: 57.5,-27.5 parent: 2 + - uid: 6621 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 70.5,-28.5 + parent: 2 - uid: 7067 components: - type: Transform @@ -126346,6 +127153,18 @@ entities: rot: 3.141592653589793 rad pos: 76.5,-62.5 parent: 2 + - uid: 3945 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 71.5,-28.5 + parent: 2 + - uid: 3951 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 69.5,-28.5 + parent: 2 - uid: 4569 components: - type: Transform @@ -126453,6 +127272,12 @@ entities: - type: Transform pos: 31.5,-72.5 parent: 2 + - uid: 7279 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 69.5,-32.5 + parent: 2 - uid: 7285 components: - type: Transform @@ -126539,6 +127364,18 @@ entities: - type: Transform pos: 76.5,-66.5 parent: 2 + - uid: 13871 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 68.5,-26.5 + parent: 2 + - uid: 13880 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 68.5,-27.5 + parent: 2 - uid: 13991 components: - type: Transform @@ -126613,6 +127450,12 @@ entities: rot: 3.141592653589793 rad pos: 27.5,-39.5 parent: 2 + - uid: 19617 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 68.5,-32.5 + parent: 2 - proto: Wirecutter entities: - uid: 8104 @@ -127171,6 +128014,11 @@ entities: - type: Transform pos: -18.5,-17.5 parent: 2 + - uid: 3127 + components: + - type: Transform + pos: 7.5,-70.5 + parent: 2 - uid: 3220 components: - type: Transform @@ -128298,11 +129146,6 @@ entities: - type: Transform pos: -30.5,-46.5 parent: 2 - - uid: 12851 - components: - - type: Transform - pos: 49.5,-62.5 - parent: 2 - uid: 13647 components: - type: Transform @@ -128456,4 +129299,14 @@ entities: - type: Transform pos: 26.5,-63.5 parent: 2 + - uid: 20084 + components: + - type: Transform + pos: 7.5,-72.5 + parent: 2 + - uid: 20091 + components: + - type: Transform + pos: 7.5,-71.5 + parent: 2 ... diff --git a/Resources/Prototypes/Maps/exo.yml b/Resources/Prototypes/Maps/exo.yml index 5026d68c44..52bb586db4 100644 --- a/Resources/Prototypes/Maps/exo.yml +++ b/Resources/Prototypes/Maps/exo.yml @@ -40,6 +40,7 @@ MedicalDoctor: [ 4, 4 ] MedicalIntern: [ 3, 3 ] Paramedic: [ 1, 1 ] + Psychologist: [ 1, 1 ] #science ResearchDirector: [ 1, 1 ] Scientist: [ 4, 4 ] @@ -47,9 +48,9 @@ #security HeadOfSecurity: [ 1, 1 ] Warden: [ 1, 1 ] - SecurityOfficer: [ 4, 4 ] + SecurityOfficer: [ 5, 5 ] Detective: [ 1, 1 ] - SecurityCadet: [ 4, 4 ] + SecurityCadet: [ 3, 3 ] Lawyer: [ 2, 2 ] #supply Quartermaster: [ 1, 1 ] From b1df92145a6058898030d31010b175829233ab86 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 20 May 2026 07:23:30 +0000 Subject: [PATCH 46/52] Automatic changelog update --- Resources/Changelog/Changelog.yml | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 785c487753..a256ca3145 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: chromiumboy - changes: - - message: Gas analyzers now correctly report the total volume and the number of - moles of gas contained in gas pipe manifolds. - type: Fix - - message: The total volume of gas that gas pipe manifolds can contain has been - reduced from 1200L to 300L. - type: Tweak - id: 9187 - time: '2025-11-06T06:31:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/41325 - author: Princess-Cheeseballs changes: - message: Phalanx now removes the death gene again. @@ -4077,3 +4066,18 @@ id: 9698 time: '2026-05-19T11:59:10.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40929 +- author: SlamBamActionman + changes: + - message: Exo now has a Psychologist's office and job slot. + type: Add + - message: Exo now features 5 Security Officer job slots (was 4) and 3 Cadet job + slots (was 4). + type: Tweak + - message: Exo Botany has an additional scrubber to prevent gas leakage. + type: Tweak + - message: Exo Security's mini-armory is now Sec access, and there has been a temporary + holding cell added. + type: Tweak + id: 9699 + time: '2026-05-20T07:22:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/43533 From 47d552f7455f6ca17b377cbc251cf577d7e264d1 Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Wed, 20 May 2026 09:56:54 -0700 Subject: [PATCH 47/52] Ensure client/server in SharedGasSpecificHeatsTest.cs are idle (#43174) * ensure client/server in SharedGasSpecificHeatsTest.cs are idle * a little off the top --- .../Tests/Atmos/SharedGasSpecificHeatsTest.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Content.IntegrationTests/Tests/Atmos/SharedGasSpecificHeatsTest.cs b/Content.IntegrationTests/Tests/Atmos/SharedGasSpecificHeatsTest.cs index 7269b1b473..85d0aed085 100644 --- a/Content.IntegrationTests/Tests/Atmos/SharedGasSpecificHeatsTest.cs +++ b/Content.IntegrationTests/Tests/Atmos/SharedGasSpecificHeatsTest.cs @@ -44,6 +44,9 @@ public sealed class SharedGasSpecificHeatsTest _sAtmos = _sEntMan.System(); _cAtmos = _cEntMan.System(); + + // ensure that client and server atmos are fully inited otherwise arrays might not agree + await _pair.ReallyBeIdle(1); } [TearDown] From cbf1047c558d9c842fc9b25c19a68e9e9e8d01ef Mon Sep 17 00:00:00 2001 From: mq <113324899+mqole@users.noreply.github.com> Date: Thu, 21 May 2026 05:31:54 +1000 Subject: [PATCH 48/52] Reduced AI static overlay checkbox for photosensitivity (#44003) * option to reduce ai static overlay * wrong file path! * requested change --- .../Options/UI/Tabs/AccessibilityTab.xaml | 1 + .../Options/UI/Tabs/AccessibilityTab.xaml.cs | 1 + .../Silicons/StationAi/StationAiOverlay.cs | 14 +++++++++++++- Content.Shared/CCVar/CCVars.Accessibility.cs | 7 +++++++ .../Locale/en-US/escape-menu/ui/options-menu.ftl | 1 + Resources/Prototypes/Shaders/shaders.yml | 7 ++++++- .../Textures/Shaders/camera_static_accessible.swsl | 6 ++++++ 7 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Shaders/camera_static_accessible.swsl diff --git a/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml b/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml index 72df18390f..5a389ca491 100644 --- a/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml +++ b/Content.Client/Options/UI/Tabs/AccessibilityTab.xaml @@ -7,6 +7,7 @@