From 8bd4c6ec479b64dc44490e291e0c81eeacababdb Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Wed, 27 Apr 2022 00:21:23 -0400 Subject: [PATCH 01/27] first pass --- Content.Client/Entry/IgnoredComponents.cs | 4 +- .../Body/Components/BodyComponent.cs | 5 + .../SkeletonBodyManagerComponent.cs | 15 + .../Components/TransferMindOnGibComponent.cs | 7 + .../Body/Systems/SkeletonBodyManagerSystem.cs | 89 +++++ .../Body/Systems/TransferMindOnGibSystem.cs | 36 ++ Content.Server/Cloning/CloningSystem.cs | 2 +- .../Body/Part/BodyPartCompatibility.cs | 5 +- Content.Shared/Species/SpeciesPrototype.cs | 1 + Content.Shared/Species/SpeciesSkinColor.cs | 8 + .../Locale/en-US/body/behavior/skeleton.ftl | 5 + Resources/Prototypes/Body/Parts/skeleton.yml | 223 +++++++++++ .../Prototypes/Body/Presets/skeleton.yml | 14 + Resources/Prototypes/Damage/modifier_sets.yml | 12 + .../Entities/Mobs/Player/skeleton.yml | 25 ++ .../Entities/Mobs/Species/skeleton.yml | 360 ++++++++++++++++++ Resources/Prototypes/species.yml | 8 + .../Mobs/Species/Skeleton/parts.rsi/full.png | Bin 0 -> 6363 bytes .../Species/Skeleton/parts.rsi/head_f.png | Bin 0 -> 6307 bytes .../Species/Skeleton/parts.rsi/head_m.png | Bin 0 -> 6307 bytes .../Mobs/Species/Skeleton/parts.rsi/l_arm.png | Bin 0 -> 250 bytes .../Species/Skeleton/parts.rsi/l_foot.png | Bin 0 -> 5768 bytes .../Species/Skeleton/parts.rsi/l_hand.png | Bin 0 -> 5444 bytes .../Mobs/Species/Skeleton/parts.rsi/l_leg.png | Bin 0 -> 363 bytes .../Mobs/Species/Skeleton/parts.rsi/meta.json | 66 ++++ .../Mobs/Species/Skeleton/parts.rsi/r_arm.png | Bin 0 -> 647 bytes .../Species/Skeleton/parts.rsi/r_foot.png | Bin 0 -> 5481 bytes .../Species/Skeleton/parts.rsi/r_hand.png | Bin 0 -> 5453 bytes .../Mobs/Species/Skeleton/parts.rsi/r_leg.png | Bin 0 -> 341 bytes .../Species/Skeleton/parts.rsi/skull_icon.png | Bin 0 -> 930 bytes .../Species/Skeleton/parts.rsi/torso_f.png | Bin 0 -> 1081 bytes .../Species/Skeleton/parts.rsi/torso_m.png | Bin 0 -> 1081 bytes 32 files changed, 881 insertions(+), 4 deletions(-) create mode 100644 Content.Server/Body/Components/SkeletonBodyManagerComponent.cs create mode 100644 Content.Server/Body/Components/TransferMindOnGibComponent.cs create mode 100644 Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs create mode 100644 Content.Server/Body/Systems/TransferMindOnGibSystem.cs create mode 100644 Content.Shared/Species/SpeciesSkinColor.cs create mode 100644 Resources/Locale/en-US/body/behavior/skeleton.ftl create mode 100644 Resources/Prototypes/Body/Parts/skeleton.yml create mode 100644 Resources/Prototypes/Body/Presets/skeleton.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Player/skeleton.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Species/skeleton.yml create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/full.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_f.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_m.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_arm.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_arm.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_leg.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/skull_icon.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_f.png create mode 100644 Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_m.png diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index 2a51408f8b9f..88635f3ffc21 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -337,7 +337,9 @@ public static class IgnoredComponents "EnergySword", "DoorRemote", "InteractionPopup", - "HealthAnalyzer" + "HealthAnalyzer", + "SkeletonBodyManager", + "TransferMindOnGib" }; } } diff --git a/Content.Server/Body/Components/BodyComponent.cs b/Content.Server/Body/Components/BodyComponent.cs index f41a11cabc32..b60d8154c620 100644 --- a/Content.Server/Body/Components/BodyComponent.cs +++ b/Content.Server/Body/Components/BodyComponent.cs @@ -85,6 +85,7 @@ protected override void Startup() public override void Gib(bool gibParts = false) { + _entMan.EventBus.RaiseLocalEvent(Owner, new BeforeGibbedEvent(), false); base.Gib(gibParts); SoundSystem.Play(Filter.Pvs(Owner), _gibSound.GetSound(), _entMan.GetComponent(Owner).Coordinates, AudioHelpers.WithVariation(0.025f)); @@ -110,4 +111,8 @@ public override void Gib(bool gibParts = false) public sealed class BeingGibbedEvent : EntityEventArgs { } + + public sealed class BeforeGibbedEvent : EntityEventArgs + { + } } diff --git a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs new file mode 100644 index 000000000000..bad08ef8164c --- /dev/null +++ b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs @@ -0,0 +1,15 @@ +using Content.Server.Cloning; + +namespace Content.Server.Body.Components +{ + [RegisterComponent] + public sealed class SkeletonBodyManagerComponent : Component + { + /// + /// The dna entry used for reassembling the skeleton + /// updated before the entity is gibbed. + /// + [ViewVariables] + public ClonerDNAEntry? DNA = null; + } +} diff --git a/Content.Server/Body/Components/TransferMindOnGibComponent.cs b/Content.Server/Body/Components/TransferMindOnGibComponent.cs new file mode 100644 index 000000000000..9a49b1b94c3c --- /dev/null +++ b/Content.Server/Body/Components/TransferMindOnGibComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.Body.Components +{ + [RegisterComponent] + public sealed class TransferMindOnGibComponent : Component + { + } +} diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs new file mode 100644 index 000000000000..def9c257b944 --- /dev/null +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -0,0 +1,89 @@ +using Content.Server.Body.Components; +using Content.Server.Cloning; +using Content.Server.Mind.Components; +using Content.Server.Preferences.Managers; +using Content.Shared.CharacterAppearance.Systems; +using Content.Shared.Preferences; +using Content.Shared.Species; +using Content.Shared.Verbs; +using Robust.Server.GameObjects; +using Robust.Shared.Prototypes; + +namespace Content.Server.Body.Systems +{ + public sealed class SkeletonBodyManagerSystem : EntitySystem + { + [Dependency] private readonly IEntityManager _entities = default!; + [Dependency] private readonly IServerPreferencesManager _prefsManager = null!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(AddReassembleVerbs); + } + + /// + /// Adds the custom verb for reassembling skeleton parts + /// into a full skeleton + /// + private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (!TryComp(args.User, out var actor)) + return; + + if (!TryComp(uid, out var mind) || !mind.HasMind) + return; + + // Custom verb + AlternativeVerb custom = new(); + custom.Text = "Reassemble"; + custom.Act = () => Reassemble(uid, component, args); + custom.IconTexture = "/Textures/Mobs/Species/Skeleton/parts.rsi/full.png"; + custom.Priority = 1; + args.Verbs.Add(custom); + } + + private void Reassemble(EntityUid uid, SkeletonBodyManagerComponent component, GetVerbsEvent args) + { + if (component.DNA == null) + return; + + // Creates the new entity and transfers the mind component + var speciesProto = _prototype.Index(component.DNA.Value.Profile.Species).Prototype; + var mob = _entities.SpawnEntity(speciesProto, _entities.GetComponent(component.Owner).MapPosition); + + Get().UpdateFromProfile(mob, component.DNA.Value.Profile); + _entities.GetComponent(mob).EntityName = component.DNA.Value.Profile.Name; + + if (TryComp(uid, out var mindcomp) && mindcomp.Mind != null) + mindcomp.Mind.TransferTo(mob); + } + + /// + /// Called before the skeleton entity is gibbed in order to save + /// the dna for reassembly later + /// + /// the entity the mind is going to be transfered which also stores the DNA + /// the entity whose DNA is being saved + public void UpdateDNAEntry(EntityUid uid, EntityUid body) + { + if (!TryComp(uid, out var skelBodyComp) || + !TryComp(body, out var mindcomp)) + return; + + if (mindcomp.Mind == null) + return; + + if (mindcomp.Mind.UserId == null) + return; + + var profile = (HumanoidCharacterProfile) _prefsManager.GetPreferences(mindcomp.Mind.UserId.Value).SelectedCharacter; + skelBodyComp.DNA = new ClonerDNAEntry(mindcomp.Mind, profile); + } + } +} diff --git a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs new file mode 100644 index 000000000000..67cca2dbcc39 --- /dev/null +++ b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs @@ -0,0 +1,36 @@ +using Content.Server.Body.Components; +using Content.Server.Mind.Components; + +namespace Content.Server.Body.Systems +{ + public sealed class TransferMindOnGibSystem : EntitySystem + { + [Dependency] private readonly SkeletonBodyManagerSystem _skeletonBodyManager = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnBeforeGibbed); + } + + private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, BeforeGibbedEvent args) + { + if (TryComp(uid, out var mindComp) && mindComp.Mind != null) + { + if (TryComp(uid, out var bodyComp)) + { + foreach (var part in bodyComp.Parts) + { + var entity = part.Key.Owner; + if (HasComp(entity)) + { + _skeletonBodyManager.UpdateDNAEntry(entity, uid); + mindComp.Mind.TransferTo(entity); + } + } + } + } + } + } +} diff --git a/Content.Server/Cloning/CloningSystem.cs b/Content.Server/Cloning/CloningSystem.cs index 381094f4d22a..dc56b6738e6e 100644 --- a/Content.Server/Cloning/CloningSystem.cs +++ b/Content.Server/Cloning/CloningSystem.cs @@ -137,7 +137,7 @@ public void Reset(RoundRestartCleanupEvent ev) // For example, GameTicker should be using this, and this should be using ICharacterProfile rather than HumanoidCharacterProfile. // It should carry a reference or copy of itself with the mobs that it affects. // See TODO in MedicalScannerComponent. - struct ClonerDNAEntry { + public struct ClonerDNAEntry { public Mind.Mind Mind; public HumanoidCharacterProfile Profile; diff --git a/Content.Shared/Body/Part/BodyPartCompatibility.cs b/Content.Shared/Body/Part/BodyPartCompatibility.cs index 91a24819cf13..fbffe96e7225 100644 --- a/Content.Shared/Body/Part/BodyPartCompatibility.cs +++ b/Content.Shared/Body/Part/BodyPartCompatibility.cs @@ -1,4 +1,4 @@ -using System; +using System; using Content.Shared.Body.Components; using Robust.Shared.Serialization; @@ -14,6 +14,7 @@ public enum BodyPartCompatibility Universal = 0, Biological, Mechanical, - Slime + Slime, + Skeleton } } diff --git a/Content.Shared/Species/SpeciesPrototype.cs b/Content.Shared/Species/SpeciesPrototype.cs index 435b93c54089..08f1128b10a6 100644 --- a/Content.Shared/Species/SpeciesPrototype.cs +++ b/Content.Shared/Species/SpeciesPrototype.cs @@ -51,4 +51,5 @@ public enum SpeciesSkinColor { HumanToned, Hues, + TintedHues, } diff --git a/Content.Shared/Species/SpeciesSkinColor.cs b/Content.Shared/Species/SpeciesSkinColor.cs new file mode 100644 index 000000000000..dca8af58dcda --- /dev/null +++ b/Content.Shared/Species/SpeciesSkinColor.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Species; +public enum SpeciesSkinColor +{ + HumanToned, + Hues, + TintedHues, +} + diff --git a/Resources/Locale/en-US/body/behavior/skeleton.ftl b/Resources/Locale/en-US/body/behavior/skeleton.ftl new file mode 100644 index 000000000000..db71eacb4aab --- /dev/null +++ b/Resources/Locale/en-US/body/behavior/skeleton.ftl @@ -0,0 +1,5 @@ +skeleton-unable-consume = {CAPITALIZE(THE($item))} fell right through {POSS-ADJ($target)} body! +skeleton-death = {CAPITALIZE(THE($target))} fell to pieces! + +skeleton-reassemble-action = Reassemble +skeleton-reassemble-fail = Parts are missing! \ No newline at end of file diff --git a/Resources/Prototypes/Body/Parts/skeleton.yml b/Resources/Prototypes/Body/Parts/skeleton.yml new file mode 100644 index 000000000000..2771d602c9ba --- /dev/null +++ b/Resources/Prototypes/Body/Parts/skeleton.yml @@ -0,0 +1,223 @@ +# TODO BODY: Part damage +- type: entity + id: PartSkeleton + parent: BaseItem + name: "skeleton body part" + abstract: true + components: + - type: Damageable + damageContainer: Biological + +- type: entity + id: TorsoSkeleton + name: "skeleton torso" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "torso_m" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "torso_m" + - type: BodyPart + partType: Torso + size: 14 + compatibility: Skeleton +# criticalThreshold: 100 +# deadThreshold: 150 + +- type: entity + id: HeadSkeleton + name: "skull" + description: Alas poor Yorick... + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "skull_icon" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "skull_icon" + - type: BodyPart + partType: Head + size: 7 + compatibility: Skeleton + #Unique stuff the skull has for one a skelly gets "boned" nyeheheh + - type: SkeletonBodyManager + - type: Input + context: "human" + - type: Speech + - type: Vocal + - type: Emoting + - type: Grammar + attributes: + proper: true + - type: Examiner + - type: GhostRadio + - type: DoAfter + - type: Actions + - type: MobState + thresholds: + 0: !type:NormalMobState {} + # criticalThreshold: 50 + # deadThreshold: 120 + +- type: entity + id: LeftArmSkeleton + name: "left skeleton arm" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_arm" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_arm" + - type: BodyPart + partType: Arm + size: 5 + compatibility: Skeleton + symmetry: Left + # criticalThreshold: 40 + # deadThreshold: 80 + +- type: entity + id: RightArmSkeleton + name: "right skeleton arm" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_arm" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_arm" + - type: BodyPart + partType: Arm + size: 5 + compatibility: Skeleton + symmetry: Right + # criticalThreshold: 40 + # deadThreshold: 80 + +- type: entity + id: LeftHandSkeleton + name: "left skeleton hand" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_hand" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_hand" + - type: BodyPart + partType: Hand + size: 3 + compatibility: Skeleton + symmetry: Left + # criticalThreshold: 30 + # deadThreshold: 60 + +- type: entity + id: RightHandSkeleton + name: "right skeleton hand" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_hand" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_hand" + - type: BodyPart + partType: Hand + size: 3 + compatibility: Skeleton + symmetry: Right + # criticalThreshold: 30 + # deadThreshold: 60 + +- type: entity + id: LeftLegSkeleton + name: "left skeleton leg" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_leg" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_leg" + - type: BodyPart + partType: Leg + size: 6 + compatibility: Skeleton + symmetry: Left + +- type: entity + id: RightLegSkeleton + name: "right skeleton leg" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_leg" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_leg" + - type: BodyPart + partType: Leg + size: 6 + compatibility: Skeleton + symmetry: Right + # criticalThreshold: 45 + # deadThreshold: 90 + +- type: entity + id: LeftFootSkeleton + name: "left skeleton foot" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_foot" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "l_foot" + - type: BodyPart + partType: Foot + size: 2 + compatibility: Skeleton + symmetry: Left +# criticalThreshold: 30 +# deadThreshold: 60 + +- type: entity + id: RightFootSkeleton + name: "right skeleton foot" + parent: PartSkeleton + components: + - type: Sprite + netsync: false + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_foot" + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: "r_foot" + - type: BodyPart + partType: Foot + size: 2 + compatibility: Skeleton + symmetry: Right +# criticalThreshold: 30 +# deadThreshold: 60 diff --git a/Resources/Prototypes/Body/Presets/skeleton.yml b/Resources/Prototypes/Body/Presets/skeleton.yml new file mode 100644 index 000000000000..07d372c2ebe4 --- /dev/null +++ b/Resources/Prototypes/Body/Presets/skeleton.yml @@ -0,0 +1,14 @@ +- type: bodyPreset + name: "skeleton" + id: SkeletonPreset + partIDs: + head: HeadSkeleton + torso: TorsoSkeleton + right arm: RightArmSkeleton + left arm: LeftArmSkeleton + right hand: RightHandSkeleton + left hand: LeftHandSkeleton + right leg: RightLegSkeleton + left leg: LeftLegSkeleton + right foot: RightFootSkeleton + left foot: LeftFootSkeleton diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 015daf95ba30..111f88d38f3b 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -118,6 +118,18 @@ Heat: 3.0 Poison: 0.0 +# in relation to how they cause bloodloss damage. +- type: damageModifierSet + id: Skeleton + coefficients: + Blunt: 3.0 + Slash: 1.8 + Piercing: 1.5 + Cold: 0.0 + Poison: 0.0 + Asphyxiation: 0.0 + Bloodloss: 0.0 + # Represents which damage types should be modified # in relation to how they cause bloodloss damage. - type: damageModifierSet diff --git a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml new file mode 100644 index 000000000000..07ceb587353b --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml @@ -0,0 +1,25 @@ +- type: entity + save: false + parent: MobSkeletonPersonBase + id: MobSkeletonPerson + components: + - type: InteractionPopup + successChance: 1 + interactSuccessString: hugging-success-generic + interactSuccessSound: /Audio/Effects/hug.ogg + messagePerceivedByOthers: hugging-success-generic-others + - type: Mind + showExamineInfo: true + - type: Input + context: "human" + - type: PlayerMobMover + - type: PlayerInputMover + - type: Alerts + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: AiFactionTag + factions: + - NanoTrasen diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml new file mode 100644 index 000000000000..6a39d548d403 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -0,0 +1,360 @@ +- type: entity + save: false + name: Urist McSkelly + id: MobSkeletonPersonBase + description: A miserable pile of bones. + noSpawn: true + components: + - type: Tag + tags: + - CanPilot + - FootstepSound + - DoorBumpOpener + - type: Reactive + groups: + Flammable: [ Touch ] + Extinguish: [ Touch ] + Acidic: [Touch, Ingestion] + reactions: + - reagents: [Water, SpaceCleaner] + methods: [Touch] + effects: + - !type:WashCreamPieReaction + - type: Flashable + - type: Hands + - type: MovementSpeedModifier + - type: MovedByPressure + - type: Barotrauma + damage: + types: + Blunt: 0.7 #per second, scales with pressure and other constants. + - type: DamageOnHighSpeedImpact + damage: + types: + Blunt: 5 + soundHit: + path: /Audio/Effects/hit_kick.ogg + # Organs + - type: HealthExaminable + examinableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - Electrocution + # Other + - type: Inventory + - type: Clickable + - type: InteractionOutline + - type: Icon + sprite: Mobs/Species/Skeleton/parts.rsi + state: full + - type: Sprite + netsync: false + noRot: true + drawdepth: Mobs + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Customization/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_arm + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_leg + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_leg + - shader: StencilClear + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: female_full + visible: false + - map: [ "jumpsuit" ] + shader: StencilDraw + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.LFoot" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_foot + - map: [ "enum.HumanoidVisualLayers.RFoot" ] + color: "#ffffff" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_foot + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + state: shaved + sprite: Mobs/Customization/human_facial_hair.rsi + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + - shape: + !type:PhysShapeCircle + radius: 0.35 + mass: 70 + restitution: 0.0 + mask: + - Impassable + - MobImpassable + - VaultImpassable + - SmallImpassable + layer: + - Opaque + - type: AtmosExposed + - type: Flammable + fireSpread: true + canResistFire: true + damage: + types: + Heat: 1 #per second, scales with number of fire 'stacks' + - type: Temperature + heatDamageThreshold: 360 + coldDamageThreshold: 260 + currentTemperature: 310.15 + specificHeat: 42 + coldDamage: + types: + Cold : 1 #per second, scales with temperature & other constants + heatDamage: + types: + Heat : 1 #per second, scales with temperature & other constants + - type: HumanoidAppearance + - type: Body + template: HumanoidTemplate + preset: SkeletonPreset + - type: Damageable + damageContainer: Biological + damageModifierSet: Skeleton + - type: ThermalRegulator + metabolismHeat: 800 + radiatedHeat: 100 + implicitHeatRegulation: 500 + sweatHeatRegulation: 2000 + shiveringHeatRegulation: 2000 + normalBodyTemperature: 310.15 + thermalRegulationTemperatureThreshold: 25 + - type: Internals + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 100: !type:DeadMobState {} + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:GibBehavior { } + - type: SlowOnDamage #modified speeds because they're so weak + speedModifierThresholds: + 60: 0.9 + 80: 0.7 + 90: 0.5 + - type: HeatResistance + - type: Appearance + visuals: + - type: RotationVisualizer + - type: BuckleVisualizer + - type: FireVisualizer + sprite: Mobs/Effects/onfire.rsi + normalState: Generic_mob_burning + alternateState: Standing + fireStackAlternateState: 3 + - type: CreamPiedVisualizer + state: creampie_human + - type: DamageVisualizer + thresholds: [20, 40, 100] + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.LLeg" + - "enum.HumanoidVisualLayers.RArm" + - "enum.HumanoidVisualLayers.RLeg" + damageOverlayGroups: + Brute: + sprite: Mobs/Effects/brute_damage.rsi + color: "#8a8a8a" + Burn: + sprite: Mobs/Effects/burn_damage.rsi + - type: CombatMode + - type: Climbing + - type: Cuffable + - type: CharacterInfo + - type: AnimationPlayer + - type: Buckle + - type: UnarmedCombat + hitSound: + collection: Punch + range: 0.8 + arcwidth: 30 + arc: fist + damage: + types: + Blunt: 5 + - type: Pullable + - type: DoAfter + - type: CreamPied + - type: Stripping + - type: Strippable + - type: UserInterface + interfaces: + - key: enum.StrippingUiKey.Key + type: StrippableBoundUserInterface + - type: Puller + - type: Speech + - type: Vocal + - type: Emoting + - type: Grammar + attributes: + proper: true + - type: StandingState + - type: TransferMindOnGib + +- type: entity + save: false + name: Urist McSkelly + parent: MobHumanDummy + id: MobSkeletonPersonDummy + noSpawn: true + description: A dummy skeleton meant to be used in character setup. + components: + - type: Sprite + netsync: false + drawdepth: Mobs + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Customization/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_arm + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_leg + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_leg + - shader: StencilClear + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: female_full + visible: false + - map: [ "jumpsuit" ] + shader: StencilDraw + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.LFoot" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: l_foot + - map: [ "enum.HumanoidVisualLayers.RFoot" ] + color: "#b8b8b8" + sprite: Mobs/Species/Skeleton/parts.rsi + state: r_foot + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + state: shaved + sprite: Mobs/Customization/human_facial_hair.rsi + color: '#FFFFFF80' + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + color: '#FFFFFF80' + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index 4e43e598082b..bb5dcd250042 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -29,3 +29,11 @@ prototype: MobSlimePerson dollPrototype: MobSlimePersonDummy skinColoration: Hues + +- type: species + id: Skeleton + name: Skeleton + roundStart: true + prototype: MobSkeletonPerson + dollPrototype: MobSkeletonPersonDummy + skinColoration: Hues \ No newline at end of file diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/full.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..e457b7018e04a86fc0ea456cf18b8324dd3436a7 GIT binary patch literal 6363 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_f.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_f.png new file mode 100644 index 0000000000000000000000000000000000000000..99101bce8b92f95fa38fe5dddc00ae0788b26e76 GIT binary patch literal 6307 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_m.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..99101bce8b92f95fa38fe5dddc00ae0788b26e76 GIT binary patch literal 6307 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..63025ee600afcbde293d0ba2afa2541ff1163d74 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|ws^WYhE&XX zds9*9kONQa!vkN`OgZwJG}R*mpLjiyT6b8sfP=+!uWRTk0}Ct8+a>?b=bL>t+pMMp z)XShVWsXTuY_U~u*4>gTe~DWM4fbYfle literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..48f6dbdcdbadbc06a26d56dc3e3e3f6733606d71 GIT binary patch literal 5768 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 MuyL_2u=I=h4=pDCcmMzZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..3418d30094b2f9bc2d949e2005868c186a4e8749 GIT binary patch literal 5444 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_hand.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..df5f25c0dac15c2eb7546feeac771eadfdf1baad GIT binary patch literal 5453 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 EzZsinzW@LL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_leg.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..0fab01a9f08ba2b6eb209b94790744bfefb00528 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z`8{16Ln`LH zy=BXF$U&g(q2r!rb^+IevpW{3dnQWfPq_T!as~VD21Th0C1y=!VabXcH{C2uUbN4D zvWVofA%PL^I=BTx38C;#)O3C zJzu@#bmi4T7ngaKYi7i92ah>sl{<*3PnBns-^}%l ib;ao(hu9*9_*Z;#an)<~Pg~RtGRo7{&t;ucLK6TWDUe10 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/skull_icon.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/skull_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..50a43e320d9a726a9670e31a52de2ccd1249a42b GIT binary patch literal 930 zcmV;T16}-yP)EX>4Tx04R}tkv&MmKpe$i(~2S$hjvhL$WWauh)QvkDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRdDMv7M|nl9zMR_MR}I@xj)B%QZO0d6N%@TZdk+{#Ia3F z=e$oGW@SksJ|~_q=z_$LT$f#b<6LrB;F)0~o1P~Q6N{xTmb;jh4V8F?IHIT;5a~6#i_xHl`2YFAD>a z-K7uUq8+;QAslejq>YX;_z*4*!cc~GY0|BW#)g4~M129n*rjx6pqI-9?nN3GPeM3{ zbHn$Yzsm(U%Za5VvUob|`@CxhlNr~$uS9^gk;aP;0KN#3RB-=mpZm(n+GQ5FVAL^b z-?nj$@5k5ok0+M@;y=N8B#}T-;@S?ny-s2SGYJ$Gy=yy}Yq+K$?S+ye$9$3^bAbbb zB?!O*J;~+;2RJgIkM&U3Mp^`v^pSoM0;w6G0Z5znkrCV^lA zSP?dw6{dcSaA%;=tUy&;p{=T|LP#VM==M4>a7mFPb!L&!Mp~o^tMytcfy6106d7I0 zW~~7bW+t%7N!V|9Sgq~EuOgFxYdf(y2mTsNAM4?#nMF)QVkH<%W+l_GB55RbI_31t zFXsy^=L-PY(E}+bqUo^jlZ{7jF!Zjs*?a={Er)4Xk${pgQVEbG?jG)${~jJs)AqK8#6 z0$F3G5zQzXJ-|_dteU#ElN%i1_%Y%A89Dm=f0k3p4@=Y{f(X2c<^TWy07*qoM6N<$ Eg6;mQ8UO$Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_f.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_f.png new file mode 100644 index 0000000000000000000000000000000000000000..4a13c0dbdcb8fd4cd663ac0e625ab37ea2beb441 GIT binary patch literal 1081 zcmV-91jhS`P)EX>4Tx04R}tkv&MmKpe$i(~2S$hjvhL$WWauh)QvkDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRdDMv7M|nl9zMR_MR}I@xj)B%QZO0d6N%@TZdk+{#Ia3F z=e$oGW@SksJ|~_q=z_$LT$f#b<6LrB;F)0~o1P~Q6N{xTmb;jh4V8F?IHIT;?JUA^G!ge>VkyR@28KNwVWL&%^Cq007uKI1;V- zZ1jiwyJ`9}{^zEQtXlu!<}%w>(SI%Z^Y!^fw!gW(g}UEB6oiOpbICF*5d|UYegk#C zQF>g8$N>QG;nT<5cikA>K~+#(Uj+aF;@R9N5Ml=?!J+}SC<}o4GzoyX2zI*d(o~Cr z5R>t=@*>!3`T)u=!P~n)tS`<0;BOYV$N+WX3UvuaL73eMB#5J>SJ_t6&xuwU{WASd zw~fhoYE?gH$mq+kvfJKM^w)9QWd=ya^#=}>0aZT)J*KaJn(7-BLEyLd0bpn6z3CDw z(do7k1z~1~HOiu3Bl^0&dIT=+o2)0!fIrt+`pACexYj3x5JCtcgb+dqA>^f@UW8ta zj&nVFn++2EW$44rWqLI_w)0|E36~8<*mAo4@GN< z9dLGXir%2Vbli0YDBGkMb%)=+dxM(iVUZ;G{_RKho2~AQUg(OpNNq4OSa*WSSjxIk zBQvHa4*;)B#g*4xvq%!uJkOqBabVHagvh#VG0FhF;B~rfxNw4+SSzzhg4h9j2S*!| z@iaFn<_e{~%7~tE@zSI2vIx4ife=CnAEX>4Tx04R}tkv&MmKpe$i(~2S$hjvhL$WWauh)QvkDi*;)X)CnqU~=gfG-*gu zTpR`0f`cE6RRdDMv7M|nl9zMR_MR}I@xj)B%QZO0d6N%@TZdk+{#Ia3F z=e$oGW@SksJ|~_q=z_$LT$f#b<6LrB;F)0~o1P~Q6N{xTmb;jh4V8F?IHIT;?JUA^G!ge>VkyR@28KNwVWL&%^Cq007uKI1;V- zZ1jiwyJ`9}{^zEQtXlu!<}%w>(SI%Z^Y!^fw!gW(g}UEB6oiOpbICF*5d|UYegk#C zQF>g8$N>QG;nT<5cikA>K~+#(Uj+aF;@R9N5Ml=?!J+}SC<}o4GzoyX2zI*d(o~Cr z5R>t=@*>!3`T)u=!P~n)tS`<0;BOYV$N+WX3UvuaL73eMB#5J>SJ_t6&xuwU{WASd zw~fhoYE?gH$mq+kvfJKM^w)9QWd=ya^#=}>0aZT)J*KaJn(7-BLEyLd0bpn6z3CDw z(do7k1z~1~HOiu3Bl^0&dIT=+o2)0!fIrt+`pACexYj3x5JCtcgb+dqA>^f@UW8ta zj&nVFn++2EW$44rWqLI_w)0|E36~8<*mAo4@GN< z9dLGXir%2Vbli0YDBGkMb%)=+dxM(iVUZ;G{_RKho2~AQUg(OpNNq4OSa*WSSjxIk zBQvHa4*;)B#g*4xvq%!uJkOqBabVHagvh#VG0FhF;B~rfxNw4+SSzzhg4h9j2S*!| z@iaFn<_e{~%7~tE@zSI2vIx4ife=CnA Date: Wed, 27 Apr 2022 00:53:09 -0400 Subject: [PATCH 02/27] color fix --- .../Preferences/UI/HumanoidProfileEditor.xaml.cs | 11 +++++++++++ Content.Shared/Species/SpeciesSkinColor.cs | 8 -------- Resources/Prototypes/species.yml | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) delete mode 100644 Content.Shared/Species/SpeciesSkinColor.cs diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 7f75a3bb7056..1bca1f1cec04 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -482,6 +482,12 @@ private void OnSkinColorOnValueChanged(Range range) Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); break; } + case SpeciesSkinColor.TintedHues: + { + var color = Color.FromHsv(new Vector4(range.Value / 100.0f, 0.1f, 1.0f, 1.0f)); + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); + break; + } } IsDirty = true; @@ -675,6 +681,11 @@ private void UpdateSkinColor() _skinColor.Value = color.X * 100; break; } + case SpeciesSkinColor.TintedHues: + { + _skinColor.Value = color.X * 100f; + break; + } } } diff --git a/Content.Shared/Species/SpeciesSkinColor.cs b/Content.Shared/Species/SpeciesSkinColor.cs deleted file mode 100644 index dca8af58dcda..000000000000 --- a/Content.Shared/Species/SpeciesSkinColor.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Content.Shared.Species; -public enum SpeciesSkinColor -{ - HumanToned, - Hues, - TintedHues, -} - diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index bb5dcd250042..762d80dc334b 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -36,4 +36,4 @@ roundStart: true prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy - skinColoration: Hues \ No newline at end of file + skinColoration: TintedHues \ No newline at end of file From a72eba6873b52fd6627cdb92491bcc3edc67c200 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Thu, 28 Apr 2022 15:51:31 -0400 Subject: [PATCH 03/27] syndie bundle --- .../Catalog/Fills/Backpacks/duffelbag.yml | 17 ++++++++++++ .../Prototypes/Catalog/uplink_catalog.yml | 8 ++++++ Resources/Prototypes/Damage/modifier_sets.yml | 6 ++--- .../Prototypes/Diseases/noninfectious.yml | 8 +++--- .../Objects/Specific/Medical/healing.yml | 27 +++++++++++++++++++ Resources/Prototypes/Reagents/medicine.yml | 2 +- Resources/Prototypes/Reagents/toxins.yml | 17 ++++++++++++ 7 files changed, 77 insertions(+), 8 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml index ff33f7f9eb7a..4c0429da3699 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml @@ -190,6 +190,23 @@ contents: - id: ClothingOuterHardsuitSyndie +- type: entity + parent: ClothingBackpackDuffelSyndicate + id: ClothingBackpackDuffelZombieBundle + name: syndicate zombie bundle + description: "An all-in-one kit for unleashing the undead upon a station." + components: + - type: StorageFill + contents: + - id: SyringeCorpium + amount: 2 + - id: Handcuffs + - id: FlareGun + amount: 2 + - id: BoxShotgunFlare + - id: PillRomerol + amount: 3 + - type: entity parent: ClothingBackpackDuffelSyndicate id: ClothingBackpackDuffelSyndicateOperative diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 6f883d118ca7..95e8d5abb459 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -204,6 +204,14 @@ price: 40 icon: /Textures/Objects/Weapons/Guns/LMGs/l6.rsi/icon.png +- type: uplinkListing + id: UplinkZombieBundle + category: Bundles + itemId: ClothingBackpackDuffelZombieBundle + price: 40 + icon: /Textures/Structures/Wallmounts/signs.rsi/bio.png + + #- type: uplinkListing # id: UplinkCarbineBundle # category: Bundles diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 015daf95ba30..537655660c72 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -110,10 +110,10 @@ - type: damageModifierSet id: Zombie #Blunt resistent and immune to biological threats, but can be hacked apart and burned coefficients: - Blunt: 0.4 - Slash: 0.8 + Blunt: 0.6 + Slash: 0.9 Piercing: 0.9 - Shock: 0.8 + Shock: 1.5 Cold: 0.2 Heat: 3.0 Poison: 0.0 diff --git a/Resources/Prototypes/Diseases/noninfectious.yml b/Resources/Prototypes/Diseases/noninfectious.yml index 4ad5e27be1dd..de955cddd601 100644 --- a/Resources/Prototypes/Diseases/noninfectious.yml +++ b/Resources/Prototypes/Diseases/noninfectious.yml @@ -25,19 +25,19 @@ cureResist: 0.2 effects: - !type:DiseaseHealthChange - probability: 0.05 + probability: 0.01 damage: types: Blunt: 3 - !type:DiseaseSnough - probability: 0.005 + probability: 0.05 snoughMessage: disease-cough snoughSound: collection: Coughs - !type:DiseaseProgression - probability: 0.5 + probability: 0.33 comp: DiseaseZombie cures: - !type:DiseaseReagentCure reagent: Romerol - min: 10 + min: 5 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index e52af0b7a93e..54d23aa806ba 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -202,6 +202,19 @@ - ReagentId: Tricordrazine Quantity: 15 +- type: entity + name: romerol pill + parent: Pill + id: PillRomerol + components: + - type: SolutionContainerManager + solutions: + food: + maxVol: 50 + reagents: + - ReagentId: Romerol + Quantity: 10 + # Syringes - type: entity name: ephedrine syringe @@ -254,3 +267,17 @@ reagents: - ReagentId: Spaceacillin Quantity: 15 + +#this is where all the syringes are so i didn't know where to put it +- type: entity + name: corpium syringe + parent: Syringe + id: SyringeCorpium + components: + - type: SolutionContainerManager + solutions: + injector: + maxVol: 15 + reagents: + - ReagentId: Corpium + Quantity: 10 diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index df074697a87b..cbd19a97f116 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -332,7 +332,7 @@ - !type:HealthChange damage: types: - Poison: 2 + Poison: 0.5 - type: reagent id: PulpedBananaPeel diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index 6108fdc3faed..5a3b659425a4 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -286,3 +286,20 @@ - !type:ChemCauseDisease ##Since this mostly just comes from the event you won't ingest that much causeChance: 0.6 disease: VentCough + +- type: reagent + id: Corpium + name: corpium + desc: A Syndicate cocktail, carefully harvested from various sources. You wouldn't want this inside of you. + physicalDesc: necrotic + color: "#7668a1" + metabolisms: + Poison: + effects: + - !type:HealthChange + damage: + types: + Cellular: 1 + - !type:ChemCauseDisease + causeChance: 1 + disease: ZombieInfection From 45f48a68c501cb13a2b14b1da0de1d39da710caa Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 29 Apr 2022 07:15:14 -0400 Subject: [PATCH 04/27] Update duffelbag.yml --- Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml index 4c0429da3699..db9db5d99336 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/duffelbag.yml @@ -199,13 +199,12 @@ - type: StorageFill contents: - id: SyringeCorpium - amount: 2 - id: Handcuffs - id: FlareGun amount: 2 - id: BoxShotgunFlare - id: PillRomerol - amount: 3 + amount: 4 - type: entity parent: ClothingBackpackDuffelSyndicate From eed7ef72bcd9c5ac253fce41bec23d4bb653210d Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 29 Apr 2022 07:15:39 -0400 Subject: [PATCH 05/27] Update noninfectious.yml --- Resources/Prototypes/Diseases/noninfectious.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Diseases/noninfectious.yml b/Resources/Prototypes/Diseases/noninfectious.yml index de955cddd601..44c2111d796c 100644 --- a/Resources/Prototypes/Diseases/noninfectious.yml +++ b/Resources/Prototypes/Diseases/noninfectious.yml @@ -40,4 +40,4 @@ cures: - !type:DiseaseReagentCure reagent: Romerol - min: 5 + min: 10 From 9a53aaa713e722e20fc5a75d1e4d0c09a2a497e9 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Fri, 29 Apr 2022 21:08:54 -0400 Subject: [PATCH 06/27] more work --- .../Body/Components/BodyComponent.cs | 14 +++- .../SkeletonBodyManagerComponent.cs | 10 +++ .../Body/Systems/SkeletonBodyManagerSystem.cs | 80 ++++++++++++++++++- .../ConstructionSystem.Initial.cs | 2 +- .../Body/Components/SharedBodyComponent.cs | 6 +- Resources/Prototypes/Damage/modifier_sets.yml | 9 ++- Resources/Prototypes/species.yml | 2 +- 7 files changed, 109 insertions(+), 14 deletions(-) diff --git a/Content.Server/Body/Components/BodyComponent.cs b/Content.Server/Body/Components/BodyComponent.cs index b60d8154c620..ccdcede2f85b 100644 --- a/Content.Server/Body/Components/BodyComponent.cs +++ b/Content.Server/Body/Components/BodyComponent.cs @@ -83,10 +83,10 @@ protected override void Startup() } } - public override void Gib(bool gibParts = false) + public override List Gib(bool gibParts = false) { _entMan.EventBus.RaiseLocalEvent(Owner, new BeforeGibbedEvent(), false); - base.Gib(gibParts); + var gibs = base.Gib(gibParts); SoundSystem.Play(Filter.Pvs(Owner), _gibSound.GetSound(), _entMan.GetComponent(Owner).Coordinates, AudioHelpers.WithVariation(0.025f)); @@ -103,13 +103,21 @@ public override void Gib(bool gibParts = false) } } - _entMan.EventBus.RaiseLocalEvent(Owner, new BeingGibbedEvent(), false); + _entMan.EventBus.RaiseLocalEvent(Owner, new BeingGibbedEvent(gibs), false); _entMan.QueueDeleteEntity(Owner); + + return gibs; } } public sealed class BeingGibbedEvent : EntityEventArgs { + public List GibbedParts; + + public BeingGibbedEvent(List gibbedParts) + { + GibbedParts = gibbedParts; + } } public sealed class BeforeGibbedEvent : EntityEventArgs diff --git a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs index bad08ef8164c..1a6d85057fcb 100644 --- a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs +++ b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Cloning; +using Content.Shared.Body.Components; namespace Content.Server.Body.Components { @@ -11,5 +12,14 @@ public sealed class SkeletonBodyManagerComponent : Component /// [ViewVariables] public ClonerDNAEntry? DNA = null; + + /// + /// The default time it takes to reassemble itself + /// + [ViewVariables] + public float DoAfterTime = 5f; + + [ViewVariables] + public List? BodyParts = null; } } diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs index def9c257b944..58b433c3d7bc 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -1,12 +1,16 @@ using Content.Server.Body.Components; using Content.Server.Cloning; +using Content.Server.Construction; +using Content.Server.DoAfter; using Content.Server.Mind.Components; +using Content.Server.Popups; using Content.Server.Preferences.Managers; using Content.Shared.CharacterAppearance.Systems; using Content.Shared.Preferences; using Content.Shared.Species; using Content.Shared.Verbs; using Robust.Server.GameObjects; +using Robust.Shared.Player; using Robust.Shared.Prototypes; namespace Content.Server.Body.Systems @@ -16,12 +20,17 @@ public sealed class SkeletonBodyManagerSystem : EntitySystem [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IServerPreferencesManager _prefsManager = null!; [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly PopupSystem _popupSystem= default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly ConstructionSystem _construction = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddReassembleVerbs); + SubscribeLocalEvent(OnBeingGibbed); + SubscribeLocalEvent(Reassemble); } /// @@ -39,20 +48,57 @@ private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent comp if (!TryComp(uid, out var mind) || !mind.HasMind) return; + var doAfterTime = component.DoAfterTime; + + // doubles the time if you reconstruct yourself + if (args.User == uid) + doAfterTime *= 2; + + var doAfterEventArgs = new DoAfterEventArgs(component.Owner, doAfterTime, default, component.Owner) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnStun = true, + NeedHand = false, + BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, args.User, component), + }; + // Custom verb AlternativeVerb custom = new(); - custom.Text = "Reassemble"; - custom.Act = () => Reassemble(uid, component, args); + custom.Text = Loc.GetString("skeleton-reassemble-action"); + custom.Act = () => _doAfterSystem.DoAfter(doAfterEventArgs); custom.IconTexture = "/Textures/Mobs/Species/Skeleton/parts.rsi/full.png"; custom.Priority = 1; args.Verbs.Add(custom); } - private void Reassemble(EntityUid uid, SkeletonBodyManagerComponent component, GetVerbsEvent args) + private void Reassemble(ReassembleDoAfterComplete args) { - if (component.DNA == null) + var uid = args.Uid; + var component = args.Component; + + if (component.DNA == null || component.BodyParts == null) return; + // Ensures all of the old body part pieces are there + var nearby = _construction.EnumerateNearby(args.User); + + // there is certainly a less stinky way of doing this but alas + // i am a little baby coder who's only taken intro classes. -emo + var foundBodyParts = new List(); + foreach (var entity in nearby) + { + foreach (var target in component.BodyParts) + { + if (target.Owner == entity) + { + //checking code will run somewhere here + // please recommend a way to do this in a sane way + } + } + } + // Creates the new entity and transfers the mind component var speciesProto = _prototype.Index(component.DNA.Value.Profile.Species).Prototype; var mob = _entities.SpawnEntity(speciesProto, _entities.GetComponent(component.Owner).MapPosition); @@ -62,6 +108,12 @@ private void Reassemble(EntityUid uid, SkeletonBodyManagerComponent component, G if (TryComp(uid, out var mindcomp) && mindcomp.Mind != null) mindcomp.Mind.TransferTo(mob); + + // Cleans up all the body part pieces + foreach(var entity in foundBodyParts) + { + _entities.DeleteEntity(entity); + } } /// @@ -85,5 +137,25 @@ public void UpdateDNAEntry(EntityUid uid, EntityUid body) var profile = (HumanoidCharacterProfile) _prefsManager.GetPreferences(mindcomp.Mind.UserId.Value).SelectedCharacter; skelBodyComp.DNA = new ClonerDNAEntry(mindcomp.Mind, profile); } + + /// gets the list of body parts that were dropped when the entity was gibbed. + private void OnBeingGibbed(EntityUid uid, SkeletonBodyManagerComponent component, BeingGibbedEvent args) + { + component.BodyParts = args.GibbedParts; + } + + private sealed class ReassembleDoAfterComplete : EntityEventArgs + { + public readonly EntityUid Uid; //the entity being reassembled + public readonly EntityUid User; //the user performing the reassembly + public readonly SkeletonBodyManagerComponent Component; + + public ReassembleDoAfterComplete(EntityUid uid, EntityUid user, SkeletonBodyManagerComponent component) + { + Uid = uid; + User = user; + Component = component; + } + } } } diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index b40ed21b9d72..6fe06a543265 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -46,7 +46,7 @@ private void InitializeInitial() } // LEGACY CODE. See warning at the top of the file! - private IEnumerable EnumerateNearby(EntityUid user) + public IEnumerable EnumerateNearby(EntityUid user) { foreach (var item in _handsSystem.EnumerateHeld(user)) { diff --git a/Content.Shared/Body/Components/SharedBodyComponent.cs b/Content.Shared/Body/Components/SharedBodyComponent.cs index a73fdf620c34..f639b0a05da5 100644 --- a/Content.Shared/Body/Components/SharedBodyComponent.cs +++ b/Content.Shared/Body/Components/SharedBodyComponent.cs @@ -394,15 +394,19 @@ public override void HandleComponentState(ComponentState? curState, ComponentSta } } - public virtual void Gib(bool gibParts = false) + public virtual List Gib(bool gibParts = false) { + var gibs = new List(); foreach (var part in SlotParts.Keys) { + gibs.Add(part); RemovePart(part); if (gibParts) part.Gib(); } + + return gibs; } } diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 111f88d38f3b..68ae0b44e112 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -118,17 +118,18 @@ Heat: 3.0 Poison: 0.0 -# in relation to how they cause bloodloss damage. +# immune to everything except physical and cold damage - type: damageModifierSet id: Skeleton coefficients: - Blunt: 3.0 - Slash: 1.8 - Piercing: 1.5 + Blunt: 2.5 + Slash: 1.5 Cold: 0.0 Poison: 0.0 + Radiation: 0.0 Asphyxiation: 0.0 Bloodloss: 0.0 + Cellular: 0.0 # Represents which damage types should be modified # in relation to how they cause bloodloss damage. diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index 762d80dc334b..1bee149383d5 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -33,7 +33,7 @@ - type: species id: Skeleton name: Skeleton - roundStart: true + roundStart: true #touch this an feel my wrath prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy skinColoration: TintedHues \ No newline at end of file From 51e57f81ca625531dacff78eb271ff0cac35c76d Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Sat, 30 Apr 2022 11:27:24 -0400 Subject: [PATCH 07/27] skeleton reassembly fix --- .../Body/Components/BodyComponent.cs | 2 +- .../SkeletonBodyManagerComponent.cs | 3 + .../Components/TransferMindOnGibComponent.cs | 6 ++ .../Body/Systems/SkeletonBodyManagerSystem.cs | 95 ++++++++++++------- .../Body/Systems/TransferMindOnGibSystem.cs | 14 +++ Resources/Prototypes/Body/Parts/skeleton.yml | 1 + 6 files changed, 86 insertions(+), 35 deletions(-) diff --git a/Content.Server/Body/Components/BodyComponent.cs b/Content.Server/Body/Components/BodyComponent.cs index ccdcede2f85b..406f3df71485 100644 --- a/Content.Server/Body/Components/BodyComponent.cs +++ b/Content.Server/Body/Components/BodyComponent.cs @@ -112,7 +112,7 @@ public override List Gib(bool gibParts = false) public sealed class BeingGibbedEvent : EntityEventArgs { - public List GibbedParts; + public readonly List GibbedParts; public BeingGibbedEvent(List gibbedParts) { diff --git a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs index 1a6d85057fcb..500ed2382c4a 100644 --- a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs +++ b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs @@ -19,6 +19,9 @@ public sealed class SkeletonBodyManagerComponent : Component [ViewVariables] public float DoAfterTime = 5f; + /// + /// The list of body parts that are needed for reassembly + /// [ViewVariables] public List? BodyParts = null; } diff --git a/Content.Server/Body/Components/TransferMindOnGibComponent.cs b/Content.Server/Body/Components/TransferMindOnGibComponent.cs index 9a49b1b94c3c..112e3b64b2c1 100644 --- a/Content.Server/Body/Components/TransferMindOnGibComponent.cs +++ b/Content.Server/Body/Components/TransferMindOnGibComponent.cs @@ -3,5 +3,11 @@ namespace Content.Server.Body.Components [RegisterComponent] public sealed class TransferMindOnGibComponent : Component { + /// + /// The entity the mind will be transferred to + /// stored in here for use in system + /// + [ViewVariables] + public EntityUid? TransferTarget = null; } } diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs index 58b433c3d7bc..1b4c88892c47 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -12,6 +12,13 @@ using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Prototypes; +using System.Diagnostics.CodeAnalysis; + +/// +/// Fair warning, this is all kinda shitcode, but it'll have to wait for a major +/// refactor until proper body systems get added. The current implementation is +/// definitely not ideal and probably will be prone to weird bugs. +/// namespace Content.Server.Body.Systems { @@ -29,7 +36,6 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent>(AddReassembleVerbs); - SubscribeLocalEvent(OnBeingGibbed); SubscribeLocalEvent(Reassemble); } @@ -39,6 +45,7 @@ public override void Initialize() /// private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent component, GetVerbsEvent args) { + // every time i get warned of a null refernce i add another if statement if (!args.CanAccess || !args.CanInteract) return; @@ -49,56 +56,80 @@ private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent comp return; var doAfterTime = component.DoAfterTime; - // doubles the time if you reconstruct yourself if (args.User == uid) doAfterTime *= 2; - var doAfterEventArgs = new DoAfterEventArgs(component.Owner, doAfterTime, default, component.Owner) - { - BreakOnTargetMove = true, - BreakOnUserMove = true, - BreakOnDamage = true, - BreakOnStun = true, - NeedHand = false, - BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, args.User, component), - }; - // Custom verb AlternativeVerb custom = new(); custom.Text = Loc.GetString("skeleton-reassemble-action"); - custom.Act = () => _doAfterSystem.DoAfter(doAfterEventArgs); + custom.Act = () => + { + if (!GetNearbyParts(args.User, uid, component, out var partList)) + return; + + if (partList == null) + return; + + var doAfterEventArgs = new DoAfterEventArgs(component.Owner, doAfterTime, default, component.Owner) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnStun = true, + NeedHand = false, + BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, args.User, component, partList), + }; + + _doAfterSystem.DoAfter(doAfterEventArgs); + }; custom.IconTexture = "/Textures/Mobs/Species/Skeleton/parts.rsi/full.png"; custom.Priority = 1; args.Verbs.Add(custom); } - private void Reassemble(ReassembleDoAfterComplete args) + private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerComponent component, out List? partList) { - var uid = args.Uid; - var component = args.Component; + partList = new List(); - if (component.DNA == null || component.BodyParts == null) - return; + if (component.BodyParts == null) + return false; // Ensures all of the old body part pieces are there - var nearby = _construction.EnumerateNearby(args.User); + var nearby = _construction.EnumerateNearby(user); // there is certainly a less stinky way of doing this but alas // i am a little baby coder who's only taken intro classes. -emo - var foundBodyParts = new List(); - foreach (var entity in nearby) + bool notFound; + foreach (var part in component.BodyParts) { - foreach (var target in component.BodyParts) + notFound = true; + foreach (var entity in nearby) { - if (target.Owner == entity) + if (part.Owner == entity || part.Owner == component.Owner) { - //checking code will run somewhere here - // please recommend a way to do this in a sane way + notFound = false; + partList.Add(part.Owner); } } + if (notFound) + { + _popupSystem.PopupEntity(Loc.GetString("skeleton-reassemble-fail"), uid, Filter.Entities(uid)); + return false; + } } + return true; + } + + private void Reassemble(ReassembleDoAfterComplete args) + { + var uid = args.Uid; + var component = args.Component; + + if (component.DNA == null) + return; + // Creates the new entity and transfers the mind component var speciesProto = _prototype.Index(component.DNA.Value.Profile.Species).Prototype; var mob = _entities.SpawnEntity(speciesProto, _entities.GetComponent(component.Owner).MapPosition); @@ -110,7 +141,7 @@ private void Reassemble(ReassembleDoAfterComplete args) mindcomp.Mind.TransferTo(mob); // Cleans up all the body part pieces - foreach(var entity in foundBodyParts) + foreach(var entity in args.PartList) { _entities.DeleteEntity(entity); } @@ -120,7 +151,7 @@ private void Reassemble(ReassembleDoAfterComplete args) /// Called before the skeleton entity is gibbed in order to save /// the dna for reassembly later /// - /// the entity the mind is going to be transfered which also stores the DNA + /// param name="uid"> the entity the mind is going to be transfered which also stores the DNA /// the entity whose DNA is being saved public void UpdateDNAEntry(EntityUid uid, EntityUid body) { @@ -138,23 +169,19 @@ public void UpdateDNAEntry(EntityUid uid, EntityUid body) skelBodyComp.DNA = new ClonerDNAEntry(mindcomp.Mind, profile); } - /// gets the list of body parts that were dropped when the entity was gibbed. - private void OnBeingGibbed(EntityUid uid, SkeletonBodyManagerComponent component, BeingGibbedEvent args) - { - component.BodyParts = args.GibbedParts; - } - private sealed class ReassembleDoAfterComplete : EntityEventArgs { public readonly EntityUid Uid; //the entity being reassembled public readonly EntityUid User; //the user performing the reassembly public readonly SkeletonBodyManagerComponent Component; + public readonly List PartList; - public ReassembleDoAfterComplete(EntityUid uid, EntityUid user, SkeletonBodyManagerComponent component) + public ReassembleDoAfterComplete(EntityUid uid, EntityUid user, SkeletonBodyManagerComponent component, List partList) { Uid = uid; User = user; Component = component; + PartList = partList; } } } diff --git a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs index 67cca2dbcc39..96ab3a59d155 100644 --- a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs +++ b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs @@ -12,6 +12,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnBeforeGibbed); + SubscribeLocalEvent(OnBeingGibbed); } private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, BeforeGibbedEvent args) @@ -25,6 +26,7 @@ private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, var entity = part.Key.Owner; if (HasComp(entity)) { + component.TransferTarget = entity; _skeletonBodyManager.UpdateDNAEntry(entity, uid); mindComp.Mind.TransferTo(entity); } @@ -32,5 +34,17 @@ private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, } } } + + /// + /// This information has to be collected in this system because the BeingGibbedEvent + /// is raised locally on the entity + /// + private void OnBeingGibbed(EntityUid uid, TransferMindOnGibComponent component, BeingGibbedEvent args) + { + if(TryComp(component.TransferTarget, out var comp)) + { + comp.BodyParts = args.GibbedParts; + } + } } } diff --git a/Resources/Prototypes/Body/Parts/skeleton.yml b/Resources/Prototypes/Body/Parts/skeleton.yml index 2771d602c9ba..d715dacd01fb 100644 --- a/Resources/Prototypes/Body/Parts/skeleton.yml +++ b/Resources/Prototypes/Body/Parts/skeleton.yml @@ -63,6 +63,7 @@ 0: !type:NormalMobState {} # criticalThreshold: 50 # deadThreshold: 120 + - type: entity id: LeftArmSkeleton From 0fc9bbb4e74d7dc53ca8dcb9c3f589de171c3072 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Sat, 30 Apr 2022 17:33:38 -0400 Subject: [PATCH 08/27] sfx plus sprite fixes --- .../Body/Systems/SkeletonBodyManagerSystem.cs | 9 ++++----- .../Body/Systems/TransferMindOnGibSystem.cs | 4 ++-- Resources/Audio/Effects/bone_rattle.ogg | Bin 0 -> 30848 bytes .../Audio/Voice/Skeleton/skeleton_scream.ogg | Bin 0 -> 10137 bytes .../Locale/en-US/body/behavior/skeleton.ftl | 4 ++-- .../Entities/Mobs/Player/skeleton.yml | 3 +++ .../Entities/Mobs/Species/skeleton.yml | 7 +------ .../Mobs/Species/Skeleton/parts.rsi/l_arm.png | Bin 250 -> 246 bytes .../Species/Skeleton/parts.rsi/l_hand.png | Bin 5444 -> 650 bytes .../Mobs/Species/Skeleton/parts.rsi/r_arm.png | Bin 647 -> 645 bytes .../Species/Skeleton/parts.rsi/r_hand.png | Bin 5453 -> 662 bytes .../Species/Skeleton/parts.rsi/torso_m.png | Bin 1081 -> 1109 bytes 12 files changed, 12 insertions(+), 15 deletions(-) create mode 100644 Resources/Audio/Effects/bone_rattle.ogg create mode 100644 Resources/Audio/Voice/Skeleton/skeleton_scream.ogg diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs index 1b4c88892c47..90c3c44b9789 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -27,7 +27,7 @@ public sealed class SkeletonBodyManagerSystem : EntitySystem [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IServerPreferencesManager _prefsManager = null!; [Dependency] private readonly IPrototypeManager _prototype = default!; - [Dependency] private readonly PopupSystem _popupSystem= default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly ConstructionSystem _construction = default!; @@ -97,9 +97,6 @@ private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerCo // Ensures all of the old body part pieces are there var nearby = _construction.EnumerateNearby(user); - - // there is certainly a less stinky way of doing this but alas - // i am a little baby coder who's only taken intro classes. -emo bool notFound; foreach (var part in component.BodyParts) { @@ -141,10 +138,12 @@ private void Reassemble(ReassembleDoAfterComplete args) mindcomp.Mind.TransferTo(mob); // Cleans up all the body part pieces - foreach(var entity in args.PartList) + foreach (var entity in args.PartList) { _entities.DeleteEntity(entity); } + + _popupSystem.PopupEntity(Loc.GetString("skeleton-reassemble-success", ("user", mob)), mob, Filter.Entities(mob)); } /// diff --git a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs index 96ab3a59d155..af64026c9618 100644 --- a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs +++ b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs @@ -32,7 +32,7 @@ private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, } } } - } + } } /// @@ -41,7 +41,7 @@ private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, /// private void OnBeingGibbed(EntityUid uid, TransferMindOnGibComponent component, BeingGibbedEvent args) { - if(TryComp(component.TransferTarget, out var comp)) + if (TryComp(component.TransferTarget, out var comp)) { comp.BodyParts = args.GibbedParts; } diff --git a/Resources/Audio/Effects/bone_rattle.ogg b/Resources/Audio/Effects/bone_rattle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2b657f5e6349f9950120165c8f52e4b114014ee2 GIT binary patch literal 30848 zcmeFZby$?o`zZYEvcS?yHmy-3SOsOG`^PN=qXWl8ST)C=!an zS@iS${=V<;J=Zz!b)D<|?>r2{%suza{mdOR_r!yygM%&r2L5?C;eQizx!2!83?M%b zZ)>LqHz2Tl%|9q!f05fknm0B7{oK?9p>svU{yrq~*Z=KF#rWHl5E{eC$8!{lwzin{J${BzF zC>p}A#yEs}lcEm*FaWS*YPlWTQAB^aCk;S66g~>v1nvdly&+ zrGad`fo^h!Rr3_CO)5MisGzH-u8)3v%?a4CU5qlnjIyGN z{wI73`EYp?{&bxY1QfD}XKr#9Gt(4rh!(T$?Hp~ExlEo}He z>fHnNcW74JaO8jeg#FPMbVr!-?K7QGP{9~AWNBp183@+}%h zy_-ikOl^h6b9$SDUAbh0u50`zXQ!fr44sNg&t-4v(EHooKWb5FkvG*R{t;axZaLSb z1IHYl`fi(dJc)Ay`|s+5K+DZ)k!mH;(wHPjp z*5ag=oq`8-;>s>%Eej^xW$8Ld&a%H2g%&EKZHf#Q^&caN&hj4Pe2%t?{}kM3)@fq; zng0mWU+A<+*wA4{fJawQN?%Xk(9g~Isqac#l=-6Xhj$?#-X-0qjQ;P6^>51o&_)ya z$0pOQ6Zv1~MQF(4{1x!OEXRxNbt>IxDywQEtNL5`nxJX^{W2oI;M|4Y6bv zl{8l4wA+E14skh^*#-NR#kl{?avbBIXT?8{jo*z;=7`I5ip#0$D0UsIJM8@5hJRa* zk~b?lpe;wioAo~|r<$nqQ0D4pKRsW15+B!V*I>Pfh zJo&?ZJ0RIKhR4^so)CAeBOpD*Vm96R1bHo=rfzi_on(df3Y!`7v!U?q;N00y`E71EYG2^G|JqKE9S^4uj=GQ6Po@rMWLNL$DDtIh1AK=qcD0jHmA(liMwf`s;UkT zjX5i%j>de4S?rioURi~nNf3V!=Y7p7V{c$p=-CB)gQRc%F2fGxgs#_F2glI+o2M?U zsygVb;~odl4%AYHoiWz>O|B8`&#(7_0LEUZ#Arn$lvcg{GeAbu$PC1ybs^CT$zO(V zLn4b?WThsn%w(&h!^K&KE6c@}p(CSQR;nX_gaG{0w{Vh^sf;# zD!K*&oT9xwn{?|5@m*F~B>zs{0}`e(Dztl3NoI57;!6 zBY}nyq8$z&G)if@j_h9E1GN8zj9Lec_xF1;X50Aag(bBkK6x;ZXj4G?DaM8J0G^3(!{N1Xm!~WJA{=f6J zTDf8VVP`Lz@4j}_?Kjgm91j3AJpq8L-pV)fNpV9jdZGj0%$Je;P)@YZg~e0~lU3%7 zO8I}PKL~}cgM$6DLJ>){`X}Xu`=6_p|60HN|Cw4eaj9)F0H~&-Fc8L(NrE-3`Q*u1 zlr)Vb02Bu;b(vWHJ=XLzB$8Yu4kEskAOnr;%$*}8!i z5E_Q=iisH>Q(3x60#7Sdt}7E-YA$G)jUciG4MTUu1&-`M!y1ODT#^(xa!qeaU226n zw;!lB%$wNMwA?O9OuK>Av@9^E>j(^!>7r9Pk$l6KR5msIyCzRa`oA&g@}QAj(7M24 zn^ZY$f>s z)dRGeF-G33#7d!m3S`jkC0b_GHvcLpicHfPL)W+|K$BxDoBLaXCxKTs(ssf_0K$B{Bgu#2=eQuh3xF4b2NC)rsC?Dk`;diZnZgrHd-qOf5#Lc8oG( zD#-kBC?{5BR3cYd){{)x@hlyDYi@p@M1CdlZ9Uo7ROlf)8~`wg1xTS}h_EnxKn$Ur z0tRsL@aYE>5C~qTlHNj3H8J*l5de^hoq)x~4l(i<(Qt5;W1xmGqaOkzZx)ri+EKh1 zW^abfv1OsMuy7+f1PDh=>|-?h`_GZId4;-q2M9DB0AK*t(Zkmgz|35ny}9@K8-PPh z&BVzsE<^mM_%84b0F-r5v9XRjViJH{}B9yinCrXT(}qqc#PytbaP>2=Vx=C#(f0s2Sd+VEQC+D2Xup&+M}_l3&V zpDJ}-`W)8RPAf#`@C{T2Hh_iQ!8Tg;{!G*#__(I(M~(L*(~w)ZcZwhf3vbJKM_Np3 zoma=M*_~-skS#~DeGw-7v9Xb>7{!K>y7FJTo9Pv2Ml(ox=HNbuWlmpuQ;18L&NbGEnNYJGd9KTizui-fkoNXxViL)eS! zWz~2biR1Z7_s?L2Fu{NUZyL5r#xlB@ZBEATfE9-tNmvfBLbhyb)vYzoo)?nMb$=qA zOIy?N>7pg88TGbA@~0SiVS2XSkNS%o)pX4tA?1dK^;D69bg=f-eG-f@jCEKcRoDfk zWeu-L{4Ln}3?(zX;nPx$F1@6I!uYIFzdq3j8`l{s?nym#vY_T3w#&p9;ORaCQ^#*= zB0GR_y^2Unz0i`FgV?gz&~{?Sew-5t_n$BFQ#g(f8aco9L#ZRL$3bmGKY@@(ahclR z6}#1~#E4~hWSU>$jJp{(;U&h_5iTt(55LvT5SAz;gL#bsr?`!I23aQ(I$ry_z@1g9 zr9J+*Q;YD@#0@z&bes4wn}vxo);s26;si&?p`w};#*F-k?&4UEX|w`Xt&B427Z{|+ z(3AU`^kUeX^E2i5uLMU-Y)kS_oG(XD9vR8hkVF@O#CGT!MvH6VM_Vf^8CPY35Nj{L%yPW0rrHFWEH$QfGX(13=vBKYNQt)Hn#RfYvm5ceHD#))B{T$UYTR6s{GHRU2E(Y;6dV5Nr00apPgtJu%yh=`2zg8}SJXdr*8U6aY%x zXU!}+%!0eW@#oG=KNHI48_pW2nZcT6f=o_K3?_q6d{@(l(my00Hx*o7<9%rG7jO@F ze?2K${&F-hgs+r)1j)vC%IA` zPPhiyiG!PeUUEengR++?g8(m3UfjQA?v)*sqh>5MbD+wWe9WP?+w&kjpG8$uDoEes zOJs?Ab}=&{jK3E#wpCyC)aVI?fM7rclMe2&TtgnyOD-4xJ5N`Bha|IOrl&xi02m@x za2VzT8{6lMv@?p*!gHlbgRd6pj#}bPH^z@?^fMrap-iAnd`t>*eVC4m9cHri(BL;; zfOkAMFl$6)q1L|ZgPxz=bqlU*BETvSkA1%2_h6Ra$EL)w*p{n{lc4MQ z=W)DP_$@q4lIJ8etN!Fb#d?xC3C^o|zDZO6IL{EhGX?@e#UKKpmI$n~fpwT8k;z?b z#JyG0M-4u|OGG2PyhG23vyNh;Nev~BOq7_`C4^c zzC1m5<(#|pR!*|B9=Qv|jnTn)JVIewKuW5bh;;r3m6h)8La|sDJjh4NFclD1*lZg8 z3%}`{eSEA^coH@?Z(-#I6Un+5iNG)zKQ+>ec|&Kij0W0DMc%ZW82Q9C?bM=_bSHK# zicg-jM^^RMyKEvBik{YR3>6>!+>YMz{Gnr>`L&#xrMD(m+9N2LG_UTertV)q1lMgp zJ+Q|ldju4SvMOM1*vLj%yiei7{7gwjokJAPvv7TGlkIfms5D2XpWctwS!-(mHEex2 z&!4>b^Ga#r>hk5O1j)%7hxu#vHKW&V)YqBY*TDy~stX_Tf6Z*X_9vRR+|4d_LHfMc zaDkQ0q0*Y*8%7!CKjuDvXGENiYpf*gUHCq3(K6PntXN|#fFBZz1xek=LpuSwFpiDDq<&u zs42{}XvQjH$;ipP@u@bEOtGIvsEVsf?>4?ABLP$68!1*V>s4;mzO}^Y$BknBAX5iz zRerCRWEtp=hZO~Oh}GhNVd-h#tJFI@AZbAmSwnj5$r-a1KfC|>p60rJw?a)bJBF3) z+pHGq9X$7uOTxUY+WR6R)b6(`_K0av%w7K88Zd)svk|tjXaq@PZI`%v#U8b7uw#0& z?1>2bY$GWCU0TBGkD27?Lj~C^?(8@xehMNWHYxA5R7S93>Rl@KzQ8t*?1DI*+8pi^ zjBe9k!4dg3KmCe3-nSWZRSkx=N;F$d+1sh{$r?8b{L-I*z`_d~%41-}T7&ULtK9i2 zuYF9F!(N!|Ri(WB^}MR$!q1(%Rxy7oQ#HLmvwCAMY`<=_Pc^|{h*4(ix7xcP#jU`O zxDzkz;#;F)>X_YtDv`SAQaH`!TOtkWv{Gvtd@NIWEs{)6Kqp9nikRxNaz6(FF_sD* znIDmkRU$DrksEmm!!Te^Zo*$U7H%YGs2)S_(x>)9!dV+z)_p`^VwWe{R4~2XgE|~{ zznxN;(aKhbIeL%HyfU&z#{Jtg&o5dYp#2E@&68VL(w28EIqN9^$Rr?HFXc0Sa&kfa z9E7iIdB^BRM^!PLv5`?btwkFKjP5C87*$SfPl)FEL_$dFCP>h3rO>_n^tvGIQM9UJ z0z#&T&34y0o6xUiJ>tZ^@6!AZ1%KR;KIr~6Yv1;3U*!C%C+>o`L*Ol`FTTeH3f7#6Hx(){Y3J|J7(_}@R?UAF zO36ES1A4<*jUdEcW-@xCytG}+%vkk>3p@xCf-f?bcn($ohZ=gbjw0lqz3Y;4G%Qz! zS;(?JYKwfqw#B4a$q4gGPpml-0}f|QB(AajEM|uJS(fmXWvU+x73WM$O?%`j8N(CJ zY>C=3(!ahtmb??4oOUVoA)Q1F^tq1@FtJQc0(wWPF&RX+iZFbh%M7nMyoX(3eIp2v zIbn#4=ZkMy`;jb?yEEA5pP8K>}fWa&zfJfikYQ4bx1(O!W;% zg=B18OHtE;Z`y(}6hqgziPT{T=|LhRrc8BQi7vt zuSQiWM2n~qLO#lGB8vT$nX>sKQqIE)A!G6%0qq_W`L}EuQ@msxd~cy|f*Gv<>V8=f z94r){$>3d9VqlCqjDA{?+(bFem6q7_s=I+vNi`NW%7>N0H+QcQ)Tao10KKa*>Tj{6 zj#-5E0vF6SVTb@>q|Yx^w_-gP&;k*Z%rf-7b0%={QGFB?xOSkAX?SnqvW+HmS&kw*&DD~|eP z+&fBm61X2>q$d|y8TjVTY2C?)t&?@j|RdlWd>l*@;^9lr%qf9OE zhF$L#^LlZm`t$KK(G3n}WoJQ9X%aw|M*E9fKHWJL$8LuoXkN7@MX#B@+H~3b>YF?o z0qUvIJHL;4x8P^zMM_{ub+x%x`|J7WgiI&=?+XH@OmLGsl1I22<^Z_Om4AHCwiV;i7b4x>(w@wn&47_ElWs1&tqv&p#K~&me&h$9Y#Q^6^ zs1A%1mEhUyu~90697GoM)mI`}&wg16;q?|%4(uEx=Ri)ii3Y!P;Q%6{dNSc}Xz``a zzKd)jA~{1lhgxM%uz}Cpa_XsVwUo8~(+($1A)!WiS?48g@j`9dUaSc-yb1gOqJaM- zo@cb<>t|t2o6|tIn1SDi>@7Veo@;A9-iJct?ZFdQJLCh$++O-sO+?53p`AXryRi>cMcx| zPz*+jUZWZSJcV-}WWDk>nAVddy1btB5jV>?7_uY3ZOzGAA0{#41Wnf&xEFd*ar#qg zY?u$WSJxBMThJb%XgfN)yJ*enP>ZYI%?T|P%JiZE$EM2WaQk;1++%hG4Q@kld!c=i zBRLxKGHC>*DbheDi7KS7BV6&;Pjk6dPPtsVg#9bcK?tGN?(L@}$t*6l9?iJMdoOF7 zW)%v_XFb5(+mcjzIt1cMJ3cT>0%n=3d#%sri5e;)>G&-5(QQ67xgWVRKGi;c7uV@- z;6fQ8Vd1r5lt7$S}_(9qW@79-evhBpkbgt>W_2k#*nr`?8wp3U^ z`I=PD5_oLqqBL6-*Nv4@PWVw)ttAnA1rU41PT0$Z91rh#TK$^nA+` zd4#bJp?ktqZw5RFM2tvd9_2o4SMWyCFUM8*Szxi0cRKS&=-%b7jFrD zDl2AStlUXsva;?tCHZjjryuZlqoG&xzcw0f4#^~yDcf09j7_fXuGOxsu02f*k@7M! z@-lJ;Cf9x{aylkPW@bj$&etZ*+ubCHAUPSH#SI@Yw#;(a#v_yt=(Vin3@EGp`^89W ziF1XOzADMN(rWfzc5RDV56J7TXE3J)LgZ_F!{Q-Wp7Al%0)5Hi;lAWVE43voZ8r0Z zP~9i|p?>U8l)D0NEP~c&G3d0-_t7&^Gu^?QpHF{q^`EvrR23yxZ6I z-bA#LH%V$df)1xTT8{Uw0G7ZmNdWwCOFP@B##>$&xHaIecmTxCAR_vFYm(;=p3 z@2B0-W=-KXO+vXwlJ5uh7q+!WEt>pa2)wen4|qwL+g6Zeu(uDht)1|n>@(h`H+I43 zU#h*!6?LUyqJdq)z$f>ll-%K`0R2Wq;d6p9x1-|C5ze(AUz@xI%xC?_^A z@Z^3H2^pzMvC}zRcDYzqQ^aSkXx}ZzgZA>v#wiSWr}}+Ai{O_RL+Uy0jGA#0&n;*p z;U#>Gh+##Mv^kftG<6PKYAfn+Z+{ZaQ%NmhXoNN=d9Of*9Dqgf0@~PesimV-F>LcB zOfRQK;PhzPTz^G*n@zkhpJ;%~?Y7qga-*^NaH6yn&}VCuLM%CLJw78a8i2kvQxESY zjLkwXWas!c>Q!NgXGsIBc)b{Vh2L{_*7Z3rlVkGL0hL@sGT%vGSyA253F`?pFiQM0 z4cp>)Q{HqY$wbLrHfN z$(Qu*6xi>v-ugiA*hWzs*B;rF)9tE+99RoVb^%Ztd9m;53~KgT*^%6Qb)kk$E50#|>)2mUuteC*oSUdy|DA8d+fb%PIQL;z zvNbhgB#hHE8fr=_eff%0cgK+({K-hfQu}s#ASTuQv>N_FXd)A-41LbRY>XY$i5ml! zMFy578-rOx(qya77@_DzEvH;_ak8O(Y)K$fxV?~y49xI&HL2j!-q-Po$9IfJzKuK` zc25z5I&28E-8FiVVKe!50cp3k^-C7`Et;-|%E9)L*n8kbl@u|BSBjVOAtrs7@>OEb zgI&IqdbjrnN>CZ%giR@a{)7%8^X0o(z=i?UiSMLiUC@3|;BIrnY|QY>=uv_1Z$ukH z2U>eLHP4GYCX=O_hL~huIb8&c*Uj#wZLs)xtdL?pF%Ni|D*s6T%N&Lx-;;3f>3H0PY*mku&o+!Wr>LAOj(A?+%}U$b)D$gFZ|9TL54xAC_?8wD-UG}Y|jW1ii)BYBJ_El!OL$~?X@RQi5}P-mCO>| ze_AJc-#RVZ$*`M+1h77Jat~FB<5%n|DCztBb>dahM~@cyjUU*dYa*vF$d~ie_9wMp zeGz5I>uZ)4P|z7=4)*{4sp0GHd)pD}${L@SqzO7@WJJ*7{zwW)q@vFX0evaEz?Xxn z>R>ElT-X~a4!E{$<=U3(IzoU>d{JIqv?xo3hy~2J-d~(wLAuL@aAuTT5;pxJZ zfrP82ATm|wl8b}##^2ye7`$fbV%I3^BEW+3C^Ka>klA9m`%;ZkaFdK+0XAgqb}?Yq z7`LZk1`!ZqF?k>?$7gTuNG6nW7;Yl{?j3@P=Hz&CW;P{($42uW#%rS?ES@ z5uIg(fl{=yd|8dgEf%)oUm{qLqVD_tK0m#Ky`5z|WHR89yn!U_4dW@n4D)e9(b2+l z;e}mdp#e6_BfVDT3YOo*T^=!|$^9a80l1=!?rBSIJ+3Fy2jgKWilO!so9vOBT%SX_ z*TD5i3|A5v2o|J06~P2#Rka^uz*_sE-HDKvnD(7xyLy_&Xshbdk%QCD^pACOW?GRt zyp)J_poZ5!7BaR7(0`N^e)JR2qo}OW8%<4d=MK|@5V9^}Gr~tL0ndF<(aGshgzDb5 z@B{vX6ny7>7gr5V9deTLSa^z4SnMb;L;CxOA?_aFDk6@pZ@e_nz#j)&m-nN(hjK*n z19&)}o^BgNU@f^aD>NXaJ9X*zT^*3-7IuZ?G~=0ZLKxfJ-)f8IQu_4$cFy^C@0~Jhc;v7by#U46ruY_7z#KNzdk-&(qc4G^iE` zmr=ZcgT%gZu8_z6s1(epJISYkJlr2^LTD#Pn2ze=E0cqcvFoiY<9a;=J`F-n^)-19 z6Z8+FtT+!z%7VT|w5T>sF!8F0dB%h%3%g-Tw7y0z`^vEEO~6hg$EDa)p|&+|L!!+Rt? z-LC_f&4?_TwB^rJ4vsU~q4-x?gO-nDvWF8W0`ViC;4h3wUdgh$>MU5BHBk^oxqx)n{N26npm7_0BMAh9Px7y zZ~cmG_3KrP%@%Xu<1N+E4-P-i8xK|#AqBBXI@a^kDTQL z@zpemxl2;lE*T3=nVDPX6BzLI@OCw6LyC2Eg)$~KhM;BGOp)ZUDi)~nr^Wya`CIZM zI;~Ai-RG9g%^(uoR9wUva|$#;AQvlLdl+VNDu22a5L;cL6U{Wi=nB?n20U>w8bBm! zItn`UDq!GlYtqqE?6<`k1}4piE#EFbJjGTH*M8;PvdkNmLZJcxJVtd!H~`;b_0gm2 zkRfK3G?=x_Wza9Yt@$&K5fgf9Bpvp$7OogA=G#pSm^{aj?7GVX_q|6?p1e}wtlOl& zJEm}f++Oxt2-_gRz z>{C|69So$eDCHwN`gxZ7m{-uqI-DeI%R6a*+Jix1MWog7-WZ#&g0{!XZyoA2JO?}E zX0D#To|=VutYadcETYcAlPnxO-qnct2p}UIx9{q~BpL3v{XX;=wHZ+G3UFhB(ID0^ zesWy5J-_ZRmhbPpp#5b3Bh||P6=(C_jB4P{gk)r+z&_{BjEz3l3o?nFBP42{lX04W@DZx;?wo^bS{f}IU_R5T(eRv*562M zL0n2gosAcc%Cx+3%B4haywR6(9;w5eXEh?&dEYn=Ni^HNpKrWXetGxPt%n|&_s>U& zhiDSwJDTX4RpE1=BYf zqS``8&-a;wmqqF1>FY_;7jpO82CS61rAKfkpua9KfB1ImO_s0VsvtEo`k$$`j=1WX`TXS!&SiXVSb;Sqv-2mWLfzz z-?WzTF9~nwAR1sRz))3%v*dN{z$SBU8`RT ztP!Ix_I{7)Z)DXj3+PyQ|Fp)&+=?=Qf#(I`%dCgP^k>-qA)l-^BZm45JR~Ij7Pa2sj&{-}U{xQ`pYBBHdF_?Cg}R=v1CPltl&b<$1LQ zo&|PgHygMZ&IDyFerxTZ+KzLgxukVVcrlc>bS3D2_|YQI;y^N3UeRlf*1VHEKeu9| zJe?+AqDHEgJqV9*{v*Q|^0J`tJSPa9F=XMnd^Lf_hVep?%w92{*Z&3U^Dw z%N%1h_h8r8T|_Yx+mQM}ZMq^sgq(WW12eF~lGCG+EuP8rc)$7mlvux5KeTK%j5hxRxOb{ok*c9$=FQ@Q2@MOM5%Z?q z8;vnC?OGa8GdYQKLuyz7+g%xcr$~Z%Dhp!T#Hez5H54dfEzlu#H;@!$*}a@;$Xq*L zYahI}8ruR!0h^zcJtl43F0_iBzEY&CsVl#Vc^H@XsjXcY)bYZH$zwcWXMY=nV)@|c@3=N>ei(TBa^+i?jXS-v8{wgE zz2^V6ws8}ds9 z8usj}J*c7*M%37B565PIDHk`_RNeJK{*(fcEhFu+jcFjRqJKVl4*wWR788_AWET8P zk21D=hDU2=E8}zIJ~Cyd?FklBx}UokM*450J=M^dZ>rnv6B^OtG9{KY?>XV4NZABI zg;?E@ZDe9ns$LCN;y36DBW^-7zO2YI$MFNxVkWz<^7@xEF>_3ZtvsqlHB#P*RmlXO zDqLx$@^Se90kQC6{F$osAR??18!ejN+ra=#05-12B|)cY9fHTD%DU{3L8p6+Ctca| z^)Y%oIx-Y8h#fu^d+b@EOF$ySnQ!G>(e>-+<6Rk^thx(Mnx*opADV&1<5_ozC3g651V4suC zsAVs2ImGbF_VusoRNgQg32GH#&N_xhcW;3zh6Upi>sqzUjkpum$nPBs<7EXh77v@C zwrOBnirpks{CJpP>(g1b?_!=X8?%VKP{5ksg|cA5DASHsv^ued2JRUyY#C`}&WGs4LfIvmt!jhRuyNN4gi@-x`Q914bI8z@5( zPK5_!PT{!4xc8NOr`xIwr19I0F|r$grU2c`0W#%xZpE@Nn|$3?QM27!aG+9vTdE#_i5xFW9iVQ%U&;skZ7m4DJUKm>@@|OsfEl+u7 zXLrn^7xm(sBrJIu$?YNbr(b#B(Vdk1xZaKFkQ^@Ww722u z_n&lK<&@apdvG|q=@1nGpWdZ5F)ZaFBQ+y0I__JlNzIot6f`mLnn z{)4=k$3trDKzrVP;wZD8oAD7}iGU$R1lNieN%Bj}jtbq_HV}*}m)YK`F$`Yup0v80 z!@W1VuL!tJo1kW=bBS-w`gF0F*1kiNEthUop>SkuZzy~wAqi!v`sfEXAW0tHJ7Rgi zA0JGcy@=B&#U$uThiZuG}xd;p+d1+K5Z8F2=;f0968%7x-9->L9w@Z3j2QT3dP z>!c!|Kd>EM9K2bpFMoMB*`0E)V5rJ7Z<+E?V}ncu5{&{lttlcg__D=qCs_`!3Ac_o zUb|+}48G3a+z*c=<+b_^o~s%m-eddxRuMN~Sh-YdSm}P|05YardeO1?+ZXQzyKR>7 zyklAK3cdE-o|)$+EZqS`WKviwr#3O7)x`IGF0h0MTRu_a*m`0=V%QZ=+QF~0zN{i?a8CQF4 z4=?!YE1-Ajn(pk*emAb8C_yGAgV=-=8+59NGY|!R%Opcw#d2p9lRNx&+noi}ly+iTa-*z4%CVk+<&omgDot2dpM-KqZ zc`cV|4H~ldPe=LLAJxp~J#(j4rZTGZw`^Ap9#Be_8;WIH*z?~Ga@Z@pkK|qcIn&18 zecigxoRRHZCdNC)-zb?sL{^rTP~23pGQ2d!+%q=fdOVo9@Z^?KeDNoA#!lJ*> zkBEV)cixsFem|!_aiaq0rORGVt{`df5l1b)bGg#}A^(!=VQ1lUfePE9K@#WC7BBZ~ z?cv6!(#Y~_f37{66+tkI(@l*K;CQT z8&6oh;meU-`pEGD6wab6c#rs%{5H)v@LO!~Wf<`t-m)2HoljpqpcSuEU!~nkAC}=@ za}4bY=m`uxTIt#Ibf=tZ6&$5%3XRt9Jm}nrLJt>NL+H;edni_=FV|If&K8oMWxJM4 zFDz(oDn|BY-5r}Ua$|Oys>zhzeH&tIOBg86vykWeu91!;g~?T&W~s*{8X4Apm-{r# zHx=Bh&s|Dw38c)d_)a%0Ni0qBo1$(Zmo6+&FE1Xb^MeIR`TQ5x(Cusc8!LZ!GKE`9S)5TW_Oh`~)} zAr{FI4ilw7Nn^)o1u0*F(cXi7kM{Z9t;i7iNH@PkjV73bgtrT?U;@87KJaFKc`3rK zY~|7Iw?7u@u6;{7x;(x$xo(w2Mz{qAxWBk#_wXcun)>3v?@61+nx-aA@h5LGUvo`5 zxhZX9+`~g}b+0Ne+_I`+3W3yUg8>Ob5RcsOU=T&B2$nNQ`N;V@Yr0wV?PAU>jn*Mm zc~t`n0H#(|No^o7I;2NoZ|T?D;@EK{Ecj#5;SO^qGudhtv5-I|AyZmMkE{NxA1=gX z6O8is6jkIjPPBI6a|lZgoo5JI(BtFBqaYB_(iEkN~^5DK?_X24-CdN+uy3fYS13{~6;%%8&dUCUG%Ei+|MNf#$ zJaEBu=Yg6CLfS4fEUJ8dXPJa)$ESylSy@!*1K7g0#Jd9JJnYY%;8Md&3+lI(W`bSv zyL-X2t@}XGm5}yUHFL7k+{*iUrpp-jwGFN{ZMnn2~Lm*ldsdK+b8gXl{`yrdXF5W~sQb+z59WMt;tw^@t3m-km* zu22Pi+X{XedZo-GO#f72wEEeqk7s>y)Hc4O0s*BLy!tMiViBHau4{x5#saWj_8bb;KRTMX5gz47AtLBqa11KUh5>Z*5-PRYD=M!$_&9N+ zY}iWGd2JUmk}t!H@G4sHl9bvZme?arFj-4xK5!x*FcYmubvh=|UtF3h90(~RGo~iC z`6Md|abUYs#blb6L=epRnuJyOf&L1E*cV0#l1luuSLKC7az2}JCvMaspUz1Mlzx=| zqEmc1*EcL7Dq_4S-Sw>(g~^DqeqJ^#ch4uf?YQ+SL%{%;`}mL|l8(XyIP8m!~DeDxK5c>54l zpKYilpWGD)XbF?eZHnG1cOx*Ov4IGkzFw98*yuB#^AXBfU|2G?n}l0^cAgSt4GW{K zZO+-8>>R%h*@0m~id6K%d3c`hPH=D%=*Ry6xq4HPggq0)^jXCCh;g=-T}k2EVLN2P z)+{eYY~C_;Agm4YMww|EZ)=kh(Z=>}Lh|+{7ZFdI!n{-sHJp{nF@EFK=z$EEg>9C;p$5^Q`PVB=FFg_ z8f)1Os3E>DDoH+2M+(=LynpL6vb9p?{+aj*UVSDknjGAMVR50fcFflKoG9;(Q8G0% zfkH_e*VDJ&fx4GAqB)~g5_a+A&G9^3wNk(02sQzvRf0#7fh%PV6BaNbeE)|l3vt1I zvbj=s=dx}MSF?Bm$;Lxar$O{Q@LmE(@YQS+Q$uEag+odY^Q@?pgh0T(yHg#{f`@_` zdi`Ijwpb)k(Pao1>y|W@@Y;g8%=i*yWvCJtX~^{76oUa8(be8Ndc5%&zu$!SH+r}Y z$OsNFvOnh13^@2og!b@0w+bu>V&VWT`_JR7_3UbiId86f8UTEofl1YFi49Yu<3DL) z2{Sw`dCa-Y3U>JEvR^R4Y*N(MgAyA^WM z{*a@}cFXF{>5p;#%^}a>*#RM8f>}$>fy#>V;(~aI&B9{O!1ghmH)6i|Ir;QYFET@E zg)nfv3={dF5Hf?(WcN~-koAT#RWAtznXRU#dc8oINV=ppOwhgd$5;gi(@uJ4hZ5%P zS}{`KHG!ar%>g$6b;1}4x(wNM5qbDx3I>^Tk0~nL0*#1jhKO6Nduquof1FTy_Lyt6 zFj0#-rFMu3uQifwq94~fqn?cxWFR^*NV<+?Pt?7ANBhHKmg%!+SA=pL*8pjr9}Ufi_(}DOMp*9;2|Q&DMPUn zM|c=7EtNKz`2b&OhznT!E$T_0l;AOR1%rJ$(T_bsV@$zTJXDPe^_8$R*+y= zZHe%U0pnn5>fQWd4v29f7_ZV^Ee2Klz%F~J0Ci#NLfFdp@fT7SqTp@Cmux=k-wO9_ z?J-h*g57&^-+c66|5&5wW(kAdEI}V{Vxs@HKP~QOH?=TTQc^TAHCK@{G(+#7IHGq= z?4;#Xn;PiID=8@C?T?X&lo4ih3$}6B6c*zOs89X?neZT?>C*Ktuoz4w zC3G%UxP_3CFY~XsrYSGZwvQg@oi`df<_I(DRRAwmbte5k@KWA+JXB4L%TMtp0SbG} z(P~SLb5~#sT#m+fML}m#Vutu8xL*mK2ES{On zUR7q*TvhQy1{!mVbVU_6AG>&AD4^$4k+E0(XnMR_*#wuY$#u0ZKHdalrcMun`RSLR zH2#X)9lQoauJ)szw7XBZSV+kND87JQnUrvioFNajE>AA42G657sj(S!S`1X}+|{$K zXI7as^3Qc>dnNQK!i>wfz8rsj=;{`=J!}p)BQ$lQ8?;#tJj1FKM?^^p8h0dNWs1HQK@}drH|vBWVyB-Z$QU9WjtX9sxu`RjCzlB zlIjNGUyW(lb?F&$vMj$Wc-c5zlP6>3a|?xoXGsN|DYv)T)*9bs^w^7EE4a8=j=p^M z)l-UMTR8wzHWhYA$b&~=ryRGN_6P*Q#k&}@wC#1uMqjkL8^+2ND>M-VAXDS5fO4)E&N z@9vDMR3@o1w=B6SISZfmo?En@kCW;t>+`PU?CDcnC+D_&=y?%z_wlQEIUZGWa_wr% zL0nwo&i6e7Y{oT1vdJjE^p@h{aG4Y6hhX4rTXLpgY?VRRX%cSL>D~8$HJ`BAWtpfx z$xI8Qy~%KI1oA`gPKou|YEjM6wwusPS8|03?|Idrk}HT}_icsL407f47f(;WJX}sH z(Q781ouM|+Db(hpX#k;>vq}og1(O}MjkwE7(`CsL(2RACxkw|*x!#6vxx0Cgq@PS~ z*0OY_OEQ`{+A@80vX~y;(H&i(Zv&bvuBZqPv!eO3^nBpNA?T9|c~nt7-5_Iv5qE-Z z*OQ9K?K*sskBbl=OaIPrcM6td9@*rFz|(LWh=o9HK%44^DIYsgZkNflHaQa^L+N7A z#khPuT+$^lo^0yOYrl_+&nO|D?;q_0=(n_^jn>53uT?jEJAyVIErBZ_OEr<01DJA; zp~)$9P3>n}$Xl98zk8r_uV{A2(29g_*qa$!=GW!7l@6tu$5N1kK?q!_%1&#=CklrZ z&k27I+elW>o8@y>M}H9e&rkbclM3S>p|zJfx1Kgl-7?6qdGBS>nL#si_*O}MrXJSl z^7=IY+sSnl9goGEd!0VN*r*pgzZ@if^t(F%WaC)kMci3Ec4QnKLZnOgny}19_8#GX zb}DhGU8;zoiftLPE^Bsw*L05(8Tg{>x+6JvAVJW-lX4~UypUhf-%r6;K|%hj_4&f< ztAQLKEb3N0u!15bBg6nj%vHiwW% z5aZCnTf9apqI%ue`muq&VHN#&0J8QAUjenI&BhnKs<*QP+*>tG+eTH9YRh`$##|Da zjTQeRtuIp06q%(^o*W}QsU0$ zdIut5n7v05N&$f&HUXF@FtwsV5XT^7h7z#O>P40@Vw6_|B}70F1Rz4B6#yXycgr>l z001H|QV59UM5qW*?7_AGj94rXD^eRI1c1yUNdU6(BEZ7rds{#M?%M#m{bM*hiPE-e z?8N~TGqNKaWDxK&xUkyJ!~NDLnVR=UO zZ5`fQHhg5QQYu}FNoFnyVE!t8J|yej8U}7KuI75t%gpAo;nh!{t@WKdu2?zr?-t)X zm-+3)W3#nN;@JltptH_iYV}aR=-Sj=GbP11Ll$BsB^Yp~9mIg?u#m_~AhM!f)x6iT z4mGr!fmp~kuadhx!V+IgAu5G)e$VHw-f75gXt$}3TKA#V zsMFofV38V9TDLjVNE#7aCf-}_r&n+il@lpmX)+BRcS#c7s6LOW2SD+eZ9yBxp^7C-}-Y0#`Pn4%4S8G+VnN!mxzx0!lz7XKh%zHKt|<)0K@13)f#iaKrL#HKI+a>RkPum}xA)d0PtLS$ zyFcEI?9-e`tb)Y`$(Y5g2rSD20KPZmKmx=K#E83ZfkPk@gx`P&eZIy0vAg?+v1GJk zEMnNF_qEZCHVzHSWieuxc>n;^=g+cUncco_&DW*eC)b+eWqgCdfy>yjjLFlSl zj(b23#0&uag)<{Eqw69D zqxWHE*2D3=jq9y9$4^g;*QPX?y7U?a@rQaHR+ZD%%>Oot{lJ({bbrs!ob zWYctJK>{~Bv#VZ~Ao2)oKR*IfBZRgVJO}^_QsYflAY&FaAwkqfb>xbT0Ojbx2-yO} z603sC0cci%3{X4ge<4x_5y5~35&&VUG&vQip-i}}%j~6R6oLRVM#WNP01---SDrfC zw;q}C9E1!p003{A3FaHA&0AbZP!?VwyMFR;oiDK_@c>a^B?kcH;dBHDB@0%o%XuVl zQYeJpBUQsKtw3M&Y!Ss_G;{{2)<`(bQZG65$C;CjPbQ<|43 zsO&=*>T5B{znuZ$WI0$v+?I$Y6cx?|-oX*bFb=(10o3h$7AUbC*Pr8w7Qh~twebVk zPz-|*wJ;}5_g#OXw$ z3;+pZ8L!v^Xcp}70T@}qAQJ-p8DJM<_mv@QI9*5iqN?ycG4+U)?wQplw4{8`q>4f4 z5HQ#ipF#Q+1^@&L#O-LNjY7iG{I(s6ZJUu$@LqsbRS5yN2Yi}gUD05!mLvUfh0SEX zp1$0wy=kOwH7;*0vaGSX5?X*%Ye}&8tfv=-H6>Oo?tHL&&D2CxOND0FniVX*iG)aCrjerMUNknNq$7mR};I<(xobx*c; zQ;^#n2;{-UcRGqK^+9=G-W1)3{Zd@avxe&qIpc2x#Xc0>*cQ;L0^}x&W`O{^V(2w? z2mwJ%XsiXfh)6~NayL{6hZwk#k)ehj=7ttX$WcDXq!pTf0039Me0Xul^Njwne7tj< zbNiXe=|{BiKA4mWMVP#?IZyp$vDaga!$^5*)aSHdymuU?nFX@nM}@Q)>|hU zX2pA{RSlkh*JD=xx%n;^tC{@!lA(%U%5V!GnXcEi<(z7$m<}nFO{UdF=y-d`ln77} zPIt^Ok<@X$%RDTGEb6*;-+q5JeFxIgTQ`d%)blE?Fo~U+X!OeMq)CD4{t!c_j_~VXHw797uG?3~v-Mv-C!(DfOKXU;P5Mc!#fg%(LjP?J1qckG% zGuJ7@j>H*pBpG!g(X>~IXce~W5HJ=7kDHE=Mzl#Rc8M2I5kF*KJfMJFZNbP`S&rl{ zs)2~u!bsretYa5St+9P@Kl+QE)j)Ph8fbvnG(aCfcG4UQ0|3ApU_unY;uTmCfMfsw zv9b!mBFO+2upqQ9i`clXRt>BSMgSD>Qbhs$?Mj`oWOI~29>3@-sD^ZiB%x3J-gxR> zJ!a8XF(I%i>s&`Kd!8$+<$g?uy_2sEZ&UY4AK$TkzAmbrXwCB2?jp5HNU(abX1044J*;8=>aFoWKuGs)s zFlYU7c?fJ#QV2MGA5!l2_?m<~Ro5^_b-Ohjva4lRl*?)j3W`M~(JL?vW;tk5RaC&9 zH)F}Gj6kcG&rXF>7zH5=`U;g@%0L%{L!RCmTL>g*_x&m3U>wFh`_52>~A4T+X4*o zG|CeI3))^zpgrrBV?lcWB9xQ}^gG~{)8-duDN!@8p0D$%UN2^MiPT7bBU^U1j>q}bp-{iPZR`qz86anrX62@T*Ft~3i)!K1qBf{ z0OaXPgJF{l0qJE>SDKaLAV7KnvhaijNC8g`V4vZgxnUly-W-r+rs2@C8i$BdZa1&B zI>ORnY@-|5B`c)pyM9~hD9?!{H(E9MvtI+%yC}GC?H(Kk%MW{8%^^Fvg}u^dLzo&4 z!1SB$R9Ko6;E?}*c(U&1>x+x^7uM?4eg7!8{ zbQDX@uonT2tT0k&V~GRQ>58Q7dE-_94TtRU%4Nf*gbGBd8@V_A{_LHRJY$SNIX;JAx91XEn+Y$dY(zq{@=8{_QDV3-TcOe)iEIU`Mi-Ca5o9&1B8iiiNIqM z@UN;Kdr|pbXRqocM3FoiXX{f9JEUi^1ab^+_w;c9268`(RR%CfkzdXZH0Cr0U{;kT zX?fgHMBOCmSqgafY5lVK?cVajT2esu{NCRCp*yP|6t1kMESXtYdFd3f>nA0bLAA0b z)Cy{;03>G8D@2U6ASA~u_M(VIRI1)OQVkUPbkbu0)CpQ2P$Zs>h0Gm7`T;fvxd!kk zfCm4*bpXM@e#H0d>ivVbd{UAxPv@eJ5LPr@AoaacaF{X~2c?>DHP>tu%A_JJ zR8@!+*{9YbECB5Nb|z0-r&d7Z8h<6#wtpEbNz?t)$(%>Cf(|b`XT1)F6 z2eG<-Uu2u&@1GTxO_miQ!+B*XLZro^B|>YFJ{Qj+L|T#ACB@f=i0@m7B0>NJ2FuTO zTZTw-haWgBx7ZCC2;A`lbXyxK;N@0AgU4Ra{#6{_*j0Myy830mpA7*ebj=1P;H zRT;2I4?u8AVIc6834CaCYy5psQQO4g3iI8ys-o#R3IVEe`c^`<7YyONJM$%VPN&)H zqg=ZH9Qul!WV>sW(jd$ld4-9wiyBLc^Z^KyV~oH>fX=U*#W%nby_(+mj+YXPCuZl5 zqbFFCE4Bha5hC>ti2|f84d=FYEp-7T0zFRIgf2CXmx^9uP#BL5PUrDZbqYIL0KB&?JJWDCTK0|O;6tx(Ucvi<6$F#t58S9sFD8)Z3?D&I<(cJWU>5kigXKiaXzhN&@cz2xE#7xbX(srZ+aT?tE8N zgt=KbwE_RG)}s_6xo z=Zrud8>}IE#VjRs5KBkwTl1&k`MGy(x!i{$qIjY#yr1}JT_FmcVAX{vT2tnw`bjSM z#HmR|uR^O?WLY#qZ$ErcKmi=$N-d~tYmz1<(N>7S0Tyuo@ACQ~w`di%1`twJ-g~LE zM$uR6&C-ni?CzmWU0+%5yF8bn*B4fuK_IWzB4Kw?VD<6u8ESp6NRJIaivY>7jU0nS ztkoI;6b7&DK#7nL|BJj52Mm!Dq~G(+2}gnDFsueZoZt7Zx1}mZY7ws0TUHu1QZB15 zE~l4=k_dYksj^$!!c&3Q7Oy0g7l_XGqWHB!SUv5qRP?AKAXE($`gX1$!|s4$-$GnT z1(lkOMmeARhhmqRDR0CC0{vMVO*6BMX3E?@-qV#!PL0(db5=86Jvrb|Gf zttb*&IktxI0c=t!2H@oa>~$Zb)|q1HlX;rOq>`)zAx=vss?N=VZLtbM2}k6)+)Y== z`~7086C?ulP8}*yooWV!dZQz_JD3Mx#V`y279Ak{g#SEpw}z^gfVXAjSnuz$22A#V1kJHdj9wv5r+~^p zaL;Mx?aYmJGB`N^W{Im)G!q)$W>qw`ZDpG5aGwNFg-F7}X1-Q<%&>wamiL?nB=STB zB$)yC52wRy6Ph9~K{?*!_q%o2JuQVXM&LWR5!=F?e^%GtD>aH1m`JB;T7g9WhXUD6 zWWNo%E%`g2do2JI>I#ApL6Q-h#)CIa8VExOU_PH+e-tZI+bo~~41)~L5ZMk%k{hEV z`lFsc1AL?l1r+ULp_T`Zh!D* z`(*p2qI~}u3%O=nx1t&mj4fb64ehj60tERF5nFhC5<`fiXHNkX{t7E?N_d9UEc)~r z2%UgrJD+v>eDuvG03(Dzt8_7l6-F{*m{M!A_GGD8nJHEo>qIRQ-DPXFV_fGl=tYCW zjqRGE2hdtVRNH722v!6-HyqLhN6UZ)`ZhPr34`KYg8};X0|5AN_Pi{rdHVVJ-ROtd zXXfjD)JdxrsxC7nS-d9!)VNr;$QL66^S1aDub2OMe+W11aKjD1-oEDW>1$TT(pZq zV5KX`UV{Re4y*bWb0@<2@Z|#dV!sV!E~VL*PtWWnCPd(bj4^2dVnJdprm`?$V1qGg zs2p`Uw(Nw7vr925Us3{asT?uLBSkkw-& z$Y%QdOm}7a&&!9)$|wCqetEs(wescRvRHpUzCFvnT8Aqr!0c?>ES$8JD#bH1F;Bt> z0GoHGG1?d0ohkU*@MHKEn zoQ37;lJZ(2LAS6YusCn8Kau9?7(Yq3XA#Gd*fwDA^Hf7Zc`b?^~2+=*neB{X^9d zi(ON38iWy$4FDDlq76q2v;u}?gbPAx$ui#JSO8!xVXCbx%N&GmLJOQ&8euSi7Xu0x zBg>LypbHQ~01_)QjpkFY5fkQ03XC9EVy;5T`&LdrU#SH@V^qF1|4X=;h9+DmL%M%L1DK)P@{MAbo2t`773FMe&QZDpJ`sb?R;GC_%hRZeaQ1SbrDUz zT&FweGL`DpFZSt>@wPeVLY8-K3$X^FWub3EsBO(CgM~!8)7&=fKl%dWCoQdIOD`)_!^W^W~g%Z~4AaqdIrVMS31f#=>&! zIF`stSu_Y45yb-DSxjaT4Wzuhuo`xo?3p~ssd9h}0}Uhgv>qrgt}5BuxDgOgt*{&G zr8n0?zp5psMUJM!W^#xt>|OLV;Atm8ywkrfWlsYPO*`mKnh}XhuU?R99R7f&X9sPXA5+TK`f1W}Y_$sQ?_%ROs8@kR}i44w4Lg-r8oS z-1MBDbw-Qi+xlq5Tic3+U}hF$CIKLBYUY^oH99)9bq;+`T}&)O)#=s1|9|{Z-2b6@ z_a5t#&G@z6U`bBb4>Vjmy;RG6HV&@!*S*S)XyqN)UPGvGwbmdZ0aqb%McKWtY6r>lT~%rJxWc7czv5K$$XK?J#XiAW^{AdL$@pKr5uI zuv>&e1wd*HcwOW&j$Nn+xh+v3Vw7?T2nB{nu@$I5fj~)-5h)rwBl_+|>Vg@Nj1d@c zEd~%cC3g%MWH0-+F8~^^90HcX28IG4qiI=?-!HkJ!{1fNF!LSrq>$@^z$^ubf;57| zPpckXW~EzMuggb22?hQ)BtZqt4nkNg0q*m0sJ#ccfzaXY+fDE53F!J-6U#PR--u~Z z^DM^9v=b)|4gdh;d;Q@3nAdW@EK_~<-+%uNFU-mH-qZMDrm`WGWh!Sso<`}?V)cGY z({RbD)rur)Z?Dy&tZWAiq6VeMYEU#WQ1EaxE6cb8JZg{HnN_)XeV3=#j4DhqLnp1Q z?!?teDdFkWEV85WKqBS1iat7UkRFMo(E=m6ib=O_TOH;w)eOlDH-%10_;p9BO!oZYT3D@jRisl zEJB#Tk}W*4k*JJ~1Z*(ER<1_GIS_ydg-4U6h%L5YD=hm&8Bu_maoH+C@0o;HJ&DZj|iamdDOqiXmwdPh#nV6V~nF-1OfMosZ-di^_@w}|0 zNqbIiPbQ;*->Fk0sXcGF=2v77fB2KXdGPt=$I)r;&0ww;O`EDV4tiqM61yTZ>jS!7 z7QJ~coq)1bmmZnwux(|uSxD5H>^5fdi+ax3`i=4q&CBF&L|`A(&-J6~#Np}|JYDaZ4ZBATDIj8_ZF+Z*c0z9(yq$>$ z$O{0L1!fUo+brNoY%rPz7B}R82kHhysNr*Nh=2y#4*)fMeggo+Zy&b(?q?4HV~jc4 z)=If7iJ6(0Y4HGn%$J+{2`( z2#}8cY8IKOlttmcJS@yci^S+mF{h_ah8_?AF^E8!wLXyg&51ok|;SN8cYBH;6;sD zFknw$jKFe43(BQX03If>1z0wgwS=hDh*elf;J-nhIj=hthaL+sA%uS&xBYMbD=%H2 zFX2d2EjP5o;dN5dNDxyww^et);oaJNsvoEn38DLyliwy!2%B$vF7x=Ixo-okH3Th& z#r=^gxRe2aB}4$M;q<_^8MZ5<^x zw7wl>fzlyFORc;6hvzHzDQ3$SCf5MoPH~Xow7S~0yQ2-7F97h!A5w*BRSONUyihx~{lDQ~hUEJwuZ7YQNg3Wl> z)z=SXZUWi_0`HGze-Z;qk27B>K{^87?u=PDo7!= z{1@9RL6&ah_a7_{i<{;HVS=3!e_m;@JCzDA?=#2ITEcP(TL`S^?S4yLJ#Mo4C2Q2@ zVy~;~NwKeo`dgOh%AvKEUx(*4mR(cMh%haznhdqHnxrcw1fjhs1g!#v1~mS>l`VVI z10s8;E0D(hLq@sO+TS;(9^I~nkE}bE9KjaNLQ9;O^ z<(DNah8+6*0{{R3ymRgO`%h)Z&J3VOA{rtazBN~)CYfnwx+DNZ7+s|20f<~5$pEN% zoa0{kWDQlRe2~IjXoe4S_*^A5QJ!UnzO(nAuoF3Jf7APwk@_|LGGV^CdRl!Zuj#=_ zYT-w0RF<`>qLToCYLa1n%vH5DdX9KFzJK4$x<6kln)U0pjvhuVG@@S`u{a24k+X!s zME4bE7jya1%i!33IDfyy%k-9k&{?>0XG-K!@Y2&nvi^F@lF~CZhR7N4pHvmpBYAqy{nhblJ zIh^?)RPTk?!=t_DR_{9k+ZGrTNw8gM5sr)_SuG)i6%GMliB*7CO92K907d{S1bDRo zJ~-s{0;%mFTg>#CHw?f8)gCO8&P1OVg?^;nr>HfbWvx3r?L>^3#awm)0A7}Lzsbkr zo_-zg?PsdNC7J!2?H`QoZ@1nO>t;?Zv)*A-S-$st(lXdSU2iPM4?oXpX~?i4*4JX8 z`R>iGC!p6w3Y7z^O0RRjLh)`%lD61{YhRA>b;QKF$ z0ay$Yi2f1_W59$U04y*TUP1wJbrH*DDUKUxG7vC?0)cS^van=SFy{-_)vN^>r^}%! z?}GqnOiEp-EFn8co6(h)ELcW{$iVtH&fJVo*D3}E0RY5!g)qK2WTgVJgAU|A4~HT~ zAa>AUK%aN04nU!svp!w>6ph)|t1E=H;xI8Y6EiUYpjTPWzG}zZ_a*!6!q5HMZ$6lM zvHO^cYq)mY^kXNl?<}&o+P2-E7|uA$>iK-TDqrk-X|a>k)7qtrFzi6iW!~?oT`1i- zE>T)NKB`E*1mFw7eH_hO#H>?ean67+?fc|(1VsVkdCQQQWIT^he>Ef-6B04qw~LB! z*$#coWg2z-uLQNUn?e!0w6^jI*lzt@mC zT?OmH^$#lEI5a5%Vh4ae8;3r6D7~=)G~bcuVsMk9wol)-;npZut5Qsi787GJ06>}# z`yX!)(zBKOp&iCb^6O{4Ti;G@SLUpuN%zb$%`>dqUtTpYd}Yt7WF#NIbQ>$#%R~no z81ki_;Ng-n7hI3b_t!gjrgGeSpKT-(fJwV!DHjbFb{C#8B<-+sF|b}$DuPkJf*qJ* zDHT}_H8g>0dR5r`ZC)}8^q8|IeT_bUd0p! zb6-I>CIn;+C@?~I5Xd+Yl9whj00IzYSr|RS*Z`}LJrl|aAJUHoC2ORS5n*K1^p@5y zP1HImX~_f*3ke7ifiV~bfD?-@lzAAIa`J$-KcISB+_%oUxPfZCJTD>wQ~(S7VTx_9 zwgA8g8*sdzSrU*3(AM7n`2_oh*`}!NtXmTZZMZHo(@X;Z>TIuG@11i={f5Q9Z~AOE-!;A`OuwDHeAe!$*Kl)9 z*d2dQ{wUKJ`?c$4vRs<8eLuY;?)fnltyHVM>xHsb#7o)j5?5AMS(OXv6rt|MyE}z^ zRuAP@r978FNG3bb%%n1NUrT}unkvm&YdH)ZuQruZPB0+Z<%!+klmgLAJ5hF<0!fl0 zMCuUbT6++&Be21wE6&msRRvVV0HbrGmK4Ym2q{FX?%ww|c4(N9xGATEpmOO74dHf;a}IBGKp zgoWWIYKbzD+!z1|^)bU%QFBWW|R z#hOG;2bi(cR$Ng+nYVg#0PL z7@dUp?^XB!PV@Ve^US#y*4d6$!-&J)5N1{#0(^Y zs&&r$w@6RacoicVK+**Pnb|H4>k=qlM~hYvOc(KxK;qGYO;9H2nrYQS-CoT>!3Hr_ zm+35*$Tb36U|ucDI!m$AOH4%ztGZ`b)l@M-swrC{cp0l-*b zA&Ai4R}mu{h=u^8034+_05Al^G9VOC6zPzQs#oKTa9{#CprK_RCYoSqM&()J%mpC~ zU=Rul0RWyh*o%?e!YTFSbbAe4nxXGpbkZYM0Le6lv@*ch)@p&Vo!j(Dvn~>_-`oM^ zq_-jM@qx2SiApP1@Xf2h&!>oFPqNeZ0Z(UVQvd|g@&Et;0000fEC2uq0001b8q!Dv z|6~7bem8`^fQlC@Gt1DUxo${f1r;AI(h9vhPW32GGVL7?+{b8#Z=;&Z%Iq>RmuV6J z4s1ue8{@w$4RVdI+4Z~m-eO?>Zen_6zquTW`~A4>RbTqsr*zyOe{9s8ud?5q@x@DT zU545%V^<^%4n3WYvh^->KACA5PC`Y-&y~f}IYoYcEqf4dnc6+7ep}R(dc2=uPGri# z^pG{(IUS2AUQG9@lEF=?3MMK?MrOHgrA#v*LdZlVFhmwW%~If#>GpzYq9U8La|@x0 zX$ycgmy9csM;K%T1%Si~%djqB1jHi&)`(SOWO-;og%uF4HCl)vLKpxbB$8VwjSAFN zNfnqbkV;rOFo2YSffm`wvOz@}LzJ=Uw@U^Km11aFu22!+knLYG>!#t{IkI2QRSE`y ztXRmYyM{YbNmFLw?*M`(?>7(F(ghFzXhpJ-i~z(c$(|jznT5q6001nkAOId_9GA8U zZLIPX_VO9JjQwaIE1K~#8WL7+d&Vc{{q<+X^*-RQ?tRpES{oKry;EHR0-Bit04Uq$ zV_)4T=L2cI#s1=b;7uR@{>~C!4sF`RJ183QuovX000Av(OVZ<8Pi;;!JNN)f>Qp>SdSQixvYmggj zycn&WZqR@mpe3%g&W8;jPSg^|9n%&TUThgzSVplF3(KTM$tV<7N|Z`LMQ>{=C|Z$< wf)yhc9Hha*!ckeaPNI`F=EG)!?32I_Rul@$$W7kOEbsMKGv*BtPS+Vu7dZlM5dZ)H literal 0 HcmV?d00001 diff --git a/Resources/Audio/Voice/Skeleton/skeleton_scream.ogg b/Resources/Audio/Voice/Skeleton/skeleton_scream.ogg new file mode 100644 index 0000000000000000000000000000000000000000..12bb0b4f427531df99bccb34dc2cba6bcf46a64b GIT binary patch literal 10137 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 W`Ezn>MyJKGw`T^EbvJvX9r!;Itgn#( literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/body/behavior/skeleton.ftl b/Resources/Locale/en-US/body/behavior/skeleton.ftl index db71eacb4aab..8aa641f7d2b9 100644 --- a/Resources/Locale/en-US/body/behavior/skeleton.ftl +++ b/Resources/Locale/en-US/body/behavior/skeleton.ftl @@ -1,5 +1,5 @@ skeleton-unable-consume = {CAPITALIZE(THE($item))} fell right through {POSS-ADJ($target)} body! -skeleton-death = {CAPITALIZE(THE($target))} fell to pieces! skeleton-reassemble-action = Reassemble -skeleton-reassemble-fail = Parts are missing! \ No newline at end of file +skeleton-reassemble-fail = Parts are missing! +skeleton-reassemble-success = {CAPITALIZE(THE($user))} was put back together. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml index 07ceb587353b..f6d140151c64 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml @@ -14,6 +14,9 @@ context: "human" - type: PlayerMobMover - type: PlayerInputMover + - type: Vocal + maleScream: /Audio/Voice/Skeleton/skeleton_scream.ogg + femaleScream: /Audio/Voice/Skeleton/skeleton_scream.ogg - type: Alerts - type: Actions - type: Eye diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml index 6a39d548d403..d35fd2f24d08 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -129,12 +129,6 @@ - map: [ "belt" ] - map: [ "neck" ] - map: [ "back" ] - - map: [ "enum.HumanoidVisualLayers.FacialHair" ] - state: shaved - sprite: Mobs/Customization/human_facial_hair.rsi - - map: [ "enum.HumanoidVisualLayers.Hair" ] - state: bald - sprite: Mobs/Customization/human_hair.rsi - map: [ "mask" ] - map: [ "head" ] - map: [ "pocket1" ] @@ -177,6 +171,7 @@ - type: Body template: HumanoidTemplate preset: SkeletonPreset + gibSound: /Audio/Effects/bone_rattle.ogg - type: Damageable damageContainer: Biological damageModifierSet: Skeleton diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_arm.png index 63025ee600afcbde293d0ba2afa2541ff1163d74..bab8a1bd7115fabd6a2f7027a94a738d13991590 100644 GIT binary patch delta 205 zcmeyx_>FObVf_YA7srr_Id5+&3LSFbX?=L%q1ueDdo0fWo0y(>J&{^>Shj$}#c;1{ zXn<+yTa^n_{(qib`PocQi2(?7rpz(96jN;VB};bOlOzz&0qCN;#b|i zFx&HUudc8Bzpvvmo6DoHhO4*QqU%BWz~F%Y_Z_?C-2%hcK3U@JeWSYd*Rs=Jw+Rc{ znty$>eYRD<{!W$rRSk#t=Q*78^nd&Dx*=FsVhzJ7skqpn#Cv?m2i2>@jgWm*VEO{Wt~$( F69DzDSJD6g diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_hand.png index 3418d30094b2f9bc2d949e2005868c186a4e8749..dc85cb9ac14b9c5a52e081a6aad8f82dec227b3a 100644 GIT binary patch delta 256 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 delta 220 zcmV<203-i}1&0N&v;lv%4W3)sWa5^m7JT^B7~~UVgR8kL#IQChtFvP zn&chUdFXb&e3t6RI?J2e+mD*$uC)Pu_I3cdt$&njZU6uP002|~{zfbwucu>Hg=r@q z51(6O{7kEMc)vRo%k_59b(jsjq4j;}lN~vV6UZI?GO3dq%U6t|Y z)J=JAEI&7z{J-zm z*#r8&GVikYSjPJ;E6Ug?d%EK6diDwGD{bESPmWZZ>bg5)f8d+@KwTSZ^V>oLAF{H3 Qm;y4w)78&qol`;+0GHBoqyPW_ literal 5453 zcmeI0c|4SB8^=eALJJbwOw)og`(}p8GA1U;nk99{EYFO=EM~@D6rBnkr4u5RqEbmA z#~Klp(^M2r#i1;fgp%d0RPQrG+vh$1^!dE!zn=L#+kIcx_r9;+ecku-JQMG-(SEkZ zLJbH6GMnyT=LVjw75hvz@OX|N+yQ~iphtRm%iNe@P_abBaThi@$7u&c-f!#f9)K4bpL!@W1Y#{k7oxAKeZlXs12UX z_KZR0yy-I-vUr)kb0ltAx#pbxC##lH#|&8I7Q^hU&RgXfXD3Q`6%0wPT(BE5u0Q`g zs>JHUf~=C&Pnjogrz0!VjnvJTu5WiW4cGP3lIP`m3B!5OST*aa+P)A&%i#|$uOk{Q zJbx*k2#I=k)AIyxW(=h4%Ad$K_k1JrfADj!BpPiG7^zyaqHmx{eWW{>@q%~Tn}(e2 zQo?gZHlK_QR&}py&Un1JV!HFMvq&XRJncs9O!5MMQ5~13&Uzk&i0C~=8FIg4`Gj@i zsDsP0jJh+fJ~#a(ue`eMY^=Sm8KiTUY7yFcD{b59;=t3`Bdn(>=tG!&y?YafI{GS% zN^f}He0xvd^HrkB)!mC~wp60E_HkmYFQ`8*dEc#9i809ADGAb6z0^%W2YlSG^J-ZJ z`qIhDalh121Bl(>^4fH{A0!XRFY9&OyMhNf3(dV2(q*fv)w7vjL%*p{6lc$O@78VL znQXF^+FI0UZK(UGBWAbTc$(_HUQW}dUXj3yTRl$&6hB&2axWmzY4cu|e(J%T^}5=6 zzvt)C&J*-D;Rn`TpLaXpc3rbP@2)GGdDyrKa=cGk9s*p|q9eK5<1UacGox=;;@4f2*(~ zX4kYcy5RJP8;d?%l%L8PJR;xzbYM-Z=VIy`ROnDGWR&%C?TBa~hcc(a8F-hSG?ZFB z`@;pT*+K3Ce3^Z|d%OL4SEI_@frrGjs`2?fq)n}x_eQ<(OnqyhITv}Cd|s}{=uPJg zqs6ANg->3+)U#=LV*u~cJ^tXp(^XNL7h9JLYUZ06`d%aa0n~HO*0=uYTAg3*cDllC ziSJg;_kIsuB5%w&BK_@(j8NM0ZXUk$vc3fhC5(bI?o@dmXOFIE)G?G-Z2jQpm7H*N zVPU*iS&H#>7u8F&@QVrC)lKH7vS9vWDt>IXsL%0%=A1O^h33fIq@XNvEd=ErxM-<= z^952S&|`M>Fzw)@!@bZLpE01Tf0(j8?L9m2vA(;L%|WQ2&b=llW6AH#kdB?G+#JTd z#4{TT>NEpzDl*kl)x^6Mr7bGeCnBPR&y7>}K>F*YVOw8Iq0`#2g&IkI>$lBic#A9w zs8_l21b(w`KcYu%OGoP~d&H@J{R;ynCpve3jM0i99w!k}-G_r$^dyWIu5C;U3FPSB zT4Xc5ASR6RUd#x5*nVrJXayN_Zuy?w0ixj%U7rbhA8mDZVZ_|G_r0wWj zzfxivZ8n;8eG*SSIpAvU5R;tU_9k2dy6kqJ_Nbc2IBD*5oiz2Fwk_oh ztlM=z=4}<~U7!1BqOT%8Om8;21Klt-YC1yRbx;4yyl!00+d;s{dNgy@FYm48ke+8U zcQgO?&>5}=F3C~*E?X}|3flV%e7V=&dNj07V9VA5?`VBZoh|cX|GHPL0zYus$e{3@ z4+NsJi%+Gx(5ckViz>L3W^PZWI9#({T+g_l0MpwO>Jog@<*3=-^}&Z$FQ~EQuetof zPtvE4<2$%*Sv=#f*f^uaP3ro*txLAduz96g*VI67qOG4`xcO^$*92R2{2kSPMRgZ9 z3>gHBWT~_eF!8wcuEH|I)Qp9khtl@iMC$JKRu)k9Fgp z9Ts}mEvhSUa(q_lyqF8nm#sBEhI$@bw|`68*68jn67R?9%;iUp8PCy8JcUTDIGi#& zC49H}$=rp#nxr(nJHDAM0Y{668W;v<{%Z{L?=PlJb98{s(8j#T&C<|x-HdnJki)kc zd}0(lVJd0pIkzL3t%A=zu-NK9MiYarW*eQ$=r!hzZ&+r-*zC-R2OoY0eDERX?X-c+76}kc zj)(;y!UbaRAqat3T7`?5>_9*UWdS_CkOCX3sD?rL916?}?}Ty^QvrXzL!<<7kKE|N zjtpdzI54ZV8kXT?5Fh|#OlY_uNGK(TQ(#Ii8N5~$BVkabi7b!;^LBE9QbiH~ibLQK zC^#*gABusk)qq+`I9#%u-MT3Rct?Tx%Vc6Q5*Zd2h6uwVL=qknO(KzyC=3#VfrA!s zX@pS542KJ)%N2-8h8-YfOZZ|LUnGPom`s)^L`H$Zz68kf9>{Q} z7>P!pkOBenTMwy>779Y9I`oeoQV;N50qF)vMIjP4Knn$gvgO|*IP5R};t)xYG8_&Y z2?PNG&{PVxivF%id%Ba$7Y~I5Jib7z^a92H&QiwbeiiGxzA0*y;e6W>(ESVdJL}J} zD~&-bCnvIuGQ=H@s6LqfCQSS|_=$FcD^I1@#}fwveg2Ot3iA|9heaoFT_ zB8h+r4kus0khc zNa7(91yNuM1XSUvOmL{>F-W>>@yqlZ^L40Ku6sk;IGLt>oh?E%$ zaFh*!ev?&ff2NQJfHQn5r9PMQ|6#Z=Y#f?JVl&|wCIQr#$U(tL1T+qgB5;`;ESgIK zwf>$i6>()@ObKAa10w~a0aHjB4b)^xOw;e}!~6k-QYdhKqi}Ex-UDq;#uLb3_{gbX zk%~F}Ia*8P|L9?!(~lq`(gu|IDucn_L=SKX(8j_y!aPe#}VB42HoEAvKnxy&dF};+J*h z%%>~m zzxtZE@91mD^h*Yn@ib>v7OSv!mStRaz3nSC+_asdIgjVj18e0bsxRfA(!x5cwpSeK zNB|*8v}R@0$CvWF5~)Q?9A6Y3EYDN>jkr4~ zx~Ofvc-CbT>ty1vur2uFA;e#dXPGLKDDY^up)=-q_g(AivHs8{0zvojhCSWU_qy7W z@R9PCi@HVT$u~Zb_$mpN$;Es`x1qcx=FIq92xLd_Hpr80jJCPHxh)D7owm^~-_|eo EzZsinzW@LL diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_m.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_m.png index 4a13c0dbdcb8fd4cd663ac0e625ab37ea2beb441..0dd234beff520ce432142ac7947e33aabca719fa 100644 GIT binary patch delta 686 zcmV;f0#W_B2-OI%v;lvNNklMSHe0y<~951h~pzKx`hWHk$R!R0}*G=VzD3i(swl0?3|% z!;weUCuacgFAIN)$N=%j1!4*Yo}WAkD3GHiSJ_(CO^KR}ewKctS;zU=rB(fuA%mm7 zvB%zf^grUU%Nalwmlqr&157W1-qM%9b@jE1An@1w0I;#Kt~*378qGQa&rj^IMphJT zL|@hyOJMa_XFPHSyw0=ujbq~!te1V5kjO7X zAMdW?o57)-7qdb*Yh#2hCw#OG+I@lBiz_Uzt|aGWw*p9A8k49^*>F6WYn#6pvIFk# z9{|kv>1}q2)!iV%A;LBaWCyf5ZJZvTARJFVRR+wW2(3;V`@8$3vB(ZMJw8FJ)1JFt zbOs39sAzw6hkvduq2xH2MG>B#rm5decWBfir`kf*U!)qay?3zi{4~WZicoT#u}?_en~-M}s$C|rWx=9)^Pj;6hG7_nVZJVZ0KAT5 U6cmj~h5!Hn07*qoM6N<$g57jOga7~l delta 658 zcmV;D0&V@(2)PKbv;lu`Nkl?JUA^G!ge>VkyR@28KNwVWL&%^Cq007uKI1+!Y`E2xu`@3oSGydnM zjI3J!;pQ^iR?&Yg`SbPpMYg}Wy@k5pKoo?CXLHFiD-i`D>V5-tzfpQzipT)~@Zr

f)JDOwDKa@YWe`m zFTvZpK&&s$0N{Ub7P!a&b>a$j2}VJf-3cU!qor5bR@2XkRvG;={Z6-y$#`m2KWE73 z%doQB-c$6~aoc4ENX7LB4wV5_KLkCduYa2A8x=v|xAy^HXXm}?5-ZW^wh;wkW`{M( zqF^KXy1se@F7BJGC(eLB*ID|=e&x8^I}#BmkmbPa>BZ8FzyRnpI=~edn@~1_ZxuLrKyr)Q#PK>m)hn}MeKn4 z`>z0&`}8)u#Kmb4 Date: Sat, 30 Apr 2022 20:57:20 -0400 Subject: [PATCH 09/27] Update species.yml --- Resources/Prototypes/species.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index 160c226be108..cd0c97c51bad 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -33,7 +33,7 @@ - type: species id: Skeleton name: Skeleton - roundStart: true #touch this an feel my wrath + roundStart: true #touch this and feel my wrath prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy skinColoration: TintedHues @@ -44,4 +44,4 @@ # roundStart: true # prototype: MobVox # dollPrototype: MobVoxDummy -# skinColoration: Hues \ No newline at end of file +# skinColoration: Hues From 7f6bd4d91b9aa1fa2ea99a85cd3e17d77c00a177 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 1 May 2022 13:54:00 -0400 Subject: [PATCH 10/27] feud 1 Co-authored-by: Moony --- Resources/Prototypes/species.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index cd0c97c51bad..420b4426a31b 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -33,7 +33,7 @@ - type: species id: Skeleton name: Skeleton - roundStart: true #touch this and feel my wrath + roundStart: false #touch this and feel my wrath | bet --moony prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy skinColoration: TintedHues From ef5196204a972bf5ec455cd52caa8774d84963a4 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 1 May 2022 13:54:42 -0400 Subject: [PATCH 11/27] Update species.yml --- Resources/Prototypes/species.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index 420b4426a31b..5b99ebc23eaf 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -33,7 +33,7 @@ - type: species id: Skeleton name: Skeleton - roundStart: false #touch this and feel my wrath | bet --moony + roundStart: true #touch this and feel my wrath | bet --moony | you have no power over what is not your codebase --emo prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy skinColoration: TintedHues From a9b55e135736bf8dfa5f6b4eed8c585701d218f8 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 1 May 2022 13:55:38 -0400 Subject: [PATCH 12/27] Update species.yml --- Resources/Prototypes/species.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index 5b99ebc23eaf..79a8e4874683 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -33,7 +33,7 @@ - type: species id: Skeleton name: Skeleton - roundStart: true #touch this and feel my wrath | bet --moony | you have no power over what is not your codebase --emo + roundStart: true #touch this and feel my wrath | bet --moony | there will be violence --emo prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy skinColoration: TintedHues From 0e5319189eec61ad6ed1b74042d6329a0a31f1c9 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Wed, 4 May 2022 08:48:58 -0400 Subject: [PATCH 13/27] Update Content.Server/Body/Systems/TransferMindOnGibSystem.cs Co-authored-by: Kara --- .../Body/Systems/TransferMindOnGibSystem.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs index af64026c9618..fe5140b1c728 100644 --- a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs +++ b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs @@ -17,20 +17,20 @@ public override void Initialize() private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, BeforeGibbedEvent args) { - if (TryComp(uid, out var mindComp) && mindComp.Mind != null) + if (!TryComp(uid, out var mindComp) || mindComp?.Mind == null) + return; + + if (!TryComp(uid, out var bodyComp)) + return; + + foreach (var part in bodyComp.Parts) { - if (TryComp(uid, out var bodyComp)) + var entity = part.Key.Owner; + if (HasComp(entity)) { - foreach (var part in bodyComp.Parts) - { - var entity = part.Key.Owner; - if (HasComp(entity)) - { - component.TransferTarget = entity; - _skeletonBodyManager.UpdateDNAEntry(entity, uid); - mindComp.Mind.TransferTo(entity); - } - } + component.TransferTarget = entity; + _skeletonBodyManager.UpdateDNAEntry(entity, uid); + mindComp.Mind.TransferTo(entity); } } } From b614f7b6d5b163041fe4b0494c107fda333bcce1 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Wed, 4 May 2022 08:49:50 -0400 Subject: [PATCH 14/27] Update Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs Co-authored-by: Kara --- Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs index 90c3c44b9789..5306eef376ed 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -151,7 +151,7 @@ private void Reassemble(ReassembleDoAfterComplete args) /// the dna for reassembly later ///

/// param name="uid"> the entity the mind is going to be transfered which also stores the DNA - /// the entity whose DNA is being saved + /// the entity whose DNA is being saved public void UpdateDNAEntry(EntityUid uid, EntityUid body) { if (!TryComp(uid, out var skelBodyComp) || From 26f7824a2d928dc6514232a9a3abea132f19fa8f Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Wed, 4 May 2022 08:50:12 -0400 Subject: [PATCH 15/27] Update Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs Co-authored-by: Kara --- Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs index 5306eef376ed..59b8759b5d0a 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -132,7 +132,7 @@ private void Reassemble(ReassembleDoAfterComplete args) var mob = _entities.SpawnEntity(speciesProto, _entities.GetComponent(component.Owner).MapPosition); Get().UpdateFromProfile(mob, component.DNA.Value.Profile); - _entities.GetComponent(mob).EntityName = component.DNA.Value.Profile.Name; + MetaData(mob).EntityName = component.DNA.Value.Profile.Name; if (TryComp(uid, out var mindcomp) && mindcomp.Mind != null) mindcomp.Mind.TransferTo(mob); From 88753bf01357863911acf3a2e689004b386e5bea Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Wed, 4 May 2022 08:50:46 -0400 Subject: [PATCH 16/27] Update Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs Co-authored-by: Kara --- Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs index 59b8759b5d0a..4d1d1e0a0a60 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -150,7 +150,7 @@ private void Reassemble(ReassembleDoAfterComplete args) /// Called before the skeleton entity is gibbed in order to save /// the dna for reassembly later /// - /// param name="uid"> the entity the mind is going to be transfered which also stores the DNA + /// the entity the mind is going to be transfered which also stores the DNA /// the entity whose DNA is being saved public void UpdateDNAEntry(EntityUid uid, EntityUid body) { From ed74485a53cdb18623364ec333d6f29e12cd4c8a Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Wed, 4 May 2022 09:53:06 -0400 Subject: [PATCH 17/27] mirror's fixes pt 1 --- .../Body/Components/BodyComponent.cs | 6 ++-- .../SkeletonBodyManagerComponent.cs | 2 +- .../Body/Systems/SkeletonBodyManagerSystem.cs | 29 +++++++++--------- .../Body/Components/SharedBodyComponent.cs | 6 ++-- .../Body/Part/BodyPartCompatibility.cs | 1 - Content.Shared/Species/SpeciesPrototype.cs | 2 +- Resources/Audio/Effects/bone_rattle.ogg | Bin 30848 -> 19244 bytes Resources/Prototypes/Body/Parts/skeleton.yml | 20 ++++++------ Resources/Prototypes/Damage/modifier_sets.yml | 3 +- 9 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Content.Server/Body/Components/BodyComponent.cs b/Content.Server/Body/Components/BodyComponent.cs index 406f3df71485..b1bd30972379 100644 --- a/Content.Server/Body/Components/BodyComponent.cs +++ b/Content.Server/Body/Components/BodyComponent.cs @@ -83,7 +83,7 @@ protected override void Startup() } } - public override List Gib(bool gibParts = false) + public override HashSet Gib(bool gibParts = false) { _entMan.EventBus.RaiseLocalEvent(Owner, new BeforeGibbedEvent(), false); var gibs = base.Gib(gibParts); @@ -112,9 +112,9 @@ public override List Gib(bool gibParts = false) public sealed class BeingGibbedEvent : EntityEventArgs { - public readonly List GibbedParts; + public readonly HashSet GibbedParts; - public BeingGibbedEvent(List gibbedParts) + public BeingGibbedEvent(HashSet gibbedParts) { GibbedParts = gibbedParts; } diff --git a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs index 500ed2382c4a..a279d3393ad9 100644 --- a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs +++ b/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs @@ -23,6 +23,6 @@ public sealed class SkeletonBodyManagerComponent : Component /// The list of body parts that are needed for reassembly /// [ViewVariables] - public List? BodyParts = null; + public HashSet? BodyParts = null; } } diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs index 4d1d1e0a0a60..c89d120620ec 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs @@ -24,12 +24,12 @@ namespace Content.Server.Body.Systems { public sealed class SkeletonBodyManagerSystem : EntitySystem { - [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IServerPreferencesManager _prefsManager = null!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly ConstructionSystem _construction = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoidAppeareance = default!; public override void Initialize() { @@ -78,7 +78,7 @@ private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent comp BreakOnDamage = true, BreakOnStun = true, NeedHand = false, - BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, args.User, component, partList), + BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, args.User, partList), }; _doAfterSystem.DoAfter(doAfterEventArgs); @@ -88,9 +88,9 @@ private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent comp args.Verbs.Add(custom); } - private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerComponent component, out List? partList) + private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerComponent component, out HashSet? partList) { - partList = new List(); + partList = new HashSet(); if (component.BodyParts == null) return false; @@ -103,10 +103,10 @@ private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerCo notFound = true; foreach (var entity in nearby) { - if (part.Owner == entity || part.Owner == component.Owner) + if (part == entity || part == component.Owner) { notFound = false; - partList.Add(part.Owner); + partList.Add(part); } } if (notFound) @@ -122,16 +122,19 @@ private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerCo private void Reassemble(ReassembleDoAfterComplete args) { var uid = args.Uid; - var component = args.Component; + TryComp(args.Uid, out var component); + + if (component == null) + return; if (component.DNA == null) return; // Creates the new entity and transfers the mind component var speciesProto = _prototype.Index(component.DNA.Value.Profile.Species).Prototype; - var mob = _entities.SpawnEntity(speciesProto, _entities.GetComponent(component.Owner).MapPosition); + var mob = EntityManager.SpawnEntity(speciesProto, EntityManager.GetComponent(component.Owner).MapPosition); - Get().UpdateFromProfile(mob, component.DNA.Value.Profile); + _humanoidAppeareance.UpdateFromProfile(mob, component.DNA.Value.Profile); MetaData(mob).EntityName = component.DNA.Value.Profile.Name; if (TryComp(uid, out var mindcomp) && mindcomp.Mind != null) @@ -140,7 +143,7 @@ private void Reassemble(ReassembleDoAfterComplete args) // Cleans up all the body part pieces foreach (var entity in args.PartList) { - _entities.DeleteEntity(entity); + EntityManager.DeleteEntity(entity); } _popupSystem.PopupEntity(Loc.GetString("skeleton-reassemble-success", ("user", mob)), mob, Filter.Entities(mob)); @@ -172,14 +175,12 @@ private sealed class ReassembleDoAfterComplete : EntityEventArgs { public readonly EntityUid Uid; //the entity being reassembled public readonly EntityUid User; //the user performing the reassembly - public readonly SkeletonBodyManagerComponent Component; - public readonly List PartList; + public readonly HashSet PartList; - public ReassembleDoAfterComplete(EntityUid uid, EntityUid user, SkeletonBodyManagerComponent component, List partList) + public ReassembleDoAfterComplete(EntityUid uid, EntityUid user, HashSet partList) { Uid = uid; User = user; - Component = component; PartList = partList; } } diff --git a/Content.Shared/Body/Components/SharedBodyComponent.cs b/Content.Shared/Body/Components/SharedBodyComponent.cs index f639b0a05da5..95987844849f 100644 --- a/Content.Shared/Body/Components/SharedBodyComponent.cs +++ b/Content.Shared/Body/Components/SharedBodyComponent.cs @@ -394,12 +394,12 @@ public override void HandleComponentState(ComponentState? curState, ComponentSta } } - public virtual List Gib(bool gibParts = false) + public virtual HashSet Gib(bool gibParts = false) { - var gibs = new List(); + var gibs = new HashSet(); foreach (var part in SlotParts.Keys) { - gibs.Add(part); + gibs.Add(part.Owner); RemovePart(part); if (gibParts) diff --git a/Content.Shared/Body/Part/BodyPartCompatibility.cs b/Content.Shared/Body/Part/BodyPartCompatibility.cs index fbffe96e7225..1af9d2014810 100644 --- a/Content.Shared/Body/Part/BodyPartCompatibility.cs +++ b/Content.Shared/Body/Part/BodyPartCompatibility.cs @@ -15,6 +15,5 @@ public enum BodyPartCompatibility Biological, Mechanical, Slime, - Skeleton } } diff --git a/Content.Shared/Species/SpeciesPrototype.cs b/Content.Shared/Species/SpeciesPrototype.cs index 08f1128b10a6..0b93e893fd49 100644 --- a/Content.Shared/Species/SpeciesPrototype.cs +++ b/Content.Shared/Species/SpeciesPrototype.cs @@ -51,5 +51,5 @@ public enum SpeciesSkinColor { HumanToned, Hues, - TintedHues, + TintedHues, //This gives a color tint to a humanoid's skin (10% saturation with full hue range). } diff --git a/Resources/Audio/Effects/bone_rattle.ogg b/Resources/Audio/Effects/bone_rattle.ogg index 2b657f5e6349f9950120165c8f52e4b114014ee2..a4f25ff2cd49806f8cc8666117c20af6808e1351 100644 GIT binary patch delta 17860 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 literal 30848 zcmeFZby$?o`zZYEvcS?yHmy-3SOsOG`^PN=qXWl8ST)C=!an zS@iS${=V<;J=Zz!b)D<|?>r2{%suza{mdOR_r!yygM%&r2L5?C;eQizx!2!83?M%b zZ)>LqHz2Tl%|9q!f05fknm0B7{oK?9p>svU{yrq~*Z=KF#rWHl5E{eC$8!{lwzin{J${BzF zC>p}A#yEs}lcEm*FaWS*YPlWTQAB^aCk;S66g~>v1nvdly&+ zrGad`fo^h!Rr3_CO)5MisGzH-u8)3v%?a4CU5qlnjIyGN z{wI73`EYp?{&bxY1QfD}XKr#9Gt(4rh!(T$?Hp~ExlEo}He z>fHnNcW74JaO8jeg#FPMbVr!-?K7QGP{9~AWNBp183@+}%h zy_-ikOl^h6b9$SDUAbh0u50`zXQ!fr44sNg&t-4v(EHooKWb5FkvG*R{t;axZaLSb z1IHYl`fi(dJc)Ay`|s+5K+DZ)k!mH;(wHPjp z*5ag=oq`8-;>s>%Eej^xW$8Ld&a%H2g%&EKZHf#Q^&caN&hj4Pe2%t?{}kM3)@fq; zng0mWU+A<+*wA4{fJawQN?%Xk(9g~Isqac#l=-6Xhj$?#-X-0qjQ;P6^>51o&_)ya z$0pOQ6Zv1~MQF(4{1x!OEXRxNbt>IxDywQEtNL5`nxJX^{W2oI;M|4Y6bv zl{8l4wA+E14skh^*#-NR#kl{?avbBIXT?8{jo*z;=7`I5ip#0$D0UsIJM8@5hJRa* zk~b?lpe;wioAo~|r<$nqQ0D4pKRsW15+B!V*I>Pfh zJo&?ZJ0RIKhR4^so)CAeBOpD*Vm96R1bHo=rfzi_on(df3Y!`7v!U?q;N00y`E71EYG2^G|JqKE9S^4uj=GQ6Po@rMWLNL$DDtIh1AK=qcD0jHmA(liMwf`s;UkT zjX5i%j>de4S?rioURi~nNf3V!=Y7p7V{c$p=-CB)gQRc%F2fGxgs#_F2glI+o2M?U zsygVb;~odl4%AYHoiWz>O|B8`&#(7_0LEUZ#Arn$lvcg{GeAbu$PC1ybs^CT$zO(V zLn4b?WThsn%w(&h!^K&KE6c@}p(CSQR;nX_gaG{0w{Vh^sf;# zD!K*&oT9xwn{?|5@m*F~B>zs{0}`e(Dztl3NoI57;!6 zBY}nyq8$z&G)if@j_h9E1GN8zj9Lec_xF1;X50Aag(bBkK6x;ZXj4G?DaM8J0G^3(!{N1Xm!~WJA{=f6J zTDf8VVP`Lz@4j}_?Kjgm91j3AJpq8L-pV)fNpV9jdZGj0%$Je;P)@YZg~e0~lU3%7 zO8I}PKL~}cgM$6DLJ>){`X}Xu`=6_p|60HN|Cw4eaj9)F0H~&-Fc8L(NrE-3`Q*u1 zlr)Vb02Bu;b(vWHJ=XLzB$8Yu4kEskAOnr;%$*}8!i z5E_Q=iisH>Q(3x60#7Sdt}7E-YA$G)jUciG4MTUu1&-`M!y1ODT#^(xa!qeaU226n zw;!lB%$wNMwA?O9OuK>Av@9^E>j(^!>7r9Pk$l6KR5msIyCzRa`oA&g@}QAj(7M24 zn^ZY$f>s z)dRGeF-G33#7d!m3S`jkC0b_GHvcLpicHfPL)W+|K$BxDoBLaXCxKTs(ssf_0K$B{Bgu#2=eQuh3xF4b2NC)rsC?Dk`;diZnZgrHd-qOf5#Lc8oG( zD#-kBC?{5BR3cYd){{)x@hlyDYi@p@M1CdlZ9Uo7ROlf)8~`wg1xTS}h_EnxKn$Ur z0tRsL@aYE>5C~qTlHNj3H8J*l5de^hoq)x~4l(i<(Qt5;W1xmGqaOkzZx)ri+EKh1 zW^abfv1OsMuy7+f1PDh=>|-?h`_GZId4;-q2M9DB0AK*t(Zkmgz|35ny}9@K8-PPh z&BVzsE<^mM_%84b0F-r5v9XRjViJH{}B9yinCrXT(}qqc#PytbaP>2=Vx=C#(f0s2Sd+VEQC+D2Xup&+M}_l3&V zpDJ}-`W)8RPAf#`@C{T2Hh_iQ!8Tg;{!G*#__(I(M~(L*(~w)ZcZwhf3vbJKM_Np3 zoma=M*_~-skS#~DeGw-7v9Xb>7{!K>y7FJTo9Pv2Ml(ox=HNbuWlmpuQ;18L&NbGEnNYJGd9KTizui-fkoNXxViL)eS! zWz~2biR1Z7_s?L2Fu{NUZyL5r#xlB@ZBEATfE9-tNmvfBLbhyb)vYzoo)?nMb$=qA zOIy?N>7pg88TGbA@~0SiVS2XSkNS%o)pX4tA?1dK^;D69bg=f-eG-f@jCEKcRoDfk zWeu-L{4Ln}3?(zX;nPx$F1@6I!uYIFzdq3j8`l{s?nym#vY_T3w#&p9;ORaCQ^#*= zB0GR_y^2Unz0i`FgV?gz&~{?Sew-5t_n$BFQ#g(f8aco9L#ZRL$3bmGKY@@(ahclR z6}#1~#E4~hWSU>$jJp{(;U&h_5iTt(55LvT5SAz;gL#bsr?`!I23aQ(I$ry_z@1g9 zr9J+*Q;YD@#0@z&bes4wn}vxo);s26;si&?p`w};#*F-k?&4UEX|w`Xt&B427Z{|+ z(3AU`^kUeX^E2i5uLMU-Y)kS_oG(XD9vR8hkVF@O#CGT!MvH6VM_Vf^8CPY35Nj{L%yPW0rrHFWEH$QfGX(13=vBKYNQt)Hn#RfYvm5ceHD#))B{T$UYTR6s{GHRU2E(Y;6dV5Nr00apPgtJu%yh=`2zg8}SJXdr*8U6aY%x zXU!}+%!0eW@#oG=KNHI48_pW2nZcT6f=o_K3?_q6d{@(l(my00Hx*o7<9%rG7jO@F ze?2K${&F-hgs+r)1j)vC%IA` zPPhiyiG!PeUUEengR++?g8(m3UfjQA?v)*sqh>5MbD+wWe9WP?+w&kjpG8$uDoEes zOJs?Ab}=&{jK3E#wpCyC)aVI?fM7rclMe2&TtgnyOD-4xJ5N`Bha|IOrl&xi02m@x za2VzT8{6lMv@?p*!gHlbgRd6pj#}bPH^z@?^fMrap-iAnd`t>*eVC4m9cHri(BL;; zfOkAMFl$6)q1L|ZgPxz=bqlU*BETvSkA1%2_h6Ra$EL)w*p{n{lc4MQ z=W)DP_$@q4lIJ8etN!Fb#d?xC3C^o|zDZO6IL{EhGX?@e#UKKpmI$n~fpwT8k;z?b z#JyG0M-4u|OGG2PyhG23vyNh;Nev~BOq7_`C4^c zzC1m5<(#|pR!*|B9=Qv|jnTn)JVIewKuW5bh;;r3m6h)8La|sDJjh4NFclD1*lZg8 z3%}`{eSEA^coH@?Z(-#I6Un+5iNG)zKQ+>ec|&Kij0W0DMc%ZW82Q9C?bM=_bSHK# zicg-jM^^RMyKEvBik{YR3>6>!+>YMz{Gnr>`L&#xrMD(m+9N2LG_UTertV)q1lMgp zJ+Q|ldju4SvMOM1*vLj%yiei7{7gwjokJAPvv7TGlkIfms5D2XpWctwS!-(mHEex2 z&!4>b^Ga#r>hk5O1j)%7hxu#vHKW&V)YqBY*TDy~stX_Tf6Z*X_9vRR+|4d_LHfMc zaDkQ0q0*Y*8%7!CKjuDvXGENiYpf*gUHCq3(K6PntXN|#fFBZz1xek=LpuSwFpiDDq<&u zs42{}XvQjH$;ipP@u@bEOtGIvsEVsf?>4?ABLP$68!1*V>s4;mzO}^Y$BknBAX5iz zRerCRWEtp=hZO~Oh}GhNVd-h#tJFI@AZbAmSwnj5$r-a1KfC|>p60rJw?a)bJBF3) z+pHGq9X$7uOTxUY+WR6R)b6(`_K0av%w7K88Zd)svk|tjXaq@PZI`%v#U8b7uw#0& z?1>2bY$GWCU0TBGkD27?Lj~C^?(8@xehMNWHYxA5R7S93>Rl@KzQ8t*?1DI*+8pi^ zjBe9k!4dg3KmCe3-nSWZRSkx=N;F$d+1sh{$r?8b{L-I*z`_d~%41-}T7&ULtK9i2 zuYF9F!(N!|Ri(WB^}MR$!q1(%Rxy7oQ#HLmvwCAMY`<=_Pc^|{h*4(ix7xcP#jU`O zxDzkz;#;F)>X_YtDv`SAQaH`!TOtkWv{Gvtd@NIWEs{)6Kqp9nikRxNaz6(FF_sD* znIDmkRU$DrksEmm!!Te^Zo*$U7H%YGs2)S_(x>)9!dV+z)_p`^VwWe{R4~2XgE|~{ zznxN;(aKhbIeL%HyfU&z#{Jtg&o5dYp#2E@&68VL(w28EIqN9^$Rr?HFXc0Sa&kfa z9E7iIdB^BRM^!PLv5`?btwkFKjP5C87*$SfPl)FEL_$dFCP>h3rO>_n^tvGIQM9UJ z0z#&T&34y0o6xUiJ>tZ^@6!AZ1%KR;KIr~6Yv1;3U*!C%C+>o`L*Ol`FTTeH3f7#6Hx(){Y3J|J7(_}@R?UAF zO36ES1A4<*jUdEcW-@xCytG}+%vkk>3p@xCf-f?bcn($ohZ=gbjw0lqz3Y;4G%Qz! zS;(?JYKwfqw#B4a$q4gGPpml-0}f|QB(AajEM|uJS(fmXWvU+x73WM$O?%`j8N(CJ zY>C=3(!ahtmb??4oOUVoA)Q1F^tq1@FtJQc0(wWPF&RX+iZFbh%M7nMyoX(3eIp2v zIbn#4=ZkMy`;jb?yEEA5pP8K>}fWa&zfJfikYQ4bx1(O!W;% zg=B18OHtE;Z`y(}6hqgziPT{T=|LhRrc8BQi7vt zuSQiWM2n~qLO#lGB8vT$nX>sKQqIE)A!G6%0qq_W`L}EuQ@msxd~cy|f*Gv<>V8=f z94r){$>3d9VqlCqjDA{?+(bFem6q7_s=I+vNi`NW%7>N0H+QcQ)Tao10KKa*>Tj{6 zj#-5E0vF6SVTb@>q|Yx^w_-gP&;k*Z%rf-7b0%={QGFB?xOSkAX?SnqvW+HmS&kw*&DD~|eP z+&fBm61X2>q$d|y8TjVTY2C?)t&?@j|RdlWd>l*@;^9lr%qf9OE zhF$L#^LlZm`t$KK(G3n}WoJQ9X%aw|M*E9fKHWJL$8LuoXkN7@MX#B@+H~3b>YF?o z0qUvIJHL;4x8P^zMM_{ub+x%x`|J7WgiI&=?+XH@OmLGsl1I22<^Z_Om4AHCwiV;i7b4x>(w@wn&47_ElWs1&tqv&p#K~&me&h$9Y#Q^6^ zs1A%1mEhUyu~90697GoM)mI`}&wg16;q?|%4(uEx=Ri)ii3Y!P;Q%6{dNSc}Xz``a zzKd)jA~{1lhgxM%uz}Cpa_XsVwUo8~(+($1A)!WiS?48g@j`9dUaSc-yb1gOqJaM- zo@cb<>t|t2o6|tIn1SDi>@7Veo@;A9-iJct?ZFdQJLCh$++O-sO+?53p`AXryRi>cMcx| zPz*+jUZWZSJcV-}WWDk>nAVddy1btB5jV>?7_uY3ZOzGAA0{#41Wnf&xEFd*ar#qg zY?u$WSJxBMThJb%XgfN)yJ*enP>ZYI%?T|P%JiZE$EM2WaQk;1++%hG4Q@kld!c=i zBRLxKGHC>*DbheDi7KS7BV6&;Pjk6dPPtsVg#9bcK?tGN?(L@}$t*6l9?iJMdoOF7 zW)%v_XFb5(+mcjzIt1cMJ3cT>0%n=3d#%sri5e;)>G&-5(QQ67xgWVRKGi;c7uV@- z;6fQ8Vd1r5lt7$S}_(9qW@79-evhBpkbgt>W_2k#*nr`?8wp3U^ z`I=PD5_oLqqBL6-*Nv4@PWVw)ttAnA1rU41PT0$Z91rh#TK$^nA+` zd4#bJp?ktqZw5RFM2tvd9_2o4SMWyCFUM8*Szxi0cRKS&=-%b7jFrD zDl2AStlUXsva;?tCHZjjryuZlqoG&xzcw0f4#^~yDcf09j7_fXuGOxsu02f*k@7M! z@-lJ;Cf9x{aylkPW@bj$&etZ*+ubCHAUPSH#SI@Yw#;(a#v_yt=(Vin3@EGp`^89W ziF1XOzADMN(rWfzc5RDV56J7TXE3J)LgZ_F!{Q-Wp7Al%0)5Hi;lAWVE43voZ8r0Z zP~9i|p?>U8l)D0NEP~c&G3d0-_t7&^Gu^?QpHF{q^`EvrR23yxZ6I z-bA#LH%V$df)1xTT8{Uw0G7ZmNdWwCOFP@B##>$&xHaIecmTxCAR_vFYm(;=p3 z@2B0-W=-KXO+vXwlJ5uh7q+!WEt>pa2)wen4|qwL+g6Zeu(uDht)1|n>@(h`H+I43 zU#h*!6?LUyqJdq)z$f>ll-%K`0R2Wq;d6p9x1-|C5ze(AUz@xI%xC?_^A z@Z^3H2^pzMvC}zRcDYzqQ^aSkXx}ZzgZA>v#wiSWr}}+Ai{O_RL+Uy0jGA#0&n;*p z;U#>Gh+##Mv^kftG<6PKYAfn+Z+{ZaQ%NmhXoNN=d9Of*9Dqgf0@~PesimV-F>LcB zOfRQK;PhzPTz^G*n@zkhpJ;%~?Y7qga-*^NaH6yn&}VCuLM%CLJw78a8i2kvQxESY zjLkwXWas!c>Q!NgXGsIBc)b{Vh2L{_*7Z3rlVkGL0hL@sGT%vGSyA253F`?pFiQM0 z4cp>)Q{HqY$wbLrHfN z$(Qu*6xi>v-ugiA*hWzs*B;rF)9tE+99RoVb^%Ztd9m;53~KgT*^%6Qb)kk$E50#|>)2mUuteC*oSUdy|DA8d+fb%PIQL;z zvNbhgB#hHE8fr=_eff%0cgK+({K-hfQu}s#ASTuQv>N_FXd)A-41LbRY>XY$i5ml! zMFy578-rOx(qya77@_DzEvH;_ak8O(Y)K$fxV?~y49xI&HL2j!-q-Po$9IfJzKuK` zc25z5I&28E-8FiVVKe!50cp3k^-C7`Et;-|%E9)L*n8kbl@u|BSBjVOAtrs7@>OEb zgI&IqdbjrnN>CZ%giR@a{)7%8^X0o(z=i?UiSMLiUC@3|;BIrnY|QY>=uv_1Z$ukH z2U>eLHP4GYCX=O_hL~huIb8&c*Uj#wZLs)xtdL?pF%Ni|D*s6T%N&Lx-;;3f>3H0PY*mku&o+!Wr>LAOj(A?+%}U$b)D$gFZ|9TL54xAC_?8wD-UG}Y|jW1ii)BYBJ_El!OL$~?X@RQi5}P-mCO>| ze_AJc-#RVZ$*`M+1h77Jat~FB<5%n|DCztBb>dahM~@cyjUU*dYa*vF$d~ie_9wMp zeGz5I>uZ)4P|z7=4)*{4sp0GHd)pD}${L@SqzO7@WJJ*7{zwW)q@vFX0evaEz?Xxn z>R>ElT-X~a4!E{$<=U3(IzoU>d{JIqv?xo3hy~2J-d~(wLAuL@aAuTT5;pxJZ zfrP82ATm|wl8b}##^2ye7`$fbV%I3^BEW+3C^Ka>klA9m`%;ZkaFdK+0XAgqb}?Yq z7`LZk1`!ZqF?k>?$7gTuNG6nW7;Yl{?j3@P=Hz&CW;P{($42uW#%rS?ES@ z5uIg(fl{=yd|8dgEf%)oUm{qLqVD_tK0m#Ky`5z|WHR89yn!U_4dW@n4D)e9(b2+l z;e}mdp#e6_BfVDT3YOo*T^=!|$^9a80l1=!?rBSIJ+3Fy2jgKWilO!so9vOBT%SX_ z*TD5i3|A5v2o|J06~P2#Rka^uz*_sE-HDKvnD(7xyLy_&Xshbdk%QCD^pACOW?GRt zyp)J_poZ5!7BaR7(0`N^e)JR2qo}OW8%<4d=MK|@5V9^}Gr~tL0ndF<(aGshgzDb5 z@B{vX6ny7>7gr5V9deTLSa^z4SnMb;L;CxOA?_aFDk6@pZ@e_nz#j)&m-nN(hjK*n z19&)}o^BgNU@f^aD>NXaJ9X*zT^*3-7IuZ?G~=0ZLKxfJ-)f8IQu_4$cFy^C@0~Jhc;v7by#U46ruY_7z#KNzdk-&(qc4G^iE` zmr=ZcgT%gZu8_z6s1(epJISYkJlr2^LTD#Pn2ze=E0cqcvFoiY<9a;=J`F-n^)-19 z6Z8+FtT+!z%7VT|w5T>sF!8F0dB%h%3%g-Tw7y0z`^vEEO~6hg$EDa)p|&+|L!!+Rt? z-LC_f&4?_TwB^rJ4vsU~q4-x?gO-nDvWF8W0`ViC;4h3wUdgh$>MU5BHBk^oxqx)n{N26npm7_0BMAh9Px7y zZ~cmG_3KrP%@%Xu<1N+E4-P-i8xK|#AqBBXI@a^kDTQL z@zpemxl2;lE*T3=nVDPX6BzLI@OCw6LyC2Eg)$~KhM;BGOp)ZUDi)~nr^Wya`CIZM zI;~Ai-RG9g%^(uoR9wUva|$#;AQvlLdl+VNDu22a5L;cL6U{Wi=nB?n20U>w8bBm! zItn`UDq!GlYtqqE?6<`k1}4piE#EFbJjGTH*M8;PvdkNmLZJcxJVtd!H~`;b_0gm2 zkRfK3G?=x_Wza9Yt@$&K5fgf9Bpvp$7OogA=G#pSm^{aj?7GVX_q|6?p1e}wtlOl& zJEm}f++Oxt2-_gRz z>{C|69So$eDCHwN`gxZ7m{-uqI-DeI%R6a*+Jix1MWog7-WZ#&g0{!XZyoA2JO?}E zX0D#To|=VutYadcETYcAlPnxO-qnct2p}UIx9{q~BpL3v{XX;=wHZ+G3UFhB(ID0^ zesWy5J-_ZRmhbPpp#5b3Bh||P6=(C_jB4P{gk)r+z&_{BjEz3l3o?nFBP42{lX04W@DZx;?wo^bS{f}IU_R5T(eRv*562M zL0n2gosAcc%Cx+3%B4haywR6(9;w5eXEh?&dEYn=Ni^HNpKrWXetGxPt%n|&_s>U& zhiDSwJDTX4RpE1=BYf zqS``8&-a;wmqqF1>FY_;7jpO82CS61rAKfkpua9KfB1ImO_s0VsvtEo`k$$`j=1WX`TXS!&SiXVSb;Sqv-2mWLfzz z-?WzTF9~nwAR1sRz))3%v*dN{z$SBU8`RT ztP!Ix_I{7)Z)DXj3+PyQ|Fp)&+=?=Qf#(I`%dCgP^k>-qA)l-^BZm45JR~Ij7Pa2sj&{-}U{xQ`pYBBHdF_?Cg}R=v1CPltl&b<$1LQ zo&|PgHygMZ&IDyFerxTZ+KzLgxukVVcrlc>bS3D2_|YQI;y^N3UeRlf*1VHEKeu9| zJe?+AqDHEgJqV9*{v*Q|^0J`tJSPa9F=XMnd^Lf_hVep?%w92{*Z&3U^Dw z%N%1h_h8r8T|_Yx+mQM}ZMq^sgq(WW12eF~lGCG+EuP8rc)$7mlvux5KeTK%j5hxRxOb{ok*c9$=FQ@Q2@MOM5%Z?q z8;vnC?OGa8GdYQKLuyz7+g%xcr$~Z%Dhp!T#Hez5H54dfEzlu#H;@!$*}a@;$Xq*L zYahI}8ruR!0h^zcJtl43F0_iBzEY&CsVl#Vc^H@XsjXcY)bYZH$zwcWXMY=nV)@|c@3=N>ei(TBa^+i?jXS-v8{wgE zz2^V6ws8}ds9 z8usj}J*c7*M%37B565PIDHk`_RNeJK{*(fcEhFu+jcFjRqJKVl4*wWR788_AWET8P zk21D=hDU2=E8}zIJ~Cyd?FklBx}UokM*450J=M^dZ>rnv6B^OtG9{KY?>XV4NZABI zg;?E@ZDe9ns$LCN;y36DBW^-7zO2YI$MFNxVkWz<^7@xEF>_3ZtvsqlHB#P*RmlXO zDqLx$@^Se90kQC6{F$osAR??18!ejN+ra=#05-12B|)cY9fHTD%DU{3L8p6+Ctca| z^)Y%oIx-Y8h#fu^d+b@EOF$ySnQ!G>(e>-+<6Rk^thx(Mnx*opADV&1<5_ozC3g651V4suC zsAVs2ImGbF_VusoRNgQg32GH#&N_xhcW;3zh6Upi>sqzUjkpum$nPBs<7EXh77v@C zwrOBnirpks{CJpP>(g1b?_!=X8?%VKP{5ksg|cA5DASHsv^ued2JRUyY#C`}&WGs4LfIvmt!jhRuyNN4gi@-x`Q914bI8z@5( zPK5_!PT{!4xc8NOr`xIwr19I0F|r$grU2c`0W#%xZpE@Nn|$3?QM27!aG+9vTdE#_i5xFW9iVQ%U&;skZ7m4DJUKm>@@|OsfEl+u7 zXLrn^7xm(sBrJIu$?YNbr(b#B(Vdk1xZaKFkQ^@Ww722u z_n&lK<&@apdvG|q=@1nGpWdZ5F)ZaFBQ+y0I__JlNzIot6f`mLnn z{)4=k$3trDKzrVP;wZD8oAD7}iGU$R1lNieN%Bj}jtbq_HV}*}m)YK`F$`Yup0v80 z!@W1VuL!tJo1kW=bBS-w`gF0F*1kiNEthUop>SkuZzy~wAqi!v`sfEXAW0tHJ7Rgi zA0JGcy@=B&#U$uThiZuG}xd;p+d1+K5Z8F2=;f0968%7x-9->L9w@Z3j2QT3dP z>!c!|Kd>EM9K2bpFMoMB*`0E)V5rJ7Z<+E?V}ncu5{&{lttlcg__D=qCs_`!3Ac_o zUb|+}48G3a+z*c=<+b_^o~s%m-eddxRuMN~Sh-YdSm}P|05YardeO1?+ZXQzyKR>7 zyklAK3cdE-o|)$+EZqS`WKviwr#3O7)x`IGF0h0MTRu_a*m`0=V%QZ=+QF~0zN{i?a8CQF4 z4=?!YE1-Ajn(pk*emAb8C_yGAgV=-=8+59NGY|!R%Opcw#d2p9lRNx&+noi}ly+iTa-*z4%CVk+<&omgDot2dpM-KqZ zc`cV|4H~ldPe=LLAJxp~J#(j4rZTGZw`^Ap9#Be_8;WIH*z?~Ga@Z@pkK|qcIn&18 zecigxoRRHZCdNC)-zb?sL{^rTP~23pGQ2d!+%q=fdOVo9@Z^?KeDNoA#!lJ*> zkBEV)cixsFem|!_aiaq0rORGVt{`df5l1b)bGg#}A^(!=VQ1lUfePE9K@#WC7BBZ~ z?cv6!(#Y~_f37{66+tkI(@l*K;CQT z8&6oh;meU-`pEGD6wab6c#rs%{5H)v@LO!~Wf<`t-m)2HoljpqpcSuEU!~nkAC}=@ za}4bY=m`uxTIt#Ibf=tZ6&$5%3XRt9Jm}nrLJt>NL+H;edni_=FV|If&K8oMWxJM4 zFDz(oDn|BY-5r}Ua$|Oys>zhzeH&tIOBg86vykWeu91!;g~?T&W~s*{8X4Apm-{r# zHx=Bh&s|Dw38c)d_)a%0Ni0qBo1$(Zmo6+&FE1Xb^MeIR`TQ5x(Cusc8!LZ!GKE`9S)5TW_Oh`~)} zAr{FI4ilw7Nn^)o1u0*F(cXi7kM{Z9t;i7iNH@PkjV73bgtrT?U;@87KJaFKc`3rK zY~|7Iw?7u@u6;{7x;(x$xo(w2Mz{qAxWBk#_wXcun)>3v?@61+nx-aA@h5LGUvo`5 zxhZX9+`~g}b+0Ne+_I`+3W3yUg8>Ob5RcsOU=T&B2$nNQ`N;V@Yr0wV?PAU>jn*Mm zc~t`n0H#(|No^o7I;2NoZ|T?D;@EK{Ecj#5;SO^qGudhtv5-I|AyZmMkE{NxA1=gX z6O8is6jkIjPPBI6a|lZgoo5JI(BtFBqaYB_(iEkN~^5DK?_X24-CdN+uy3fYS13{~6;%%8&dUCUG%Ei+|MNf#$ zJaEBu=Yg6CLfS4fEUJ8dXPJa)$ESylSy@!*1K7g0#Jd9JJnYY%;8Md&3+lI(W`bSv zyL-X2t@}XGm5}yUHFL7k+{*iUrpp-jwGFN{ZMnn2~Lm*ldsdK+b8gXl{`yrdXF5W~sQb+z59WMt;tw^@t3m-km* zu22Pi+X{XedZo-GO#f72wEEeqk7s>y)Hc4O0s*BLy!tMiViBHau4{x5#saWj_8bb;KRTMX5gz47AtLBqa11KUh5>Z*5-PRYD=M!$_&9N+ zY}iWGd2JUmk}t!H@G4sHl9bvZme?arFj-4xK5!x*FcYmubvh=|UtF3h90(~RGo~iC z`6Md|abUYs#blb6L=epRnuJyOf&L1E*cV0#l1luuSLKC7az2}JCvMaspUz1Mlzx=| zqEmc1*EcL7Dq_4S-Sw>(g~^DqeqJ^#ch4uf?YQ+SL%{%;`}mL|l8(XyIP8m!~DeDxK5c>54l zpKYilpWGD)XbF?eZHnG1cOx*Ov4IGkzFw98*yuB#^AXBfU|2G?n}l0^cAgSt4GW{K zZO+-8>>R%h*@0m~id6K%d3c`hPH=D%=*Ry6xq4HPggq0)^jXCCh;g=-T}k2EVLN2P z)+{eYY~C_;Agm4YMww|EZ)=kh(Z=>}Lh|+{7ZFdI!n{-sHJp{nF@EFK=z$EEg>9C;p$5^Q`PVB=FFg_ z8f)1Os3E>DDoH+2M+(=LynpL6vb9p?{+aj*UVSDknjGAMVR50fcFflKoG9;(Q8G0% zfkH_e*VDJ&fx4GAqB)~g5_a+A&G9^3wNk(02sQzvRf0#7fh%PV6BaNbeE)|l3vt1I zvbj=s=dx}MSF?Bm$;Lxar$O{Q@LmE(@YQS+Q$uEag+odY^Q@?pgh0T(yHg#{f`@_` zdi`Ijwpb)k(Pao1>y|W@@Y;g8%=i*yWvCJtX~^{76oUa8(be8Ndc5%&zu$!SH+r}Y z$OsNFvOnh13^@2og!b@0w+bu>V&VWT`_JR7_3UbiId86f8UTEofl1YFi49Yu<3DL) z2{Sw`dCa-Y3U>JEvR^R4Y*N(MgAyA^WM z{*a@}cFXF{>5p;#%^}a>*#RM8f>}$>fy#>V;(~aI&B9{O!1ghmH)6i|Ir;QYFET@E zg)nfv3={dF5Hf?(WcN~-koAT#RWAtznXRU#dc8oINV=ppOwhgd$5;gi(@uJ4hZ5%P zS}{`KHG!ar%>g$6b;1}4x(wNM5qbDx3I>^Tk0~nL0*#1jhKO6Nduquof1FTy_Lyt6 zFj0#-rFMu3uQifwq94~fqn?cxWFR^*NV<+?Pt?7ANBhHKmg%!+SA=pL*8pjr9}Ufi_(}DOMp*9;2|Q&DMPUn zM|c=7EtNKz`2b&OhznT!E$T_0l;AOR1%rJ$(T_bsV@$zTJXDPe^_8$R*+y= zZHe%U0pnn5>fQWd4v29f7_ZV^Ee2Klz%F~J0Ci#NLfFdp@fT7SqTp@Cmux=k-wO9_ z?J-h*g57&^-+c66|5&5wW(kAdEI}V{Vxs@HKP~QOH?=TTQc^TAHCK@{G(+#7IHGq= z?4;#Xn;PiID=8@C?T?X&lo4ih3$}6B6c*zOs89X?neZT?>C*Ktuoz4w zC3G%UxP_3CFY~XsrYSGZwvQg@oi`df<_I(DRRAwmbte5k@KWA+JXB4L%TMtp0SbG} z(P~SLb5~#sT#m+fML}m#Vutu8xL*mK2ES{On zUR7q*TvhQy1{!mVbVU_6AG>&AD4^$4k+E0(XnMR_*#wuY$#u0ZKHdalrcMun`RSLR zH2#X)9lQoauJ)szw7XBZSV+kND87JQnUrvioFNajE>AA42G657sj(S!S`1X}+|{$K zXI7as^3Qc>dnNQK!i>wfz8rsj=;{`=J!}p)BQ$lQ8?;#tJj1FKM?^^p8h0dNWs1HQK@}drH|vBWVyB-Z$QU9WjtX9sxu`RjCzlB zlIjNGUyW(lb?F&$vMj$Wc-c5zlP6>3a|?xoXGsN|DYv)T)*9bs^w^7EE4a8=j=p^M z)l-UMTR8wzHWhYA$b&~=ryRGN_6P*Q#k&}@wC#1uMqjkL8^+2ND>M-VAXDS5fO4)E&N z@9vDMR3@o1w=B6SISZfmo?En@kCW;t>+`PU?CDcnC+D_&=y?%z_wlQEIUZGWa_wr% zL0nwo&i6e7Y{oT1vdJjE^p@h{aG4Y6hhX4rTXLpgY?VRRX%cSL>D~8$HJ`BAWtpfx z$xI8Qy~%KI1oA`gPKou|YEjM6wwusPS8|03?|Idrk}HT}_icsL407f47f(;WJX}sH z(Q781ouM|+Db(hpX#k;>vq}og1(O}MjkwE7(`CsL(2RACxkw|*x!#6vxx0Cgq@PS~ z*0OY_OEQ`{+A@80vX~y;(H&i(Zv&bvuBZqPv!eO3^nBpNA?T9|c~nt7-5_Iv5qE-Z z*OQ9K?K*sskBbl=OaIPrcM6td9@*rFz|(LWh=o9HK%44^DIYsgZkNflHaQa^L+N7A z#khPuT+$^lo^0yOYrl_+&nO|D?;q_0=(n_^jn>53uT?jEJAyVIErBZ_OEr<01DJA; zp~)$9P3>n}$Xl98zk8r_uV{A2(29g_*qa$!=GW!7l@6tu$5N1kK?q!_%1&#=CklrZ z&k27I+elW>o8@y>M}H9e&rkbclM3S>p|zJfx1Kgl-7?6qdGBS>nL#si_*O}MrXJSl z^7=IY+sSnl9goGEd!0VN*r*pgzZ@if^t(F%WaC)kMci3Ec4QnKLZnOgny}19_8#GX zb}DhGU8;zoiftLPE^Bsw*L05(8Tg{>x+6JvAVJW-lX4~UypUhf-%r6;K|%hj_4&f< ztAQLKEb3N0u!15bBg6nj%vHiwW% z5aZCnTf9apqI%ue`muq&VHN#&0J8QAUjenI&BhnKs<*QP+*>tG+eTH9YRh`$##|Da zjTQeRtuIp06q%(^o*W}QsU0$ zdIut5n7v05N&$f&HUXF@FtwsV5XT^7h7z#O>P40@Vw6_|B}70F1Rz4B6#yXycgr>l z001H|QV59UM5qW*?7_AGj94rXD^eRI1c1yUNdU6(BEZ7rds{#M?%M#m{bM*hiPE-e z?8N~TGqNKaWDxK&xUkyJ!~NDLnVR=UO zZ5`fQHhg5QQYu}FNoFnyVE!t8J|yej8U}7KuI75t%gpAo;nh!{t@WKdu2?zr?-t)X zm-+3)W3#nN;@JltptH_iYV}aR=-Sj=GbP11Ll$BsB^Yp~9mIg?u#m_~AhM!f)x6iT z4mGr!fmp~kuadhx!V+IgAu5G)e$VHw-f75gXt$}3TKA#V zsMFofV38V9TDLjVNE#7aCf-}_r&n+il@lpmX)+BRcS#c7s6LOW2SD+eZ9yBxp^7C-}-Y0#`Pn4%4S8G+VnN!mxzx0!lz7XKh%zHKt|<)0K@13)f#iaKrL#HKI+a>RkPum}xA)d0PtLS$ zyFcEI?9-e`tb)Y`$(Y5g2rSD20KPZmKmx=K#E83ZfkPk@gx`P&eZIy0vAg?+v1GJk zEMnNF_qEZCHVzHSWieuxc>n;^=g+cUncco_&DW*eC)b+eWqgCdfy>yjjLFlSl zj(b23#0&uag)<{Eqw69D zqxWHE*2D3=jq9y9$4^g;*QPX?y7U?a@rQaHR+ZD%%>Oot{lJ({bbrs!ob zWYctJK>{~Bv#VZ~Ao2)oKR*IfBZRgVJO}^_QsYflAY&FaAwkqfb>xbT0Ojbx2-yO} z603sC0cci%3{X4ge<4x_5y5~35&&VUG&vQip-i}}%j~6R6oLRVM#WNP01---SDrfC zw;q}C9E1!p003{A3FaHA&0AbZP!?VwyMFR;oiDK_@c>a^B?kcH;dBHDB@0%o%XuVl zQYeJpBUQsKtw3M&Y!Ss_G;{{2)<`(bQZG65$C;CjPbQ<|43 zsO&=*>T5B{znuZ$WI0$v+?I$Y6cx?|-oX*bFb=(10o3h$7AUbC*Pr8w7Qh~twebVk zPz-|*wJ;}5_g#OXw$ z3;+pZ8L!v^Xcp}70T@}qAQJ-p8DJM<_mv@QI9*5iqN?ycG4+U)?wQplw4{8`q>4f4 z5HQ#ipF#Q+1^@&L#O-LNjY7iG{I(s6ZJUu$@LqsbRS5yN2Yi}gUD05!mLvUfh0SEX zp1$0wy=kOwH7;*0vaGSX5?X*%Ye}&8tfv=-H6>Oo?tHL&&D2CxOND0FniVX*iG)aCrjerMUNknNq$7mR};I<(xobx*c; zQ;^#n2;{-UcRGqK^+9=G-W1)3{Zd@avxe&qIpc2x#Xc0>*cQ;L0^}x&W`O{^V(2w? z2mwJ%XsiXfh)6~NayL{6hZwk#k)ehj=7ttX$WcDXq!pTf0039Me0Xul^Njwne7tj< zbNiXe=|{BiKA4mWMVP#?IZyp$vDaga!$^5*)aSHdymuU?nFX@nM}@Q)>|hU zX2pA{RSlkh*JD=xx%n;^tC{@!lA(%U%5V!GnXcEi<(z7$m<}nFO{UdF=y-d`ln77} zPIt^Ok<@X$%RDTGEb6*;-+q5JeFxIgTQ`d%)blE?Fo~U+X!OeMq)CD4{t!c_j_~VXHw797uG?3~v-Mv-C!(DfOKXU;P5Mc!#fg%(LjP?J1qckG% zGuJ7@j>H*pBpG!g(X>~IXce~W5HJ=7kDHE=Mzl#Rc8M2I5kF*KJfMJFZNbP`S&rl{ zs)2~u!bsretYa5St+9P@Kl+QE)j)Ph8fbvnG(aCfcG4UQ0|3ApU_unY;uTmCfMfsw zv9b!mBFO+2upqQ9i`clXRt>BSMgSD>Qbhs$?Mj`oWOI~29>3@-sD^ZiB%x3J-gxR> zJ!a8XF(I%i>s&`Kd!8$+<$g?uy_2sEZ&UY4AK$TkzAmbrXwCB2?jp5HNU(abX1044J*;8=>aFoWKuGs)s zFlYU7c?fJ#QV2MGA5!l2_?m<~Ro5^_b-Ohjva4lRl*?)j3W`M~(JL?vW;tk5RaC&9 zH)F}Gj6kcG&rXF>7zH5=`U;g@%0L%{L!RCmTL>g*_x&m3U>wFh`_52>~A4T+X4*o zG|CeI3))^zpgrrBV?lcWB9xQ}^gG~{)8-duDN!@8p0D$%UN2^MiPT7bBU^U1j>q}bp-{iPZR`qz86anrX62@T*Ft~3i)!K1qBf{ z0OaXPgJF{l0qJE>SDKaLAV7KnvhaijNC8g`V4vZgxnUly-W-r+rs2@C8i$BdZa1&B zI>ORnY@-|5B`c)pyM9~hD9?!{H(E9MvtI+%yC}GC?H(Kk%MW{8%^^Fvg}u^dLzo&4 z!1SB$R9Ko6;E?}*c(U&1>x+x^7uM?4eg7!8{ zbQDX@uonT2tT0k&V~GRQ>58Q7dE-_94TtRU%4Nf*gbGBd8@V_A{_LHRJY$SNIX;JAx91XEn+Y$dY(zq{@=8{_QDV3-TcOe)iEIU`Mi-Ca5o9&1B8iiiNIqM z@UN;Kdr|pbXRqocM3FoiXX{f9JEUi^1ab^+_w;c9268`(RR%CfkzdXZH0Cr0U{;kT zX?fgHMBOCmSqgafY5lVK?cVajT2esu{NCRCp*yP|6t1kMESXtYdFd3f>nA0bLAA0b z)Cy{;03>G8D@2U6ASA~u_M(VIRI1)OQVkUPbkbu0)CpQ2P$Zs>h0Gm7`T;fvxd!kk zfCm4*bpXM@e#H0d>ivVbd{UAxPv@eJ5LPr@AoaacaF{X~2c?>DHP>tu%A_JJ zR8@!+*{9YbECB5Nb|z0-r&d7Z8h<6#wtpEbNz?t)$(%>Cf(|b`XT1)F6 z2eG<-Uu2u&@1GTxO_miQ!+B*XLZro^B|>YFJ{Qj+L|T#ACB@f=i0@m7B0>NJ2FuTO zTZTw-haWgBx7ZCC2;A`lbXyxK;N@0AgU4Ra{#6{_*j0Myy830mpA7*ebj=1P;H zRT;2I4?u8AVIc6834CaCYy5psQQO4g3iI8ys-o#R3IVEe`c^`<7YyONJM$%VPN&)H zqg=ZH9Qul!WV>sW(jd$ld4-9wiyBLc^Z^KyV~oH>fX=U*#W%nby_(+mj+YXPCuZl5 zqbFFCE4Bha5hC>ti2|f84d=FYEp-7T0zFRIgf2CXmx^9uP#BL5PUrDZbqYIL0KB&?JJWDCTK0|O;6tx(Ucvi<6$F#t58S9sFD8)Z3?D&I<(cJWU>5kigXKiaXzhN&@cz2xE#7xbX(srZ+aT?tE8N zgt=KbwE_RG)}s_6xo z=Zrud8>}IE#VjRs5KBkwTl1&k`MGy(x!i{$qIjY#yr1}JT_FmcVAX{vT2tnw`bjSM z#HmR|uR^O?WLY#qZ$ErcKmi=$N-d~tYmz1<(N>7S0Tyuo@ACQ~w`di%1`twJ-g~LE zM$uR6&C-ni?CzmWU0+%5yF8bn*B4fuK_IWzB4Kw?VD<6u8ESp6NRJIaivY>7jU0nS ztkoI;6b7&DK#7nL|BJj52Mm!Dq~G(+2}gnDFsueZoZt7Zx1}mZY7ws0TUHu1QZB15 zE~l4=k_dYksj^$!!c&3Q7Oy0g7l_XGqWHB!SUv5qRP?AKAXE($`gX1$!|s4$-$GnT z1(lkOMmeARhhmqRDR0CC0{vMVO*6BMX3E?@-qV#!PL0(db5=86Jvrb|Gf zttb*&IktxI0c=t!2H@oa>~$Zb)|q1HlX;rOq>`)zAx=vss?N=VZLtbM2}k6)+)Y== z`~7086C?ulP8}*yooWV!dZQz_JD3Mx#V`y279Ak{g#SEpw}z^gfVXAjSnuz$22A#V1kJHdj9wv5r+~^p zaL;Mx?aYmJGB`N^W{Im)G!q)$W>qw`ZDpG5aGwNFg-F7}X1-Q<%&>wamiL?nB=STB zB$)yC52wRy6Ph9~K{?*!_q%o2JuQVXM&LWR5!=F?e^%GtD>aH1m`JB;T7g9WhXUD6 zWWNo%E%`g2do2JI>I#ApL6Q-h#)CIa8VExOU_PH+e-tZI+bo~~41)~L5ZMk%k{hEV z`lFsc1AL?l1r+ULp_T`Zh!D* z`(*p2qI~}u3%O=nx1t&mj4fb64ehj60tERF5nFhC5<`fiXHNkX{t7E?N_d9UEc)~r z2%UgrJD+v>eDuvG03(Dzt8_7l6-F{*m{M!A_GGD8nJHEo>qIRQ-DPXFV_fGl=tYCW zjqRGE2hdtVRNH722v!6-HyqLhN6UZ)`ZhPr34`KYg8};X0|5AN_Pi{rdHVVJ-ROtd zXXfjD)JdxrsxC7nS-d9!)VNr;$QL66^S1aDub2OMe+W11aKjD1-oEDW>1$TT(pZq zV5KX`UV{Re4y*bWb0@<2@Z|#dV!sV!E~VL*PtWWnCPd(bj4^2dVnJdprm`?$V1qGg zs2p`Uw(Nw7vr925Us3{asT?uLBSkkw-& z$Y%QdOm}7a&&!9)$|wCqetEs(wescRvRHpUzCFvnT8Aqr!0c?>ES$8JD#bH1F;Bt> z0GoHGG1?d0ohkU*@MHKEn zoQ37;lJZ(2LAS6YusCn8Kau9?7(Yq3XA#Gd*fwDA^Hf7Zc`b?^~2+=*neB{X^9d zi(ON38iWy$4FDDlq76q2v;u}?gbPAx$ui#JSO8!xVXCbx%N&GmLJOQ&8euSi7Xu0x zBg>LypbHQ~01_)QjpkFY5fkQ03XC9EVy;5T`&LdrU#SH@V^qF1|4X=;h9+DmL%M%L1DK)P@{MAbo2t`773FMe&QZDpJ`sb?R;GC_%hRZeaQ1SbrDUz zT&FweGL`DpFZSt>@wPeVLY8-K3$X^FWub3EsBO(CgM~!8)7&=fKl%dWCoQdIOD`)_!^W^W~g%Z~4AaqdIrVMS31f#=>&! zIF`stSu_Y45yb-DSxjaT4Wzuhuo`xo?3p~ssd9h}0}Uhgv>qrgt}5BuxDgOgt*{&G zr8n0?zp5psMUJM!W^#xt>|OLV;Atm8ywkrfWlsYPO*`mKnh}XhuU?R99R7f&X9sPXA5+TK`f1W}Y_$sQ?_%ROs8@kR}i44w4Lg-r8oS z-1MBDbw-Qi+xlq5Tic3+U}hF$CIKLBYUY^oH99)9bq;+`T}&)O)#=s1|9|{Z-2b6@ z_a5t#&G@z6U`bBb4>Vjmy;RG6HV&@!*S*S)XyqN)UPGvGwbmdZ0aqb%McKWtY6r>lT~%rJxWc7czv5K$$XK?J#XiAW^{AdL$@pKr5uI zuv>&e1wd*HcwOW&j$Nn+xh+v3Vw7?T2nB{nu@$I5fj~)-5h)rwBl_+|>Vg@Nj1d@c zEd~%cC3g%MWH0-+F8~^^90HcX28IG4qiI=?-!HkJ!{1fNF!LSrq>$@^z$^ubf;57| zPpckXW~EzMuggb22?hQ)BtZqt4nkNg0q*m0sJ#ccfzaXY+fDE53F!J-6U#PR--u~Z z^DM^9v=b)|4gdh;d;Q@3nAdW@EK_~<-+%uNFU-mH-qZMDrm`WGWh!Sso<`}?V)cGY z({RbD)rur)Z?Dy&tZWAiq6VeMYEU#WQ1EaxE6cb8JZg{HnN_)XeV3=#j4DhqLnp1Q z?!?teDdFkWEV85WKqBS1iat7UkRFMo(E=m6ib=O_TOH;w)eOlDH-%10_;p9BO!oZYT3D@jRisl zEJB#Tk}W*4k*JJ~1Z*(ER<1_GIS_ydg-4U6h%L5YD=hm&8Bu_maoH+C@0o;HJ&DZj|iamdDOqiXmwdPh#nV6V~nF-1OfMosZ-di^_@w}|0 zNqbIiPbQ;*->Fk0sXcGF=2v77fB2KXdGPt=$I)r;&0ww;O`EDV4tiqM61yTZ>jS!7 z7QJ~coq)1bmmZnwux(|uSxD5H>^5fdi+ax3`i=4q&CBF&L|`A(&-J6~#Np}|JYDaZ4ZBATDIj8_ZF+Z*c0z9(yq$>$ z$O{0L1!fUo+brNoY%rPz7B}R82kHhysNr*Nh=2y#4*)fMeggo+Zy&b(?q?4HV~jc4 z)=If7iJ6(0Y4HGn%$J+{2`( z2#}8cY8IKOlttmcJS@yci^S+mF{h_ah8_?AF^E8!wLXyg&51ok|;SN8cYBH;6;sD zFknw$jKFe43(BQX03If>1z0wgwS=hDh*elf;J-nhIj=hthaL+sA%uS&xBYMbD=%H2 zFX2d2EjP5o;dN5dNDxyww^et);oaJNsvoEn38DLyliwy!2%B$vF7x=Ixo-okH3Th& z#r=^gxRe2aB}4$M;q<_^8MZ5<^x zw7wl>fzlyFORc;6hvzHzDQ3$SCf5MoPH~Xow7S~0yQ2-7F97h!A5w*BRSONUyihx~{lDQ~hUEJwuZ7YQNg3Wl> z)z=SXZUWi_0`HGze-Z;qk27B>K{^87?u=PDo7!= z{1@9RL6&ah_a7_{i<{;HVS=3!e_m;@JCzDA?=#2ITEcP(TL`S^?S4yLJ#Mo4C2Q2@ zVy~;~NwKeo`dgOh%AvKEUx(*4mR(cMh%haznhdqHnxrcw1fjhs1g!#v1~mS>l`VVI z10s8;E0D(hLq@sO+TS;(9^I~nkE}bE9KjaNLQ9;O^ z<(DNah8+6*0{{R3ymRgO`%h)Z&J3VOA{rtazBN~)CYfnwx+DNZ7+s|20f<~5$pEN% zoa0{kWDQlRe2~IjXoe4S_*^A5QJ!UnzO(nAuoF3Jf7APwk@_|LGGV^CdRl!Zuj#=_ zYT-w0RF<`>qLToCYLa1n%vH5DdX9KFzJK4$x<6kln)U0pjvhuVG@@S`u{a24k+X!s zME4bE7jya1%i!33IDfyy%k-9k&{?>0XG-K!@Y2&nvi^F@lF~CZhR7N4pHvmpBYAqy{nhblJ zIh^?)RPTk?!=t_DR_{9k+ZGrTNw8gM5sr)_SuG)i6%GMliB*7CO92K907d{S1bDRo zJ~-s{0;%mFTg>#CHw?f8)gCO8&P1OVg?^;nr>HfbWvx3r?L>^3#awm)0A7}Lzsbkr zo_-zg?PsdNC7J!2?H`QoZ@1nO>t;?Zv)*A-S-$st(lXdSU2iPM4?oXpX~?i4*4JX8 z`R>iGC!p6w3Y7z^O0RRjLh)`%lD61{YhRA>b;QKF$ z0ay$Yi2f1_W59$U04y*TUP1wJbrH*DDUKUxG7vC?0)cS^van=SFy{-_)vN^>r^}%! z?}GqnOiEp-EFn8co6(h)ELcW{$iVtH&fJVo*D3}E0RY5!g)qK2WTgVJgAU|A4~HT~ zAa>AUK%aN04nU!svp!w>6ph)|t1E=H;xI8Y6EiUYpjTPWzG}zZ_a*!6!q5HMZ$6lM zvHO^cYq)mY^kXNl?<}&o+P2-E7|uA$>iK-TDqrk-X|a>k)7qtrFzi6iW!~?oT`1i- zE>T)NKB`E*1mFw7eH_hO#H>?ean67+?fc|(1VsVkdCQQQWIT^he>Ef-6B04qw~LB! z*$#coWg2z-uLQNUn?e!0w6^jI*lzt@mC zT?OmH^$#lEI5a5%Vh4ae8;3r6D7~=)G~bcuVsMk9wol)-;npZut5Qsi787GJ06>}# z`yX!)(zBKOp&iCb^6O{4Ti;G@SLUpuN%zb$%`>dqUtTpYd}Yt7WF#NIbQ>$#%R~no z81ki_;Ng-n7hI3b_t!gjrgGeSpKT-(fJwV!DHjbFb{C#8B<-+sF|b}$DuPkJf*qJ* zDHT}_H8g>0dR5r`ZC)}8^q8|IeT_bUd0p! zb6-I>CIn;+C@?~I5Xd+Yl9whj00IzYSr|RS*Z`}LJrl|aAJUHoC2ORS5n*K1^p@5y zP1HImX~_f*3ke7ifiV~bfD?-@lzAAIa`J$-KcISB+_%oUxPfZCJTD>wQ~(S7VTx_9 zwgA8g8*sdzSrU*3(AM7n`2_oh*`}!NtXmTZZMZHo(@X;Z>TIuG@11i={f5Q9Z~AOE-!;A`OuwDHeAe!$*Kl)9 z*d2dQ{wUKJ`?c$4vRs<8eLuY;?)fnltyHVM>xHsb#7o)j5?5AMS(OXv6rt|MyE}z^ zRuAP@r978FNG3bb%%n1NUrT}unkvm&YdH)ZuQruZPB0+Z<%!+klmgLAJ5hF<0!fl0 zMCuUbT6++&Be21wE6&msRRvVV0HbrGmK4Ym2q{FX?%ww|c4(N9xGATEpmOO74dHf;a}IBGKp zgoWWIYKbzD+!z1|^)bU%QFBWW|R z#hOG;2bi(cR$Ng+nYVg#0PL z7@dUp?^XB!PV@Ve^US#y*4d6$!-&J)5N1{#0(^Y zs&&r$w@6RacoicVK+**Pnb|H4>k=qlM~hYvOc(KxK;qGYO;9H2nrYQS-CoT>!3Hr_ zm+35*$Tb36U|ucDI!m$AOH4%ztGZ`b)l@M-swrC{cp0l-*b zA&Ai4R}mu{h=u^8034+_05Al^G9VOC6zPzQs#oKTa9{#CprK_RCYoSqM&()J%mpC~ zU=Rul0RWyh*o%?e!YTFSbbAe4nxXGpbkZYM0Le6lv@*ch)@p&Vo!j(Dvn~>_-`oM^ zq_-jM@qx2SiApP1@Xf2h&!>oFPqNeZ0Z(UVQvd|g@&Et;0000fEC2uq0001b8q!Dv z|6~7bem8`^fQlC@Gt1DUxo${f1r;AI(h9vhPW32GGVL7?+{b8#Z=;&Z%Iq>RmuV6J z4s1ue8{@w$4RVdI+4Z~m-eO?>Zen_6zquTW`~A4>RbTqsr*zyOe{9s8ud?5q@x@DT zU545%V^<^%4n3WYvh^->KACA5PC`Y-&y~f}IYoYcEqf4dnc6+7ep}R(dc2=uPGri# z^pG{(IUS2AUQG9@lEF=?3MMK?MrOHgrA#v*LdZlVFhmwW%~If#>GpzYq9U8La|@x0 zX$ycgmy9csM;K%T1%Si~%djqB1jHi&)`(SOWO-;og%uF4HCl)vLKpxbB$8VwjSAFN zNfnqbkV;rOFo2YSffm`wvOz@}LzJ=Uw@U^Km11aFu22!+knLYG>!#t{IkI2QRSE`y ztXRmYyM{YbNmFLw?*M`(?>7(F(ghFzXhpJ-i~z(c$(|jznT5q6001nkAOId_9GA8U zZLIPX_VO9JjQwaIE1K~#8WL7+d&Vc{{q<+X^*-RQ?tRpES{oKry;EHR0-Bit04Uq$ zV_)4T=L2cI#s1=b;7uR@{>~C!4sF`RJ183QuovX000Av(OVZ<8Pi;;!JNN)f>Qp>SdSQixvYmggj zycn&WZqR@mpe3%g&W8;jPSg^|9n%&TUThgzSVplF3(KTM$tV<7N|Z`LMQ>{=C|Z$< wf)yhc9Hha*!ckeaPNI`F=EG)!?32I_Rul@$$W7kOEbsMKGv*BtPS+Vu7dZlM5dZ)H diff --git a/Resources/Prototypes/Body/Parts/skeleton.yml b/Resources/Prototypes/Body/Parts/skeleton.yml index d715dacd01fb..3b75bcde3c54 100644 --- a/Resources/Prototypes/Body/Parts/skeleton.yml +++ b/Resources/Prototypes/Body/Parts/skeleton.yml @@ -23,7 +23,7 @@ - type: BodyPart partType: Torso size: 14 - compatibility: Skeleton + compatibility: Biological # criticalThreshold: 100 # deadThreshold: 150 @@ -43,7 +43,7 @@ - type: BodyPart partType: Head size: 7 - compatibility: Skeleton + compatibility: Biological #Unique stuff the skull has for one a skelly gets "boned" nyeheheh - type: SkeletonBodyManager - type: Input @@ -80,7 +80,7 @@ - type: BodyPart partType: Arm size: 5 - compatibility: Skeleton + compatibility: Biological symmetry: Left # criticalThreshold: 40 # deadThreshold: 80 @@ -100,7 +100,7 @@ - type: BodyPart partType: Arm size: 5 - compatibility: Skeleton + compatibility: Biological symmetry: Right # criticalThreshold: 40 # deadThreshold: 80 @@ -120,7 +120,7 @@ - type: BodyPart partType: Hand size: 3 - compatibility: Skeleton + compatibility: Biological symmetry: Left # criticalThreshold: 30 # deadThreshold: 60 @@ -140,7 +140,7 @@ - type: BodyPart partType: Hand size: 3 - compatibility: Skeleton + compatibility: Biological symmetry: Right # criticalThreshold: 30 # deadThreshold: 60 @@ -160,7 +160,7 @@ - type: BodyPart partType: Leg size: 6 - compatibility: Skeleton + compatibility: Biological symmetry: Left - type: entity @@ -178,7 +178,7 @@ - type: BodyPart partType: Leg size: 6 - compatibility: Skeleton + compatibility: Biological symmetry: Right # criticalThreshold: 45 # deadThreshold: 90 @@ -198,7 +198,7 @@ - type: BodyPart partType: Foot size: 2 - compatibility: Skeleton + compatibility: Biological symmetry: Left # criticalThreshold: 30 # deadThreshold: 60 @@ -218,7 +218,7 @@ - type: BodyPart partType: Foot size: 2 - compatibility: Skeleton + compatibility: Biological symmetry: Right # criticalThreshold: 30 # deadThreshold: 60 diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index b14bc58b13a1..0e9ea58a4a8a 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -118,12 +118,13 @@ Heat: 3.0 Poison: 0.0 -# immune to everything except physical and cold damage +# immune to everything except physical and heat damage - type: damageModifierSet id: Skeleton coefficients: Blunt: 2.5 Slash: 1.5 + Piercing: 1.2 Cold: 0.0 Poison: 0.0 Radiation: 0.0 From 8af9804691bb60423c4150d65407e14df458b48b Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Sun, 8 May 2022 10:59:06 -0400 Subject: [PATCH 18/27] mirror fixes pt. 2 --- Content.Client/Entry/IgnoredComponents.cs | 3 +- .../Body/Components/BodyComponent.cs | 24 ++++++++- ...omponent.cs => BodyReassembleComponent.cs} | 3 +- .../Components/TransferMindOnGibComponent.cs | 13 ----- ...nagerSystem.cs => BodyReassembleSystem.cs} | 41 +++++++++------ .../Body/Systems/TransferMindOnGibSystem.cs | 50 ------------------- .../Locale/en-US/body/behavior/reassemble.ftl | 4 ++ .../Locale/en-US/body/behavior/skeleton.ftl | 5 -- Resources/Prototypes/Body/Parts/skeleton.yml | 3 +- .../Entities/Mobs/Species/skeleton.yml | 1 - Resources/Prototypes/species.yml | 2 +- 11 files changed, 56 insertions(+), 93 deletions(-) rename Content.Server/Body/Components/{SkeletonBodyManagerComponent.cs => BodyReassembleComponent.cs} (87%) delete mode 100644 Content.Server/Body/Components/TransferMindOnGibComponent.cs rename Content.Server/Body/Systems/{SkeletonBodyManagerSystem.cs => BodyReassembleSystem.cs} (78%) delete mode 100644 Content.Server/Body/Systems/TransferMindOnGibSystem.cs create mode 100644 Resources/Locale/en-US/body/behavior/reassemble.ftl delete mode 100644 Resources/Locale/en-US/body/behavior/skeleton.ftl diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index a3708071e224..dcd2e072a0c8 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -342,8 +342,7 @@ public static class IgnoredComponents "DoorRemote", "InteractionPopup", "HealthAnalyzer", - "SkeletonBodyManager", - "TransferMindOnGib" + "BodyReassemble" }; } } diff --git a/Content.Server/Body/Components/BodyComponent.cs b/Content.Server/Body/Components/BodyComponent.cs index b1bd30972379..bf65b8bd232c 100644 --- a/Content.Server/Body/Components/BodyComponent.cs +++ b/Content.Server/Body/Components/BodyComponent.cs @@ -85,9 +85,18 @@ protected override void Startup() public override HashSet Gib(bool gibParts = false) { - _entMan.EventBus.RaiseLocalEvent(Owner, new BeforeGibbedEvent(), false); var gibs = base.Gib(gibParts); + /// + /// This needs to be done in this for loop or else it just doesn't work. I don't know why + /// I don't know how, but putting it in the one below just causes all of the events to not + /// be raised. + /// + foreach (var part in gibs) + { + _entMan.EventBus.RaiseLocalEvent(part, new PartGibbedEvent(Owner, gibs)); + } + SoundSystem.Play(Filter.Pvs(Owner), _gibSound.GetSound(), _entMan.GetComponent(Owner).Coordinates, AudioHelpers.WithVariation(0.025f)); if (_entMan.TryGetComponent(Owner, out ContainerManagerComponent? container)) @@ -120,7 +129,18 @@ public BeingGibbedEvent(HashSet gibbedParts) } } - public sealed class BeforeGibbedEvent : EntityEventArgs + /// + /// An event raised on all the parts of an entity when it's gibbed + /// + public sealed class PartGibbedEvent : EntityEventArgs { + public EntityUid EntityToGib; + public readonly HashSet GibbedParts; + + public PartGibbedEvent(EntityUid entityToGib, HashSet gibbedParts) + { + EntityToGib = entityToGib; + GibbedParts = gibbedParts; + } } } diff --git a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs b/Content.Server/Body/Components/BodyReassembleComponent.cs similarity index 87% rename from Content.Server/Body/Components/SkeletonBodyManagerComponent.cs rename to Content.Server/Body/Components/BodyReassembleComponent.cs index a279d3393ad9..d0935cb21a32 100644 --- a/Content.Server/Body/Components/SkeletonBodyManagerComponent.cs +++ b/Content.Server/Body/Components/BodyReassembleComponent.cs @@ -1,10 +1,9 @@ using Content.Server.Cloning; -using Content.Shared.Body.Components; namespace Content.Server.Body.Components { [RegisterComponent] - public sealed class SkeletonBodyManagerComponent : Component + public sealed class BodyReassembleComponent : Component { /// /// The dna entry used for reassembling the skeleton diff --git a/Content.Server/Body/Components/TransferMindOnGibComponent.cs b/Content.Server/Body/Components/TransferMindOnGibComponent.cs deleted file mode 100644 index 112e3b64b2c1..000000000000 --- a/Content.Server/Body/Components/TransferMindOnGibComponent.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Content.Server.Body.Components -{ - [RegisterComponent] - public sealed class TransferMindOnGibComponent : Component - { - /// - /// The entity the mind will be transferred to - /// stored in here for use in system - /// - [ViewVariables] - public EntityUid? TransferTarget = null; - } -} diff --git a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs b/Content.Server/Body/Systems/BodyReassembleSystem.cs similarity index 78% rename from Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs rename to Content.Server/Body/Systems/BodyReassembleSystem.cs index c89d120620ec..c5bf9e7b0a6e 100644 --- a/Content.Server/Body/Systems/SkeletonBodyManagerSystem.cs +++ b/Content.Server/Body/Systems/BodyReassembleSystem.cs @@ -22,7 +22,7 @@ namespace Content.Server.Body.Systems { - public sealed class SkeletonBodyManagerSystem : EntitySystem + public sealed class BodyReassembleSystem : EntitySystem { [Dependency] private readonly IServerPreferencesManager _prefsManager = null!; [Dependency] private readonly IPrototypeManager _prototype = default!; @@ -35,15 +35,26 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent>(AddReassembleVerbs); + SubscribeLocalEvent(OnPartGibbed); + + SubscribeLocalEvent>(AddReassembleVerbs); SubscribeLocalEvent(Reassemble); } + private void OnPartGibbed(EntityUid uid, BodyReassembleComponent component, PartGibbedEvent args) + { + if (!TryComp(args.EntityToGib, out var mindComp) || mindComp?.Mind == null) + return; + + component.BodyParts = args.GibbedParts; + UpdateDNAEntry(uid, args.EntityToGib); + mindComp.Mind.TransferTo(uid); + } + /// - /// Adds the custom verb for reassembling skeleton parts - /// into a full skeleton + /// Adds the custom verb for reassembling body parts /// - private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent component, GetVerbsEvent args) + private void AddReassembleVerbs(EntityUid uid, BodyReassembleComponent component, GetVerbsEvent args) { // every time i get warned of a null refernce i add another if statement if (!args.CanAccess || !args.CanInteract) @@ -62,7 +73,7 @@ private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent comp // Custom verb AlternativeVerb custom = new(); - custom.Text = Loc.GetString("skeleton-reassemble-action"); + custom.Text = Loc.GetString("reassemble-action"); custom.Act = () => { if (!GetNearbyParts(args.User, uid, component, out var partList)) @@ -88,7 +99,7 @@ private void AddReassembleVerbs(EntityUid uid, SkeletonBodyManagerComponent comp args.Verbs.Add(custom); } - private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerComponent component, out HashSet? partList) + private bool GetNearbyParts(EntityUid user, EntityUid uid, BodyReassembleComponent component, out HashSet? partList) { partList = new HashSet(); @@ -111,7 +122,7 @@ private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerCo } if (notFound) { - _popupSystem.PopupEntity(Loc.GetString("skeleton-reassemble-fail"), uid, Filter.Entities(uid)); + _popupSystem.PopupEntity(Loc.GetString("reassemble-fail"), uid, Filter.Entities(uid)); return false; } } @@ -122,9 +133,8 @@ private bool GetNearbyParts(EntityUid user, EntityUid uid, SkeletonBodyManagerCo private void Reassemble(ReassembleDoAfterComplete args) { var uid = args.Uid; - TryComp(args.Uid, out var component); - if (component == null) + if (!TryComp(args.Uid, out var component) || component == null) return; if (component.DNA == null) @@ -146,19 +156,18 @@ private void Reassemble(ReassembleDoAfterComplete args) EntityManager.DeleteEntity(entity); } - _popupSystem.PopupEntity(Loc.GetString("skeleton-reassemble-success", ("user", mob)), mob, Filter.Entities(mob)); + _popupSystem.PopupEntity(Loc.GetString("reassemble-success", ("user", mob)), mob, Filter.Entities(mob)); } /// /// Called before the skeleton entity is gibbed in order to save /// the dna for reassembly later /// - /// the entity the mind is going to be transfered which also stores the DNA - /// the entity whose DNA is being saved - public void UpdateDNAEntry(EntityUid uid, EntityUid body) + /// the entity that the player will transfer to + /// the entity whose DNA is being saved + private void UpdateDNAEntry(EntityUid uid, EntityUid body) { - if (!TryComp(uid, out var skelBodyComp) || - !TryComp(body, out var mindcomp)) + if (!TryComp(uid, out var skelBodyComp) || !TryComp(body, out var mindcomp)) return; if (mindcomp.Mind == null) diff --git a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs b/Content.Server/Body/Systems/TransferMindOnGibSystem.cs deleted file mode 100644 index fe5140b1c728..000000000000 --- a/Content.Server/Body/Systems/TransferMindOnGibSystem.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Content.Server.Body.Components; -using Content.Server.Mind.Components; - -namespace Content.Server.Body.Systems -{ - public sealed class TransferMindOnGibSystem : EntitySystem - { - [Dependency] private readonly SkeletonBodyManagerSystem _skeletonBodyManager = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnBeforeGibbed); - SubscribeLocalEvent(OnBeingGibbed); - } - - private void OnBeforeGibbed(EntityUid uid, TransferMindOnGibComponent component, BeforeGibbedEvent args) - { - if (!TryComp(uid, out var mindComp) || mindComp?.Mind == null) - return; - - if (!TryComp(uid, out var bodyComp)) - return; - - foreach (var part in bodyComp.Parts) - { - var entity = part.Key.Owner; - if (HasComp(entity)) - { - component.TransferTarget = entity; - _skeletonBodyManager.UpdateDNAEntry(entity, uid); - mindComp.Mind.TransferTo(entity); - } - } - } - - /// - /// This information has to be collected in this system because the BeingGibbedEvent - /// is raised locally on the entity - /// - private void OnBeingGibbed(EntityUid uid, TransferMindOnGibComponent component, BeingGibbedEvent args) - { - if (TryComp(component.TransferTarget, out var comp)) - { - comp.BodyParts = args.GibbedParts; - } - } - } -} diff --git a/Resources/Locale/en-US/body/behavior/reassemble.ftl b/Resources/Locale/en-US/body/behavior/reassemble.ftl new file mode 100644 index 000000000000..b13ac67ad02c --- /dev/null +++ b/Resources/Locale/en-US/body/behavior/reassemble.ftl @@ -0,0 +1,4 @@ +reassemble-action = Reassemble +reassemble-description = Reassemble the pieces of your body. +reassemble-fail = Parts are missing! +reassemble-success = {CAPITALIZE(THE($user))} was put back together. \ No newline at end of file diff --git a/Resources/Locale/en-US/body/behavior/skeleton.ftl b/Resources/Locale/en-US/body/behavior/skeleton.ftl deleted file mode 100644 index 8aa641f7d2b9..000000000000 --- a/Resources/Locale/en-US/body/behavior/skeleton.ftl +++ /dev/null @@ -1,5 +0,0 @@ -skeleton-unable-consume = {CAPITALIZE(THE($item))} fell right through {POSS-ADJ($target)} body! - -skeleton-reassemble-action = Reassemble -skeleton-reassemble-fail = Parts are missing! -skeleton-reassemble-success = {CAPITALIZE(THE($user))} was put back together. \ No newline at end of file diff --git a/Resources/Prototypes/Body/Parts/skeleton.yml b/Resources/Prototypes/Body/Parts/skeleton.yml index 3b75bcde3c54..6a4681e1c9bb 100644 --- a/Resources/Prototypes/Body/Parts/skeleton.yml +++ b/Resources/Prototypes/Body/Parts/skeleton.yml @@ -45,7 +45,7 @@ size: 7 compatibility: Biological #Unique stuff the skull has for one a skelly gets "boned" nyeheheh - - type: SkeletonBodyManager + - type: BodyReassemble - type: Input context: "human" - type: Speech @@ -63,6 +63,7 @@ 0: !type:NormalMobState {} # criticalThreshold: 50 # deadThreshold: 120 + - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml index d35fd2f24d08..fa5fed22493c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -259,7 +259,6 @@ attributes: proper: true - type: StandingState - - type: TransferMindOnGib - type: entity save: false diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index 79a8e4874683..faa2cdf84af6 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -33,7 +33,7 @@ - type: species id: Skeleton name: Skeleton - roundStart: true #touch this and feel my wrath | bet --moony | there will be violence --emo + roundStart: false #unspooky prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy skinColoration: TintedHues From bce41145d19e6e3a3fca0e82c1c40f5ef827d2eb Mon Sep 17 00:00:00 2001 From: EmoGarbage404 Date: Sun, 8 May 2022 15:39:09 -0400 Subject: [PATCH 19/27] mirror's fixes pt 3. (the finale) (yeehaw) --- .../UI/HumanoidProfileEditor.xaml.cs | 22 +++++++++- .../Components/BodyReassembleComponent.cs | 4 ++ .../Body/Systems/BodyReassembleSystem.cs | 39 ++++++++++++++++-- Resources/Prototypes/Body/Parts/skeleton.yml | 6 +++ .../Entities/Mobs/Species/skeleton.yml | 1 + Resources/Prototypes/species.yml | 2 +- .../Species/Skeleton/parts.rsi/head_f.png | Bin 6307 -> 793 bytes .../Species/Skeleton/parts.rsi/head_m.png | Bin 6307 -> 793 bytes .../Mobs/Species/Skeleton/parts.rsi/l_arm.png | Bin 246 -> 226 bytes .../Species/Skeleton/parts.rsi/l_foot.png | Bin 5768 -> 651 bytes .../Species/Skeleton/parts.rsi/l_hand.png | Bin 650 -> 629 bytes .../Mobs/Species/Skeleton/parts.rsi/l_leg.png | Bin 363 -> 336 bytes .../Mobs/Species/Skeleton/parts.rsi/r_arm.png | Bin 645 -> 628 bytes .../Species/Skeleton/parts.rsi/r_foot.png | Bin 5481 -> 656 bytes .../Species/Skeleton/parts.rsi/r_hand.png | Bin 662 -> 640 bytes .../Mobs/Species/Skeleton/parts.rsi/r_leg.png | Bin 341 -> 317 bytes .../Species/Skeleton/parts.rsi/skull_icon.png | Bin 930 -> 870 bytes .../Species/Skeleton/parts.rsi/torso_f.png | Bin 1081 -> 1030 bytes .../Species/Skeleton/parts.rsi/torso_m.png | Bin 1109 -> 1058 bytes 19 files changed, 68 insertions(+), 6 deletions(-) diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 07911e5ad3d1..46936b7a563b 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -543,7 +543,18 @@ private void OnSkinColorOnValueChanged() } case SpeciesSkinColor.TintedHues: { - var color = Color.FromHsv(new Vector4(range.Value / 100.0f, 0.1f, 1.0f, 1.0f)); + if (!_rgbSkinColorContainer.Visible) + { + _skinColor.Visible = false; + _rgbSkinColorContainer.Visible = true; + } + + // a little hacky in order to convert rgb --> hsv --> rgb + var color = new Color(_rgbSkinColorSelector.Color.R, _rgbSkinColorSelector.Color.G, _rgbSkinColorSelector.Color.B); + var newColor = Color.ToHsv(color); + newColor.Y = .1f; + color = Color.FromHsv(newColor); + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); break; } @@ -765,7 +776,14 @@ private void UpdateSkinColor() } case SpeciesSkinColor.TintedHues: { - _skinColor.Value = color.X * 100f; + if (!_rgbSkinColorContainer.Visible) + { + _skinColor.Visible = false; + _rgbSkinColorContainer.Visible = true; + } + + // set the RGB values to the direct values otherwise + _rgbSkinColorSelector.Color = Profile.Appearance.SkinColor; break; } } diff --git a/Content.Server/Body/Components/BodyReassembleComponent.cs b/Content.Server/Body/Components/BodyReassembleComponent.cs index d0935cb21a32..c1bb83f4e00d 100644 --- a/Content.Server/Body/Components/BodyReassembleComponent.cs +++ b/Content.Server/Body/Components/BodyReassembleComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Cloning; +using Content.Shared.Actions.ActionTypes; namespace Content.Server.Body.Components { @@ -23,5 +24,8 @@ public sealed class BodyReassembleComponent : Component /// [ViewVariables] public HashSet? BodyParts = null; + + [DataField("action")] + public InstantAction? ReassembleAction = null; } } diff --git a/Content.Server/Body/Systems/BodyReassembleSystem.cs b/Content.Server/Body/Systems/BodyReassembleSystem.cs index c5bf9e7b0a6e..76f9a9123097 100644 --- a/Content.Server/Body/Systems/BodyReassembleSystem.cs +++ b/Content.Server/Body/Systems/BodyReassembleSystem.cs @@ -5,6 +5,8 @@ using Content.Server.Mind.Components; using Content.Server.Popups; using Content.Server.Preferences.Managers; +using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; using Content.Shared.CharacterAppearance.Systems; using Content.Shared.Preferences; using Content.Shared.Species; @@ -12,7 +14,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Prototypes; -using System.Diagnostics.CodeAnalysis; +using Robust.Shared.Utility; /// /// Fair warning, this is all kinda shitcode, but it'll have to wait for a major @@ -26,6 +28,7 @@ public sealed class BodyReassembleSystem : EntitySystem { [Dependency] private readonly IServerPreferencesManager _prefsManager = null!; [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly ConstructionSystem _construction = default!; @@ -36,6 +39,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnPartGibbed); + SubscribeLocalEvent(OnReassembleAction); SubscribeLocalEvent>(AddReassembleVerbs); SubscribeLocalEvent(Reassemble); @@ -49,6 +53,34 @@ private void OnPartGibbed(EntityUid uid, BodyReassembleComponent component, Part component.BodyParts = args.GibbedParts; UpdateDNAEntry(uid, args.EntityToGib); mindComp.Mind.TransferTo(uid); + + if (component.ReassembleAction == null) + return; + + _actions.AddAction(uid, component.ReassembleAction, null); + } + + private void OnReassembleAction(EntityUid uid, BodyReassembleComponent component, ReassembleActionEvent args) + { + if (!GetNearbyParts(uid, uid, component, out var partList)) + return; + + if (partList == null) + return; + + var doAfterTime = component.DoAfterTime * 2; + + var doAfterEventArgs = new DoAfterEventArgs(component.Owner, doAfterTime, default, component.Owner) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnStun = true, + NeedHand = false, + BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, uid, partList), + }; + + _doAfterSystem.DoAfter(doAfterEventArgs); } /// @@ -56,7 +88,6 @@ private void OnPartGibbed(EntityUid uid, BodyReassembleComponent component, Part /// private void AddReassembleVerbs(EntityUid uid, BodyReassembleComponent component, GetVerbsEvent args) { - // every time i get warned of a null refernce i add another if statement if (!args.CanAccess || !args.CanInteract) return; @@ -94,7 +125,7 @@ private void AddReassembleVerbs(EntityUid uid, BodyReassembleComponent component _doAfterSystem.DoAfter(doAfterEventArgs); }; - custom.IconTexture = "/Textures/Mobs/Species/Skeleton/parts.rsi/full.png"; + custom.IconEntity = uid; custom.Priority = 1; args.Verbs.Add(custom); } @@ -195,3 +226,5 @@ public ReassembleDoAfterComplete(EntityUid uid, EntityUid user, HashSet^h4~unA4Ip6CKn3NZ%^XlntxoK@!}5GI}MZiOd1uobWJ>GH0owEn=Y8i%TB5|0-OKisM#oUpd_yWR1CJpP&f%Zda150tUq+GZPb zX7RR2_kX;*rB(Ko-F{iNoAJlHa|P!XzP2h=tX?B+^enA+-RqEerqb>nL$=!c`l}b} qCakYyd=`_;(_^?_7U85XQg)1|Z_3**72$Zu00f?{elF{r5}E+_6|=ek literal 6307 zcmeHLc{r5q_a9_m(qhXtO(-!NGsBF1%Z!jT$ueThJeZh$Fxi(9DlL{Iv>^4W-Yi*C zmgJ>fcoRjTR3dF?_kBj%uHW~cuIu;xuV=1j=6TM2&gVYobIyHV=bm&AcV|VpWpWS* zM3F>v^aOuxMYoI;`281yI|zZuC`OaL1)kI>D2K-mW`qM!!B!3c1%!-X2t?RFv1xsz zo}tpGCre`%?1i*&AxCFMrD8rQ+SMPw7J2LLz{kFvNIPIZ)Jeur=3`TW&%1@z1w4g% zV)?~8Y3p9pciWb=ebjhj(H7fyYo(3O(9E^ZFJo=%+Ctxd379I@H6kPAKbRVR5(@Y?*HQaBl+u>BBOODlgd+BP` z0qZ8+!K$2R=xq;@D2FG?W*k;e>b&G@N2ed2etP?PT)A1lee90L*+Yz~5z`Cm_2Oe6 zIAb?*x?Ahg^<$r@2Kw$!o=rAVN{~N#gxi)LR$3$@@VQFrCgx5vHu<8^-AZ~- zmEptustS*?wwnRdMjEnFUS~-clqL>7W2_}yo36X$bD9dcsk_K#>F?P&xp}AonfKm{ zXjrq->+H^smQ;O7s5R1vBRV7WPV!FpPB;@-W zq_dvV#BH~g%I|7X>X1F9k2raJmE-=!iQ&-DX2G!Q5`_{^B2^CWQoGQM*Vn7I`IKG9ebka4s(QV;9O1*9 z!e(cyymu(iz)cV$`(;WCqxvGQu^J|+GT4#8zKo4a!tO9FePTL441JIad)Bf{`*`dT zOP^N%eYJ-B%d&B9}L5Z@k6`gbLt=V#AVg*xe)hHesrVXj*13(?VgUial*!XM{pPJ#)V3_DW_5u zAws|XiOriYHub(xkik8%KF3U;n&q9ch^WflK9gS)Q@bp`;(d8m^|}^|^EC=8HRI&o zBuk%{?TvO9)oj?U4Vtj_M)TNGyGRObO7)$GB)vRR)lupnwcTAGDA!euYvBED*;~WJ z<7XcG8uXrC8yw)3I+8z=>Dw=P+*7MejjcII(Dn1mDoi!LNw5?5AQ?BhK1j@}>Gv1p zRw_0m==;SsI~54M%AR)=ZLjj)R*Us(4?A+&_wa`B15#l|lw>s)N4D^ZV*w<~MQ#VR znYz%TGqar@(|2QErSz+vyAFnfC;qYQ&;B1aszF<&X)4u%Hc|oWL zS@t1zAZ9^amb_}-;uY5Dh2{^1Kp7*DbBN_Z8TAnRw~Es7JSi9NJ(ZX<*zBu$P+LNI zx` zNeXgZZ)CQtnQ~3`t-bIPiB#*lIQHh0y2&oho;LXSy*->*Il7YyQg*+%{ldpZ`N0B}{Uuj&fVmm1_qT=L$UZY|Kxvt^j#XQm7-EgTsN=-7hv5J-6zSTwjUW|*&7`@ukb06EjN60OkH*>Y3jXP z^?sQxsh+F_?q{oQ$%zoM*+CWOG^NMcO=4p$OS?3l4&AMwY<@qQCZ=V7u#~J)7N}*! z$?$6u-&p6pHG6FPUlCD5GMn}+PBOIIQ>vr4fty?8VIXX+UuqL`B$BaejpFO8`lbFi ztX_Imm)8&Z{QYJ%t2LD?wv*SeB$Ir6>);K^eRQ#guKjaMeXOt8x`yWCk-;A`&U6ih1Xvr?rwH_*9 z(3}mY6d3qc9meS*_j8h$s%DUEio`O-SIcikCUVa|?^CI}=5A`7L{1)C&Mg&|ClFvG zP{YN*jwf77tx1lNZkEP4S`> zqu%+L+b4c3j_F!o={)mp(Un^oow3AasQXTPhSewJ?LTKCHtp$9*|k@&JYKDT<4EeW z`wV;bP^|FntQajrHGc^o@=t`hM5 z-MLX(EyQ1&B5C(h;_~e)q}xs|p8`BX7mc)VZ3YKo?q8JH7Myc3IB>BC_8M{Ja1f$t z^>iaFk-AM;LN9pi%Jm@CqLJr1){TQsTXSdXZQ2t(Q5p}Iq(8}Hd0*DNT;aC%$%S=V z!2oHw^~xgD)8xy0CsIZL`Noo$$`4(dj#b?aw6kmY&IFC#E
0kq=&Hx)VZ#P#0jm<<*>Fgi?A!KsEMh*h8 zv=MTsv@k#b4FW-fMO6B1PbmXWJH?4tmUAV zJbEy}({ar_1o&nJ3l#`B1SB#lDhd&0ieU3XkZ3#}k3^XuO-$gR2Asc@C7=r7EdB}+ z#8(VQfKTHwI06Qn1r=dZgV+%QD;NwMhko;q$#HZ04$tDxvjFme6jC`zGy;WWGLb)9 z@C8nhAjrH!|J8y|2K!y4C%|V%@MwTjB)}4^_!)vu`)<#P;DyhHL#H8uaDWM_^1)fr zzf9>&a`X6ZA)+9J!Q{+Yfn@)pDPRQuAnO<3L?d(I{Oky5{vG!h?QgNqDT7*WZUjd* zEkfiT$_66 zfK^Ei|Jf@M6di=327&(IFeY&GASwXI;Auf{a~vHFM+X6DEDl2h%uIvlpy)Kh8a9tf z1=Go3QbPbFhZQn6AR?S#=RvZ9nIKR|lt^o#%&W_^$7$P&6zy<+T#3veu z1>?qI(P*3*9)m&uQ1SwJe6SWpsAv?z^eeI`F$6FikXov!QbB+@3osgj0}r4I*gP_u z9c~2^IRzD2&J{S+@@ra%3_hr_RaEoyRlfn?etrA82*Me2Lr~~k;S#8{uaoepk-*oS zfOcPpXrWYA2mr3|`I7o3XZ)9RnVR8nG{6)O$D+U_VS>%+aC{IQ0|(4d=B8M4AP6wQ z&V}(EozD&yL{WKwT?iN{7!6oLbJ0Lo&68>PtA11{AYuvyu5T0uEG#nGoM3__pwTeo ze6UE-n*J88CG!99VL7Mp(N_r+dyOtG65{}s?aZYEq8<(sK z3)!SMyVB?GcI=2xwcqtL$gFSc+ctB#i1>urcRgnd>$=}@mu~r7VRWXO{w4Mkk8_XI zqus>FCz`m>3*q`2`f3-Yt6c-MtQDH#KWAoL?(M6rV{hs>3M{j9QyVtapWKnMz^=Ei z{cy~esSVIf`vKjzB@y;EcUt?@RSnOC^16BhARnI*5KPQtTZReL(uO^a85&U`Cv6(-qX(d{np zu{jCj?`>p@_sU6V-6O4+*>JkCv3|8zfTNzw`O1Ou(@P%;peuCm++|I#S()@IZC6?L x_~r*0|DxQQg<_dptJ2FGTxu%S=ACIavlbI_bVhIsPUeY3Bqw*rGxmYW{{dEJ2nhfH diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_m.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/head_m.png index 99101bce8b92f95fa38fe5dddc00ae0788b26e76..ee8bd9978bac14783ed867cf4ae5ebb5595a480a 100644 GIT binary patch delta 400 zcmZ2%IFoIHvM6Iqrn7T^r?ay{K~a8MW=<*tgT}^h4~unA4Ip6CKn3NZ%^XlntxoK@!}5GI}MZiOd1uobWJ>GH0owEn=Y8i%TB5|0-OKisM#oUpd_yWR1CJpP&f%Zda150tUq+GZPb zX7RR2_kX;*rB(Ko-F{iNoAJlHa|P!XzP2h=tX?B+^enA+-RqEerqb>nL$=!c`l}b} qCakYyd=`_;(_^?_7U85XQg)1|Z_3**72$Zu00f?{elF{r5}E+_6|=ek literal 6307 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 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_arm.png index bab8a1bd7115fabd6a2f7027a94a738d13991590..a0764cc340cba20bff3278d802e554d975cd7027 100644 GIT binary patch delta 185 zcmeyy_=s_WVf`FW7srr_Id5-n6l5~waS1#a(7U?OReFa*`#RT|9UdokOngxDXL|JJ z&0%WB3_u{Ma@4Q*^3Lj%_NgN8_PH~z-w>&qa=yBJy~M6-R$uoNMeYy#`#a55dc)*R zOq;Hi?f%LR(gg;u&RCxAU$IND)Flt_TOdj iyjcCeln12YfZ04bmAK_o7mA$(aXnrAT-G@yGywoEo=|}R delta 205 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 MuyL_2u=I=h4=pDCcmMzZ diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_hand.png index dc85cb9ac14b9c5a52e081a6aad8f82dec227b3a..f60248ad72849bf797f9c4937ec47889d4584474 100644 GIT binary patch delta 202 zcmV;*05$)L1@#25v;lvtNklI(6a`SL`iq2Sn#>bmn0YdZVQAzH0?l01 zs-&RJYxKc6+}GBV*?lPi0002MDLLofTI;Q~o^$SJvq~wwlyW-jom+I^JkM#{wy?Zf zYpS)TVHmgq4nx<3d|AOA}bajuvuIr`u{Y!QT008*h9pW-ixKT}^c>n+a07*qoM6N<$ Ef=*du>Hq)$ delta 223 zcmey$(#5)A3uFC3PZ!6KiaBp@DGD7j5NLfU+m@}s(ELDcM$x2>TVaW}H#Z#o!dJ@S z(r6~ruyRe52+uO6O>Y(coqw*nS@?Sx3j-K%Oj7mR`gzsd>pF!}vqGn~hNTM5xtg9N zE3tfIj9>a@n|Sj_uic(?&y0Mg{+aQ~?wDz>r@j=B%hlfgI{dCqenI4;GyB%0ib2c* zkuxNBpQw4O{AZVQLR>%p)yLmEx6NMgIe2mTp5D8U<-fUiy6yeQztI_}vf;fgqx)6= URSds5Zh~}ry85}Sb4q9e04mvH5C8xG diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_leg.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/l_leg.png index 78c90bb38d93b24b8d8f133fdecc08c8ddc8eeb5..b5d60ddd30a8daf02707cf392f6b9a83cb320225 100644 GIT binary patch delta 296 zcmaFObb)DtVLg|pi(^Q|oVT~E^I8l98Xn%%SpG57qQ6_SM(Mj9)1=cc#X6+}E?Hjn z(p+@+2#=1&|L}`voSPjzdN>%Mpgt@+ch#+LYZk6rd+k-!)AuB=e0~4x!OKfoIMvo||pVsZ)zt#+9`~QQ2xyb(D-pVAf*4_#Bx4zxDXPK2mk;80000001w-)mYSup)>$J< zW8JQnrZrwHl4NPDK@?h~x+#c4u^hC?0J@9;R85eju_nVr%747D=;x*~FQoteX7(7E zoPaVfq{(-{VYfHSXEFfGhC0X1XL3G%i>iv7&l;(9xo(Bu15mB?GvH4rw~>?Ec*nn5 zG_n8uut?+O%dMYQ8vpST5Cu?@ahQgQTrd%nP%?`uz z<&F0GMNRHa8}QHG4j|h47g2Kq000000Pr(P@i@6b4}QDi(t`vFJ%CMxv48NwiqJgUw*j z!YxQ^V#XOq1q5-O@5>whefvm1Ndf=>ypm^W7&=28z2wZZG=#EsOlOuC)RG?Ck(zTmMR|xd8wG002?|_!(94csU-TDoi_Z zfBD!N<7Zm6!@KQ1S*07*qoM6N<$f+xXY1poj5 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_foot.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_foot.png index 774a89f1909cb98d184cba84431950173f9cfa1e..86f97661fcd144c040b27d7dba59afb9a2de27de 100644 GIT binary patch delta 262 zcmaE$7%jJ;K1iaNN_yF{EP7 z+gpZxhYUno9y;Et-tpb{(o-AFxQX01)eCo(iA9zcyy z&>(HhZQOmYdP>ltGmq}hT;jbh$m`3!o@J_ z)`wMpF5Wx&e9rgy!*l-#_D8o)xwLTYq0{^y&iVbTTU~HPa@F(#(Pry~ydX0?UHx3v IIVCg!06c1VFaQ7m literal 5481 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 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_hand.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_hand.png index ac7bd3e6a8e15df488381d684544e1253c95fea6..09fad6c219c15e1f8aef13a346d71d37c8c419e3 100644 GIT binary patch delta 213 zcmbQn+Q7PD3uFCuPZ!6KiaBp@8S))g;Au@~}`@J>M4>l@y-iUH|hdP`49@^5!{Sns;x#7x-NcRD0$z>% delta 235 zcmZo*oyNLh3uFCRPZ!6KiaBp@>GCx@2(&%)eBanGtLxs9WwxA5-l4j4mYSO0VQhE! zaGp_0C2REx<(yMuUZ3o$j6bJt%5!630D~VKHQ_7w1+K~ud9XX{t&J7a{m@96l{$S} zjNX@YJ@eGMcXjssJjQLwp21fyg>1d{`y}HNPp#jN9S=oYBwODRI<;tO`1P6E5x2z~*qwML5v+LO>sIRnn=RY}8ZK~_; hjQxRc?gMpgsLgK+4SdMT`e6#l2v1i(mvv4FO#m@6XcYhe diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_leg.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/r_leg.png index 0fab01a9f08ba2b6eb209b94790744bfefb00528..4319d201d51b06a2de0888160ffdac66dde302d3 100644 GIT binary patch delta 278 zcmcc0w3lguK|RBFPZ!6KiaBp@ZRBk>5NLfEJjM5g4Lh>||54qvw1P@mk9!T1&aD*E z43diXQ8@YE)MU=Rlbi1TaAAOg3eQk)uaz=)k85i#U9{@z-qb&R6^84l>X`aXGXp6Z=cUSoq5%{TlvL3#8|)_DPb4GZ8}kj05iXVcmogMTOtbUYbK7AK~9(;Z-K zR+jv5l#kv4`Qd14_Vv=`TvSzV=c}a4dDU@5M4maUnVfb&XE<_hP_|aLFPC&@u5Y@0 zyjv~IjmmOLw~v?N2><{9000000K6-PCG?h?1`~Yr_tE>U-{aOFl6CU;^8qHs_Os6A z_{!kp2%2|57AGf_9|0e;3g!i<%Zxx>asXfI4jx{6tiP6`ivR!s07*qoM6N<$g0e1( ABme*a diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/skull_icon.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/skull_icon.png index 50a43e320d9a726a9670e31a52de2ccd1249a42b..8d86abc7aaabb0a5fbc6ecfca2c89d6d69754c49 100644 GIT binary patch delta 445 zcmV;u0Yd(w2j&K_v;lveNkl?9jO2>&<346?w--fUl-$xYL2)VYtxgS7S!M_5Wp)dzr$ z1CkV9*Y)y`6SdpLDG=W&ac0ObSrp(d(^{jds%QcS0q*i%Ykhw@hg1cr1%(iYF(Cv= z9AIvN5i{*rpDGRzBG9(2ZA&S4qVAYG&H+e9z!z}){+RpDg#>_kp05F1F&``?9t1EI z5c04nieUQ{BS)Yp3Y2AO`(;_)0ucqMs_GyvgxKwK2trD^OTs+QlK{~w@Ds`JyYEb7 zOy8}9d7d#0L-c>E7zEH-AL<(^_AdJcd+lK@W5a~6#i_xHl`2YFAD>a-K7uUq8+;QAslej zq>YX;_z*4*!cc~GY0|BW#)g4~M129n*rjx6pqI-9?nN3GPeM3{bHn$Yzsm(U%Za5V zvUob|`@CxhlNr~$uS9^gk;aP;0KN#3RB-=mpZm(n+GQ5FVAOvxY2UVSjqk_T_m3x* z|KdNvc_fiQQR3PTy1hcBFB7^B6EQQf+YyR0zJv*1qV1X zppW%X*G5_dl=P8)5dx_hpaDpm_L0v>k^r#Z?(z}HBQ&uza3+CZ0$33?niZygjBsb5 z(X2pKTcNG0twMiDBogTMIx%obkt20xk>k~Iyh z*drMYMBV{lwYI~a5ZQ(Sj(vay$|4bfi$o7_WT0BFp&ICnyJ=XWhgC5GS!1RV%_tf@ vz)^y%n!2`=8yw*HG2#6gIr{v6mQ%?OOVlEQ2)v2r00000NkvXXu0mjfH_hor diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_f.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_f.png index 4a13c0dbdcb8fd4cd663ac0e625ab37ea2beb441..6eb022a09621d3aab2adaa1767df7c79724f0956 100644 GIT binary patch delta 606 zcmV-k0-^o62!;r-v;luTNkl001}~4zur}F`Q!2j#)_R0R{U}9A!aP)S@@Be*pml< z*I04y_1soC=THF_@Vy+31XW0^!0b#+DQX+>F{KVRtO%%uuXqx6lYdxD3%Z1l| sWJE8zc!g2VSp;+2z%UHMFwF1e9ntn;)n?`V3IG5A07*qoM6N<$f*z?LxBvhE delta 658 zcmV;D0&V?<2)PKbv;lu`Nkl?JUA^G!ge>VkyR@28KNwVWL&%^Cq007uKI1+!Y`E2xu`@3oSGydnM zjI3J!;pQ^iR?&Yg`SbPpMYg}Wy@k5pKoo?CXLHFiD-i`D>V5-tzfpQzipT)~@Zr

f)JDOwDKa@YWe`m zFTvZpK&&s$0N{Ub7P!a&b>a$j2}VJf-3cU!qor5bR@2XkRvG;={Z6-y$#`m2KWE73 z%doQB-c$6~aoc4ENX7LB4wV5_KLkCduYa2A8x=v|xAy^HXXm}?5-ZW^wh;wkW`{M( zqF^KXy1se@F7BJGC(eLB*ID|=e&x8^I}#BmkmbPa>BZ8FzyRnpI=~edn@~1_ZxuLrKyr)Q#PK>m)hn}MeKn4 z`>z0&`}8)u#Kmb4 diff --git a/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_m.png b/Resources/Textures/Mobs/Species/Skeleton/parts.rsi/torso_m.png index 0dd234beff520ce432142ac7947e33aabca719fa..22f860dc9199ac8fff9beb2a22564bcdedf8e241 100644 GIT binary patch delta 634 zcmV-=0)_q62%-qEv;luvNklt;pPT`}|18)e1Kb~XxGAW$o}UC1$kFnvtdw#g zx@Gj&^p#R*+ctlx{=$&!^}5+(?=$*e@z~`Ipo;qo4wnI2FM{6F_rGKHqlzH#&-(yy zJRW0*cnYNywAQm7$ykd*is<|LZV4P7$BakLfVX)zy>q-dd+Rd{!!QiPFbu;m48t(Y zZ^OL^ZJK7$qfgl&@n44aeLpo#ljg;&6JFaGk;(~QZ9{)_U!dzc{wvjhs;XYbafG!NS(eS$ zrIbk;l}d6cxNR~3p8E4Zgabn1y$J(BgMSHe0y<~951h~pzKx`hWHk$R!R0}*G=VzD3i(swl0?3|% z!;weUCuacgFAIN)$N=%j1!4*Yo}WAkD3GHiSJ_(CO^KR}ewKctS;zU=rB(fuA%mm7 zvB%zf^grUU%Nalwmlqr&157W1-qM%9b@jE1An@1w0I;#Kt~*378qGQa&rj^IMphJT zL|@hyOJMa_XFPHSyw0=ujbq~!te1V5kjO7X zAMdW?o57)-7qdb*Yh#2hCw#OG+I@lBiz_Uzt|aGWw*p9A8k49^*>F6WYn#6pvIFk# z9{|kv>1}q2)!iV%A;LBaWCyf5ZJZvTARJFVRR+wW2(3;V`@8$3vB(ZMJw8FJ)1JFt zbOs39sAzw6hkvduq2xH2MG>B#rm5decWBfir`kf*U!)qay?3zi{4~WZicoT#u}?_en~-M}s$C|rWx=9)^Pj;6hG7_nVZJVZ0KAT5 U6cmj~h5!Hn07*qoM6N<$f}heuZ2$lO From 6bf0cf551d4c930cd6e636d5ffbc6a063f49750c Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 8 May 2022 16:53:01 -0400 Subject: [PATCH 20/27] Update species.yml --- Resources/Prototypes/species.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/species.yml b/Resources/Prototypes/species.yml index c8deecc62691..832a34bd3a0b 100644 --- a/Resources/Prototypes/species.yml +++ b/Resources/Prototypes/species.yml @@ -33,7 +33,7 @@ - type: species id: Skeleton name: Skeleton - roundStart: true #unspooky, change it in october + roundStart: false #unspooky, change it in october prototype: MobSkeletonPerson dollPrototype: MobSkeletonPersonDummy skinColoration: TintedHues From 667f1e0837a1e2c95b2f0da4645b029965d143a4 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Thu, 12 May 2022 21:52:11 +1000 Subject: [PATCH 21/27] Skeleton man --- .../Body/Components/BodyComponent.cs | 13 +- .../Components/BodyReassembleComponent.cs | 6 +- .../Body/Systems/BodyReassembleSystem.cs | 144 +++++++++--------- .../ConstructionSystem.Initial.cs | 2 +- 4 files changed, 86 insertions(+), 79 deletions(-) diff --git a/Content.Server/Body/Components/BodyComponent.cs b/Content.Server/Body/Components/BodyComponent.cs index bf65b8bd232c..695e651f81b3 100644 --- a/Content.Server/Body/Components/BodyComponent.cs +++ b/Content.Server/Body/Components/BodyComponent.cs @@ -87,17 +87,16 @@ public override HashSet Gib(bool gibParts = false) { var gibs = base.Gib(gibParts); - /// - /// This needs to be done in this for loop or else it just doesn't work. I don't know why - /// I don't know how, but putting it in the one below just causes all of the events to not - /// be raised. - /// + var xform = _entMan.GetComponent(Owner); + var coordinates = xform.Coordinates; + + // These have already been forcefully removed from containers so run it here. foreach (var part in gibs) { _entMan.EventBus.RaiseLocalEvent(part, new PartGibbedEvent(Owner, gibs)); } - SoundSystem.Play(Filter.Pvs(Owner), _gibSound.GetSound(), _entMan.GetComponent(Owner).Coordinates, AudioHelpers.WithVariation(0.025f)); + SoundSystem.Play(Filter.Pvs(Owner, entityManager: _entMan), _gibSound.GetSound(), coordinates, AudioHelpers.WithVariation(0.025f)); if (_entMan.TryGetComponent(Owner, out ContainerManagerComponent? container)) { @@ -106,7 +105,7 @@ public override HashSet Gib(bool gibParts = false) foreach (var ent in cont.ContainedEntities) { cont.ForceRemove(ent); - _entMan.GetComponent(ent).Coordinates = _entMan.GetComponent(Owner).Coordinates; + _entMan.GetComponent(ent).Coordinates = coordinates; ent.RandomOffset(0.25f); } } diff --git a/Content.Server/Body/Components/BodyReassembleComponent.cs b/Content.Server/Body/Components/BodyReassembleComponent.cs index c1bb83f4e00d..cefe87d089a0 100644 --- a/Content.Server/Body/Components/BodyReassembleComponent.cs +++ b/Content.Server/Body/Components/BodyReassembleComponent.cs @@ -1,3 +1,4 @@ +using System.Threading; using Content.Server.Cloning; using Content.Shared.Actions.ActionTypes; @@ -17,6 +18,7 @@ public sealed class BodyReassembleComponent : Component /// The default time it takes to reassemble itself /// [ViewVariables] + [DataField("delay")] public float DoAfterTime = 5f; ///

