From a39233c6ff51e5a1f4dc7d980fc196a4148af8c2 Mon Sep 17 00:00:00 2001 From: wrexbe <81056464+wrexbe@users.noreply.github.com> Date: Mon, 13 Jun 2022 08:03:00 -0700 Subject: [PATCH 01/89] Remove merge conflict comment (#8819) --- .github/workflows/conflict-labeler.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/conflict-labeler.yml b/.github/workflows/conflict-labeler.yml index fd832b9231..68666aa755 100644 --- a/.github/workflows/conflict-labeler.yml +++ b/.github/workflows/conflict-labeler.yml @@ -15,4 +15,3 @@ jobs: with: dirtyLabel: "Merge Conflict" repoToken: "${{ secrets.GITHUB_TOKEN }}" - commentOnDirty: "This pull request has conflicts, please resolve those before we can evaluate the pull request." From 1af683ee9041b1e1526a8696027e0d2198114432 Mon Sep 17 00:00:00 2001 From: ike709 Date: Mon, 13 Jun 2022 11:45:23 -0500 Subject: [PATCH 02/89] Revert "Remove merge conflict comment" (#8820) --- .github/workflows/conflict-labeler.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/conflict-labeler.yml b/.github/workflows/conflict-labeler.yml index 68666aa755..fd832b9231 100644 --- a/.github/workflows/conflict-labeler.yml +++ b/.github/workflows/conflict-labeler.yml @@ -15,3 +15,4 @@ jobs: with: dirtyLabel: "Merge Conflict" repoToken: "${{ secrets.GITHUB_TOKEN }}" + commentOnDirty: "This pull request has conflicts, please resolve those before we can evaluate the pull request." From bb722f9bd1d636703ed421c7e6be7c6b2f31f634 Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Tue, 14 Jun 2022 01:13:00 -0600 Subject: [PATCH 03/89] Captain laser self recharge (#8826) --- .../Entities/Objects/Weapons/Guns/Battery/battery_guns.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 6fd04b32f3..0bba3e5107 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -300,6 +300,9 @@ - type: HitscanBatteryAmmoProvider proto: RedMediumLaser fireCost: 100 + - type: BatterySelfRecharger + autoRecharge: true + autoRechargeRate: 40 - type: MagazineVisuals magState: mag steps: 5 From e43ac8ab3b56ba772b014776958d88f9f65452b5 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Tue, 14 Jun 2022 03:13:30 -0400 Subject: [PATCH 04/89] Update coffee.yml (#8830) --- .../Prototypes/Catalog/VendingMachines/Inventories/coffee.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/coffee.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/coffee.yml index df016aaa54..4542fb8f7d 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/coffee.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/coffee.yml @@ -4,5 +4,5 @@ animationDuration: 3.4 spriteName: coffee startingInventory: - DrinkHotCoffee: 20 - DrinkTeaGlass: 20 + DrinkHotCoffee: 10 + DrinkTeaGlass: 10 From 43c47bf6d237fbf28bbc5f2704274539bd99ece0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Jun 2022 03:14:34 -0400 Subject: [PATCH 05/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ac911ca414..1b7b625743 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: Daemon - changes: - - {message: Lean can now be made and has effects., type: Tweak} - id: 1192 - time: '2022-03-12T22:07:07.0000000+00:00' - author: Peptide90 changes: - {message: All windows are now less susceptible to piercing damage and more to @@ -3005,3 +3000,9 @@ Entries: - {message: Fixed cobra magazine so it actually goes into the gun., type: Fix} id: 1691 time: '2022-06-13T09:30:16.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Solar's Best Hot Drinks now only have half as much coffee and tea in + them., type: Tweak} + id: 1692 + time: '2022-06-14T07:13:31.0000000+00:00' From 63bf83164e04dc6b2db739228edbeeff4d4c0760 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 14 Jun 2022 17:19:51 +1000 Subject: [PATCH 06/89] Nerf pistol firerate slightly (#8810) --- .../Entities/Objects/Weapons/Guns/Pistols/pistols.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index d8585507b0..fa4d23b055 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -15,7 +15,7 @@ - type: Item size: 10 - type: Gun - fireRate: 8 + fireRate: 6 selectedMode: SemiAuto availableModes: - SemiAuto @@ -114,6 +114,7 @@ - type: Item sprite: Objects/Weapons/Guns/Pistols/cobra.rsi - type: Gun + fireRate: 4 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/silenced.ogg - type: ItemSlots From 381bcf7c91563028c8cabdb843e92964938302fc Mon Sep 17 00:00:00 2001 From: ike709 Date: Tue, 14 Jun 2022 02:20:27 -0500 Subject: [PATCH 07/89] Don't flag merge conflicts on draft PRs (#8821) --- .github/workflows/conflict-labeler.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/conflict-labeler.yml b/.github/workflows/conflict-labeler.yml index fd832b9231..0bf32de8eb 100644 --- a/.github/workflows/conflict-labeler.yml +++ b/.github/workflows/conflict-labeler.yml @@ -9,6 +9,7 @@ on: jobs: Label: runs-on: ubuntu-latest + if: github.event.pull_request.draft == false steps: - name: Check for Merge Conflicts uses: eps1lon/actions-label-merge-conflict@513a24fc7dca40990863be2935e059e650728400 From 5d33cd7895d7d3adaf9d865788b75032533da5b1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Jun 2022 03:20:54 -0400 Subject: [PATCH 08/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1b7b625743..c2c8c58f95 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Peptide90 - changes: - - {message: All windows are now less susceptible to piercing damage and more to - blunt., type: Tweak} - - {message: 'Spears now take cable, a glass shard and 2 rods to craft. They break - after 4 throws.', type: Tweak} - id: 1193 - time: '2022-03-12T22:07:27.0000000+00:00' - author: Macoron changes: - {message: Guitar and other items now correctly react on quick equipment key (Z @@ -3006,3 +2998,8 @@ Entries: them., type: Tweak} id: 1692 time: '2022-06-14T07:13:31.0000000+00:00' +- author: metalgearsloth + changes: + - {message: Tweak pistol firerate from 8 -> 6 and cobra firerate from 8 -> 4., type: Tweak} + id: 1693 + time: '2022-06-14T07:19:51.0000000+00:00' From 038d534d60e6f3e449274877963f0a24dcc6e4da Mon Sep 17 00:00:00 2001 From: keronshb <54602815+keronshb@users.noreply.github.com> Date: Tue, 14 Jun 2022 03:26:59 -0400 Subject: [PATCH 09/89] Guns will now eject magazines first instead of chamber (#8827) --- .../Entities/Objects/Weapons/Guns/LMGs/lmgs.yml | 2 ++ .../Entities/Objects/Weapons/Guns/Pistols/pistols.yml | 6 ++++++ .../Entities/Objects/Weapons/Guns/Rifles/rifles.yml | 8 ++++++++ .../Entities/Objects/Weapons/Guns/SMGs/smgs.yml | 8 ++++++++ .../Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml | 1 + 5 files changed, 25 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index 8af13cb566..7885dabe27 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -31,12 +31,14 @@ startingItem: MagazineLightRifleBox insertSound: /Audio/Weapons/Guns/MagIn/batrifle_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/batrifle_magout.ogg + priority: 2 whitelist: tags: - MagazineLightRifleBox gun_chamber: name: Chamber startingItem: CartridgeLightRifle + priority: 1 whitelist: tags: - CartridgeLightRifle diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index fa4d23b055..66e63fd55c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -29,12 +29,14 @@ startingItem: MagazinePistol insertSound: /Audio/Weapons/Guns/MagIn/pistol_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg + priority: 2 whitelist: tags: - MagazinePistol gun_chamber: name: Chamber startingItem: CartridgePistol + priority: 1 whitelist: tags: - CartridgePistol @@ -65,6 +67,7 @@ startingItem: MagazinePistol insertSound: /Audio/Weapons/Guns/MagIn/pistol_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg + priority: 2 whitelist: tags: - MagazinePistol @@ -72,6 +75,7 @@ gun_chamber: name: Chamber startingItem: CartridgePistol + priority: 1 whitelist: tags: - CartridgePistol @@ -124,12 +128,14 @@ startingItem: MagazinePistolCaselessRifle insertSound: /Audio/Weapons/Guns/MagIn/pistol_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg + priority: 2 whitelist: tags: - MagazinePistolCaselessRifle gun_chamber: name: Chamber startingItem: CartridgeCaselessRifle + priority: 1 whitelist: tags: - CartridgeCaselessRifle diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index e36cca86e1..510e532bd9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -25,12 +25,14 @@ startingItem: MagazineLightRifle insertSound: /Audio/Weapons/Guns/MagIn/batrifle_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/batrifle_magout.ogg + priority: 2 whitelist: tags: - MagazineLightRifle gun_chamber: name: Chamber startingItem: CartridgeLightRifle + priority: 1 whitelist: tags: - CartridgeLightRifle @@ -66,12 +68,14 @@ startingItem: MagazineLightRifle insertSound: /Audio/Weapons/Guns/MagIn/ltrifle_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/ltrifle_magout.ogg + priority: 2 whitelist: tags: - MagazineLightRifle gun_chamber: name: Chamber startingItem: CartridgeLightRifle + priority: 1 whitelist: tags: - CartridgeLightRifle @@ -107,12 +111,14 @@ startingItem: MagazineRifle insertSound: /Audio/Weapons/Guns/MagIn/batrifle_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/batrifle_magout.ogg + priority: 2 whitelist: tags: - MagazineRifle gun_chamber: name: Chamber startingItem: CartridgeRifle + priority: 1 whitelist: tags: - CartridgeRifle @@ -151,12 +157,14 @@ startingItem: MagazineRifle insertSound: /Audio/Weapons/Guns/MagIn/ltrifle_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/ltrifle_magout.ogg + priority: 2 whitelist: tags: - MagazineRifle gun_chamber: name: Chamber startingItem: CartridgeRifle + priority: 1 whitelist: tags: - CartridgeRifle diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 17bf1371ba..2ad36f7f6c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -28,12 +28,14 @@ startingItem: MagazinePistolSubMachineGun insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg + priority: 2 whitelist: tags: - MagazinePistolSubMachineGun gun_chamber: name: Chamber startingItem: CartridgePistol + priority: 1 whitelist: tags: - CartridgePistol @@ -116,12 +118,14 @@ startingItem: MagazineMagnumSubMachineGun insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg + priority: 2 whitelist: tags: - MagazineMagnumSubMachineGun gun_chamber: name: Chamber startingItem: CartridgeMagnum + priority: 1 whitelist: tags: - CartridgeMagnum @@ -168,12 +172,14 @@ startingItem: MagazinePistolSubMachineGunTopMounted insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg + priority: 2 whitelist: tags: - MagazinePistolSubMachineGunTopMounted gun_chamber: name: Chamber startingItem: CartridgePistol + priority: 1 whitelist: tags: - CartridgePistol @@ -197,12 +203,14 @@ startingItem: MagazineMagnumSubMachineGunRubber insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg + priority: 2 whitelist: tags: - MagazineMagnumSubMachineGun gun_chamber: name: Chamber startingItem: CartridgeMagnumRubber + priority: 1 whitelist: tags: - CartridgeMagnum diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index a210f7c847..a59d2bb917 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -63,6 +63,7 @@ gun_magazine: name: Magazine startingItem: MagazineShotgun + priority: 2 whitelist: tags: - MagazineShotgun From a75a9219551368436f4fef46810d5ed1e3b99bfd Mon Sep 17 00:00:00 2001 From: KIBORG04 Date: Wed, 15 Jun 2022 08:39:43 +0700 Subject: [PATCH 10/89] Removal interaction without hands (#8843) --- Content.Server/Construction/ConstructionSystem.Guided.cs | 2 +- Content.Server/Cuffs/CuffableSystem.cs | 2 +- .../Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs | 2 +- Content.Server/Kitchen/EntitySystems/SharpSystem.cs | 2 +- Content.Server/Medical/SuitSensors/SuitSensorSystem.cs | 2 +- Content.Server/Sticky/Systems/StickySystem.cs | 2 +- .../Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs | 2 +- .../Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs | 2 +- .../Prototypes/Entities/Structures/Furniture/instruments.yml | 1 + 9 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Content.Server/Construction/ConstructionSystem.Guided.cs b/Content.Server/Construction/ConstructionSystem.Guided.cs index 8d657c5727..b366705774 100644 --- a/Content.Server/Construction/ConstructionSystem.Guided.cs +++ b/Content.Server/Construction/ConstructionSystem.Guided.cs @@ -30,7 +30,7 @@ namespace Content.Server.Construction private void AddDeconstructVerb(EntityUid uid, ConstructionComponent component, GetVerbsEvent args) { - if (!args.CanAccess || !args.CanInteract) + if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; if (component.TargetNode == component.DeconstructionNode || diff --git a/Content.Server/Cuffs/CuffableSystem.cs b/Content.Server/Cuffs/CuffableSystem.cs index a92a921ffd..e3559f5cea 100644 --- a/Content.Server/Cuffs/CuffableSystem.cs +++ b/Content.Server/Cuffs/CuffableSystem.cs @@ -30,7 +30,7 @@ namespace Content.Server.Cuffs private void AddUncuffVerb(EntityUid uid, CuffableComponent component, GetVerbsEvent args) { // Can the user access the cuffs, and is there even anything to uncuff? - if (!args.CanAccess || component.CuffedHandCount == 0) + if (!args.CanAccess || component.CuffedHandCount == 0 || args.Hands == null) return; // We only check can interact if the user is not uncuffing themselves. As a result, the verb will show up diff --git a/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs b/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs index 3b6fc91fdf..af7b7dc370 100644 --- a/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs +++ b/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs @@ -18,7 +18,7 @@ namespace Content.Server.Engineering.EntitySystems } private void AddDisassembleVerb(EntityUid uid, DisassembleOnAltVerbComponent component, GetVerbsEvent args) { - if (!args.CanInteract || !args.CanAccess) + if (!args.CanInteract || !args.CanAccess || args.Hands == null) return; AlternativeVerb verb = new() diff --git a/Content.Server/Kitchen/EntitySystems/SharpSystem.cs b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs index 0ce6da6d0d..918370c949 100644 --- a/Content.Server/Kitchen/EntitySystems/SharpSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs @@ -110,7 +110,7 @@ public sealed class SharpSystem : EntitySystem private void OnGetInteractionVerbs(EntityUid uid, SharedButcherableComponent component, GetVerbsEvent args) { - if (component.Type != ButcheringType.Knife) + if (component.Type != ButcheringType.Knife || args.Hands == null) return; bool disabled = false; diff --git a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs index 6b6bc88f54..c80e1eabd1 100644 --- a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs +++ b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs @@ -138,7 +138,7 @@ namespace Content.Server.Medical.SuitSensors return; // standard interaction checks - if (!args.CanAccess || !args.CanInteract) + if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; args.Verbs.UnionWith(new[] diff --git a/Content.Server/Sticky/Systems/StickySystem.cs b/Content.Server/Sticky/Systems/StickySystem.cs index 6f6376e991..e2c9016100 100644 --- a/Content.Server/Sticky/Systems/StickySystem.cs +++ b/Content.Server/Sticky/Systems/StickySystem.cs @@ -41,7 +41,7 @@ public sealed class StickySystem : EntitySystem private void AddUnstickVerb(EntityUid uid, StickyComponent component, GetVerbsEvent args) { - if (component.StuckTo == null || !component.CanUnstick || !args.CanInteract) + if (component.StuckTo == null || !component.CanUnstick || !args.CanInteract || args.Hands == null) return; // we can't use args.CanAccess, because it stuck in another container diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index 5295861577..b67af7514c 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -50,7 +50,7 @@ public abstract partial class SharedGunSystem private void OnBallisticVerb(EntityUid uid, BallisticAmmoProviderComponent component, GetVerbsEvent args) { - if (!args.CanAccess || !args.CanInteract) return; + if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; args.Verbs.Add(new Verb() { diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs index 13a18ebbde..fb9a4c56bb 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs @@ -98,7 +98,7 @@ public partial class SharedGunSystem private void OnRevolverVerbs(EntityUid uid, RevolverAmmoProviderComponent component, GetVerbsEvent args) { - if (!args.CanAccess || !args.CanInteract) return; + if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; args.Verbs.Add(new Verb() { diff --git a/Resources/Prototypes/Entities/Structures/Furniture/instruments.yml b/Resources/Prototypes/Entities/Structures/Furniture/instruments.yml index 4c7647673a..f321af379f 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/instruments.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/instruments.yml @@ -9,6 +9,7 @@ allowSpectator: false # otherwise they can play client-side music inHandsOnly: false singleUser: true + requireHands: true verbText: verb-instrument-openui key: enum.InstrumentUiKey.Key - type: InteractionOutline From 9ccdc2e234a7a9c107a80667a7d06ecc4947b0d4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 14 Jun 2022 21:40:49 -0400 Subject: [PATCH 11/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c2c8c58f95..b3bcd14dc4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Macoron - changes: - - {message: Guitar and other items now correctly react on quick equipment key (Z - by default)., type: Fix} - id: 1194 - time: '2022-03-12T22:09:11.0000000+00:00' - author: moony changes: - {message: All atmos devices now produce ambient noise when operating., type: Add} @@ -3003,3 +2997,9 @@ Entries: - {message: Tweak pistol firerate from 8 -> 6 and cobra firerate from 8 -> 4., type: Tweak} id: 1693 time: '2022-06-14T07:19:51.0000000+00:00' +- author: KIBORG04 + changes: + - {message: Entities without hands (like mice) can no longer perform some actions., + type: Remove} + id: 1694 + time: '2022-06-15T01:39:43.0000000+00:00' From 6cbf70529015504baf972ac0371cef3bbff61032 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Wed, 15 Jun 2022 16:07:34 +1200 Subject: [PATCH 12/89] Disable lag rand (#8847) --- Content.Shared/Entry/EntryPoint.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Entry/EntryPoint.cs b/Content.Shared/Entry/EntryPoint.cs index 348f8ad3be..d7f9d8374b 100644 --- a/Content.Shared/Entry/EntryPoint.cs +++ b/Content.Shared/Entry/EntryPoint.cs @@ -41,9 +41,13 @@ namespace Content.Shared.Entry #if !FULL_RELEASE var configMan = IoCManager.Resolve(); configMan.OverrideDefault(CVars.NetFakeLagMin, 0.075f); - configMan.OverrideDefault(CVars.NetFakeLagRand, 0.01f); configMan.OverrideDefault(CVars.NetFakeLoss, 0.005f); configMan.OverrideDefault(CVars.NetFakeDuplicates, 0.005f); + + // fake lag rand leads to messages arriving out of order. Sadly, networking is not robust enough, so for now + // just leaving this disabled. + // configMan.OverrideDefault(CVars.NetFakeLagRand, 0.01f); + #endif } From c243edbf33d5f6d3eb7a9c62f8004116d7f0c922 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:14:15 +1000 Subject: [PATCH 13/89] Make doorbumps quiet (#8812) --- Content.Server/Doors/Systems/DoorSystem.cs | 2 +- Content.Shared/Doors/Systems/SharedDoorSystem.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Server/Doors/Systems/DoorSystem.cs b/Content.Server/Doors/Systems/DoorSystem.cs index f2f635618b..2c7dd7b715 100644 --- a/Content.Server/Doors/Systems/DoorSystem.cs +++ b/Content.Server/Doors/Systems/DoorSystem.cs @@ -305,7 +305,7 @@ public sealed class DoorSystem : SharedDoorSystem foreach (var other in PhysicsSystem.GetCollidingEntities(body)) { if (Tags.HasTag(other.Owner, "DoorBumpOpener") && - TryOpen(component.Owner, component, other.Owner)) break; + TryOpen(component.Owner, component, other.Owner, false, quiet: true)) break; } } } diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index d91185ac17..06baab6635 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -219,12 +219,12 @@ public abstract class SharedDoorSystem : EntitySystem #endregion #region Opening - public bool TryOpen(EntityUid uid, DoorComponent? door = null, EntityUid? user = null, bool predicted = false) + public bool TryOpen(EntityUid uid, DoorComponent? door = null, EntityUid? user = null, bool predicted = false, bool quiet = false) { if (!Resolve(uid, ref door)) return false; - if (!CanOpen(uid, door, user, false)) + if (!CanOpen(uid, door, user, quiet)) return false; StartOpening(uid, door, user, predicted); From b4ecf8a7ec072ab7b6dac6a2e8904ad4128b714e Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Wed, 15 Jun 2022 03:04:52 -0400 Subject: [PATCH 14/89] Syndicate gas mask flash protection (#8818) * Syndicate gas masks protect from flashbangs * fix var name * update to loop through all slots * update based on review comments --- Content.Server/Flash/FlashSystem.cs | 13 +++++++------ .../Prototypes/Entities/Clothing/Masks/masks.yml | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index e3df2eb3e0..a8ababd66b 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -195,12 +195,13 @@ namespace Content.Server.Flash private void OnInventoryFlashAttempt(EntityUid uid, InventoryComponent component, FlashAttemptEvent args) { - // Forward the event to a worn helmet, if one is equipped. - if (_inventorySystem.TryGetSlotEntity(uid, "head", out var maskSlotEntity, component)) - RaiseLocalEvent(maskSlotEntity.Value, args); - // Forward the event to the glasses, if any. - if(!args.Cancelled && _inventorySystem.TryGetSlotEntity(uid, "eyes", out var eyeSlotEntity, component)) - RaiseLocalEvent(eyeSlotEntity.Value, args); + foreach (var slot in new string[]{"head", "eyes", "mask"}) + { + if (args.Cancelled) + break; + if (_inventorySystem.TryGetSlotEntity(uid, slot, out var item, component)) + RaiseLocalEvent(item.Value, args); + } } private void OnFlashImmunityFlashAttempt(EntityUid uid, FlashImmunityComponent component, FlashAttemptEvent args) diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index 82efdc12b0..ef5d73db85 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -42,6 +42,7 @@ - type: IngestionBlocker - type: DiseaseProtection protection: 0.05 + - type: FlashImmunity - type: entity parent: ClothingMaskBase From 0dc8b85ec1b935b7cef1211760bdcc799cb36695 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 15 Jun 2022 17:05:35 +1000 Subject: [PATCH 15/89] Fix grenade whitelists (#8851) --- .../Entities/Objects/Weapons/Guns/Ammunition/explosives.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml index 6a6e3d07e0..74fd97b508 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/explosives.yml @@ -89,7 +89,7 @@ - type: entity id: GrenadeFlash name: flash grenade - parent: BaseItem + parent: BaseGrenade components: - type: CartridgeAmmo proto: BulletGrenadeFlash @@ -106,7 +106,7 @@ - type: entity id: GrenadeFrag name: frag grenade - parent: BaseItem + parent: BaseGrenade components: - type: CartridgeAmmo proto: BulletGrenadeFrag From 1d6d5619373026c8f6cd3ddcd2908f7fc4630426 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 15 Jun 2022 03:05:57 -0400 Subject: [PATCH 16/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b3bcd14dc4..27b6d7b244 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: moony - changes: - - {message: All atmos devices now produce ambient noise when operating., type: Add} - - {message: Wiring now has mains hum., type: Add} - - {message: Atmos piping has gas movement noise., type: Add} - - {message: 'Ambient audio volume levels have been raised, so you can hear them - without an explosion blowing your eardrums out.', type: Tweak} - id: 1195 - time: '2022-03-12T22:20:31.0000000+00:00' - author: TaralGit changes: - {message: Pulse carbine and pistol for ERT, type: Add} @@ -3003,3 +2994,8 @@ Entries: type: Remove} id: 1694 time: '2022-06-15T01:39:43.0000000+00:00' +- author: themias + changes: + - {message: Syndie gas masks now provide protection from flashbangs, type: Tweak} + id: 1695 + time: '2022-06-15T07:04:53.0000000+00:00' From 275837735192e727ff17b9c4351d159ff3824c2e Mon Sep 17 00:00:00 2001 From: Flipp Syder <76629141+vulppine@users.noreply.github.com> Date: Wed, 15 Jun 2022 00:40:32 -0700 Subject: [PATCH 17/89] fixes static not appearing inbetween camera changes client-side (#8846) --- .../SurveillanceCameraMonitorSystem.cs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Content.Client/SurveillanceCamera/SurveillanceCameraMonitorSystem.cs b/Content.Client/SurveillanceCamera/SurveillanceCameraMonitorSystem.cs index 31fe357427..c946062128 100644 --- a/Content.Client/SurveillanceCamera/SurveillanceCameraMonitorSystem.cs +++ b/Content.Client/SurveillanceCamera/SurveillanceCameraMonitorSystem.cs @@ -4,8 +4,6 @@ namespace Content.Client.SurveillanceCamera; public sealed class SurveillanceCameraMonitorSystem : EntitySystem { - private readonly RemQueue _toRemove = new(); - public override void Update(float frameTime) { foreach (var comp in EntityQuery()) @@ -24,16 +22,9 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem comp.OnFinish(); } - _toRemove.Add(comp.Owner); + EntityManager.RemoveComponentDeferred(comp.Owner); } } - - foreach (var uid in _toRemove) - { - EntityManager.RemoveComponent(uid); - } - - _toRemove.List?.Clear(); } public void AddTimer(EntityUid uid, Action onFinish) From e9a6f6dd9352bca833f7ceec8c5e47bcf2e92c95 Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Wed, 15 Jun 2022 14:27:45 -0600 Subject: [PATCH 18/89] 39 buried 0 found (#8856) --- .../Entities/Structures/Doors/Airlocks/access.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 178cb78d8d..1b56833ff6 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -666,3 +666,11 @@ components: - type: AccessReader access: [["Captain"]] + +- type: entity + parent: HighSecDoor + id: HighSecArmoryLocked + suffix: Armory, Locked + components: + - type: AccessReader + access: [["Armory"]] From 9be066a8cb7bacbe19554ed55fc4d6f34703fec9 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Wed, 15 Jun 2022 20:53:26 -0400 Subject: [PATCH 19/89] The Rat King [Antag] (#8706) * vending machine go spit * who's da rat, bozo * fixes * crown + fixes * aaaa * aa * lololol * removing vending shit + most annoying fix alive * paul review * moony fixes * sloth review * Minor diseasesystem fix * inverse moment * A * Also reduce args allocations Co-authored-by: metalgearsloth --- .../Components/DiseaseCarrierComponent.cs | 20 +- Content.Server/Disease/DiseaseSystem.cs | 32 ++- Content.Server/RatKing/RatKingComponent.cs | 54 +++++ Content.Server/RatKing/RatKingSystem.cs | 93 +++++++++ .../StationEvents/Events/MouseMigration.cs | 50 +++++ .../en-US/animals/rat-king/rat-king.ftl | 8 + .../station-events/events/mouse-migration.ftl | 1 + Resources/Prototypes/Diseases/infectious.yml | 25 +++ .../Entities/Clothing/Head/misc.yml | 13 ++ .../Entities/Mobs/NPCs/regalrat.yml | 189 ++++++++++++++++++ .../Misc/fancycrown.rsi/equipped-HELMET.png | Bin 0 -> 251 bytes .../Head/Misc/fancycrown.rsi/icon.png | Bin 0 -> 598 bytes .../Head/Misc/fancycrown.rsi/meta.json | 18 ++ .../Textures/Interface/Actions/meta.json | 8 +- .../Interface/Actions/ratKingArmy.png | Bin 0 -> 388 bytes .../Interface/Actions/ratKingDomain.png | Bin 0 -> 658 bytes .../Mobs/Animals/mouse.rsi/dead-3.png | Bin 0 -> 431 bytes .../Mobs/Animals/mouse.rsi/icon-3.png | Bin 0 -> 404 bytes .../Textures/Mobs/Animals/mouse.rsi/meta.json | 35 ++++ .../Mobs/Animals/mouse.rsi/mouse-3.png | Bin 0 -> 1493 bytes .../Mobs/Animals/mouse.rsi/splat-3.png | Bin 0 -> 535 bytes .../Mobs/Animals/regalrat.rsi/dead.png | Bin 0 -> 1207 bytes .../Mobs/Animals/regalrat.rsi/icon.png | Bin 0 -> 1285 bytes .../Mobs/Animals/regalrat.rsi/meta.json | 21 ++ .../Mobs/Animals/regalrat.rsi/regalrat.png | Bin 0 -> 3397 bytes 25 files changed, 553 insertions(+), 14 deletions(-) create mode 100644 Content.Server/RatKing/RatKingComponent.cs create mode 100644 Content.Server/RatKing/RatKingSystem.cs create mode 100644 Content.Server/StationEvents/Events/MouseMigration.cs create mode 100644 Resources/Locale/en-US/animals/rat-king/rat-king.ftl create mode 100644 Resources/Locale/en-US/station-events/events/mouse-migration.ftl create mode 100644 Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml create mode 100644 Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/meta.json create mode 100644 Resources/Textures/Interface/Actions/ratKingArmy.png create mode 100644 Resources/Textures/Interface/Actions/ratKingDomain.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/dead-3.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/icon-3.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/mouse-3.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/splat-3.png create mode 100644 Resources/Textures/Mobs/Animals/regalrat.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/regalrat.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Animals/regalrat.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/regalrat.rsi/regalrat.png diff --git a/Content.Server/Disease/Components/DiseaseCarrierComponent.cs b/Content.Server/Disease/Components/DiseaseCarrierComponent.cs index e9280235f3..56c71b46bc 100644 --- a/Content.Server/Disease/Components/DiseaseCarrierComponent.cs +++ b/Content.Server/Disease/Components/DiseaseCarrierComponent.cs @@ -1,13 +1,14 @@ using System.Linq; using Content.Shared.Disease; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; namespace Content.Server.Disease.Components { - [RegisterComponent] /// - /// Allows the enity to be infected with diseases. + /// Allows the entity to be infected with diseases. /// Please use only on mobs. /// + [RegisterComponent] public sealed class DiseaseCarrierComponent : Component { /// @@ -15,22 +16,33 @@ namespace Content.Server.Disease.Components /// [ViewVariables(VVAccess.ReadWrite)] public List Diseases = new(); + /// /// The carrier's resistance to disease /// [DataField("diseaseResist")] [ViewVariables(VVAccess.ReadWrite)] public float DiseaseResist = 0f; + /// /// Diseases the carrier has had, used for immunity. - /// + /// [ViewVariables(VVAccess.ReadWrite)] public List PastDiseases = new(); + /// /// All the diseases the carrier has or has had. /// Checked against when trying to add a disease - /// + /// [ViewVariables(VVAccess.ReadWrite)] public List AllDiseases => PastDiseases.Concat(Diseases).ToList(); + + /// + /// A list of diseases which the entity does not + /// exhibit direct symptoms from. They still transmit + /// these diseases, just without symptoms. + /// + [ViewVariables, DataField("carrierDiseases", customTypeSerializer: typeof(PrototypeIdHashSetSerializer))] + public HashSet? CarrierDiseases; } } diff --git a/Content.Server/Disease/DiseaseSystem.cs b/Content.Server/Disease/DiseaseSystem.cs index 97367115df..f55ee6b03d 100644 --- a/Content.Server/Disease/DiseaseSystem.cs +++ b/Content.Server/Disease/DiseaseSystem.cs @@ -96,17 +96,23 @@ namespace Content.Server.Disease for (var i = 0; i < carrierComp.Diseases.Count; i++) //this is a for-loop so that it doesn't break when new diseases are added { var disease = carrierComp.Diseases[i]; - - var args = new DiseaseEffectArgs(carrierComp.Owner, disease, EntityManager); disease.Accumulator += frameTime; - if (disease.Accumulator >= disease.TickTime) + + if (disease.Accumulator < disease.TickTime) continue; + + // if the disease is on the silent disease list, don't do effects + var doEffects = carrierComp.CarrierDiseases?.Contains(disease.ID) != true; + var args = new DiseaseEffectArgs(carrierComp.Owner, disease, EntityManager); + disease.Accumulator -= disease.TickTime; + + foreach (var cure in disease.Cures) + { + if (cure.Cure(args)) + CureDisease(carrierComp, disease); + } + + if (doEffects) { - disease.Accumulator -= disease.TickTime; - foreach (var cure in disease.Cures) - { - if (cure.Cure(args)) - CureDisease(carrierComp, disease); - } foreach (var effect in disease.Effects) { if (_random.Prob(effect.Probability)) @@ -383,6 +389,14 @@ namespace Content.Server.Disease TryAddDisease(carrier.Owner, disease, carrier); } + public void TryInfect(DiseaseCarrierComponent carrier, string? disease, float chance = 0.7f, bool forced = false) + { + if (disease == null || !_prototypeManager.TryIndex(disease, out var d)) + return; + + TryInfect(carrier, d, chance, forced); + } + /// /// Plays a sneeze/cough popup if applicable /// and then tries to infect anyone in range diff --git a/Content.Server/RatKing/RatKingComponent.cs b/Content.Server/RatKing/RatKingComponent.cs new file mode 100644 index 0000000000..4685d14cf2 --- /dev/null +++ b/Content.Server/RatKing/RatKingComponent.cs @@ -0,0 +1,54 @@ +using Content.Shared.Actions.ActionTypes; +using Content.Shared.Disease; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.RatKing +{ + [RegisterComponent] + public sealed class RatKingComponent : Component + { + /// + /// The action for the Raise Army ability + /// + [DataField("actionRaiseArmy", required: true)] + public InstantAction ActionRaiseArmy = new(); + + /// + /// The amount of hunger one use of Raise Army consumes + /// + [ViewVariables(VVAccess.ReadWrite), DataField("hungerPerArmyUse", required: true)] + public float HungerPerArmyUse = 25f; + + /// + /// The entity prototype of the mob that Raise Army summons + /// + [ViewVariables(VVAccess.ReadWrite), DataField("armyMobSpawnId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ArmyMobSpawnId = "MobRatServant"; + + /// + /// The action for the Domain ability + /// + [ViewVariables, DataField("actionDomain", required: true)] + public InstantAction ActionDomain = new(); + + /// + /// The amount of hunger one use of Domain consumes + /// + [ViewVariables(VVAccess.ReadWrite), DataField("hungerPerDomainUse", required: true)] + public float HungerPerDomainUse = 50f; + + /// + /// The disease prototype id that the Domain ability spreads + /// + [ViewVariables, DataField("domainDiseaseId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DomainDiseaseId = "Plague"; + + /// + /// The range of the Domain ability. + /// + [ViewVariables(VVAccess.ReadWrite), DataField("domainRange")] + public float DomainRange = 3f; + + } +}; diff --git a/Content.Server/RatKing/RatKingSystem.cs b/Content.Server/RatKing/RatKingSystem.cs new file mode 100644 index 0000000000..c39dd090ad --- /dev/null +++ b/Content.Server/RatKing/RatKingSystem.cs @@ -0,0 +1,93 @@ +using Content.Server.Actions; +using Content.Server.Disease; +using Content.Server.Disease.Components; +using Content.Server.Nutrition.Components; +using Content.Server.Popups; +using Content.Shared.Actions; +using Robust.Shared.Player; + +namespace Content.Server.RatKing +{ + public sealed class RatKingSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly ActionsSystem _action = default!; + [Dependency] private readonly DiseaseSystem _disease = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + + SubscribeLocalEvent(OnRaiseArmy); + SubscribeLocalEvent(OnDomain); + } + + private void OnStartup(EntityUid uid, RatKingComponent component, ComponentStartup args) + { + _action.AddAction(uid, component.ActionRaiseArmy, null); + _action.AddAction(uid, component.ActionDomain, null); + } + + /// + /// Summons an allied rat servant at the King, costing a small amount of hunger + /// + private void OnRaiseArmy(EntityUid uid, RatKingComponent component, RatKingRaiseArmyActionEvent args) + { + if (args.Handled) + return; + + if (!TryComp(uid, out var hunger)) + return; + + //make sure the hunger doesn't go into the negatives + if (hunger.CurrentHunger < component.HungerPerArmyUse) + { + _popup.PopupEntity(Loc.GetString("rat-king-too-hungry"), uid, Filter.Entities(uid)); + return; + } + args.Handled = true; + hunger.CurrentHunger -= component.HungerPerArmyUse; + Spawn(component.ArmyMobSpawnId, Transform(uid).Coordinates); //spawn the little mouse boi + } + + /// + /// Gets all of the nearby disease-carrying entities in a radius + /// and gives them the specified disease. It has a hunger cost as well + /// + private void OnDomain(EntityUid uid, RatKingComponent component, RatKingDomainActionEvent args) + { + if (args.Handled) + return; + + if (!TryComp(uid, out var hunger)) + return; + + //make sure the hunger doesn't go into the negatives + if (hunger.CurrentHunger < component.HungerPerDomainUse) + { + _popup.PopupEntity(Loc.GetString("rat-king-too-hungry"), uid, Filter.Entities(uid)); + return; + } + args.Handled = true; + hunger.CurrentHunger -= component.HungerPerDomainUse; + + _popup.PopupEntity(Loc.GetString("rat-king-domain-popup"), uid, Filter.Pvs(uid, default, EntityManager)); + + var tstalker = GetEntityQuery(); + foreach (var entity in _lookup.GetEntitiesInRange(uid, component.DomainRange)) //go through all of them, filtering only those in range that are not the king itself + { + if (entity == uid) + continue; + + if (tstalker.TryGetComponent(entity, out var diseasecomp)) + _disease.TryInfect(diseasecomp, component.DomainDiseaseId); //infect them with w/e disease + } + } + } + + public sealed class RatKingRaiseArmyActionEvent : InstantActionEvent { }; + public sealed class RatKingDomainActionEvent : InstantActionEvent { }; +}; diff --git a/Content.Server/StationEvents/Events/MouseMigration.cs b/Content.Server/StationEvents/Events/MouseMigration.cs new file mode 100644 index 0000000000..ee831de699 --- /dev/null +++ b/Content.Server/StationEvents/Events/MouseMigration.cs @@ -0,0 +1,50 @@ +using System.Linq; +using Content.Server.StationEvents.Components; +using Robust.Shared.Random; + +namespace Content.Server.StationEvents.Events; + +public sealed class MouseMigration : StationEvent +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + + public static List SpawnedPrototypeChoices = new List() //we double up for that ez fake probability + {"MobMouse", "MobMouse1", "MobMouse2", "MobRatServant"}; + + public override string Name => "MouseMigration"; + + public override string? StartAnnouncement => + Loc.GetString("station-event-mouse-migration-announcement"); + + public override int EarliestStart => 30; + + public override int MinimumPlayers => 35; //this just ensures that it doesn't spawn on lowpop maps. + + public override float Weight => WeightLow; + + public override int? MaxOccurrences => 1; + + protected override float StartAfter => 30f; + + protected override float EndAfter => 60; + + public override void Startup() + { + base.Startup(); + + var spawnLocations = _entityManager.EntityQuery().ToList(); + _random.Shuffle(spawnLocations); + + var spawnAmount = _random.Next(7, 15); // A small colony of critters. + + for (int i = 0; i < spawnAmount && i < spawnLocations.Count - 1; i++) + { + var spawnChoice = _random.Pick(SpawnedPrototypeChoices); + if (_random.Prob(0.01f) || i == 0) //small chance for multiple, but always at least 1 + spawnChoice = "MobRatKing"; + + _entityManager.SpawnEntity(spawnChoice, spawnLocations[i].Item2.Coordinates); + } + } +} diff --git a/Resources/Locale/en-US/animals/rat-king/rat-king.ftl b/Resources/Locale/en-US/animals/rat-king/rat-king.ftl new file mode 100644 index 0000000000..35354daa08 --- /dev/null +++ b/Resources/Locale/en-US/animals/rat-king/rat-king.ftl @@ -0,0 +1,8 @@ +rat-king-raise-army-name = Raise Army +rat-king-raise-army-description = Spend some hunger to summon an allied rat to help defend you. + +rat-king-domain-name = Rat King's Domain +rat-king-domain-description = Spend some hunger to infect those around you with the plague. +rat-king-domain-popup = A cloud of plague is released into the air! + +rat-king-too-hungry = You are too hungry to use this ability! \ No newline at end of file diff --git a/Resources/Locale/en-US/station-events/events/mouse-migration.ftl b/Resources/Locale/en-US/station-events/events/mouse-migration.ftl new file mode 100644 index 0000000000..98a86ca153 --- /dev/null +++ b/Resources/Locale/en-US/station-events/events/mouse-migration.ftl @@ -0,0 +1 @@ +station-event-mouse-migration-announcement = We have detected an oncoming migration of rodents to the station. Please stay out of maintenance tunnels and try and avoid excessive contact. \ No newline at end of file diff --git a/Resources/Prototypes/Diseases/infectious.yml b/Resources/Prototypes/Diseases/infectious.yml index 067ce166b6..58f222c1f3 100644 --- a/Resources/Prototypes/Diseases/infectious.yml +++ b/Resources/Prototypes/Diseases/infectious.yml @@ -168,6 +168,31 @@ - !type:DiseaseReagentCure reagent: DemonsBlood +- type: disease + id: Plague + name: plague + cureResist: 0.1 + effects: + - !type:DiseaseVomit + probability: 0.005 + - !type:DiseasePopUp + probability: 0.025 + - !type:DiseaseSnough + probability: 0.025 + snoughMessage: disease-cough + snoughSound: + collection: Coughs + - !type:DiseaseHealthChange + probability: 0.05 + damage: + types: + Poison: 2 + cures: + - !type:DiseaseBedrestCure + maxLength: 120 + - !type:DiseaseJustWaitCure + maxLength: 240 + - type: disease id: OwOnavirus name: OwOnavirus diff --git a/Resources/Prototypes/Entities/Clothing/Head/misc.yml b/Resources/Prototypes/Entities/Clothing/Head/misc.yml index 915c43b47f..cdbba6024d 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/misc.yml @@ -112,6 +112,19 @@ - type: Clothing sprite: Clothing/Head/Misc/cone.rsi +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatFancyCrown + name: fancy crown + description: It smells like dead rat. + components: + - type: Sprite + sprite: Clothing/Head/Misc/fancycrown.rsi + - type: Clothing + sprite: Clothing/Head/Misc/fancycrown.rsi + - type: MobPrice + price: 3000 + - type: entity parent: ClothingHeadBase id: ClothingHeadHatCatEars diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml new file mode 100644 index 0000000000..c6aa09c805 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -0,0 +1,189 @@ +- type: entity + name: Rat King + id: MobRatKing + parent: SimpleMobBase + description: He's da rat. He make da roolz. + components: + - type: CombatMode + - type: MovementSpeedModifier + baseWalkSpeed : 3.75 + baseSprintSpeed : 3.75 + - type: UtilityAI + behaviorSets: + - Idle + - UnarmedAttackHostiles + - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + - type: AiFactionTag + factions: + - SimpleHostile + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Animals/regalrat.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: regalrat + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.25 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 150: !type:CriticalMobState {} + 200: !type:DeadMobState {} + - type: MeleeWeapon + range: 1 + arcwidth: 0 + arc: claw + damage: + types: + Slash: 12 + Piercing: 8 + - type: Appearance + visuals: + - type: DamageStateVisualizer + rotate: true + normal: regalrat + crit: dead + dead: dead + - type: Puller + - type: GhostTakeoverAvailable + makeSentient: true + name: Rat King + description: You are the Rat King, scavenge food in order to produce rat minions to do your bidding. + rules: You are an antagonist, scavenge, attack, and grow your hoarde! + - type: Tag + tags: + - CannotSuicide + - DoorBumpOpener + - FootstepSound + - type: NoSlip + - type: RatKing + actionRaiseArmy: + useDelay: 4 + icon: Interface/Actions/ratKingArmy.png + name: rat-king-raise-army-name + description: rat-king-raise-army-description + itemIconStyle: NoItem + event: !type:RatKingRaiseArmyActionEvent + hungerPerArmyUse: 25 + actionDomain: + useDelay: 10 + icon: Interface/Actions/ratKingDomain.png + name: rat-king-domain-name + description: rat-king-domain-description + itemIconStyle: NoItem + event: !type:RatKingDomainActionEvent + hungerPerDomainUse: 50 + - type: Access #he's so baller he gets his own access. NT got nothing on him + tags: + - Maintenance + - Service + - type: Butcherable + spawned: + - id: ClothingHeadHatFancyCrown #how did that get there? + amount: 1 + - type: DiseaseCarrier + carrierDiseases: + - Plague + - type: SlowOnDamage + speedModifierThresholds: + 50: 0.9 + 75: 0.8 + 100: 0.7 + - type: MobPrice + price: 2500 # rat wealth + +- type: entity + name: Rat Servant + id: MobRatServant + parent: SimpleMobBase + description: He's da mini rat. He don't make da roolz. + components: + - type: CombatMode + - type: MovementSpeedModifier + baseWalkSpeed : 4 + baseSprintSpeed : 4 + - type: UtilityAI + behaviorSets: + - Idle + - UnarmedAttackHostiles + - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + - type: AiFactionTag + factions: + - SimpleHostile + - type: Sprite + drawdepth: SmallMobs + sprite: Mobs/Animals/mouse.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: mouse-3 + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.2 + mass: 10 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 25: !type:CriticalMobState {} + 50: !type:DeadMobState {} + - type: MeleeWeapon + range: 1 + arcwidth: 0 + arc: claw + damage: + types: + Slash: 5 + Piercing: 2 + - type: Appearance + visuals: + - type: DamageStateVisualizer + rotate: true + normal: mouse-3 + crit: dead-3 + dead: splat-3 + - type: Puller + - type: DiseaseCarrier + carrierDiseases: + - Plague + - type: Vocal + # mice are gender neutral who cares + maleScream: /Audio/Animals/mouse_squeak.ogg + femaleScream: /Audio/Animals/mouse_squeak.ogg + wilhelmProbability: 0.001 + - type: GhostTakeoverAvailable + makeSentient: true + name: Rat Servant + description: You are a Rat Servant. You must follow your king's orders. + rules: You are an antagonist, scavenge, attack, and serve your king! + - type: Tag + tags: + - CannotSuicide + - DoorBumpOpener + - FootstepSound + - type: NoSlip + - type: MobPrice + price: 500 # rat wealth + diff --git a/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..e44fd7e7e2be2a1bd9d6352919d32aef4fcb07d8 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|wtBiahE&XX zduyR!tAmL1Mf3ffSNL=j7Ak8wT{!ryVTqtl5_g24O!GejmxBJtqbh7u#S5KvBg^;g zKRqknJ1lZ?jOv=7leU~+yY7AZC)G^v=4s1rT)kkX}z$KbLh*2~7ajMP`)% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/icon.png b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f656459ea61b9aebd350703169ef8439fb1e24f6 GIT binary patch literal 598 zcmV-c0;&CpP)Px%5J^NqR9J=Wm9cBvKorJ*HgyNn455QbsIWa0Oon2-wT40`8%|It8Tu~-G8CM_ zv~w3jp+m3-uN{mDfr1LnU^;2_&_M*Ulp2!3gd1u+#HQCF+;OT?OKD=V=!4^-?@sr< z`|jxp5+q1)1Jp|eb*JJp*;jXxgcg^+qsHC*jgmLM#Vr)hTCBK8EJjdLw+Gv%k}5DFDUI+kJfit*rq60076w073r%i9!>#RT+((wYazdr?t$gssNpx z0FjXZe=`8$WAf<$0004WQchC4}r-&B#ap6?r7*{$Knq?Vj53k@ZA!RQo+ynfe`utfMkVmESf05?6E8a z%Nk%2v@Ey)cs|Xun1Gk+0A`|Wr!!PF>Lz>2+q>ZG^@SXx(i(f~0=X6EcN#W%NryoI9} zq*3uGO^X$x84<;7Ra<@UGqCAL#YOY+mrTyR%Cl6;fW7JO`LG?p^!PMy0mFX)=QveE iRs+>Q_WW-nebFBxrx4r=Q{prL00006TB<^TWBb~3tZEwIGUp0K;?d??hZGymjx|L&;h zg*gBA)Tq11lvE=U&a8|80004WQchCmDPcN3#$)I0Uc9^B z+;u13hi&>(jD5$_Z^0bE%ys9UZ8*L^^{37NfFOjA(#^y zhAaRQMKRU~IYK0)3nl1RlEm>aUsA>?4cT`<(*(#R$ySaNWM;gl6b4~4FFMqfTQkUJYZy(=Q2$q4e~+&C_!WZph6Kwq}<6}8fh8i zrD`aJDE2`35(puwOl6Wr*}f1EDF6>>5mi-lzLa^M14*Nz8;ic7Y)a8ob=6h~$zLE* z)O5qH;cyf+h+2JbDSxZ_m>*Ctx`wvT5mHrs!=WE+jt%YUw`-3Lo6|tu(wz4Djz*mK sJ5e;^DhDB&;&45<``E1v|Iml$4~nQd;i1%iN&o-=07*qoM6N<$f+`I#M*si- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/dead-3.png b/Resources/Textures/Mobs/Animals/mouse.rsi/dead-3.png new file mode 100644 index 0000000000000000000000000000000000000000..63c0d553acf74db1e0bd709cecbbc44e494be331 GIT binary patch literal 431 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/regalrat.rsi/meta.json b/Resources/Textures/Mobs/Animals/regalrat.rsi/meta.json new file mode 100644 index 0000000000..98a5d7e891 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/regalrat.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "dead" + }, + { + "name": "icon" + }, + { + "name": "regalrat", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/regalrat.rsi/regalrat.png b/Resources/Textures/Mobs/Animals/regalrat.rsi/regalrat.png new file mode 100644 index 0000000000000000000000000000000000000000..340c0b46dd4a5a6fe0913226bb4d030cf4f09706 GIT binary patch literal 3397 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 bEyI5S*=LKja|k+G00000NkvXXu0mjf3cHOO literal 0 HcmV?d00001 From 2fc638636b67f16dc112d184b14b821ab7077762 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 15 Jun 2022 20:54:30 -0400 Subject: [PATCH 20/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 27b6d7b244..ec840aad69 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: TaralGit - changes: - - {message: Pulse carbine and pistol for ERT, type: Add} - - {message: Pulse hitscan projectile, type: Add} - - {message: The Lamia handgun is now using its own sprite instead of the gyropistol's, - type: Tweak} - - {message: A whole bunch of resprites for various guns and melee weapons, type: Tweak} - id: 1196 - time: '2022-03-12T22:29:17.0000000+00:00' - author: DogZeroX changes: - {message: There's intel of an unknown enemy corp creating experimental mechas @@ -2999,3 +2990,9 @@ Entries: - {message: Syndie gas masks now provide protection from flashbangs, type: Tweak} id: 1695 time: '2022-06-15T07:04:53.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Added the Rat King. This regal rodent wants your food and will summon + minions and spread plague in order to get it., type: Add} + id: 1696 + time: '2022-06-16T00:53:27.0000000+00:00' From 2e6b9960378fba5f837f395f9aa8e293f98c9d83 Mon Sep 17 00:00:00 2001 From: Delete69 <95458399+Delete69@users.noreply.github.com> Date: Wed, 15 Jun 2022 19:02:51 -0600 Subject: [PATCH 21/89] Increase fireplace brightness and radius (#8870) --- .../Prototypes/Entities/Structures/Decoration/fireplace.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml b/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml index 6273331230..2459c69b53 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml @@ -14,6 +14,6 @@ - state: fireplace_glow shader: unshaded - type: PointLight - radius: 1.5 - energy: 1.6 + radius: 3 + energy: 3 color: "#FF6F00" From d5630e683d78a159c5ac6e0fc6c573400cde25c7 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 15 Jun 2022 21:03:54 -0400 Subject: [PATCH 22/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ec840aad69..84303cdb43 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: DogZeroX - changes: - - {message: There's intel of an unknown enemy corp creating experimental mechas - and testing them on stations., type: Add} - id: 1197 - time: '2022-03-12T23:14:17.0000000+00:00' - author: Macoron changes: - {message: Add lizard accent. Hissss!, type: Add} @@ -2996,3 +2990,8 @@ Entries: minions and spread plague in order to get it., type: Add} id: 1696 time: '2022-06-16T00:53:27.0000000+00:00' +- author: Delete + changes: + - {message: Fireplaces provide useful light, type: Add} + id: 1697 + time: '2022-06-16T01:02:51.0000000+00:00' From e5bad81ac4c4fbb429e786792a4824b37ed0ad1e Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Wed, 15 Jun 2022 21:10:03 -0400 Subject: [PATCH 23/89] Can't break other people's drags on cuffed people (#8868) * works on my machine * speedrun --- Content.Shared/Cuffs/SharedCuffableSystem.cs | 11 +++++++++++ .../Pulling/Events/BeingPulledAttemptEvent.cs | 17 +++++++++++++++++ .../Systems/SharedPullingSystem.Actions.cs | 4 +++- 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 403a177110..895ba9b831 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.Item; using Content.Shared.Movement; using Content.Shared.Physics.Pull; using Content.Shared.Pulling.Components; +using Content.Shared.Pulling.Events; namespace Content.Shared.Cuffs { @@ -25,10 +26,20 @@ namespace Content.Shared.Cuffs SubscribeLocalEvent(OnUnequipAttempt); SubscribeLocalEvent(OnDropAttempt); SubscribeLocalEvent(OnPickupAttempt); + SubscribeLocalEvent(OnBeingPulledAttempt); SubscribeLocalEvent(OnPull); SubscribeLocalEvent(OnPull); } + + private void OnBeingPulledAttempt(EntityUid uid, SharedCuffableComponent component, BeingPulledAttemptEvent args) + { + if (!TryComp(uid, out var pullable)) + return; + + if (pullable.Puller != null && !component.CanStillInteract) // If we are being pulled already and cuffed, we can't get pulled again. + args.Cancel(); + } private void OnPull(EntityUid uid, SharedCuffableComponent component, PullMessage args) { if (!component.CanStillInteract) diff --git a/Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs b/Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs new file mode 100644 index 0000000000..6a3089c749 --- /dev/null +++ b/Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs @@ -0,0 +1,17 @@ +namespace Content.Shared.Pulling.Events +{ + /// + /// Directed event raised on the pulled to see if it can be pulled. + /// + public sealed class BeingPulledAttemptEvent : CancellableEntityEventArgs + { + public BeingPulledAttemptEvent(EntityUid puller, EntityUid pulled) + { + Puller = puller; + Pulled = pulled; + } + + public EntityUid Puller { get; } + public EntityUid Pulled { get; } + } +} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs index 1daa0ec9cf..c73694d7ee 100644 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs +++ b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs @@ -55,9 +55,11 @@ namespace Content.Shared.Pulling } } + var getPulled = new BeingPulledAttemptEvent(puller, pulled); + RaiseLocalEvent(pulled, getPulled); var startPull = new StartPullAttemptEvent(puller, pulled); RaiseLocalEvent(puller, startPull); - return !startPull.Cancelled; + return (!startPull.Cancelled && !getPulled.Cancelled); } public bool TogglePull(EntityUid puller, SharedPullableComponent pullable) From 5e00d8356995f5afc5d36a6850bfce8b768a23bf Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 15 Jun 2022 21:11:06 -0400 Subject: [PATCH 24/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 84303cdb43..274eaa1390 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: Macoron - changes: - - {message: Add lizard accent. Hissss!, type: Add} - id: 1198 - time: '2022-03-13T04:23:44.0000000+00:00' - author: Rane changes: - {message: Drones now have an innate flashlight., type: Add} @@ -2995,3 +2990,9 @@ Entries: - {message: Fireplaces provide useful light, type: Add} id: 1697 time: '2022-06-16T01:02:51.0000000+00:00' +- author: Rane + changes: + - {message: 'You can no longer break pulls on cuffed people if someone else is pulling. + Sorry griefers, maybe sec will be tolerable to play now.', type: Tweak} + id: 1698 + time: '2022-06-16T01:10:03.0000000+00:00' From c210239f45eb3d431720743cff83778be5e2f294 Mon Sep 17 00:00:00 2001 From: CrudeWax <75271456+CrudeWax@users.noreply.github.com> Date: Thu, 16 Jun 2022 07:14:06 +0300 Subject: [PATCH 25/89] Fishy swarmers: Carp content and Space Dragon! (#7395) Co-authored-by: mirrorcult Co-authored-by: metalgearsloth Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../MobState/DamageStateVisualizer.cs | 109 ----- .../MobState/DamageStateVisualizerSystem.cs | 57 +++ .../MobState/DamageStateVisualsComponent.cs | 22 ++ Content.Server/Dragon/DragonComponent.cs | 80 ++++ Content.Server/Dragon/DragonSystem.cs | 188 +++++++++ Content.Server/Entry/IgnoredComponents.cs | 1 + Resources/Audio/Animals/license.txt | 39 +- Resources/Audio/Animals/space_dragon_roar.ogg | Bin 0 -> 52920 bytes Resources/Audio/Effects/demon_attack1.ogg | Bin 0 -> 21106 bytes Resources/Audio/Effects/demon_consume.ogg | Bin 0 -> 25976 bytes Resources/Audio/Effects/demon_dies.ogg | Bin 0 -> 51445 bytes Resources/Audio/Effects/licenses.txt | 8 + .../Locale/en-US/actions/actions/dragon.ftl | 12 + .../Chemistry/metabolizer_types.yml | 8 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 373 +++++++++++------- .../Prototypes/Entities/Mobs/NPCs/bear.yml | 13 +- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 49 +-- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 208 ++++++---- .../Entities/Mobs/NPCs/regalrat.yml | 34 +- .../Entities/Mobs/NPCs/spacetick.yml | 10 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 41 +- .../Entities/Mobs/Player/dragon.yml | 103 +++++ .../Entities/Mobs/Player/silicon.yml | 11 +- .../Objects/Consumable/Food/meals.yml | 21 +- .../Entities/Objects/Consumable/Food/meat.yml | 52 ++- .../Objects/Specific/Janitorial/trashbag.yml | 1 + .../Structures/Doors/Firelocks/firelock.yml | 3 + .../Entities/Structures/Walls/walls.yml | 4 +- Resources/Prototypes/Reagents/biological.yml | 28 ++ Resources/Prototypes/Reagents/fun.yml | 8 + Resources/Prototypes/Reagents/medicine.yml | 2 + Resources/Prototypes/Reagents/toxins.yml | 30 +- .../Recipes/Cooking/meal_recipes.yml | 22 ++ .../Textures/Interface/Actions/carpbirth.png | Bin 0 -> 618 bytes .../Textures/Interface/Actions/devour.png | Bin 0 -> 473 bytes .../Textures/Interface/Actions/meta.json | 15 +- .../Carps/dragon.rsi/alive-unshaded.png | Bin 0 -> 2438 bytes .../Mobs/Aliens/Carps/dragon.rsi/alive.png | Bin 0 -> 14934 bytes .../Mobs/Aliens/Carps/dragon.rsi/crit.png | Bin 0 -> 1755 bytes .../Aliens/Carps/dragon.rsi/dead-unshaded.png | Bin 0 -> 258 bytes .../Mobs/Aliens/Carps/dragon.rsi/dead.png | Bin 0 -> 1271 bytes .../Mobs/Aliens/Carps/dragon.rsi/meta.json | 80 ++++ .../Consumable/Food/meat.rsi/dragon.png | Bin 0 -> 462 bytes .../Consumable/Food/meat.rsi/dragon_veins.png | Bin 0 -> 209 bytes .../Consumable/Food/meat.rsi/meta.json | 6 + .../Objects/Misc/id_cards.rsi/idpassenger.png | Bin 203 -> 173 bytes 46 files changed, 1206 insertions(+), 432 deletions(-) delete mode 100644 Content.Client/MobState/DamageStateVisualizer.cs create mode 100644 Content.Client/MobState/DamageStateVisualizerSystem.cs create mode 100644 Content.Client/MobState/DamageStateVisualsComponent.cs create mode 100644 Content.Server/Dragon/DragonComponent.cs create mode 100644 Content.Server/Dragon/DragonSystem.cs create mode 100644 Resources/Audio/Animals/space_dragon_roar.ogg create mode 100644 Resources/Audio/Effects/demon_attack1.ogg create mode 100644 Resources/Audio/Effects/demon_consume.ogg create mode 100644 Resources/Audio/Effects/demon_dies.ogg create mode 100644 Resources/Locale/en-US/actions/actions/dragon.ftl create mode 100644 Resources/Prototypes/Entities/Mobs/Player/dragon.yml create mode 100644 Resources/Textures/Interface/Actions/carpbirth.png create mode 100644 Resources/Textures/Interface/Actions/devour.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive-unshaded.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead-unshaded.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon.png create mode 100644 Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon_veins.png diff --git a/Content.Client/MobState/DamageStateVisualizer.cs b/Content.Client/MobState/DamageStateVisualizer.cs deleted file mode 100644 index db672bb857..0000000000 --- a/Content.Client/MobState/DamageStateVisualizer.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Collections.Generic; -using Content.Shared.MobState; -using JetBrains.Annotations; -using Robust.Client.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.Manager.Attributes; -using DrawDepth = Content.Shared.DrawDepth.DrawDepth; - -namespace Content.Client.MobState -{ - [UsedImplicitly] - public sealed class DamageStateVisualizer : AppearanceVisualizer, ISerializationHooks - { - private DamageState _data = DamageState.Alive; - private Dictionary _stateMap = new(); - private int? _originalDrawDepth; - - [DataField("normal")] - private string? _normal; - - [DataField("crit")] - private string? _crit; - - [DataField("dead")] - private string? _dead; - - /// - /// Should noRot be turned off when crit / dead. - /// - [DataField("rotate")] - private bool _rotate; - - void ISerializationHooks.BeforeSerialization() - { - _stateMap.TryGetValue(DamageState.Alive, out _normal); - _stateMap.TryGetValue(DamageState.Critical, out _crit); - _stateMap.TryGetValue(DamageState.Dead, out _dead); - } - - void ISerializationHooks.AfterDeserialization() - { - if (_normal != null) - { - _stateMap.Add(DamageState.Alive, _normal); - } - - if (_crit != null) - { - _stateMap.Add(DamageState.Critical, _crit); - } - - if (_dead != null) - { - _stateMap.Add(DamageState.Dead, _dead); - } - } - - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - var sprite = IoCManager.Resolve().GetComponent(component.Owner); - if (!component.TryGetData(DamageStateVisuals.State, out DamageState data)) - { - return; - } - - if (_data == data) - { - return; - } - - _data = data; - - if (_rotate) - { - sprite.NoRotation = data switch - { - DamageState.Critical => false, - DamageState.Dead => false, - _ => true - }; - } - - if (_stateMap.TryGetValue(_data, out var state)) - { - sprite.LayerSetState(DamageStateVisualLayers.Base, state); - } - - // So they don't draw over mobs anymore - if (_data == DamageState.Dead && sprite.DrawDepth > (int) DrawDepth.Items) - { - _originalDrawDepth = sprite.DrawDepth; - sprite.DrawDepth = (int) DrawDepth.Items; - } - else if (_originalDrawDepth != null) - { - sprite.DrawDepth = _originalDrawDepth.Value; - _originalDrawDepth = null; - } - } - } - - public enum DamageStateVisualLayers : byte - { - Base - } -} diff --git a/Content.Client/MobState/DamageStateVisualizerSystem.cs b/Content.Client/MobState/DamageStateVisualizerSystem.cs new file mode 100644 index 0000000000..e73d56c2aa --- /dev/null +++ b/Content.Client/MobState/DamageStateVisualizerSystem.cs @@ -0,0 +1,57 @@ +using Content.Shared.MobState; +using Robust.Client.GameObjects; +using DrawDepth = Content.Shared.DrawDepth.DrawDepth; + +namespace Content.Client.MobState; + +public sealed class DamageStateVisualizerSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, DamageStateVisualsComponent component, ref AppearanceChangeEvent args) + { + var sprite = args.Sprite; + + if (sprite == null || !args.Component.TryGetData(DamageStateVisuals.State, out DamageState data)) + { + return; + } + + if (!component.States.TryGetValue(data, out var layers)) + { + return; + } + + if (component.Rotate) + { + sprite.NoRotation = data switch + { + DamageState.Critical => false, + DamageState.Dead => false, + _ => true + }; + } + + // Brain no worky rn so this was just easier. + foreach (var layer in sprite.AllLayers) + { + layer.Visible = false; + } + + foreach (var (key, state) in layers) + { + sprite.LayerSetVisible(key, true); + sprite.LayerSetState(key, state); + } + + // So they don't draw over mobs anymore + if (data == DamageState.Dead && sprite.DrawDepth > (int) DrawDepth.Items) + { + component.OriginalDrawDepth = sprite.DrawDepth; + sprite.DrawDepth = (int) DrawDepth.Items; + } + else if (component.OriginalDrawDepth != null) + { + sprite.DrawDepth = component.OriginalDrawDepth.Value; + component. OriginalDrawDepth = null; + } + } +} diff --git a/Content.Client/MobState/DamageStateVisualsComponent.cs b/Content.Client/MobState/DamageStateVisualsComponent.cs new file mode 100644 index 0000000000..f8f67243a5 --- /dev/null +++ b/Content.Client/MobState/DamageStateVisualsComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.MobState; + +namespace Content.Client.MobState; + +[RegisterComponent] +public sealed class DamageStateVisualsComponent : Component +{ + public int? OriginalDrawDepth; + + [DataField("states")] public Dictionary> States = new(); + + /// + /// Should noRot be turned off when crit / dead. + /// + [DataField("rotate")] public bool Rotate; +} + +public enum DamageStateVisualLayers : byte +{ + Base, + BaseUnshaded, +} diff --git a/Content.Server/Dragon/DragonComponent.cs b/Content.Server/Dragon/DragonComponent.cs new file mode 100644 index 0000000000..c8e7fffe7b --- /dev/null +++ b/Content.Server/Dragon/DragonComponent.cs @@ -0,0 +1,80 @@ +using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Containers; +using System.Threading; +using Content.Shared.Actions; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Sound; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Dragon +{ + [RegisterComponent] + public sealed class DragonComponent : Component + { + /// + /// The chemical ID injected upon devouring + /// + [DataField("devourChemical", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DevourChem = "Ichor"; + + /// + /// The amount of ichor injected per devour + /// + [DataField("devourHealRate")] + public float DevourHealRate = 15f; + + [DataField("devourActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DevourActionId = "DragonDevour"; + + [DataField("devourAction")] + public EntityTargetAction? DevourAction; + + [DataField("spawnActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SpawnActionId = "DragonSpawn"; + + [DataField("spawnAction")] + public InstantAction? SpawnAction; + + /// + /// The amount of time it takes to devour something + /// + /// NOTE: original intended design was to increase this proportionally with damage thresholds, but those proved quite difficult to get consistently. right now it devours the structure at a fixed timer. + /// + /// + [DataField("devourTime")] + public float DevourTime = 15f; + + [DataField("spawnCount")] public int SpawnsLeft = 2; + + [DataField("maxSpawnCount")] public int MaxSpawns = 2; + + [DataField("spawnProto", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? SpawnPrototype = "MobCarpDragon"; + + [ViewVariables(VVAccess.ReadWrite), DataField("soundDeath")] + public SoundSpecifier? SoundDeath = new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundDevour")] + public SoundSpecifier? SoundDevour = new SoundPathSpecifier("/Audio/Effects/demon_consume.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundStructureDevour")] + public SoundSpecifier? SoundStructureDevour = new SoundPathSpecifier("/Audio/Machines/airlock_creaking.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundRoar")] + public SoundSpecifier? SoundRoar = + new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg"); + + public CancellationTokenSource? CancelToken; + + /// + /// Where the entities go when dragon devours them, empties when the dragon is butchered. + /// + public Container DragonStomach = default!; + } + + public sealed class DragonDevourActionEvent : EntityTargetActionEvent {} + + public sealed class DragonSpawnActionEvent : InstantActionEvent {} +} diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs new file mode 100644 index 0000000000..22fac2f6e1 --- /dev/null +++ b/Content.Server/Dragon/DragonSystem.cs @@ -0,0 +1,188 @@ +using Content.Server.Body.Systems; +using Content.Server.DoAfter; +using Content.Server.Popups; +using Content.Shared.Actions; +using Content.Shared.CharacterAppearance.Components; +using Content.Shared.Chemistry.Components; +using Content.Shared.Damage; +using Content.Shared.MobState; +using Content.Shared.MobState.Components; +using Content.Shared.Tag; +using Robust.Shared.Audio; +using Robust.Shared.Containers; +using Robust.Shared.Player; +using System.Threading; +using Content.Shared.MobState.State; +using Content.Shared.Doors.Components; + +namespace Content.Server.Dragon +{ + public sealed class DragonSystem : EntitySystem + { + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnDevourAction); + SubscribeLocalEvent(OnDragonSpawnAction); + + SubscribeLocalEvent(OnDragonDevourComplete); + SubscribeLocalEvent(OnDragonDevourCancelled); + SubscribeLocalEvent(OnMobStateChanged); + } + + private void OnMobStateChanged(EntityUid uid, DragonComponent component, MobStateChangedEvent args) + { + //Empties the stomach upon death + //TODO: Do this when the dragon gets butchered instead + if (args.CurrentMobState.IsDead()) + { + if (component.SoundDeath != null) + SoundSystem.Play(component.SoundDeath.GetSound(), Filter.Pvs(uid, entityManager: EntityManager)); + + component.DragonStomach.EmptyContainer(); + } + } + + private void OnDragonDevourCancelled(EntityUid uid, DragonComponent component, DragonDevourCancelledEvent args) + { + component.CancelToken = null; + } + + private void OnDragonDevourComplete(EntityUid uid, DragonComponent component, DragonDevourComplete args) + { + component.CancelToken = null; + //TODO: Figure out a better way of removing structures via devour that still entails standing still and waiting for a DoAfter. Somehow. + EntityManager.QueueDeleteEntity(args.Target); + + if (component.SoundDevour != null) + SoundSystem.Play(component.SoundDevour.GetSound(), Filter.Pvs(args.User, entityManager: EntityManager)); + } + + private void OnStartup(EntityUid uid, DragonComponent component, ComponentStartup args) + { + component.SpawnsLeft = Math.Min(component.SpawnsLeft, component.MaxSpawns); + + //Dragon doesn't actually chew, since he sends targets right into his stomach. + //I did it mom, I added ERP content into upstream. Legally! + component.DragonStomach = _containerSystem.EnsureContainer(uid, "dragon_stomach"); + + if (component.DevourAction != null) + _actionsSystem.AddAction(uid, component.DevourAction, null); + + if (component.SpawnAction != null) + _actionsSystem.AddAction(uid, component.SpawnAction, null); + + if (component.SoundRoar != null) + SoundSystem.Play(component.SoundRoar.GetSound(), Filter.Pvs(uid, 4f, EntityManager)); + } + + /// + /// The devour action + /// + private void OnDevourAction(EntityUid dragonuid, DragonComponent component, DragonDevourActionEvent args) + { + if (component.CancelToken != null || args.Handled) return; + + args.Handled = true; + var target = args.Target; + var ichorInjection = new Solution(component.DevourChem, component.DevourHealRate); + + //Check if the target is valid. The effects should be possible to accomplish on either a wall or a body. + //Eating bodies is instant, the wall requires a doAfter. + + if (EntityManager.TryGetComponent(target, out MobStateComponent? targetState)) + { + switch (targetState.CurrentState) + { + case SharedCriticalMobState: + case SharedDeadMobState: + if (!EntityManager.HasComponent(dragonuid)) return; + + //Humanoid devours allow dragon to get eggs, corpses included + if (EntityManager.HasComponent(target)) + { + // Add a spawn for a consumed humanoid + component.SpawnsLeft = Math.Min(component.SpawnsLeft + 1, component.MaxSpawns); + } + //Non-humanoid mobs can only heal dragon for half the normal amount, with no additional spawn tickets + else + { + ichorInjection.ScaleSolution(0.5f); + } + + _bloodstreamSystem.TryAddToChemicals(dragonuid, ichorInjection); + component.DragonStomach.Insert(target); + + if (component.SoundDevour != null) + SoundSystem.Play(component.SoundDevour.GetSound(), Filter.Pvs(dragonuid, entityManager: EntityManager)); + + return; + default: + _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-fail-target-alive"), dragonuid, Filter.Entities(dragonuid)); + break; + } + + return; + } + + // Absolutely ass solution but requires less yaml fuckery + // If it's a door (firelock, airlock, windoor), Wall or Window, dragon can eat it. + if (_tagSystem.HasTag(target, "Wall") || (_tagSystem.HasTag(target, "Window") || EntityManager.HasComponent(target))) + { + _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-structure"), dragonuid, Filter.Entities(dragonuid)); + + if (component.SoundStructureDevour != null) + SoundSystem.Play(component.SoundStructureDevour.GetSound(), Filter.Pvs(dragonuid, entityManager: EntityManager)); + + component.CancelToken = new CancellationTokenSource(); + + _doAfterSystem.DoAfter(new DoAfterEventArgs(dragonuid, component.DevourTime, component.CancelToken.Token, target) + { + UserFinishedEvent = new DragonDevourComplete(dragonuid, target), + UserCancelledEvent = new DragonDevourCancelledEvent(), + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnStun = true, + }); + } + } + + private void OnDragonSpawnAction(EntityUid dragonuid, DragonComponent component, DragonSpawnActionEvent args) + { + if (component.SpawnPrototype == null) return; + + // If dragon has spawns then add one. + if (component.SpawnsLeft > 0) + { + Spawn(component.SpawnPrototype, Transform(dragonuid).Coordinates); + component.SpawnsLeft--; + return; + } + + _popupSystem.PopupEntity(Loc.GetString("dragon-spawn-action-popup-message-fail-no-eggs"), dragonuid, Filter.Entities(dragonuid)); + } + + private sealed class DragonDevourComplete : EntityEventArgs + { + public EntityUid User { get; } + public EntityUid Target { get; } + + public DragonDevourComplete(EntityUid user, EntityUid target) + { + User = user; + Target = target; + } + } + + private sealed class DragonDevourCancelledEvent : EntityEventArgs {} + } +} diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index a223343439..0e8214e0e1 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -10,6 +10,7 @@ namespace Content.Server.Entry "InteractionOutline", "MeleeWeaponArcAnimation", "EffectVisuals", + "DamageStateVisuals", "AnimationsTest", "ItemStatus", "VehicleVisuals", diff --git a/Resources/Audio/Animals/license.txt b/Resources/Audio/Animals/license.txt index d613b12f11..76ba446b8a 100644 --- a/Resources/Audio/Animals/license.txt +++ b/Resources/Audio/Animals/license.txt @@ -4,39 +4,42 @@ licensed under CC BY-NC-SA 3.0 The following sounds were used from freesound: -cat_meow.ogg: modified from "Meow 4.wav" by freesound user "TRNGLE" (https://freesound.org/people/TRNGLE/sounds/368006/) licensed under CCBY 3.0. The original audio was trimmed, split to mono, and converted from WAV to OGG format. + cat_meow.ogg: modified from "Meow 4.wav" by freesound user "TRNGLE" (https://freesound.org/people/TRNGLE/sounds/368006/) licensed under CCBY 3.0. The original audio was trimmed, split to mono, and converted from WAV to OGG format. -cat_hiss.ogg: modified from "catHisses1.wav" by freesound user "Zabuhailo" (https://freesound.org/people/Zabuhailo/sounds/146963/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. + cat_hiss.ogg: modified from "catHisses1.wav" by freesound user "Zabuhailo" (https://freesound.org/people/Zabuhailo/sounds/146963/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. -small_dog_bark_happy.ogg: modified from "Dog bark2.wav" by freesound user "MisterTood" (https://freesound.org/people/MisterTood/sounds/9032/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. + small_dog_bark_happy.ogg: modified from "Dog bark2.wav" by freesound user "MisterTood" (https://freesound.org/people/MisterTood/sounds/9032/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. -duck_quack_happy.ogg: modified from "Duck Quack - Sound Effect (HD).mp3" by freesound user "Tabby+Gus." (https://freesound.org/people/Tabby+Gus./sounds/515408/) licensed under CC0 1.0 (public domain). The original audio was trimmed, looped, split to mono, and converted from MP3 to OGG format. + duck_quack_happy.ogg: modified from "Duck Quack - Sound Effect (HD).mp3" by freesound user "Tabby+Gus." (https://freesound.org/people/Tabby+Gus./sounds/515408/) licensed under CC0 1.0 (public domain). The original audio was trimmed, looped, split to mono, and converted from MP3 to OGG format. -chicken_cluck_happy.ogg: modified from "Chicken Single Alarm Call" by freesound user "Rudmer_Rotteveel" (https://freesound.org/people/Rudmer_Rotteveel/sounds/316920/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. + chicken_cluck_happy.ogg: modified from "Chicken Single Alarm Call" by freesound user "Rudmer_Rotteveel" (https://freesound.org/people/Rudmer_Rotteveel/sounds/316920/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. -ferret_happy.ogg: modified from "Ferret" by freesound user "J.Zazvurek" (https://freesound.org/people/J.Zazvurek/sounds/155115/) licensed under CC BY 3.0. The original audio was trimmed and converted from WAV to OGG format. + ferret_happy.ogg: modified from "Ferret" by freesound user "J.Zazvurek" (https://freesound.org/people/J.Zazvurek/sounds/155115/) licensed under CC BY 3.0. The original audio was trimmed and converted from WAV to OGG format. -mouse_squeak.ogg: modified from "Cartoon - Bat / Mouse Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/445958/) licensed under CC0 1.0 (public domain). The original audio was converted from WAV to OGG format. + mouse_squeak.ogg: modified from "Cartoon - Bat / Mouse Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/445958/) licensed under CC0 1.0 (public domain). The original audio was converted from WAV to OGG format. -sloth_squeak.ogg: modified from "squeakfinal.wav" by freesound user "Higgs01" (https://freesound.org/people/Higgs01/sounds/428114/) licensed under CC0 1.0 (Public domain dedication). The original audio was converted from WAV to OFF format AND converted from stereo to mono. + sloth_squeak.ogg: modified from "squeakfinal.wav" by freesound user "Higgs01" (https://freesound.org/people/Higgs01/sounds/428114/) licensed under CC0 1.0 (Public domain dedication). The original audio was converted from WAV to OFF format AND converted from stereo to mono. -parrot_raught.ogg: modified and used from "Parrot 1 raught 2.wav" by freesound user "Coral_Island_Studios" (https://freesound.org/people/Coral_Island_Studios/sounds/432588/) licensed under CC BY 3.0. The original audio was converted from WAV to OGG format. + parrot_raught.ogg: modified and used from "Parrot 1 raught 2.wav" by freesound user "Coral_Island_Studios" (https://freesound.org/people/Coral_Island_Studios/sounds/432588/) licensed under CC BY 3.0. The original audio was converted from WAV to OGG format. -fox_squeak.ogg: modified from "Video Game Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/468442/) licensed under CC0 1.0. The original audio was converted from WAV to OGG format + fox_squeak.ogg: modified from "Video Game Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/468442/) licensed under CC0 1.0. The original audio was converted from WAV to OGG format -frog_ribbit.ogg: original audio created by freesound user "egomassive" (https://freesound.org/people/egomassive/sounds/536759/). licensed under licensed under CC0 1.0 + frog_ribbit.ogg: original audio created by freesound user "egomassive" (https://freesound.org/people/egomassive/sounds/536759/). licensed under licensed under CC0 1.0 -goose_honk.ogg: modified from " Bird Honk - 1" by freesound user "SpaceJoe" (https://freesound.org/people/SpaceJoe/sounds/510940/) licensed under CC0 1.0. The originial audio was converted from WAV to OGG format. + goose_honk.ogg: modified from " Bird Honk - 1" by freesound user "SpaceJoe" (https://freesound.org/people/SpaceJoe/sounds/510940/) licensed under CC0 1.0. The originial audio was converted from WAV to OGG format. -snake_hiss.ogg: modified from "hissing snake sound effect" by freesound user "Garuda1982" (https://freesound.org/people/Garuda1982/sounds/541656/) licensed under CC BY 4.0. The original audio was convertred from WAV to OGG format. + snake_hiss.ogg: modified from "hissing snake sound effect" by freesound user "Garuda1982" (https://freesound.org/people/Garuda1982/sounds/541656/) licensed under CC BY 4.0. The original audio was convertred from WAV to OGG format. + +The following sounds are taken from TGstation github (licensed under CC by 3.0): + + space_dragon_roar.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 The following sounds were used from youtube: -penguin_squawk.ogg: audio is recorded/created by youtube user "ProSounds" (https://youtu.be/Anr35RbBL3Y) licensed under CC BY 3.0. The original audio was trimmed and converted from MP3 to OGG format. + penguin_squawk.ogg: audio is recorded/created by youtube user "ProSounds" (https://youtu.be/Anr35RbBL3Y) licensed under CC BY 3.0. The original audio was trimmed and converted from MP3 to OGG format. -raccoon_squeak.ogg: audio is recorded by youtube user "jnargus" (https://youtu.be/BGjFP1CP7E0) licensed under CC by 3.0 + raccoon_squeak.ogg: audio is recorded by youtube user "jnargus" (https://youtu.be/BGjFP1CP7E0) licensed under CC by 3.0 -goat_bah.ogg: audio is created by youtube user "Winry Marini" (https://youtu.be/QIhwzsk5bww) licensed under CC BY 3.0 - -lizard_happy.ogg: audio created by youtube user "Nagaty Studio" (https://youtu.be/I7CX0AS8RNI) licensed under CC by 3.0. + goat_bah.ogg: audio is created by youtube user "Winry Marini" (https://youtu.be/QIhwzsk5bww) licensed under CC BY 3.0 + lizard_happy.ogg: audio created by youtube user "Nagaty Studio" (https://youtu.be/I7CX0AS8RNI) licensed under CC by 3.0. diff --git a/Resources/Audio/Animals/space_dragon_roar.ogg b/Resources/Audio/Animals/space_dragon_roar.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f7f4503b89467141384183fd38c8dfda23dfb792 GIT binary patch literal 52920 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 LXzDG&0|A->IF0eu literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/demon_attack1.ogg b/Resources/Audio/Effects/demon_attack1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..18b646f136b92bff5f21cb8a2a13575bba372b74 GIT binary patch literal 21106 zcmagG1y~);vMxLeclQ8+pbPil?iQS&A-F?umq4)K?iM7tI|O%k3GNz5f&~cqhkW~- zz5jFXbMDZqpPsJis_v?{da7r7cx7Rs4!{8aI_MPtDNN<>UPH(sZVpbyR?bgVkbt&- zUE&V;TWE&7dTROK$5YEE%DvLK5SGB7|KBkT`wt^Vkp9}r(URqrlLdvXm9f@e_7rjy z9Bk|yY#eNy6!fp`?5!M~%$&{aU7%0AA@Kh+g^EjPK>#GMhFy`OKVT|W69BLPz=#@( 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%0AHO_x8!UigK%csXrx^S`yD5^Dkqsr*Ek2O$*^hts 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 HEXM*4cmKli literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/licenses.txt b/Resources/Audio/Effects/licenses.txt index 6ddb5dc5e7..9a49b6d509 100644 --- a/Resources/Audio/Effects/licenses.txt +++ b/Resources/Audio/Effects/licenses.txt @@ -31,3 +31,11 @@ minibombcountdown.ogg taken from Thomas Evdokimoff at https://freesound.org/peop bite.ogg take from https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 bone_rattle.ogg licensed under CC0 1.0 and taken from spookymodem at https://freesound.org/people/spookymodem/sounds/202102/ + +The following sounds are taken from TGstation github (licensed under CC by 3.0): + + demon_attack1.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 + + demon_consume.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 + + demon_dies.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 diff --git a/Resources/Locale/en-US/actions/actions/dragon.ftl b/Resources/Locale/en-US/actions/actions/dragon.ftl new file mode 100644 index 0000000000..582a10cf57 --- /dev/null +++ b/Resources/Locale/en-US/actions/actions/dragon.ftl @@ -0,0 +1,12 @@ +devour-action-popup-message-structure = Your jaws dig into thick material.. +devour-action-popup-message-fail-target-not-valid = That doesn't look particularly edible. +devour-action-popup-message-fail-target-alive = You can't consume creatures that are alive! + +dragon-spawn-action-popup-message-fail-no-eggs = You don't have the stamina to create a carp! + + +action-name-devour = [color=red]Devour[/color] +action-description-devour = Attempt to break a structure with your jaws or swallow a creature. + +action-name-carp-birth = Summon carp +action-description-carp-birth = Summon a carp to aid you at seizing the station! diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 47e068d08a..5ca7770f2d 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -2,14 +2,16 @@ # you'll likely have to tag its metabolizers with something other than Human. - type: metabolizerType - id: Human + id: Animal - type: metabolizerType - id: Animal + id: Dragon + +- type: metabolizerType + id: Human - type: metabolizerType id: Slime - type: metabolizerType id: Vox - diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index f54f9648bb..c54ff4126c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -29,12 +29,14 @@ - FlyingMobMask layer: - FlyingMobLayer - - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: bat - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: bat + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -97,11 +99,15 @@ 5: !type:CriticalMobState {} 10: !type:DeadMobState {} - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: 0 - crit: dead - dead: dead + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: 0 + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Tag tags: - Bee @@ -153,11 +159,14 @@ state: chicken-0 sprite: Mobs/Animals/chicken.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: chicken-0 - crit: dead-0 - dead: dead-0 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: chicken-0 + Critical: + enum.DamageStateVisualLayers.Base: dead-0 + Dead: + enum.DamageStateVisualLayers.Base: dead-0 - type: Butcherable spawned: - id: FoodMeatChicken @@ -184,11 +193,14 @@ state: duck-0 sprite: Mobs/Animals/duck.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: duck-0 - crit: dead-0 - dead: dead-0 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: duck-0 + Critical: + enum.DamageStateVisualLayers.Base: dead-0 + Dead: + enum.DamageStateVisualLayers.Base: dead-0 - type: Butcherable spawned: - id: FoodMeatDuck @@ -215,11 +227,14 @@ state: duck-1 sprite: Mobs/Animals/duck.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: duck-1 - crit: dead-1 - dead: dead-1 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: duck-1 + Critical: + enum.DamageStateVisualLayers.Base: dead-1 + Dead: + enum.DamageStateVisualLayers.Base: dead-1 - type: Butcherable spawned: - id: FoodMeatDuck @@ -246,11 +261,14 @@ state: duck-2 sprite: Mobs/Animals/duck.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: duck-2 - crit: dead-2 - dead: dead-2 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: duck-2 + Critical: + enum.DamageStateVisualLayers.Base: dead-2 + Dead: + enum.DamageStateVisualLayers.Base: dead-2 - type: Butcherable spawned: - id: FoodMeatDuck @@ -306,11 +324,14 @@ cyan: "#18a2d5" yellow: "#d58c18" - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: butterfly - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: butterfly + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Bloodstream bloodMaxVolume: 0.1 - type: NoSlip @@ -339,11 +360,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: cow - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: cow + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: SolutionContainerManager solutions: udder: @@ -396,11 +420,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: crab - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: crab + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatCrab @@ -425,11 +452,14 @@ state: goat sprite: Mobs/Animals/goat.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: goat - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: goat + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: SolutionContainerManager solutions: udder: @@ -470,11 +500,14 @@ state: goose sprite: Mobs/Animals/goose.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: goose - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: goose + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatChicken @@ -513,11 +546,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: crawling - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: crawling + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -553,12 +589,15 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: kangaroo - # SKIPPY NO! - crit: kangaroo-dead - dead: kangaroo-dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: kangaroo + # SKIPPY NO! + Critical: + enum.DamageStateVisualLayers.Base: kangaroo-dead + Dead: + enum.DamageStateVisualLayers.Base: kangaroo-dead - type: Puller - type: entity @@ -576,11 +615,14 @@ state: kangaroo-boxing sprite: Mobs/Animals/kangaroo.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: kangaroo-boxing - crit: kangaroo-boxing-dead - dead: kangaroo-boxing-dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: kangaroo-boxing + Critical: + enum.DamageStateVisualLayers.Base: kangaroo-boxing-dead + Dead: + enum.DamageStateVisualLayers.Base: kangaroo-boxing-dead - type: MeleeWeapon range: 1.5 arcwidth: 0 @@ -626,12 +668,16 @@ - type: Body template: PrimateTemplate preset: PrimatePreset + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: monkey + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Appearance visuals: - - type: DamageStateVisualizer - normal: monkey - crit: dead - dead: dead - type: FireVisualizer sprite: Mobs/Effects/onfire.rsi normalState: Monkey_burning @@ -688,11 +734,14 @@ baseWalkSpeed : 5 baseSprintSpeed : 5 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mouse-0 - crit: dead-0 - dead: splat-0 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-0 + Critical: + enum.DamageStateVisualLayers.Base: dead-0 + Dead: + enum.DamageStateVisualLayers.Base: splat-0 - type: Food - type: Hunger baseDecayRate: 0.5 # I'm very hungry! Give me. The cheese. @@ -762,11 +811,14 @@ - type: Clothing HeldPrefix: 1 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mouse-1 - crit: dead-1 - dead: splat-1 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-1 + Critical: + enum.DamageStateVisualLayers.Base: dead-1 + Dead: + enum.DamageStateVisualLayers.Base: splat-1 - type: Bloodstream bloodMaxVolume: 50 - type: DiseaseCarrier #Why doesn't this save if it's only on the parent wtf @@ -785,11 +837,14 @@ - type: Clothing HeldPrefix: 1 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mouse-2 - crit: dead-2 - dead: splat-2 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-1 + Critical: + enum.DamageStateVisualLayers.Base: dead-1 + Dead: + enum.DamageStateVisualLayers.Base: splat-1 - type: Bloodstream bloodMaxVolume: 50 - type: DiseaseCarrier @@ -822,11 +877,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: lizard - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: lizard + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -870,11 +928,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: slug - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: slug + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -913,11 +974,14 @@ layer: - SmallMobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: frog - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: frog + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -959,11 +1023,14 @@ layer: - FlyingMobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: parrot - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: parrot + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -1002,11 +1069,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: penguin - crit: penguin_dead - dead: penguin_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: penguin + Critical: + enum.DamageStateVisualLayers.Base: penguin_dead + Dead: + enum.DamageStateVisualLayers.Base: penguin_dead - type: Butcherable spawned: - id: FoodMeatPenguin @@ -1051,11 +1121,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: penguin - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: penguin + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatPenguin @@ -1105,11 +1178,13 @@ - SmallMobMask layer: - SmallMobLayer + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: snake - type: Appearance visuals: - type: RotationVisualizer - - type: DamageStateVisualizer - normal: snake # It's death animation is animated so hopefully this should push for separation between "dying" and "death" states. # looks stupid, Rotation visualizer for now # dead: dead @@ -1154,11 +1229,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: tarantula - crit: tarantula_dead - dead: tarantula_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: tarantula + Critical: + enum.DamageStateVisualLayers.Base: tarantula_dead + Dead: + enum.DamageStateVisualLayers.Base: tarantula_dead - type: Butcherable spawned: - id: FoodMeatSpider @@ -1218,11 +1296,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: possum - crit: possum_dead # TODO: Make it so possums can "play dead." Probably need AI changes - dead: possum_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: possum + Critical: + enum.DamageStateVisualLayers.Base: possum_dead + Dead: + enum.DamageStateVisualLayers.Base: possum_dead - type: Butcherable spawned: - id: FoodMeat @@ -1274,11 +1355,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: raccoon - crit: raccoon_dead - dead: raccoon_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: raccoon + Critical: + enum.DamageStateVisualLayers.Base: raccoon_dead + Dead: + enum.DamageStateVisualLayers.Base: raccoon_dead - type: Butcherable spawned: - id: FoodMeat @@ -1330,11 +1414,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: fox - crit: fox_dead - dead: fox_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: fox + Critical: + enum.DamageStateVisualLayers.Base: fox_dead + Dead: + enum.DamageStateVisualLayers.Base: fox_dead - type: Butcherable spawned: - id: FoodMeat diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml b/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml index 636316f068..c2b51f1434 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml @@ -33,11 +33,14 @@ 0: !type:NormalMobState {} 150: !type:DeadMobState {} - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: bear - crit: bear_dead - dead: bear_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: bear + Critical: + enum.DamageStateVisualLayers.Base: bear_dead + Dead: + enum.DamageStateVisualLayers.Base: bear_dead - type: Butcherable spawned: - id: FoodMeatBear diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 774d375ca7..2ad4c2ce6d 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -17,6 +17,11 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: alive sprite: Mobs/Aliens/Carps/space.rsi + - type: CombatMode + disarmAction: + enabled: false + autoPopulate: false + name: action-name-disarm - type: Physics - type: Fixtures fixtures: @@ -35,15 +40,17 @@ 100: !type:DeadMobState {} - type: MovementIgnoreGravity - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: alive - crit: crit - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: alive + Critical: + enum.DamageStateVisualLayers.Base: crit + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable - # TODO: CrapMeat or FishMeat # - 2022-02-17 LMAO crap meat spawned: - - id: FoodMeat + - id: FoodMeatFish amount: 2 - type: MeleeWeapon range: 1.5 @@ -55,17 +62,6 @@ types: Piercing: 5 Slash: 10 - - type: CombatMode - disarmAction: - enabled: false - autoPopulate: false - name: action-name-disarm - - type: GhostTakeoverAvailable - makeSentient: true - name: space carp - description: | - If you're a salvage spawn, defend the loot inside! - Otherwise, wreak havoc on the station! - type: ReplacementAccent accent: genericAggressive - type: TypingIndicator @@ -84,8 +80,6 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: alive sprite: Mobs/Aliens/Carps/magic.rsi - - type: GhostTakeoverAvailable - name: magicarp - type: TypingIndicator proto: guardian @@ -93,7 +87,7 @@ name: holocarp parent: MobCarp id: MobCarpHolo - description: Carp made out of holographic energies. + description: Carp made out of holographic energies. Sadly for you, it is very much real. components: - type: Sprite drawdepth: Mobs @@ -112,8 +106,6 @@ - MobMask layer: - Opaque - - type: GhostTakeoverAvailable - name: holocarp - type: TypingIndicator proto: robot @@ -128,3 +120,14 @@ Defend the loot inside the salvage wreck! - type: SalvageMobRestrictions +- type: entity + name: space carp + id: MobCarpDragon + suffix: DragonBrood + parent: MobCarp + components: + - type: GhostTakeoverAvailable + makeSentient: true + name: Sentient Carp + description: Help the dragon flood the station with carps! + diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 75c325956f..a4fbc78a31 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -24,12 +24,15 @@ - MobMask layer: - MobLayer + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: corgi + Critical: + enum.DamageStateVisualLayers.Base: corgi_dead + Dead: + enum.DamageStateVisualLayers.Base: corgi_dead - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: corgi - crit: corgi_dead - dead: corgi_dead - type: Butcherable spawned: - id: FoodMeat @@ -61,11 +64,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: narsian - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: narsian - crit: narsian_dead - dead: narsian_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: narsian + Critical: + enum.DamageStateVisualLayers.Base: narsian_dead + Dead: + enum.DamageStateVisualLayers.Base: narsian_dead - type: MeleeWeapon range: 1.5 arcwidth: 0 @@ -125,11 +131,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: ian - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: ian - crit: ian_dead - dead: ian_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: ian + Critical: + enum.DamageStateVisualLayers.Base: ian_dead + Dead: + enum.DamageStateVisualLayers.Base: ian_dead - type: Grammar attributes: proper: true @@ -152,11 +161,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: old_ian - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: old_ian - crit: old_ian_dead - dead: old_ian_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: old_ian + Critical: + enum.DamageStateVisualLayers.Base: old_ian_dead + Dead: + enum.DamageStateVisualLayers.Base: old_ian_dead - type: Grammar attributes: proper: true @@ -175,11 +187,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: lisa - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: lisa - crit: lisa_dead - dead: lisa_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: lisa + Critical: + enum.DamageStateVisualLayers.Base: lisa_dead + Dead: + enum.DamageStateVisualLayers.Base: lisa_dead - type: Grammar attributes: proper: true @@ -198,11 +213,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: puppy - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: puppy - crit: puppy_dead - dead: puppy_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: puppy + Critical: + enum.DamageStateVisualLayers.Base: puppy_dead + Dead: + enum.DamageStateVisualLayers.Base: puppy_dead - type: Grammar attributes: gender: epicene @@ -231,11 +249,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: cat - crit: cat_dead - dead: cat_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: cat + Critical: + enum.DamageStateVisualLayers.Base: cat_dead + Dead: + enum.DamageStateVisualLayers.Base: cat_dead - type: Butcherable spawned: - id: FoodMeat @@ -275,11 +296,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: cat2 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: cat2 - crit: cat2_dead - dead: cat2_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: cat2 + Critical: + enum.DamageStateVisualLayers.Base: cat2_dead + Dead: + enum.DamageStateVisualLayers.Base: cat2_dead - type: Grammar attributes: gender: epicene @@ -307,11 +331,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: spacecat - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: spacecat - crit: spacecat_dead - dead: spacecat_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: spacecat + Critical: + enum.DamageStateVisualLayers.Base: spacecat_dead + Dead: + enum.DamageStateVisualLayers.Base: spacecat_dead - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-space-cat @@ -335,11 +362,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: caracal_flop - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: caracal_flop - crit: caracal_dead - dead: caracal_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: caracal_flop + Critical: + enum.DamageStateVisualLayers.Base: caracal_dead + Dead: + enum.DamageStateVisualLayers.Base: caracal_dead - type: Grammar attributes: gender: epicene @@ -381,11 +411,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: sloth - crit: sloth_dead - dead: sloth_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: sloth + Critical: + enum.DamageStateVisualLayers.Base: sloth_dead + Dead: + enum.DamageStateVisualLayers.Base: sloth_dead - type: Butcherable spawned: - id: FoodMeat @@ -424,11 +457,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: ferret - crit: ferret_dead - dead: ferret_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: ferret + Critical: + enum.DamageStateVisualLayers.Base: ferret_dead + Dead: + enum.DamageStateVisualLayers.Base: ferret_dead - type: Butcherable spawned: - id: FoodMeat @@ -478,11 +514,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: bingus - crit: bingus_dead - dead: bingus_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: bingus + Critical: + enum.DamageStateVisualLayers.Base: bingus_dead + Dead: + enum.DamageStateVisualLayers.Base: bingus_dead - type: Butcherable spawned: - id: FoodMeat @@ -521,11 +560,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mcgriff - crit: mcgriff_dead - dead: mcgriff_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mcgriff + Critical: + enum.DamageStateVisualLayers.Base: mcgriff_dead + Dead: + enum.DamageStateVisualLayers.Base: mcgriff_dead - type: Butcherable spawned: - id: FoodMeat @@ -556,11 +598,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: paperwork - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: paperwork - crit: paperwork_dead - dead: paperwork_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: paperwork + Critical: + enum.DamageStateVisualLayers.Base: paperwork_dead + Dead: + enum.DamageStateVisualLayers.Base: paperwork_dead - type: Butcherable spawned: - id: FoodMeat @@ -598,11 +643,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: walter - crit: walter_dead - dead: walter_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: walter + Critical: + enum.DamageStateVisualLayers.Base: walter_dead + Dead: + enum.DamageStateVisualLayers.Base: walter_dead - type: Butcherable spawned: - id: FoodMeat diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index c6aa09c805..07dbdd3046 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -49,14 +49,17 @@ damage: types: Slash: 12 - Piercing: 8 + Piercing: 8 - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: regalrat - crit: dead - dead: dead + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: regalrat + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Puller - type: GhostTakeoverAvailable makeSentient: true @@ -69,7 +72,7 @@ - DoorBumpOpener - FootstepSound - type: NoSlip - - type: RatKing + - type: RatKing actionRaiseArmy: useDelay: 4 icon: Interface/Actions/ratKingArmy.png @@ -158,12 +161,15 @@ Slash: 5 Piercing: 2 - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: mouse-3 - crit: dead-3 - dead: splat-3 + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-3 + Critical: + enum.DamageStateVisualLayers.Base: dead-3 + Dead: + enum.DamageStateVisualLayers.Base: splat-3 - type: Puller - type: DiseaseCarrier carrierDiseases: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml b/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml index 437bd15471..3f53526978 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml @@ -38,10 +38,12 @@ 15: !type:DeadMobState {} - type: MovementIgnoreGravity - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: alive - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: alive + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatXeno diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index a9a8b0e538..cd68541cf0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -60,12 +60,15 @@ groups: Brute: 20 - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: running - crit: crit - dead: dead + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: running + Critical: + enum.DamageStateVisualLayers.Base: crit + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Puller - type: Butcherable butcheringType: Spike @@ -105,11 +108,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: purple_snake - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: purple_snake - crit: dead_purple_snake - dead: dead_purple_snake + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: purple_snake + Critical: + enum.DamageStateVisualLayers.Base: dead_purple_snake + Dead: + enum.DamageStateVisualLayers.Base: dead_purple_snake - type: Grammar attributes: proper: true @@ -156,10 +162,13 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: small_purple_snake - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: purple_snake - crit: dead_small_purple_snake - dead: dead_small_purple_snake + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: small_purple_snake + Critical: + enum.DamageStateVisualLayers.Base: dead_small_purple_snake + Dead: + enum.DamageStateVisualLayers.Base: dead_small_purple_snake - type: SolutionTransfer maxTransferAmount: 1 diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml new file mode 100644 index 0000000000..176b3c1f4b --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -0,0 +1,103 @@ +- type: entity + name: space dragon + parent: SimpleSpaceMobBase + id: MobDragon + suffix: + description: A flying leviathan, loosely related to space carps. + components: + - type: GhostTakeoverAvailable + makeSentient: true + name: Space dragon! + description: Crash, roast, flood the station with carps! + - type: Speech + - type: CombatMode + disarmAction: + enabled: false + autoPopulate: false + name: action-name-disarm + - type: PlayerMobMover + - type: PlayerInputMover + - type: MovementSpeedModifier + baseWalkSpeed : 5 + baseSprintSpeed : 5 + - type: Sprite + sprite: Mobs/Aliens/Carps/dragon.rsi + noRot: true + # TODO: Randomise colors when RandomSpriteColor isn't poopoo + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: alive + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ] + state: alive-unshaded + shader: unshaded + - type: Appearance + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: alive + enum.DamageStateVisualLayers.BaseUnshaded: alive-unshaded + Critical: + enum.DamageStateVisualLayers.Base: crit + Dead: + enum.DamageStateVisualLayers.Base: dead + enum.DamageStateVisualLayers.BaseUnshaded: dead-unshaded + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.40 + mass: 50 + mask: + - FlyingMobMask + layer: + - FlyingMobLayer + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 450: !type:CriticalMobState {} + 500: !type:DeadMobState {} + - type: Metabolizer + solutionOnBody: false + updateFrequency: 0.25 + metabolizerTypes: [Dragon] + groups: + - id: Medicine + - id: Poison + - type: MovementIgnoreGravity + - type: NoSlip + - type: Butcherable + spawned: + - id: FoodMeatDragon + amount: 2 + - type: MeleeWeapon + hitSound: + path: /Audio/Effects/bite.ogg + damage: + types: + Piercing: 15 + Slash: 15 + - type: Dragon + spawnsLeft: 2 + spawnsProto: MobCarpDragon + devourAction: + event: !type:DragonDevourActionEvent + icon: Interface/Actions/devour.png + name: action-name-devour + description: action-description-devour + devourChemical: Ichor + devourHealRate: 15.0 + whitelist: + components: + - MobState + - Door + tags: + - Wall + spawnAction: + event: !type:DragonSpawnActionEvent + icon: Interface/Actions/carpbirth.png + name: action-name-carp-birth + description: action-description-carp-birth + useDelay: 5 + diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index e8d99e170c..12bf99f578 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -215,9 +215,10 @@ layer: - LargeMobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: onestar_boss - dead: onestar_boss_wrecked + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: onestar_boss + Dead: + enum.DamageStateVisualLayers.Base: onestar_boss_wrecked - type: CombatMode diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml index 7506926602..9b9b65e383 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml @@ -177,7 +177,7 @@ reagents: - ReagentId: Nutriment Quantity: 6 - - ReagentId: CapsaicinOil + - ReagentId: CarpoToxin Quantity: 3 # Tastes like fish, batter, hot peppers. @@ -367,6 +367,25 @@ state: queso # Its queso! Everyone loves queso... Right?. +- type: entity + name: Sashimi + parent: FoodMealBase + id: FoodMealSashimi + description: It's taste can only be described as "Exotic". The poisoning though? That's pretty common. + components: + - type: Sprite + state: sashimi + - type: SolutionContainerManager + solutions: + food: + maxVol: 18 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: CarpoToxin + Quantity: 15 +# tastes exotic + - type: entity name: enchiladas parent: FoodMealBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index b0e7fd65c5..a25ff7aa71 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -48,11 +48,35 @@ food: reagents: - ReagentId: Toxin - Quantity: 1 + Quantity: 5 - type: SliceableFood count: 3 slice: FoodMeatCutlet +- type: entity + name: raw carp fillet + parent: FoodMeatBase + # MeatFish?... + id: FoodMeatFish + description: Your last words being "Wow, exotic!" are not worth it. The taste itself though? Maybe. + components: + - type: Tag + tags: + - Raw + - type: Sprite + state: fish + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: CarpoToxin + Quantity: 5 + - type: Extractable + juiceSolution: + reagents: + - ReagentId: CarpoToxin + Quantity: 5 + - type: entity name: raw bacon parent: FoodMeatBase @@ -216,6 +240,32 @@ - ReagentId: Toxin Quantity: 5 +- type: entity + name: dragon flesh + parent: FoodMeatBase + id: FoodMeatDragon + description: The dense meat of the space-era apex predator is oozing with it's mythical ichor. Ironically, best eaten raw. + components: + - type: Tag + tags: + - Raw + - type: Sprite + layers: + - state: dragon + - state: dragon_veins + shader: unshaded + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Ichor + Quantity: 2 + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Ichor + Quantity: 2 + - type: entity name: raw lizard meat parent: FoodMeatBase diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml index 049d7cc857..f5957ae0de 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml @@ -2,6 +2,7 @@ name: trash bag id: TrashBag parent: BaseStorageItem + description: The solution to space pollution. Rubbish removal revolution. components: - type: Sprite netSync: false diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index 3e63d5e4b2..89cbb1b588 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -8,6 +8,9 @@ alarmedBy: - FireAlarm - AirAlarm + - type: Tag + tags: + - RCDDeconstructWhitelist - type: ApcPowerReceiver - type: ExtensionCableReceiver - type: DeviceNetwork diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 58e433de84..9398fde93e 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -97,7 +97,6 @@ - type: Tag tags: - Wall - - RCDDeconstructWhitelist - type: Sprite sprite: Structures/Walls/cult.rsi - type: Icon @@ -336,6 +335,9 @@ id: WallReinforced name: reinforced wall components: + - type: Tag + tags: + - Wall - type: Sprite sprite: Structures/Walls/solid.rsi - type: Icon diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 435b599176..9f09766723 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -28,3 +28,31 @@ effects: - !type:SatiateHunger factor: 1.5 + +- type: reagent + id: Ichor + name: Ichor + group: Biological + desc: An extremely potent regenerative chemical, perfected by space fauna evolution. Produced in the dragon's digestive system, it is seen as an exotic commodity due to the gargantuan effort of hunting for it. + physicalDesc: roaring + color: "#f4692e" + metabolisms: + Drink: + effects: + - !type:SatiateThirst + factor: 1.5 + # Dragon doesn't require airloss healing, so omnizine is still best for humans. + Medicine: + effects: + - !type:HealthChange + damage: + groups: + Burn: -5 + Brute: -5 + Toxin: -2 + types: + Bloodloss: -5 + # Just in case you REALLY want to water your plants + plantMetabolism: + - !type:PlantAdjustWater + amount: 0.5 diff --git a/Resources/Prototypes/Reagents/fun.yml b/Resources/Prototypes/Reagents/fun.yml index 5eff994bf3..929a6fc3a3 100644 --- a/Resources/Prototypes/Reagents/fun.yml +++ b/Resources/Prototypes/Reagents/fun.yml @@ -17,6 +17,14 @@ type: Local messages: [ "carpetium-effect-blood-fibrous", "carpetium-effect-jumpsuit-insides" ] probability: 0.1 + # Hail the madman logic, if it has CARP, means it helps against CARPs + - !type:AdjustReagent + conditions: + - !type:ReagentThreshold + reagent: CarpoToxin + min: 1 + reagent: CarpoToxin + amount: -3 - type: reagent id: Fiber diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 953d53216f..0ae63ad745 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -539,6 +539,7 @@ - !type:SatiateHunger factor: -1 + # Should heal quite literally everything, use in very small amounts - type: reagent id: Omnizine name: reagent-name-omnizine @@ -598,3 +599,4 @@ min: 1 reagent: Ultravasculine amount: 0.5 + diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index b0a5485dfa..15ac3cad36 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -18,6 +18,30 @@ types: Poison: 2 +- type: reagent + id: CarpoToxin + name: Carpotoxin + group: Toxins + desc: Toxic secretions of a space carp. Causes a painful burning sensation. + color: "#e2a38c" + physicalDesc: exotic-smelling + plantMetabolism: + - !type:PlantAdjustToxins + amount: 10 + - !type:PlantAdjustHealth + amount: -5 + metabolisms: + Poison: + effects: + - !type:HealthChange + damage: + types: + Poison: 4 + - !type:PopupMessage + type: Local + messages: [ "generic-reagent-effect-burning-insides" ] + probability: 0.33 + - type: reagent id: PolytrinicAcid name: reagent-name-polytrinic-acid @@ -164,7 +188,7 @@ - !type:HealthChange damage: types: - Asphyxiation: 4 + Asphyxiation: 2 plantMetabolism: - !type:PlantAdjustToxins amount: 10 @@ -215,7 +239,7 @@ - !type:HealthChange conditions: - !type:ReagentThreshold - min: 30 + min: 45 damage: groups: Brute: 2 @@ -228,7 +252,7 @@ - !type:PopupMessage conditions: - !type:ReagentThreshold - min: 30 + min: 45 type: Local messages: [ "histamine-effect-heavy-itchiness" ] probability: 0.2 diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 88f19cef12..3003c1d265 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -392,6 +392,28 @@ # solids: # FoodMeat: 1 +- type: microwaveMealRecipe + id: RecipeCubanCarp + name: cuban carp recipe + result: FoodMealCubancarp + time: 15 + solids: + FoodDough: 1 + FoodCheeseSlice: 2 + FoodChili: 1 + FoodMeatFish: 2 + +- type: microwaveMealRecipe + id: RecipeSashimi + name: sashimi recipe + result: FoodMealCubancarp + time: 15 + reagents: + TableSalt: 1 + solids: + FoodMeatFish: 2 + + - type: microwaveMealRecipe id: RecipeMisoColaSoup name: salty sweet milocola soup recipe diff --git a/Resources/Textures/Interface/Actions/carpbirth.png b/Resources/Textures/Interface/Actions/carpbirth.png new file mode 100644 index 0000000000000000000000000000000000000000..15ea2ecf4c3eb3840db46ffd9cb22067ccd7fb59 GIT binary patch literal 618 zcmV-w0+s!VP)Px%BuPX;R9J=8m%nQiK@`V7s|P~ZML`hq2Pg_QVoVC*!jZzpADx|@M66fARE||F z+*%C!57=pEA<3nSMr;H{`vjDLahC%N8H?NREi<=!w-*9?`F6v+H*db*_ujnSz?uyX zil=E{0Ukv*@b^03KiN8Gv<@7-0(AqgpSv6Y96Rg_Oo~HOz-Qk3`nl9@>(*T-T}M*^ zvAs4s=d7VVbD?nsf=Sx&;qD&`a5_9Ww6~Y-1F-qwb*b;ng-bwD{ld{uU=(v7lPWQ? z2o*S-y#c_A>8tnP-rFJDXD@C7U`)Rr+w+uOL`B*G3saDSkqSt1F&C=j1u(hoYTN~? z+fSHI1)i{I0ZiiNT+H8ZJ_jI-V*s)wVX58sZO`8ZU?o`u;IFY3;4$6le25$cG~dNs z@R>(Z1b|&$9<0+e1z@Rt-|Px$lSxEDR9J=8R>6&gFbtd^-r3LgLW-h@D}thuUiOs+a*sWu!8inT>_uk@p=4~& z#2`Dalv2>qhLloIehdK6Q^XKLKu-}v7uGukT&Y}2Y3Dy)O*~E04o@kq`)7o)|1f(G z{U69Xgs?ufl8;o(W7GBFWGGGPNPQp0HGI1@Q zeaEMBc$EVA6fs7G5Z2(Qb5-J&uogK0xUa{f0Kn^~BQH7c$X}(br{v@!UdJ&m#(tb< z6~IolU<*5gTRvi&J|KZQ0k5s(E&OPI*9Wd9IE#yqR6_i#jp$RRh5r9p&|N_7@4ijI z5rJU85pgJh2{egrES88`%qanyKnoHq#<&r|kKVIHm;x*UJ*-;mBOeyAX~ovbWpr8- z&>G)tGT8K*XU(Pp7P;J9n2b+m;W5T_ZN0e?<}~C0eFc+|%^2fa81GNhw8=Aj|E@rb z+&Zbg16sZ{Tx`kteI;v=-)&q4^G^6laxKCED1S}PA{>CygIsLrNe%$tAQN)*&xRYr P00000NkvXXu0mjfLjTSH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/meta.json b/Resources/Textures/Interface/Actions/meta.json index 47a312ecf3..e4661a48c4 100644 --- a/Resources/Textures/Interface/Actions/meta.json +++ b/Resources/Textures/Interface/Actions/meta.json @@ -19,12 +19,15 @@ { "name": "disarm" }, - { - "name": "harm" - }, - { - "name": "manifest" - }, + { + "name": "harm" + }, + { + "name": "manifest" + }, + { + "name": "devour" + } { "name": "ratKingArmy" }, diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive-unshaded.png b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive-unshaded.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1126779287aee669a0f3721bde32723a5a953c GIT binary patch literal 2438 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6%U;1OBOz`%C|gc+x5^GO56 zEIeHtLn`LHy=CYp?aO>TQQ7gea=@+!953TKoAlVd<}xo`?BF$BIUt~jWxM02>AFg_ zT@35X)62@f{kI8f5%Ib9`s1H8noP9bkr*n!ug+}eahtYZEDH>xALQ)q-OnI0 zZ3C;_zCClkwI6OjUwy{*ZjMP6NIYc2SKSW=KhL`=MEXD0XAoA|`_q2c^`-CXd)I$0 zbOwpciDulsg>~MpTmP%7tZH}e-#_cu--A)=x27Gd4`Q&}{qw%GHOpouzungpi}=s~ zy+6PH{d>K=?Qr(Ry(wYU*~l7qn9Jh2!OiyP);@pa&!68MeopNB z-lrf{dqoQ-2}M8nuJd))ls)I}*FQghJ+>?ESp60E25%_vR-4vH!~f6f@;>)Z1Bi{@MnnOXq?f z+rQ>XI5T-gDM!&3rcH_7z5kWk8-n>9*E9s&&#LE6XmYMy&C3ulpHQ^ojBhGRI2a?6 z&iP6v2V-#3v0+@W5|MN=Sr#Y)lTNloJ!8fRv5Gsky_IJ^K7G2yUS?NS?KOjcOc!S8 zeyFka`?o);e?LRc5h?Y9LFZpC&X%#}JG^w+z10jRVM*M3u9^S(Fz1-f_IQ8)<@(>h zhX?QfKQCE*^8T+s%y}J7I!{8x~)=!Swyr`@R2uM!mTo^Jwpd*FVI$4_slI_RIFe((7vz z&zWxD!5Y`BD&8b_e18N()Vgocf!W+K#W7L+KX<7R5@kjqNuPEgB^nXo5>D=AN3J+T!PJaG)e;30Q81l&9bL{o_2J z!^+w7t2mNamu#JPyuOUVORV6O;)#C=tSNV|+5B_0W16Cq(0iYm`F->go`ihXme8o9 wiV7FnMib9y;u+eBXSC89t+e3Hn!o({4{C00JM}sj*sx;oboFyt=akR{06LN|p#T5? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive.png b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9baa9d8eebebc1e9e4bd4f7dc80d8578922f41 GIT binary patch literal 14934 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

>kuRuG&l$f3<)G4)`08wH|cq~Z;kp*yx zBMaaX$A2Nf&dyF({nOLaZ%sb?%L@Sc)zwwEv9aL}4h|ZB{y!7IT6GwnpPxPXi;IiG z`b~L7>jLQDSalT4&CQiaH{}(r3Ltl$nVBi(US3{Gd$4v4672f=+Re|;`}XYYtmGAS z(3$`-@_;cSR1p`n&NCnn#w8D05ul2^#pC1Sz-M4}fDl%MadSbdA%LZ0A~0ujg2;iV zr>D|hgpde5jD15)M1bCby0|B;=7?9YwY633vtrnOObjc8yrGF)(6|61P21^oyk$7N z`VxYyZi!ZjvAMbFJtro_?Ch+&y1E)G7mO`{tZnBY$3c7ZZed};O;1mI^6GDIZhrrs} zns-aJA|ryz;0R$wu*5_?pa|pI5Ph5T6cHdmavM|*52_hr zXzdoT$p#V-MF>@DD=RBS3vt$Qcdjhv&d<;NIxVjkY)LE&+x1b;_Sr;OI|Lxap+y)G z!UM0buX~~*&wl#Dsy=y!!~)@UDA+{Ezy1CFkrLrZ0!ZO7ULhyzS`qA6^*-czy-j-T zQ*7JT#yfkIW3Vn~Q6iKGtI2*IBcvg?P0P$kGnA;7hU6;$bg zDiJKnki0}>UgWHIg?-j_%Pwo))qw5jeQU+5>q==z9DNlxL6`&F(P#Ew`)eCZW?V**sYffnT$B+*K{8(D@Z}8{tt}7u#%qGI#n)j4nhlgGS zNJA7NA{o0T-`?JQGQ)cM0;A{3T@j^NQb<_xlO!&blAwgB0tfHy@qJ}s+Qr4iV$c2k zebKk`wulM8Hvm?Ix}WUop!R2hSTO=D>DYcHTg9^Keu^jEHvLfOwjn|zUx-*&9rTGz z$(9gOcqs1Gl4}sCpKm5ELgU{E4T@WvYz?vE2C{REnODe73a$Pw5X&)r(j`l)KWXyd hOZ+@OEcs3ne*yGeqr0mH!RG(~002ovPDHLkV1jfYO7Z{z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/meta.json new file mode 100644 index 0000000000..b29668aed9 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/meta.json @@ -0,0 +1,80 @@ +{ + "version": 1, + "size": { + "x": 64, + "y": 64 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/Toastgoats/tgstation/commit/024a840eed2a1be3f72435c2bb39faac8025f822", + "states": [ + { + "name": "alive", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "alive-unshaded", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "crit" + }, + { + "name": "dead" + }, + { + "name": "dead-unshaded" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a85807e247c30b2fd90e3f2d73af2f0722202b0 GIT binary patch literal 462 zcmV;<0WtoGP)Px$h)G02R9J=WltD|vU>L`LD+wD4veGe_79rTNgNGo$L)Yj7c}Ri3k?!5S!c7ws{JA|Chac_J5z}_dI(y5E2sl?~>w}Yf9Y?#;&c) zSUG}9#3^2sa+EX$fKOHadC*#fiUStOR8#79St_7vvK#B06LyYv0T{K1zBRy|-HQYf zYPd*W+2?!5zF6O!plb3`h*5ips>v9p#iKoN_pE~12m@FqXA-I=lju*}uAM7DNmD3F zIf_z_vQ$`lejvsf@X9bPUm@?Sf%$}-^U^mbD|1Bx@Q(bQ=|bXQJP6d$yUeUFuvk!} zSJ2VBZr9%84irF!B!+3Z_m2N&^ZwV|p%duMhU7^x&|k^C9Qei=9BqcAyDn*pTm05| zS|6Y}ZAchZ`>ax-LzjG32Vnd$1|XGA0kGZL^6d+D-kdg;eg%>LVyDTfeNx(wY6s?> zuPPo3z=1f-=0klCZ_lBH*8*@L!aPw53keAc3H=#;12v4HdQ@x+*#H0l07*qoM6N<$ Eg5E;UY5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon_veins.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon_veins.png new file mode 100644 index 0000000000000000000000000000000000000000..6b35cc5900d8fe4000d46d8994ccfd78e3adc952 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}-JULvArY-_ zFK^^+P!M6caQVn7);k@RH#+B8{&PDvuj@#@YoideBiH0=)uYcX7!;I#ZPr+{*Lazr zqFC~-=XPeDO1rA#OCL>3n>Fd(z1K2K=St6BGtZVUUes~T?be70U4%-J>M?fTCTqSFQbc#%avD5Z!K+Ar|GUc1auaIr>mdK II;Vst0F(JtXaE2J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json index 5a34066758..79eb49da9f 100644 --- a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json @@ -170,6 +170,12 @@ }, { "name": "xeno" + }, + { + "name": "dragon" + }, + { + "name": "dragon_veins" } ] } diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png index bb13533c0cf7c4353a3f855ec724d7591ef33f17..88866eb16936a2b0f524d6613b81ceaff6aec343 100644 GIT binary patch delta 131 zcmV-}0DS+;0j&X$F??r9L_t(oh3(T(3cw%;24FXKLp_W)u*-Nx_ZAU76poE;|Mw(e zDM~~D0Drg5CNgvMXYM|IKZTj2XJ#>KYSpolTuQ02s*;Fg>(icoA!%s>s#@cA8n-oY lRngYtD|p8@1ONc|v=cPnCmT=W*Q@{l002ovPDHLkV1h&#H=Y0h delta 162 zcmZ3>c$#s7VLeN_qpu?a!^VE@KZ&di3=EtF9+AZi419+{nDKc2iWHz=f~SjPNQC>_ z%Z^+P4jiljue;)oNxw+7dF-N~t2D!nebKM{$M<cHwGc4||DENN+z4y2C zp Date: Thu, 16 Jun 2022 00:15:09 -0400 Subject: [PATCH 26/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 274eaa1390..5e5de80e8f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,14 +1,4 @@ Entries: -- author: Rane - changes: - - {message: Drones now have an innate flashlight., type: Add} - - {message: Onestar Mechs are no longer bound by drone laws., type: Fix} - - {message: Drones can now toggle all their innate tools within range of people., - type: Tweak} - - {message: 'Added power cells, toolboxes and certain boxes to the drone whitelist.', - type: Tweak} - id: 1199 - time: '2022-03-13T09:53:01.0000000+00:00' - author: mirrorcult changes: - {message: Plant produce now scales in size depending on its potency., type: Add} @@ -2996,3 +2986,21 @@ Entries: Sorry griefers, maybe sec will be tolerable to play now.', type: Tweak} id: 1698 time: '2022-06-16T01:10:03.0000000+00:00' +- author: CrudeWax + changes: + - {message: Nanotrasen's deeper research into the space-faring carpfish has proven + that their meat contains extremely potent poison!, type: Add} + - {message: 'New carp meat dishes are on the menu for experienced cooks! Their taste + can only be described as "Exotic", by those willing to stomach their lethal + effects.', type: Add} + - {message: 'It seems like the carpfish kind also have an apex predator among their + ranks, be warned of large influxes of organic activity and leviathan space-faring + creatures', type: Add} + - {message: Some carp appear to be smarter than others and capable of humanlike + speech, type: Add} + - {message: 'due to overuse of heartstopper toxin, and it''s more daring carp alternative, + the effects of the former have been greatly reduced', type: Tweak} + - {message: Space-faring carp will no longer die of being exposed to the coldness + of space, type: Fix} + id: 1699 + time: '2022-06-16T04:14:06.0000000+00:00' From 1e82d0c7eded720f58a15da0104900421da0a699 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 16 Jun 2022 15:28:16 +1000 Subject: [PATCH 27/89] Add docking window to shuttle consoles (#8756) * lewd * A * Realtime * Sleepy dork * Draw radar position * Accurate infiltrator * experiments * Better drawing * Labels * I need aan adult * Cleanup * Show toggles * display I guess * A * fix * fix * cleanupsies * Bit more polish * Make sure mass scanners actually work * Remove dummy state * fren * opposite * aghost crash * comment * What's in a name * woops * Show docking ports * Dock highlighting * Drawing dock * Shitty docks * Lots of docking drawing * Autodock working * dork * More graceful shutdown * zoomies * Lines and distance change * revert * Good enough * cleanup * Fix default range * Dock UI and loc update * Update on undock * Loc fixes --- Content.Client/Radar/RadarConsoleWindow.xaml | 8 - .../Radar/RadarConsoleWindow.xaml.cs | 116 ------ .../BUI/RadarConsoleBoundUserInterface.cs | 29 ++ .../BUI/ShuttleConsoleBoundUserInterface.cs | 70 ++++ .../Shuttles/ShuttleConsoleComponent.cs | 8 +- .../Shuttles/ShuttleConsoleSystem.cs | 9 - .../Shuttles/Systems/DockingSystem.cs | 21 ++ .../Shuttles/Systems/RadarConsoleSystem.cs | 8 + .../Shuttles/Systems/ShuttleConsoleSystem.cs | 37 ++ Content.Client/Shuttles/UI/DockingControl.cs | 251 +++++++++++++ .../Shuttles/UI/RadarConsoleWindow.xaml | 6 + .../Shuttles/UI/RadarConsoleWindow.xaml.cs | 22 ++ Content.Client/Shuttles/UI/RadarControl.cs | 348 ++++++++++++++++++ .../Shuttles/UI/ShuttleConsoleWindow.xaml | 81 ++++ .../Shuttles/UI/ShuttleConsoleWindow.xaml.cs | 239 ++++++++++++ Content.Server/Alert/Click/StopPiloting.cs | 2 +- .../EntitySystems/AutomaticAtmosSystem.cs | 2 +- .../Physics/Controllers/MoverController.cs | 4 +- Content.Server/Radar/RadarConsoleComponent.cs | 9 - Content.Server/Radar/RadarConsoleSystem.cs | 61 --- .../Shuttles/Components/AutoDockComponent.cs | 14 + .../Components/RecentlyDockedComponent.cs | 15 + .../Shuttles/Components/ShuttleComponent.cs | 8 +- .../Components/ShuttleConsoleComponent.cs | 11 +- .../Shuttles/Components/ThrusterComponent.cs | 2 +- Content.Server/Shuttles/DockCommand.cs | 2 +- .../EntitySystems/ShuttleConsoleSystem.cs | 250 ------------- Content.Server/Shuttles/Events/DockEvent.cs | 15 + Content.Server/Shuttles/Events/UndockEvent.cs | 15 + .../Systems/DockingSystem.AutoDock.cs | 104 ++++++ .../DockingSystem.cs | 139 +++---- .../Shuttles/Systems/RadarConsoleSystem.cs | 29 ++ .../Shuttles/Systems/ShuttleConsoleSystem.cs | 337 +++++++++++++++++ .../ShuttleSystem.cs | 2 +- .../SpaceGarbageSystem.cs | 2 +- .../ThrusterSystem.cs | 4 +- .../Station/Systems/StationSystem.cs | 18 +- .../Radar/RadarConsoleBoundInterfaceState.cs | 37 -- .../RadarConsoleBoundInterfaceState.cs | 41 +++ .../ShuttleConsoleBoundInterfaceState.cs | 20 + .../Components/RadarConsoleComponent.cs | 21 ++ .../Components/SharedShuttleComponent.cs | 11 +- .../SharedShuttleConsoleComponent.cs | 10 +- .../Shuttles/Events/AutodockRequestMessage.cs | 12 + .../Events/ShuttleModeRequestMessage.cs | 13 + .../Events/StopAutodockRequestMessage.cs | 12 + .../Shuttles/Events/UndockRequestMessage.cs | 12 + .../Systems/SharedRadarConsoleSystem.cs | 45 +++ .../SharedShuttleConsoleSystem.cs | 33 +- Resources/Locale/en-US/misc-computers.ftl | 3 +- Resources/Locale/en-US/shuttles/console.ftl | 23 +- .../Machines/Computers/computers.yml | 10 + 52 files changed, 1935 insertions(+), 666 deletions(-) delete mode 100644 Content.Client/Radar/RadarConsoleWindow.xaml delete mode 100644 Content.Client/Radar/RadarConsoleWindow.xaml.cs create mode 100644 Content.Client/Shuttles/BUI/RadarConsoleBoundUserInterface.cs create mode 100644 Content.Client/Shuttles/BUI/ShuttleConsoleBoundUserInterface.cs delete mode 100644 Content.Client/Shuttles/ShuttleConsoleSystem.cs create mode 100644 Content.Client/Shuttles/Systems/DockingSystem.cs create mode 100644 Content.Client/Shuttles/Systems/RadarConsoleSystem.cs create mode 100644 Content.Client/Shuttles/Systems/ShuttleConsoleSystem.cs create mode 100644 Content.Client/Shuttles/UI/DockingControl.cs create mode 100644 Content.Client/Shuttles/UI/RadarConsoleWindow.xaml create mode 100644 Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs create mode 100644 Content.Client/Shuttles/UI/RadarControl.cs create mode 100644 Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml create mode 100644 Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml.cs delete mode 100644 Content.Server/Radar/RadarConsoleComponent.cs delete mode 100644 Content.Server/Radar/RadarConsoleSystem.cs create mode 100644 Content.Server/Shuttles/Components/AutoDockComponent.cs create mode 100644 Content.Server/Shuttles/Components/RecentlyDockedComponent.cs delete mode 100644 Content.Server/Shuttles/EntitySystems/ShuttleConsoleSystem.cs create mode 100644 Content.Server/Shuttles/Events/DockEvent.cs create mode 100644 Content.Server/Shuttles/Events/UndockEvent.cs create mode 100644 Content.Server/Shuttles/Systems/DockingSystem.AutoDock.cs rename Content.Server/Shuttles/{EntitySystems => Systems}/DockingSystem.cs (82%) create mode 100644 Content.Server/Shuttles/Systems/RadarConsoleSystem.cs create mode 100644 Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs rename Content.Server/Shuttles/{EntitySystems => Systems}/ShuttleSystem.cs (99%) rename Content.Server/Shuttles/{EntitySystems => Systems}/SpaceGarbageSystem.cs (94%) rename Content.Server/Shuttles/{EntitySystems => Systems}/ThrusterSystem.cs (99%) delete mode 100644 Content.Shared/Radar/RadarConsoleBoundInterfaceState.cs create mode 100644 Content.Shared/Shuttles/BUIStates/RadarConsoleBoundInterfaceState.cs create mode 100644 Content.Shared/Shuttles/BUIStates/ShuttleConsoleBoundInterfaceState.cs create mode 100644 Content.Shared/Shuttles/Components/RadarConsoleComponent.cs create mode 100644 Content.Shared/Shuttles/Events/AutodockRequestMessage.cs create mode 100644 Content.Shared/Shuttles/Events/ShuttleModeRequestMessage.cs create mode 100644 Content.Shared/Shuttles/Events/StopAutodockRequestMessage.cs create mode 100644 Content.Shared/Shuttles/Events/UndockRequestMessage.cs create mode 100644 Content.Shared/Shuttles/Systems/SharedRadarConsoleSystem.cs rename Content.Shared/Shuttles/{ => Systems}/SharedShuttleConsoleSystem.cs (55%) diff --git a/Content.Client/Radar/RadarConsoleWindow.xaml b/Content.Client/Radar/RadarConsoleWindow.xaml deleted file mode 100644 index 92e25bf7fc..0000000000 --- a/Content.Client/Radar/RadarConsoleWindow.xaml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/Content.Client/Radar/RadarConsoleWindow.xaml.cs b/Content.Client/Radar/RadarConsoleWindow.xaml.cs deleted file mode 100644 index 048541ebe4..0000000000 --- a/Content.Client/Radar/RadarConsoleWindow.xaml.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using Content.Client.Computer; -using Content.Shared.Radar; -using JetBrains.Annotations; -using Robust.Client.AutoGenerated; -using Robust.Client.GameObjects; -using Robust.Client.Graphics; -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.CustomControls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Maths; - -namespace Content.Client.Radar; - -[GenerateTypedNameReferences] -public sealed partial class RadarConsoleWindow : DefaultWindow, IComputerWindow -{ - public RadarConsoleWindow() - { - RobustXamlLoader.Load(this); - } - - public void SetupComputerWindow(ComputerBoundUserInterfaceBase cb) - { - - } - - public void UpdateState(RadarConsoleBoundInterfaceState scc) - { - Radar.UpdateState(scc); - } -} - - -public sealed class RadarControl : Control -{ - private const int MinimapRadius = 256; - private const int MinimapMargin = 4; - private const float GridLinesDistance = 32f; - - private float _radarRange = 256f; - private RadarConsoleBoundInterfaceState _lastState = new(256f, Array.Empty()); - - private int SizeFull => (int) ((MinimapRadius + MinimapMargin) * 2 * UIScale); - private int ScaledMinimapRadius => (int) (MinimapRadius * UIScale); - private float MinimapScale => _radarRange != 0 ? ScaledMinimapRadius / _radarRange : 0f; - - public RadarControl() - { - MinSize = (SizeFull, SizeFull); - } - - public void UpdateState(RadarConsoleBoundInterfaceState ls) - { - if (!_radarRange.Equals(ls.Range)) - { - _radarRange = ls.Range; - } - - _lastState = ls; - } - - protected override void Draw(DrawingHandleScreen handle) - { - var point = SizeFull / 2; - var fakeAA = new Color(0.08f, 0.08f, 0.08f); - var gridLines = new Color(0.08f, 0.08f, 0.08f); - var gridLinesRadial = 8; - var gridLinesEquatorial = (int) Math.Floor(_radarRange / GridLinesDistance); - - handle.DrawCircle((point, point), ScaledMinimapRadius + 1, fakeAA); - handle.DrawCircle((point, point), ScaledMinimapRadius, Color.Black); - - for (var i = 1; i < gridLinesEquatorial + 1; i++) - { - handle.DrawCircle((point, point), GridLinesDistance * MinimapScale * i, gridLines, false); - } - - for (var i = 0; i < gridLinesRadial; i++) - { - Angle angle = (Math.PI / gridLinesRadial) * i; - var aExtent = angle.ToVec() * ScaledMinimapRadius; - handle.DrawLine((point, point) - aExtent, (point, point) + aExtent, gridLines); - } - - handle.DrawLine((point, point) + new Vector2(8, 8), (point, point) - new Vector2(0, 8), Color.Yellow); - handle.DrawLine((point, point) + new Vector2(-8, 8), (point, point) - new Vector2(0, 8), Color.Yellow); - - foreach (var obj in _lastState.Objects) - { - var minimapPos = obj.Position * MinimapScale; - var radius = obj.Radius * MinimapScale; - - if (minimapPos.Length + radius > ScaledMinimapRadius) - continue; - - switch (obj.Shape) - { - case RadarObjectShape.CircleFilled: - case RadarObjectShape.Circle: - { - handle.DrawCircle(minimapPos + point, radius, obj.Color, obj.Shape == RadarObjectShape.CircleFilled); - break; - } - default: - throw new NotImplementedException(); - } - } - } -} - -[UsedImplicitly] -public sealed class RadarConsoleBoundUserInterface : ComputerBoundUserInterface -{ - public RadarConsoleBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) {} -} diff --git a/Content.Client/Shuttles/BUI/RadarConsoleBoundUserInterface.cs b/Content.Client/Shuttles/BUI/RadarConsoleBoundUserInterface.cs new file mode 100644 index 0000000000..4c5b4edea8 --- /dev/null +++ b/Content.Client/Shuttles/BUI/RadarConsoleBoundUserInterface.cs @@ -0,0 +1,29 @@ +using Content.Client.Shuttles.UI; +using Content.Shared.Shuttles.BUIStates; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Shuttles.BUI; + +[UsedImplicitly] +public sealed class RadarConsoleBoundUserInterface : BoundUserInterface +{ + private RadarConsoleWindow? _window; + + public RadarConsoleBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) {} + + protected override void Open() + { + base.Open(); + _window = new RadarConsoleWindow(); + _window?.OpenCentered(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + if (state is not RadarConsoleBoundInterfaceState cState) return; + + _window?.UpdateState(cState); + } +} diff --git a/Content.Client/Shuttles/BUI/ShuttleConsoleBoundUserInterface.cs b/Content.Client/Shuttles/BUI/ShuttleConsoleBoundUserInterface.cs new file mode 100644 index 0000000000..cb60508c31 --- /dev/null +++ b/Content.Client/Shuttles/BUI/ShuttleConsoleBoundUserInterface.cs @@ -0,0 +1,70 @@ +using Content.Client.Shuttles.UI; +using Content.Shared.Shuttles.BUIStates; +using Content.Shared.Shuttles.Components; +using Content.Shared.Shuttles.Events; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Shuttles.BUI; + +[UsedImplicitly] +public sealed class ShuttleConsoleBoundUserInterface : BoundUserInterface +{ + private ShuttleConsoleWindow? _window; + + public ShuttleConsoleBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) {} + + protected override void Open() + { + base.Open(); + _window = new ShuttleConsoleWindow(); + _window.ShuttleModePressed += OnShuttleModePressed; + _window.UndockPressed += OnUndockPressed; + _window.StartAutodockPressed += OnAutodockPressed; + _window.StopAutodockPressed += OnStopAutodockPressed; + _window.OpenCentered(); + _window.OnClose += OnClose; + } + + private void OnClose() + { + Close(); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) + { + _window?.Dispose(); + } + } + + private void OnStopAutodockPressed(EntityUid obj) + { + SendMessage(new StopAutodockRequestMessage() {Entity = obj}); + } + + private void OnAutodockPressed(EntityUid obj) + { + SendMessage(new AutodockRequestMessage() {Entity = obj}); + } + + private void OnUndockPressed(EntityUid obj) + { + SendMessage(new UndockRequestMessage() {Entity = obj}); + } + + private void OnShuttleModePressed(ShuttleMode obj) + { + SendMessage(new ShuttleModeRequestMessage() {Mode = obj}); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + if (state is not ShuttleConsoleBoundInterfaceState cState) return; + _window?.UpdateState(cState); + } +} diff --git a/Content.Client/Shuttles/ShuttleConsoleComponent.cs b/Content.Client/Shuttles/ShuttleConsoleComponent.cs index 86c4410b86..da6b914794 100644 --- a/Content.Client/Shuttles/ShuttleConsoleComponent.cs +++ b/Content.Client/Shuttles/ShuttleConsoleComponent.cs @@ -1,13 +1,7 @@ -using Content.Shared.Shuttles; using Content.Shared.Shuttles.Components; -using Robust.Shared.GameObjects; namespace Content.Client.Shuttles { [RegisterComponent] - [ComponentReference(typeof(SharedShuttleConsoleComponent))] - internal sealed class ShuttleConsoleComponent : SharedShuttleConsoleComponent - { - - } + public sealed class ShuttleConsoleComponent : SharedShuttleConsoleComponent {} } diff --git a/Content.Client/Shuttles/ShuttleConsoleSystem.cs b/Content.Client/Shuttles/ShuttleConsoleSystem.cs deleted file mode 100644 index cb0f6f7b0c..0000000000 --- a/Content.Client/Shuttles/ShuttleConsoleSystem.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Content.Shared.Shuttles; - -namespace Content.Client.Shuttles -{ - internal sealed class ShuttleConsoleSystem : SharedShuttleConsoleSystem - { - - } -} diff --git a/Content.Client/Shuttles/Systems/DockingSystem.cs b/Content.Client/Shuttles/Systems/DockingSystem.cs new file mode 100644 index 0000000000..61f0b8d06c --- /dev/null +++ b/Content.Client/Shuttles/Systems/DockingSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Shuttles.Events; + +namespace Content.Client.Shuttles.Systems; + +public sealed class DockingSystem : EntitySystem +{ + public void StartAutodock(EntityUid uid) + { + RaiseNetworkEvent(new AutodockRequestMessage {Entity = uid}); + } + + public void StopAutodock(EntityUid uid) + { + RaiseNetworkEvent(new StopAutodockRequestMessage() {Entity = uid}); + } + + public void Undock(EntityUid uid) + { + RaiseNetworkEvent(new UndockRequestMessage() {Entity = uid}); + } +} diff --git a/Content.Client/Shuttles/Systems/RadarConsoleSystem.cs b/Content.Client/Shuttles/Systems/RadarConsoleSystem.cs new file mode 100644 index 0000000000..0a0ddcf2ee --- /dev/null +++ b/Content.Client/Shuttles/Systems/RadarConsoleSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Shuttles.Systems; + +namespace Content.Client.Shuttles.Systems; + +public sealed class RadarConsoleSystem : SharedRadarConsoleSystem +{ + +} diff --git a/Content.Client/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Client/Shuttles/Systems/ShuttleConsoleSystem.cs new file mode 100644 index 0000000000..7ae419c358 --- /dev/null +++ b/Content.Client/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -0,0 +1,37 @@ +using Content.Shared.Shuttles.Components; +using Content.Shared.Shuttles.Events; +using Content.Shared.Shuttles.Systems; +using Robust.Shared.GameStates; + +namespace Content.Client.Shuttles.Systems +{ + public sealed class ShuttleConsoleSystem : SharedShuttleConsoleSystem + { + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnHandleState); + } + + private void OnHandleState(EntityUid uid, PilotComponent component, ref ComponentHandleState args) + { + if (args.Current is not PilotComponentState state) return; + + var console = state.Console.GetValueOrDefault(); + if (!console.IsValid()) + { + component.Console = null; + return; + } + + if (!TryComp(console, out var shuttleConsoleComponent)) + { + Logger.Warning($"Unable to set Helmsman console to {console}"); + return; + } + + component.Console = shuttleConsoleComponent; + ActionBlockerSystem.UpdateCanMove(uid); + } + } +} diff --git a/Content.Client/Shuttles/UI/DockingControl.cs b/Content.Client/Shuttles/UI/DockingControl.cs new file mode 100644 index 0000000000..dfa5023a8a --- /dev/null +++ b/Content.Client/Shuttles/UI/DockingControl.cs @@ -0,0 +1,251 @@ +using Content.Shared.Shuttles.BUIStates; +using Robust.Client.Graphics; +using Robust.Client.UserInterface; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Collision.Shapes; + +namespace Content.Client.Shuttles.UI; + +///

+/// Displays the docking view from a specific docking port +/// +[Virtual] +public class DockingControl : Control +{ + private readonly IEntityManager _entManager; + private readonly IMapManager _mapManager; + + private const int MinimapRadius = 384; + private const int MinimapMargin = 4; + + private float _range = 8f; + private float _rangeSquared = 0f; + private const float GridLinesDistance = 32f; + + private int MidPoint => SizeFull / 2; + private int SizeFull => (int) ((MinimapRadius + MinimapMargin) * 2 * UIScale); + private int ScaledMinimapRadius => (int) (MinimapRadius * UIScale); + private float MinimapScale => _range != 0 ? ScaledMinimapRadius / _range : 0f; + + public EntityUid? ViewedDock; + public EntityUid? GridEntity; + + /// + /// Stored by GridID then by docks + /// + public Dictionary> Docks = new(); + + public DockingControl() + { + _entManager = IoCManager.Resolve(); + _mapManager = IoCManager.Resolve(); + _rangeSquared = _range * _range; + MinSize = (SizeFull, SizeFull); + } + + protected override void Draw(DrawingHandleScreen handle) + { + base.Draw(handle); + + var fakeAA = new Color(0.08f, 0.08f, 0.08f); + + handle.DrawCircle((MidPoint, MidPoint), ScaledMinimapRadius + 1, fakeAA); + handle.DrawCircle((MidPoint, MidPoint), ScaledMinimapRadius, Color.Black); + + var gridLines = new Color(0.08f, 0.08f, 0.08f); + var gridLinesRadial = 8; + var gridLinesEquatorial = (int) Math.Floor(_range / GridLinesDistance); + + for (var i = 1; i < gridLinesEquatorial + 1; i++) + { + handle.DrawCircle((MidPoint, MidPoint), GridLinesDistance * MinimapScale * i, gridLines, false); + } + + for (var i = 0; i < gridLinesRadial; i++) + { + Angle angle = (Math.PI / gridLinesRadial) * i; + var aExtent = angle.ToVec() * ScaledMinimapRadius; + handle.DrawLine((MidPoint, MidPoint) - aExtent, (MidPoint, MidPoint) + aExtent, gridLines); + } + + if (!_entManager.TryGetComponent(ViewedDock, out var xform) || + !_entManager.TryGetComponent(GridEntity, out var gridXform)) return; + + var rotation = Matrix3.CreateRotation(xform.LocalRotation); + var matrix = Matrix3.CreateTranslation(-xform.LocalPosition); + + // Draw the fixtures around the dock before drawing it + if (_entManager.TryGetComponent(GridEntity, out var fixtures)) + { + foreach (var (_, fixture) in fixtures.Fixtures) + { + var poly = (PolygonShape) fixture.Shape; + + for (var i = 0; i < poly.VertexCount; i++) + { + var start = matrix.Transform(poly.Vertices[i]); + var end = matrix.Transform(poly.Vertices[(i + 1) % poly.VertexCount]); + + var startOut = start.LengthSquared > _rangeSquared; + var endOut = end.LengthSquared > _rangeSquared; + + // We need to draw to the radar border so we'll cap the range, + // but if none of the verts are in range then just leave it. + if (startOut && endOut) + continue; + + start.Y = -start.Y; + end.Y = -end.Y; + + // If start is outside we draw capped from end to start + if (startOut) + { + // It's called Jobseeker now. + if (!MathHelper.TryGetIntersecting(start, end, _range, out var newStart)) continue; + start = newStart.Value; + } + // otherwise vice versa + else if (endOut) + { + if (!MathHelper.TryGetIntersecting(end, start, _range, out var newEnd)) continue; + end = newEnd.Value; + } + + handle.DrawLine(ScalePosition(start), ScalePosition(end), Color.Goldenrod); + } + } + } + + // Draw the dock's collision + handle.DrawRect(new UIBox2( + ScalePosition(rotation.Transform(new Vector2(-0.2f, -0.7f))), + ScalePosition(rotation.Transform(new Vector2(0.2f, -0.5f)))), Color.Aquamarine); + + // Draw the dock itself + handle.DrawRect(new UIBox2( + ScalePosition(rotation.Transform(new Vector2(-0.5f, 0.5f))), + ScalePosition(rotation.Transform(new Vector2(0.5f, -0.5f)))), Color.Green); + + // Draw nearby grids + var worldPos = gridXform.WorldMatrix.Transform(xform.LocalPosition); + var gridInvMatrix = gridXform.InvWorldMatrix; + Matrix3.Multiply(in gridInvMatrix, in matrix, out var invMatrix); + + // TODO: Getting some overdraw so need to fix that. + + foreach (var grid in _mapManager.FindGridsIntersecting(gridXform.MapID, + new Box2(worldPos - _range, worldPos + _range))) + { + if (grid.GridEntityId == GridEntity) continue; + + // Draw the fixtures before drawing any docks in range. + if (!_entManager.TryGetComponent(grid.GridEntityId, out var gridFixtures)) continue; + + var gridMatrix = grid.WorldMatrix; + + Matrix3.Multiply(in gridMatrix, in invMatrix, out var matty); + + foreach (var (_, fixture) in gridFixtures.Fixtures) + { + var poly = (PolygonShape) fixture.Shape; + + for (var i = 0; i < poly.VertexCount; i++) + { + // This is because the same line might be on different fixtures so we don't want to draw it twice. + var startPos = poly.Vertices[i]; + var endPos = poly.Vertices[(i + 1) % poly.VertexCount]; + + var start = matty.Transform(startPos); + var end = matty.Transform(endPos); + + var startOut = start.LengthSquared > _rangeSquared; + var endOut = end.LengthSquared > _rangeSquared; + + // We need to draw to the radar border so we'll cap the range, + // but if none of the verts are in range then just leave it. + if (startOut && endOut) + continue; + + start.Y = -start.Y; + end.Y = -end.Y; + + // If start is outside we draw capped from end to start + if (startOut) + { + // It's called Jobseeker now. + if (!MathHelper.TryGetIntersecting(start, end, _range, out var newStart)) continue; + start = newStart.Value; + } + // otherwise vice versa + else if (endOut) + { + if (!MathHelper.TryGetIntersecting(end, start, _range, out var newEnd)) continue; + end = newEnd.Value; + } + + handle.DrawLine(ScalePosition(start), ScalePosition(end), Color.Aquamarine); + } + } + + // Draw any docks on that grid + if (Docks.TryGetValue(grid.GridEntityId, out var gridDocks)) + { + foreach (var dock in gridDocks) + { + var position = matty.Transform(dock.Coordinates.Position); + + if (position.Length > _range - 0.8f) continue; + + var otherDockRotation = Matrix3.CreateRotation(dock.Angle); + + // Draw the dock's collision + var verts = new[] + { + matty.Transform(dock.Coordinates.Position + + otherDockRotation.Transform(new Vector2(-0.2f, -0.7f))), + matty.Transform(dock.Coordinates.Position + + otherDockRotation.Transform(new Vector2(0.2f, -0.7f))), + matty.Transform(dock.Coordinates.Position + + otherDockRotation.Transform(new Vector2(0.2f, -0.5f))), + matty.Transform(dock.Coordinates.Position + + otherDockRotation.Transform(new Vector2(-0.2f, -0.5f))), + }; + + for (var i = 0; i < verts.Length; i++) + { + var vert = verts[i]; + vert.Y = -vert.Y; + verts[i] = ScalePosition(vert); + } + + handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, Color.Turquoise); + + // Draw the dock itself + verts = new[] + { + matty.Transform(dock.Coordinates.Position + new Vector2(-0.5f, -0.5f)), + matty.Transform(dock.Coordinates.Position + new Vector2(0.5f, -0.5f)), + matty.Transform(dock.Coordinates.Position + new Vector2(0.5f, 0.5f)), + matty.Transform(dock.Coordinates.Position + new Vector2(-0.5f, 0.5f)), + }; + + for (var i = 0; i < verts.Length; i++) + { + var vert = verts[i]; + vert.Y = -vert.Y; + verts[i] = ScalePosition(vert); + } + + handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, Color.Green); + } + } + } + + } + + private Vector2 ScalePosition(Vector2 value) + { + return value * MinimapScale + MidPoint; + } +} diff --git a/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml new file mode 100644 index 0000000000..7591034b92 --- /dev/null +++ b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml @@ -0,0 +1,6 @@ + + + diff --git a/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs new file mode 100644 index 0000000000..7274cc23c8 --- /dev/null +++ b/Content.Client/Shuttles/UI/RadarConsoleWindow.xaml.cs @@ -0,0 +1,22 @@ +using Content.Client.Computer; +using Content.Client.UserInterface; +using Content.Shared.Shuttles.BUIStates; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.Shuttles.UI; + +[GenerateTypedNameReferences] +public sealed partial class RadarConsoleWindow : FancyWindow, + IComputerWindow +{ + public RadarConsoleWindow() + { + RobustXamlLoader.Load(this); + } + + public void UpdateState(RadarConsoleBoundInterfaceState scc) + { + RadarScreen.UpdateState(scc); + } +} diff --git a/Content.Client/Shuttles/UI/RadarControl.cs b/Content.Client/Shuttles/UI/RadarControl.cs new file mode 100644 index 0000000000..f8d2f8c6e8 --- /dev/null +++ b/Content.Client/Shuttles/UI/RadarControl.cs @@ -0,0 +1,348 @@ +using Content.Client.Stylesheets; +using Content.Shared.Shuttles.BUIStates; +using Robust.Client.Graphics; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Collision.Shapes; +using Robust.Shared.Utility; + +namespace Content.Client.Shuttles.UI; + +/// +/// Displays nearby grids inside of a control. +/// +public sealed class RadarControl : Control +{ + [Dependency] private readonly IEntityManager _entManager = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + + private const float ScrollSensitivity = 8f; + + private const int MinimapRadius = 384; + private const int MinimapMargin = 4; + private const float GridLinesDistance = 32f; + + /// + /// Entity used to transform all of the radar objects. + /// + private EntityUid? _entity; + + private float _radarMinRange = 64f; + private float _radarMaxRange = 256f; + public float RadarRange { get; private set; } = 256f; + + private int MidPoint => SizeFull / 2; + private int SizeFull => (int) ((MinimapRadius + MinimapMargin) * 2 * UIScale); + private int ScaledMinimapRadius => (int) (MinimapRadius * UIScale); + private float MinimapScale => RadarRange != 0 ? ScaledMinimapRadius / RadarRange : 0f; + + /// + /// Shows a label on each radar object. + /// + private Dictionary _iffControls = new(); + + private Dictionary> _docks = new(); + + public bool ShowIFF { get; set; } = true; + public bool ShowDocks { get; set; } = true; + + /// + /// Currently hovered docked to show on the map. + /// + public EntityUid? HighlightedDock; + + public Action? OnRadarRangeChanged; + + public RadarControl() + { + IoCManager.InjectDependencies(this); + MinSize = (SizeFull, SizeFull); + } + + public void UpdateState(RadarConsoleBoundInterfaceState ls) + { + _radarMaxRange = ls.MaxRange; + + if (_radarMaxRange < RadarRange) + { + RadarRange = _radarMaxRange; + OnRadarRangeChanged?.Invoke(RadarRange); + } + + if (_radarMaxRange < _radarMinRange) + _radarMinRange = _radarMaxRange; + + _entity = ls.Entity; + _docks.Clear(); + + foreach (var state in ls.Docks) + { + var coordinates = state.Coordinates; + var grid = _docks.GetOrNew(coordinates.EntityId); + grid.Add(state.Entity, state); + } + } + + protected override void MouseWheel(GUIMouseWheelEventArgs args) + { + base.MouseWheel(args); + AddRadarRange(-args.Delta.Y * ScrollSensitivity); + } + + public void AddRadarRange(float value) + { + var oldValue = RadarRange; + RadarRange = MathF.Max(0f, MathF.Max(_radarMinRange, MathF.Min(RadarRange + value, _radarMaxRange))); + + if (oldValue.Equals(RadarRange)) return; + + OnRadarRangeChanged?.Invoke(RadarRange); + } + + protected override void Draw(DrawingHandleScreen handle) + { + var fakeAA = new Color(0.08f, 0.08f, 0.08f); + + handle.DrawCircle((MidPoint, MidPoint), ScaledMinimapRadius + 1, fakeAA); + handle.DrawCircle((MidPoint, MidPoint), ScaledMinimapRadius, Color.Black); + + // No data + if (_entity == null) + { + Clear(); + return; + } + + var gridLines = new Color(0.08f, 0.08f, 0.08f); + var gridLinesRadial = 8; + var gridLinesEquatorial = (int) Math.Floor(RadarRange / GridLinesDistance); + + for (var i = 1; i < gridLinesEquatorial + 1; i++) + { + handle.DrawCircle((MidPoint, MidPoint), GridLinesDistance * MinimapScale * i, gridLines, false); + } + + for (var i = 0; i < gridLinesRadial; i++) + { + Angle angle = (Math.PI / gridLinesRadial) * i; + var aExtent = angle.ToVec() * ScaledMinimapRadius; + handle.DrawLine((MidPoint, MidPoint) - aExtent, (MidPoint, MidPoint) + aExtent, gridLines); + } + + var metaQuery = _entManager.GetEntityQuery(); + var xformQuery = _entManager.GetEntityQuery(); + var fixturesQuery = _entManager.GetEntityQuery(); + var bodyQuery = _entManager.GetEntityQuery(); + var xform = xformQuery.GetComponent(_entity.Value); + var mapPosition = xform.MapPosition; + + if (mapPosition.MapId == MapId.Nullspace) + { + Clear(); + return; + } + + // Can also use ourGridBody.LocalCenter + var offset = xform.Coordinates.Position; + var offsetMatrix = Matrix3.CreateTranslation(-offset); + Matrix3 matrix; + + // Draw our grid in detail + var ourGridId = xform.GridID; + if (ourGridId != GridId.Invalid) + { + matrix = xform.InvWorldMatrix; + var ourGridFixtures = fixturesQuery.GetComponent(ourGridId); + // Draw our grid; use non-filled boxes so it doesn't look awful. + DrawGrid(handle, offsetMatrix, ourGridFixtures, Color.Yellow); + + DrawDocks(handle, xform.GridEntityId, offsetMatrix); + } + else + { + matrix = Matrix3.CreateTranslation(-offset); + } + + var invertedPosition = xform.Coordinates.Position - offset; + invertedPosition.Y = -invertedPosition.Y; + // Don't need to transform the InvWorldMatrix again as it's already offset to its position. + + // Draw radar position on the station + handle.DrawCircle(ScalePosition(invertedPosition), 5f, Color.Lime); + + var shown = new HashSet(); + + // Draw other grids... differently + foreach (var grid in _mapManager.FindGridsIntersecting(mapPosition.MapId, + new Box2(mapPosition.Position - RadarRange, mapPosition.Position + RadarRange))) + { + if (grid.Index == ourGridId) continue; + + var gridBody = bodyQuery.GetComponent(grid.GridEntityId); + if (gridBody.Mass < 10f) + { + ClearLabel(grid.GridEntityId); + continue; + } + + shown.Add(grid.GridEntityId); + var name = metaQuery.GetComponent(grid.GridEntityId).EntityName; + + if (name == string.Empty) + name = Loc.GetString("shuttle-console-unknown"); + + var gridXform = xformQuery.GetComponent(grid.GridEntityId); + var gridFixtures = fixturesQuery.GetComponent(grid.GridEntityId); + var gridMatrix = gridXform.WorldMatrix; + Matrix3.Multiply(in gridMatrix, in matrix, out var matty); + + if (ShowIFF) + { + if (!_iffControls.TryGetValue(grid.GridEntityId, out var control)) + { + var label = new Label() + { + HorizontalAlignment = HAlignment.Left, + }; + + control = new PanelContainer() + { + HorizontalAlignment = HAlignment.Left, + VerticalAlignment = VAlignment.Top, + Children = { label }, + StyleClasses = { StyleNano.StyleClassTooltipPanel }, + }; + + _iffControls[grid.GridEntityId] = control; + AddChild(control); + } + + var gridCentre = matty.Transform(gridBody.LocalCenter); + gridCentre.Y = -gridCentre.Y; + + // TODO: When we get IFF or whatever we can show controls at a further distance; for now + // we don't do that because it would immediately reveal nukies. + if (gridCentre.Length < RadarRange) + { + control.Visible = true; + var label = (Label) control.GetChild(0); + label.Text = Loc.GetString("shuttle-console-iff-label", ("name", name), ("distance", $"{gridCentre.Length:0.0}")); + LayoutContainer.SetPosition(control, ScalePosition(gridCentre) / UIScale); + } + else + { + control.Visible = false; + } + } + else + { + ClearLabel(grid.GridEntityId); + } + + // Detailed view + DrawGrid(handle, matty, gridFixtures, Color.Aquamarine); + + DrawDocks(handle, grid.GridEntityId, matty); + } + + foreach (var (ent, _) in _iffControls) + { + if (shown.Contains(ent)) continue; + ClearLabel(ent); + } + } + + private void Clear() + { + foreach (var (_, label) in _iffControls) + { + label.Dispose(); + } + + _iffControls.Clear(); + } + + private void ClearLabel(EntityUid uid) + { + if (!_iffControls.TryGetValue(uid, out var label)) return; + label.Dispose(); + _iffControls.Remove(uid); + } + + private void DrawDocks(DrawingHandleScreen handle, EntityUid uid, Matrix3 matrix) + { + if (!ShowDocks) return; + + const float DockScale = 1.2f; + + if (_docks.TryGetValue(uid, out var docks)) + { + foreach (var (ent, state) in docks) + { + var position = state.Coordinates.Position; + var uiPosition = matrix.Transform(position); + + if (uiPosition.Length > RadarRange - DockScale) continue; + + var color = HighlightedDock == ent ? Color.Magenta : Color.DarkViolet; + + uiPosition.Y = -uiPosition.Y; + + var verts = new[] + { + matrix.Transform(position + new Vector2(-DockScale, -DockScale)), + matrix.Transform(position + new Vector2(DockScale, -DockScale)), + matrix.Transform(position + new Vector2(DockScale, DockScale)), + matrix.Transform(position + new Vector2(-DockScale, DockScale)), + }; + + for (var i = 0; i < verts.Length; i++) + { + var vert = verts[i]; + vert.Y = -vert.Y; + verts[i] = ScalePosition(vert); + } + + handle.DrawPrimitives(DrawPrimitiveTopology.TriangleFan, verts, color); + } + } + } + + private void DrawGrid(DrawingHandleScreen handle, Matrix3 matrix, FixturesComponent component, Color color) + { + foreach (var (_, fixture) in component.Fixtures) + { + // If the fixture has any points out of range we won't draw any of it. + var invalid = false; + var poly = (PolygonShape) fixture.Shape; + var verts = new Vector2[poly.VertexCount + 1]; + + for (var i = 0; i < poly.VertexCount; i++) + { + var vert = matrix.Transform(poly.Vertices[i]); + + if (vert.Length > RadarRange) + { + invalid = true; + break; + } + + vert.Y = -vert.Y; + verts[i] = ScalePosition(vert); + } + + if (invalid) continue; + + // Closed list + verts[poly.VertexCount] = verts[0]; + handle.DrawPrimitives(DrawPrimitiveTopology.LineStrip, verts, color); + } + } + + private Vector2 ScalePosition(Vector2 value) + { + return value * MinimapScale + MidPoint; + } +} diff --git a/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml b/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml new file mode 100644 index 0000000000..58d06e575a --- /dev/null +++ b/Content.Client/Shuttles/UI/ShuttleConsoleWindow.xaml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + +

public static readonly CVarDef UpdateRestartDelay = CVarDef.Create("update.restart_delay", 20f, CVar.SERVERONLY); + + /* + * Ghost + */ + + /// + /// The time you must spend reading the rules, before the "Request" button is enabled + /// + public static readonly CVarDef GhostRoleTime = + CVarDef.Create("ghost.role_time", 3f, CVar.REPLICATED); } } diff --git a/Resources/Locale/en-US/ghost/ghost-gui.ftl b/Resources/Locale/en-US/ghost/ghost-gui.ftl index 51bc5529f6..0ec5f1dcac 100644 --- a/Resources/Locale/en-US/ghost/ghost-gui.ftl +++ b/Resources/Locale/en-US/ghost/ghost-gui.ftl @@ -7,7 +7,8 @@ ghost-target-window-current-button = Warp: {$name} ghost-roles-window-title = Ghost Roles ghost-roles-window-request-role-button = Request +ghost-roles-window-request-role-button-timer = Request ({$time}s) ghost-roles-window-follow-role-button = Follow ghost-roles-window-no-roles-available-label = There are currently no available ghost roles. -ghost-roles-window-rules-footer = The button will enable after 5 seconds (this delay is to make sure you read the rules). +ghost-roles-window-rules-footer = The button will enable after {$time} seconds (this delay is to make sure you read the rules). From 4d1533c6fa7c6e06cd6ad877ab2e97155b151898 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 16 Jun 2022 05:57:13 -0400 Subject: [PATCH 60/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 083c8c38fa..42031758df 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: ElectroJr - changes: - - {message: 'Fixed some audio files that were causing sound effects to play globally, - rather than being position-dependent', type: Fix} - id: 1211 - time: '2022-03-15T03:57:54.0000000+00:00' - author: ElectroJr changes: - {message: Fixed some UI bugs. Ian should no longer be able to make announcements, @@ -2993,3 +2987,9 @@ Entries: rather than under the person being uncuffed.', type: Add} id: 1710 time: '2022-06-16T09:42:32.0000000+00:00' +- author: eclips_e + changes: + - {message: Ghost role delay is now a cvar, type: Add} + - {message: Set ghost role delay from 5 seconds to 3 seconds, type: Tweak} + id: 1711 + time: '2022-06-16T09:56:09.0000000+00:00' From 661b31c7a99b13764ac6fc3b2d62fd20cd372ca3 Mon Sep 17 00:00:00 2001 From: Peptide90 <78795277+Peptide90@users.noreply.github.com> Date: Thu, 16 Jun 2022 10:59:19 +0100 Subject: [PATCH 61/89] reduced duck yaml bloat (#8858) Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 28 ++----------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 8e52fc4162..6b76b05b15 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -216,7 +216,7 @@ - type: entity name: white duck #Quack - parent: SimpleMobBase + parent: MobDuckMallard id: MobDuckWhite description: An adorable white duck, it's fluffy and soft! components: @@ -235,22 +235,10 @@ Base: dead-1 Dead: Base: dead-1 - - type: Butcherable - spawned: - - id: FoodMeatDuck - amount: 1 - - type: InteractionPopup - successChance: 0.9 - interactSuccessString: petting-success-bird - interactFailureString: petting-failure-generic - interactSuccessSound: - path: /Audio/Animals/duck_quack_happy.ogg - - type: Bloodstream - bloodMaxVolume: 100 - type: entity name: brown duck #Quack - parent: SimpleMobBase + parent: MobDuckMallard id: MobDuckBrown description: An adorable brown duck, it's fluffy and soft! components: @@ -269,18 +257,6 @@ Base: dead-2 Dead: Base: dead-2 - - type: Butcherable - spawned: - - id: FoodMeatDuck - amount: 1 - - type: InteractionPopup - successChance: 0.9 - interactSuccessString: petting-success-bird - interactFailureString: petting-failure-generic - interactSuccessSound: - path: /Audio/Animals/duck_quack_happy.ogg - - type: Bloodstream - bloodMaxVolume: 100 - type: entity name: butterfly From 7b7c313a9204e527dd467eee2494f531d8ec0ff6 Mon Sep 17 00:00:00 2001 From: Morber <14136326+Morb0@users.noreply.github.com> Date: Thu, 16 Jun 2022 13:21:45 +0300 Subject: [PATCH 62/89] Fix mousetrap crate icon (#8835) --- Resources/Prototypes/Catalog/Cargo/cargo_service.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index 9235bd1692..d1f4a0932b 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -28,7 +28,7 @@ description: "Mousetraps, for when all of service is being haunted by an entire horde of rats. Use sparingly... or not." icon: sprite: Objects/Devices/mousetrap.rsi - state: normal + state: mousetrap product: CrateMousetrapBoxes cost: 1000 category: Service From da2394da3c5fc1f40c7a8e479b6ddaff104e6ac1 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 16 Jun 2022 20:24:56 +1000 Subject: [PATCH 63/89] Fix bagel yml artifact (#8885) --- Resources/Maps/bagel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index 36abc17153..3537d52a93 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -151861,7 +151861,7 @@ entities: - canCollide: False type: Physics - uid: 16091 - type: PowerCellMediumHyper + type: PowerCellHyper components: - pos: 0.56819147,21.03974 parent: 60 From 1e5639ef1b40d47077f5f28211d24b25185224c3 Mon Sep 17 00:00:00 2001 From: Kara Date: Thu, 16 Jun 2022 03:59:13 -0700 Subject: [PATCH 64/89] Fix wide attacking in containers (#8886) --- Content.Server/Interaction/InteractionSystem.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs index 4cbd608afa..591ef3b1a9 100644 --- a/Content.Server/Interaction/InteractionSystem.cs +++ b/Content.Server/Interaction/InteractionSystem.cs @@ -197,6 +197,12 @@ namespace Content.Server.Interaction if (!unobstructed) return; } + else if (ContainerSystem.IsEntityInContainer(user)) + { + // No wide attacking while in containers (holos, lockers, etc). + // Can't think of a valid case where you would want this. + return; + } // Verify user has a hand, and find what object they are currently holding in their active hand if (TryComp(user, out HandsComponent? hands)) From 5a87393ce3b2dc325746ea977a1fa564131313f6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 16 Jun 2022 07:00:17 -0400 Subject: [PATCH 65/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 42031758df..2f22d6621f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: ElectroJr - changes: - - {message: Fixed some UI bugs. Ian should no longer be able to make announcements, - type: Fix} - id: 1212 - time: '2022-03-15T03:59:20.0000000+00:00' - author: Todd changes: - {message: Added flip flap to the lobby themes., type: Add} @@ -2993,3 +2987,10 @@ Entries: - {message: Set ghost role delay from 5 seconds to 3 seconds, type: Tweak} id: 1711 time: '2022-06-16T09:56:09.0000000+00:00' +- author: mirrorcult + changes: + - {message: Holoparasites can no longer attack their owner while recalled using + wide attacks., type: Fix} + - {message: 'You can no longer wide attack inside of lockers, crates, etc.', type: Fix} + id: 1712 + time: '2022-06-16T10:59:13.0000000+00:00' From 63d607f26a699cc968f88b25d5b79d122c2e922c Mon Sep 17 00:00:00 2001 From: wrexbe <81056464+wrexbe@users.noreply.github.com> Date: Thu, 16 Jun 2022 06:36:36 -0700 Subject: [PATCH 66/89] Clean up door remote (#8829) Co-authored-by: metalgearsloth --- Content.Server/Remotes/DoorRemoteSystem.cs | 94 ++++++++++--------- .../Interaction/SharedInteractionSystem.cs | 4 +- .../Locale/en-US/door-remote/door-remote.ftl | 3 + 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index eaa293f990..61a775be97 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -1,5 +1,4 @@ using Robust.Shared.Player; -using Robust.Shared.Audio; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Doors.Components; @@ -8,7 +7,9 @@ using Content.Shared.Physics; using Content.Shared.Access.Components; using Content.Server.Doors.Systems; using Content.Server.Doors.Components; +using Content.Server.Power.EntitySystems; using Content.Shared.Interaction.Events; +using static Content.Server.Remotes.DoorRemoteComponent; namespace Content.Server.Remotes { @@ -21,80 +22,81 @@ namespace Content.Server.Remotes public override void Initialize() { - base.Initialize(); - SubscribeLocalEvent(OnInHandActivation); SubscribeLocalEvent(OnBeforeInteract); } public void OnInHandActivation(EntityUid user, DoorRemoteComponent component, UseInHandEvent args) { + string switchMessageId; switch (component.Mode) { - case DoorRemoteComponent.OperatingMode.OpenClose: - component.Mode = DoorRemoteComponent.OperatingMode.ToggleBolts; - _popupSystem.PopupEntity(Loc.GetString("door-remote-switch-state-toggle-bolts"), args.User, Filter.Entities(args.User)); + case OperatingMode.OpenClose: + component.Mode = OperatingMode.ToggleBolts; + switchMessageId = "door-remote-switch-state-toggle-bolts"; break; - case DoorRemoteComponent.OperatingMode.ToggleBolts: - component.Mode = DoorRemoteComponent.OperatingMode.ToggleEmergencyAccess; - _popupSystem.PopupEntity(Loc.GetString("door-remote-switch-state-toggle-emergency-access"), args.User, Filter.Entities(args.User)); + case OperatingMode.ToggleBolts: + component.Mode = OperatingMode.ToggleEmergencyAccess; + switchMessageId = "door-remote-switch-state-toggle-emergency-access"; break; - case DoorRemoteComponent.OperatingMode.ToggleEmergencyAccess: - component.Mode = DoorRemoteComponent.OperatingMode.OpenClose; - _popupSystem.PopupEntity(Loc.GetString("door-remote-switch-state-open-close"), args.User, Filter.Entities(args.User)); + case OperatingMode.ToggleEmergencyAccess: + component.Mode = OperatingMode.OpenClose; + switchMessageId = "door-remote-switch-state-open-close"; break; + default: + throw new InvalidOperationException( + $"{nameof(DoorRemoteComponent)} had invalid mode {component.Mode}"); } + ShowPopupToUser(switchMessageId, args.User); } private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, BeforeRangedInteractEvent args) { - if (!args.CanReach || - args.Handled + if (args.Handled || args.Target == null - || !TryComp(args.Target, out var doorComponent) // If it isn't a door we don't use it - || !HasComp(args.Target) // Remotes do not work on doors without access requirements - || !TryComp(args.Target, out var airlockComponent) // Remotes only work on airlocks - // TODO: Why the fuck is this -1f - || !_interactionSystem.InRangeUnobstructed(args.User, doorComponent.Owner, -1f, CollisionGroup.Opaque)) - { + || !TryComp(args.Target, out var doorComp) // If it isn't a door we don't use it + || !TryComp(args.Target, out var airlockComp) // Remotes only work on airlocks + // The remote can be used anywhere the user can see the door. + // This doesn't work that well, but I don't know of an alternative + || !_interactionSystem.InRangeUnobstructed(args.User, args.Target.Value, + SharedInteractionSystem.MaxRaycastRange, CollisionGroup.Opaque)) return; - } args.Handled = true; - if (component.Mode == DoorRemoteComponent.OperatingMode.OpenClose) + if (!this.IsPowered(args.Target.Value, EntityManager)) { - _doorSystem.TryToggleDoor(doorComponent.Owner, user: args.Used); + ShowPopupToUser("door-remote-no-power", args.User); + return; } - if (component.Mode == DoorRemoteComponent.OperatingMode.ToggleBolts - && airlockComponent.IsPowered()) + if (TryComp(args.Target, out var accessComponent) && + !_doorSystem.HasAccess(doorComp.Owner, args.Used, accessComponent)) { - if (_doorSystem.HasAccess(doorComponent.Owner, args.Used)) - { - airlockComponent.SetBoltsWithAudio(!airlockComponent.IsBolted()); - } - else - { - if (doorComponent.State != DoorState.Open) - { - _doorSystem.Deny(airlockComponent.Owner, user: args.User); - } - else if (doorComponent.DenySound != null) - { - SoundSystem.Play(doorComponent.DenySound.GetSound(), Filter.Pvs(args.Target.Value, entityManager: EntityManager), args.Target.Value); - } - } + _doorSystem.Deny(airlockComp.Owner, doorComp, args.User); + ShowPopupToUser("door-remote-denied", args.User); + return; } - if (component.Mode == DoorRemoteComponent.OperatingMode.ToggleEmergencyAccess - && airlockComponent.IsPowered()) + switch (component.Mode) { - if (_doorSystem.HasAccess(doorComponent.Owner, args.Used)) - { - _sharedAirlockSystem.ToggleEmergencyAccess(airlockComponent); - } + case OperatingMode.OpenClose: + _doorSystem.TryToggleDoor(doorComp.Owner, doorComp, args.Used); + break; + case OperatingMode.ToggleBolts: + //TODO: What about cut wires...? + airlockComp.SetBoltsWithAudio(!airlockComp.IsBolted()); + break; + case OperatingMode.ToggleEmergencyAccess: + _sharedAirlockSystem.ToggleEmergencyAccess(airlockComp); + break; + default: + throw new InvalidOperationException( + $"{nameof(DoorRemoteComponent)} had invalid mode {component.Mode}"); } } + + private void ShowPopupToUser(string messageId, EntityUid user) => + _popupSystem.PopupEntity(Loc.GetString(messageId), user, Filter.Entities(user)); } } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index be7fca2a1e..c7847a6c6e 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -52,10 +52,10 @@ namespace Content.Shared.Interaction private const CollisionGroup InRangeUnobstructedMask = CollisionGroup.Impassable | CollisionGroup.InteractImpassable; - public const float InteractionRange = 2; + public const float InteractionRange = 2f; public const float InteractionRangeSquared = InteractionRange * InteractionRange; - public const float MaxRaycastRange = 100; + public const float MaxRaycastRange = 100f; public delegate bool Ignored(EntityUid entity); diff --git a/Resources/Locale/en-US/door-remote/door-remote.ftl b/Resources/Locale/en-US/door-remote/door-remote.ftl index fa35d4d659..bf2fc11861 100644 --- a/Resources/Locale/en-US/door-remote/door-remote.ftl +++ b/Resources/Locale/en-US/door-remote/door-remote.ftl @@ -1,3 +1,6 @@ door-remote-switch-state-open-close = You switch the remote to open and close doors door-remote-switch-state-toggle-bolts = You switch the remote to toggle bolts door-remote-switch-state-toggle-emergency-access = You switch the remote to toggle emergency access +door-remote-no-power = The door is not powered +door-remote-denied = Access denied + From 9b54a8a2ae748ca9a17e4f1eaff15586fffa4335 Mon Sep 17 00:00:00 2001 From: ScalyChimp <72841710+ScalyChimp@users.noreply.github.com> Date: Thu, 16 Jun 2022 14:46:21 +0100 Subject: [PATCH 67/89] ECS containmentfieldgeneratorcomponent (#8757) * ECS containmentfieldgeneratorcomponent * Fix tests and clean up one line * check for anchored in a better way * Fix dependency exception I'm not really happy with this solution, it's not very good but I'm not sure how to do it better without refactoring way more than I want to. Maybe I'm missing something. * review Co-authored-by: metalgearsloth --- .../Components/ContainmentFieldConnection.cs | 33 +++- .../ContainmentFieldGeneratorComponent.cs | 151 +--------------- .../ContainmentFieldGeneratorSystem.cs | 161 +++++++++++++++++- .../EntitySystems/SingularitySystem.cs | 4 +- 4 files changed, 185 insertions(+), 164 deletions(-) diff --git a/Content.Server/Singularity/Components/ContainmentFieldConnection.cs b/Content.Server/Singularity/Components/ContainmentFieldConnection.cs index 6851a3b84d..ccfc503a08 100644 --- a/Content.Server/Singularity/Components/ContainmentFieldConnection.cs +++ b/Content.Server/Singularity/Components/ContainmentFieldConnection.cs @@ -1,13 +1,15 @@ using System.Threading; +using Content.Server.Singularity.EntitySystems; using Content.Shared.Singularity.Components; +using Robust.Server.GameObjects; using Timer = Robust.Shared.Timing.Timer; namespace Content.Server.Singularity.Components { public sealed class ContainmentFieldConnection : IDisposable { - public readonly ContainmentFieldGeneratorComponent Generator1; - public readonly ContainmentFieldGeneratorComponent Generator2; + public ContainmentFieldGeneratorComponent Generator1; + public ContainmentFieldGeneratorComponent Generator2; private readonly List _fields = new(); private int _sharedEnergyPool; private readonly CancellationTokenSource _powerDecreaseCancellationTokenSource = new(); @@ -63,7 +65,7 @@ namespace Content.Server.Singularity.Components } - Timer.SpawnRepeating(1000, () => { SharedEnergyPool--;}, _powerDecreaseCancellationTokenSource.Token); + Timer.SpawnRepeating(1000, () => { SharedEnergyPool--; }, _powerDecreaseCancellationTokenSource.Token); } public bool CanRepel(SharedSingularityComponent toRepel) @@ -82,8 +84,29 @@ namespace Content.Server.Singularity.Components } _fields.Clear(); - Generator1.RemoveConnection(this); - Generator2.RemoveConnection(this); + RemoveConnection(this, Generator1); + RemoveConnection(this, Generator2); + } + + public void RemoveConnection(ContainmentFieldConnection? connection, ContainmentFieldGeneratorComponent component) + { + if (component.Connection1?.Item2 == connection) + { + component.Connection1 = null; + } + else if (component.Connection2?.Item2 == connection) + { + component.Connection2 = null; + } + else if (connection != null) + { + Logger.Error("RemoveConnection called on Containmentfieldgenerator with a connection that can't be found in its connections."); + } + if (IoCManager.Resolve().TryGetComponent(component.Owner, out var pointLightComponent)) + { + bool hasAnyConnection = (component.Connection1 != null) || (component.Connection2 != null); + pointLightComponent.Enabled = hasAnyConnection; + } } } } diff --git a/Content.Server/Singularity/Components/ContainmentFieldGeneratorComponent.cs b/Content.Server/Singularity/Components/ContainmentFieldGeneratorComponent.cs index b9f3aad25a..0e9631c202 100644 --- a/Content.Server/Singularity/Components/ContainmentFieldGeneratorComponent.cs +++ b/Content.Server/Singularity/Components/ContainmentFieldGeneratorComponent.cs @@ -11,8 +11,6 @@ namespace Content.Server.Singularity.Components [ComponentReference(typeof(SharedContainmentFieldGeneratorComponent))] public sealed class ContainmentFieldGeneratorComponent : SharedContainmentFieldGeneratorComponent { - [Dependency] private readonly IEntityManager _entMan = default!; - private int _powerBuffer; [ViewVariables] @@ -22,153 +20,8 @@ namespace Content.Server.Singularity.Components set => _powerBuffer = Math.Clamp(value, 0, 6); } - public void ReceivePower(int power) - { - var totalPower = power + PowerBuffer; - var powerPerConnection = totalPower / 2; - var newBuffer = totalPower % 2; - TryPowerConnection(ref _connection1, ref newBuffer, powerPerConnection); - TryPowerConnection(ref _connection2, ref newBuffer, powerPerConnection); + public Tuple? Connection1; + public Tuple? Connection2; - PowerBuffer = newBuffer; - } - - private void TryPowerConnection(ref Tuple? connectionProperty, ref int powerBuffer, int powerPerConnection) - { - if (connectionProperty != null) - { - connectionProperty.Item2.SharedEnergyPool += powerPerConnection; - } - else - { - if (TryGenerateFieldConnection(ref connectionProperty)) - { - connectionProperty.Item2.SharedEnergyPool += powerPerConnection; - } - else - { - powerBuffer += powerPerConnection; - } - } - } - - private Tuple? _connection1; - private Tuple? _connection2; - - public bool CanRepel(SharedSingularityComponent toRepel) => _connection1?.Item2?.CanRepel(toRepel) == true || - _connection2?.Item2?.CanRepel(toRepel) == true; - - public void OnAnchoredChanged() - { - if(_entMan.TryGetComponent(Owner, out var physicsComponent) && physicsComponent.BodyType != BodyType.Static) - { - _connection1?.Item2.Dispose(); - _connection2?.Item2.Dispose(); - } - } - - private bool IsConnectedWith(ContainmentFieldGeneratorComponent comp) - { - - return comp == this || _connection1?.Item2.Generator1 == comp || _connection1?.Item2.Generator2 == comp || - _connection2?.Item2.Generator1 == comp || _connection2?.Item2.Generator2 == comp; - } - - public bool HasFreeConnections() - { - return _connection1 == null || _connection2 == null; - } - - private bool TryGenerateFieldConnection([NotNullWhen(true)] ref Tuple? propertyFieldTuple) - { - if (propertyFieldTuple != null) return false; - if(_entMan.TryGetComponent(Owner, out var physicsComponent) && physicsComponent.BodyType != BodyType.Static) return false; - - foreach (var direction in new[] {Direction.North, Direction.East, Direction.South, Direction.West}) - { - if (_connection1?.Item1 == direction || _connection2?.Item1 == direction) continue; - - var dirVec = _entMan.GetComponent(Owner).WorldRotation.RotateVec(direction.ToVec()); - var ray = new CollisionRay(_entMan.GetComponent(Owner).WorldPosition, dirVec, (int) CollisionGroup.MobMask); - var rawRayCastResults = EntitySystem.Get().IntersectRay(_entMan.GetComponent(Owner).MapID, ray, 4.5f, Owner, false); - - var rayCastResults = rawRayCastResults as RayCastResults[] ?? rawRayCastResults.ToArray(); - if(!rayCastResults.Any()) continue; - - RayCastResults? closestResult = null; - var smallestDist = 4.5f; - foreach (var res in rayCastResults) - { - if (res.Distance > smallestDist) continue; - - smallestDist = res.Distance; - closestResult = res; - } - if(closestResult == null) continue; - var ent = closestResult.Value.HitEntity; - if (!_entMan.TryGetComponent(ent, out var fieldGeneratorComponent) || - fieldGeneratorComponent.Owner == Owner || - !fieldGeneratorComponent.HasFreeConnections() || - IsConnectedWith(fieldGeneratorComponent) || - !_entMan.TryGetComponent(ent, out var collidableComponent) || - collidableComponent.BodyType != BodyType.Static) - { - continue; - } - - var connection = new ContainmentFieldConnection(this, fieldGeneratorComponent); - propertyFieldTuple = new Tuple(direction, connection); - if (fieldGeneratorComponent._connection1 == null) - { - fieldGeneratorComponent._connection1 = new Tuple(direction.GetOpposite(), connection); - } - else if (fieldGeneratorComponent._connection2 == null) - { - fieldGeneratorComponent._connection2 = new Tuple(direction.GetOpposite(), connection); - } - else - { - Logger.Error("When trying to connect two Containmentfieldgenerators, the second one already had two connection but the check didn't catch it"); - } - UpdateConnectionLights(); - return true; - } - - return false; - } - - public void RemoveConnection(ContainmentFieldConnection? connection) - { - if (_connection1?.Item2 == connection) - { - _connection1 = null; - UpdateConnectionLights(); - } - else if (_connection2?.Item2 == connection) - { - _connection2 = null; - UpdateConnectionLights(); - } - else if(connection != null) - { - Logger.Error("RemoveConnection called on Containmentfieldgenerator with a connection that can't be found in its connections."); - } - } - - public void UpdateConnectionLights() - { - if (_entMan.TryGetComponent(Owner, out var pointLightComponent)) - { - bool hasAnyConnection = (_connection1 != null) || (_connection2 != null); - pointLightComponent.Enabled = hasAnyConnection; - } - } - - protected override void OnRemove() - { - _connection1?.Item2.Dispose(); - _connection2?.Item2.Dispose(); - base.OnRemove(); - } } } diff --git a/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs b/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs index 67e92dc163..0cee86fbc0 100644 --- a/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs @@ -1,8 +1,13 @@ using Content.Server.ParticleAccelerator.Components; using Content.Server.Singularity.Components; +using Content.Shared.Physics; using Content.Shared.Singularity.Components; using Content.Shared.Tag; +using Robust.Server.GameObjects; +using Robust.Shared.Physics; using Robust.Shared.Physics.Dynamics; +using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace Content.Server.Singularity.EntitySystems { @@ -14,10 +19,26 @@ namespace Content.Server.Singularity.EntitySystems { base.Initialize(); - SubscribeLocalEvent(BodyTypeChanged); + SubscribeLocalEvent(OnComponentRemoved); SubscribeLocalEvent(HandleFieldCollide); SubscribeLocalEvent(HandleGeneratorCollide); SubscribeLocalEvent(HandleParticleCollide); + SubscribeLocalEvent(OnAnchorChanged); + } + + private void OnComponentRemoved(EntityUid uid, ContainmentFieldGeneratorComponent component, ComponentRemove args) + { + component.Connection1?.Item2.Dispose(); + component.Connection2?.Item2.Dispose(); + } + + private void OnAnchorChanged(EntityUid uid, ContainmentFieldGeneratorComponent component, ref AnchorStateChangedEvent args) + { + if (!args.Anchored) + { + component.Connection1?.Item2.Dispose(); + component.Connection2?.Item2.Dispose(); + } } private void HandleParticleCollide(EntityUid uid, ParticleProjectileComponent component, StartCollideEvent args) @@ -40,8 +61,9 @@ namespace Content.Server.Singularity.EntitySystems private void HandleGeneratorCollide(EntityUid uid, ContainmentFieldGeneratorComponent component, StartCollideEvent args) { - if (_tags.HasTag(args.OtherFixture.Body.Owner, "EmitterBolt")) { - component.ReceivePower(6); + if (_tags.HasTag(args.OtherFixture.Body.Owner, "EmitterBolt")) + { + ReceivePower(6, component); } } @@ -54,12 +76,135 @@ namespace Content.Server.Singularity.EntitySystems } } - private static void BodyTypeChanged( - EntityUid uid, - ContainmentFieldGeneratorComponent component, - ref PhysicsBodyTypeChangedEvent args) + public void ReceivePower(int power, ContainmentFieldGeneratorComponent component) { - component.OnAnchoredChanged(); + var totalPower = power + component.PowerBuffer; + var powerPerConnection = totalPower / 2; + var newBuffer = totalPower % 2; + TryPowerConnection(ref component.Connection1, ref newBuffer, powerPerConnection, component); + TryPowerConnection(ref component.Connection2, ref newBuffer, powerPerConnection, component); + + component.PowerBuffer = newBuffer; } + + public void UpdateConnectionLights(ContainmentFieldGeneratorComponent component) + { + if (EntityManager.TryGetComponent(component.Owner, out var pointLightComponent)) + { + bool hasAnyConnection = (component.Connection1 != null) || (component.Connection2 != null); + pointLightComponent.Enabled = hasAnyConnection; + } + } + + public void RemoveConnection(ContainmentFieldConnection? connection, ContainmentFieldGeneratorComponent component) + { + if (component.Connection1?.Item2 == connection) + { + component.Connection1 = null; + UpdateConnectionLights(component); + } + else if (component.Connection2?.Item2 == connection) + { + component.Connection2 = null; + UpdateConnectionLights(component); + } + else if (connection != null) + { + Logger.Error("RemoveConnection called on Containmentfieldgenerator with a connection that can't be found in its connections."); + } + } + + private bool TryGenerateFieldConnection([NotNullWhen(true)] ref Tuple? propertyFieldTuple, ContainmentFieldGeneratorComponent component) + { + if (propertyFieldTuple != null) return false; + if (EntityManager.TryGetComponent(component.Owner, out var xform) && !xform.Anchored) return false; + + foreach (var direction in new[] { Direction.North, Direction.East, Direction.South, Direction.West }) + { + if (component.Connection1?.Item1 == direction || component.Connection2?.Item1 == direction) continue; + + var dirVec = EntityManager.GetComponent(component.Owner).WorldRotation.RotateVec(direction.ToVec()); + var ray = new CollisionRay(EntityManager.GetComponent(component.Owner).WorldPosition, dirVec, (int) CollisionGroup.MobMask); + var rawRayCastResults = EntitySystem.Get().IntersectRay(EntityManager.GetComponent(component.Owner).MapID, ray, 4.5f, component.Owner, false); + + var rayCastResults = rawRayCastResults as RayCastResults[] ?? rawRayCastResults.ToArray(); + if (!rayCastResults.Any()) continue; + + RayCastResults? closestResult = null; + var smallestDist = 4.5f; + foreach (var res in rayCastResults) + { + if (res.Distance > smallestDist) continue; + + smallestDist = res.Distance; + closestResult = res; + } + if (closestResult == null) continue; + var ent = closestResult.Value.HitEntity; + if (!EntityManager.TryGetComponent(ent, out var fieldGeneratorComponent) || + fieldGeneratorComponent.Owner == component.Owner || + !HasFreeConnections(fieldGeneratorComponent) || + IsConnectedWith(component, fieldGeneratorComponent) || + !EntityManager.TryGetComponent(ent, out var collidableComponent) || + collidableComponent.BodyType != BodyType.Static) + { + continue; + } + + var connection = new ContainmentFieldConnection(component, fieldGeneratorComponent); + propertyFieldTuple = new Tuple(direction, connection); + if (fieldGeneratorComponent.Connection1 == null) + { + fieldGeneratorComponent.Connection1 = new Tuple(direction.GetOpposite(), connection); + } + else if (fieldGeneratorComponent.Connection2 == null) + { + fieldGeneratorComponent.Connection2 = new Tuple(direction.GetOpposite(), connection); + } + else + { + Logger.Error("When trying to connect two Containmentfieldgenerators, the second one already had two connection but the check didn't catch it"); + } + UpdateConnectionLights(component); + return true; + } + + return false; + } + + private bool IsConnectedWith(ContainmentFieldGeneratorComponent comp, ContainmentFieldGeneratorComponent otherComp) + { + return otherComp == comp || comp.Connection1?.Item2.Generator1 == otherComp || comp.Connection1?.Item2.Generator2 == otherComp || + comp.Connection2?.Item2.Generator1 == otherComp || comp.Connection2?.Item2.Generator2 == otherComp; + } + + public void TryPowerConnection(ref Tuple? connectionProperty, ref int powerBuffer, int powerPerConnection, ContainmentFieldGeneratorComponent component) + { + if (connectionProperty != null) + { + connectionProperty.Item2.SharedEnergyPool += powerPerConnection; + } + else + { + if (TryGenerateFieldConnection(ref connectionProperty, component)) + { + connectionProperty.Item2.SharedEnergyPool += powerPerConnection; + } + else + { + powerBuffer += powerPerConnection; + } + } + } + + public bool CanRepel(SharedSingularityComponent toRepel, ContainmentFieldGeneratorComponent component) => component.Connection1?.Item2?.CanRepel(toRepel) == true || + component.Connection2?.Item2?.CanRepel(toRepel) == true; + + public bool HasFreeConnections(ContainmentFieldGeneratorComponent component) + { + return component.Connection1 == null || component.Connection2 == null; + } + + } } diff --git a/Content.Server/Singularity/EntitySystems/SingularitySystem.cs b/Content.Server/Singularity/EntitySystems/SingularitySystem.cs index 671d6d5ef9..eb78038e3f 100644 --- a/Content.Server/Singularity/EntitySystems/SingularitySystem.cs +++ b/Content.Server/Singularity/EntitySystems/SingularitySystem.cs @@ -18,7 +18,7 @@ namespace Content.Server.Singularity.EntitySystems [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly PVSOverrideSystem _pvs = default!; - + [Dependency] private readonly ContainmentFieldGeneratorSystem _fieldGeneratorSystem = default!; /// /// How much energy the singulo gains from destroying a tile. /// @@ -132,7 +132,7 @@ namespace Content.Server.Singularity.EntitySystems !EntityManager.HasComponent(entity) && (component.Level > 4 || !EntityManager.HasComponent(entity) && - !(EntityManager.TryGetComponent(entity, out var containFieldGen) && containFieldGen.CanRepel(component))); + !(EntityManager.TryGetComponent(entity, out var containFieldGen) && _fieldGeneratorSystem.CanRepel(component, containFieldGen))); } private void HandleDestroy(ServerSingularityComponent component, EntityUid entity) From 3dd0bf12171f6081254c3a1c1030caea56351cfe Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Thu, 16 Jun 2022 17:10:01 -0600 Subject: [PATCH 68/89] water (#8903) --- Resources/Maps/marathon.yml | 1662 ++++++++++++++++++++++++----------- 1 file changed, 1173 insertions(+), 489 deletions(-) diff --git a/Resources/Maps/marathon.yml b/Resources/Maps/marathon.yml index b0c7af9ba8..2e181fedc2 100644 --- a/Resources/Maps/marathon.yml +++ b/Resources/Maps/marathon.yml @@ -80,7 +80,7 @@ grids: - ind: -1,1 tiles: IAAAADcAAAAxAAADNwAAADcAAAA1AAABNQAAAjcAAAA3AAAANwAAAB4AAAE3AAAANwAAADcAAAA3AAAANwAAACAAAAAxAAADMQAAAzcAAAAeAAAANQAAAzUAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAA3AAAAHgAAADUAAAA1AAACNQAAADUAAAEzAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMwAAADMAAAAzAAAANwAAAB4AAAAeAAAAHgAAAB4AAAA3AAAAMwAAADcAAAA3AAAAHgAAAjEAAAIxAAABMQAAATcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAAB4AAAMxAAACMQAAADEAAAI3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAeAAABMQAAAjEAAAExAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAHgAAADEAAAMxAAAAMQAAAzcAAAA3AAAANwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAA3AAAANwAAAB4AAAAxAAABMQAAADEAAAI3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMQAAAjcAAAAxAAAAMQAAADEAAAAxAAACMQAAAjEAAAIxAAABMQAAATEAAAAxAAABMQAAATEAAAAxAAADMQAAAjEAAAExAAACMQAAATEAAAAxAAADMQAAAzEAAAMxAAAAMQAAATEAAAMxAAABMQAAADEAAAAxAAADMQAAAjEAAAMxAAAAMQAAAzEAAAMxAAABMQAAADEAAAExAAACMQAAAzEAAAIxAAADMQAAAzEAAAMxAAADMQAAATEAAAIxAAADMQAAADEAAAMxAAADHgAAAR4AAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAeAAACHgAAADcAAAA3AAAAMQAAAh4AAAAeAAACNwAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA3AAAAHgAAAx4AAAM3AAAAMQAAAzEAAAIeAAAAHgAAADcAAAA2AAAANwAAADcAAAA3AAAANwAAADcAAAA2AAAANwAAAB4AAAEeAAAANwAAADcAAAA3AAAAHgAAAx4AAAA3AAAANwAAADcAAAAeAAADHgAAAB4AAAM3AAAANwAAADcAAAAeAAACHgAAAzcAAAAeAAADNQAAAQ== - ind: -2,1 - tiles: NwAAADMAAAA3AAAAJQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAJQAAADcAAAAgAAAAIAAAACAAAAAgAAAAIAAAADcAAAAzAAAANwAAACUAAAAeAAAAJQAAACUAAAAlAAAAJQAAACUAAAA3AAAANwAAACAAAAA3AAAAIAAAACAAAAA3AAAAMwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADMAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMwAAADMAAAAzAAAANwAAADMAAAAzAAAAMwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAaAAAAGgAAAjcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAGgAAARoAAAA3AAAAMQAAAzEAAAExAAADMQAAAjcAAAAgAAAAIAAAACAAAAA3AAAANwAAADcAAAA3AAAANwAAABoAAAEaAAAANwAAADEAAAMxAAACMQAAAjEAAAE3AAAAIAAAACAAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAAaAAAANwAAADcAAAA3AAAANwAAADEAAAM3AAAANwAAADcAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMQAAATEAAAExAAACMQAAATEAAAIxAAAAMQAAAzEAAAIxAAABMQAAAzEAAAIxAAACMQAAAjEAAAMxAAADMQAAADEAAAIxAAAAMQAAAzEAAAExAAABMQAAADEAAAIxAAADMQAAADEAAAExAAACMQAAAzEAAAMxAAABMQAAAzEAAAAxAAADMQAAAjEAAAAxAAAAMQAAADEAAAAxAAACMQAAADEAAAMxAAACMQAAAzEAAAExAAAAMQAAATEAAAIxAAABMQAAATcAAAA3AAAANwAAADcAAAA3AAAAMQAAAzcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAIxAAAAMQAAAjEAAAExAAADMQAAAzEAAAExAAADNwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAxAAAAMQAAATEAAAAxAAADMQAAAjEAAAAxAAADMQAAATcAAAA3AAAANQAAAzUAAAE1AAAANQAAADUAAAA3AAAAMQAAADEAAAIxAAAAMQAAAzEAAAMxAAACMQAAAjEAAAI3AAAANwAAADUAAAA1AAABNQAAAzUAAAA1AAAANwAAAA== + tiles: NwAAADMAAAA3AAAAJQAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAJQAAADcAAAAgAAAAIAAAACAAAAAgAAAAIAAAADcAAAAzAAAANwAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAA3AAAANwAAACAAAAA3AAAAIAAAACAAAAA3AAAAMwAAADcAAAA3AAAAJQAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADMAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMwAAADMAAAAzAAAANwAAADMAAAAzAAAAMwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAaAAAAGgAAAjcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAGgAAARoAAAA3AAAAMQAAAzEAAAExAAADMQAAAjcAAAAgAAAAIAAAACAAAAA3AAAANwAAADcAAAA3AAAANwAAABoAAAEaAAAANwAAADEAAAMxAAACMQAAAjEAAAE3AAAAIAAAACAAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAAaAAAANwAAADcAAAA3AAAANwAAADEAAAM3AAAANwAAADcAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMQAAATEAAAExAAACMQAAATEAAAIxAAAAMQAAAzEAAAIxAAABMQAAAzEAAAIxAAACMQAAAjEAAAMxAAADMQAAADEAAAIxAAAAMQAAAzEAAAExAAABMQAAADEAAAIxAAADMQAAADEAAAExAAACMQAAAzEAAAMxAAABMQAAAzEAAAAxAAADMQAAAjEAAAAxAAAAMQAAADEAAAAxAAACMQAAADEAAAMxAAACMQAAAzEAAAExAAAAMQAAATEAAAIxAAABMQAAATcAAAA3AAAANwAAADcAAAA3AAAAMQAAAzcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAIxAAAAMQAAAjEAAAExAAADMQAAAzEAAAExAAADNwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAxAAAAMQAAATEAAAAxAAADMQAAAjEAAAAxAAADMQAAATcAAAA3AAAANQAAAzUAAAE1AAAANQAAADUAAAA3AAAAMQAAADEAAAIxAAAAMQAAAzEAAAMxAAACMQAAAjEAAAI3AAAANwAAADUAAAA1AAABNQAAAzUAAAA1AAAANwAAAA== - ind: -3,0 tiles: AAAAADcAAAAxAAACMQAAAzcAAAAoAAAAKAAAACgAAAAoAAAAKAAAADcAAAAxAAADMQAAADEAAAExAAAANwAAAAAAAAA3AAAAMQAAAzEAAAA3AAAAKAAAACgAAAAoAAAAKAAAACgAAAA3AAAAMQAAAjEAAAIxAAABMQAAAjEAAAAAAAAANwAAADEAAAAxAAAANwAAACgAAAAoAAAAKAAAACgAAAAoAAAANwAAADEAAAExAAAAMQAAAzEAAAAxAAACAAAAADcAAAAxAAACMQAAAzcAAAAoAAAAKAAAACgAAAAoAAAAKAAAADcAAAAxAAABMQAAATEAAAAxAAADMQAAAwAAAAA3AAAAMQAAAjEAAAI3AAAANwAAADcAAAAxAAAANwAAADcAAAA3AAAAMQAAAjEAAAExAAABMQAAAzEAAAMAAAAANwAAADEAAAMxAAAAMQAAAjEAAAAxAAABMQAAADEAAAIxAAADMQAAAzEAAAExAAAAMQAAAzcAAAAeAAACNwAAADcAAAAxAAABMQAAAzEAAAAxAAACMQAAAzEAAAMxAAAAMQAAATEAAAAxAAAAMQAAAzEAAAM3AAAAHgAAADEAAAExAAACMQAAAjEAAAMxAAADMQAAAzEAAAIxAAABMQAAADEAAAMxAAACMQAAAjEAAAExAAADHgAAAB4AAAAxAAADMQAAADEAAAAxAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAIxAAABMQAAAB4AAAEeAAAAMQAAATEAAAM3AAAAMQAAATcAAAAxAAABMQAAADEAAAIxAAAAMQAAAzcAAAAxAAADMQAAADEAAAI3AAAAHgAAADEAAAIxAAABNwAAADEAAAI3AAAAMQAAATEAAAExAAADMQAAAjEAAAAxAAACMQAAAzEAAAMxAAAANwAAAB4AAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAExAAADMQAAADEAAAAxAAACNwAAADEAAAMxAAADMQAAADcAAAA3AAAANwAAAB4AAAEeAAAAHgAAAjcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAxAAACMQAAATEAAAI3AAAAHgAAAzEAAAMxAAAAMQAAAzEAAAAxAAACMQAAAjEAAAIxAAAAMQAAADEAAAMxAAAAMQAAATEAAAAxAAABNwAAAB4AAAMxAAAAMQAAAjEAAAExAAAAMQAAADEAAAExAAADMQAAATEAAAMxAAADMQAAATEAAAAxAAABMQAAAjcAAAA3AAAAMQAAAjEAAAExAAACMQAAATEAAAIxAAADMQAAATEAAAExAAAAMQAAATEAAAAxAAABMQAAADEAAAA3AAAANwAAAA== - ind: -3,1 @@ -96,7 +96,7 @@ grids: - ind: -2,2 tiles: MQAAAzEAAAExAAABMQAAAjEAAAExAAACMQAAAzEAAAE3AAAANwAAADUAAAE1AAADNQAAADUAAAI1AAAANwAAADEAAAIxAAADMQAAAzEAAAAxAAAAMQAAAjEAAAIxAAAANwAAADcAAAA3AAAANQAAATcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA1AAAANQAAATUAAAI1AAAANQAAAjUAAAA3AAAAMQAAADEAAAIxAAADNwAAACgAAAAoAAAAKAAAACgAAAA3AAAANQAAADUAAAI1AAADNQAAAjUAAAI1AAADNwAAADEAAAMxAAADMQAAADcAAAAoAAAAKAAAACgAAAAoAAAANwAAADUAAAE1AAACNQAAAjUAAAI1AAAANQAAAzcAAAAxAAABMQAAATEAAAA3AAAAHgAAAB4AAAAeAAACHgAAAh4AAAEeAAACHgAAAx4AAAIeAAADHgAAAh4AAAAeAAAAHgAAAh4AAAI3AAAANwAAADcAAAA1AAADNwAAADcAAAA3AAAAHgAAAjcAAAA3AAAANwAAADcAAAA3AAAANwAAAB4AAAIeAAAANwAAADQAAAM0AAAANAAAAjQAAAE3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAHgAAAx4AAAAeAAACHgAAAzcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADMAAAAzAAAAMwAAADcAAAAeAAAAHgAAAzcAAAA3AAAAHgAAAh4AAAEeAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAMxAAADNwAAAB4AAAIeAAADHgAAAzcAAAA3AAAANwAAADcAAAA3AAAANgAAADYAAAA2AAAANgAAADcAAAAxAAACMQAAAB4AAAAeAAABHgAAAR4AAAM3AAAANwAAADcAAAA3AAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQAAAzEAAAI3AAAAHgAAAh4AAAEeAAACNwAAADMAAAA3AAAANwAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAzAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANgAAAAAAAAAxAAACMQAAAjEAAAEeAAABNwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADYAAAAAAAAAMQAAAzEAAAAxAAABNwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA2AAAAAAAAAA== - ind: -3,2 - tiles: NwAAADcAAAA3AAAAKAAAACgAAAAoAAAAKAAAADcAAAAjAAAAIwAAADcAAAAxAAAAMQAAAjEAAAM3AAAAMQAAADcAAAA3AAAANwAAACgAAAAoAAAAKAAAACgAAAA3AAAAIwAAACMAAAA3AAAAMQAAAzEAAAExAAABNwAAADEAAAA3AAAAMQAAAjcAAAA3AAAANwAAADcAAAAoAAAANwAAADcAAAA3AAAANwAAADEAAAIxAAAAMQAAADcAAAA3AAAAMQAAATEAAAExAAABMQAAATEAAAMxAAAAMQAAAjEAAAExAAABMQAAAjEAAAExAAACMQAAADEAAAExAAADMQAAAjEAAAIxAAADMQAAAzEAAAExAAACMQAAAzEAAAMxAAABMQAAAzEAAAIxAAADMQAAAjEAAAAxAAACMQAAATEAAAMxAAABMQAAAjEAAAAxAAADMQAAAjEAAAIxAAADMQAAAjEAAAMxAAACMQAAAjEAAAAxAAACMQAAAzEAAAMxAAABNwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAeAAAANwAAAB4AAAM3AAAAHgAAATEAAAIxAAACNwAAADEAAAMxAAABMQAAAzcAAAAxAAACMQAAAzEAAAA3AAAAHgAAATEAAAMeAAABHgAAAh4AAAExAAABMQAAAzcAAAAxAAABMQAAAjEAAAI3AAAAMQAAAjEAAAExAAACNwAAAB4AAAMxAAABHgAAAx4AAAEeAAACMQAAAzcAAAA3AAAANwAAADEAAAI3AAAANwAAADcAAAAxAAADNwAAADcAAAAeAAAANwAAAB4AAAE3AAAANwAAADEAAAExAAABMQAAADEAAAExAAAAMQAAATEAAAExAAABMQAAAzEAAAAxAAACMQAAAjEAAAAxAAAAMQAAAzEAAAAxAAADMQAAAzEAAAMxAAABMQAAATEAAAIxAAABMQAAAzEAAAMxAAACMQAAATEAAAMxAAABMQAAATEAAAIxAAAAMQAAADEAAAAxAAABMQAAAzEAAAMxAAABMQAAADEAAAIxAAAAMQAAAzEAAAAxAAADMQAAAzEAAAExAAAAMQAAATEAAAAxAAACNwAAADcAAAA3AAAANwAAADcAAAA3AAAALgAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAExAAACMQAAAjcAAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAADcAAAAxAAACMQAAATEAAAAxAAADMQAAADEAAAI3AAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAA3AAAAMQAAADEAAAExAAABMQAAAg== + tiles: NwAAADcAAAA3AAAAKAAAACgAAAAoAAAAKAAAADcAAAAjAAAAIwAAADcAAAAxAAAAMQAAAjEAAAM3AAAAMQAAADcAAAA3AAAANwAAACgAAAAoAAAAKAAAACgAAAA3AAAAIwAAACMAAAA3AAAAMQAAAzEAAAExAAABNwAAADEAAAA3AAAAMQAAAjcAAAA3AAAANwAAADcAAAAoAAAANwAAADcAAAA3AAAANwAAADEAAAIxAAAAMQAAADcAAAA3AAAAMQAAATEAAAExAAABMQAAATEAAAMxAAAAMQAAAjEAAAExAAABMQAAAjEAAAExAAACMQAAADEAAAExAAADMQAAAjEAAAIxAAADMQAAAzEAAAExAAACMQAAAzEAAAMxAAABMQAAAzEAAAIxAAADMQAAAjEAAAAxAAACMQAAATEAAAMxAAABMQAAAjEAAAAxAAADMQAAAjEAAAIxAAADMQAAAjEAAAMxAAACMQAAAjEAAAAxAAACMQAAAzEAAAMxAAABNwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAeAAAANwAAAB4AAAM3AAAAHgAAATEAAAIxAAACNwAAADEAAAMxAAABMQAAAzcAAAAxAAACMQAAAzEAAAA3AAAAHgAAATEAAAMeAAABHgAAAh4AAAExAAABMQAAAzcAAAAxAAABMQAAAjEAAAI3AAAAMQAAAjEAAAExAAACNwAAAB4AAAMxAAABHgAAAx4AAAEeAAACMQAAAzcAAAA3AAAANwAAADEAAAI3AAAANwAAADcAAAAxAAADNwAAADcAAAAeAAAANwAAAB4AAAE3AAAANwAAADEAAAExAAABMQAAADEAAAExAAAAMQAAATEAAAExAAABMQAAAzEAAAAxAAACMQAAAjEAAAAxAAAAMQAAAzEAAAAxAAADMQAAAzEAAAMxAAABMQAAATEAAAIxAAABMQAAAzEAAAMxAAACMQAAATEAAAMxAAABMQAAATEAAAIxAAAAMQAAADEAAAAxAAABMQAAAzEAAAMxAAABMQAAADEAAAIxAAAAMQAAAzEAAAAxAAADMQAAAzEAAAExAAAAMQAAATEAAAAxAAACNwAAADcAAAA3AAAANwAAADcAAAA3AAAALgAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAExAAACMQAAAjcAAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAADcAAAAxAAACMQAAATEAAAAxAAADMQAAADEAAAI3AAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAALgAAAC4AAAAuAAAAMQAAADEAAAExAAABMQAAAg== - ind: -4,1 tiles: AAAAADcAAAA3AAAANwAAADcAAAA3AAAAMQAAADEAAAIxAAACMQAAADEAAAExAAABMQAAATEAAAExAAABNwAAAAAAAAAAAAAANgAAADYAAAA2AAAANwAAADEAAAAxAAACMQAAAyMAAAAjAAAAIwAAADEAAAAxAAACMQAAAh4AAAIAAAAAAAAAADYAAAAAAAAANgAAADcAAAAxAAAAMQAAAzEAAAEjAAAAIwAAACMAAAAxAAACMQAAATEAAAMeAAACAAAAAAAAAAA2AAAANgAAADYAAAA3AAAAMQAAAjEAAAExAAACIwAAACMAAAAjAAAAMQAAATEAAAExAAABHgAAAQAAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAExAAADMQAAADEAAAExAAABMQAAADEAAAExAAADMQAAATcAAAAAAAAANwAAADcAAAA3AAAANwAAADcAAAAxAAABMQAAAjEAAAExAAAAMQAAAzEAAAExAAAAMQAAAzEAAAEeAAABAAAAADcAAAA3AAAANwAAADcAAAA3AAAAMQAAADEAAAExAAABIwAAADEAAAEjAAAAMQAAAzEAAAAxAAABHgAAAwAAAAA3AAAANwAAADcAAAA3AAAANwAAADEAAAAxAAACMQAAATEAAAIxAAADMQAAATEAAAExAAADMQAAAh4AAAEAAAAANwAAADcAAAA3AAAANwAAADcAAAAxAAAAMQAAATEAAAMxAAAAMQAAADEAAAAxAAACMQAAATEAAAA3AAAAAAAAAAAAAAAAAAAANgAAAAAAAAA3AAAAHgAAAx4AAAEeAAABHgAAAx4AAAMeAAAAHgAAAB4AAAIeAAADNwAAAAAAAAAAAAAAAAAAADYAAAAAAAAANwAAADcAAAA3AAAANwAAADcAAAAeAAACNwAAADcAAAA3AAAANwAAADcAAAAAAAAAAAAAAAAAAAA2AAAAAAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAAAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAAAAAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMwAAADcAAAA1AAADNQAAADUAAAE1AAACNQAAADUAAAMAAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADMAAAA3AAAANQAAADUAAAI1AAAANQAAAzUAAAI1AAABNgAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAzAAAANwAAADUAAAA1AAAANQAAAjUAAAA1AAACNQAAAg== - ind: -4,2 @@ -122,7 +122,7 @@ grids: - ind: 1,2 tiles: NwAAADcAAAA3AAAANwAAADcAAAAxAAABMQAAATEAAAM3AAAANwAAACAAAAA3AAAANwAAADcAAAA3AAAANwAAACgAAAAoAAAAKAAAACgAAAAxAAADMQAAATEAAAMxAAACMQAAAjEAAAAxAAADMQAAAjcAAAA3AAAANwAAADcAAAAoAAAAKAAAACgAAAA3AAAAMQAAADEAAAExAAABMQAAATEAAAAxAAAAMQAAAjEAAAA3AAAAMQAAAzEAAAExAAACNwAAADcAAAA3AAAANwAAADEAAAAxAAACMQAAATEAAAAxAAACMQAAADEAAAAxAAABNwAAADEAAAIxAAAAMQAAATUAAAI1AAABNQAAAjUAAAIxAAABMQAAAjEAAAExAAAAMQAAAjEAAAMxAAADMQAAADEAAAIxAAADMQAAADEAAAA1AAAANQAAATUAAAA3AAAAMQAAAjEAAAAxAAABMQAAATEAAAIxAAACMQAAATEAAAMxAAACMQAAATEAAAExAAACNwAAADcAAAA3AAAANwAAADEAAAExAAACMQAAAzEAAAAxAAAAMQAAAzEAAAIxAAACNwAAADEAAAMxAAACMQAAADUAAAA1AAABNQAAAzUAAAMxAAACMQAAAjEAAAIxAAADMQAAAjEAAAAxAAAAMQAAAjcAAAAxAAADMQAAADEAAAE1AAADNQAAADUAAAE3AAAAMQAAAzEAAAMxAAACMQAAAzEAAAAxAAADMQAAADEAAAE3AAAANwAAACAAAAA3AAAANwAAADcAAAA3AAAANwAAACcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAACAAAAAgAAAAIAAAADMAAAA3AAAAJwAAACcAAAAnAAAAJwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAgAAAAIAAAACAAAAA3AAAAJwAAACcAAAAnAAAAJwAAACcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAIAAAACAAAAAgAAAANwAAADcAAAAnAAAAJwAAACcAAAAnAAAANwAAADYAAAA2AAAANgAAADYAAAA2AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAAA3AAAANwAAADcAAAA3AAAAMwAAADMAAAAzAAAAMwAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAADcAAAA3AAAANwAAADMAAAAzAAAAMwAAADMAAAA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAAA3AAAANwAAAA== - ind: 2,2 - tiles: NwAAACsAAAA3AAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAANwAAADcAAAAxAAAANwAAADcAAAA3AAAANwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAADcAAAAxAAABMQAAAjcAAAAxAAABMQAAAjcAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAA3AAAAMQAAAjEAAAE3AAAAMQAAAjEAAAIxAAABKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAMQAAADEAAAMxAAABNwAAADEAAAMxAAADNwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAADcAAAAxAAAAMQAAATcAAAAxAAAAMQAAATcAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAA3AAAAMQAAADEAAAM3AAAAMQAAATEAAAExAAACKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAMQAAAjEAAAIxAAABNwAAADEAAAMxAAACNwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAADcAAAAxAAADMQAAAzcAAAA3AAAANwAAADcAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAA3AAAANwAAADEAAAA3AAAANwAAADcAAAA3AAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANQAAAjcAAAA3AAAANQAAAzcAAAA1AAADNQAAAzUAAAA3AAAANQAAATcAAAA1AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANQAAATcAAAA3AAAANQAAATUAAAI3AAAANwAAADUAAAM1AAADNwAAADcAAAA3AAAANwAAADUAAAM1AAACNQAAATcAAAA1AAAANwAAADcAAAA1AAAANQAAADcAAAA1AAACNwAAADUAAAM3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAAA== + tiles: NwAAACsAAAA3AAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAANwAAADcAAAAxAAAANwAAADcAAAA3AAAANwAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAADcAAAAxAAABHgAAADcAAAAxAAABMQAAAjcAAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAADEAAAE3AAAAMQAAAjEAAAIxAAABHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAAHgAAAB4AAAAeAAAANwAAADEAAAMeAAAANwAAADEAAAMxAAADNwAAADcAAAA3AAAANwAAADcAAAAeAAAANwAAADcAAAA3AAAANwAAADcAAAAeAAAAMQAAATcAAAAxAAAAMQAAATcAAAAeAAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA3AAAAMQAAAB4AAAA3AAAAMQAAATEAAAEeAAAAHgAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAAHgAAAB4AAAAxAAABNwAAADEAAAMxAAACNwAAAB4AAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADcAAAAxAAADHgAAADcAAAA3AAAANwAAADcAAAAeAAAANQAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAA3AAAANwAAADEAAAA3AAAANwAAADcAAAA3AAAAHgAAADUAAAA1AAAANQAAADUAAAA1AAAANQAAADUAAAAeAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANQAAAjcAAAA3AAAANQAAAzcAAAA1AAADNQAAAzUAAAA3AAAANQAAATcAAAA1AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANQAAATcAAAA3AAAANQAAATUAAAI3AAAANwAAADUAAAM1AAADNwAAADcAAAA3AAAANwAAADUAAAM1AAACNQAAATcAAAA1AAAANwAAADcAAAA1AAAANQAAADcAAAA1AAACNwAAADUAAAM3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAAA== - ind: 2,1 tiles: NwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAAAAAADYAAAAAAAAAAAAAACAAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA2AAAAAAAAADYAAAAgAAAAIAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAIAAAACAAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA2AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMgAAACAAAAAgAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANgAAADcAAAA3AAAAMgAAADcAAAAyAAAAMgAAADcAAAA0AAACNwAAADcAAAA3AAAANwAAAAAAAAAAAAAAAAAAADYAAAA3AAAANwAAADMAAAAzAAAAMgAAADIAAAA3AAAANAAAATcAAAAzAAAANwAAADcAAAAAAAAAAAAAAAAAAAA2AAAANwAAADcAAAAzAAAAMwAAADIAAAAzAAAANwAAADQAAAI3AAAAMwAAADcAAAA3AAAAAAAAAAAAAAAAAAAANgAAADcAAAA3AAAAMgAAADMAAAAzAAAAMwAAADcAAAA3AAAANwAAADMAAAA3AAAANwAAAAAAAAAAAAAAAAAAADYAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAMwAAADMAAAAzAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAAAwAAAAMAAAADAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAAAMAAAADAAAAAwAAADcAAAA3AAAANwAAAB4AAAM3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAADAAAAAwAAAAMAAAA3AAAANwAAAB4AAAEeAAADNwAAAAsAAAALAAAACwAAAAsAAAALAAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAAB4AAAEeAAAAHgAAADcAAAALAAAACwAAAAsAAAALAAAACwAAADcAAAA3AAAANwAAADcAAAAzAAAAMwAAADMAAAA3AAAAHgAAAx4AAAM3AAAACwAAAAsAAAALAAAACwAAAAsAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAAA== - ind: 1,0 @@ -240,7 +240,7 @@ grids: - ind: 0,5 tiles: NwAAADcAAAAcAAAAHAAAAB4AAAA3AAAAAAAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAAA3AAAANwAAABwAAAAeAAAANwAAAAAAAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3AAAANwAAADcAAAAcAAAAHgAAADcAAAAAAAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAB4AAAAeAAAAHAAAACsAAAA3AAAAAAAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAA3AAAANwAAABwAAAAeAAAANwAAADYAAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3AAAANwAAADcAAAAcAAAAHgAAADcAAAAAAAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAADcAAAAcAAAAHAAAAB4AAAA3AAAAAAAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAcAAAAHAAAACsAAAAeAAAANwAAAAAAAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAHgAAAB4AAAAeAAAAHgAAADcAAAAAAAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAADcAAAA3AAAAHgAAAB4AAAA3AAAANgAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAAAAAAAAAAAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAAAAAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - ind: 2,3 - tiles: AAAAAAAAAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAAAAAAAAAAAAAAAAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + tiles: AAAAAAAAAAAAAAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAAAAAAAAAAAAAAAAAAAAAAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== - ind: 2,-5 tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAABFAAAARQAAAIUAAAAFAAAAhQAAAAUAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAIUAAAAFAAAABQAAAEUAAABFAAAARQAAAIUAAAAFAAAARQAAAIAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAABFAAAAhcAAAAUAAABFAAAAhQAAAEUAAACFAAAABQAAAAUAAABFAAAAgAAAAAAAAAAAAAAAAAAAAAUAAAAFAAAAhQAAAIUAAACFAAAAhQAAAEUAAAAFAAAAhQAAAEUAAAAFAAAAhQAAAIAAAAAAAAAAAAAAAAUAAABFAAAAhQAAAAUAAAAFAAAAhQAAAIUAAABFAAAAhQAAAAUAAABFAAAARcAAAAUAAABFAAAAgAAAAAAAAAAFAAAAhQAAAAUAAAAFAAAARQAAAAUAAAAFAAAABQAAAIUAAACFAAAAhQAAAIUAAABFAAAABQAAAAUAAAAFAAAAhQAAAIUAAABFAAAABQAAAIUAAAAFAAAAhQAAAEUAAACFAAAABQAAAIUAAAAFAAAAhQAAAEUAAACFAAAABQAAAEUAAABFAAAAhQAAAAUAAABFAAAAhQAAAAUAAABFAAAAhQAAAAUAAACFAAAAhQAAAIUAAACFAAAABQAAAEUAAABFAAAABQAAAIUAAABFAAAABQAAAIUAAABFAAAARQAAAAUAAAAFAAAABQAAAAUAAACFAAAABQAAAIUAAAAFAAAARQAAAIUAAABFAAAARQAAAAUAAAAFAAAAhQAAAAUAAACFAAAARQAAAAUAAABFAAAAhQAAAAUAAACFAAAARQAAAIUAAAAFAAAABQAAAEXAAAAFAAAAhQAAAEUAAABFAAAARQAAAIUAAAAFAAAARQAAAEUAAACFAAAABQAAAEUAAACFAAAAhQAAAAUAAACFwAAABQAAAAUAAABFAAAAhQAAAAUAAACFAAAAhQAAAAUAAAAFAAAARQAAAIUAAABFAAAARQAAAAUAAACFAAAABQAAAAUAAABFAAAARQAAAEUAAAAFAAAABQAAAIUAAACFAAAABQAAAIUAAAAFAAAAQ== - ind: 1,-5 @@ -5532,10 +5532,6 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 coordinates: -4,-21 - 1023: - color: '#EFB34196' - id: QuarterTileOverlayGreyscale270 - coordinates: -4,-22 1024: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 @@ -5572,10 +5568,6 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 coordinates: -4,-31 - 1033: - color: '#EFB34196' - id: QuarterTileOverlayGreyscale180 - coordinates: -2,-22 1034: color: '#EFB34196' id: QuarterTileOverlayGreyscale180 @@ -5596,13 +5588,13 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale180 coordinates: -2,-27 - 1043: - color: '#9FED5896' - id: HalfTileOverlayGreyscale + 2044: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale coordinates: -1,-28 - 1044: - color: '#9FED5896' - id: HalfTileOverlayGreyscale180 + 2045: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale180 coordinates: -1,-21 1057: color: '#EFB34196' @@ -6082,38 +6074,38 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: 5,-24 - 1039: - color: '#9FED5896' - id: HalfTileOverlayGreyscale + 2040: + color: '#EFB34196' + id: CheckerNWSE coordinates: 3,-28 - 1040: - color: '#9FED5896' - id: HalfTileOverlayGreyscale + 2041: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale coordinates: 2,-28 - 1041: - color: '#9FED5896' - id: HalfTileOverlayGreyscale + 2042: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale coordinates: 1,-28 - 1042: - color: '#9FED5896' - id: HalfTileOverlayGreyscale + 2043: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale coordinates: 0,-28 - 1045: - color: '#9FED5896' - id: HalfTileOverlayGreyscale180 - coordinates: 0,-21 - 1046: - color: '#9FED5896' - id: HalfTileOverlayGreyscale180 + 2047: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale180 coordinates: 1,-21 - 1047: - color: '#9FED5896' - id: HalfTileOverlayGreyscale180 - coordinates: 2,-21 - 1048: - color: '#9FED5896' - id: HalfTileOverlayGreyscale180 + 2048: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale180 coordinates: 3,-21 + 2046: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale180 + coordinates: 0,-21 + 2052: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale270 + coordinates: 11,-21 1049: color: '#FFFFFFFF' id: Delivery @@ -6138,14 +6130,14 @@ entities: color: '#FFFFFFFF' id: WarningLine coordinates: 5,-21 - 1055: - color: '#FFFFFFFF' - id: WarningLineCornerFlipped + 2050: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale270 coordinates: 8,-21 - 1056: - color: '#FFFFFFFF' - id: WarningLineCorner - coordinates: 4,-21 + 2051: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale270 + coordinates: 9,-21 1060: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 @@ -6222,9 +6214,9 @@ entities: color: '#FFFFFFFF' id: Bot coordinates: 7,-30 - 1080: - color: '#9FED5896' - id: QuarterTileOverlayGreyscale270 + 2049: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale180 coordinates: 4,-21 1098: angle: 3.141592653589793 rad @@ -6603,26 +6595,22 @@ entities: color: '#9FED5896' id: HalfTileOverlayGreyscale270 coordinates: 7,-11 - 1931: + 2056: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale180 + coordinates: 2,-21 + 2055: color: '#9FED5896' id: HalfTileOverlayGreyscale270 coordinates: 7,-12 - 1932: - color: '#9FED5896' - id: QuarterTileOverlayGreyscale180 - coordinates: 7,-12 - 1933: - color: '#9FED5896' - id: HalfTileOverlayGreyscale180 - coordinates: 8,-12 - 1934: - color: '#9FED5896' - id: HalfTileOverlayGreyscale180 - coordinates: 9,-12 - 1935: - color: '#9FED5896' - id: QuarterTileOverlayGreyscale270 - coordinates: 10,-12 + 2059: + color: '#FFFFFFFF' + id: WarningLineCorner + coordinates: 4,-21 + 2058: + color: '#FFFFFFFF' + id: WarningLineCornerFlipped + coordinates: 8,-21 1937: color: '#FFFFFFFF' id: Grasse2 @@ -6755,6 +6743,14 @@ entities: color: '#FFFFFFFF' id: Delivery coordinates: 31,-3 + 2053: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale270 + coordinates: 12,-21 + 2054: + color: '#EFB34196' + id: QuarterTileOverlayGreyscale270 + coordinates: 13,-21 0,-2: 1081: color: '#FFFFFFFF' @@ -9091,7 +9087,7 @@ entities: 6,6: 1 6,7: 5 0,17: 1 - 1,17: 5 + 1,17: 6 2,17: 1 3,16: 1 -2,16: 1 @@ -9124,7 +9120,7 @@ entities: -3,2: 0 -3,3: 0 -3,4: 0 - -3,5: 6 + -3,5: 7 -3,6: 0 -3,7: 0 -3,8: 0 @@ -9145,7 +9141,7 @@ entities: 0,-1: 0 1,-10: 0 1,-2: 0 - 2,-10: 7 + 2,-10: 8 2,-2: 0 3,-10: 0 3,-2: 0 @@ -9186,7 +9182,7 @@ entities: 4,3: 0 4,4: 0 4,5: 0 - 4,6: 0 + 4,6: 9 4,7: 0 4,8: 0 4,9: 0 @@ -9384,7 +9380,7 @@ entities: -5,13: 0 -5,14: 0 -5,15: 0 - -4,5: 8 + -4,5: 10 -4,6: 0 -4,10: 0 -4,11: 0 @@ -9395,14 +9391,14 @@ entities: -3,15: 0 4,15: 0 5,5: 0 - 5,6: 5 + 5,6: 11 5,10: 0 5,11: 0 5,12: 0 5,13: 0 5,14: 0 5,15: 0 - 6,8: 9 + 6,8: 12 6,9: 0 6,10: 0 6,11: 0 @@ -9502,8 +9498,8 @@ entities: -6,-1: 0 -5,-6: 0 -5,-5: 0 - -5,-4: 10 - -5,-3: 11 + -5,-4: 13 + -5,-3: 14 -4,-2: 0 -4,-1: 0 10,-1: 0 @@ -13888,8 +13884,8 @@ entities: 9,-3: 0 9,-2: 0 9,-1: 0 - 10,-16: 0 - 10,-15: 0 + 10,-16: 15 + 10,-15: 16 10,-14: 0 10,-13: 0 10,-12: 0 @@ -16125,15 +16121,15 @@ entities: 24,-18: 0 24,-17: 0 25,-32: 0 - 25,-31: 12 + 25,-31: 17 25,-30: 0 - 25,-29: 13 + 25,-29: 18 25,-28: 0 - 25,-27: 13 + 25,-27: 18 25,-26: 0 - 25,-25: 14 - 25,-24: 0 - 25,-23: 15 + 25,-25: 19 + 25,-24: 20 + 25,-23: 21 25,-22: 0 25,-21: 0 25,-20: 0 @@ -16141,15 +16137,15 @@ entities: 25,-18: 0 25,-17: 0 26,-32: 0 - 26,-31: 12 + 26,-31: 17 26,-30: 0 - 26,-29: 13 + 26,-29: 18 26,-28: 0 - 26,-27: 13 + 26,-27: 18 26,-26: 0 - 26,-25: 14 - 26,-24: 0 - 26,-23: 15 + 26,-25: 19 + 26,-24: 22 + 26,-23: 21 26,-22: 0 26,-21: 0 26,-20: 0 @@ -16157,15 +16153,15 @@ entities: 26,-18: 0 26,-17: 0 27,-32: 0 - 27,-31: 12 + 27,-31: 17 27,-30: 0 - 27,-29: 13 + 27,-29: 18 27,-28: 0 - 27,-27: 13 + 27,-27: 18 27,-26: 0 - 27,-25: 14 - 27,-24: 0 - 27,-23: 15 + 27,-25: 19 + 27,-24: 20 + 27,-23: 21 27,-22: 0 27,-21: 0 27,-20: 0 @@ -16453,17 +16449,17 @@ entities: 24,-34: 0 24,-33: 0 25,-36: 0 - 25,-35: 13 + 25,-35: 18 25,-34: 0 - 25,-33: 13 + 25,-33: 18 26,-36: 0 - 26,-35: 13 + 26,-35: 18 26,-34: 0 - 26,-33: 13 + 26,-33: 18 27,-36: 0 - 27,-35: 13 + 27,-35: 18 27,-34: 0 - 27,-33: 13 + 27,-33: 18 28,-36: 0 28,-35: 0 28,-34: 0 @@ -19427,7 +19423,7 @@ entities: -61,54: 0 -61,55: 0 -61,56: 0 - -61,57: 12 + -61,57: 17 -61,58: 0 -61,59: 0 -61,60: 0 @@ -22232,15 +22228,15 @@ entities: 36,-61: 0 36,-60: 0 36,-59: 0 - 36,-58: 13 + 36,-58: 18 36,-57: 0 36,-56: 0 36,-55: 0 37,-64: 0 37,-63: 0 37,-62: 0 - 37,-61: 13 - 37,-60: 13 + 37,-61: 18 + 37,-60: 18 37,-59: 0 37,-58: 0 37,-57: 0 @@ -22260,9 +22256,9 @@ entities: 38,-54: 0 38,-53: 0 39,-64: 0 - 39,-63: 13 - 39,-62: 13 - 39,-61: 13 + 39,-63: 18 + 39,-62: 18 + 39,-61: 18 39,-60: 0 39,-59: 0 39,-58: 0 @@ -22271,7 +22267,7 @@ entities: 39,-55: 0 39,-54: 0 39,-53: 0 - 40,-64: 13 + 40,-64: 18 40,-63: 0 40,-62: 0 40,-61: 0 @@ -22307,7 +22303,7 @@ entities: 43,-64: 0 43,-63: 0 43,-62: 0 - 43,-61: 13 + 43,-61: 18 43,-60: 0 43,-59: 0 43,-58: 0 @@ -22411,8 +22407,8 @@ entities: 35,-70: 0 35,-69: 0 35,-68: 0 - 35,-67: 13 - 35,-66: 13 + 35,-67: 18 + 35,-66: 18 35,-65: 0 36,-76: 0 36,-75: 0 @@ -22422,9 +22418,9 @@ entities: 36,-71: 0 36,-70: 0 36,-69: 0 - 36,-68: 13 - 36,-67: 13 - 36,-66: 13 + 36,-68: 18 + 36,-67: 18 + 36,-66: 18 36,-65: 0 37,-77: 0 37,-76: 0 @@ -22435,20 +22431,20 @@ entities: 37,-71: 0 37,-70: 0 37,-69: 0 - 37,-68: 13 - 37,-67: 13 + 37,-68: 18 + 37,-67: 18 37,-66: 0 37,-65: 0 38,-77: 0 38,-76: 0 38,-75: 0 - 38,-74: 13 + 38,-74: 18 38,-73: 0 38,-72: 0 38,-71: 0 38,-70: 0 - 38,-69: 13 - 38,-68: 13 + 38,-69: 18 + 38,-68: 18 38,-67: 0 38,-66: 0 38,-65: 0 @@ -22457,7 +22453,7 @@ entities: 39,-75: 0 39,-74: 0 39,-73: 0 - 39,-72: 13 + 39,-72: 18 39,-71: 0 39,-70: 0 39,-69: 0 @@ -22468,7 +22464,7 @@ entities: 40,-77: 0 40,-76: 0 40,-75: 0 - 40,-74: 13 + 40,-74: 18 40,-73: 0 40,-72: 0 40,-71: 0 @@ -22481,7 +22477,7 @@ entities: 41,-77: 0 41,-76: 0 41,-75: 0 - 41,-74: 13 + 41,-74: 18 41,-73: 0 41,-72: 0 41,-71: 0 @@ -22493,12 +22489,12 @@ entities: 41,-65: 0 42,-77: 0 42,-76: 0 - 42,-75: 13 + 42,-75: 18 42,-74: 0 42,-73: 0 42,-72: 0 42,-71: 0 - 42,-70: 13 + 42,-70: 18 42,-69: 0 42,-68: 0 42,-67: 0 @@ -22511,8 +22507,8 @@ entities: 43,-73: 0 43,-72: 0 43,-71: 0 - 43,-70: 13 - 43,-69: 13 + 43,-70: 18 + 43,-69: 18 43,-68: 0 43,-67: 0 43,-66: 0 @@ -22522,10 +22518,10 @@ entities: 44,-74: 0 44,-73: 0 44,-72: 0 - 44,-71: 13 - 44,-70: 13 - 44,-69: 13 - 44,-68: 13 + 44,-71: 18 + 44,-70: 18 + 44,-69: 18 + 44,-68: 18 44,-67: 0 44,-66: 0 44,-65: 0 @@ -22534,12 +22530,12 @@ entities: 45,-73: 0 45,-72: 0 45,-71: 0 - 45,-70: 13 + 45,-70: 18 45,-69: 0 45,-68: 0 45,-67: 0 45,-66: 0 - 45,-65: 13 + 45,-65: 18 46,-73: 0 46,-72: 0 46,-71: 0 @@ -22885,10 +22881,10 @@ entities: - 0 - 0 - volume: 2500 - temperature: 288.6117 + temperature: 288.04443 moles: - - 21.483866 - - 80.82026 + - 21.441238 + - 80.6599 - 0 - 0 - 0 @@ -22896,10 +22892,10 @@ entities: - 0 - 0 - volume: 2500 - temperature: 138.84845 + temperature: 137.57205 moles: - - 10.230412 - - 38.485836 + - 10.134501 + - 38.12503 - 0 - 0 - 0 @@ -22907,10 +22903,21 @@ entities: - 0 - 0 - volume: 2500 - temperature: 284.07346 + temperature: 282.79706 moles: - - 21.14285 - - 79.5374 + - 21.04694 + - 79.17659 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 120.69531 + moles: + - 8.866357 + - 33.354393 - 0 - 0 - 0 @@ -22929,10 +22936,21 @@ entities: - 0 - 0 - volume: 2500 - temperature: 274.99686 + temperature: 272.72772 moles: - - 20.460825 - - 76.97167 + - 20.290318 + - 76.330246 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 251.73819 + moles: + - 18.713127 + - 70.39701 - 0 - 0 - 0 @@ -22942,7 +22960,7 @@ entities: - volume: 2500 temperature: 256.84375 moles: - - 19.09677 + - 19.096767 - 71.840225 - 0 - 0 @@ -22951,7 +22969,62 @@ entities: - 0 - 0 - volume: 2500 - temperature: 220.53749 + temperature: 215.99922 + moles: + - 16.027645 + - 60.29448 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 138.84845 + moles: + - 10.230412 + - 38.485836 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 177.42383 + moles: + - 13.129028 + - 49.39016 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 197.8461 + moles: + - 14.66359 + - 55.163033 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 196.71152 + moles: + - 14.578337 + - 54.842316 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.15 moles: - 16.36866 - 61.57734 @@ -22962,32 +23035,10 @@ entities: - 0 - 0 - volume: 2500 - temperature: 184.23125 + temperature: 293.15 moles: - - 13.64055 - - 51.31445 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 220.5375 - moles: - - 16.36866 - - 61.57734 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 202.38437 - moles: - - 15.004604 - - 56.445892 + - 20.460823 + - 76.97167 - 0 - 0 - 0 @@ -23027,6 +23078,17 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 1677.6578 + - 1707.797 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -23038,6 +23100,17 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 2505.5745 + - 2520.644 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 type: GridAtmosphere - id: Marathon type: BecomesStation @@ -25221,18 +25294,16 @@ entities: parent: 30 type: Transform - uid: 356 - type: ShuttersNormalOpen + type: DisposalTrunk components: - - pos: 7.5,-17.5 + - rot: 1.5707963267948966 rad + pos: -3.5,-28.5 parent: 30 type: Transform - - inputs: - Open: [] - Close: [] - Toggle: - - port: Pressed - uid: 21469 - type: SignalReceiver + - containers: + DisposalEntry: !type:Container + ents: [] + type: ContainerContainer - uid: 357 type: Grille components: @@ -26810,10 +26881,9 @@ entities: parent: 30 type: Transform - uid: 572 - type: Girder + type: TableWood components: - - rot: 1.5707963267948966 rad - pos: 45.5,41.5 + - pos: 39.5,40.5 parent: 30 type: Transform - uid: 573 @@ -29838,18 +29908,15 @@ entities: parent: 30 type: Transform - uid: 1016 - type: ShuttersNormalOpen + type: DisposalUnit components: - - pos: 9.5,-17.5 + - pos: -3.5,-28.5 parent: 30 type: Transform - - inputs: - Open: [] - Close: [] - Toggle: - - port: Pressed - uid: 21469 - type: SignalReceiver + - containers: + DisposalUnit: !type:Container + ents: [] + type: ContainerContainer - uid: 1017 type: TableWood components: @@ -35604,7 +35671,7 @@ entities: parent: 30 type: Transform - uid: 1873 - type: AirlockSecurityLocked + type: AirlockSecurityGlassLocked components: - pos: -35.5,55.5 parent: 30 @@ -35634,7 +35701,7 @@ entities: parent: 30 type: Transform - uid: 1878 - type: AirlockSecurityLocked + type: AirlockSecurityGlassLocked components: - pos: -29.5,55.5 parent: 30 @@ -36115,255 +36182,224 @@ entities: id: Sec Cell Block type: SurveillanceCamera - uid: 1948 - type: ShellShotgunBeanbag + type: Grille components: - - pos: -41.63884,54.762314 + - pos: 34.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1949 - type: ShellShotgunBeanbag + type: Grille components: - - pos: -41.560715,54.762314 + - pos: 35.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1950 - type: ShellShotgunBeanbag + type: WeaponPistolMk58 components: - - pos: -41.466965,54.762314 + - pos: -37.608337,53.444714 parent: 30 type: Transform - canCollide: False type: Physics - uid: 1951 - type: ShellShotgunBeanbag + type: WeaponPistolMk58 components: - - pos: -41.38884,54.762314 + - pos: -37.467712,53.382214 parent: 30 type: Transform - canCollide: False type: Physics - uid: 1952 - type: ShellShotgunBeanbag + type: WeaponPistolMk58 components: - - pos: -41.310715,54.762314 + - pos: -37.295837,53.319714 parent: 30 type: Transform - canCollide: False type: Physics - uid: 1953 - type: ShellShotgunBeanbag + type: BoxShotgunIncendiary components: - - pos: -41.279465,54.74669 + - pos: -41.476646,54.61659 parent: 30 type: Transform - canCollide: False type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer - uid: 1954 - type: ShellShotgunBeanbag + type: MagazinePistol components: - - pos: -41.716965,54.74669 + - pos: -37.514587,53.632214 parent: 30 type: Transform + - unspawnedCount: 10 + type: BallisticAmmoProvider - canCollide: False type: Physics - uid: 1955 - type: ShellShotgunBeanbag + type: MagazinePistol components: - - pos: -41.57634,54.74669 + - pos: -37.295837,53.61659 parent: 30 type: Transform + - unspawnedCount: 10 + type: BallisticAmmoProvider - canCollide: False type: Physics - uid: 1956 - type: ShellShotgunBeanbag + type: BoxBeanbag components: - - pos: -41.435715,54.74669 + - pos: -41.476646,54.757214 parent: 30 type: Transform - canCollide: False type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer - uid: 1957 - type: ShellShotgunBeanbag + type: Grille components: - - pos: -41.529465,54.77794 + - pos: 36.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1958 - type: ShellShotgunFlash + type: MagazinePistol components: - - pos: -41.76384,54.52794 + - pos: -37.702087,53.632214 parent: 30 type: Transform + - unspawnedCount: 10 + type: BallisticAmmoProvider - canCollide: False type: Physics - uid: 1959 - type: ShellShotgunFlash + type: TableWood components: - - pos: -41.73259,54.543564 + - pos: 37.5,37.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1960 - type: ShellShotgunFlash + type: Chair components: - - pos: -41.67009,54.52794 + - pos: 43.5,41.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1961 - type: ShellShotgunFlash + type: TableWood components: - - pos: -41.591965,54.52794 + - pos: 38.5,40.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1962 - type: ShellShotgunFlash + type: TableWood components: - - pos: -41.51384,54.543564 + - pos: 41.5,37.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1963 - type: ShellShotgunFlash + type: TableWood components: - - pos: -41.466965,54.543564 + - pos: 41.5,38.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1964 - type: ShellShotgunFlash + type: ReinforcedWindow components: - - pos: -41.38884,54.543564 + - pos: 35.5,36.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1965 - type: ShellShotgunFlash + type: Grille components: - - pos: -41.29509,54.52794 + - pos: 41.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1966 - type: ShellShotgunFlash + type: TableWood components: - - pos: -41.435715,54.52794 + - pos: 37.5,38.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1967 - type: ShellShotgunFlash + type: ReinforcedWindow components: - - pos: -41.591965,54.543564 + - pos: 36.5,36.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1968 - type: ShellShotgun + type: Grille components: - - pos: -41.76384,54.324814 + - pos: 42.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1969 - type: ShellShotgun + type: Grille components: - - pos: -41.67009,54.324814 + - pos: 43.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1970 - type: ShellShotgun + type: Grille components: - - pos: -41.560715,54.324814 + - pos: 44.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1971 - type: ShellShotgun + type: Grille components: - - pos: -41.48259,54.324814 + - pos: 45.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1972 - type: ShellShotgun + type: Grille components: - - pos: -41.42009,54.324814 + - pos: 37.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1973 - type: ShellShotgun + type: Grille components: - - pos: -41.341965,54.324814 + - pos: 38.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1974 - type: ShellShotgun + type: Grille components: - - pos: -41.29509,54.324814 + - pos: 39.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1975 - type: ShellShotgun + type: Grille components: - - pos: -41.42009,54.324814 + - pos: 40.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1976 - type: ShellShotgun + type: Grille components: - - pos: -41.529465,54.324814 + - pos: 46.5,49.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1977 - type: ShellShotgun + type: WindowReinforcedDirectional components: - - pos: -41.591965,54.324814 + - rot: 3.141592653589793 rad + pos: 43.5,40.5 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 1978 type: WeaponShotgunKammerer components: - - pos: -37.498955,53.30476 + - pos: -41.42977,54.350964 parent: 30 type: Transform - unspawnedCount: 4 type: BallisticAmmoProvider - - canCollide: False - type: Physics - containers: ballistic-ammo: !type:Container ents: [] @@ -36371,13 +36407,11 @@ entities: - uid: 1979 type: WeaponShotgunKammerer components: - - pos: -37.498955,53.42976 + - pos: -41.42977,54.507214 parent: 30 type: Transform - unspawnedCount: 4 type: BallisticAmmoProvider - - canCollide: False - type: Physics - containers: ballistic-ammo: !type:Container ents: [] @@ -58685,25 +58719,23 @@ entities: - canCollide: False type: Physics - uid: 4883 - type: FirelockEdge + type: PosterContrabandDonutCorp components: - - pos: -29.5,56.5 + - pos: -28.5,54.5 parent: 30 type: Transform - - airBlocked: False - type: Airtight - - canCollide: False - type: Physics - uid: 4884 - type: FirelockEdge + type: FoodBoxDonut components: - - pos: -35.5,56.5 + - pos: -27.495125,54.759884 parent: 30 type: Transform - - airBlocked: False - type: Airtight - canCollide: False type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer - uid: 4885 type: ToolboxEmergencyFilled components: @@ -69032,7 +69064,7 @@ entities: parent: 30 type: Transform - uid: 6352 - type: WallReinforced + type: WallSolid components: - pos: 32.5,43.5 parent: 30 @@ -70660,13 +70692,13 @@ entities: parent: 30 type: Transform - uid: 6594 - type: WallReinforced + type: WallSolid components: - pos: 32.5,41.5 parent: 30 type: Transform - uid: 6595 - type: WallReinforced + type: WallSolid components: - pos: 32.5,40.5 parent: 30 @@ -70696,25 +70728,25 @@ entities: parent: 30 type: Transform - uid: 6600 - type: WallReinforced + type: WallSolid components: - pos: 29.5,44.5 parent: 30 type: Transform - uid: 6601 - type: WallReinforced + type: WallSolid components: - pos: 30.5,44.5 parent: 30 type: Transform - uid: 6602 - type: WallReinforced + type: WallSolid components: - pos: 31.5,44.5 parent: 30 type: Transform - uid: 6603 - type: WallReinforced + type: WallSolid components: - pos: 32.5,44.5 parent: 30 @@ -72865,6 +72897,8 @@ entities: pos: -33.5,-1.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 6897 type: GasPipeStraight components: @@ -72872,6 +72906,8 @@ entities: pos: -33.5,-1.5 parent: 30 type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor - uid: 6898 type: GasPipeStraight components: @@ -72879,6 +72915,8 @@ entities: pos: -32.5,-1.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 6899 type: filingCabinet components: @@ -72896,6 +72934,8 @@ entities: pos: -28.5,-1.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 6901 type: GasPipeStraight components: @@ -72903,6 +72943,8 @@ entities: pos: -29.5,-1.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 6902 type: GasPipeStraight components: @@ -72910,6 +72952,8 @@ entities: pos: -31.5,-1.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 6903 type: SignMorgue components: @@ -72974,18 +73018,24 @@ entities: pos: -30.5,-1.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 6910 type: GasPipeStraight components: - pos: -28.5,-4.5 parent: 30 type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor - uid: 6911 type: GasVentScrubber components: - pos: -28.5,-3.5 parent: 30 type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor - uid: 6912 type: PottedPlantRandom components: @@ -74987,6 +75037,8 @@ entities: - pos: -34.5,-1.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 7209 type: ClosetL3VirologyFilled components: @@ -75442,6 +75494,8 @@ entities: - pos: -28.5,-5.5 parent: 30 type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor - uid: 7275 type: WardrobeGenetics components: @@ -78075,6 +78129,8 @@ entities: pos: -21.5,-21.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 7587 type: GasPassiveVent components: @@ -79143,33 +79199,17 @@ entities: parent: 30 type: Transform - uid: 7745 - type: ShuttersNormalOpen + type: PaintingTheGreatWave components: - - rot: 1.5707963267948966 rad - pos: 10.5,-15.5 + - pos: -27.5,38.5 parent: 30 type: Transform - - inputs: - Open: [] - Close: [] - Toggle: - - port: Pressed - uid: 21469 - type: SignalReceiver - uid: 7746 - type: ShuttersNormalOpen + type: PaintingTheScream components: - - rot: 1.5707963267948966 rad - pos: 10.5,-14.5 + - pos: 0.5,34.5 parent: 30 type: Transform - - inputs: - Open: [] - Close: [] - Toggle: - - port: Pressed - uid: 21469 - type: SignalReceiver - uid: 7747 type: ShuttersNormalOpen components: @@ -85296,7 +85336,7 @@ entities: - uid: 8629 type: WallReinforced components: - - pos: 26.5,-23.5 + - pos: 27.5,-23.5 parent: 30 type: Transform - uid: 8630 @@ -85348,7 +85388,7 @@ entities: - uid: 8637 type: WallReinforced components: - - pos: 27.5,-23.5 + - pos: 26.5,-23.5 parent: 30 type: Transform - uid: 8638 @@ -85690,7 +85730,7 @@ entities: - fixtures: [] type: Fixtures - uid: 8693 - type: GasPassiveVent + type: GasOutletInjector components: - rot: -1.5707963267948966 rad pos: 25.5,-22.5 @@ -85703,7 +85743,7 @@ entities: parent: 30 type: Transform - uid: 8695 - type: GasPassiveVent + type: GasOutletInjector components: - rot: -1.5707963267948966 rad pos: 25.5,-24.5 @@ -85746,35 +85786,35 @@ entities: parent: 30 type: Transform - uid: 8702 - type: GasPassiveVent + type: GasOutletInjector components: - rot: -1.5707963267948966 rad pos: 25.5,-34.5 parent: 30 type: Transform - uid: 8703 - type: GasPassiveVent + type: GasOutletInjector components: - rot: -1.5707963267948966 rad pos: 25.5,-32.5 parent: 30 type: Transform - uid: 8704 - type: GasPassiveVent + type: GasOutletInjector components: - rot: -1.5707963267948966 rad pos: 25.5,-30.5 parent: 30 type: Transform - uid: 8705 - type: GasPassiveVent + type: GasOutletInjector components: - rot: -1.5707963267948966 rad pos: 25.5,-28.5 parent: 30 type: Transform - uid: 8706 - type: GasPassiveVent + type: GasOutletInjector components: - rot: -1.5707963267948966 rad pos: 25.5,-26.5 @@ -90748,11 +90788,9 @@ entities: - uid: 9361 type: WeaponRifleLecter components: - - pos: -22.568516,53.59532 + - pos: -22.570633,53.640427 parent: 30 type: Transform - - canCollide: False - type: Physics - uid: 9362 type: Grille components: @@ -107902,6 +107940,8 @@ entities: - pos: 35.5,-3.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11697 type: AirlockSalvageGlassLocked components: @@ -107975,6 +108015,8 @@ entities: pos: 39.5,-5.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11705 type: AirlockSalvageGlassLocked components: @@ -107988,6 +108030,8 @@ entities: pos: 37.5,-5.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11707 type: GasPipeBend components: @@ -107995,12 +108039,16 @@ entities: pos: 34.5,-3.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11708 type: GasPipeStraight components: - pos: 35.5,-4.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11709 type: GasVentPump components: @@ -108008,6 +108056,8 @@ entities: pos: 39.5,-3.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11710 type: GasPipeStraight components: @@ -108015,6 +108065,8 @@ entities: pos: 37.5,-3.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11711 type: GasPipeStraight components: @@ -108022,6 +108074,8 @@ entities: pos: 38.5,-3.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 11712 type: Grille components: @@ -114652,6 +114706,8 @@ entities: pos: 20.5,43.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 12583 type: GasVentScrubber components: @@ -115869,6 +115925,8 @@ entities: - pos: 16.5,56.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 12746 type: ResearchAndDevelopmentServer components: @@ -121205,18 +121263,24 @@ entities: - pos: 16.5,55.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 13469 type: GasVentPump components: - pos: 16.5,57.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 13470 type: GasVentPump components: - pos: 20.5,44.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 13471 type: WallSolid components: @@ -121434,9 +121498,9 @@ entities: parent: 30 type: Transform - uid: 13507 - type: WallSolid + type: WallReinforced components: - - pos: 34.5,41.5 + - pos: 44.5,42.5 parent: 30 type: Transform - uid: 13508 @@ -121446,9 +121510,9 @@ entities: parent: 30 type: Transform - uid: 13509 - type: WallSolid + type: WallReinforced components: - - pos: 34.5,42.5 + - pos: 43.5,42.5 parent: 30 type: Transform - uid: 13510 @@ -121500,33 +121564,33 @@ entities: parent: 30 type: Transform - uid: 13518 - type: WallSolid + type: WallReinforced components: - - pos: 40.5,42.5 + - pos: 38.5,42.5 parent: 30 type: Transform - uid: 13519 - type: WallSolid + type: WallReinforced components: - - pos: 41.5,42.5 + - pos: 37.5,42.5 parent: 30 type: Transform - uid: 13520 - type: WallSolid + type: WallReinforced components: - - pos: 42.5,42.5 + - pos: 36.5,42.5 parent: 30 type: Transform - uid: 13521 - type: WallSolid + type: WallReinforced components: - - pos: 43.5,42.5 + - pos: 35.5,42.5 parent: 30 type: Transform - uid: 13522 - type: WallSolid + type: WallReinforced components: - - pos: 44.5,42.5 + - pos: 34.5,42.5 parent: 30 type: Transform - uid: 13523 @@ -121572,33 +121636,33 @@ entities: parent: 30 type: Transform - uid: 13530 - type: WallSolid + type: WallReinforced components: - - pos: 36.5,42.5 + - pos: 41.5,42.5 parent: 30 type: Transform - uid: 13531 - type: WallSolid + type: WallReinforced components: - - pos: 37.5,42.5 + - pos: 40.5,42.5 parent: 30 type: Transform - uid: 13532 - type: WallSolid + type: WallReinforced components: - - pos: 38.5,42.5 + - pos: 34.5,40.5 parent: 30 type: Transform - uid: 13533 - type: WallSolid + type: WallReinforced components: - pos: 39.5,42.5 parent: 30 type: Transform - uid: 13534 - type: WallSolid + type: WallReinforced components: - - pos: 35.5,42.5 + - pos: 42.5,42.5 parent: 30 type: Transform - uid: 13535 @@ -121674,13 +121738,13 @@ entities: parent: 30 type: Transform - uid: 13547 - type: WallSolid + type: WallReinforced components: - - pos: 44.5,40.5 + - pos: 34.5,41.5 parent: 30 type: Transform - uid: 13548 - type: WallSolid + type: AirlockSecurityLocked components: - pos: 44.5,41.5 parent: 30 @@ -121728,21 +121792,21 @@ entities: parent: 30 type: Transform - uid: 13556 - type: ReinforcedWindow + type: WallReinforced components: - pos: 44.5,36.5 parent: 30 type: Transform - uid: 13557 - type: ReinforcedWindow + type: Grille components: - - pos: 44.5,34.5 + - pos: 38.5,36.5 parent: 30 type: Transform - uid: 13558 - type: ReinforcedWindow + type: Grille components: - - pos: 44.5,33.5 + - pos: 44.5,35.5 parent: 30 type: Transform - uid: 13559 @@ -121854,9 +121918,10 @@ entities: parent: 30 type: Transform - uid: 13577 - type: ReinforcedWindow + type: WindowReinforcedDirectional components: - - pos: 34.5,33.5 + - rot: 1.5707963267948966 rad + pos: 42.5,41.5 parent: 30 type: Transform - uid: 13578 @@ -121866,15 +121931,15 @@ entities: parent: 30 type: Transform - uid: 13579 - type: ReinforcedWindow + type: Window components: - - pos: 34.5,34.5 + - pos: 44.5,35.5 parent: 30 type: Transform - uid: 13580 - type: ReinforcedWindow + type: Grille components: - - pos: 34.5,36.5 + - pos: 35.5,36.5 parent: 30 type: Transform - uid: 13581 @@ -121890,13 +121955,13 @@ entities: parent: 30 type: Transform - uid: 13583 - type: ReinforcedWindow + type: TableWood components: - - pos: 34.5,40.5 + - pos: 40.5,40.5 parent: 30 type: Transform - uid: 13584 - type: WallReinforced + type: WallSolid components: - pos: 33.5,40.5 parent: 30 @@ -121950,11 +122015,13 @@ entities: parent: 30 type: Transform - uid: 13593 - type: WallSolid + type: GasVentPump components: - - pos: 42.5,31.5 + - pos: 35.5,39.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 13594 type: WallSolid components: @@ -122456,7 +122523,7 @@ entities: - uid: 13677 type: Grille components: - - pos: 34.5,36.5 + - pos: 36.5,36.5 parent: 30 type: Transform - uid: 13678 @@ -122466,7 +122533,7 @@ entities: parent: 30 type: Transform - uid: 13679 - type: Grille + type: WallSolid components: - pos: 34.5,33.5 parent: 30 @@ -122484,9 +122551,9 @@ entities: parent: 30 type: Transform - uid: 13682 - type: Grille + type: WallReinforced components: - - pos: 34.5,40.5 + - pos: 44.5,40.5 parent: 30 type: Transform - uid: 13683 @@ -122496,15 +122563,15 @@ entities: parent: 30 type: Transform - uid: 13684 - type: Grille + type: AirlockBrigGlassLocked components: - - pos: 44.5,34.5 + - pos: 39.5,36.5 parent: 30 type: Transform - uid: 13685 - type: Grille + type: WallReinforced components: - - pos: 44.5,36.5 + - pos: 34.5,36.5 parent: 30 type: Transform - uid: 13686 @@ -122998,15 +123065,15 @@ entities: uid: 13729 type: SignalTransmitter - uid: 13743 - type: AirlockGlass + type: Grille components: - - pos: 44.5,35.5 + - pos: 37.5,36.5 parent: 30 type: Transform - uid: 13744 - type: AirlockGlass + type: Grille components: - - pos: 44.5,38.5 + - pos: 41.5,36.5 parent: 30 type: Transform - uid: 13745 @@ -123016,9 +123083,9 @@ entities: parent: 30 type: Transform - uid: 13746 - type: AirlockGlass + type: Grille components: - - pos: 34.5,38.5 + - pos: 40.5,36.5 parent: 30 type: Transform - uid: 13747 @@ -123102,10 +123169,9 @@ entities: - color: '#FF1212FF' type: AtmosPipeColor - uid: 13757 - type: GasPipeStraight + type: GasPipeTJunction components: - - rot: 1.5707963267948966 rad - pos: 35.5,35.5 + - pos: 35.5,35.5 parent: 30 type: Transform - color: '#FF1212FF' @@ -123174,9 +123240,9 @@ entities: - color: '#FF1212FF' type: AtmosPipeColor - uid: 13765 - type: GasPipeStraight + type: GasPipeTJunction components: - - rot: 1.5707963267948966 rad + - rot: 3.141592653589793 rad pos: 43.5,35.5 parent: 30 type: Transform @@ -123237,9 +123303,9 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 13772 - type: GasPipeStraight + type: GasPipeTJunction components: - - rot: 1.5707963267948966 rad + - rot: 3.141592653589793 rad pos: 35.5,38.5 parent: 30 type: Transform @@ -123273,10 +123339,9 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 13776 - type: GasPipeStraight + type: GasPipeTJunction components: - - rot: 1.5707963267948966 rad - pos: 39.5,38.5 + - pos: 39.5,38.5 parent: 30 type: Transform - color: '#0335FCFF' @@ -124992,13 +125057,14 @@ entities: ents: [] type: ContainerContainer - uid: 13939 - type: DisposalPipe + type: DisposalJunctionFlipped components: - - pos: -2.5,-28.5 + - rot: 3.141592653589793 rad + pos: -2.5,-28.5 parent: 30 type: Transform - containers: - DisposalTransit: !type:Container + DisposalJunction: !type:Container ents: [] type: ContainerContainer - uid: 13940 @@ -134140,12 +134206,16 @@ entities: - pos: 16.5,45.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14975 type: GasPipeStraight components: - pos: 16.5,47.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14976 type: WoodDoor components: @@ -134158,6 +134228,8 @@ entities: - pos: 16.5,44.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14978 type: GasPipeBend components: @@ -134165,6 +134237,8 @@ entities: pos: 16.5,43.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14979 type: StoolBar components: @@ -134179,6 +134253,8 @@ entities: pos: 19.5,43.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14981 type: GasPipeStraight components: @@ -134186,6 +134262,8 @@ entities: pos: 18.5,43.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14982 type: UprightPianoInstrument components: @@ -134235,6 +134313,8 @@ entities: - pos: 16.5,52.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14989 type: CableApcExtension components: @@ -134247,6 +134327,8 @@ entities: - pos: 16.5,53.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 14991 type: StoolBar components: @@ -134443,6 +134525,8 @@ entities: - pos: 16.5,49.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 15019 type: Rack components: @@ -134629,6 +134713,8 @@ entities: - pos: 16.5,51.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 15050 type: StoolBar components: @@ -134655,18 +134741,24 @@ entities: - pos: 16.5,50.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 15054 type: GasPipeStraight components: - pos: 16.5,46.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 15055 type: GasPipeStraight components: - pos: 16.5,54.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 15056 type: Catwalk components: @@ -134703,6 +134795,8 @@ entities: - pos: 16.5,48.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 15062 type: Table components: @@ -141653,6 +141747,8 @@ entities: pos: 36.5,-3.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 16095 type: CableApcExtension components: @@ -141982,6 +142078,8 @@ entities: pos: 38.5,-5.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 16126 type: GasPipeStraight components: @@ -141989,12 +142087,16 @@ entities: pos: 36.5,-5.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 16127 type: GasPipeBend components: - pos: 34.5,-2.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 16128 type: GasPipeBend components: @@ -142002,6 +142104,8 @@ entities: pos: 35.5,-5.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 16129 type: WarpPoint components: @@ -142536,19 +142640,11 @@ entities: Toggle: [] type: SignalReceiver - uid: 16199 - type: Poweredlight + type: AirlockMaintLocked components: - - rot: 3.141592653589793 rad - pos: 42.5,32.5 + - pos: 42.5,31.5 parent: 30 type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - inputs: - On: [] - Off: [] - Toggle: [] - type: SignalReceiver - uid: 16200 type: Poweredlight components: @@ -146256,6 +146352,8 @@ entities: pos: 17.5,43.5 parent: 30 type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor - uid: 16784 type: WallReinforced components: @@ -175108,45 +175206,29 @@ entities: - canCollide: False type: Physics - uid: 20962 - type: FirelockGlass + type: AirlockGlass components: - - pos: 44.5,35.5 + - pos: 44.5,34.5 parent: 30 type: Transform - - airBlocked: False - type: Airtight - - canCollide: False - type: Physics - uid: 20963 - type: FirelockGlass - components: - - pos: 44.5,38.5 - parent: 30 - type: Transform - - airBlocked: False - type: Airtight - - canCollide: False - type: Physics -- uid: 20964 - type: FirelockGlass - components: - - pos: 34.5,35.5 - parent: 30 - type: Transform - - airBlocked: False - type: Airtight - - canCollide: False - type: Physics -- uid: 20965 - type: FirelockGlass + type: AirlockBrigGlassLocked components: - pos: 34.5,38.5 parent: 30 type: Transform - - airBlocked: False - type: Airtight - - canCollide: False - type: Physics +- uid: 20964 + type: Window + components: + - pos: 44.5,33.5 + parent: 30 + type: Transform +- uid: 20965 + type: AirlockBrigGlassLocked + components: + - pos: 44.5,38.5 + parent: 30 + type: Transform - uid: 20966 type: Table components: @@ -177730,6 +177812,9 @@ entities: type: Transform - canCollide: False type: Physics + - containers: + cell_slot: !type:ContainerSlot {} + type: ContainerContainer - uid: 21279 type: SurveillanceCameraEngineering components: @@ -179209,14 +179294,6 @@ entities: uid: 7740 - port: Toggle uid: 7747 - - port: Toggle - uid: 7746 - - port: Toggle - uid: 7745 - - port: Toggle - uid: 1016 - - port: Toggle - uid: 356 type: SignalTransmitter - uid: 21470 type: AirlockGlass @@ -179225,27 +179302,27 @@ entities: parent: 30 type: Transform - uid: 21471 - type: ReinforcedWindow + type: Window components: - - pos: 7.5,-17.5 + - pos: 10.5,-14.5 parent: 30 type: Transform - uid: 21472 - type: ReinforcedWindow - components: - - pos: 9.5,-17.5 - parent: 30 - type: Transform -- uid: 21473 - type: ReinforcedWindow + type: Window components: - pos: 10.5,-15.5 parent: 30 type: Transform -- uid: 21474 - type: ReinforcedWindow +- uid: 21473 + type: Window components: - - pos: 10.5,-14.5 + - pos: 9.5,-17.5 + parent: 30 + type: Transform +- uid: 21474 + type: Window + components: + - pos: 7.5,-17.5 parent: 30 type: Transform - uid: 21475 @@ -179378,4 +179455,611 @@ entities: - pos: -32.5,23.5 parent: 30 type: Transform +- uid: 21495 + type: CableApcExtension + components: + - pos: -18.5,-4.5 + parent: 30 + type: Transform +- uid: 21496 + type: CableApcExtension + components: + - pos: -18.5,-3.5 + parent: 30 + type: Transform +- uid: 21497 + type: CableApcExtension + components: + - pos: -18.5,-2.5 + parent: 30 + type: Transform +- uid: 21498 + type: CableApcExtension + components: + - pos: -18.5,-1.5 + parent: 30 + type: Transform +- uid: 21499 + type: SpawnPointPsychologist + components: + - pos: -28.5,-2.5 + parent: 30 + type: Transform +- uid: 21500 + type: Chair + components: + - rot: -1.5707963267948966 rad + pos: -33.5,-2.5 + parent: 30 + type: Transform +- uid: 21501 + type: PosterLegitSoftCapPopArt + components: + - pos: -32.5,-2.5 + parent: 30 + type: Transform +- uid: 21502 + type: MorgueTray + components: + - rot: -1.5707963267948966 rad + pos: 0,-1 + parent: 6908 + type: Transform +- uid: 21503 + type: MorgueTray + components: + - rot: -1.5707963267948966 rad + pos: 0,-1 + parent: 6907 + type: Transform +- uid: 21504 + type: MorgueTray + components: + - rot: -1.5707963267948966 rad + pos: 0,-1 + parent: 6906 + type: Transform +- uid: 21505 + type: MorgueTray + components: + - rot: -1.5707963267948966 rad + pos: 0,-1 + parent: 6877 + type: Transform +- uid: 21506 + type: PaintingCafeTerraceAtNight + components: + - pos: -17.5,33.5 + parent: 30 + type: Transform +- uid: 21507 + type: FoodBoxDonut + components: + - pos: -27.4795,54.68176 + parent: 30 + type: Transform + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 21508 + type: FoodBoxDonut + components: + - pos: -27.4795,54.603634 + parent: 30 + type: Transform + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 21509 + type: ReinforcedWindow + components: + - pos: 37.5,36.5 + parent: 30 + type: Transform +- uid: 21510 + type: ReinforcedWindow + components: + - pos: 38.5,36.5 + parent: 30 + type: Transform +- uid: 21511 + type: Window + components: + - pos: 34.5,34.5 + parent: 30 + type: Transform +- uid: 21512 + type: ReinforcedWindow + components: + - pos: 40.5,36.5 + parent: 30 + type: Transform +- uid: 21513 + type: ReinforcedWindow + components: + - pos: 41.5,36.5 + parent: 30 + type: Transform +- uid: 21514 + type: ReinforcedWindow + components: + - pos: 42.5,36.5 + parent: 30 + type: Transform +- uid: 21515 + type: ReinforcedWindow + components: + - pos: 43.5,36.5 + parent: 30 + type: Transform +- uid: 21516 + type: Grille + components: + - pos: 42.5,36.5 + parent: 30 + type: Transform +- uid: 21517 + type: Grille + components: + - pos: 43.5,36.5 + parent: 30 + type: Transform +- uid: 21518 + type: ChairWood + components: + - rot: -1.5707963267948966 rad + pos: 42.5,37.5 + parent: 30 + type: Transform +- uid: 21519 + type: ChairWood + components: + - rot: -1.5707963267948966 rad + pos: 42.5,38.5 + parent: 30 + type: Transform +- uid: 21520 + type: ChairWood + components: + - rot: 1.5707963267948966 rad + pos: 36.5,37.5 + parent: 30 + type: Transform +- uid: 21521 + type: ChairWood + components: + - rot: 1.5707963267948966 rad + pos: 36.5,38.5 + parent: 30 + type: Transform +- uid: 21522 + type: ComfyChair + components: + - pos: 39.5,41.5 + parent: 30 + type: Transform +- uid: 21523 + type: ClosetLegalFilled + components: + - pos: 35.5,41.5 + parent: 30 + type: Transform +- uid: 21524 + type: Chair + components: + - pos: 36.5,41.5 + parent: 30 + type: Transform +- uid: 21525 + type: Carpet + components: + - pos: 36.5,37.5 + parent: 30 + type: Transform +- uid: 21526 + type: Carpet + components: + - pos: 36.5,38.5 + parent: 30 + type: Transform +- uid: 21527 + type: Carpet + components: + - pos: 37.5,37.5 + parent: 30 + type: Transform +- uid: 21528 + type: Carpet + components: + - pos: 37.5,38.5 + parent: 30 + type: Transform +- uid: 21529 + type: Carpet + components: + - pos: 38.5,37.5 + parent: 30 + type: Transform +- uid: 21530 + type: Carpet + components: + - pos: 38.5,38.5 + parent: 30 + type: Transform +- uid: 21531 + type: CarpetBlack + components: + - pos: 40.5,40.5 + parent: 30 + type: Transform +- uid: 21532 + type: CarpetBlack + components: + - pos: 39.5,41.5 + parent: 30 + type: Transform +- uid: 21533 + type: CarpetBlack + components: + - pos: 39.5,40.5 + parent: 30 + type: Transform +- uid: 21534 + type: CarpetBlack + components: + - pos: 38.5,41.5 + parent: 30 + type: Transform +- uid: 21535 + type: CarpetBlue + components: + - pos: 42.5,38.5 + parent: 30 + type: Transform +- uid: 21536 + type: CarpetBlack + components: + - pos: 38.5,40.5 + parent: 30 + type: Transform +- uid: 21537 + type: CarpetBlue + components: + - pos: 40.5,38.5 + parent: 30 + type: Transform +- uid: 21538 + type: CarpetBlue + components: + - pos: 41.5,37.5 + parent: 30 + type: Transform +- uid: 21539 + type: CarpetBlue + components: + - pos: 40.5,37.5 + parent: 30 + type: Transform +- uid: 21540 + type: CarpetBlue + components: + - pos: 41.5,38.5 + parent: 30 + type: Transform +- uid: 21541 + type: BoxFolderBlue + components: + - pos: 41.545937,38.59172 + parent: 30 + type: Transform + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 21542 + type: CarpetBlue + components: + - pos: 42.5,37.5 + parent: 30 + type: Transform +- uid: 21543 + type: BoxFolderRed + components: + - pos: 37.54579,38.509315 + parent: 30 + type: Transform + - canCollide: False + type: Physics + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 21544 + type: CarpetBlack + components: + - pos: 40.5,41.5 + parent: 30 + type: Transform +- uid: 21545 + type: GasVentScrubber + components: + - rot: 3.141592653589793 rad + pos: 35.5,34.5 + parent: 30 + type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor +- uid: 21546 + type: GasPipeStraight + components: + - pos: 39.5,37.5 + parent: 30 + type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor +- uid: 21547 + type: GasPipeStraight + components: + - pos: 39.5,36.5 + parent: 30 + type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor +- uid: 21548 + type: GasPipeStraight + components: + - pos: 39.5,35.5 + parent: 30 + type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor +- uid: 21549 + type: GasVentPump + components: + - rot: 3.141592653589793 rad + pos: 39.5,34.5 + parent: 30 + type: Transform + - color: '#0335FCFF' + type: AtmosPipeColor +- uid: 21550 + type: GasPipeStraight + components: + - rot: 3.141592653589793 rad + pos: 43.5,36.5 + parent: 30 + type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor +- uid: 21551 + type: GasPipeStraight + components: + - rot: 3.141592653589793 rad + pos: 43.5,37.5 + parent: 30 + type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor +- uid: 21552 + type: GasPipeStraight + components: + - rot: 3.141592653589793 rad + pos: 43.5,38.5 + parent: 30 + type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor +- uid: 21553 + type: GasVentScrubber + components: + - pos: 43.5,39.5 + parent: 30 + type: Transform + - color: '#FF1212FF' + type: AtmosPipeColor +- uid: 21554 + type: PosterLegitCohibaRobustoAd + components: + - pos: 44.5,32.5 + parent: 30 + type: Transform +- uid: 21555 + type: VendingMachineCoffee + components: + - name: Hot drinks machine + type: MetaData + - pos: 35.5,32.5 + parent: 30 + type: Transform +- uid: 21556 + type: VendingMachineCigs + components: + - name: cigarette machine + type: MetaData + - pos: 43.5,32.5 + parent: 30 + type: Transform +- uid: 21557 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 36.5,35.5 + parent: 30 + type: Transform +- uid: 21558 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 36.5,34.5 + parent: 30 + type: Transform +- uid: 21559 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 37.5,35.5 + parent: 30 + type: Transform +- uid: 21560 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 37.5,34.5 + parent: 30 + type: Transform +- uid: 21561 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 38.5,35.5 + parent: 30 + type: Transform +- uid: 21562 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 38.5,34.5 + parent: 30 + type: Transform +- uid: 21563 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 40.5,35.5 + parent: 30 + type: Transform +- uid: 21564 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 40.5,34.5 + parent: 30 + type: Transform +- uid: 21565 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 41.5,35.5 + parent: 30 + type: Transform +- uid: 21566 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 41.5,34.5 + parent: 30 + type: Transform +- uid: 21567 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 42.5,35.5 + parent: 30 + type: Transform +- uid: 21568 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 42.5,34.5 + parent: 30 + type: Transform +- uid: 21569 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 37.5,33.5 + parent: 30 + type: Transform +- uid: 21570 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 38.5,33.5 + parent: 30 + type: Transform +- uid: 21571 + type: PosterLegitNanotrasenLogo + components: + - pos: 34.5,36.5 + parent: 30 + type: Transform +- uid: 21572 + type: PosterLegitNanotrasenLogo + components: + - pos: 44.5,36.5 + parent: 30 + type: Transform +- uid: 21573 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 40.5,33.5 + parent: 30 + type: Transform +- uid: 21574 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 41.5,33.5 + parent: 30 + type: Transform +- uid: 21575 + type: PottedPlantRandom + components: + - pos: 43.5,35.5 + parent: 30 + type: Transform + - containers: + stash: !type:ContainerSlot {} + type: ContainerContainer +- uid: 21576 + type: PottedPlantRandom + components: + - pos: 35.5,37.5 + parent: 30 + type: Transform + - containers: + stash: !type:ContainerSlot {} + type: ContainerContainer +- uid: 21577 + type: filingCabinet + components: + - pos: 43.5,37.5 + parent: 30 + type: Transform + - containers: + storagebase: !type:Container + ents: [] + type: ContainerContainer +- uid: 21578 + type: Chair + components: + - pos: 46.5,37.5 + parent: 30 + type: Transform +- uid: 21579 + type: Chair + components: + - rot: 3.141592653589793 rad + pos: 46.5,35.5 + parent: 30 + type: Transform +- uid: 21580 + type: Table + components: + - pos: 46.5,36.5 + parent: 30 + type: Transform +- uid: 21581 + type: MaintenanceWeaponSpawner + components: + - pos: 31.5,27.5 + parent: 30 + type: Transform ... From 3f989559b974e47351f5df5d43f2e1accc13da06 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 17 Jun 2022 10:30:49 +1000 Subject: [PATCH 69/89] Cleanup the remainder of dragon (#8881) * Cleanup the remainder of dragon - Fixed some of the niscellaneous changes made to yml - Made devour use a whitelist - Fixed spelling * name fix * a --- Content.Server/Dragon/DragonComponent.cs | 15 ++++++ Content.Server/Dragon/DragonSystem.cs | 45 ++++++++---------- .../Locale/en-US/actions/actions/dragon.ftl | 4 +- .../Entities/Mobs/Player/dragon.yml | 6 +-- .../Objects/Consumable/Food/meals.yml | 2 +- .../Objects/Specific/Janitorial/trashbag.yml | 1 - .../Structures/Doors/Firelocks/firelock.yml | 3 -- .../Entities/Structures/Walls/walls.yml | 4 +- .../{carpbirth.png => carp_summon.png} | Bin .../Textures/Interface/Actions/meta.json | 15 +++--- 10 files changed, 52 insertions(+), 43 deletions(-) rename Resources/Textures/Interface/Actions/{carpbirth.png => carp_summon.png} (100%) diff --git a/Content.Server/Dragon/DragonComponent.cs b/Content.Server/Dragon/DragonComponent.cs index d8bcac9db5..a17c317cd9 100644 --- a/Content.Server/Dragon/DragonComponent.cs +++ b/Content.Server/Dragon/DragonComponent.cs @@ -5,6 +5,7 @@ using Content.Shared.Actions; using Content.Shared.Chemistry.Reagent; using Content.Shared.Sound; using Content.Shared.Storage; +using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -78,6 +79,20 @@ namespace Content.Server.Dragon public CancellationTokenSource? CancelToken; + [ViewVariables(VVAccess.ReadWrite), DataField("devourWhitelist")] + public EntityWhitelist? DevourWhitelist = new() + { + Components = new string[] + { + "Door", + "MobState", + }, + Tags = new List() + { + "Wall", + } + }; + /// /// Where the entities go when dragon devours them, empties when the dragon is butchered. /// diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index c92a9359d3..b03c8fcb81 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -112,9 +112,11 @@ namespace Content.Server.Dragon /// /// The devour action /// - private void OnDevourAction(EntityUid dragonuid, DragonComponent component, DragonDevourActionEvent args) + private void OnDevourAction(EntityUid uid, DragonComponent component, DragonDevourActionEvent args) { - if (component.CancelToken != null || args.Handled) return; + if (component.CancelToken != null || + args.Handled || + component.DevourWhitelist?.IsValid(args.Target, EntityManager) != true) return; args.Handled = true; var target = args.Target; @@ -128,9 +130,9 @@ namespace Content.Server.Dragon case SharedDeadMobState: component.CancelToken = new CancellationTokenSource(); - _doAfterSystem.DoAfter(new DoAfterEventArgs(dragonuid, component.DevourTime, component.CancelToken.Token, target) + _doAfterSystem.DoAfter(new DoAfterEventArgs(uid, component.DevourTime, component.CancelToken.Token, target) { - UserFinishedEvent = new DragonStructureDevourComplete(dragonuid, target), + UserFinishedEvent = new DragonDevourComplete(uid, target), UserCancelledEvent = new DragonDevourCancelledEvent(), BreakOnTargetMove = true, BreakOnUserMove = true, @@ -138,33 +140,28 @@ namespace Content.Server.Dragon }); break; default: - _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-fail-target-alive"), dragonuid, Filter.Entities(dragonuid)); + _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-fail-target-alive"), uid, Filter.Entities(uid)); break; } return; } - // Absolutely ass solution but requires less yaml fuckery - // If it's a door (firelock, airlock, windoor), Wall or Window, dragon can eat it. - if (_tagSystem.HasTag(target, "Wall") || (_tagSystem.HasTag(target, "Window") || EntityManager.HasComponent(target))) + _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-structure"), uid, Filter.Entities(uid)); + + if (component.SoundStructureDevour != null) + SoundSystem.Play(component.SoundStructureDevour.GetSound(), Filter.Pvs(uid, entityManager: EntityManager), uid, component.SoundStructureDevour.Params); + + component.CancelToken = new CancellationTokenSource(); + + _doAfterSystem.DoAfter(new DoAfterEventArgs(uid, component.DevourTime, component.CancelToken.Token, target) { - _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-structure"), dragonuid, Filter.Entities(dragonuid)); - - if (component.SoundStructureDevour != null) - SoundSystem.Play(component.SoundStructureDevour.GetSound(), Filter.Pvs(dragonuid, entityManager: EntityManager), dragonuid, component.SoundStructureDevour.Params); - - component.CancelToken = new CancellationTokenSource(); - - _doAfterSystem.DoAfter(new DoAfterEventArgs(dragonuid, component.DevourTime, component.CancelToken.Token, target) - { - UserFinishedEvent = new DragonStructureDevourComplete(dragonuid, target), - UserCancelledEvent = new DragonDevourCancelledEvent(), - BreakOnTargetMove = true, - BreakOnUserMove = true, - BreakOnStun = true, - }); - } + UserFinishedEvent = new DragonStructureDevourComplete(uid, target), + UserCancelledEvent = new DragonDevourCancelledEvent(), + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnStun = true, + }); } private void OnDragonSpawnAction(EntityUid dragonuid, DragonComponent component, DragonSpawnActionEvent args) diff --git a/Resources/Locale/en-US/actions/actions/dragon.ftl b/Resources/Locale/en-US/actions/actions/dragon.ftl index 582a10cf57..eaa98259c6 100644 --- a/Resources/Locale/en-US/actions/actions/dragon.ftl +++ b/Resources/Locale/en-US/actions/actions/dragon.ftl @@ -8,5 +8,5 @@ dragon-spawn-action-popup-message-fail-no-eggs = You don't have the stamina to c action-name-devour = [color=red]Devour[/color] action-description-devour = Attempt to break a structure with your jaws or swallow a creature. -action-name-carp-birth = Summon carp -action-description-carp-birth = Summon a carp to aid you at seizing the station! +action-name-carp-summon = Summon carp +action-description-carp-summon = Summon a carp to aid you at seizing the station! diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index 000e2bce25..23ce642caa 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -96,8 +96,8 @@ - Wall spawnAction: event: !type:DragonSpawnActionEvent - icon: Interface/Actions/carpbirth.png - name: action-name-carp-birth - description: action-description-carp-birth + icon: Interface/Actions/carp_summon.png + name: action-name-carp-summon + description: action-description-carp-summon useDelay: 5 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml index 9b9b65e383..cb1e9cb493 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml @@ -371,7 +371,7 @@ name: Sashimi parent: FoodMealBase id: FoodMealSashimi - description: It's taste can only be described as "Exotic". The poisoning though? That's pretty common. + description: Its taste can only be described as "Exotic". The poisoning though? That's pretty common. components: - type: Sprite state: sashimi diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml index f5957ae0de..049d7cc857 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml @@ -2,7 +2,6 @@ name: trash bag id: TrashBag parent: BaseStorageItem - description: The solution to space pollution. Rubbish removal revolution. components: - type: Sprite netSync: false diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index 89cbb1b588..3e63d5e4b2 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -8,9 +8,6 @@ alarmedBy: - FireAlarm - AirAlarm - - type: Tag - tags: - - RCDDeconstructWhitelist - type: ApcPowerReceiver - type: ExtensionCableReceiver - type: DeviceNetwork diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 9398fde93e..3b2ad757c0 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -96,6 +96,7 @@ components: - type: Tag tags: + - RCDDeconstructWhitelist - Wall - type: Sprite sprite: Structures/Walls/cult.rsi @@ -335,9 +336,6 @@ id: WallReinforced name: reinforced wall components: - - type: Tag - tags: - - Wall - type: Sprite sprite: Structures/Walls/solid.rsi - type: Icon diff --git a/Resources/Textures/Interface/Actions/carpbirth.png b/Resources/Textures/Interface/Actions/carp_summon.png similarity index 100% rename from Resources/Textures/Interface/Actions/carpbirth.png rename to Resources/Textures/Interface/Actions/carp_summon.png diff --git a/Resources/Textures/Interface/Actions/meta.json b/Resources/Textures/Interface/Actions/meta.json index e4661a48c4..20880fc792 100644 --- a/Resources/Textures/Interface/Actions/meta.json +++ b/Resources/Textures/Interface/Actions/meta.json @@ -20,19 +20,22 @@ "name": "disarm" }, { - "name": "harm" + "name": "harm" }, { - "name": "manifest" + "name": "manifest" }, { - "name": "devour" - } + "name": "devour" + }, + { + "name": "carp_summon" + }, { "name": "ratKingArmy" }, { - "name": "ratKingDomain" + "name": "ratKingDomain" } ] -} +} \ No newline at end of file From f1066858e757f29d67019881ef66ee1da532b103 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Fri, 17 Jun 2022 13:58:28 +1000 Subject: [PATCH 70/89] Update submodule --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 72cf2f6334..0dfd71c990 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 72cf2f6334a942a63cba7bd2b980cf9579d3edc5 +Subproject commit 0dfd71c990e4e3afaf390f9706ee547a69b76168 From 01189a5590ed450f5249210c3bd9f526b059c65b Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Thu, 16 Jun 2022 22:38:24 -0600 Subject: [PATCH 71/89] Remove reporter tophat (#8912) --- Resources/Prototypes/Roles/Jobs/Civilian/reporter.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/reporter.yml b/Resources/Prototypes/Roles/Jobs/Civilian/reporter.yml index 9e7832e528..4c924a095b 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/reporter.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/reporter.yml @@ -13,7 +13,6 @@ - type: startingGear id: ReporterGear equipment: - head: ClothingHeadHatTophat jumpsuit: ClothingUniformJumpsuitReporter back: ClothingBackpackFilled shoes: ClothingShoesColorWhite @@ -21,4 +20,4 @@ ears: ClothingHeadsetService innerclothingskirt: ClothingUniformJumpsuitJournalist satchel: ClothingBackpackSatchelFilled - duffelbag: ClothingBackpackDuffelFilled \ No newline at end of file + duffelbag: ClothingBackpackDuffelFilled From b44ec9554af3a4fb26d4a5908e4b80f58db09a57 Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Fri, 17 Jun 2022 01:37:07 -0400 Subject: [PATCH 72/89] Disarm 1984 (#8872) --- Content.Server/CombatMode/CombatModeSystem.cs | 52 +++++++++++++++++-- .../CombatMode/Disarm/DisarmMalusComponent.cs | 16 ++++++ .../Components/EnergySwordComponent.cs | 3 ++ .../Melee/EnergySword/EnergySwordSystem.cs | 11 ++++ .../CombatMode/SharedCombatModeComponent.cs | 4 +- .../en-US/actions/actions/disarm-action.ftl | 2 + .../Objects/Weapons/Melee/e_sword.yml | 6 +++ .../Entities/Objects/Weapons/Melee/knife.yml | 2 + .../Entities/Objects/Weapons/Melee/sword.yml | 4 ++ .../Entities/Objects/Weapons/security.yml | 2 + 10 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs diff --git a/Content.Server/CombatMode/CombatModeSystem.cs b/Content.Server/CombatMode/CombatModeSystem.cs index f4398bdbdc..23533ea431 100644 --- a/Content.Server/CombatMode/CombatModeSystem.cs +++ b/Content.Server/CombatMode/CombatModeSystem.cs @@ -1,16 +1,20 @@ using Content.Server.Actions.Events; using Content.Server.Administration.Logs; +using Content.Server.CombatMode.Disarm; using Content.Server.Hands.Components; using Content.Server.Popups; using Content.Server.Weapon.Melee; using Content.Shared.ActionBlocker; using Content.Shared.Audio; using Content.Shared.CombatMode; +using Content.Shared.Damage; using Content.Shared.Database; +using Content.Shared.Stunnable; using JetBrains.Annotations; using Robust.Shared.Audio; using Robust.Shared.Player; using Robust.Shared.Random; +using Robust.Shared.Physics; namespace Content.Server.CombatMode { @@ -38,9 +42,17 @@ namespace Content.Server.CombatMode if (!_actionBlockerSystem.CanAttack(args.Performer)) return; + if (TryComp(args.Performer, out var hands) + && hands.ActiveHand != null + && !hands.ActiveHand.IsEmpty) + { + _popupSystem.PopupEntity(Loc.GetString("disarm-action-free-hand"), args.Performer, Filter.Entities(args.Performer)); + return; + } + EntityUid? inTargetHand = null; - if (EntityManager.TryGetComponent(args.Target, out HandsComponent? targetHandsComponent) + if (TryComp(args.Target, out HandsComponent? targetHandsComponent) && targetHandsComponent.ActiveHand != null && !targetHandsComponent.ActiveHand.IsEmpty) { @@ -64,8 +76,8 @@ namespace Content.Server.CombatMode var filterOther = filterAll.RemoveWhereAttachedEntity(e => e == args.Performer); args.Handled = true; - - if (_random.Prob(component.DisarmFailChance)) + var chance = CalculateDisarmChance(args.Performer, args.Target, inTargetHand, component); + if (_random.Prob(chance)) { SoundSystem.Play(component.DisarmFailSound.GetSound(), Filter.Pvs(args.Performer), args.Performer, AudioHelpers.WithVariation(0.025f)); @@ -89,8 +101,40 @@ namespace Content.Server.CombatMode SoundSystem.Play(component.DisarmSuccessSound.GetSound(), filterAll, args.Performer, AudioHelpers.WithVariation(0.025f)); _adminLogger.Add(LogType.DisarmedAction, $"{ToPrettyString(args.Performer):user} used disarm on {ToPrettyString(args.Target):target}"); - var eventArgs = new DisarmedEvent() { Target = args.Target, Source = args.Performer, PushProbability = component.DisarmPushChance }; + var eventArgs = new DisarmedEvent() { Target = args.Target, Source = args.Performer, PushProbability = chance }; RaiseLocalEvent(args.Target, eventArgs); } + + + private float CalculateDisarmChance(EntityUid disarmer, EntityUid disarmed, EntityUid? inTargetHand, SharedCombatModeComponent disarmerComp) + { + float healthMod = 0; + if (TryComp(disarmer, out var disarmerDamage) && TryComp(disarmed, out var disarmedDamage)) + { + // I wanted this to consider their mob state thresholds too but I'm not touching that shitcode after having a go at this. + healthMod = (((float) disarmedDamage.TotalDamage - (float) disarmerDamage.TotalDamage) / 200); // Ex. You have 0 damage, they have 90, you get a 45% chance increase + } + + float massMod = 0; + + if (TryComp(disarmer, out var disarmerPhysics) && TryComp(disarmed, out var disarmedPhysics)) + { + if (disarmerPhysics.FixturesMass != 0) // yeah this will never happen but let's not kill the server if it does + massMod = (((disarmedPhysics.FixturesMass / disarmerPhysics.FixturesMass - 1 ) / 2)); // Ex, you weigh 120, they weigh 70, you get a 29% bonus + } + + float chance = (disarmerComp.BaseDisarmFailChance - healthMod - massMod); + if (HasComp(disarmer)) // might need to revisit this part after stamina damage, right now this is basically "pre-stun" + chance += 0.35f; + if (HasComp(disarmed)) + chance -= 0.35f; + + if (inTargetHand != null && TryComp(inTargetHand, out var malus)) + { + chance += malus.Malus; + } + + return Math.Clamp(chance, 0f, 1f); + } } } diff --git a/Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs b/Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs new file mode 100644 index 0000000000..9e5b454ae7 --- /dev/null +++ b/Content.Server/CombatMode/Disarm/DisarmMalusComponent.cs @@ -0,0 +1,16 @@ +namespace Content.Server.CombatMode.Disarm +{ + /// + /// Applies a malus to disarm attempts against this item. + /// + [RegisterComponent] + public sealed class DisarmMalusComponent : Component + { + /// + /// So, disarm chances are a % chance represented as a value between 0 and 1. + /// This default would be a 30% penalty to that. + /// + [DataField("malus")] + public float Malus = 0.3f; + } +} diff --git a/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs b/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs index 442f979faf..2f11c73661 100644 --- a/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs +++ b/Content.Server/Weapon/Melee/EnergySword/Components/EnergySwordComponent.cs @@ -36,5 +36,8 @@ namespace Content.Server.Weapon.Melee.EnergySword [DataField("litDamageBonus", required: true)] public DamageSpecifier LitDamageBonus = default!; + + [DataField("litDisarmMalus", required: true)] + public float litDisarmMalus = 0.6f; } } diff --git a/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs b/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs index ba165e8b49..aa675681a1 100644 --- a/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs +++ b/Content.Server/Weapon/Melee/EnergySword/EnergySwordSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Light; using Content.Shared.Light.Component; using Content.Shared.Toggleable; using Content.Shared.Tools.Components; +using Content.Server.CombatMode.Disarm; using Robust.Shared.Audio; using Robust.Shared.Player; using Robust.Shared.Random; @@ -68,6 +69,11 @@ namespace Content.Server.Weapon.Melee.EnergySword item.Size = 5; } + if (TryComp(comp.Owner, out var malus)) + { + malus.Malus -= comp.litDisarmMalus; + } + SoundSystem.Play(comp.DeActivateSound.GetSound(), Filter.Pvs(comp.Owner, entityManager: EntityManager), comp.Owner); comp.Activated = false; @@ -85,6 +91,11 @@ namespace Content.Server.Weapon.Melee.EnergySword SoundSystem.Play(comp.ActivateSound.GetSound(), Filter.Pvs(comp.Owner, entityManager: EntityManager), comp.Owner); + if (TryComp(comp.Owner, out var malus)) + { + malus.Malus += comp.litDisarmMalus; + } + comp.Activated = true; } diff --git a/Content.Shared/CombatMode/SharedCombatModeComponent.cs b/Content.Shared/CombatMode/SharedCombatModeComponent.cs index 790a2724bd..8a958f6f59 100644 --- a/Content.Shared/CombatMode/SharedCombatModeComponent.cs +++ b/Content.Shared/CombatMode/SharedCombatModeComponent.cs @@ -15,10 +15,10 @@ namespace Content.Shared.CombatMode private TargetingZone _activeZone; [DataField("disarmFailChance")] - public readonly float DisarmFailChance = 0.4f; + public readonly float BaseDisarmFailChance = 0.4f; [DataField("pushChance")] - public readonly float DisarmPushChance = 0.4f; + public readonly float BasePushFailChance = 0.4f; [DataField("disarmFailSound")] public readonly SoundSpecifier DisarmFailSound = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg"); diff --git a/Resources/Locale/en-US/actions/actions/disarm-action.ftl b/Resources/Locale/en-US/actions/actions/disarm-action.ftl index 2625ec336e..4f97b4f766 100644 --- a/Resources/Locale/en-US/actions/actions/disarm-action.ftl +++ b/Resources/Locale/en-US/actions/actions/disarm-action.ftl @@ -1,3 +1,5 @@ +disarm-action-free-hand = You need to use a free hand to disarm! + disarm-action-popup-message-other-clients = {$performerName} fails to disarm {$targetName}! disarm-action-popup-message-cursor = You fail to disarm {$targetName}! diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index b31075c040..848b95003a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -10,6 +10,7 @@ Slash: 12.5 Heat: 12.5 Blunt: -7 + litDisarmMalus: 0.6 - type: Sharp - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi @@ -47,6 +48,8 @@ right: - state: inhand-right-blade shader: unshaded + - type: DisarmMalus + malus: 0 - type: entity name: pen @@ -61,6 +64,7 @@ Slash: 7.5 Heat: 7.5 Blunt: -1 + litDisarmMalus: 0.4 - type: Sprite sprite: Objects/Weapons/Melee/e_dagger.rsi layers: @@ -98,3 +102,5 @@ - type: Tag tags: - Write + - type: DisarmMalus + malus: 0 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 476ece58d7..ea6799758e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -89,6 +89,8 @@ size: 10 sprite: Objects/Weapons/Melee/combat_knife.rsi prefix: inhand + - type: DisarmMalus + malus: 0.225 - type: entity name: survival knife diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index ef734865a3..f44fda2571 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -18,6 +18,7 @@ - type: Tag tags: - CaptainSabre + - type: DisarmMalus - type: entity name: katana @@ -39,6 +40,7 @@ - type: Item size: 15 sprite: Objects/Weapons/Melee/katana.rsi + - type: DisarmMalus - type: entity name: machete @@ -60,6 +62,7 @@ - type: Item size: 15 sprite: Objects/Weapons/Melee/machete.rsi + - type: DisarmMalus - type: entity name: claymore @@ -80,3 +83,4 @@ sprite: Objects/Weapons/Melee/claymore.rsi Slots: - back + - type: DisarmMalus diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 1bac5df766..3db6c2463d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -27,6 +27,8 @@ size: 20 Slots: - Belt + - type: DisarmMalus + malus: 0.225 - type: entity name: flash From 08a4c7b835de10eba0767aaf3fa06d525595a964 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 17 Jun 2022 01:38:11 -0400 Subject: [PATCH 73/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2f22d6621f..0f90949f99 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: Todd - changes: - - {message: Added flip flap to the lobby themes., type: Add} - id: 1213 - time: '2022-03-15T12:28:24.0000000+00:00' - author: mirrorcult changes: - {message: You can no longer construct 'destroyed machine frames'., type: Tweak} @@ -2994,3 +2989,13 @@ Entries: - {message: 'You can no longer wide attack inside of lockers, crates, etc.', type: Fix} id: 1712 time: '2022-06-16T10:59:13.0000000+00:00' +- author: Rane + changes: + - {message: 'Disarm chance now scales with relative health, relative mass, and status + effects. It''s now a much, much worse tool to instantly win a fight you''re + losing.', type: Tweak} + - {message: You now need to use an empty hand to perform disarms., type: Tweak} + - {message: 'Purpose-built single-handed melee weapons now have a disarm malus, + making them much harder to disarm.', type: Add} + id: 1713 + time: '2022-06-17T05:37:07.0000000+00:00' From 5a216be73059b1bcfe6413da6901267fdcd903e6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 17 Jun 2022 15:52:09 +1000 Subject: [PATCH 74/89] Make wide attacks optional for now (#8924) --- Content.Server/Weapon/Melee/Components/MeleeWeaponComponent.cs | 2 +- Content.Server/Weapon/Melee/MeleeWeaponSystem.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Server/Weapon/Melee/Components/MeleeWeaponComponent.cs b/Content.Server/Weapon/Melee/Components/MeleeWeaponComponent.cs index c773d2f8e9..d690015857 100644 --- a/Content.Server/Weapon/Melee/Components/MeleeWeaponComponent.cs +++ b/Content.Server/Weapon/Melee/Components/MeleeWeaponComponent.cs @@ -28,7 +28,7 @@ namespace Content.Server.Weapon.Melee.Components [ViewVariables(VVAccess.ReadWrite)] [DataField("arc")] - public string Arc { get; set; } = "default"; + public string? Arc { get; set; } = "default"; [ViewVariables(VVAccess.ReadWrite)] [DataField("arcwidth")] diff --git a/Content.Server/Weapon/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapon/Melee/MeleeWeaponSystem.cs index 7a67b48564..5b47fc89b4 100644 --- a/Content.Server/Weapon/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapon/Melee/MeleeWeaponSystem.cs @@ -124,6 +124,8 @@ namespace Content.Server.Weapon.Melee private void OnWideAttack(EntityUid owner, MeleeWeaponComponent comp, WideAttackEvent args) { + if (string.IsNullOrEmpty(comp.Arc)) return; + args.Handled = true; var curTime = _gameTiming.CurTime; From 1dc78ec88aa377e0d993e21391b2d80f1b43eb61 Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Fri, 17 Jun 2022 03:00:23 -0400 Subject: [PATCH 75/89] Port miasma from nyano (#8926) Co-authored-by: Kara --- Content.Server/Atmos/Miasma/MiasmaSystem.cs | 92 ++++++++++++ .../Atmos/Miasma/NoRotContainerComponent.cs | 9 ++ .../Atmos/Miasma/PerishableComponent.cs | 42 ++++++ .../Atmos/Miasma/RottingComponent.cs | 9 ++ .../ReagentEffects/ChemCauseRandomDisease.cs | 32 +++++ .../StationEvents/Events/GasLeak.cs | 1 + .../StationEvents/Events/RadiationStorm.cs | 136 ------------------ .../Components/GasArtifactComponent.cs | 3 +- .../Components/ArtifactGasTriggerComponent.cs | 3 +- Content.Shared/Atmos/Atmospherics.cs | 3 +- .../Components/SharedVentScrubberComponent.cs | 1 + .../Locale/en-US/reagents/meta/gases.ftl | 3 + Resources/Prototypes/Atmospherics/gases.yml | 11 ++ .../Entities/Mobs/NPCs/simplemob.yml | 1 + .../Entities/Mobs/Species/human.yml | 1 + .../Objects/Specific/Medical/morgue.yml | 1 + .../Storage/Canisters/gas_canisters.yml | 46 ++++++ .../Storage/Closets/Lockers/lockers.yml | 5 +- .../Entities/Structures/Storage/morgue.yml | 3 +- .../Structures/Wallmounts/air_alarm.yml | 1 + Resources/Prototypes/Reagents/gases.yml | 40 ++++++ 21 files changed, 301 insertions(+), 142 deletions(-) create mode 100644 Content.Server/Atmos/Miasma/MiasmaSystem.cs create mode 100644 Content.Server/Atmos/Miasma/NoRotContainerComponent.cs create mode 100644 Content.Server/Atmos/Miasma/PerishableComponent.cs create mode 100644 Content.Server/Atmos/Miasma/RottingComponent.cs create mode 100644 Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs delete mode 100644 Content.Server/StationEvents/Events/RadiationStorm.cs diff --git a/Content.Server/Atmos/Miasma/MiasmaSystem.cs b/Content.Server/Atmos/Miasma/MiasmaSystem.cs new file mode 100644 index 0000000000..e189984a12 --- /dev/null +++ b/Content.Server/Atmos/Miasma/MiasmaSystem.cs @@ -0,0 +1,92 @@ +using Content.Shared.MobState; +using Content.Shared.Damage; +using Content.Shared.Atmos; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Temperature.Components; +using Content.Server.Body.Components; +using Robust.Shared.Containers; + +namespace Content.Server.Atmos.Miasma +{ + public sealed class MiasmaSystem : EntitySystem + { + [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + + public override void Update(float frameTime) + { + base.Update(frameTime); + foreach (var (rotting, perishable) in EntityQuery()) + { + if (!perishable.Progressing) + continue; + + if (TryComp(perishable.Owner, out var temp) && temp.CurrentTemperature < 274f) + continue; + + perishable.DeathAccumulator += frameTime; + if (perishable.DeathAccumulator < perishable.RotAfter.TotalSeconds) + continue; + + perishable.RotAccumulator += frameTime; + if (perishable.RotAccumulator < 1f) + continue; + + perishable.RotAccumulator -= 1f; + + DamageSpecifier damage = new(); + damage.DamageDict.Add("Blunt", 0.25); // Slowly accumulate enough to gib after like half an hour + damage.DamageDict.Add("Cellular", 0.25); // Cloning rework might use this eventually + + _damageableSystem.TryChangeDamage(perishable.Owner, damage, true, true); + + if (!TryComp(perishable.Owner, out var physics)) + continue; + // We need a way to get the mass of the mob alone without armor etc in the future + + var tileMix = _atmosphereSystem.GetTileMixture(Transform(perishable.Owner).Coordinates); + if (tileMix != null) + tileMix.AdjustMoles(Gas.Miasma, perishable.MolsPerSecondPerUnitMass * physics.FixturesMass); + } + } + + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnGibbed); + SubscribeLocalEvent(OnEntInserted); + SubscribeLocalEvent(OnEntRemoved); + } + + private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) + { + if (args.Component.IsDead()) + EnsureComp(uid); + } + + private void OnGibbed(EntityUid uid, PerishableComponent component, BeingGibbedEvent args) + { + if (!TryComp(uid, out var physics)) + return; + + var molsToDump = (component.MolsPerSecondPerUnitMass * physics.FixturesMass) * component.DeathAccumulator; + var tileMix = _atmosphereSystem.GetTileMixture(Transform(uid).Coordinates); + if (tileMix != null) + tileMix.AdjustMoles(Gas.Miasma, molsToDump); + } + + private void OnEntInserted(EntityUid uid, AntiRottingContainerComponent component, EntInsertedIntoContainerMessage args) + { + if (TryComp(args.Entity, out var perishable)) + perishable.Progressing = false; + } + + private void OnEntRemoved(EntityUid uid, AntiRottingContainerComponent component, EntRemovedFromContainerMessage args) + { + if (TryComp(args.Entity, out var perishable)) + perishable.Progressing = true; + } + } +} diff --git a/Content.Server/Atmos/Miasma/NoRotContainerComponent.cs b/Content.Server/Atmos/Miasma/NoRotContainerComponent.cs new file mode 100644 index 0000000000..668d870cac --- /dev/null +++ b/Content.Server/Atmos/Miasma/NoRotContainerComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Atmos.Miasma +{ + [RegisterComponent] + /// + /// Entities inside this container will not rot. + /// + public sealed class AntiRottingContainerComponent : Component + {} +} diff --git a/Content.Server/Atmos/Miasma/PerishableComponent.cs b/Content.Server/Atmos/Miasma/PerishableComponent.cs new file mode 100644 index 0000000000..de8c45b9ca --- /dev/null +++ b/Content.Server/Atmos/Miasma/PerishableComponent.cs @@ -0,0 +1,42 @@ +namespace Content.Server.Atmos.Miasma +{ + [RegisterComponent] + /// + /// This makes mobs eventually start rotting when they die. + /// It may be expanded to food at some point, but it's just for mobs right now. + /// + public sealed class PerishableComponent : Component + { + /// + /// Is this progressing? + /// + [ViewVariables(VVAccess.ReadWrite)] + public bool Progressing = true; + + /// + /// How long this creature has been dead. + /// + [DataField("deathAccumulator")] + [ViewVariables(VVAccess.ReadWrite)] + public float DeathAccumulator = 0f; + + /// + /// When DeathAccumulator is greater than this, start rotting. + /// + public TimeSpan RotAfter = TimeSpan.FromMinutes(3); + + /// + /// Gasses are released every second. + /// + [DataField("rotAccumulator")] + public float RotAccumulator = 0f; + + /// + /// How many moles of gas released per second, adjusted for mass. + /// Humans have a mass of 70. I am aiming for ten mols a minute, so + /// 1/6 of a minute, divided by 70 as a baseline. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float MolsPerSecondPerUnitMass = 0.0025f; + } +} diff --git a/Content.Server/Atmos/Miasma/RottingComponent.cs b/Content.Server/Atmos/Miasma/RottingComponent.cs new file mode 100644 index 0000000000..ae9dbe78a2 --- /dev/null +++ b/Content.Server/Atmos/Miasma/RottingComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Atmos.Miasma +{ + [RegisterComponent] + /// + /// Tracking component for stuff that has started to rot. + /// + public sealed class RottingComponent : Component + {} +} diff --git a/Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs b/Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs new file mode 100644 index 0000000000..acb3b87b3f --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffects/ChemCauseRandomDisease.cs @@ -0,0 +1,32 @@ +using Content.Shared.Chemistry.Reagent; +using Content.Server.Disease; +using Content.Shared.Disease.Components; +using Robust.Shared.Random; +using JetBrains.Annotations; + +namespace Content.Server.Chemistry.ReagentEffects +{ + /// + /// Default metabolism for medicine reagents. + /// + [UsedImplicitly] + public sealed class ChemCauseRandomDisease : ReagentEffect + { + /// + /// A disease to choose from. + /// + [DataField("diseases", required: true)] + [ViewVariables(VVAccess.ReadWrite)] + public List Diseases = default!; + + public override void Effect(ReagentEffectArgs args) + { + if (args.EntityManager.TryGetComponent(args.SolutionEntity, out var diseased)) + return; + + var random = IoCManager.Resolve(); + + EntitySystem.Get().TryAddDisease(args.SolutionEntity, random.Pick(Diseases)); + } + } +} diff --git a/Content.Server/StationEvents/Events/GasLeak.cs b/Content.Server/StationEvents/Events/GasLeak.cs index ab59f6a91b..cfe80c6711 100644 --- a/Content.Server/StationEvents/Events/GasLeak.cs +++ b/Content.Server/StationEvents/Events/GasLeak.cs @@ -20,6 +20,7 @@ namespace Content.Server.StationEvents.Events protected override string EndAnnouncement => Loc.GetString("station-event-gas-leak-end-announcement"); private static readonly Gas[] LeakableGases = { + Gas.Miasma, Gas.Plasma, Gas.Tritium, }; diff --git a/Content.Server/StationEvents/Events/RadiationStorm.cs b/Content.Server/StationEvents/Events/RadiationStorm.cs deleted file mode 100644 index a573ca0f56..0000000000 --- a/Content.Server/StationEvents/Events/RadiationStorm.cs +++ /dev/null @@ -1,136 +0,0 @@ -using Content.Server.Radiation; -using Content.Server.Station.Components; -using Content.Server.Station.Systems; -using Content.Shared.Coordinates; -using Content.Shared.Sound; -using JetBrains.Annotations; -using Robust.Shared.Map; -using Robust.Shared.Random; - -namespace Content.Server.StationEvents.Events -{ - [UsedImplicitly] - public sealed class RadiationStorm : StationEvent - { - // Based on Goonstation style radiation storm with some TG elements (announcer, etc.) - - [Dependency] private readonly IEntityManager _entityManager = default!; - [Dependency] private readonly IRobustRandom _robustRandom = default!; - - private StationSystem _stationSystem = default!; - - public override string Name => "RadiationStorm"; - public override string StartAnnouncement => Loc.GetString("station-event-radiation-storm-start-announcement"); - protected override string EndAnnouncement => Loc.GetString("station-event-radiation-storm-end-announcement"); - public override SoundSpecifier? StartAudio => new SoundPathSpecifier("/Audio/Announcements/radiation.ogg"); - protected override float StartAfter => 10.0f; - - // Event specific details - private float _timeUntilPulse; - private const float MinPulseDelay = 0.2f; - private const float MaxPulseDelay = 0.8f; - private EntityUid _target = EntityUid.Invalid; - - private void ResetTimeUntilPulse() - { - _timeUntilPulse = _robustRandom.NextFloat() * (MaxPulseDelay - MinPulseDelay) + MinPulseDelay; - } - - public override void Announce() - { - base.Announce(); - EndAfter = _robustRandom.Next(30, 80) + StartAfter; // We want to be forgiving about the radstorm. - } - - public override void Startup() - { - _entityManager.EntitySysManager.Resolve(ref _stationSystem); - ResetTimeUntilPulse(); - - if (_stationSystem.Stations.Count == 0) - { - Running = false; - return; - } - - _target = _robustRandom.Pick(_stationSystem.Stations); - base.Startup(); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - if (!Started || !Running) return; - if (_target.Valid == false) - { - Running = false; - return; - } - - _timeUntilPulse -= frameTime; - - if (_timeUntilPulse <= 0.0f) - { - var mapManager = IoCManager.Resolve(); - // Account for split stations by just randomly picking a piece of it. - var possibleTargets = _entityManager.GetComponent(_target).Grids; - if (possibleTargets.Count == 0) - { - Running = false; - return; - } - - var stationEnt = _robustRandom.Pick(possibleTargets); - - if (!_entityManager.TryGetComponent(stationEnt, out var grid)) - return; - - if (mapManager.IsGridPaused(grid.Owner)) - return; - - SpawnPulse(grid.Grid); - } - } - - private void SpawnPulse(IMapGrid mapGrid) - { - if (!TryFindRandomGrid(mapGrid, out var coordinates)) - return; - - var pulse = _entityManager.SpawnEntity("RadiationPulse", coordinates); - _entityManager.GetComponent(pulse).DoPulse(); - ResetTimeUntilPulse(); - } - - public void SpawnPulseAt(EntityCoordinates at) - { - var pulse = IoCManager.Resolve() - .SpawnEntity("RadiationPulse", at); - _entityManager.GetComponent(pulse).DoPulse(); - } - - private bool TryFindRandomGrid(IMapGrid mapGrid, out EntityCoordinates coordinates) - { - if (!(mapGrid.GridEntityId).IsValid()) - { - coordinates = default; - return false; - } - - var bounds = mapGrid.LocalAABB; - var randomX = _robustRandom.Next((int) bounds.Left, (int) bounds.Right); - var randomY = _robustRandom.Next((int) bounds.Bottom, (int) bounds.Top); - - coordinates = mapGrid.ToCoordinates(randomX, randomY); - - // TODO: Need to get valid tiles? (maybe just move right if the tile we chose is invalid?) - if (!coordinates.IsValid(_entityManager)) - { - coordinates = default; - return false; - } - return true; - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs index aa80af0697..e68254d0b3 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs @@ -26,7 +26,8 @@ public sealed class GasArtifactComponent : Component Gas.Plasma, Gas.Nitrogen, Gas.CarbonDioxide, - Gas.Tritium + Gas.Tritium, + Gas.Miasma, }; /// diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs index d1bcea62b2..620ad91978 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs @@ -17,7 +17,8 @@ public sealed class ArtifactGasTriggerComponent : Component Gas.Oxygen, Gas.Plasma, Gas.Nitrogen, - Gas.CarbonDioxide + Gas.CarbonDioxide, + Gas.Miasma }; /// diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index f1a3f21c50..61d57ef892 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -168,7 +168,7 @@ namespace Content.Shared.Atmos /// /// Total number of gases. Increase this if you want to add more! /// - public const int TotalNumberOfGases = 6; + public const int TotalNumberOfGases = 7; /// /// This is the actual length of the gases arrays in mixtures. @@ -285,5 +285,6 @@ namespace Content.Shared.Atmos Plasma = 3, Tritium = 4, WaterVapor = 5, + Miasma = 6 } } diff --git a/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs b/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs index c8c4c2cc90..08b7db440a 100644 --- a/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs +++ b/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs @@ -20,6 +20,7 @@ namespace Content.Shared.Atmos.Piping.Unary.Components Gas.Plasma, Gas.Tritium, Gas.WaterVapor, + Gas.Miasma }; // Presets for 'dumb' air alarm modes diff --git a/Resources/Locale/en-US/reagents/meta/gases.ftl b/Resources/Locale/en-US/reagents/meta/gases.ftl index 2567ef441f..f92a0b6ca4 100644 --- a/Resources/Locale/en-US/reagents/meta/gases.ftl +++ b/Resources/Locale/en-US/reagents/meta/gases.ftl @@ -12,3 +12,6 @@ reagent-desc-carbon-dioxide = You have genuinely no idea what this is. reagent-name-nitrogen = nitrogen reagent-desc-nitrogen = A colorless, odorless unreactive gas. Highly stable. + +reagent-name-miasma = miasma +reagent-desc-miasma = Uh oh, stinky! diff --git a/Resources/Prototypes/Atmospherics/gases.yml b/Resources/Prototypes/Atmospherics/gases.yml index 2ff48cede3..bb2bbe5675 100644 --- a/Resources/Prototypes/Atmospherics/gases.yml +++ b/Resources/Prototypes/Atmospherics/gases.yml @@ -57,3 +57,14 @@ gasOverlayState: water_vapor color: bffffd reagent: Water + +- type: gas + id: 6 + name: Miasma + specificHeat: 20 + heatCapacityRatio: 1.4 + molarMass: 44 + gasOverlaySprite: /Textures/Effects/atmospherics.rsi + gasOverlayState: miasma + color: 56941E + reagent: Miasma \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 6a02178987..fff1391f47 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -152,6 +152,7 @@ 90: 0.2 - type: MobPrice price: 1000 # Living critters are valuable in space. + - type: Perishable - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 4f3129b534..5e0bb2ff1c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -326,6 +326,7 @@ - type: MobPrice price: 1500 # Kidnapping a living person and selling them for cred is a good move. deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. + - type: Perishable - type: entity save: false diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index 883faa53f7..3c141613c7 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -60,6 +60,7 @@ key: bag - type: BodyBagVisualizer - type: Pullable + - type: AntiRottingContainer - type: entity id: BodyBag_Folded diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index bd60492a3f..1a29d4a95a 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -338,6 +338,43 @@ - !type:DoActsBehavior acts: [ "Destruction" ] +- type: entity + parent: GasCanister + id: MiasmaCanister + name: miasma canister + components: + - type: Sprite + state: redws + - type: GasCanister + gasMixture: + volume: 1000 + moles: + - 0 # oxygen + - 0 # nitrogen + - 0 # CO2 + - 0 # Plasma + - 0 # Tritium + - 0 # Water vapor + - 1871.71051 # Miasma + temperature: 293.15 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/metalbreak.ogg + - !type:SpawnEntitiesBehavior + spawn: + MiasmaCanisterBroken: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + + # Broke Entities - type: entity @@ -453,3 +490,12 @@ components: - type: Sprite state: water_vapor-1 + +- type: entity + parent: GasCanisterBrokenBase + id: MiasmaCanisterBroken + name: broken miasma canister + noSpawn: true + components: + - type: Sprite + state: redws-1 diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml index 705ae11d9b..6e1bfd514a 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -47,8 +47,8 @@ state_open: mining_open state_closed: mining_door - type: AccessReader - access: [["Salvage"]] - + access: [["Salvage"]] + # Command - type: entity id: LockerCaptain @@ -169,6 +169,7 @@ access: [ [ "Kitchen" ] ] - type: ExplosionResistance resistance: 0.90 + - type: AntiRottingContainer # Botanist - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml index 38d64ee7de..efec0f2224 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/morgue.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/morgue.yml @@ -49,6 +49,7 @@ light_soul: morgue_soul_light - type: Transform anchored: true + - type: AntiRottingContainer - type: entity id: MorgueTray @@ -72,7 +73,7 @@ - type: Clickable - type: InteractionOutline - type: MorgueTray - + - type: AntiRottingContainer - type: entity id: Crematorium diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml index ee01601bce..d07ac4ecee 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml @@ -26,6 +26,7 @@ Plasma: danger # everything below is usually bad Tritium: danger WaterVapor: danger + Miasma: danger - type: AtmosAlarmable alarmedBy: ["AirAlarm"] - type: AtmosDevice diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index 02ec854791..da7c940a3a 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -144,3 +144,43 @@ CarbonDioxide: 1.0 Nitrogen: -1.0 +- type: reagent + id: Miasma + name: reagent-name-miasma + desc: reagent-desc-miasma + physicalDesc: reagent-physical-desc-gaseous + color: "#56941E" + boilingPoint: -195.8 + meltingPoint: -210.0 + metabolisms: + Gas: + effects: + - !type:ChemCauseRandomDisease + conditions: + - !type:ReagentThreshold + reagent: Miasma + min: 1 + diseases: + - VentCough + - AMIV + - SpaceCold + - SpaceFlu + - Bird Flew + - VanAusdallsRobovirus + - BleedersBite + - !type:HealthChange + conditions: + - !type:ReagentThreshold + reagent: Miasma + min: 1 + scaleByQuantity: true + ignoreResistances: true + damage: + types: + Poison: 0.25 + - !type:ChemVomit + probability: 0.12 + conditions: + - !type:ReagentThreshold + reagent: Miasma + min: 0.8 From c3fa06ae4567ef3a612c0effe18c4762a6a46fa9 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 17 Jun 2022 03:01:27 -0400 Subject: [PATCH 76/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0f90949f99..8f79994ecc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: mirrorcult - changes: - - {message: You can no longer construct 'destroyed machine frames'., type: Tweak} - id: 1214 - time: '2022-03-15T22:54:30.0000000+00:00' - author: HoofedEar changes: - {message: 'Drones now have access to the Omnitool, a T-Ray Scanner, and a satchel!', @@ -2999,3 +2994,9 @@ Entries: making them much harder to disarm.', type: Add} id: 1713 time: '2022-06-17T05:37:07.0000000+00:00' +- author: Rane + changes: + - {message: Ported miasma from Nyano MRP., type: Add} + - {message: Removed the radiation storm event., type: Remove} + id: 1714 + time: '2022-06-17T07:00:23.0000000+00:00' From ce715a28517a7f255b45c5d334b27d7d9c748f2a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 17 Jun 2022 17:02:35 +1000 Subject: [PATCH 77/89] Fix dragon devour and reduce time significantly (#8921) --- Content.Server/Dragon/DragonComponent.cs | 5 ++++- Content.Server/Dragon/DragonSystem.cs | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Content.Server/Dragon/DragonComponent.cs b/Content.Server/Dragon/DragonComponent.cs index a17c317cd9..3de7deff32 100644 --- a/Content.Server/Dragon/DragonComponent.cs +++ b/Content.Server/Dragon/DragonComponent.cs @@ -45,8 +45,11 @@ namespace Content.Server.Dragon /// NOTE: original intended design was to increase this proportionally with damage thresholds, but those proved quite difficult to get consistently. right now it devours the structure at a fixed timer. /// /// + [DataField("structureDevourTime")] + public float StructureDevourTime = 10f; + [DataField("devourTime")] - public float DevourTime = 15f; + public float DevourTime = 2f; [DataField("spawnCount")] public int SpawnsLeft = 2; diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index b03c8fcb81..8ef43a1bdd 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -60,6 +60,7 @@ namespace Content.Server.Dragon private void OnDragonDevourComplete(EntityUid uid, DragonComponent component, DragonDevourComplete args) { + component.CancelToken = null; var ichorInjection = new Solution(component.DevourChem, component.DevourHealRate); //Humanoid devours allow dragon to get eggs, corpses included @@ -154,7 +155,7 @@ namespace Content.Server.Dragon component.CancelToken = new CancellationTokenSource(); - _doAfterSystem.DoAfter(new DoAfterEventArgs(uid, component.DevourTime, component.CancelToken.Token, target) + _doAfterSystem.DoAfter(new DoAfterEventArgs(uid, component.StructureDevourTime, component.CancelToken.Token, target) { UserFinishedEvent = new DragonStructureDevourComplete(uid, target), UserCancelledEvent = new DragonDevourCancelledEvent(), From 9adcb481738ce2e8b6052768582c057641f03a92 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 17 Jun 2022 03:22:09 -0400 Subject: [PATCH 78/89] deleted check (#8893) --- Content.Server/Polymorph/Systems/PolymorphableSystem.cs | 5 ++--- Content.Server/Polymorph/Systems/PolymorphedEntitySystem.cs | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Content.Server/Polymorph/Systems/PolymorphableSystem.cs b/Content.Server/Polymorph/Systems/PolymorphableSystem.cs index a2d2771dc7..90641a4baf 100644 --- a/Content.Server/Polymorph/Systems/PolymorphableSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphableSystem.cs @@ -63,7 +63,7 @@ namespace Content.Server.Polymorph.Systems /// /// The entity that will be transformed /// The id of the polymorph prototype - public EntityUid? PolymorphEntity(EntityUid target, String id) + public EntityUid? PolymorphEntity(EntityUid target, string id) { if (!_proto.TryIndex(id, out var proto)) { @@ -99,9 +99,8 @@ namespace Content.Server.Polymorph.Systems comp.Prototype = proto; RaiseLocalEvent(child, new PolymorphComponentSetupEvent()); - var targetXform = Transform(target); var childXform = Transform(child); - childXform.LocalRotation = targetXform.LocalRotation; + childXform.LocalRotation = targetTransformComp.LocalRotation; if (_container.TryGetContainingContainer(target, out var cont)) cont.Insert(child); diff --git a/Content.Server/Polymorph/Systems/PolymorphedEntitySystem.cs b/Content.Server/Polymorph/Systems/PolymorphedEntitySystem.cs index b14354acef..ced781d2de 100644 --- a/Content.Server/Polymorph/Systems/PolymorphedEntitySystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphedEntitySystem.cs @@ -49,6 +49,9 @@ namespace Content.Server.Polymorph.Systems if (!TryComp(uid, out var component)) return; + if (Deleted(component.Parent)) + return; + var proto = component.Prototype; var uidXform = Transform(uid); From 5f393963a3643e0e50c5150c202aa7a3fdb36c15 Mon Sep 17 00:00:00 2001 From: Peptide90 <78795277+Peptide90@users.noreply.github.com> Date: Sat, 18 Jun 2022 03:13:29 +0100 Subject: [PATCH 79/89] Botany + engi belt whitelist update (#8939) --- Resources/Prototypes/Entities/Clothing/Belt/belts.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index fd60ae2f14..11bc837875 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -19,12 +19,12 @@ - Screwdriver - Flashlight - Wrench -# - Painter # - GeigerCounter - Flare - CableCoil - CigPack components: + - AirlockPainter - SignalLinker - RCD - RCDAmmo @@ -82,7 +82,6 @@ - Screwdriver - Flashlight - Wrench -# - Painter # - GeigerCounter - Flare - CableCoil @@ -90,6 +89,7 @@ - JawsOfLife - CigPack components: + - AirlockPainter - SignalLinker - RCD - RCDAmmo @@ -193,6 +193,7 @@ - Soap - Flashlight - CigPack + - TrashBag components: - LightReplacer - type: ItemMapper @@ -292,6 +293,9 @@ # - PlantAnalyzer - PlantSampleTaker - BotanyShovel + - BotanyHoe + - BotanyHatchet + - PlantSampleTaker - PlantBGone - Bottle - CigPack From 1c343f9e00d5cfb602335992386e5d18d464d256 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 17 Jun 2022 22:14:33 -0400 Subject: [PATCH 80/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8f79994ecc..e5fb888e61 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: HoofedEar - changes: - - {message: 'Drones now have access to the Omnitool, a T-Ray Scanner, and a satchel!', - type: Add} - - {message: Drones have 1 less available hands., type: Tweak} - id: 1215 - time: '2022-03-16T01:11:30.0000000+00:00' - author: EmoGarbage changes: - {message: 'Added the Space Tick, a new salvage mob to terrorize hardworking salvage @@ -3000,3 +2993,9 @@ Entries: - {message: Removed the radiation storm event., type: Remove} id: 1714 time: '2022-06-17T07:00:23.0000000+00:00' +- author: Peptide90 + changes: + - {message: Botany tools now fit on the botany belt., type: Tweak} + - {message: Airlock Painters now fit on utility belts., type: Tweak} + id: 1715 + time: '2022-06-18T02:13:29.0000000+00:00' From cbd5abb6987e5a264293f53f397e81960b589ece Mon Sep 17 00:00:00 2001 From: Kara Date: Fri, 17 Jun 2022 19:36:19 -0700 Subject: [PATCH 81/89] Mobster accents for rat king/servants (#8927) * basically perfect * oops * huh * new substitutions from retequizzle, rane, and olddancejacket + crown accent * fixes --- .../Components/MobsterAccentComponent.cs | 15 ++++ .../EntitySystems/MobsterAccentSystem.cs | 89 +++++++++++++++++++ Resources/Locale/en-US/accent/mobster.ftl | 8 ++ .../Entities/Clothing/Head/misc.yml | 6 +- .../Entities/Mobs/NPCs/regalrat.yml | 4 +- 5 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 Content.Server/Speech/Components/MobsterAccentComponent.cs create mode 100644 Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs create mode 100644 Resources/Locale/en-US/accent/mobster.ftl diff --git a/Content.Server/Speech/Components/MobsterAccentComponent.cs b/Content.Server/Speech/Components/MobsterAccentComponent.cs new file mode 100644 index 0000000000..f67ea32792 --- /dev/null +++ b/Content.Server/Speech/Components/MobsterAccentComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Server.Speech.Components; + +/// +/// Nyehh, my gabagool, see? +/// Etc etc. +/// +[RegisterComponent] +public sealed class MobsterAccentComponent : Component +{ + /// + /// Do you make all the rules? + /// + [DataField("isBoss")] + public bool IsBoss = true; +} diff --git a/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs b/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs new file mode 100644 index 0000000000..aeaf898fb1 --- /dev/null +++ b/Content.Server/Speech/EntitySystems/MobsterAccentSystem.cs @@ -0,0 +1,89 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using Content.Server.Speech.Components; +using Robust.Shared.Random; + +namespace Content.Server.Speech.EntitySystems; + +public sealed class MobsterAccentSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + + private static readonly Dictionary DirectReplacements = new() + { + { "let me", "lemme" }, + { "should", "oughta" }, + { "the", "da" }, + { "kill", "whack" }, + { "murder", "whack" }, + { "dead", "sleepin' with da fishies"}, + { "hey", "ey'o" }, + { "rules", "roolz" }, + { "you", "yous" }, + { "have to", "gotta" }, + { "here", "'ere" } + }; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAccentGet); + } + + public string Accentuate(string message, MobsterAccentComponent component) + { + // Order: + // Do text manipulations first + // Then prefix/suffix funnyies + + var msg = message; + + foreach (var (first, replace) in DirectReplacements) + { + msg = msg.Replace(first, replace, true, CultureInfo.InvariantCulture); + } + + // thinking -> thinkin' + msg = Regex.Replace(msg, @"ing(?!\w)", "in'", RegexOptions.IgnoreCase); + + // or -> uh and ar -> ah in the middle of words (fuhget, tahget) + msg = Regex.Replace(msg, @"(?<=\w)or(?=\w)", "uh", RegexOptions.IgnoreCase); + msg = Regex.Replace(msg, @"(?<=\w)ar(?=\w)", "ah", RegexOptions.IgnoreCase); + + // Prefix + if (_random.Prob(0.15f)) + { + var pick = _random.Next(1, 2); + + // Reverse sanitize capital + msg = msg[0].ToString().ToLower() + msg.Remove(0, 1); + msg = Loc.GetString($"accent-mobster-prefix-{pick}") + " " + msg; + } + + // Sanitize capital again, in case we substituted a word that should be capitalized + msg = msg[0].ToString().ToUpper() + msg.Remove(0, 1); + + // Suffixes + if (_random.Prob(0.4f)) + { + if (component.IsBoss) + { + var pick = _random.Next(1, 4); + msg += Loc.GetString($"accent-mobster-suffix-boss-{pick}"); + } + else + { + var pick = _random.Next(1, 3); + msg += Loc.GetString($"accent-mobster-suffix-minion-{pick}"); + } + } + + return msg; + } + + private void OnAccentGet(EntityUid uid, MobsterAccentComponent component, AccentGetEvent args) + { + args.Message = Accentuate(args.Message, component); + } +} diff --git a/Resources/Locale/en-US/accent/mobster.ftl b/Resources/Locale/en-US/accent/mobster.ftl new file mode 100644 index 0000000000..9aca97971b --- /dev/null +++ b/Resources/Locale/en-US/accent/mobster.ftl @@ -0,0 +1,8 @@ +accent-mobster-prefix-1 = Nyehh, + +accent-mobster-suffix-boss-1 = , see? +accent-mobster-suffix-boss-2 = , fugeddaboutit. +accent-mobster-suffix-boss-3 = , capiche? + +accent-mobster-suffix-minion-1 = , yeah! +accent-mobster-suffix-minion-2 = , boss says! diff --git a/Resources/Prototypes/Entities/Clothing/Head/misc.yml b/Resources/Prototypes/Entities/Clothing/Head/misc.yml index cdbba6024d..f2324a861b 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/misc.yml @@ -111,12 +111,12 @@ sprite: Clothing/Head/Misc/cone.rsi - type: Clothing sprite: Clothing/Head/Misc/cone.rsi - + - type: entity parent: ClothingHeadBase id: ClothingHeadHatFancyCrown name: fancy crown - description: It smells like dead rat. + description: It smells like dead rat. Lets you speak like one! components: - type: Sprite sprite: Clothing/Head/Misc/fancycrown.rsi @@ -124,6 +124,8 @@ sprite: Clothing/Head/Misc/fancycrown.rsi - type: MobPrice price: 3000 + - type: AddAccentClothing + accent: MobsterAccent - type: entity parent: ClothingHeadBase diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 74c798110c..ed6e564435 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -89,6 +89,7 @@ itemIconStyle: NoItem event: !type:RatKingDomainActionEvent hungerPerDomainUse: 50 + - type: MobsterAccent - type: Access #he's so baller he gets his own access. NT got nothing on him tags: - Maintenance @@ -192,4 +193,5 @@ - type: NoSlip - type: MobPrice price: 500 # rat wealth - + - type: MobsterAccent + isBoss: false From fa4eedfb091d124b94e18504bcf7628cca94895a Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 17 Jun 2022 22:37:22 -0400 Subject: [PATCH 82/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e5fb888e61..509dd588b7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: EmoGarbage - changes: - - {message: 'Added the Space Tick, a new salvage mob to terrorize hardworking salvage - specialists.', type: Add} - - {message: Tweaked salvage mob spawners to allow the Space Tick to generate., type: Tweak} - id: 1216 - time: '2022-03-16T01:11:36.0000000+00:00' - author: Daemon changes: - {message: Added a variation of the cute bee plushie, type: Add} @@ -2999,3 +2992,9 @@ Entries: - {message: Airlock Painters now fit on utility belts., type: Tweak} id: 1715 time: '2022-06-18T02:13:29.0000000+00:00' +- author: mirrorcult + changes: + - {message: The Rat King and his servants now have an appropriate silly accent., + type: Tweak} + id: 1716 + time: '2022-06-18T02:36:19.0000000+00:00' From 0b7d22c1686ab2d79004a5e207d1fcf41e29ad9c Mon Sep 17 00:00:00 2001 From: TaralGit <76408146+TaralGit@users.noreply.github.com> Date: Sat, 18 Jun 2022 06:20:16 +0300 Subject: [PATCH 83/89] quickfix (#8942) Co-authored-by: and_a --- .../Guns/Battery/laser_gun.rsi/meta.json | 2 +- .../Weapons/Guns/Rifles/carbine.rsi/meta.json | 4 +- .../Weapons/Guns/Rifles/lecter.rsi/base.png | Bin 355 -> 287 bytes .../Weapons/Guns/Rifles/lecter.rsi/icon.png | Bin 377 -> 337 bytes .../Weapons/Guns/Rifles/lecter.rsi/mag-0.png | Bin 174 -> 191 bytes .../Weapons/Guns/Rifles/lecter.rsi/meta.json | 50 +++++++++--------- .../Weapons/Melee/combat_knife.rsi/icon.png | Bin 259 -> 274 bytes .../Weapons/Melee/combat_knife.rsi/meta.json | 2 +- .../Weapons/Melee/kitchen_knife.rsi/icon.png | Bin 319 -> 270 bytes .../Weapons/Melee/kitchen_knife.rsi/meta.json | 46 ++++++++-------- .../Weapons/Melee/machete.rsi/icon.png | Bin 275 -> 252 bytes .../Weapons/Melee/machete.rsi/meta.json | 2 +- .../Weapons/Melee/pickaxe.rsi/meta.json | 38 ++++++------- .../Weapons/Melee/pickaxe.rsi/pickaxe.png | Bin 285 -> 333 bytes 14 files changed, 72 insertions(+), 72 deletions(-) diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json index 033d627581..da85b7e10f 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from Polaris at https://github.com/PolarisSS13/Polaris/commits/master?after=edb54f137d6ac4ca06fb76b36dc5c603f92586b8+104&branch=master&path%5B%5D=icons&path%5B%5D=obj&path%5B%5D=gun.dmi&qualified_name=refs%2Fheads%2Fmaster", + "copyright": "Taken from Polaris at https://github.com/PolarisSS13/Polaris/commit/9ded73fb85b9106d6bbf1c9a34d1d2fa27ee0e2e", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json index 7b90c1abec..c98adde97d 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, - "license": "GNU Affero General Public License version 3", - "copyright": "Taken from The World Server at https://github.com/TheNick5527/The-World-Server/commit/91677c25160ccc0265f84189d2cd1ed44bc39742", + "license": "CC-BY-SA-3.0", + "copyright": "Taken from Polaris at https://github.com/PolarisSS13/Polaris/commit/ff87150c3dfc387c46db7d1c956abf19ddff7819", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/base.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/base.png index 02d1e9e24f33e98867757e1f20ac95e10a918bc7..fc6d6f78db702c1e9b4d0d655cb30f5fdc172e04 100644 GIT binary patch delta 238 zcmaFNG@ogL1SbnK0|P^2Nc!=KimLUZ0X`wFK)#xqnz6C5y}iAPii)J9WKU0z-1mvs zffDQ`L4Lsu|G{8s{j%Rcp$VQYjv*Cu&h{SUZ8qR>wVzsZ+)?ttLLLY0T@EL0+bWv8 z?$)=cX~`ro%}cpi_is|;>VxfPx4wvZal3YZ@0m99YG|#!`|tnyyN%2EZ|_pAjh3 zOgQPH^5p4F#@cBj(=VKf=xTN|zUmd3y*6m?i4z)U15E?pbga9*ZBeqi%r)7xr)TE0 zif(wr+_6&Mp})n#>ssE%ocoC{?%J&6`_r59T~50tPwaA(<}yyU9XUe3&E{vWUD#Un wsrQ;d!H)Z{p2o<^3xDz7b^g=Q56^8F?wn?;Nt<1B8|ZQdPgg&ebxsLQ06M6LIRF3v diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/icon.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/icon.png index da2084c375c12a06d7d03d6dc1d60baa116eb471..9e6d62d34f898639d516196bbd0b0d0cc618d0a4 100644 GIT binary patch delta 289 zcmey#bdhO-1SbnK0|P^2Nc!=KimLVM0X`wFK)#xqnz6C5y}iAPii)J9WKU0zw3LLJ zs= zV6)-qN-G1k3(O)RdJdb-b9FW<8y54PW3YbyAWcO}_YvFQ`bnw3Z%)fi$b7W_Ooqs@ z+^x=O@fU;5S6Q>vB^P*gf$nDTboFyt=akR{0Q6~dCIA2c delta 329 zcmcb}^pk0V1SbbG0|SH0lCEPD6;uaX2>SYGz7_*nZ&DLiw zUC?^UdcN&qQB#%!cYoYruPlzi61B0}bgqo_doSdAQk)fodq=}J%qrHuqnp)D%yahmM&XOR% zV21xtV9qrA3Q$nP)5S5QVoq{`1nUtdMiV>XSqz&uDX(H!J+qQ|l}9n_EJ>LRE;eZf Z2Hi(Y|MjbvOb6;=@O1TaS?83{1OSjgC(Zx> delta 111 zcmdnbxQ=mxTLyoCPlzi61A~!~QDkJKq@<*(s%k+)QVCFqwIs+dnBhMV$Xrkh0t%>m zx;TbZ%t=m=U=3k*Vp>t-T*8><=vu<4$Q~l-E@

n#450tzIj@C&ZP3f#J^W+a(3r%a<;iK4rq5om*C|TIKH_-B?%E-qxa^prEIx z7aAIBVq%hUV$TPlYQB;nzhH*{$ROP7wg^xr-P6S}q+(8T!UFRI7x4g>$HtP2K2Bu~ zV2y|gWSueRV#$UXEQ>T9E+0&4S?3_?>g#CLF1)H~rsxVTi5<%pYb8YN-OLbra9-@? zK+!vK0TUWlH8cVR7*|cqE?f9X^4cQJga=OI3#=Fz-b@n}J-WGNAJ9$)Pgg&ebxsLQ E00$9U(*OVf delta 197 zcmbQl)XX%&tzI#}C&ZP3f#Ln5TXCi3%{_gyS1k+(P3h~OvHR$8k3fF~WnBYPw{K-@ z+kuL>OM?7@8UDjTZCUMApm2((i(^Q|oaBTB)(I*a3p$R48@W8S-pR3mOT&6Gm&Htr zMVbYMF2N1Um_r$}nPxFvyQF3!e5h$kpzjR3sa>yf&V`<43J}$q8`ZE%p=&Ec=s~7y rEGevsfh+bs@bY&MP2fmgV93C**jy-KwfY@vpoI*cu6{1-oD!Mas0+sTX1o;Is{6_-1ERJh| z66u~Ujv*Cuk`opfCAf$OxIE4_mR!WSVgaW?>jKUd3pou`*|-;I36zRCgf=X5_C0b` zAheNt6`!e~un6m$&T}icv_dY5oY8S8b$MD8vVQaVJAJRZPhDl@sSv%gKr>;5OYngM eeajm77#Mofgi6)suV?|<$>8bg=d#Wzp$Pygmsmpp delta 292 zcmV+<0o(qL0>1)~B!3%FOjJd{z`*a~+Fo^co2sEmQBQ-6jxaGcLPJViTwn~OqqqP7 z00DGTPE!Ct=GbNc003!vR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+JAW@TEmet&GbOXA7|1u| z;!G<_%uR)`l@(n5T)@Tx05=9280-kh%m4rYT}ebiR49>SV4x5%q6;XZ@tF+K1f0!WLov&Y>5!7BkIi;(Wms@RMir hMG=EDF5(Mp85kJ12vk^^-PMt1-J delta 213 zcmeyvIGJgJTfJ6*Plzi60|OVosiA$Mp?$#CBd3&1f`SstN*kt#NUEQ|@r+B1TT)BR zI@mI|C!_VUU=C0EaktF()};0T0K*kCMJj0jw>-92^F- zmYX~f7ts6c5Zs`qFsE--^F^LuM}}E`O(7wyQ!`g^omswETjTKhgsXlbtTE|j?Ta)b zieH;?&42yoF7Fb}2Ue}C7*;TaGBTUb;$v&O%QJzopr E077(8y#N3J diff --git a/Resources/Textures/Objects/Weapons/Melee/machete.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/machete.rsi/meta.json index ae93abf331..069cee5a70 100644 --- a/Resources/Textures/Objects/Weapons/Melee/machete.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/machete.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-NC-SA-3.0", - "copyright": "Taken from goonstation and modified by Taral at https://github.com/goonstation/goonstation/pull/6094/commits/c8b97b970d189e566f63b74c6b453b016a5391c5", + "copyright": "Taken from Baystation12 and modified by Taral at https://github.com/Baystation12/Baystation12/pull/29841/commits/57265cd89e6b66b9a67915172f60bbbeacbeced0", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Weapons/Melee/pickaxe.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/pickaxe.rsi/meta.json index 483c049a3d..8179728a35 100644 --- a/Resources/Textures/Objects/Weapons/Melee/pickaxe.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/pickaxe.rsi/meta.json @@ -1,22 +1,22 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/commit/740ff31a81313086cf16761f3677cf1e2ab46c93", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "inhand-left", - "directions": 4 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/29929/commits/8c0509a4725602d0be2e9a7b29b556a39fb5cca2", + "size": { + "x": 32, + "y": 32 }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "pickaxe" - } - ] + "states": [ + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "pickaxe" + } + ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/pickaxe.rsi/pickaxe.png b/Resources/Textures/Objects/Weapons/Melee/pickaxe.rsi/pickaxe.png index a157fd81f70b7f65ae114b848d90ef812d9619b7..a8fc9a58b0f635939c061bbdd9eb6deb5de55c0f 100644 GIT binary patch delta 317 zcmbQsbe3s?WIZzj1B1(wu46!ou{g-xiSg!1oq8aLv%n*=n1O*?7=#%aX3dcR3fctt zgt!9ft|?Qa!$V^;vI0Xx3yTVi8XDW@EvW15o4k76+V$%%T)NcSPS|2qduUVe(3l1)eUBAr*7ZPVg3LQQ&c5 zZt<64Z@%+?U00|dCv!^n`xVz^tr#n&PciG5bka&Wat{Bb<_qU!Jx zHnp}Fwy!quS{7eQ?|-PZ=Xs53sB+vV*T2noD>cmDetkTruK!$zjJ%o5oA_?6`c;3G z-CPuLc~-qAk+bv*8dN@Pf6WlJmF3~Gd3SaJoyFkk>gTe~DWM4fHK2=i delta 269 zcmV+o0rLLM0-XYo8Gi-<0047(dh`GQ0OUzTK~#90V_+BsqhJ)Ef&BXZ|MawviJq1b z1r$siMpg(6P6yC48ZaE7CS%O-^UgbZ*^fI4Bn9;75(+HXEM->_g7EL?{fDt(AV}~P z$(F2pFNVT@aOMCbRtM-hxH4$!%P?r_%P?HO_=MpW!&wG38GmEA{H-Tv8QkpI7}Sh- ziMIUKxz7w&&LGUVd|)?qk!NlP|q4?Jn`%1LsFmU}9H=NC`B7_nG7{D!{_`iaQ z!+(0E0j!De=bd*9&p%wk?MhlZfSzE~0fWy0x1O9G2zMX=y|UjZ7zLwX&;S4hQ#@&7 TvT>sT0000 Date: Sat, 18 Jun 2022 00:33:41 -0300 Subject: [PATCH 84/89] More kinds of benos (#8849) * weh Multiplies the amount of power used by the battery guns, triple-ish for the laser cannon and a fuckton more for the xray * weh * weeee * Fix the offsets and bb * remove arc * rouny * sound stuff and fix the typo * Fix dork * a Co-authored-by: metalgearsloth --- .../Audio/Weapons/Xeno/alien_claw_flesh1.ogg | Bin 0 -> 8818 bytes .../Audio/Weapons/Xeno/alien_claw_flesh2.ogg | Bin 0 -> 6457 bytes .../Audio/Weapons/Xeno/alien_claw_flesh3.ogg | Bin 0 -> 6951 bytes Resources/Audio/Weapons/Xeno/license.txt | 1 + .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 226 +++++++++++++++++- .../SoundCollections/alien_claw.yml | 6 + .../Mobs/Aliens/Xenos/drone.rsi/crit.png | Bin 0 -> 1427 bytes .../Mobs/Aliens/Xenos/drone.rsi/dead.png | Bin 0 -> 1979 bytes .../Mobs/Aliens/Xenos/drone.rsi/meta.json | 24 ++ .../Mobs/Aliens/Xenos/drone.rsi/running.png | Bin 0 -> 4079 bytes .../Mobs/Aliens/Xenos/drone.rsi/sleeping.png | Bin 0 -> 969 bytes .../Mobs/Aliens/Xenos/praetorian.rsi/crit.png | Bin 0 -> 2141 bytes .../Mobs/Aliens/Xenos/praetorian.rsi/dead.png | Bin 0 -> 2565 bytes .../Aliens/Xenos/praetorian.rsi/meta.json | 24 ++ .../Aliens/Xenos/praetorian.rsi/running.png | Bin 0 -> 6839 bytes .../Aliens/Xenos/praetorian.rsi/sleeping.png | Bin 0 -> 1811 bytes .../Mobs/Aliens/Xenos/queen.rsi/crit.png | Bin 0 -> 2183 bytes .../Mobs/Aliens/Xenos/queen.rsi/dead.png | Bin 0 -> 3038 bytes .../Mobs/Aliens/Xenos/queen.rsi/meta.json | 24 ++ .../Mobs/Aliens/Xenos/queen.rsi/running.png | Bin 0 -> 7240 bytes .../Mobs/Aliens/Xenos/queen.rsi/sleeping.png | Bin 0 -> 1976 bytes .../Mobs/Aliens/Xenos/ravager.rsi/crit.png | Bin 0 -> 2104 bytes .../Mobs/Aliens/Xenos/ravager.rsi/dead.png | Bin 0 -> 2993 bytes .../Mobs/Aliens/Xenos/ravager.rsi/meta.json | 24 ++ .../Mobs/Aliens/Xenos/ravager.rsi/running.png | Bin 0 -> 6326 bytes .../Aliens/Xenos/ravager.rsi/sleeping.png | Bin 0 -> 1548 bytes .../Mobs/Aliens/Xenos/rouny.rsi/crit.png | Bin 0 -> 1357 bytes .../Mobs/Aliens/Xenos/rouny.rsi/dead.png | Bin 0 -> 2373 bytes .../Mobs/Aliens/Xenos/rouny.rsi/meta.json | 24 ++ .../Mobs/Aliens/Xenos/rouny.rsi/running.png | Bin 0 -> 3810 bytes .../Mobs/Aliens/Xenos/rouny.rsi/sleeping.png | Bin 0 -> 600 bytes .../Mobs/Aliens/Xenos/runner.rsi/crit.png | Bin 0 -> 1350 bytes .../Mobs/Aliens/Xenos/runner.rsi/dead.png | Bin 0 -> 2106 bytes .../Mobs/Aliens/Xenos/runner.rsi/meta.json | 24 ++ .../Mobs/Aliens/Xenos/runner.rsi/running.png | Bin 0 -> 3890 bytes .../Mobs/Aliens/Xenos/runner.rsi/sleeping.png | Bin 0 -> 1131 bytes .../Mobs/Aliens/Xenos/spitter.rsi/crit.png | Bin 0 -> 1695 bytes .../Mobs/Aliens/Xenos/spitter.rsi/dead.png | Bin 0 -> 2328 bytes .../Mobs/Aliens/Xenos/spitter.rsi/meta.json | 24 ++ .../Mobs/Aliens/Xenos/spitter.rsi/running.png | Bin 0 -> 4501 bytes .../Aliens/Xenos/spitter.rsi/sleeping.png | Bin 0 -> 1193 bytes 41 files changed, 397 insertions(+), 4 deletions(-) create mode 100644 Resources/Audio/Weapons/Xeno/alien_claw_flesh1.ogg create mode 100644 Resources/Audio/Weapons/Xeno/alien_claw_flesh2.ogg create mode 100644 Resources/Audio/Weapons/Xeno/alien_claw_flesh3.ogg create mode 100644 Resources/Audio/Weapons/Xeno/license.txt create mode 100644 Resources/Prototypes/SoundCollections/alien_claw.yml create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/running.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/sleeping.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/running.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/sleeping.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/queen.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/queen.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/queen.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/queen.rsi/running.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/queen.rsi/sleeping.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/ravager.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/ravager.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/ravager.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/ravager.rsi/running.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/ravager.rsi/sleeping.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/running.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/sleeping.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/crit.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/running.png create mode 100644 Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/sleeping.png diff --git a/Resources/Audio/Weapons/Xeno/alien_claw_flesh1.ogg b/Resources/Audio/Weapons/Xeno/alien_claw_flesh1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7853503c8f1c8584f12e966fafce098253773bd9 GIT binary patch literal 8818 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 P)ey-!bz&`^0+9a!-vCaf literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Xeno/alien_claw_flesh3.ogg b/Resources/Audio/Weapons/Xeno/alien_claw_flesh3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fe866ca7478bd3c2c9216eb32b21329862a59474 GIT binary patch literal 6951 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Xeno/license.txt b/Resources/Audio/Weapons/Xeno/license.txt new file mode 100644 index 0000000000..defddc5e45 --- /dev/null +++ b/Resources/Audio/Weapons/Xeno/license.txt @@ -0,0 +1 @@ +alien_claw_flesh1, alien_claw_flesh2, alien_claw_flesh3 were taken from: https://gitlab.com/cmdevs/colonial-warfare/-/tree/dev/sound/weapons \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index d3afc2463a..c9d241d9a2 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -1,6 +1,6 @@ # Hacky for the stress test so don't even consider adding to this - type: entity - name: Xeno + name: Burrower id: MobXeno parent: SimpleSpaceMobBase description: They mostly come at night. Mostly. @@ -40,7 +40,6 @@ - type: MobState thresholds: 0: !type:NormalMobState {} - 150: !type:CriticalMobState {} 200: !type:DeadMobState {} - type: Bloodstream bloodReagent: FluorosulfuricAcid @@ -55,7 +54,9 @@ - type: MeleeWeapon range: 1.5 arcwidth: 0 - arc: claw + hitSound: + collection: AlienClaw + arc: damage: groups: Brute: 20 @@ -92,9 +93,226 @@ tags: - CannotSuicide - DoorBumpOpener - - FootstepSound + - FootstepSound - type: NoSlip +- type: entity + name: Praetorian + parent: MobXeno + id: MobXenoPraetorian + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Aliens/Xenos/praetorian.rsi + offset: 0,0.4 + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: running + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 300: !type:DeadMobState {} + - type: SlowOnDamage + speedModifierThresholds: + 250: 0.4 + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.45 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + +- type: entity + name: Drone + parent: MobXeno + id: MobXenoDrone + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Aliens/Xenos/drone.rsi + offset: 0,0.2 + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: running + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 200: !type:DeadMobState {} + - type: MovementSpeedModifier + baseWalkSpeed : 3.0 + baseSprintSpeed : 5.5 + - type: SlowOnDamage + speedModifierThresholds: + 150: 0.4 + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.45 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + +- type: entity + name: Queen + parent: MobXeno + id: MobXenoQueen + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Aliens/Xenos/queen.rsi + offset: 0,0.4 + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: running + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 1500: !type:DeadMobState {} + - type: MovementSpeedModifier + baseWalkSpeed : 2.8 + baseSprintSpeed : 3.8 + - type: MeleeWeapon + damage: + groups: + Brute: 40 + cooldownTime: 2 + - type: SlowOnDamage + speedModifierThresholds: + 1000: 0.4 + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.45 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + +- type: entity + name: Ravager + parent: MobXeno + id: MobXenoRavager + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Aliens/Xenos/ravager.rsi + offset: 0,0.5 + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: running + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 550: !type:DeadMobState {} + - type: MovementSpeedModifier + baseWalkSpeed : 2.3 + baseSprintSpeed : 4.2 + - type: MeleeWeapon + damage: + groups: + Brute: 35 + cooldownTime: 1.5 + - type: SlowOnDamage + speedModifierThresholds: + 450: 0.4 + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.45 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + +- type: entity + name: Runner + parent: MobXeno + id: MobXenoRunner + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Aliens/Xenos/runner.rsi + offset: 0,0.6 + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: running + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 250: !type:DeadMobState {} + - type: MovementSpeedModifier + baseWalkSpeed : 2.7 + baseSprintSpeed : 6.0 + - type: MeleeWeapon + damage: + groups: + Brute: 15 + cooldownTime: 0.5 + - type: SlowOnDamage + speedModifierThresholds: + 200: 0.4 + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.45 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + +- type: entity + name: Rouny + parent: MobXenoRunner + id: MobXenoRouny + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Aliens/Xenos/rouny.rsi + offset: 0,0.6 + +- type: entity + name: Spitter + parent: MobXeno + id: MobXenoSpitter + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Aliens/Xenos/spitter.rsi + offset: 0,0.3 + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: running + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 300: !type:DeadMobState {} + - type: SlowOnDamage + speedModifierThresholds: + 250: 0.4 + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.45 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + - type: entity name: space adder parent: SimpleSpaceMobBase diff --git a/Resources/Prototypes/SoundCollections/alien_claw.yml b/Resources/Prototypes/SoundCollections/alien_claw.yml new file mode 100644 index 0000000000..6e4c506faa --- /dev/null +++ b/Resources/Prototypes/SoundCollections/alien_claw.yml @@ -0,0 +1,6 @@ +- type: soundCollection + id: AlienClaw + files: + - /Audio/Weapons/Xeno/alien_claw_flesh1.ogg + - /Audio/Weapons/Xeno/alien_claw_flesh2.ogg + - /Audio/Weapons/Xeno/alien_claw_flesh3.ogg diff --git a/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/crit.png new file mode 100644 index 0000000000000000000000000000000000000000..744b543e414e18adc772b638cc9e1c45533206f0 GIT binary patch literal 1427 zcmV;E1#J3>P)J0ER}?-0iHT;r#B6qzxQ1#PYq1IPs8$OWW(dNr~$g}hAV@-Gk}`MHHz8O=X1;~aZs z>#nLqL@EH}Pk#BGOynNPy^#_5W8i{A5$&lCV;K+~DGa%u-4T0DMa&mxC7tXJEF$s@ zfc%-hAIvq0AA9#RDa;gf?8($)`Db8SQb$uV_is_2-E2}p5W%e2b+M`f5c!^0-;x^x zKg*F1K9@^Bot6`ye68d`92n2umDrnYO1?F*L5h23RRoEnHc%HqvJhGT?Bew~u0ayy zH@3(1eD8tx4f*2yQ}cY`+Kh@QPR`2W{GznQk|qlig~yVVPPLjJLJ6SPul8RyKBrZN z@AT_E%tC70cD)AqKd)bv-hBrpp4g&exoh`T1jKCFx7U0=3p|L8suo}u>JoV!1Nk=& ze5mKl0HY1EIG>&z)2u)Q03nJ;qU7=S)Y6Y_p@$O>#1Ek|z(PfoH??=Vh?7|B`j_+^ zgpmc<3-<$f2IAXd9kRJ=r;cR{8A-)b8hw(lOBVu>@!W(V10u8w{7w|P6wwFyTlqnqGX{q*M_a`3`^De-)H2!*r>0$zClGbJ25jIt)Cxr)C=fvJ z-y9uK!8rPf2xTFNK=Fb+qYe*CqV#v1gA_>M2obr_`;wK6biKS=??KjvGFSBa^_HFT z%k6Wn@4#mRej;j~2Ve_|AS(GC8G^9vUm0^B$iq^@&X^qE^^uOnH*S)%gQtuDKZFv% zu7gPm1nm9}q99qx?~FbKf*>=}>!f8~NMr@(^5~S#N~H@ z#3%y4sDW)A-MSWH>=zcEH8nS{b8w7I0He=k0i&;k%SS}jSS3;NJMO0l)P^kr7?C0Q z`0X#``yaoNuip7qnvJZ2*{&B-2MB8S;ejt{m=rq zuCa-;IbRWC(04o)&pVw;= z;O#tsO`e{om244}uw22`O#l#Ui|G-a#0E%XRY}0>s1u05ER3z>(%Q*HpDnZ&(xC(p zSpGr;ij;-RaeEBpA$oHv>3SaIAz~qymnh&X0QRvrLSZHtlGSEMyz@n>TwYy^?*RK&To3K@>8In6FgWN?G76 zYFk*;{|vWGYDYxfqIa(5l8@Sgea3>*X|u=nZQV!6{l&b^+(kfvUghL zwT@W|a9#*Pp4O^WXkY>5FVZZmB*G6Q?%K80fT}W3Nkn%1sjhusG0%N3kOsJ)U;|iH z0TwyO9>aV<{{yxdfUj6UoEx2nE#^F5Ziw2eQhRj@khJI7NKn(Jz5*F1;C+!H(*Mw` hR_nB}_K)sH<3A3!2O%ug&}0Ar002ovPDHLkV1kt6p78(x literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..44673b49485effcc2b4bda6c00ba41ea558afd44 GIT binary patch literal 1979 zcmV;s2SoUZP)$5g2V7BQV-FMqs!$r}%M8&L^ba zr`wOU9!wd^b4G;#zyowndNyB=pBNaEa&)QGehnU#Dee zFd>kTsF-g7(3 z3P`{}WXHRAn8fCdi}}7={WB$WvF8HCv#10B3SL~XwA~K1vJbYFTc3P(LnkWkPtDBM zz|psU-xR){IDRsN1Ykq~@gY5Ag7 zeh`RUtM*e@caH`GAUH=~&w)|}_y7Y(6rg`00q-Lc01HFJFm_3KiHcIME~D^1z@PG; zM{?`PTA9E!qo09U3CKicUJG~(UbC{BJvXcH2sJfN z4y*5wi&O6)v3gaeDxWSUi1WI7J0c}k0o@|I<^%SNbJm8CKom@ep6w?q*EK+2*80LF z1W%(=P%5^k1-xk-jb_sI-7b+cY#@V@x)LC*cgPL~@EE)_1&3pp^|Rmf{0@%_NS zKPjoH<18G-kvQ(&k)|Tj5}L%~btia80h$ANgl}8*pA2UG+l^GYq)h>z5(KQwv;Q92 zwcE{6V#~7i4yj1e;<*4XB#r2?eLGpY<(Ci*w|J&+4Rtn;A?53A<+HPQ9?J z+H#62D&6#XBN@daR3UK*n4q0YWtpADqb6V}kCM3CsvA@kNX^VP3H+hYgv)n`Tp3#H zlCWY2_Y8!*)5Imt1unTCwTwn$D<3$!vaY^1Wc!G7fQBJqZSdg$VX^{9 zIEmv~?z9J(1STg*TxmDk03M`s-8muS0UjhISp~2;ftpDQ@KW_M-2uz_r6Vo@c;DQR z!%*8{QX&xrfVUs+wQLgEA!D2--h6)UJWISR?I0n90KTxGh?mfjY*<@LE|poq>qy^# zkRy1pT6%{p%;0^q?_O1L_BMr+0|}W(4>$F)vm$+GN{E1L%4PQz%@8f*gXrH0K9Y&H zoy&GPqCFb;gb4_E^Royvf0a6;eu0y|^0_1$5drF)xWuBhCrkj~uyK%0JCaEf*);RZ zo4J&ZC7)#2uyOzZk;oESkq%4}T$0)(mTd5_gb6r5OzGKo&}1?L0r5WUZh$r|Ap#;J zcv%2Wn>|y17ZOkF6{jw#ci)CAA#=<4OQ4f~AAggTBf~1A z#>+KOb5&}tPGJJtF*YeSqF-ntfUy$nmo!W2Z)E>f=`?NZhwjm~e*wQwPenN{=)C{{ N002ovPDHLkV1i}3mqh>o literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/meta.json new file mode 100644 index 0000000000..d175e4aa89 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/meta.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://gitlab.com/cmdevs/colonial-warfare/-/tree/dev/icons/mob/xenonids", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "running", + "directions": 4 + }, + { + "name": "sleeping" + }, + { + "name": "crit" + }, + { + "name": "dead" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/running.png b/Resources/Textures/Mobs/Aliens/Xenos/drone.rsi/running.png new file mode 100644 index 0000000000000000000000000000000000000000..d04c9871913509354cf1dd66e566ed49c084b34a GIT binary patch literal 4079 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/crit.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b941fa0fa60c43b587092069b0804a19ea7001 GIT binary patch literal 2141 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 bnc(;zt&!2DKi%J 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/sleeping.png b/Resources/Textures/Mobs/Aliens/Xenos/praetorian.rsi/sleeping.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7616ee8e26f9e1e0893f45190651696951653a GIT binary patch literal 1811 zcmV+u2kiKXP)2Yr5I4$tEr4udx+lOhp@MHN{pG@$Vp| zf+(I8@lfz0p1g<$@#0Cm2tA1CNt8lM@ldOX#YS3F(JHnLE3{3MH0E!++3cnv%{b4y z`%J!_-PxVpCK@vH!0xy6^UcijywCf7?}TiSfFl$@0*+7s2{=LlB;W`Ikbol;Kmv|X z00}rk0VLoE1(1Lv6hH!wPyh)yLIEV;2nCQef(Lv1ER28rer8=Y^VW<2z_SPIL=N>? z)rhca1$ce`QdZAo=)AK*uQfS#-Ttn3 z&i9iRD=vT+(J#I^C5PUB+u0tUoRYyrLifM={5~b$-PNVXX3}XLN3UH|VITyqi*wtz z)JbzwOfpjmIeVn5i0tkcvi7%kTCAu5c*uQw`kZZ$1W3reAB5j|qg6iq^ss#J)@wz? zO;?co_RbbbrDr{#VRK8P{XOq_e8mJHd6EMVVcPi3m!6S>?|r01u^;3~7{}iI_;Vcr z%z+5RCtsg%emBIHEDskT9ftl%tz%kL!iqZJ)af%0VF15pQYrn-NP;{fOL2G{X#k>3 zhcCZ7EAuzzbQ?hQckb9O@rIal{f5{ky1{}ok_*Lk!Hs1R;I{P<>*nH|lVgZJBT7PU zfHcT3=dtY;2m3)B*txSulG91Y`XrxBrFBfDv(B}1mEhaY)Ji4R{L^?aTyBjXx*H~>%=M4EhYxg`fc2#jrQ zEg)HxbCXlobp&w$g7jY;mUvTKNzKk?^%$Z`U^^#Vqs|}r<+p-sdPU!`zhp9V5{Xo{ zKTwkZB#h{6ibdteANqA)$JRF8o=s;oVvPKfAURR44CM;iU7f8u2Y?^|M4@nSL08vy zXMQF*Qa~QWX?>G?HSjF}ZI2PeK$v7r3=fSc37!K`n4kN9b%CWxFdoI&M8Hn$G`-(M}j@&NHAg`g6Lx&M8Mp^3xDfAY(oS9wuk+(A9IjSbQXa5 zJ@+U|fWRyG$-CVD2cbj2S^ESN=phJ*f)^$_mFZdOIeiHLHO;E;2WAWV z=-ypLB7n4OnO&E6gY$j?ASFNyBAA2;x`A(txGw_4Vp=Ik{v2Rm5cv#6p)5Y^3`^aB zmgWjk4a{1Crs(ijN3}VE0Fvv66c7(DP7v2@n%p(15~^yQK%CXz4*|{rOcyZsOSqum zIyQOB9C-|LD6qR}@=KhkC;)o_lMGV9thVLmnK_+*coNsK(lyL6Ki^{0gcXITg*;Go z^Gp%Cd+yPX-58aOAfrS};-RrD;Z-=B)$=X05LScUUA<0fU<7Kp4&X}wGny2DFG2b4 z(6bhBzg?6H+)(QSmrIRW;M)PF2rP;KgeWCKshq9Vrlp?6eUDmERSKB(0AQnoDx7az zJiD&tBEQ_Ix(2vgUKT^XC*)s$E%W@*#7g~DnBZTJ zZ?1(D@WRbi9OZIYwf`URUm+Ag0*+7s2{-~Tz`xdJ1F$Z}db0ok002ovPDHLkV1hzW BLnHtI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/queen.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/queen.rsi/crit.png new file mode 100644 index 0000000000000000000000000000000000000000..97fd9481773f88ceae8c4517655728635db284e7 GIT binary patch literal 2183 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 g{@dJW84M}WBGqyD( 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 KMNUMnLSTYrFNVYb literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/ravager.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/ravager.rsi/crit.png new file mode 100644 index 0000000000000000000000000000000000000000..c0319d89fcdcfa5d410b836638c4298ff31b0cda GIT binary patch literal 2104 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json new file mode 100644 index 0000000000..ce2209e72d --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/TerraGov-Marine-Corps/blob/a2034543920664ddf0c0f3c681bf1d8003dc2ade/icons/Xeno/2x2_Xenos.dmi", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "running", + "directions": 4 + }, + { + "name": "sleeping" + }, + { + "name": "dead" + }, + { + "name": "crit" + } + ] +} diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbe1c603ebd34666782723ceaa52f655f4d388e GIT binary patch literal 3810 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 TzgcU6Nrl1F)z4*}Q$iB}GU@!# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/crit.png new file mode 100644 index 0000000000000000000000000000000000000000..42b91bf9707b131a4fa6d2545e8855a472e2ac24 GIT binary patch literal 1350 zcmV-M1-bf(P)V&4rBhG{5ag25l1IZv5GQhk{x#S%YoY3hmKNJcDBUq(U3H41S z0LbeE24a{rCKv@Hj!XVRaaxW~ACtzXpLXMxtX9Lx5V?XdVr)C!K(B%DyNN*J5ANTU z$4{O{&Z%bsKpvC9#6cVu0Zg1n^EV`5Nmw4&09P)a5phKbh6#bbxQ=506jKuo;`y^j z^0D;UkdLxH(31dk`_JWOXfm)O-5Vcg;(i#=lE%9BH5h~aqB6fHt~);Z%}D^eB8c zTyZhhT74^Y5A-Q*SEW{~$@==b`4Eqv)b=FavjChFCSMSLeP0~+?i0Krp+>i#4fb$?(^j+$|5QtLS14RIoo06OmBhVTMdd84``jS0UWh>~EZ)qOaLtJubM zu(lCZc?wsBxP0I(vu-%_x+Es{0JtnbSH(mq3N7pxJUe?%4C9d$ML;gll_G(D32-LW%v2y4qzu#w6!ctPM4C4 zkjMj&u}MB?d2Q|83J*f>1T}fOe-v3m^k_>aZR=MqHsofdC~wamiVCONvAuK+7QMMU}1u z2!lLCz?y8Y$6iJD=G~gSf3@0?>2>HpY#AVaAS^Vv- zLKI^~l5e5A7J%89RT;A|5Vv=y2>3laJKJ$?Y_jF`(e2gO^|84d(q4fGQtY_DQ#Jb4 zCsz>e6bHHrFaZWjQ*KxB2rFs=ieNjYJp_mVSLU`C$&#xNszzY5`Pg_C`m#slQ!a6X|1i1nLSo@K!7iawZ5Eljq z8C?s&+MUD!9TMGy!9heK51+!IVN&wae$On3}G)m~pixK^*Yt+ye0n*gs!$#^CBXO^{ zM+K=~jF5bqhmylaDi0Xd%&(EM4j6q5{eOgpja&f9I5IE5e*rUFqI)LeU;qFB07*qo IM6N<$g3`rk`v3p{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..b253f3a5a4552b1b9f4a7fdb786525948c73c16c GIT binary patch literal 2106 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/meta.json new file mode 100644 index 0000000000..19161ee8fa --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/meta.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://gitlab.com/cmdevs/colonial-warfare/-/tree/dev/icons/mob/xenonids", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "running", + "directions": 4 + }, + { + "name": "sleeping" + }, + { + "name": "crit" + }, + { + "name": "dead" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/running.png b/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/running.png new file mode 100644 index 0000000000000000000000000000000000000000..a76129f2dd5a0afdb993789de294ea165b615e06 GIT binary patch literal 3890 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 XL&V$NE;#nj6Ab9y!Q8IAX&doh=jvDM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/sleeping.png b/Resources/Textures/Mobs/Aliens/Xenos/runner.rsi/sleeping.png new file mode 100644 index 0000000000000000000000000000000000000000..303473a4ecd0ff7b8b7e5e77d4d7369c49de3f9b GIT binary patch literal 1131 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Se! zr;B4q#hkYhzS+WoBDP1T-8#1IVAn>$#YwrL91-?nS|Tm~n8Ne!{EEJ#sTa%fF6JjU zi{l18tz1P77r`wFUMdSclY^E{oAFt#yvW!$CME6G(Q0-ttM7ZwKcB07esAYV1D$qZ zhG~a68BRZBX?R+|bfCzBF~M>U!v+~Yh6p}&2GXQuo*iDl?i$x`4$hBDxtAMQ7M?k>EqnimodL|ZlG#;V*6>wS{5FbP+i%i(=1bD1nWy{} zji()msX8PuPipPVomcG*3`K5r^LupMV0m!TKHBYb-8UZn*++kB^{weup6xfIaFY7N z1?=0DqnW^-)3-jK92&2P_^ZQa6;l_TupT^9!)4>EikDJPdH zEWhsYGq+o7lz;ABTrH8$+30#i&1sG4gFLIuHG4M(n{T{zD1QEx*C7Wx9472J5^lt5 z;Hx3DzW)8&AKzbx`X5pXVqEfp)1*?#Lo0mc_a0%9#!P2}(sjP-8*h0nUE$i{!Vr5k zv$E+)_-WC4zPl4n_y1V3L_+GxMbYzW!fCdb+Y~BS@&+nzVNlUO^7DAFu*&&4;*;{Z zM4ekwIFFScyj*xr)nY#1qdiwl?hA;z^ae0Z__KHQ<{zJOH+NecJiGZ+w{lPG>AOdG z3QMe)URhBx*W$Uyst>)NjKp)Lcyt^l*l%RdqHyDGH;2#%YrQeYLQOYBm!@p z+fk8sY>(9HRzI(Wx@z-fL+cGDFzA$Ru{B>|K2NeaKU{HraAR^$;k>xz{?T&|R&RDs zSgi8#&5Gv|T>YgkN{0^cE!gTA;x}W$f}Go z{wLM+$VK(g0j3Vs>YLLNVkVor@_gW4+M%3WbSp^v$IPtByiP|tnV7j1%BKDIY?^&F zpUKv(X;#k_=0(>fuD`q%vD@`Xy41Eu3%imu*f*TYuX$@??=v1JyW-wxaV-ZORk$4G(Yz|w=k)78&qol`;+09fw;p8x;= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/crit.png new file mode 100644 index 0000000000000000000000000000000000000000..5d64c5988a685dddb2a690cb1cc8bb4cab9b0504 GIT binary patch literal 1695 zcmV;Q24MM#P)(Top9Ksl(Z|r`OOoBqX%T=CVniI?*q0w9FV5yaa{K0}tgNK8Fp9wJ99|!; zY%C<2ia4_XW1F;$O@`G~j}q}r-ii%sA((+ss7svPg0_x9S&P_we@_CDfb8$?OGv`< z)#e}4o$Qq<*%QtVtamVaAlGJ_i#U@2kf&wl?-k_E{XHeX_<3#J2;of7DiLLkTy{@> zk$p`*SPDw%U{~LB>*kPI2T8}h{-*d;9H-cn!>I+(^Rx`2{rJy5byjpq3X_o!LO>qSh`HlE~-?{UZJvR267`akSp+R#GEL5!zt#INQ05On%`<<-1>eMrUsIRXUB=&BHI+pc4 z5CP(dILMO>qHFAgMQWajVrE;XR?r-2dm2Sn!Gay19#Di!nm7nkgl!>^N5%oUC;4h2 ztBwOK8Mr5L_*@cO&($(f3wAB5$5T70_7yVt{?7e`eEx~(?1FTu$E#5nDY@hk{l0)H zUWojor2V9_Rn!b{&qI|tBaw*Yayj?t2fhS={1@LRbe0*P4r=mDpT#t6b*Rtjd6Kt# z9RT*gHA#EMR5FXl%sa=-+L?`VdW0_-LYDRXVrc%RpJxLvTam7FU==YEx0I1|i1 zY!!a|>#2&e8M!RtSvQN@1wFH9Lja`kMzhdT0H$&7)3DAwy0@uD1%!Fc2yqdkc~e(< z3^M`H`vCeKW+FSv%vf0TX#NlkH*o9E8uIgHA=n3f4%Y#SR(f?`Kin=>un++vBvcO& zoEqv-Q5H{>5v)w1-~GRsokmst!~#GR=@Wg9J;sO6Tz^yBgVwQ8pE4<~S(N8Kn|p2k z?))L{$yU4qPc48A8^Aoz$df#amW>UkHtp9!gPI)9Nw8IvE5&}j9%|1%+LiheQ13rl z2ex5%i9UuYbJ$IlH4!+1I7Il3GPj!<_55b_z_*1Md4P)-+eJnRsLwK{zi%vp&#sTM zJv;H9*4&O2!0yw|!>|m}AH@L7D6WN)tiD@EMAXBMGG~UV)NcGvB>=Fa56i$FGa|0< zr5Y{3&Nw>LSldGz&7#b4cBQoEnf3#A^kJDuveU}xwKQoWJm~qq+{6G_#P%$-in1T_ zEd`+Rao@{X;LB{^+Qj(6Xf#^M6uJc6CpR$=0W^y8*vDhC{BYS7j_0=RyO2E#tgJTb zqYLsA6BC*ch?GLLG}+~Jx#uL0-_gJU6w$UXbI20xWAHNj-1>%f1n4Hwprul3Q?la~ z1=vxJhN2ZVa(*^3ClWyD&wnbrU=ioCsblZeq#K}Fl$+h}2Q3BQCHTaLbSNveZ#?{V z1HeA?H-Kn2B6iv+9|uT94XNmH0@XUbO0(yl&7&jjv&5y7E zbNN7jkB~GLDUL6Sa8m)cRrqBXl{M&2WUB2?Me#2ICh zXXQoa;dgz2vj7nwf0Dnhv|Ru|0-OPWMGJ5XOp?C`Upi?UO|y`PlqMVWjGrfI8@}qm p|AlNLT>P2!ym2Amyz$Bl_z$hUd8h^Udy)VE002ovPDHLkV1g^}GC}|V literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Xenos/spitter.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..de9b13ccfe26799620cb518bb19e0d3a7a57b8f8 GIT binary patch literal 2328 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 Date: Sat, 18 Jun 2022 04:34:10 +0100 Subject: [PATCH 85/89] Adds other botany tools (#8935) --- .../Catalog/VendingMachines/Inventories/nutri.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml index 3f9d6348cc..10e5ded1be 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/nutri.yml @@ -3,7 +3,11 @@ name: NutriMax spriteName: nutri startingInventory: - HydroponicsToolSpade: 3 + HydroponicsToolSpade: 2 + HydroponicsToolMiniHoe: 2 + HydroponicsToolClippers: 2 + HydroponicsToolScythe: 2 + HydroponicsToolHatchet: 2 PlantBag: 2 PlantBGoneSpray: 20 WeedSpray: 20 @@ -11,7 +15,5 @@ Syringe: 5 RobustHarvestChemistryBottle: 3 #TO DO: - #cultivator - #secateurs #plant analyzer From 8aa28da6c97c0678ab864e28ec961dbfcab6af60 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 17 Jun 2022 23:35:13 -0400 Subject: [PATCH 86/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 509dd588b7..2f5ae987fa 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: Daemon - changes: - - {message: Added a variation of the cute bee plushie, type: Add} - id: 1217 - time: '2022-03-16T18:42:08.0000000+00:00' -- author: Mith-randalf - changes: - - {message: 'Due to a budget oversight, SS14 is now equipped with rotatable arcade - machines.', type: Fix} - id: 1218 - time: '2022-03-16T21:30:05.0000000+00:00' - author: Mith-randalf changes: - {message: 'Due to a budgetary oversight, possums and raccoons are now smaller. @@ -2998,3 +2987,14 @@ Entries: type: Tweak} id: 1716 time: '2022-06-18T02:36:19.0000000+00:00' +- author: DogZeroX + changes: + - {message: 'There are more kinds of Exos than a simple slug with blades now. Some + are faster, some are stronger, and one might shoot, someday.', type: Add} + id: 1717 + time: '2022-06-18T03:33:41.0000000+00:00' +- author: Peptide90 + changes: + - {message: Added the remaining botany tools to the NutriVend machine., type: Tweak} + id: 1718 + time: '2022-06-18T03:34:10.0000000+00:00' From cbfcdde8bd9c93ef84b343775a0313fb5c8d42e5 Mon Sep 17 00:00:00 2001 From: Morber <14136326+Morb0@users.noreply.github.com> Date: Sat, 18 Jun 2022 06:42:15 +0300 Subject: [PATCH 87/89] Add screwdriver head sprite (#8828) --- .../Tools/screwdriver.rsi/inhand-left.png | Bin 157 -> 204 bytes .../Tools/screwdriver.rsi/inhand-right.png | Bin 163 -> 208 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Objects/Tools/screwdriver.rsi/inhand-left.png b/Resources/Textures/Objects/Tools/screwdriver.rsi/inhand-left.png index 1873ca3ccb7ddad83f0be5ac687606ef60825e9c..f036a1df3e986735c9623594bd25a6a205539da8 100644 GIT binary patch delta 176 zcmV;h08js&0n7oAB!2;OQb$4nuFf3k0001nNklL~_%b98rL_j>yl>+@ZY eyv6VU!13N^G&&6hck+Y)0000vx4M|s c3=9q5{p#D)zjoBN`~j)+boFyt=akR{01_xLlK=n! diff --git a/Resources/Textures/Objects/Tools/screwdriver.rsi/inhand-right.png b/Resources/Textures/Objects/Tools/screwdriver.rsi/inhand-right.png index c0e0a8eb9edcf5a8fc2fafed3e0126fdc185b204..cddd9f4df62ac39a5745a219f9231c71f3128bef 100644 GIT binary patch delta 180 zcmV;l089U)0nh=EB!2;OQb$4nuFf3k0001rNklxR`N*N`026i(^Q|oVT|&^0qkeupGE7{%%=JTXi9~yBABpK>HVa;pk7NURLoi z071jtjv1k*_s Date: Fri, 17 Jun 2022 23:53:02 -0400 Subject: [PATCH 88/89] Silent Station Events (#8938) --- .../StationEvents/Events/DiseaseOutbreak.cs | 4 ++++ Content.Server/StationEvents/Events/KudzuGrowth.cs | 2 ++ .../StationEvents/Events/MouseMigration.cs | 2 ++ Content.Server/StationEvents/Events/StationEvent.cs | 13 +++++++++---- Content.Server/StationEvents/Events/VentCritters.cs | 2 ++ .../StationEvents/Events/ZombieOutbreak.cs | 6 ++++-- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Content.Server/StationEvents/Events/DiseaseOutbreak.cs b/Content.Server/StationEvents/Events/DiseaseOutbreak.cs index e78cd0a1c4..756fa3f912 100644 --- a/Content.Server/StationEvents/Events/DiseaseOutbreak.cs +++ b/Content.Server/StationEvents/Events/DiseaseOutbreak.cs @@ -37,6 +37,8 @@ public sealed class DiseaseOutbreak : StationEvent public override SoundSpecifier? StartAudio => new SoundPathSpecifier("/Audio/Announcements/outbreak7.ogg"); protected override float EndAfter => 1.0f; + public override bool AnnounceEvent => false; + ///

/// Finds 2-5 random, alive entities that can host diseases /// and gives them a randomly selected disease. @@ -79,6 +81,8 @@ public sealed class DiseaseOutbreak : StationEvent stationsToNotify.Add((EntityUid) station); } + if (!AnnounceEvent) + return; foreach (var station in stationsToNotify) { chatSystem.DispatchStationAnnouncement(station, Loc.GetString("station-event-disease-outbreak-announcement"), diff --git a/Content.Server/StationEvents/Events/KudzuGrowth.cs b/Content.Server/StationEvents/Events/KudzuGrowth.cs index 497b4a98d0..11153e2a88 100644 --- a/Content.Server/StationEvents/Events/KudzuGrowth.cs +++ b/Content.Server/StationEvents/Events/KudzuGrowth.cs @@ -27,6 +27,8 @@ public sealed class KudzuGrowth : StationEvent // Give crew at least 9 minutes to either have it gone, or to suffer another event. Kudzu is not actually required to be dead for another event to roll. protected override float EndAfter => 60*4; + public override bool AnnounceEvent => false; + private EntityUid _targetGrid; private Vector2i _targetTile; diff --git a/Content.Server/StationEvents/Events/MouseMigration.cs b/Content.Server/StationEvents/Events/MouseMigration.cs index ee831de699..ee7510e6ee 100644 --- a/Content.Server/StationEvents/Events/MouseMigration.cs +++ b/Content.Server/StationEvents/Events/MouseMigration.cs @@ -25,6 +25,8 @@ public sealed class MouseMigration : StationEvent public override int? MaxOccurrences => 1; + public override bool AnnounceEvent => false; + protected override float StartAfter => 30f; protected override float EndAfter => 60; diff --git a/Content.Server/StationEvents/Events/StationEvent.cs b/Content.Server/StationEvents/Events/StationEvent.cs index 0f8872a1e0..427d67a0f7 100644 --- a/Content.Server/StationEvents/Events/StationEvent.cs +++ b/Content.Server/StationEvents/Events/StationEvent.cs @@ -107,6 +107,11 @@ namespace Content.Server.StationEvents.Events /// public virtual int? MaxOccurrences { get; } = null; + /// + /// Whether or not the event is announced when it is run + /// + public virtual bool AnnounceEvent { get; } = true; + /// /// Has the startup time elapsed? /// @@ -139,13 +144,13 @@ namespace Content.Server.StationEvents.Events IoCManager.Resolve() .Add(LogType.EventAnnounced, $"Event announce: {Name}"); - if (StartAnnouncement != null) + if (AnnounceEvent && StartAnnouncement != null) { var chatSystem = IoCManager.Resolve().GetEntitySystem(); chatSystem.DispatchGlobalStationAnnouncement(StartAnnouncement, playDefaultSound: false, colorOverride: Color.Gold); } - if (StartAudio != null) + if (AnnounceEvent && StartAudio != null) { SoundSystem.Play(StartAudio.GetSound(), Filter.Broadcast(), AudioParams); } @@ -162,13 +167,13 @@ namespace Content.Server.StationEvents.Events IoCManager.Resolve() .Add(LogType.EventStopped, $"Event shutdown: {Name}"); - if (EndAnnouncement != null) + if (AnnounceEvent && EndAnnouncement != null) { var chatSystem = IoCManager.Resolve().GetEntitySystem(); chatSystem.DispatchGlobalStationAnnouncement(EndAnnouncement, playDefaultSound: false, colorOverride: Color.Gold); } - if (EndAudio != null) + if (AnnounceEvent && EndAudio != null) { SoundSystem.Play(EndAudio.GetSound(), Filter.Broadcast(), AudioParams); } diff --git a/Content.Server/StationEvents/Events/VentCritters.cs b/Content.Server/StationEvents/Events/VentCritters.cs index fa288f7820..9788aab126 100644 --- a/Content.Server/StationEvents/Events/VentCritters.cs +++ b/Content.Server/StationEvents/Events/VentCritters.cs @@ -32,6 +32,8 @@ public sealed class VentCritters : StationEvent protected override float EndAfter => 60; + public override bool AnnounceEvent => false; + public override void Startup() { base.Startup(); diff --git a/Content.Server/StationEvents/Events/ZombieOutbreak.cs b/Content.Server/StationEvents/Events/ZombieOutbreak.cs index 891171833b..1025aafaf8 100644 --- a/Content.Server/StationEvents/Events/ZombieOutbreak.cs +++ b/Content.Server/StationEvents/Events/ZombieOutbreak.cs @@ -19,11 +19,10 @@ namespace Content.Server.StationEvents.Events public override string Name => "ZombieOutbreak"; public override int EarliestStart => 50; public override float Weight => WeightLow / 2; - public override SoundSpecifier? StartAudio => new SoundPathSpecifier("/Audio/Announcements/bloblarm.ogg"); protected override float EndAfter => 1.0f; - public override int? MaxOccurrences => 1; + public override bool AnnounceEvent => false; /// /// Finds 1-3 random, dead entities accross the station @@ -61,6 +60,9 @@ namespace Content.Server.StationEvents.Events if(station == null) continue; stationsToNotify.Add((EntityUid) station); } + + if (!AnnounceEvent) + return; foreach (var station in stationsToNotify) { chatSystem.DispatchStationAnnouncement((EntityUid) station, Loc.GetString("station-event-zombie-outbreak-announcement"), From 217156f041fb7ee154682fe2a90cb28d24e95033 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 17 Jun 2022 23:54:05 -0400 Subject: [PATCH 89/89] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2f5ae987fa..cc2693e63f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Mith-randalf - changes: - - {message: 'Due to a budgetary oversight, possums and raccoons are now smaller. - Also Ferrets are a little bigger.', type: Tweak} - id: 1219 - time: '2022-03-16T21:30:14.0000000+00:00' - author: ElectroJr changes: - {message: Fixed gas tank UIs not showing the current output pressure when opened., @@ -2998,3 +2992,8 @@ Entries: - {message: Added the remaining botany tools to the NutriVend machine., type: Tweak} id: 1718 time: '2022-06-18T03:34:10.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Certain station events will no longer be announced., type: Tweak} + id: 1719 + time: '2022-06-18T03:53:02.0000000+00:00'