@@ -25,7 +27,9 @@ public sealed class BodyReassembleComponent : Component [ViewVariables] public HashSet? BodyParts = null; - [DataField("action")] + [DataField("action")] public InstantAction? ReassembleAction = null; + + public CancellationTokenSource? CancelToken = null; } } diff --git a/Content.Server/Body/Systems/BodyReassembleSystem.cs b/Content.Server/Body/Systems/BodyReassembleSystem.cs index 76f9a9123097..439cc89dab59 100644 --- a/Content.Server/Body/Systems/BodyReassembleSystem.cs +++ b/Content.Server/Body/Systems/BodyReassembleSystem.cs @@ -1,20 +1,17 @@ +using System.Threading; using Content.Server.Body.Components; using Content.Server.Cloning; -using Content.Server.Construction; using Content.Server.DoAfter; using Content.Server.Mind.Components; using Content.Server.Popups; using Content.Server.Preferences.Managers; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.CharacterAppearance.Systems; using Content.Shared.Preferences; using Content.Shared.Species; using Content.Shared.Verbs; -using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Prototypes; -using Robust.Shared.Utility; /// /// Fair warning, this is all kinda shitcode, but it'll have to wait for a major @@ -31,18 +28,31 @@ public sealed class BodyReassembleSystem : EntitySystem [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly ConstructionSystem _construction = default!; - [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoidAppeareance = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoidAppearance = default!; + + private const float SelfReassembleMultiplier = 2f; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnPartGibbed); - SubscribeLocalEvent(OnReassembleAction); + SubscribeLocalEvent(StartReassemblyAction); SubscribeLocalEvent>(AddReassembleVerbs); - SubscribeLocalEvent(Reassemble); + SubscribeLocalEvent(ReassembleComplete); + SubscribeLocalEvent(ReassembleCancelled); + } + + private void StartReassemblyAction(EntityUid uid, BodyReassembleComponent component, ReassembleActionEvent args) + { + args.Handled = true; + StartReassembly(uid, component, SelfReassembleMultiplier); + } + + private void ReassembleCancelled(EntityUid uid, BodyReassembleComponent component, ReassembleCancelledEvent args) + { + component.CancelToken = null; } private void OnPartGibbed(EntityUid uid, BodyReassembleComponent component, PartGibbedEvent args) @@ -60,24 +70,30 @@ private void OnPartGibbed(EntityUid uid, BodyReassembleComponent component, Part _actions.AddAction(uid, component.ReassembleAction, null); } - private void OnReassembleAction(EntityUid uid, BodyReassembleComponent component, ReassembleActionEvent args) + private void StartReassembly(EntityUid uid, BodyReassembleComponent component, float multiplier = 1f) { - if (!GetNearbyParts(uid, uid, component, out var partList)) + if (component.CancelToken != null) + return; + + if (!GetNearbyParts(uid, component, out var partList)) return; if (partList == null) return; - var doAfterTime = component.DoAfterTime * 2; + var doAfterTime = component.DoAfterTime * multiplier; + var cancelToken = new CancellationTokenSource(); + component.CancelToken = cancelToken; - var doAfterEventArgs = new DoAfterEventArgs(component.Owner, doAfterTime, default, component.Owner) + var doAfterEventArgs = new DoAfterEventArgs(component.Owner, doAfterTime, cancelToken.Token, component.Owner) { BreakOnTargetMove = true, BreakOnUserMove = true, BreakOnDamage = true, BreakOnStun = true, NeedHand = false, - BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, uid, partList), + TargetCancelledEvent = new ReassembleCancelledEvent(), + TargetFinishedEvent = new ReassembleCompleteEvent(uid, uid, partList), }; _doAfterSystem.DoAfter(doAfterEventArgs); @@ -91,46 +107,29 @@ private void AddReassembleVerbs(EntityUid uid, BodyReassembleComponent component if (!args.CanAccess || !args.CanInteract) return; - if (!TryComp(args.User, out var actor)) + if (!TryComp(uid, out var mind) || + !mind.HasMind || + component.CancelToken != null) return; - if (!TryComp(uid, out var mind) || !mind.HasMind) - return; - - var doAfterTime = component.DoAfterTime; // doubles the time if you reconstruct yourself - if (args.User == uid) - doAfterTime *= 2; + var multiplier = args.User == uid ? SelfReassembleMultiplier : 1f; // Custom verb - AlternativeVerb custom = new(); - custom.Text = Loc.GetString("reassemble-action"); - custom.Act = () => + AlternativeVerb custom = new() { - if (!GetNearbyParts(args.User, uid, component, out var partList)) - return; - - if (partList == null) - return; - - var doAfterEventArgs = new DoAfterEventArgs(component.Owner, doAfterTime, default, component.Owner) + Text = Loc.GetString("reassemble-action"), + Act = () => { - BreakOnTargetMove = true, - BreakOnUserMove = true, - BreakOnDamage = true, - BreakOnStun = true, - NeedHand = false, - BroadcastFinishedEvent = new ReassembleDoAfterComplete(uid, args.User, partList), - }; - - _doAfterSystem.DoAfter(doAfterEventArgs); + StartReassembly(uid, component, multiplier); + }, + IconEntity = uid, + Priority = 1 }; - custom.IconEntity = uid; - custom.Priority = 1; args.Verbs.Add(custom); } - private bool GetNearbyParts(EntityUid user, EntityUid uid, BodyReassembleComponent component, out HashSet? partList) + private bool GetNearbyParts(EntityUid uid, BodyReassembleComponent component, out HashSet? partList) { partList = new HashSet(); @@ -138,35 +137,31 @@ private bool GetNearbyParts(EntityUid user, EntityUid uid, BodyReassembleCompone return false; // Ensures all of the old body part pieces are there - var nearby = _construction.EnumerateNearby(user); - bool notFound; + var xformQuery = GetEntityQuery(); + var notFound = true; + var bodyXform = xformQuery.GetComponent(uid); + foreach (var part in component.BodyParts) { - notFound = true; - foreach (var entity in nearby) - { - if (part == entity || part == component.Owner) - { - notFound = false; - partList.Add(part); - } - } - if (notFound) - { - _popupSystem.PopupEntity(Loc.GetString("reassemble-fail"), uid, Filter.Entities(uid)); - return false; - } + if (!xformQuery.TryGetComponent(part, out var xform) || + !bodyXform.Coordinates.InRange(EntityManager, xform.Coordinates, 2f)) continue; + + notFound = false; + partList.Add(part); + } + + if (notFound) + { + _popupSystem.PopupEntity(Loc.GetString("reassemble-fail"), uid, Filter.Entities(uid)); + return false; } return true; } - private void Reassemble(ReassembleDoAfterComplete args) + private void ReassembleComplete(EntityUid uid, BodyReassembleComponent component, ReassembleCompleteEvent args) { - var uid = args.Uid; - - if (!TryComp(args.Uid, out var component) || component == null) - return; + component.CancelToken = null; if (component.DNA == null) return; @@ -175,7 +170,7 @@ private void Reassemble(ReassembleDoAfterComplete args) var speciesProto = _prototype.Index(component.DNA.Value.Profile.Species).Prototype; var mob = EntityManager.SpawnEntity(speciesProto, EntityManager.GetComponent(component.Owner).MapPosition); - _humanoidAppeareance.UpdateFromProfile(mob, component.DNA.Value.Profile); + _humanoidAppearance.UpdateFromProfile(mob, component.DNA.Value.Profile); MetaData(mob).EntityName = component.DNA.Value.Profile.Name; if (TryComp(uid, out var mindcomp) && mindcomp.Mind != null) @@ -195,7 +190,7 @@ private void Reassemble(ReassembleDoAfterComplete args) /// the dna for reassembly later /// /// the entity that the player will transfer to - /// the entity whose DNA is being saved + /// the entity whose DNA is being saved private void UpdateDNAEntry(EntityUid uid, EntityUid body) { if (!TryComp(uid, out var skelBodyComp) || !TryComp(body, out var mindcomp)) @@ -211,20 +206,29 @@ private void UpdateDNAEntry(EntityUid uid, EntityUid body) skelBodyComp.DNA = new ClonerDNAEntry(mindcomp.Mind, profile); } - private sealed class ReassembleDoAfterComplete : EntityEventArgs + private sealed class ReassembleCompleteEvent : EntityEventArgs { - public readonly EntityUid Uid; //the entity being reassembled - public readonly EntityUid User; //the user performing the reassembly + /// + /// The entity being reassembled + /// + public readonly EntityUid Uid; + + /// + /// The user performing the reassembly + /// + public readonly EntityUid User; public readonly HashSet PartList; - public ReassembleDoAfterComplete(EntityUid uid, EntityUid user, HashSet partList) + public ReassembleCompleteEvent(EntityUid uid, EntityUid user, HashSet partList) { Uid = uid; User = user; PartList = partList; } } + + private sealed class ReassembleCancelledEvent : EntityEventArgs {} } } -public class ReassembleActionEvent : InstantActionEvent { } +public sealed class ReassembleActionEvent : InstantActionEvent { } diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index 6fe06a543265..b40ed21b9d72 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -46,7 +46,7 @@ private void InitializeInitial() } // LEGACY CODE. See warning at the top of the file! - public IEnumerable EnumerateNearby(EntityUid user) + private IEnumerable EnumerateNearby(EntityUid user) { foreach (var item in _handsSystem.EnumerateHeld(user)) { From f1c67915a61e8135637c9a186ab12a39d61ba2eb Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Thu, 12 May 2022 21:55:31 +1000 Subject: [PATCH 22/27] a --- Resources/Audio/Effects/license.txt | 27 --------------------------- Resources/Audio/Effects/licenses.txt | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 27 deletions(-) delete mode 100644 Resources/Audio/Effects/license.txt diff --git a/Resources/Audio/Effects/license.txt b/Resources/Audio/Effects/license.txt deleted file mode 100644 index 5f634926672a..000000000000 --- a/Resources/Audio/Effects/license.txt +++ /dev/null @@ -1,27 +0,0 @@ -adminhelp.ogg taken from https://github.com/tgstation/tgstation/blob/d775e1ac804eb9d0259573f5f29a18d320c97ef3/sound/effects/adminhelp.ogg - (available in master, therefore see master license: "All assets including icons and sound are under a Creative Commons 3.0 BY-SA license unless otherwise indicated.") - "Changed the adminhelpsound to some creative commons sound I pinched. Until somebody can get a better one. I'm sick of MAAAAAAAAOOOOOOW." - Actual source is https://freesound.org/people/martian/sounds/19261/ (CC0) - The sound had been reversed and the volume altered. - -hit_kick.ogg is made by Taira Komori -(https://taira-komori.jpn.org/freesounden.html) - -fire.ogg taken and edited from https://freesound.org/people/raremess/sounds/222557/ - -holy.ogg taken from https://freesound.org/people/random_intruder/sounds/392172/ and edited - -poster_broken.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg - -poster_being_set.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg - -saw.ogg taken from https://freesound.org/people/domiscz/sounds/461728/ and clipped - CC0-1.0 -*It's actually an angle grinder - -smoke.ogg taken from https://github.com/tgstation/tgstation/blob/a5d362ce84e4f0c61026236d5ec84d3c81553664/sound/effects/smoke.ogg - -voteding.ogg taken from "Bike, Bell Ding, Single, 01-01.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org at https://freesound.org/people/InspectorJ/sounds/484344/ under CC BY 3.0. The volume has been reduced. - -minibombcountdown.ogg taken from Thomas Evdokimoff at https://freesound.org/people/thomas_evdokimoff/sounds/202193/ - -bite.ogg take from https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 diff --git a/Resources/Audio/Effects/licenses.txt b/Resources/Audio/Effects/licenses.txt index 6a6c0f662c46..f86fea4539b7 100644 --- a/Resources/Audio/Effects/licenses.txt +++ b/Resources/Audio/Effects/licenses.txt @@ -1 +1,29 @@ +adminhelp.ogg taken from https://github.com/tgstation/tgstation/blob/d775e1ac804eb9d0259573f5f29a18d320c97ef3/sound/effects/adminhelp.ogg + (available in master, therefore see master license: "All assets including icons and sound are under a Creative Commons 3.0 BY-SA license unless otherwise indicated.") + "Changed the adminhelpsound to some creative commons sound I pinched. Until somebody can get a better one. I'm sick of MAAAAAAAAOOOOOOW." + Actual source is https://freesound.org/people/martian/sounds/19261/ (CC0) + The sound had been reversed and the volume altered. + +hit_kick.ogg is made by Taira Komori +(https://taira-komori.jpn.org/freesounden.html) + +fire.ogg taken and edited from https://freesound.org/people/raremess/sounds/222557/ + +holy.ogg taken from https://freesound.org/people/random_intruder/sounds/392172/ and edited + hug.ogg taken from /tg/station at https://github.com/tgstation/tgstation/blob/e6624ac8aed150668bb4e61c3a48372cc757bfd4/sound/weapons/thudswoosh.ogg - Under license: CC BY-SA 3.0 + +poster_broken.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg + +poster_being_set.ogg taken from https://github.com/tgstation/tgstation/blob/2834383245d2129a106acef3afd17b81e1e64777/sound/items/poster_ripped.ogg + +saw.ogg taken from https://freesound.org/people/domiscz/sounds/461728/ and clipped - CC0-1.0 +*It's actually an angle grinder + +smoke.ogg taken from https://github.com/tgstation/tgstation/blob/a5d362ce84e4f0c61026236d5ec84d3c81553664/sound/effects/smoke.ogg + +voteding.ogg taken from "Bike, Bell Ding, Single, 01-01.wav" by InspectorJ (www.jshaw.co.uk) of Freesound.org at https://freesound.org/people/InspectorJ/sounds/484344/ under CC BY 3.0. The volume has been reduced. + +minibombcountdown.ogg taken from Thomas Evdokimoff at https://freesound.org/people/thomas_evdokimoff/sounds/202193/ + +bite.ogg take from https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 From ab9a9de0123da3976bbc32f39d304e1c8aa2eee7 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Thu, 12 May 2022 22:08:03 +1000 Subject: [PATCH 23/27] Too spooped --- Resources/Prototypes/Entities/Mobs/Species/skeleton.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml index 49307d3cee58..9896bab23f20 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -144,12 +144,9 @@ mass: 70 restitution: 0.0 mask: - - Impassable - - MobImpassable - - VaultImpassable - - SmallImpassable + - MobMask layer: - - Opaque + - MobLayer - type: AtmosExposed - type: Flammable fireSpread: true @@ -298,7 +295,7 @@ sprite: Mobs/Species/Skeleton/parts.rsi state: r_leg - map: [ "enum.HumanoidVisualLayers.LLeg" ] - color: "#b8b8b8" + color: "#b8b8b8" sprite: Mobs/Species/Skeleton/parts.rsi state: l_leg - shader: StencilClear From a665713419aa4bdc3eebe25e83bd20b7159193bf Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 12 May 2022 15:37:36 -0400 Subject: [PATCH 24/27] Update licenses.txt --- Resources/Audio/Effects/licenses.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Audio/Effects/licenses.txt b/Resources/Audio/Effects/licenses.txt index f86fea4539b7..edd23041b3c3 100644 --- a/Resources/Audio/Effects/licenses.txt +++ b/Resources/Audio/Effects/licenses.txt @@ -27,3 +27,5 @@ voteding.ogg taken from "Bike, Bell Ding, Single, 01-01.wav" by InspectorJ (www. minibombcountdown.ogg taken from Thomas Evdokimoff at https://freesound.org/people/thomas_evdokimoff/sounds/202193/ bite.ogg take from https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 + +bone_rattle.ogg taken and editted from spookymodem at https://freesound.org/people/spookymodem/sounds/202102/ From b659679208650c045caf38a87de5ff0ce18cf0ce Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 12 May 2022 15:40:12 -0400 Subject: [PATCH 25/27] Create license.txt --- Resources/Audio/Voice/Skeleton/license.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/Audio/Voice/Skeleton/license.txt diff --git a/Resources/Audio/Voice/Skeleton/license.txt b/Resources/Audio/Voice/Skeleton/license.txt new file mode 100644 index 000000000000..cdbca42ef3b8 --- /dev/null +++ b/Resources/Audio/Voice/Skeleton/license.txt @@ -0,0 +1 @@ +skeleton_scream.ogg taken and edited from AntumDeluge at https://freesound.org/people/AntumDeluge/sounds/188034/ From 5dece189eb55dbcae2a1e11196603535493fcc23 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 12 May 2022 19:19:03 -0400 Subject: [PATCH 26/27] Update licenses.txt --- Resources/Audio/Effects/licenses.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Audio/Effects/licenses.txt b/Resources/Audio/Effects/licenses.txt index edd23041b3c3..ce352cf03d6e 100644 --- a/Resources/Audio/Effects/licenses.txt +++ b/Resources/Audio/Effects/licenses.txt @@ -28,4 +28,4 @@ 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 taken and editted from spookymodem at https://freesound.org/people/spookymodem/sounds/202102/ +bone_rattle.ogg licensed under CC0 1.0 and taken from spookymodem at https://freesound.org/people/spookymodem/sounds/202102/ From 7586cb253a788f387083cc82c2bc88cc1c80efb7 Mon Sep 17 00:00:00 2001 From: EmoGarbage404 <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 12 May 2022 19:19:59 -0400 Subject: [PATCH 27/27] Update license.txt --- Resources/Audio/Voice/Skeleton/license.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Audio/Voice/Skeleton/license.txt b/Resources/Audio/Voice/Skeleton/license.txt index cdbca42ef3b8..b057ff96e362 100644 --- a/Resources/Audio/Voice/Skeleton/license.txt +++ b/Resources/Audio/Voice/Skeleton/license.txt @@ -1 +1 @@ -skeleton_scream.ogg taken and edited from AntumDeluge at https://freesound.org/people/AntumDeluge/sounds/188034/ +skeleton_scream.ogg licensed under CC0 1.0 taken from AntumDeluge at https://freesound.org/people/AntumDeluge/sounds/188034/